Rev Notebook

[데이터시각화] 8. 지도

by Rev_

이번에는 R을 통하여 한국 지도, 미국 지도, 세계 지도를 그려보고자 한다.

 

install.packages("maptools")
library(maptools)
library(ggplot2)

shp0 <- readRDS("C:/BNG/KOR_adm0.rds")
plot(shp0)
shp1 <- readRDS("C:/BNG/KOR_adm1.rds")
plot(shp1)
shp2 <- readRDS("C:/BNG/KOR_adm2.rds")
plot(shp2)

KOR_adm0.rds 데이터는 우리나라 전체 지도

KOR_adm1.rds 데이터는 우리나라 광역시도별 지도

KOR_adm2.rds 데이터는 우리나라 시군별 지도를 담았다.

이 세 개의 데이터를 모두 합치면 위와 같은 형태가 된다.

 

kosis <- read.csv("C:/BNG/kosis.csv", header = TRUE)
> str(kosis)   
'data.frame':   17 obs. of  17 variables:
 $ 시도별    : chr  "부산" "충북" "충남" "대구" ...
 $ 경활비율  : num  58.6 63.7 64.6 60.7 61.5 58.3 55 63.4 64.7 61.2 ...
 $ 고용률    : num  56.4 61.8 62.4 58.4 59.4 56.5 56.1 61.3 62.8 59.7 ...
 $ 인구수    : num  0.256 0.086 0.143 0.166 0.084 0.081 0.081 1 0.185 0.233 ...
 $ 취업자    : int  1667 810 1158 1215 765 711 736 6226 1420 1632 ...
 $ 실업자    : int  66 25 40 49 27 23 22 217 43 41 ...
 $ 비경활인구: int  1224 476 657 817 496 525 498 3717 800 1061 ...
 $ 인구      : int  2957 1311 1855 2080 1288 1259 1255 10159 2263 2734 ...
 $ 경활인구  : int  1733 835 1198 1264 792 734 758 6442 1463 1673 ...
 $ 실업률    : num  3.8 3 3.4 3.9 3.4 3.1 2.8 3.4 2.9 2.5 ...
 $ long      : num  129 128 127 129 127 ...
 $ lat       : num  35.2 36.8 36.5 35.9 36.4 ...
 $ 경활인구수: num  0.23 0.084 0.143 0.154 0.077 0.067 0.071 1 0.186 0.221 ...
 $ 취업자수  : num  0.229 0.084 0.142 0.152 0.076 0.067 0.071 1 0.187 0.223 ...
 $ 실업자수  : num  0.252 0.077 0.141 0.179 0.085 0.068 0.064 0.897 0.154 0.145 ...
 $ 시도      : chr  "광역시" "도" "도" "광역시" ...
 $ ID_1      : int  1 2 3 4 5 6 7 8 9 10 ...

17 X 17로 이루어진 kosis 데이터가 있다.

 

shp1_ffd1 <- fortify(shp1)
> str(shp1_ffd1) # 통계분석이 가능한 데이터 프레임으로 변환됨
'data.frame':   339940 obs. of  7 variables:
 $ long : num  129 129 129 129 129 ...
 $ lat  : num  35.1 35.1 35.1 35.1 35.1 ...
 $ order: int  1 2 3 4 5 6 7 8 9 10 ...
 $ hole : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ piece: Factor w/ 926 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ id   : chr  "1" "1" "1" "1" ...
 $ group: Factor w/ 1561 levels "1.1","1.2","1.3",..: 1 1 1 1 1 1 1 1 1 1 ...

fortify()을 통하여 통계분석이 가능한 데이터 프레임으로 변환했다.

 

kosis$id <- kosis$ID_1
kosis$id <- as.factor(kosis$id) # 척도를 범주형으로 변환
> str(shp1_ffd1)
'data.frame':   339940 obs. of  7 variables:
 $ long : num  129 129 129 129 129 ...
 $ lat  : num  35.1 35.1 35.1 35.1 35.1 ...
 $ order: int  1 2 3 4 5 6 7 8 9 10 ...
 $ hole : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ piece: Factor w/ 926 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ id   : Factor w/ 17 levels "1","10","11",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ group: Factor w/ 1561 levels "1.1","1.2","1.3",..: 1 1 1 1 1 1 1 1 1 1 ...

척도를 범주형 데이터로 변환하였다.

 

ggplot() + geom_polygon(data = shp1_ffd1, aes(x=long, y=lat, group = group),
	fill = 'white', colour = 'grey') + # 지도 데이터 그리기
	+ geom_point(data = kosis, aes(x=long, y=lat, size=인구, color=경활비율),
    shape = 19, alpha=0.95) + scale_size_area(max_size=10)
    + scale_color_gradientn(colours = c("yellow", "orange", "brown", "darkred"))

geom_polygon()를 통하여 지도를 그린다. X축과 Y축은 반드시 위도와 경도를 설정하여야 하고, group 변수가 매핑되어야 한다.

경제활동 비율이 높은 지역으로는 제주가 가장 높고, 그 다음으로는 경기도, 서울, 인천, 충남, 경북, 전남 등의 순으로 나타났음

부산의 경우는 경제활동 비율이 상대적으로 낮은편에 속한다.

 

ggplot(data=kosis) + geom_map(aes(map_id=id, fill=취업자), map=shp1_ffd1,
	colour='grey50', size=0.1)
    + expand_limits(x=shp1_ffd1$long, y=shp1_ffd1$lat) + coord_map() + ggtitle("취업자")
    + scale_fill_gradientn(colours = c("yellow", "orange", "brown", "darkred"))
    + geom_text(aes(label = 시도별, x = long, y = lat), size=3)

 

ggplot(kosis) + geom_map(aes(map_id=id, fill=고용률), map=shp1_ffd1)
	+ expend_limits(x=shp1_ffdl$long, y=shp1_ffd1$lat) + coord_map()
    + ggtitle("광역시별 고용률")
    + scale_fill_gradientn(colours = c("white", "orange", "red"))
    + geom_text(aes(label = 시도별, x = long+0.3, y = lat), size = 3)

서울의 경우, 고용률은 보통 수준이고, 인구는 1000만 이상이며, 경제 활동 비율은 상대적으로 높은 것으로 나타남

부산의 경우, 고용률은 상대적으로 매우 낮은 수준이며, 250만 이상으로 보이고, 경제 활동 비율은 상대적으로 낮은 수준이다.

경북의 경우, 고용률은 낮고, 인구 수는 250만 정도이고, 경제활동 비율은 상대적으로 높다.

광주의 경우, 고용률은 낮고, 인구도 적으며, 경활비율도 낮다.

 

library(maps)
library(ggplot2)
costcos <- read.csv("C:/BNG/costcos-geocoded.csv", header = T)
> str(costcos)
'data.frame':   417 obs. of  6 variables:
 $ Address  : chr  "1205 N. Memorial Parkway" "3650 Galleria Circle" "8251 Eastchase Parkway" "5225 Commercial Boulevard" ...
 $ City     : chr  "Huntsville" "Hoover" "Montgomery" "Juneau" ...
 $ State    : chr  "Alabama" "Alabama" "Alabama" "Alaska" ...
 $ Zip.Code : chr  "35801-5930" "35244-2346" "36117" "99801-7210" ...
 $ Latitude : num  34.7 33.4 32.4 58.4 61.1 ...
 $ Longitude: num  -86.6 -86.8 -86.2 -134.5 -149.9 ...

417 X 6로 이루어진 코스트코에 관한 데이터가 있다.

 

state_map <- map_data("state")
> str(state_map) # 지도 데이터 : 위도 경도(long, lat), 지역(region)
'data.frame':   15537 obs. of  6 variables:
 $ long     : num  -87.5 -87.5 -87.5 -87.5 -87.6 ...
 $ lat      : num  30.4 30.4 30.4 30.3 30.3 ...
 $ group    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ order    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ region   : chr  "alabama" "alabama" "alabama" "alabama" ...
 $ subregion: chr  NA NA NA NA ...

map_data()는 내장되어 있는 지도 데이터를 불러올 때 사용하는 함수이다.

여기서는 하와이주와 알래스카주를 제외한 주만 있는 미국 지도를 불러왔다.

 

ggplot() + geom_polygon(data = state_map, aes(x=long, y=lat, group = group), 
    fill = 'white', colour = 'grey') + expand_limits(x = state_map$long, y = state_map$lat) +
    coord_map()

 

costcos48 <- costcos[which(costcos$Longitude >= -130 & costcos$Latitude <= 50), ]

ggplot() + geom_polygon(data = state_map, aes(x=long, y=lat, group=group), 
	fill = 'white', colour = 'grey') + expand_limits(x=state_map$long, y=state_map$lat) +
    coord_map() + geom_point(data = costcos48, aes(label = State, 
    x = Longitude+0.3, y=Latitude), color = 'red', size = 1, alpha = 0.95) +
    geom_text(data = costcos48, aes(label = State, x = Longitude+0.3, y = Latitude), size=2)

미국에 존재하는 코스트코의 위치를 지도에 표시한 결과

서부와 동부의 해안선 근처에 많이 밀집되어 있는 것을 알 수 있음

코스트코가 많다는 것은 인구의 밀집도가 높은 지역이라는 걸 예상할 수 있음

즉, 미국의 인구 밀도는 동부 해안선의 도시들과 서부 해안선 도시들에 높음을 알 수 있음

미국의 중부와 북부 지역의 도시에는 인구 밀도가 낮음을 추정할 수 있다.

블로그의 정보

Hi Rev

Rev_

활동하기