아파트 [시계열 그래프 분석] 공공데이터 R 프로그램 기초

  R을 진입 하는 시기에는 항상 시계열 그래프 그리는데,  한참이나 헤메었다.  이유는 데이터 속성 때문인데,   데이터 타입이 Date Type 인가?   character   Type 인가? 에 따라서 그래프 그리는 방법이 달랐기 때문이다.  


     그래프 그리는 목적을 보면,  비교 하려고 하면 "막대 차트", 시계열로 보려고 하면 " 라인 차트", 비중을 보려고 하면,  "원차트 또는 트리맵"을 그려서 봐야 한다.

  하지만 엑셀에서 다 된다고 R에서 다 되는 것 아니 듯이 예전에 엑셀 쓰던것과 같이 써서는 오류가 생긴다.  그래서 오늘은 이것 가지고 이야기 하려고 한다. 

 지금까지의  데이터를 자르고 붙이고, 길이 재고,  문자열을 토큰작업을 30만개 하려면 시간이 많이 걸릴 것 같아 이번에는  저번 글까지 이미 다 만들어 진 데이터 셋을 준비 했다.  
(* 딥러닝 돌릴때 3분은 매우 짧은 시간이지만 R에서 3분은 매우 지루하게 느껴진다.)

     http://rdmkyg.iptime.org/index.php/s/Oex9srbPk7bQtGG/download


 1.  아파트 데이터 새로 로드 하기 


library(rio)  
library(dplyr)
library(readxl)
library(httr)

# 파일을 불러오는 path를 url 변수로 정의      
url = "https://drive.google.com/u/0/uc?id=1JE-OQNMws1HfVWKCSX4JFwHBUPgnQzP8&export=download"
GET(url, write_disk(tf <- tempfile(fileext = ".xlsx")))
apt <- read_excel(tf, 1L)  # 1L은 sheet 
str(apt)
## 'data.frame':    296656 obs. of  17 variables:
##  $ 시            : chr  "서울특별시" "서울특별시" "서울특별시" "서울특별시" ...
##  $ 구            : chr  "강남구" "강남구" "강남구" "강남구" ...
##  $ 동            : chr  "개포동" "개포동" "개포동" "개포동" ...
##  $ 시군구        : chr  "서울특별시 강남구 개포동" "서울특별시 강남구 개포동" "서울특별시 강남구 개포동" "서울특별시 강남구 개포동" ...
##  $ 번지          : chr  "185" "649" "649" "649" ...
##  $ 본번          : chr  "0185" "0649" "0649" "0649" ...
##  $ 부번          : chr  "0000" "0000" "0000" "0000" ...
##  $ 단지명        : chr  "개포주공 6단지" "경남1" "경남2차" "경남2차" ...
##  $ 전용면적_m3   : num  73 97 182.2 91.9 83.5 ...
##  $ 계약년월      : chr  "202103" "202103" "202103" "202103" ...
##  $ 계약일        : chr  "31" "11" "15" "26" ...
##  $ 거래금액_만원 : num  226000 235000 300000 230000 71400 215000 258000 213000 277000 199000 ...
##  $ 층            : num  7 3 1 15 2 15 11 7 23 10 ...
##  $ 건축년도      : num  1983 1984 1984 1984 2001 ...
##  $ 도로명        : chr  "개포로 516" "언주로 110" "언주로 110" "언주로 110" ...
##  $ 해제사유발생일: chr  NA NA NA NA ...
##  $ 계약일자      : chr  "20210331" "20210311" "20210315" "20210326" ...

위의 데이터와 같이 위의 계약일자는  character 8자리로 되어 있다.  하지만 아래와 같이 계약일자를 line 데이터로 분석하려고 하면 아래와 같이 알 수 없는 그래프가 그려 지며 오류 메세지가 뜬다.  

2. 문자열로 라인 그래프 그리기 


library(ggplot2)



# 같은 일자 2번 거래 이상 평균처리 후 라인그래프 그림 
apt %>% 
  filter(동 == "논현동") %>% 
  filter(단지명 =="아크로힐스논현") %>% 
  group_by(계약일자) %>% 
  summarise(거래금액_만원 = mean(거래금액_만원)) %>% 
ggplot(aes(계약일자, 거래금액_만원))+
  geom_line()
## geom_path: Each group consists of only one observation. Do you need to adjust
## the group aesthetic?

   

 당연히 문자열(character) 타입에서는 라인 그래프가 나올 수 없다.    하지만,  막대그래프는 비교 할때 쓰기도 하고,  시계열 분석에도 쓰기도 하니까?  막대 그래프로 할 때는 흐름이보인다. 


3. 문자열로 막대그래프 그리기 

# 막대그래프 그림 
apt %>% 
  filter(동 == "논현동") %>% 
  filter(단지명 =="아크로힐스논현") %>%
  group_by(계약일자) %>% 
    summarise(거래금액_만원 = mean(거래금액_만원)) %>% 
  ggplot(aes(계약일자, 거래금액_만원,fill = 계약일자))+
    geom_bar(stat = "identity")+
    theme(legend.position = "none")

하지만 막대그래프 그림도 범주가 나누어 졌기 대문에,  일자 데이터가 안 보인다.


4. 시간 데이터 타입으로 그래프 그리기

# 시계열 그래프 그림 
apt %>% 
  filter(동 == "논현동") %>% 
  filter(단지명 =="아크로힐스논현") %>%
  group_by(계약일자) %>% 
    summarise(거래금액_만원 = mean(거래금액_만원)) %>%
  mutate(계약일자 = as.Date(계약일자 , "%Y%m%d")) %>% 
  ggplot(aes(계약일자, 거래금액_만원))+
    geom_line(color ="red")

하지만,  시계열 그래프로 그렸을때,  그래프 패턴이 나타 났다.   물론 아래의 문법과 같이 데이터를 유형을 Date(일자) 형태로, 바꾸었을때,  정상적으로 나타 났다.  

 as.Date("20210512", "%Y%m%d")  ▶  "2021-05-12"  

여기 문법에서 왜 Year를 나타내는 Y를 왜 대문자로 했는지는 모르겠다.   혹 이 데이터 보시는 분께서는 아파트 값이 2021년도에 내렸다고 오해가 없길 바란다.  항상 개인간 거래에서는 특수한 조건이 붙기 때문이다.   그건 거래 당사자만 알고 있다. 

5. smooth 함수를 이용한 예측 그래프 그리기


여기에서 ggplot기능에서 추세 예측하는 geom_smooth가 있는데,  이것 만 보면,  분석모형 선택할 수 인 사이트를 얻을 수  있고 추세도 볼 수 있다.
# 시계열 그래프 그림 (예측곡선) 
apt %>% 
  filter(동 == "논현동") %>% 
  filter(단지명 =="아크로힐스논현") %>%
  group_by(계약일자) %>% 
    summarise(거래금액_만원 = mean(거래금액_만원)) %>%
  mutate(계약일자 = as.Date(계약일자 , "%Y%m%d")) %>% 
  ggplot(aes(계약일자, 거래금액_만원))+
    geom_line(color ="red") +
    geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

  


 


댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...