# 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 타입이였다. 그래서 정확한 수치가 지도에 나오지 않았다.
정확한 지도를 그리기 위해 factor를 numeric으로 바꿔야했다.
하지만 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 데이터 분석 / 저자 : 김영우
'R > 강의복습' 카테고리의 다른 글
[22.08.22] 10일차 (데이터 크롤링 / 뉴스 크롤링 ) (0) | 2022.09.03 |
---|---|
[22.08.22] 10일차 (인터랙티브 그래프 / 시계열 그래프 / 산포도 / 빈도수그래프) (0) | 2022.09.03 |
[22.08.18] 8일차 (날짜 / 시간 관련 데이터) (0) | 2022.08.21 |
[22.08.18] 8일차(wordclou2/정규식/문자열/gsub/grep/substring) (0) | 2022.08.21 |
[22.08.17] 7일차 텍스트마이닝 / 워드클라우드만들기 (0) | 2022.08.21 |