[서울시 먹거리 분석-5] 1월 요식업계통화량 시각화

미완성의 신
9 min readApr 16, 2019

--

지난 블로그에서 1월의 치킨집, 중국집, 피자집의 데이터를 파악해봤다. 이번에는 이 데이터 전부를 사용해서 업종별 비교를 해보도록 하자. 이 분석의 전체 방향, 그리고 목차는 아래 링크를 확인 하면 된다.

목차, 기획 블로그: [서울시 먹거리 분석] — 통화량을 통한 분석 기획

library(dplyr)
library(ggplot2)
Call_chicken_01 <- read.csv(“CALL_CHICKEN_01MONTH.csv”)
Call_cfood_01 <- read_csv(“CALL_CFOOD_01MONTH.csv”)
Call_pizza_01 <- read.csv(“CALL_PIZZA_01MONTH.csv”)

특이사항 적용

Data를 확인 해보니 피자 데이터는 업종이라는 컬럼이 존재 하지 않는다. 따라서 type라고 추가를 하나 해주도록 하자.

# type 피자가 없어 새로 추가 
type <- rep(“피자”,nrow(Call_pizza_01))
Call_pizza_01 <- cbind(Call_pizza_01[,1:7],type,Call_pizza_01[,8])
# 컬럼 명 영어로 변경
colnames(Call_chicken_01) <- c(“date”, “wday”, “gender”, “age”, “city”, “county”, “town”, “type”, “call”)
colnames(Call_cfood_01) <- c(“date”, “wday”, “gender”, “age”, “city”, “county”, “town”, “type”, “call”)
colnames(Call_pizza_01) <- c(“date”, “wday”, “gender”, “age”, “city”, “county”, “town”, “type”, “call”)
#Call_food_01로 모두 합침
Call_food_01 <- c()
Call_food_01 <- rbind(Call_food_01,Call_chicken_01)
Call_food_01 <- rbind(Call_food_01,Call_cfood_01)
Call_food_01 <- rbind(Call_food_01,Call_pizza_01)
# 날짜 데이터 형 변환
Call_food_01$date <- as.character(Call_food_01$date)
Call_food_01$date <- as.Date(Call_food_01$date, format = “%Y%m%d”)
# 요일 데이터 순서 조정
Call_food_01$wday <- factor(Call_food_01$wday,
levels = c(“월”, “화”, “수”,”목”,”금”,”토”,”일”))
# food_list를 사용하여 type를 영어로 변경
food_list <- c(“chicken”, “cfood”,”pizza”)
levels(Call_food_01$type) <- food_list
# Na값 확인
sum(is.na(Call_food_01))

어떤 방식으로 Data를 파악 해볼까? (일, 업종)

치킨, 중국집, 피자 집의 데이터를 모두 합쳤다. 그럼 일별, 업종별로 어떠한 차이를 보이는지 알 수 있지 않을까? group_by()를 사용하여 그룹화 시켰고 이를 group_by_data라고 저장후 head()함수를 사용하여 첫 부분만 간단히 보자.

# 일, 업종별 그룹화
group_by_data <- Call_food_01 %>%
group_by(date,wday,type) %>%
summarize(call = sum(call)) %>% as.data.frame()
> head(group_by_data)
date wday type call
1 2019-01-01 화 chicken 13635
2 2019-01-01 화 cfood 10695
3 2019-01-01 화 pizza 6400
4 2019-01-02 수 chicken 9273
5 2019-01-02 수 cfood 11664
6 2019-01-02 수 pizza 4182

데이터의 파악이 한눈에 힘들다면 시각화를..

이렇게 구분한 데이터를 통해 시각화를 한번 해보자. 단순히 숫자에 불과한 데이터를 시각화 해서 보면 전반적으로 파악이 쉽다. 기본적으로 plot() 함수를 for문을 통해 사용 하였다.

  • food_list에서 하나씩 추출 하여 치킨, 중국집, 피자 별로 그래프를 나누었다.
  • 이때 ylim을 사용하여 y축을 전체 값의 최소, 최대값으로 그래프에 노출 시켯다.
for(i in 1:3) {
group_by_data_food <- group_by_data %>%
filter(type == food_list[i])
plot(group_by_data_food[,c(1,4)], type="o",pch=20,cex=0.5, col=i,lwd=2, xlab="",ylab="",
ylim=c(min(group_by_data$call),max(group_by_data$call)))
par(new=T)
}
legend("topright", legend = food_list, col=c(1:3),pch=20, bg = "white", cex = 1)

기존 plot 말고 ggplot으로 하면 더 이쁘게 표현이 가능하다

  • R에서 ggplot2 라는 패키지를 통해 사용하는 이 ggplot 함수는 상당히 이쁜 그래프를 표현할 수가 있다. 또한 이런 그래프를 그리는데 있어서 plot()와 for문을 사용하지 않아도 쉽게 코드를 통해 표현이 가능하다.
  • 그래프를 보면 통화량이 주기를 듸고 있음을 알수 있다. 대충 생각을 해보면 금,토에 통화량이 쏠리고 월요일이 되면 확 줄어듬을 알 수가 있다.
  • 치킨 그래프를 보면 특이한 점이 있다?
    보통 금,토에 쏠리고 월요일에 줄어듬을 알 수가 있는데 평일 언젠가, 그리고 1월 말 즈음에 엄청나게 증가 함을 알 수가 있다. 왜 그럴까. 이 자세한 사항은 다음 블로그에서 모두 파악해보도록 하고 이번 블로그에서는 시각화를 통해 파악을 하는데에 집중 하자.
ggplot(group_by_data, aes(x=date, y=call, group = type, colour=type)) + 
geom_line(size=1) +
geom_point(size=2)

이번에는 구별 데이터를 파악 해보자.

서울시의 구 별로 데이터를 나누어서 어느 지역에 통화량이 몰리는지, 또 어느 지역에 치킨 통화량이 많이 몰리는데, 중국집 통화량은 적게 분포 되어 있는지 파악을 해보도록 하자.

# 구, 별 data 그룹화
data_by_county <- Call_food_01 %>%
group_by(county,type) %>%
summarize(call = sum(call)) %>%
arrange(call) %>%
as.data.frame()
ggplot(data_by_county,
aes(x=county, y=call, group = type, colour=type)) +
geom_line(size=1.3) +
theme(axis.text.x = element_text(angle = 30, size=14)) +
theme(legend.text = element_text(size = 13, face = "italic")) +
geom_point(size=2)

그래프를 봐도 데이터가 한눈에 파악이 되는가?

구별로 데이터를 정리 했지만 한눈에 파악이 쉽지 않을 것이다. 이번에 해볼 것은 치킨, 중국집, 피자 별로 정렬을 시켜서 각 음식별로 어느 지역에서 가장 많이, 적게 통화를 했는지 알아 보자. 먼저 치킨 부터 확인 해보자. 코드는 다음과 같다.

ggplot(data_by_county, 
aes(x=county, y=call, group = type, colour=type)) +
geom_line(size=1.3) +
theme(axis.text.x = element_text(angle = 30, size=14)) +
theme(legend.text = element_text(size = 13, face = “italic”)) +
geom_point(size=2) +
scale_x_discrete(limits = data_by_county %>%
filter(type == “chicken”) %>%
arrange(call) %>%
select(county) %>%
t %>%
as.factor)

구별 데이터: 치킨으로 정렬

치킨을 보면 강서구에서 가장 많이, 도봉구에서 가장 적게 통화량 데이터가 분포 되어 있다. 왜 강서구에? 왜 도봉구에? 이유가 무엇일지 파악하는 것은 다음 블로그에 해보도록 하겠다.

구별 데이터: 중국집으로 정렬

중국집은 강남구에 가장 많이 도봉구에 가장 적게 분포 되어 있다. 어? 근데 뭔가 특이하지? 도봉,관악,광진,양천, 금천 까지는 치킨이며 중국집이며 모두 통화량이 저조 하다. 그 이후 부터 구별로 달라지게 되는데 이도 다음 블로그에 확인해 봐야할 요소이다.

구별 데이터: 피자로 정렬

이번에는 피자로 정렬을 하여 확인해보자. 강서구가 가장 많이, 도봉구가 가장 적게 분포 되어 있다. 피자 데이터는 전체적으로 통화량이 저조 한데 주로 피자는 치킨, 중국집 음식보다 배달을 하지 않거나, 또는 대체로 자주 먹지 않는 음식이라고 판단을 해도 좋을까?

데이터에 대한 시각화, 파악을 마치며

이로써 일별, 구별로 데이터에 대한 시각화를 통해 파악을 마쳤다. 이제 이를 통해 왜 이러한 분포를 띄고 있는지 알아보려 한다. 데이터 분석을 하기 위해 방향을 잡아야 하는데 도메인 지식이 무지한 경우에 쉽게 방향을 잡기가 힘들다. 이렇게 최소한의 방향으로 시각화를 통해 어떤 특이사항이 있는지 파악을 한 후에 분석을 해보는 것도 도움이 될 거라 생각한다.

--

--

미완성의 신

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