티스토리 뷰

미분양 데이터를 가지고 그래프를 그려본다. 국토교통부 홈페이지에서 23.2월 주택통계현황을 보면, 단순 데이터 뿐만 아니라 추이 등 분석된 자료를 볼 수 있다. 그런데 이게 보고서 형태이다보니, 매월 데이터가 다 나와있지 않아서 그래프를 그리기 위한 기초 데이터로 쓰이기는 어렵다. 이 때는, 국토교통부 통계누리 사이트에서 [미분양주택현황보고] 메뉴에서 "관련파일" 탭을 선택하면 아래와 같이 엑셀데이터를 다운 받아볼 수 있다.

 

다운받아보면, 아래 레이아웃으로 되어 있다. 지역별로 나눠서 그릴 건 아니고, 총계만 추이를 볼 예정이다. 

 

저 엑셀에 있는 데이터 중에 정작 필요한 부분만 따로 복사해 별도 파일로 만들었다. 수식이 많다보니, 값복사로 넣었다.

 

R 프로그램으로 간단하게 엑셀파일을 읽을 수 있다. 읽은 파일은 아래와 같이 출력이 되는데 저렇게 횡으로 펼쳐져 있는 데이터 구조는 ggplot 에 사용하기 적합하지 않다. 

tb1 = read_excel('./2023/20230331/unsold_new_housings.xlsx', sheet='Sheet1')

# A tibble: 1 × 15
  구분     `22.1` `22.2` `22.3` `22.4` `22.5` `22.6` `22.7` `22.8` `22.9` `22.10` `22.11` `22.12` `23.1` `23.2`
  <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl>   <dbl>  <dbl>  <dbl>
1 미분양수  21727  25254  27974  27180  27375  27910  31284  32722  41604   47217   58027   68148  75359  75438

 

tidyr::pivot_longer 함수를 사용하면 손쉽게 데이터 형태를 변경할 수 있다. 

tb1 %>% 
  pivot_longer(!구분)

 # A tibble: 14 × 3
   구분     name  value
   <chr>    <chr> <dbl>
 1 미분양수 22.1  21727
 2 미분양수 22.2  25254
 3 미분양수 22.3  27974
 4 미분양수 22.4  27180
 5 미분양수 22.5  27375
 6 미분양수 22.6  27910
 7 미분양수 22.7  31284
 8 미분양수 22.8  32722
 9 미분양수 22.9  41604
10 미분양수 22.10 47217
11 미분양수 22.11 58027
12 미분양수 22.12 68148
13 미분양수 23.1  75359
14 미분양수 23.2  75438

 

날짜가 그냥 텍스트형태라서 date 형태로 변경해준다. ".1" 은 매월 1일을 나타내려고 붙였다. 참고로 ymd 함수는 lubridate 패키지에 있다.

tb1 %>% 
   pivot_longer(!구분) %>% 
   mutate(date = ymd(paste0(name, '.1')))

# A tibble: 14 × 4
   구분     name  value date      
   <chr>    <chr> <dbl> <date>    
 1 미분양수 22.1  21727 2022-01-01
 2 미분양수 22.2  25254 2022-02-01
 3 미분양수 22.3  27974 2022-03-01
 4 미분양수 22.4  27180 2022-04-01
 5 미분양수 22.5  27375 2022-05-01
 6 미분양수 22.6  27910 2022-06-01
 7 미분양수 22.7  31284 2022-07-01
 8 미분양수 22.8  32722 2022-08-01
 9 미분양수 22.9  41604 2022-09-01
10 미분양수 22.10 47217 2022-10-01
11 미분양수 22.11 58027 2022-11-01
12 미분양수 22.12 68148 2022-12-01
13 미분양수 23.1  75359 2023-01-01
14 미분양수 23.2  75438 2023-02-01
반응형

데이터가 준비되었으니 x,y 축값을 매핑만 하면 선그래프가 만들어진다. 그리고 x 축이 date 형이다보니, 알아서 적절한 위치에 날짜가 표시된다. (물론 원하는대로 바꿀수도 있다.)

ggplot(tb2, aes(date, value)) +
  geom_line()

 

scale_x_date 를 이용해서 처음과 마지막의 x축 라벨만 나오게 한다. 자세한 기능은 여기를 눌러 참고한다. 

ggplot(tb2, aes(date, value)) +
  geom_line() +
  scale_x_date(breaks = ymd(c('2022-01-01', '2023-02-01')), 
               date_labels = '%y.%m')

 

그래프에 처음과 마지막의 값을 라인그래프위에 표시하고 싶어서 추가했다. 처음과 마지막 행만 별도로 데이터셋을 하나 만들어놓고, geom_text 에서 사용하면 된다.

tb3 = tb2 %>% 
  mutate(rank = row_number()) %>% 
  filter(rank == 1 | rank == max(rank)) %>% 
  mutate(height = c(2, -1))


ggplot(tb2, aes(date, value)) +
  geom_line() +
  geom_text(data = tb3, aes(label = value), vjust = tb3$height) +
  scale_y_continuous(limits = c(10000, 85000)) +
  scale_x_date(breaks = ymd(c('2022-01-01', '2023-02-01')), 
               limits = ymd(c('2021-12-01', '2023-03-01')),
               date_labels = '%y.%m') +
  theme_bw()

 

생각해보니, 작년 2월과 올해2월을 비교하는게 나을 것 같아 범위수정을 조금 하고, 색상과 스타일을 조금더 덧붙여서 마무리 했다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함