쉽게 배우는 r 데이터 분석
Github Code: Hoon0427/RPubs


대한민국의 인구통계와 지도 데이터를 이용해 단계 구분도를 만들어 보겠습니다.


대한민국 시도별 인구 단계 구분도 만들기


kormaps2014 패키지를 이용하면 대한민국의 지역 통계 데이터와 지도 데이터를 사용할 수 있습니다.


1. 패키지 준비하기


먼저 kormaps2014 패키지를 이용하는데 필요한 stringi 패키지를 설치하겠습니다. 그런 다음, devtools 패키지를 설치한 후 install_github()를 이용해 패키지 개발자가 깃허브에 공유한 kormaps2014 패키지를 설치하고 로드하겠습니다.

#install.packages("stringi")
#install.packages("devtools")
#devtools::install_github("cardiomoon/kormaps2014")

library(DT)
library(kormaps2014)


2.대한민국 시도별 인구 데이터 준비하기


kormaps2014 패키지에는 몇 가지 종류의 지역별 인구통계 데이터가 들어 있습니다. 이 중 시도별 인구통계 정보가 담겨있는 korpop1 데이터를 이용해 시도별 인구 단계 구분도를 만들겠습니다.


먼저 str()로 변수를 살펴보겠습니다. korpop1 데이터의 인코딩이 UTF-8로 되어 있어서 윈도우에서는 한글 문자가 꺠져 보입니다. kormaps2014 패키지의 changeCode()를 이용해 인코딩을 CP949로 변환한 후 str()에 적용하면 한글이 깨지지 않고 출력됩니다.

str(changeCode(korpop1))
## 'data.frame':    17 obs. of  25 variables:
##  $ C행정구역별_읍면동     : chr  "'11" "'21" "'22" "'23" ...
##  $ 행정구역별_읍면동      : chr  "서울특별시" "부산광역시" "대구광역시" "인천광역시" ...
##  $ 시점                   : chr  "2015" "2015" "2015" "2015" ...
##  $ 총인구_명              : chr  "9904312" "3448737" "2466052" "2890451" ...
##  $ 남자_명                : chr  "4859535" "1701347" "1228511" "1455017" ...
##  $ 여자_명                : chr  "5044777" "1747390" "1237541" "1435434" ...
##  $ 내국인_계_명           : chr  "9567196" "3404667" "2436770" "2822601" ...
##  $ 내국인_남자_명         : chr  "4694317" "1675339" "1211219" "1414793" ...
##  $ 내국인_여자_명         : chr  "4872879" "1729328" "1225551" "1407808" ...
##  $ 외국인_계_명           : chr  "337116" "44070" "29282" "67850" ...
##  $ 외국인_남자_명         : chr  "165218" "26008" "17292" "40224" ...
##  $ 외국인_여자_명         : chr  "171898" "18062" "11990" "27626" ...
##  $ 가구_계_가구           : chr  "3914820" "1348315" "937573" "1066297" ...
##  $ 일반가구_가구          : chr  "3784490" "1335900" "928528" "1045417" ...
##  $ 집단가구_가구          : chr  "2261" "686" "574" "713" ...
##  $ 외국인가구_가구        : chr  "128069" "11729" "8471" "20167" ...
##  $ 주택_계_호             : chr  "2793244" "1164352" "738100" "942244" ...
##  $ 단독주택_호            : chr  "355039" "225697" "155801" "102914" ...
##  $ 아파트_호              : chr  "1636896" "738068" "509068" "577346" ...
##  $ 연립주택_호            : chr  "117235" "32120" "9381" "21589" ...
##  $ 다세대주택_호          : chr  "654372" "154253" "53098" "232346" ...
##  $ 비거주용_건물내_주택_호: chr  "29702" "14214" "10752" "8049" ...
##  $ 주택이외의_거처_호     : chr  "150951" "50810" "15304" "39964" ...
##  $ C행정구역별            : chr  "11" "21" "22" "23" ...
##  $ code                   : chr  "11" "21" "22" "23" ...


3. 변수명이 한글로 되어 있으면 오류가 발생할 수 있습니다. 오류를 막기 위해 분석에 사용할 변수명을 영문자로 바꾸겠습니다.

library(dplyr)
korpop1 <- rename(korpop1, pop = 총인구_명, name = 행정구역별_읍면동)


4. 대한민국 시도 지도 데이터 준비하기


kormaps2014 패키지에는 몇 가지 종류의 지도 데이터가 들어 있습니다. 이 중 시도별 위도, 경도 정보를 담고 있는 kormap1을 지도 데이터로 이용하겠습니다.

str(changeCode(korpop1))
## 'data.frame':    17 obs. of  25 variables:
##  $ C행정구역별_읍면동     : chr  "'11" "'21" "'22" "'23" ...
##  $ name                   : chr  "서울특별시" "부산광역시" "대구광역시" "인천광역시" ...
##  $ 시점                   : chr  "2015" "2015" "2015" "2015" ...
##  $ pop                    : chr  "9904312" "3448737" "2466052" "2890451" ...
##  $ 남자_명                : chr  "4859535" "1701347" "1228511" "1455017" ...
##  $ 여자_명                : chr  "5044777" "1747390" "1237541" "1435434" ...
##  $ 내국인_계_명           : chr  "9567196" "3404667" "2436770" "2822601" ...
##  $ 내국인_남자_명         : chr  "4694317" "1675339" "1211219" "1414793" ...
##  $ 내국인_여자_명         : chr  "4872879" "1729328" "1225551" "1407808" ...
##  $ 외국인_계_명           : chr  "337116" "44070" "29282" "67850" ...
##  $ 외국인_남자_명         : chr  "165218" "26008" "17292" "40224" ...
##  $ 외국인_여자_명         : chr  "171898" "18062" "11990" "27626" ...
##  $ 가구_계_가구           : chr  "3914820" "1348315" "937573" "1066297" ...
##  $ 일반가구_가구          : chr  "3784490" "1335900" "928528" "1045417" ...
##  $ 집단가구_가구          : chr  "2261" "686" "574" "713" ...
##  $ 외국인가구_가구        : chr  "128069" "11729" "8471" "20167" ...
##  $ 주택_계_호             : chr  "2793244" "1164352" "738100" "942244" ...
##  $ 단독주택_호            : chr  "355039" "225697" "155801" "102914" ...
##  $ 아파트_호              : chr  "1636896" "738068" "509068" "577346" ...
##  $ 연립주택_호            : chr  "117235" "32120" "9381" "21589" ...
##  $ 다세대주택_호          : chr  "654372" "154253" "53098" "232346" ...
##  $ 비거주용_건물내_주택_호: chr  "29702" "14214" "10752" "8049" ...
##  $ 주택이외의_거처_호     : chr  "150951" "50810" "15304" "39964" ...
##  $ C행정구역별            : chr  "11" "21" "22" "23" ...
##  $ code                   : chr  "11" "21" "22" "23" ...


5. 단계 구분도 만들기


korpop1 데이터의 시도별 인구 변수와 kormap1의 시도별 위경도 데이터를 이용해 단계 구분도를 만들겠습니다. 지역 기준이 되는 code 변수가 숫자 코드로 되어 있기 때문에 지도에 마우스 커서를 올리면 코드가 표시됩니다. 코드 대신 지역명이 표시되도록 tooltip에 지역명 변수 name을 지정하겠습니다. 코드를 실행하면 뷰어 창에 단계 구분도가 생성됩니다. 지도 위에 마우스 커서를 올리면 해당 지역의 인구가 표시됩니다.

#install.packages("ggiraphExtra")
library(ggiraphExtra)
library(ggplot2)

str(changeCode(korpop1))
## 'data.frame':    17 obs. of  25 variables:
##  $ C행정구역별_읍면동     : chr  "'11" "'21" "'22" "'23" ...
##  $ name                   : chr  "서울특별시" "부산광역시" "대구광역시" "인천광역시" ...
##  $ 시점                   : chr  "2015" "2015" "2015" "2015" ...
##  $ pop                    : chr  "9904312" "3448737" "2466052" "2890451" ...
##  $ 남자_명                : chr  "4859535" "1701347" "1228511" "1455017" ...
##  $ 여자_명                : chr  "5044777" "1747390" "1237541" "1435434" ...
##  $ 내국인_계_명           : chr  "9567196" "3404667" "2436770" "2822601" ...
##  $ 내국인_남자_명         : chr  "4694317" "1675339" "1211219" "1414793" ...
##  $ 내국인_여자_명         : chr  "4872879" "1729328" "1225551" "1407808" ...
##  $ 외국인_계_명           : chr  "337116" "44070" "29282" "67850" ...
##  $ 외국인_남자_명         : chr  "165218" "26008" "17292" "40224" ...
##  $ 외국인_여자_명         : chr  "171898" "18062" "11990" "27626" ...
##  $ 가구_계_가구           : chr  "3914820" "1348315" "937573" "1066297" ...
##  $ 일반가구_가구          : chr  "3784490" "1335900" "928528" "1045417" ...
##  $ 집단가구_가구          : chr  "2261" "686" "574" "713" ...
##  $ 외국인가구_가구        : chr  "128069" "11729" "8471" "20167" ...
##  $ 주택_계_호             : chr  "2793244" "1164352" "738100" "942244" ...
##  $ 단독주택_호            : chr  "355039" "225697" "155801" "102914" ...
##  $ 아파트_호              : chr  "1636896" "738068" "509068" "577346" ...
##  $ 연립주택_호            : chr  "117235" "32120" "9381" "21589" ...
##  $ 다세대주택_호          : chr  "654372" "154253" "53098" "232346" ...
##  $ 비거주용_건물내_주택_호: chr  "29702" "14214" "10752" "8049" ...
##  $ 주택이외의_거처_호     : chr  "150951" "50810" "15304" "39964" ...
##  $ C행정구역별            : chr  "11" "21" "22" "23" ...
##  $ code                   : chr  "11" "21" "22" "23" ...
korpop1$name <- iconv(korpop1$name, "UTF-8","CP949")

ggChoropleth(data = korpop1,      # 지도에 표현할 데이터
             aes(fill = pop,      # 색깔로 표현할 변수
                 map_id = code,   # 지역 기준 변수
                 tooltip = name), # 지도 위에 표시할 지역명
             map = kormap1,       # 지도 데이터
             interactive = T)     # 인터랙티브


korpop1 $name <- iconv(korpop1 $name, “UTF-8”,“CP949”) 을 사용하지 않으면 지도의 한글 깨짐 현상이 발생하여 해당 함수를 사용했습니다.


대한민국 시도별 결핵 환자 수 단계 구분도 만들기


kormaps2014 패키지에는 지역별 결핵 환자 수에 대한 정보를 담고 있는 tbc 데이터가 있습니다. 이번에는 tbc 데이터의 NewPts(결핵 환자 수) 변수를 이용해 시도별 결핵 환자 수 단계 구분도를 만들어 보겠습니다.

str(changeCode(tbc))
## 'data.frame':    255 obs. of  5 variables:
##  $ name1 : chr  "강원" "경기" "경남" "경북" ...
##  $ code  : chr  "32" "31" "38" "37" ...
##  $ name  : chr  "강원도" "경기도" "경상남도" "경상북도" ...
##  $ year  : chr  "2001" "2001" "2001" "2001" ...
##  $ NewPts: chr  "1396" "4843" "1749" "2075" ...
tbc$name <- iconv(tbc$name, "UTF-8", "CP949")

ggChoropleth(data = tbc,          # 지도에 표현할 데이터
             aes(fill = NewPts,   # 색깔로 표현할 변수
                 map_id = code,   # 지역 기준 변수
                 tooltip = name), # 지도 위에 표시할 지역명
             map = kormap1,       # 지도 데이터
             interactive = T)     # 인터랙티브