R study

성동구 어느 동이 치킨&호프 집이 제일 많을까?

발킴이 2023. 3. 10. 16:12

 책에서는 서대문구를 분석하고 있지만 현재 내가 살고 있는 성동구를 분석해 보는 게 더 재밌을 것 같아서 약간 바꿔보았다. 데이터는 localdata라는 곳에서 가지고 왔는데, 생각보다 잘 정제되고 재밌는 데이터들이 많아서 앞으로 유용하게 쓸 것 같다고 생각했다.

 내가 가지고 온 데이터는 다음과 같다.

서울 특별시 데이터
서울특별시_일반 음식점 데이터
서비스명부터 영업유무, 위치, 전화번호까지 많은 변수들이 있다. 데이터 개수도 폐업 영업 모두 합해서 30만 개 정도 되는 꽤 많은 데이터 양을 가지고 있다.
library("readxl")
library("dplyr")
library("treemap")

 엑셀 파일을 가지고 오는 것이기 때문에 readxl이라는 패키지를 사용했다. 그리고 오늘의 하이라이트는 treemap이다. 시각적으로 이쁘다고 생각되지는 않지만, 설정에 따라 경계도 나뉘고 크기도 달라지기 때문에 어디에 치킨집이 많은지 한눈에 확인가능할 것 같다.

ck_data <- read_excel("/Users/baesuwan/Desktop/치킨집_가공.xlsx")
head(ck_data)

 우선 엑셀 파일을 가지고 오고 head()함수를 통해 데이터가 어떻게 생겼는지 확인해 봤다.

> head(ck_data)
# A tibble: 6 × 3
  소재지전체주소                                      상세영업상태명 사업장명            
  <chr>                                               <chr>          <chr>               
1 서울특별시 성동구 홍익동 39번지                     영업           처갓집양념치킨 왕십…
2 서울특별시 성동구 성수동1가 33-21번지 Biz Well 성수 영업           쿠켄치킨            
3 서울특별시 성동구 성수동2가 277-157번지             영업           백억포차 성수점     
4 서울특별시 성동구 성수동2가 572-1번지               영업           작은공간            
5 서울특별시 성동구 행당동 1-19번지                   영업           또래오래            
6 서울특별시 성동구 성수동2가 300-87                  영업           을지로골뱅이

 주소가 너무 세부적으로 나와있어서 분석할 때 힘들 것 같다. 그래서 책에서는 동만 나오게 만드는 방법을 알려준다. "서울특별시 성동구"는 모두 공통되는 요소이기 때문에 제외해도 된다. 그리고 동 이후의 글자도 제외해야 한다. 방법은 다음과 같다.

addr <- substr(ck_data$소재지전체주소,10,14)
addr_num <- gsub("[0-9]","",addr)
addr_trim <- gsub(" ","",addr_num) 
head(addr_trim)

 substr()은 지정된 위치의 글자만 남기고 삭제해 주는 기능을 가지고 있다. 10번째부터 14번째까지 글자는 살리고 나머지는 다 삭제했다. 하지만 여기서 문제가 생긴다. 위 데이터를 보면 알 수 있듯이 어떤 것은 "홍익동 "으로 나오고 어떤 것은 "성수동 1" 이렇게 숫자까지 나오게 된다. 그리고 만약 동 이름이 2글자가 아니라면 문제가 생긴다. 그래서 책에서 말해주듯 가장 긴 동을 기준으로 잡고 잘라준 후, 숫자와 빈칸을 지우는 식으로 코딩했다. 

> head(addr_trim)
[1] "홍익동" "성수동" "성수동" "성수동" "행당동" "성수동"

 이렇게 한 결과 아주 깔끔하게 동만 잘 나왔다. 하지만 treemap() 함수를 쓰기 위해서는 데이터가 데이터 프레임의 형태로 존재해야 한다.

addr_count <- addr_trim %>% table() %>% data.frame()
head(addr_count)

 이렇게 하면 데이터 프레임의 형태로 변형이 가능하다. 결과는 다음과 같다.

> head(addr_count)
         . Freq
1   금호동  117
2   도선동   29
3   마장동   31
4   사근동    7
5 상왕십리   19
6   성수동  219

 해석하자면 금호동에 117개의 매장이 있고(폐업도 포함이다.) 도선동에 29개의 매장이 있다. 

treemap(addr_count,vSize="Freq",index=c("."),title="성동구 치킨집 분포",
        fontfamily.labels="AppleGothic",fontfamily.title = "AppleGothic")

 treemap()에 있는 인수 중 vSize는 크기를 결정할 변수이고 index는 경계를 나누는 변수이다. 그리고 현재 맥 os를 사용하고 있기 때문에 폰트 설정도 해주었다.(안 하면 한글이 깨진다.) 결과는 다음과 같다.

 이번에는 영업을 하지 않는 곳은 빼고 treemap을 만들어보겠다. 그렇게 하기 위해서는 다시 데이터를 정제해야 한다.

ck_data$소재지전체주소 <- addr_trim
head(ck_data)

 우선 엄청 긴 주소로 이루어져 있던 ck_data를 동만 있는 주소로 교체해 줬다.

> head(ck_data)
# A tibble: 6 × 3
  소재지전체주소 상세영업상태명 사업장명               
  <chr>          <chr>          <chr>                  
1 홍익동         영업           처갓집양념치킨 왕십리점
2 성수동         영업           쿠켄치킨               
3 성수동         영업           백억포차 성수점        
4 성수동         영업           작은공간               
5 행당동         영업           또래오래               
6 성수동         영업           을지로골뱅이

 이렇게 한 후 filter 함수를 이용하여 상성영업상태명이 영업인 곳만 남겼다.

open_ck<-filter(ck_data,ck_data$상세영업상태명=="영업")
head(open_ck)

 그리고 앞에서 했던 과정을 반복했다.

count_open_ck <- open_ck$소재지전체주소 %>% table() %>% data.frame() #소재지전체주소 개수 데이터 프래임 만들기
head(count_open_ck)
treemap(count_open_ck,vSize="Freq",index=c("."),title="성동구 치킨집 분포",
        fontfamily.labels="AppleGothic",fontfamily.title = "AppleGothic") #treemap 만들기

 결과는 비슷했다. 폐업+영업이나 영업만 계산했을 때나 비슷한 비율의 값이 나왔다. 절대적인 값은 다르겠지만 서로 비교해서 보면 성수동이 가장 많고 행당동, 금호동 순이다. 다만, 마장동과 비슷한 비율이었던 옥수동이 영업하는 곳으로 계산했을 때는 마장동보다 비율이 작았다.(이유는 모른다.)

 오늘은 꽤 재밌는 분석을 해봤다. 책에서 나온 것도 분석도 좋았지만, 나와 관련된 정보를 분석해 보는 게 더 의미 있는 것 같다.