[문자열 길이 nchar, 문자열 붙이기 paste, 문자열 자르기 substr ] 공공데이터 R 프로그램 기초 아파트

  

 시스템에서 일반적으로 데이터를 받으면 항상 겪는 문제가 있다.  일자,  월을 받는 것인데, 일자나 월은 1자리수도 있고 2자리수도 있다.    이것을 데이터로 묶어서,  년월일을 8자리로 바꾸거나  아니면  2021-05-10 처음 년월일 사이에  "-" 하이픈을 넣은 다음 Date 형태로 데이터 유형을 바꾸는 경우가 있다. 

   년월일 8자리로 묶었을 때의 장점은 데이터 소팅이 가능 하다는 것이다.  기본적으로 데이터 소팅은  자리수가 같아야 할 수 있다.   자리수가 다를 경우 아래와 같이 소팅이 잘못 될 수도 있다. 

   2015년 1월 11일과 2015년 2월 2일의 소팅 값이 바뀌었고,  눈으로 식별 하기가 어렵다.  

      >  a <-   c(2015111, 201522, 20151001)

      >  sort(a)

          201522 2015111 20151001

지금 까지 친 소스코드를 파이프연산자 %>%를 활용 해서, 간단하게 정리 하였고, 계약일자의 자리수가 문제가 있다.

# 라이브러리 불러오기 
  library(rio)  
  library(dplyr)
library(readxl)
library(httr)

# 파일을 불러오는 path를 url 변수로 정의      
url = "https://drive.google.com/u/0/uc?id=1PT_0-xJvM9KGp5zzx1jjcPAaS25epx4l&export=download"
GET(url, write_disk(tf <- tempfile(fileext = ".xlsx")))
apt <- read_excel(tf, 1L)  # 1L은 sheet 1을 이야기 하는 것이다.


# 아파트 데이터  전처리        
  apt <- apt %>% 
          rename(전용면적_m3 = '전용면적(㎡)') %>% 
          rename(거래금액_만원 = '거래금액(만원)') %>% 
          mutate(건축년도 = as.integer(건축년도),
                        층 = as.integer(층)) %>% 
          mutate(전용면적_m3 = as.double(전용면적_m3)) %>%
          mutate(거래금액_만원 = as.integer(gsub(",", "", 거래금액_만원)))
  
  glimpse(apt %>%  select(계약년월, 계약일))   
## Rows: 296,656
## Columns: 2
## $ 계약년월 <chr> "202103", "202103", "202103", "202103", "202103", "202103", "2021…
## $ 계약일   <chr> "31", "11", "15", "26", "31", "2", "9", "27", "9", "10", "2", "1…
계약일 데이터를 묶어서 활용하기가 매우 어렵다. 따라서 계약일을 문자열 길이를 체크 한 다음 이를 2자리로 바꾸어서 처리 하여야 한다.
 # 문자열을 카운트 한 다음 앞에 0일 붙임    
   apt <-  apt %>% 
       mutate(계약일 = ifelse(nchar(계약일) ==1, 
                              paste( "0", 계약일, sep = ""),
                              계약일 ))
   apt$계약일[1:10] 
##  [1] "31" "11" "15" "26" "31" "02" "09" "27" "09" "10"

자리수가 바뀌었다. 자리수가 바뀌었다고 모두 끝나는 것이 아니다. 계약일자로 8자리 charactor로 만들어야 한다.

# 일자 자릿수를 8자리를 만든다.    
   apt <- apt %>% 
       mutate(계약일자 = paste0(계약년월, 계약일))

   apt$계약일자[1:10]   
##  [1] "20210331" "20210311" "20210315" "20210326" "20210331" "20210302"
##  [7] "20210309" "20210327" "20210309" "20210310"
 여기 까지 이야기한 함수를 설명하면 아래와 같다.

문자열 길이
nchar(변수)

데이터 붙이기
paste(a, b , sep ="") , sep는 간격임 또는
paste0(a, b), a와 b 문자열을 붙임

  여기에서 데이터 관리의 노하우가 나오는데,  예를 들면,  아파트 거래시 같은 일자에 여러번 계약되는 경우가 있다.   이를 경우에는 데이터를 그룹화 하여 평당 가격을 평균으로 구한다. 

# 강남구 논현동 계약일자별 평당 가격
   apt %>% 
       filter(시군구 == "서울특별시 강남구 논현동") %>% 
       mutate(평당가격 =  거래금액_만원 / (전용면적_m3/3.3)  ) %>% 
       group_by(시군구,계약일자) %>% 
       summarise(평당가격_일별= mean(평당가격))
## # A tibble: 485 x 3
## # Groups:   시군구 [1]
##    시군구                   계약일자 평당가격_일별
##    <chr>                    <chr>            <dbl>
##  1 서울특별시 강남구 논현동 20170701         3292.
##  2 서울특별시 강남구 논현동 20170703         3213.
##  3 서울특별시 강남구 논현동 20170704         1994.
##  4 서울특별시 강남구 논현동 20170707         2853.
##  5 서울특별시 강남구 논현동 20170710         3720.
##  6 서울특별시 강남구 논현동 20170711         2689.
##  7 서울특별시 강남구 논현동 20170712         4430.
##  8 서울특별시 강남구 논현동 20170713         5819.
##  9 서울특별시 강남구 논현동 20170714         3510.
## 10 서울특별시 강남구 논현동 20170715         3479.
## # … with 475 more rows
 위와 같이 데이터를 보니,  데이터 분석이 쉬워 보이지 않는다.   논현동 내에서도,  건축년도, 아파트 브렌드, 위치, 층, 입지조건 등의 사유로  평당 가격이 다르기 때문이다.    


댓글 없음:

댓글 쓰기

[주식 클로드 자동매매 프로젝트] 제2편. 데이터 인프라 구축 — 모델보다 데이터가 먼저다

 머신러닝 모델을 이야기하기 전에, 그 모델이 먹는 데이터가 어디서 어떻게 왔는지부터 정직하게 밝혀야 한다. 이 프로젝트에서 가장 많은 시간이 들어간 부분은 화려한 모델 튜닝이 아니라, "내가 정말 그 데이터를 갖고 있는가"를 확인하...