트위티의 열하일기

6. 지도 시각화 본문

카테고리 없음

6. 지도 시각화

예지레슬리초이 2025. 2. 27. 03:48

#01 미국 주별 강력 범죄율 단계 구분도 만들기

단계 구분도 (Choropleth Map) 란?

: 지역별 통계치를 색깔의 차이로 표현한 지도

 

패키지 준비 → 미국 주별 데이터 준비 → 데이터 전처리 → 미국 지도 데이터 준비 → 단계 구분도 생성

 

1. 패키지 준비하기

- 단계 구분도: ggiraphExtra 패키지 

install.packages("mapproj")
install.packages("ggiraphExtra")
library(ggiraphExtra)

 

2. 미국 주별 데이터 준비하기

a. 변수 확인하기

str(USArrests)

#결과
'data.frame':	50 obs. of  4 variables:
 $ Murder  : num  13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
 $ Assault : int  236 263 294 190 276 204 110 238 335 211 ...
 $ UrbanPop: int  58 48 80 50 91 78 77 72 80 60 ...
 $ Rape    : num  21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9 25.8 ...
head(USArrests)

# 결과
           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7

 

b. 데이터 전처리하기

- rownames_to_column(): 행 이름 바꾸기 (지역명 → state)

library(tibble)

crime <- rownames_to_column(USArrests, var = "state")
crime$state <- tolower(crime$state)

str(crime)

# 결과
'data.frame':	50 obs. of  5 variables:
 $ state   : chr  "alabama" "alaska" "arizona" "arkansas" ...
 $ Murder  : num  13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
 $ Assault : int  236 263 294 190 276 204 110 238 335 211 ...
 $ UrbanPop: int  58 48 80 50 91 78 77 72 80 60 ...
 $ Rape    : num  21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9 25.8 ...

 

3. 미국 주 지도 데이터 준비하기

- 지역별 위도, 경도 정보가 있는 지도 데이터

install.packages("maps")
library(ggplot2)
states_map <- map_data("state")
str(states_map)

 

4. 단계 구분도 만들기

- ggiraphExtra 패키지의 ggChoropleth() 이용

ggChoropleth(data = crime,# 지도에 표현할 데이터터
             aes(fill = Murder, # 색깔로 표현할 변수
             map_id = state), # 지역 기준 번수
             map = states_map) # 지도 데이터

- interactive = T : 마우스 움직임에 반응하는 인터랙티브 단계 구분도 생성

ggChoropleth(data = crime, # 지도에 표현할 데이터
             aes(fill=Murder, # 색깔로 표현할 변수
                 map_id = state), # 지역 기준 변수
             map = states_map, # 지도 데이터
             interactive = T) # 인터랙티브

 

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

패키지 준비 → 대한민국 시도별 인구 데이터 준비 → 데이터 전처리 → 대한민국 시도 지도 데이터 준비 → 단계 구분도 생성

 

1. 패키지 준비하기

- install_github() : 패키지 개발자가 깃허브에 공유한 패키지 설치

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

 

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

a. 변수 살펴보기

str(korpop1)

#결과
'data.frame':	17 obs. of  25 variables:
 $ C행정구역별_읍면동     : Factor w/ 3819 levels "'00","'03","'04",..: 5 455 681 832 995 1096 1181 1246 1264 1874 ...
 $ 행정구역별_읍면동      : Factor w/ 3398 levels "  가경동","  가곡동",..: 3388 3387 3383 3392 3382 3384 3390 3389 3379 3378 ...
 $ 시점                   : int  2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
 $ 총인구_명              : int  9904312 3448737 2466052 2890451 1502881 1538394 1166615 204088 12479061 1518040 ...
 $ 남자_명                : int  4859535 1701347 1228511 1455017 748867 772243 606924 103210 6309661 768241 ...
 $ 여자_명                : int  5044777 1747390 1237541 1435434 754014 766151 559691 100878 6169400 749799 ...
 $ 내국인_계_명           : int  9567196 3404667 2436770 2822601 1481289 1519314 1136755 199617 12026429 1499734 ...

 

 b. 한글로 된 변수명을 영문자로 수정하기

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

 

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

str(kormap1)

#결과
'data.frame':	8831 obs. of  15 variables:
 $ id       : chr  "0" "0" "0" "0" ...
 $ long     : num  138 138 138 138 138 ...
 $ lat      : num  50.7 50.7 50.7 50.7 50.7 ...
 $ order    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ hole     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ piece    : Factor w/ 113 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ group    : Factor w/ 205 levels "0.1","1.1","1.2",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ SP_ID    : Factor w/ 17 levels "0","1","10","11",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ SIDO_CD  : Factor w/ 17 levels "11","21","22",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ SIDO_NM  : Factor w/ 17 levels "\xb0\xad\xbf\xf8\xb5\xb5",..: 9 9 9 9 9 9 9 9 9 9 ...
 $ BASE_YEAR: Factor w/ 1 level "2014": 1 1 1 1 1 1 1 1 1 1 ...
 $ name     : Factor w/ 17 levels "강원도","경기도",..: 9 9 9 9 9 9 9 9 9 9 ...
 $ name1    : Factor w/ 17 levels "\xb0\xad\xbf\xf8\xb5\xb5",..: 9 9 9 9 9 9 9 9 9 9 ...
 $ region   : Factor w/ 17 levels "11","21","22",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ code     : Factor w/ 17 levels "11","21","22",..: 1 1 1 1 1 1 1 1 1 1 ...

 

4. 단계 구분도 만들기

ggChoropleth(data = korpop1,
             aes(fill = pop,
                 map_id = code,
                 tooltip = name),
             map = kormap1,
             interactive = T)

ggChoropleth(data = tbc,
             aes(fill = NewPts,
                 map_id = code,
                 tooltip = name),
             map = kormap1,
             interactive = T)