본문 바로가기

서울시 먹거리 분석

2018년 csv파일 불러오기

반응형

지금까지 2019년 1월의 치킨집, 중국집, 피자집 통화량으로 데이터 파악을 했습니다.

이후의 흐름을 파악해보기 위해 이번에는 2018년 전체 데이터를 불러와 분석해보도록 하겠습니다.

 

 

Data

데이터는 SKT Data Hub에서 2018년의 치킨집, 중국집, 피자집 전체 Data를 다운받습니다.

SKT Data Hub>생활>외식/식생활 Data

 

특이점이 있다면, 피자의 경우 업종이 존재하지 않습니다.

왜 그러한지 생각해본다면, 치킨집, 중국집의 경우 Data의 시작 날짜가 13년 8월이지만 피자집의 경우에는 15년 7월부터 Data를 쌓기 시작했습니다. 피자 판매업종이라고 적혀있는데 굳이 업종을 또 Data에 넣어야 할 필요성이 없어서 넣지 않은 것 같습니다. 아울러 피자집 데이터의 경우에는 시, 군, 읍, 면, 동의 컬럼명도 다릅니다.

 

Data Load

이제 Data를 불러와 모두 합쳐서 하나의 Data Frame으로 만들예정입니다.

 

1.단순하게 하나씩 불러오기

정말 단순하게 하나씩 불러오는 방법입니다. 치킨집, 중국집, 피자집에 12개월이니 36개를 불러오면 됩니다.

Call_chicken_01 <- read.csv("CALL_CHICKEN_01MONTH.csv")
Call_chicken_02 <- read.csv("CALL_CHICKEN_02MONTH.csv")
Call_chicken_03 <- read.csv("CALL_CHICKEN_03MONTH.csv")
...

 

하지 않도록 하겠습니다....

 

2.for문으로 불러오기

이번에는 for문으로 data를 불러오겠습니다.

총 36개이며 이를 cfood, chicken, pizza별로 구분을 해주어야 합니다.

또 월별로 불러와야 하기때문에 for문을 두 번 사용하도록 하겠습니다.

이 때 assign함수를 사용하여 각 변수를 지정해줍니다.

 

그러나 이 방법도 좋은 방법이 아닌것 같습니다. 리스트화를 시켜서 cfood, chicken, pizza를 따로따로 dataframe으로 되어있기 때문입니다.

이를 합칠 때 또 컬럼명과 순서를 고려해야하는데 이 때 어떤 에러가 발생할지 모르는 상황이기 때문입니다.

그리고 더 나아가 지금은 36개의 Data지만, 앞으로 다루어야 할 Data는 더더욱 많아질 것이기에 그를 대비하여 다음 방법으로 실행해보겠습니다.

 

먼저, getwd()로 경로를 확인한 뒤 year_18이라는 폴더를 만들고 실행을 해 줍니다.

 

# food_list 생성
food_list <- c(“CFOOD”,”CHICKEN”,”PIZZA”)
# 경로 설정
dir <- (“/cloud/project/year_18”)
setwd(dir)
# 경로 내 파일 리스트 생성
file_list <- list.files(dir)
for(j in food_list) {
 # grep 함수를 사용 하여 CFOOD, CHICKEN, PIZZA 가 포함된 index를 찾는다.
 food_list_index <- grep(j,file_list)
 
 df_name <- data.frame()
 for(i in food_list_index) {
 read_data_csv <- read.csv(file_list[i])
 df_name <- rbind(df_name, read_data_csv)
 }
 #데이터 불러와서 각 변수 생성
 assign(paste0(j,”_18"), df_name)
}
# _18로 끝나는 변수들을 List로 묶어준다.
dataframe_list <- mget(ls(pattern=”_18"))

 

3. 폴더내에 있는 모든 csv 파일을 한번에 불러오기

조금 더 효율적으로 csv를 불러오는 방법이 있을까 생각해봅시다.

csv파일 개수가 정말로 많아진다면 for문으로 꼭 돌려야 할까요..?

이를 한꺼번에 불러올 수 있는 방법이 잇습니다. 박찬엽님의 블로그를 참고했습니다.

패키지는 tidyverse, fs, readr을 사용했습니다.

이를 사용했을 때 모든 데이터가 하나의 DataFrame로 가능합니다.

그러나 앞서 언급했었던 치킨집, 중급집과는 다르게 피자의 경우 업종이 존재하지 않고, 시, 군, 구, 읍, 면, 동, 기준일, 연령대의 컬럼이 다르기 때문에 추가로 처리할 필요가 있습니다.

 

# 패키지 load
# install.packages(c("tidyverse", "fs"))
library(tidyverse)
library(fs)
# 폴더명 생성
year_18_food <- "year_18"
# 폴더에 있는 csv 파일 확인
year_18_food_csv <- fs::dir_ls(year_18_food)
# 첫번째 csv 파일 불러오기
readr::read_csv(year_18_food_csv[1])
# 모든 csv 파일을 불러오기
year_18_food_data <- year_18_food_csv %>% 
  map_dfr(read_csv)
# 이를 data.frame로 변경
year_18_food_data_frame <- as.data.frame(year_18_food_data)
 # na파악 하기
sum(is.na(year_18_food_data_frame))
# 컬럼명이 뭔가 다른것이 있음
# 시도, 시군구, 읍면동, 기준일 = 발신지_시도, 발신지_구, 발신지_동, 일자
str(year_18_food_data_frame)
# 먼저 확인해 보고 싶은것이, 이 데이터들이 한쪽에 없으면 다른 한쪽에 무조건 있는가?
# 시도 데이터의 na index와, 발신지_시도의 na가 아닌 곳의 index를 확인해보기
sum(
  which(is.na(year_18_food_data_frame$시도)) != which(!is.na(year_18_food_data_frame$발신지_시도)))
# 시군구 데이터의 na index와, 발신지_구의 na가 아닌 곳의 index를 확인해보기
sum(
  which(is.na(year_18_food_data_frame$시군구)) != which(!is.na(year_18_food_data_frame$발신지_구)))
# 읍면동 데이터의 na index와, 발신지_동의 na가 아닌 곳의 index를 확인해보기
sum(
  which(is.na(year_18_food_data_frame$읍면동)) != which(!is.na(year_18_food_data_frame$발신지_동)))
# 0이 나온것으로 보아 다행히 모두 서로 다른곳에 na가 위치해 있다.
# 이제 시도,시군구,읍면동의 na위치에 발신지_시도,발신지_구, 발신지_동의 data를 집어 넣어주자.
year_18_food_data_frame$시도[which(is.na(year_18_food_data_frame$시도))] <- 
  year_18_food_data_frame$발신지_시도[which(!is.na(year_18_food_data_frame$발신지_시도))]
year_18_food_data_frame$시군구[which(is.na(year_18_food_data_frame$시군구))] <- 
  year_18_food_data_frame$발신지_구[which(!is.na(year_18_food_data_frame$발신지_구))]
year_18_food_data_frame$읍면동[which(is.na(year_18_food_data_frame$읍면동))] <- 
  year_18_food_data_frame$발신지_동[which(!is.na(year_18_food_data_frame$발신지_동))]
# 그리고 na를 살펴 보면.
sum(is.na(year_18_food_data_frame$시도))
sum(is.na(year_18_food_data_frame$시군구))
sum(is.na(year_18_food_data_frame$읍면동))
# 기준일, 일자도 같은 방법으로 진행 한다.
# 기준일
sum(
  which(is.na(year_18_food_data_frame$기준일)) != which(!is.na(year_18_food_data_frame$일자)))
year_18_food_data_frame$기준일[which(is.na(year_18_food_data_frame$기준일))] <- 
  year_18_food_data_frame$일자[which(!is.na(year_18_food_data_frame$일자))]
sum(is.na(year_18_food_data_frame$기준일))
# 연령대
sum(
  which(is.na(year_18_food_data_frame$연령대)) != which(!is.na(year_18_food_data_frame$연령)))
year_18_food_data_frame$연령대[which(is.na(year_18_food_data_frame$연령대))] <- 
  year_18_food_data_frame$연령[which(!is.na(year_18_food_data_frame$연령))]
sum(is.na(year_18_food_data_frame$연령대))
str(year_18_food_data_frame)
# 이제 필요 없는, 발신지_시도, 발신지_구, 발신지_동, 일자, 연령은 제거 하자.
year_18_food_data_frame <- year_18_food_data_frame[,1:9]
for(i in 1:9) {
  print(sum(is.na(year_18_food_data_frame[,i])))
}
# 과거에 피자는 업종에 데이터가 없어서 NA로 표시가 되어 있다.
year_18_food_data_frame$업종[which(is.na(year_18_food_data_frame$업종))] <- "피자집"
# 최종 NA 확인
sum(is.na(year_18_food_data_frame))

 

결과

NA가 0인것도 확인 했으며, 전체 Data개수(약 100만개), 그리고 head()를 사용해 Data를 확인했습니다.

 

2018년의 모든 csv파일을 읽어보았습니다.

코드의 줄로 보았ㅇ르 때는 두번쨰 방법이 짧아보이긴 하지만, 두번쨰 방법은 앞서 언급했던 문제와 추가로 세 개의 Dataframe을 하나로 합쳐야 하는 문제점도 있습니다.

그렇기에 세번째 방법이 있다는 것을 알아둔다면 후에 큰 도움이 될 것 같습니다.

다음 글에서는 28년 전체의 Data를 19년 1월 Data로 파악했던 것처럼 분석해보도록 할 예정입니다.

1년 전체로 파악을 해본다면, 학생들의 방학기간, 연휴 등의 이벤트에 대해서 월별, 지역별 Data의 차이를 쉽게 파악 가능할것으로 사료됩니다.

반응형

'서울시 먹거리 분석' 카테고리의 다른 글

2018년 요식업계 통화량 시각화  (0) 2020.02.22
원인 파악  (0) 2020.02.19
시각화 해석  (0) 2020.02.18
19.01 요식업계 통화량 시각화  (0) 2020.02.18
19.01 피자집 이용 통화량 분석  (0) 2020.02.18