류동균의 R 공부방입니다.
서울시 먹거리분석#5 본문
저번글에 이어 서울시 2018 치킨, 중식, 피자 통화량 데이터를 분석해보고자 한다. 분석하기에 앞서 우선 1년치 자료를 다 통합해야하는데 그 과정에 조금 문제가 생긴다. 우선 이러한 문제를 해결하고 2018년도 1년치 치킨, 중식, 피자 데이터를 통합해보자. 우선 데이터를 2018 1월 ~12월 데이터를 준비해보자 데이터는 다음의 링크에서 다운받아 주도록한다.
sk data hub : https://www.bigdatahub.co.kr/index.do
데이터를 받았다면 아마 CALL_PIZZA/CHICKEN/CFOOD_01~12M.csv 파일이 총 36개가 있을 것이다. 이것을 우선 Rstudio에 불러와야 하는데 한가지 팁이 있다면 36개의 파일을 하나의 폴더에 모으고 압축시켜 upload를 하게되면 한번에 모두 가져와진다.
이렇게 파일을 다 가져왔다면 이 파일들을 모두 하나의 dataframe으로 만들어보자. 이러한 파일들을 합치는 방법엔 여러가지가 있다. 단순노가다를 해서 합칠수도 있고 for문을 써서 dataframe을 축적하는 식으로 합칠수도 있다. 그러나 좀더 효율적으로 하기위해 "tidyverse", "fs" 패키지를 사용하여 데이터를 합쳐보자.
필요한 패키지
# install이 안되어있다면 install 해주도록 한다.
# install.packages(c("tidyverse", "fs"))
# 필요한 패키지
library(tidyverse)
library(fs)
파일 합치기
다음과 같이 했다면 하나의 food_2018_df라는 dataframe에 36개의 csv파일이 합쳐진 것을 알 수 있다.
# 폴더명 생성
year_18_food <- "food_2018"
# 폴더의 csv파일 리스트 확인
year_18_food_csv <- fs::dir_ls(year_18_food)
# 폴더내의 csv를 불러와 dataframe으로 만듬
food_2018_df <- year_18_food_csv %>%
map_dfr(read_csv) %>%
as.data.frame()
데이터 처리
> head(food_2018_df)
기준일 요일 성별 연령대 시도 시군구 읍면동 업종 통화건수 일자 연령 발신지_시도 발신지_구
1 20190101 화 남 40대 서울특별시 강남구 대치동 중국집 5 NA <NA> <NA> <NA>
2 20190101 화 남 40대 서울특별시 강남구 개포동 중국집 5 NA <NA> <NA> <NA>
3 20190101 화 남 30대 서울특별시 강남구 압구정동 중국집 5 NA <NA> <NA> <NA>
4 20190101 화 남 30대 서울특별시 강남구 세곡동 중국집 6 NA <NA> <NA> <NA>
5 20190101 화 여 60대이상 서울특별시 강남구 논현동 중국집 8 NA <NA> <NA> <NA>
6 20190101 화 여 50대 서울특별시 강남구 압구정동 중국집 5 NA <NA> <NA> <NA>
발신지_동
1 <NA>
2 <NA>
3 <NA>
4 <NA>
5 <NA>
6 <NA>
head로 데이터를 살펴보았더니 조금 이상한 것이 있다. NA값들이 상당이 많은 것을 확인할 수 있다. 조금 살펴보니 기준일, 연령대, 시도, 시군구, 읍면동 이라는 컬럼이 일자, 연령, 발신지_시도, 발신지_구, 발신지_동 이라는 컬럼이 중복되는 모습을 볼 수 있다. 찾아보니 치킨, 중식 데이터와 다르게 피자 데이터는 일부 다른 컬럼명을 사용한 것을 알 수 있었다. 이제 한번 이것을 처리해주도록 하자.
# 기준일, 일자 NA index 비교
> sum(which(is.na(food_2018_df$기준일)) != which(!is.na(food_2018_df$일자)))
[1] 0
> # 연령대, 연령 NA index 비교
> sum(which(is.na(food_2018_df$연령대)) != which(!is.na(food_2018_df$연령)))
[1] 0
> # 시도, 발신지_시도 NA index 비교
> sum(which(is.na(food_2018_df$시도)) != which(!is.na(food_2018_df$발신지_시도)))
[1] 0
> # 시군구, 발신지_구 NA index 비교
> sum(which(is.na(food_2018_df$시군구)) != which(!is.na(food_2018_df$발신지_구)))
[1] 0
> # 읍면동, 발신지_동 NA index 비교
> sum(which(is.na(food_2018_df$읍면동)) != which(!is.na(food_2018_df$발신지_동)))
[1] 0
모두 0이 나온것을 보니 다행히도 각각의 컬럼이 모두 둘중에 하나만 NA값을 가지고 있었다.
# na_index 설정
na_index <- which(is.na(food_2018_df$기준일))
# 기준일
food_2018_df$기준일[na_index] <- food_2018_df$일자[na_index]
# 연령대
food_2018_df$연령대[na_index] <- food_2018_df$연령[na_index]
# 시도
food_2018_df$시도[na_index] <- food_2018_df$발신지_시도[na_index]
# 시군구
food_2018_df$시군구[na_index] <- food_2018_df$발신지_구[na_index]
# 읍면동
food_2018_df$읍면동[na_index] <- food_2018_df$발신지_동[na_index]
다음과 같이 했다면 기준일, 연령대, 시도, 시군구, 읍면동의 NA값들이 채워진 것을 확인할 수 있다. 또한 피자 데이터에는 업종컬럼이 없는데 이것또한 채워주고 NA값을 확인해보자.
# 피자 데이터 업종 추가
food_2018_df$업종[which(is.na(food_2018_df$업종))] <- "피자집"
# 필요없는 컬럼 제거
food_2018_df <- food_2018_df[,1:9]
# NA값 확인
sum(is.na(food_2018_df))
[1] 0
이렇게 36개의 csv파일을 하나의 dataframe으로 만들고 중간에 발생하는 문제들을 처리해 보았다. 물론 for문을 이용하여 데이터를 통합할 수도 있지만 미래에 나중에 데이터가 36개가 아니라 1000개라면 for문으로는 상당히 작업을 하는데 시간이 오래걸릴 것으로 예상된다. 이러한 방법을 알아둔다면 미래에 언젠간 도움이 되리라고 생각한다. 다음글에서는 본격적으로 1년치 데이터를 분석해볼 예정이다.
'Data Analysis' 카테고리의 다른 글
서울시 먹거리 분석 #4 (0) | 2019.10.18 |
---|---|
서울시 먹거리분석 #3 (0) | 2019.10.17 |
서울시 먹거리분석 #2 (0) | 2019.10.16 |
서울시 먹거리분석 #1 (0) | 2019.10.16 |
K-겹 교차검증(K- fold Cross Validation) (0) | 2019.10.02 |