티스토리 뷰
미분양 데이터를 가지고 그래프를 그려본다. 국토교통부 홈페이지에서 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
- Spring
- MyBatis
- github
- 아이맥
- ktm모바일
- MySQL
- heroku
- Oracle
- docker
- ggplot
- 셀프개통
- R
- Google Chart Tools
- eclipse
- 마인크래프트
- ipTIME
- java
- 맥북
- 자급제폰
- SVN
- javascript
- ubuntu
- 막대그래프
- ggplot2
- python
- vagrant
- 알뜰요금제
- 이클립스
- MongoDB
- 도넛차트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |