챕터 9 서울시 급똥 지도

생각만해도 무시무시한 상황이 있다. 바로 ’급똥이 마려울 때’다. 이럴 때는 어떻게 해야할까? datatoysseoulRestroom 데이터셋을 이용해 급똥이 마려울 때 화장실을 찾아보자. 이는 서울시 공중화장실 현황정보를 제공한다.

str(seoulRestroom)
## 'data.frame':    5046 obs. of  4 variables:
##  $ 주소(구): chr  "송파구" "노원구" "노원구" "강북구" ...
##  $ 주소(동): chr  "마천동" "하계동" "하계동" "수유동" ...
##  $ 위도    : num  37.5 37.6 37.6 37.6 37.7 ...
##  $ 경도    : num  127 127 127 127 127 ...

열의 이름에 괄호가 들어가 있다. 이런 경우 dplyr 패키지의 rename() 함수를 이용해 열의 이름을 변경할 수 있다.

restroom <- seoulRestroom %>% 
  rename(
    "구이름" = "주소(구)",
    "동이름" = "주소(동)"
  )

str(restroom)
## 'data.frame':    5046 obs. of  4 variables:
##  $ 구이름: chr  "송파구" "노원구" "노원구" "강북구" ...
##  $ 동이름: chr  "마천동" "하계동" "하계동" "수유동" ...
##  $ 위도  : num  37.5 37.6 37.6 37.6 37.7 ...
##  $ 경도  : num  127 127 127 127 127 ...

또는 jonitor 패키지의 clean_names() 함수를 사용할 수도 있다.

library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
restroom <- seoulRestroom %>% 
  clean_names(ascii = FALSE)

먼저 가장 화장실에 진심인 동네를 찾아보자.

restroom %>% 
  group_by(주소_구) %>% 
  summarise(화장실개수 = n()) %>% 
  arrange(desc(화장실개수)) %>% 
  head(20)
## # A tibble: 20 × 2
##    주소_구  화장실개수
##    <chr>         <int>
##  1 영등포구        835
##  2 서초구          447
##  3 중구            327
##  4 송파구          275
##  5 은평구          263
##  6 강서구          247
##  7 광진구          216
##  8 성북구          205
##  9 강남구          201
## 10 마포구          178
## 11 성동구          159
## 12 강동구          157
## 13 노원구          157
## 14 종로구          143
## 15 동작구          129
## 16 양천구          126
## 17 용산구          124
## 18 동대문구        123
## 19 구로구          121
## 20 중랑구          113
restroom %>% 
  group_by(주소_구, 주소_동) %>% 
  summarise(화장실개수 = n()) %>% 
  arrange(desc(화장실개수)) %>% 
  head(20)
## `summarise()` has grouped output by '주소_구'. You can override using the `.groups` argument.
## # A tibble: 20 × 3
## # Groups:   주소_구 [10]
##    주소_구  주소_동  화장실개수
##    <chr>    <chr>         <int>
##  1 영등포구 여의도동        211
##  2 서초구   서초동          198
##  3 영등포구 영등포동         94
##  4 영등포구 신길동           89
##  5 서초구   방배동           82
##  6 영등포구 양평동           75
##  7 영등포구 대림동           73
##  8 서초구   양재동           69
##  9 노원구   상계동           61
## 10 영등포구 문래동           58
## 11 구로구   구로동           56
## 12 도봉구   창동             49
## 13 은평구   응암동           49
## 14 강서구   등촌동           48
## 15 서초구   반포동           47
## 16 중구     신당동           47
## 17 광진구   화양동           43
## 18 송파구   잠실동           43
## 19 송파구   가락동           42
## 20 송파구   방이동           41

여의도동이 211개로 가장 많았고 서초동이 뒤를 이었다. ggplot2를 사용해 시각화 해보자.

restroom %>% 
  group_by(주소_구, 주소_동) %>% 
  summarise(화장실개수 = n()) %>% 
  arrange(desc(화장실개수)) %>% 
  head(20) %>%
  ggplot(aes(x = reorder(주소_동, 화장실개수), y = 화장실개수)) +
  geom_col() +
  geom_text(aes(label = 화장실개수), hjust = -0.) +
  coord_flip() +
  ggthemes::theme_fivethirtyeight(base_family="NanumGothic") +
  labs(
    title = "급똥이 마려울 때 생존 확률이 높은 동네 TOP 20",
    subtitle = "서울시 구별 화장실 개수"
  )
## `summarise()` has grouped output by '주소_구'. You can override using the `.groups` argument.

마지막으로 실제 서울시 화장실의 위치를 시각화해보자.

library(leaflet)
leaflet(seoulRestroom) %>% 
  addTiles() %>% 
  setView(lng = 126.9784, lat = 37.566, zoom = 11) %>% 
  addProviderTiles('CartoDB.Positron') %>% 
  addCircles(lng = ~경도, lat = ~위도,
             label = ~`주소(동)`)

보다 자세한 화장실 위치가 파악 된다. 부디 급똥이 마려울 때 이 지도를 참고해 최악의 상황을 피하길 기원한다.