[서울시 먹거리 분석-9] 2018년 요식업계 통화량 시각화

미완성의 신
8 min readMay 29, 2019

--

지난번에는 2018년 전체의 csv파일을 하나의 data frame으로 만드는데 초점을 두었다. 이번에는 2018년 전체의 데이터를 가지고 시각 하여 이를 파악해보도록 해보자.

지난블로그

목차, 기획 블로그

2018년 Data 시각화 하기에 앞서

어떤 방향으로 시각화를 해야 할까? 1월 Data에 비해 1년 전체의 Data는 어떤 특징을 갖고 있을까? 월 별로 파악이 가능 하다는 점이다. 일 단위로 파악을 하는 것이 아니라 조금 더 넓게 파악이 가능하다.

그러나… 이 Data만으로는 월을 구분해 주기 어렵다. 그래서 dplyr 패키지의 mutate() 함수를 사용 해보자. mutate() 는 쉽게 말해서 조건에 맞는 컬럼을 추가 해주는 것인데, 이에 대해 공부 하기 좋은 구글 키워드는 다음과 같다.
구글 키워드: mutate in r, dplyr in r

mutate()함수를 적용 해서 다시 확인 해보자.

이때 날짜 데이터에서 월을 추출하는 month() 함수를 사용하는데 이를 위한 패키지로 library(lubridate)를 사용한다.

library(lubridate)
# month 컬럼 추가
year_18_food_data_frame <- year_18_food_data_frame %>%
mutate(month = month(year_18_food_data_frame$date))
# factor 로 변경
year_18_food_data_frame$month <- as.factor(year_18_food_data_frame$month)

이제 month컬럼이 추가 된 것을 볼 수가 있다.

그러나 이 Data를 가지고 지난번처럼 시각화를 해 보았더니 특별한점을 찾아 볼수가 없다. 아래 그림은 지난번과 흡사하게 코드를 사용하여 만든 시각화이다. 1년 Data라는 좋은 것을 가지고 이것밖에 알 수 없는가? 이제부터는 전혀 다른 방향으로 찾아보자.

월, 시군구, 업종별 Group by

월, 시군구, 업종별 Group by를 해보자. 이번에 알고 싶고자 한 것은 월별, 시군구의 특성이 어떻게 달라지는지 알아보기 위함이다. 이렇게 만든 data_by_month_county 이라는 Data를 계속 파고 들어가 보자.

# group by 월, 시군구, 통화량
data_by_month_county <- year_18_food_data_frame %>%
group_by(month,county,type) %>%
summarize(call = sum(call)) %>%
arrange(month) %>%
arrange(county) %>%
arrange(type) %>%
as.data.frame()
> head(data_by_month_county)
month county type call
1 1 강남구 chicken 36534
2 2 강남구 chicken 30806
3 3 강남구 chicken 32427
4 4 강남구 chicken 32470
5 5 강남구 chicken 30224
6 6 강남구 chicken 33320

이렇게 만들어 놓았으니 파악을 해보도록 하자.

치킨: 월별 시군구의 시각화

치킨에 대해서 월별 시군구별로 시각화를 한 경우이다. 1년중 분기 별로? 혹은 특정 주기별로 달라질것처럼 보였는데 특정 구 에서 너무도 큰 변폭을 보이고 있는걸 확인 할 수 있다.

피자나, 중국집도 이와 거의 흡사하게 나타나고 있으니 먼저 치킨 그래프만 가지고 좀더 깊게 들어가 보자. 대~충 보면 관악구와, 동작구? 가 보이는데 구가 너무 많아서 한눈에 파악이 힘들다. 이를 어떻게 적용을 해볼까?

각 구별로 업종 별로 표준편차를 구하자.

표준편차를 구해야 하는데 그 전에 강남구와 도봉구는 서로 다른 편차를 가지고 있을 것이다. 20000에서 10 의 편차를 갖고 있는 것과 5000에서 10의 편차를 편차를 갖고 있는 건 다르기에 이를 그룹별로 정규화 후 표준편차의 순위를 알아보자. 이때 정규화 하는 함수를 직접 만들었으며, 이에 100을 곱하여서 0~100 까지 갖도록 변환 시켰다. 그리고 역시 이번에도 mutate()를 사용하여 컬럼을 하나 추가 시켰다.

# normalize
normalize <- function(x) {
((x - min(x))*100/(max(x)-min(x)))
}
# normalized by group
data_by_month_county <- data_by_month_county %>%
group_by(county, type) %>%
mutate(normalized = normalize(call)) %>%
arrange(month) %>%
arrange(county) %>%
arrange(type) %>%
as.data.frame()
> data_by_month_county
month county type call normalized
1 1 강남구 chicken 36534 100.0000000
2 2 강남구 chicken 30806 50.4541130
3 3 강남구 chicken 32427 64.4753914
4 4 강남구 chicken 32470 64.8473315
5 5 강남구 chicken 30224 45.4199464
6 6 강남구 chicken 33320 72.1996367
7 7 강남구 chicken 32650 66.4042903
8 8 강남구 chicken 32674 66.6118848
9 9 강남구 chicken 26771 15.5522879
10 10 강남구 chicken 27384 20.8545974
11 11 강남구 chicken 24973 0.0000000
12 12 강남구 chicken 28241 28.2674509

이렇게 강남구만 봤을때 정규화를 시켜, 24973~36534 의 통화량을 0~100으로 변환 시켰다. 이제 이 변환 시킨 것을 가지고 시각화를 하면? 조금더 과감하게 흔들 거리는 것을 알 수가 있다. 이는 시각화를 위한 용도는 아니었고 구별로 표준편차가 가장 많은 5개 정도를 뽑기 위한 용도 이므로 시각화에는 크게 의미를 달아 두지 말자.

구, 별 표준편차의 순위를 메기자

이번엔 aggregate() 함수를 사용 해서 표준편차를 구한다. 이제 이 표준 편차를 가지고 1년간 가장 크게 변동이 있는 5개 구를 정해서 파악을 해보도록 하자. 필요하다면 읍면동 단위로 더 깊숙히 들어갈 수도 있겠다.

# 구별 표준편차
sd_by_county <- aggregate(normalized ~ county + type,data_by_month_county,sd) %>%
arrange(desc(normalized)) %>%
arrange(type)
> sd_by_county
county type normalized
1 관악구 chicken 43.91220
2 동작구 chicken 40.30582
3 영등포구 chicken 38.25380
4 구로구 chicken 36.93211
5 광진구 chicken 30.91380
6 용산구 chicken 30.63977
...
19 은평구 chicken 26.76244
20 중구 chicken 26.75777
21 강북구 chicken 26.48073
22 성동구 chicken 26.45084
23 종로구 chicken 26.31520
24 금천구 chicken 25.44337
25 송파구 chicken 25.39510

총평

갈길이 멀다. 1년 데이터를 보니 새로운것이 너무도 많이 나온다. 하기전에는 대충 월드컵이 뭔가 있겠거니, 했는데 방학 개학 이런 것들이 더 영향을 끼치는게 아닌가 하는 생각이 든다. 그래도 1월 데이터만 했을때는 너무 쉽고 단순했었지만 1년 데이터를 하다보니 지레 짐작으로 볼 수 없었던 것들이 보인다.

--

--

미완성의 신
미완성의 신

Written by 미완성의 신

우리 인간은 미완성의 신들이다. 뛰어난 데이터 과학자를 꿈꾸는. 책을 좋아하는. 그런 사람입니다.