R/강의복습

[22.08.19] 9일차 지도시각화

peach_h 2022. 8. 21. 18:22
# 11장 : 지도 시각화
install.packages("ggiraphExtra")
install.packages("maps")
install.packages("mapproj")
install.packages("tibble")


library(ggiraphExtra)
library(maps)
library(mapproj)
library(tibble)
library(ggplot2)

지도 시각화에 필요한 packages와 library를 실행한다.

 

 

USAarrests 자료 활용하기

새로운 자료를 사용할 때, 항상 자료 미리보기는 필수다.

head(USArrests)
class(USArrests)

# 행이름이 도시명
rownames(USArrests)

행 이름이 도시명, 열 이름이 범죄명인 것 같다!

 

 

pairs 함수로 산포도 확인하기
# ggplot 말고도 scatter plot matrix 차트가 있다.
pairs(USArrests, panel=panel.smooth, main="USArrests Data")

pairs( ) 함수를 이용하면, 데이터프레임 속 변수들의 관계를 산포도를 통해 한눈에 확인할 수 있다.

이 데이터에서는, 인구수와 다양한 범죄들에 어떤 상관관계가 있는지 확인 가능하다.

 

 

 

rownames_to_column으로 행의 이름 열로 바꾸기
# rownames_to_column : 행의 이름을 열로바꿔줌
crime <- rownames_to_column(USArrests, var="state")
head(crime)

 

위 아래 차이를 보면, 행의 이름이였던 지역명들이 state라는 컬럼에 속하는 데이터로 변한 것을 확인할 수 있다.

 

 

 

지도 시각화 하기
crime$state[1:6]
 # 행이름을 소문자로
crime$state <-tolower(crime$state)
crime$state[1:6]

# state 열의 맵 데이터 가져오기
states_map <- map_data("state")

시각화를 하기전, 우선 대소문자가 섞여있는 데이터를 tolower 함수로 전부 소문자로 바꿔준다.

이거 안하고 그냥 했더니 오류가 나더라...

 

dev.off()

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

dev.off() : palette 리셋 명령어

invalid graphics state 오류가 자꾸나고, 그림이 안나와서 검색해보니

대충 이전에 사용했던 palette 때매 문제가 생겼나보다.

그래서 palette를 리셋하는 dev.off를 추가했더니 잘나옴 !!

 

 

 

crime.csv 파일 저장하기
setwd("f:/r_workspace/data")
write.csv(crime, file="crime.csv", fileEncoding="CP949")

잘 저장이 된 모습.

 

 

 

america_tour 파일 활용하기

crime 파일에서, Murder를 tour로 바꾸고, 도시명, tour, 인구수 열만 가져와서 america_tour 파일을 만들었다.

이를 활용해서 tour 지도를 만들어보자 !

tour <- read.csv("america_tour.csv", fileEncoding="CP949")
head(tour)

state_map2 <-map_data("state")

ggChoropleth(data = tour, # 지도에 표현할 데이터
             aes(fill=tour, # 색깔로 표현할 변수
                 map_id = state), # 지역 기준 변수
             map = states_map,    # 지도 데이터
             palette="RdPu",   # 지도 색
             interactive = T)

interactive = T를 추가하면 브라우저로 지도를 열 수 있다!

 

 

 

원하는 색 palette 고르는 법
library(RColorBrewer)
display.brewer.all()

display.brewer.all()를 실행하면 이렇게 palette가 나온다.

여기서 원하는 색을 찾아서 쓰면 된다!

 

 

 

 

한번에 여러 지도 보기
# 한번에 여러개 보기 가능
ggChoropleth(data = crime, # 지도에 표현할 데이터
             aes(fill=c(Murder, Rape, Assault), # 색깔로 표현할 변수
                 map_id = state), # 지역 기준 변수
             map = states_map,  # 지도 데이터
             interactive = T)

변수를 벡터로 넣어주면 한번에 여러 지도를 볼 수 있다!

 

 

 

비율 조절하기

원래 값으로 지도를 만드니, Assault만 너무 진하게 나오는걸 볼 수 있었다.

그래서 Assault 값을 10으로 나눠서 3 변수의 비율을 맞춰보았다.

crime$Assault <-crime$Assault/10

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

 

 

 

# 우리나라 지도 만들기
# 필요한 packages 및 library 설치
install.packages("stringi")
install.packages("devtools")
library(devtools)
devtools::install_github("cardiomoon/kormaps2014") # 깃허브로 라이브러리 설치

library(kormaps2014)
library(ggiraphExtra)
library(maps)
library(mapproj)
library(tibble)

# 파일 미리보기
kormaps2014::areacode # 지역코드, 지역이름
dim(kormaps2014::kormap1)
head(kormaps2014::kormap1,20)
str(changeCode(kormap1))

 

# 필드명 바꾸기
library(dplyr)
kor1 <- rename(korpop1, pop=총인구_명, name=행정구역별_읍면동)
kor1 <- kor1[, c("pop", "name", "code")]
kor1

우리나라 행정 구역별 인구수 데이터인 korpop1에서 행정 구역과 인구수, 지역 code만 빼서 kor1을 만들었다.

 

 

우리나라 인구지도 만들기
ggChoropleth(kor1,aes(fill=pop, map_id=code), map=kormap1)
dev.off()

또 invalid graphics state 오류가 나서 dev.off() 를 추가했다..

이쁘게 잘나온 모습 !!

 

 

 

tooltip 추가하기
# tooltip : 웹으로 열었을 때, 마우스 갖다대면 name이 뜸
ggChoropleth(kor1,
             aes(fill=pop, map_id=code,  tooltip=name), 
             map=kormap1,
             palette="RdPu",
            interactive = T)

tooltip을 추가하면, 추가 된 변수가 브라우저에서 마우스를 갖다댔을 때 나온다 !!

 

 

 

 

남자인구 지도 만들기
kor1 <- rename(korpop1, pop=총인구_명, name=행정구역별_읍면동, 
               man_pop=남자_명, woman_pop=여자_명, local_pop=내국인_계_명,
               foreign_pop=외국인_계_명)

kor1 <- kor1[ , c("pop", "name", "man_pop", "woman_pop", 
                  "local_pop", "foreign_pop", "code")]
                  
# 남자인구지도
ggChoropleth(kor1,aes(fill=man_pop, map_id=code, tooltip=name),
             map=kormap1,
             palette="Blues", interactive = T)

우선 지도를 만들기 좋게,  korpop1에서 필요한 데이터만 이름을 바꿔 추출한 후 지도를 만들었다.

 

 

 

 

여자인구 지도 만들기
# 여자인구비율
ggChoropleth(kor1,aes(fill=woman_pop, map_id=code), 
			map=kormap1,
            palette="PuRd")

 

 

 

외국인인구 지도 만들기
class(korpop1$외국인_계_명)

#factor -> numeric로 바로 못바꾼다. factor -> character -> numerucic
str(kor1)
kor1$foreign_pop<- as.character(kor1$foreign_pop)
kor1$foreign_pop<- as.numeric(kor1$foreign_pop)


ggChoropleth(kor1, 
             aes(fill=c(foreign_pop) , map_id=code, tooltip=name), 
             map=kormap1,
             palette="Reds",
             interactive = T)

 

외국인 인구의 경우 값이 factor 타입이였다. 그래서 정확한 수치가 지도에 나오지 않았다.

정확한 지도를 그리기 위해 factornumeric으로 바꿔야했다.

하지만 factor 타입은 numeric으로 바로 바꿔지지 않는다 !

그래서 factor -> character -> numeric 이순서로 타입을 바꿔주어 정확한 지도를 만들 수 있었다.

 

 

 

 

남자, 여자 인구 지도 동시에 그리기
ggChoropleth(data=kor1,
             aes(fill=c(woman_pop, man_pop), 
             map_id=code), 
             map=kormap1,
             palette="Blues", interactive = T)

두 그래프의 색을 다르게 할 수는 없을까?? 궁금하다

 

 

 

 

시, 군, 구 단위로
# 시 군 구 단위 지도
head(kormap2)
# 시 군 구 단위 인구수
head(korpop2)

# 변수 이름 바꾸기
korpop2 <- rename(korpop2, 인구 = 총인구_명,
                  name = 행정구역별_읍면동)

ggChoropleth(korpop2,aes(fill=인구, map_id=code, tooltip=name), 
             map=kormap2,
             palette="Blues", interactive = T)

지도가 시, 군, 구 단위로 잘게 쪼개져서 잘나온다 !

 

 

 

지역축제 지도만들기
# "","서울","부산","대구","인천","광주","대전","울산","세종","경기","강원","충북","충남","전북","전남","경북","경남","제주","합계"
festival<- c("24","51","38","17","7","18","21","4","112","104","29","107","75","98","77","121","41")

d1 <- data.frame(areacode$code, festival)
str(d1)
d1$festival = as.numeric(d1$festival)

?ggChoropleth()

ggChoropleth(d1, 
             aes(fill=festival , map_id=areacode.code, tooltip=name), 
             map=kormap1,
             palette="Greens",
             interactive = T)

대부분의 수강생이 엑셀이 없기 때문에 파일을 읽는데 문제가 좀 있었다.

그래서 직접 데이터를 만들어 지도를 만들었다.

지도를 만들기 전에 항상 값이 numeric인지 확인하고, 아니라면 바꿔주는 작업은 필수다 !

 

 

직접 데이터를 만들지 않고, 파일 그대로 지역축제 지도 만들기

따로 직접 해보았다.

https://peach-hzz.tistory.com/14

 

 

 

서울시 인구만 그리기
korpop2<-kormaps2014::korpop2
korpop2 <- rename(korpop2,
                  인구 = 총인구_명,
                  name = 행정구역별_읍면동)
head(korpop2)
str(korpop2)

# 서울의 코드 값으로 서울지역 지도만 추출
seoul <-kormap2 %>% filter( substr(region, 1,2) =="11")
seoul

# 서울의 코드 값으로 서울지역 인구수만 추출
seoulPop <- korpop2 %>% filter ( substr(code,1,2)=="11")
seoulPop

ggChoropleth(seoulPop,aes(fill=인구, map_id=code, tooltip=name), map=seoul,
             digits = 0.1,
             interactive = T)

 

 

울산시 인구만 그리기
# 울산 지도 추출
ulsan <-kormap2 %>% filter( substr(region, 1,2) =="26")
ulsan

# 울산 인구 추출
ulsanPop <- korpop2 %>% filter ( substr(code,1,2)=="26")
ulsanPop

ggChoropleth(ulsanPop,aes(fill=인구, map_id=code, tooltip=name), 
             map=ulsan,
             digits = 0.1,
             interactive = T)

 

 

코로나 파일 활용하기

https://www.data.go.kr/index.do

공공 데이터 포탈에서 다양한 데이터를 받을 수 있다 ! 

이번엔 공공 데이터 포탈에서 자치구별 코로나 확진자 발생 동향 데이터를 받아 지도를 만들었다.

 

# 코로나 파일 활용하기
corona <- read.csv("코로나.csv", fileEncoding="CP949")
head(corona)

우리는 8월 19일 데이터만 가지고 지도를 그리기로 했다.

1. 첫번째 행만 가져온다

2. 행과 열을 바꾼다

 

 

# 1행만 가져오기
corona2 <- data.frame(corona[1,])
corona2

# 행과 열 바꾸기
corona3 <- t(corona2)
corona3
class(corona3) 

# 데이터프레임으로 타입 바꿔주기
c1 <- as.data.frame(corona3)

# 행의 이름에 열 추가하기
c1 <- rownames_to_column(c1, var="address")
c1

쓰기 좋게 만들어진 모습 !

여기서 지역 code와 매치하기 위해, "종로구.전체"를 "종로구" 처럼 모두 바꿔줘야한다! 

 

 

c1 <- data.frame(address=gsub(".전체","",c1$address),
                 확진자=c1$`1`)
# 전체값만 뽑기
c1 <- c1[seq(2,53,2),]
c1

짝수 행에 있는 값만 골라서, 추가 값을 제외한 확진자 수를 뽑아냈다

 

 

# 서울지역 코드빼기
temp <- kormap2 %>% select(name, region)
head(temp)

temp <- temp %>% filter(substr(region, 1,2)=="11")
dim(temp)
head(temp, 20)

# region이랑 파일 합치기
temp <-unique(temp) # 중복값 제거하고 name에 할당된 region확인하기
temp

colnames(temp) <-c("address","region")
c2 <- inner_join(c1, temp, by="address")
unique(c2)
class(c2$확진자)

# 확진자의 타입을 바꿔야함
c2$확진자 <-as.numeric(c2$확진자)

ggChoropleth(c2,aes(fill=확진자, map_id=region,
             tooltip=name), map=seoul,
             digits = 0.1,
             interactive = T,
             palette="Blues")

데이터를 numeric으로 전환하는건 필수다 !

 

 

 

2012년도 결핵환자 지도그리기
tbc 
tbc2 <- tbc %>% filter(year==2012)

ggChoropleth(tbc2,aes(fill=NewPts, map_id=code,
                    tooltip=name),map=kormap1,interactive = T,
                    palette="BuGn")

자료가 패키지 안에 있어서 그런지 비교적 쉽게 자료를 뽑아 만들 수 있었다 !

 

 

 

# 서울 지역 주유소 개수 지도 만들기

이 파일도 공공포탈에서 받아왔다 !

oil <- read.csv("서울특별시_주유소 현황_20220101.csv", fileEncoding="CP949")
head(oil)

여기서 2열만 뽑아서 자치구 별 주유소 지도를 만들겠다!

 

oill <- data.frame(oil[,2])

colnames(oill)
oill <- rename(oill, adrress=oil...2.)
head(oill)

#데이터 프레임으로 바꾸기
oil2 <-as.data.frame(table(oill))

열 이름이 이상해서, adrress로 바꿔주었다. 2열만 잘 추출이 된 모습.

 

# 파일이랑 지역코드 맞추기
temp <- temp %>% filter( substr(region, 1,2) =="11") 
temp <- unique(temp)
colnames(temp)<-c("address", "region")
oil3 <- inner_join(oil2, temp, by="address")
oil3

# 서울지역 지도 가져오기
seoul <-kormap2 %>% filter( substr(region, 1,2) =="11")

# 지도그리기
ggChoropleth(oil3,aes(fill=Freq, map_id=region), map=seoul,
             palette="Blues",
             interactive = T)

 

 

 

 

 

~ 오늘의 공부 후기 ~
알록달록 지도를 잔뜩 만들어서 눈이 즐거웠다.
다양한 파일을 어떻게 활용해야하는지, 활용 능력을 기를 수 있었다 !

※ 사용한 교재 : 쉽게 배우는 R 데이터 분석 / 저자 : 김영우