library(ggmap)
## Warning: package 'ggmap' was built under R version 3.6.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.6.3
## Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
## Please cite ggmap if you use it! See citation("ggmap") for details.
library(ggplot2)
library(raster)
## Warning: package 'raster' was built under R version 3.6.3
## Loading required package: sp
library(rgeos)
## Warning: package 'rgeos' was built under R version 3.6.3
## rgeos version: 0.5-2, (SVN revision 621)
## GEOS runtime version: 3.6.1-CAPI-1.10.1
## Linking to sp version: 1.4-1
## Polygon checking: TRUE
library(maptools)
## Warning: package 'maptools' was built under R version 3.6.3
## Checking rgeos availability: TRUE
library(dplyr)
## Warning: package 'dplyr' was built under R version 3.6.1
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:rgeos':
##
## intersect, setdiff, union
## The following objects are masked from 'package:raster':
##
## intersect, select, union
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggthemes)
## Warning: package 'ggthemes' was built under R version 3.6.2
library(stringr)
getwd()
## [1] "C:/Users/taetaetae/Documents/R/NEW_Kaggle/8th_movpop/movpop"
raw <- read.csv("data13_.csv")
str(raw)
## 'data.frame': 85890 obs. of 9 variables:
## $ 조사지점명: Factor w/ 1203 levels "(이불가게)피가로",..: 705 705 705 705 705 705 705 705 705 705 ...
## $ 구코드 : int 11010 11010 11010 11010 11010 11010 11010 11010 11010 11010 ...
## $ 동코드 : int 1101055 1101055 1101055 1101055 1101055 1101055 1101055 1101055 1101055 1101055 ...
## $ X좌표 : num 196424 196424 196424 196424 196424 ...
## $ Y좌표 : num 455512 455512 455512 455512 455512 ...
## $ 조사요일 : Factor w/ 6 levels "금","목","수",..: 5 4 4 1 6 1 3 4 4 6 ...
## $ 시간대 : Factor w/ 14 levels "07시-08시","08시-09시",..: 1 7 10 1 2 5 3 5 8 14 ...
## $ 유동인구수: int 51 27 30 21 63 36 36 30 18 114 ...
## $ 년도 : int 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
names(raw)
## [1] "조사지점명" "구코드" "동코드" "X좌표" "Y좌표"
## [6] "조사요일" "시간대" "유동인구수" "년도"
head(raw)
## 조사지점명 구코드 동코드 X좌표 Y좌표 조사요일
## 1 신흥모피명품전문크리닝. 11010 1101055 196424 455511.5 토
## 2 신흥모피명품전문크리닝. 11010 1101055 196424 455511.5 월
## 3 신흥모피명품전문크리닝. 11010 1101055 196424 455511.5 월
## 4 신흥모피명품전문크리닝. 11010 1101055 196424 455511.5 금
## 5 신흥모피명품전문크리닝. 11010 1101055 196424 455511.5 화
## 6 신흥모피명품전문크리닝. 11010 1101055 196424 455511.5 금
## 시간대 유동인구수 년도
## 1 07시-08시 51 2015
## 2 13시-14시 27 2015
## 3 16시-17시 30 2015
## 4 07시-08시 21 2015
## 5 08시-09시 63 2015
## 6 11시-12시 36 2015
#최종목표!! 서울지도에서 시간대별로 유동인구수가 변하는 영상을 만들고 싶다. 인구수 그라데이션으로 표현하기!
#누가벌써 했네? https://story.pxd.co.kr/1408
#근데 변수명들이 마음에 안든다.
names(raw) <- c("spot",
"gu",
"dong",
"x_point",
"y_point",
"day",
"time",
"movpop",
"year")
#하나씩 하자! 잠깐, dplyr로 수요일 오전 11시에 가장 유동인구수가 많은 구를 알아보자
raw %>%
filter(time == "11시-12시") %>%
group_by(gu) %>%
summarise(movpopsum = sum(movpop)) %>%
arrange(desc(movpopsum)) -> wed_11
#그림도 그려보자.
options(scipen = 100) #이거안하면 그래프에서 지수표기법으로 나옴 안예쁨
wed_11 %>%
ggplot(aes(x = gu, y = movpopsum)) +
geom_histogram(stat = "identity", fill = "lightblue") +
labs(title = "wed_11am", x = "gu", y = "movpopsum") +
theme_economist() +
coord_flip()
## Warning: Ignoring unknown parameters: binwidth, bins, pad
## Warning: Removed 1 rows containing missing values (position_stack).

#아, 이거 시간데이터도 있으니까 line 써서도 그려보자, time이 factor네, 하긴 어차피 시간대니까 그냥
# 그럼 구별로, 시간대에 따라 유동인구가 변화하는걸 line으로 그려보자
#(str_extract_all(raw$time, "\\d{2}")) 숫자만 뽑기
raw$start <- as.numeric(substr(raw$time, 1, 2)) #숫자만 뽑기 2
#raw$end <- as.character.POSIXt(substr(raw$time, 5, 6))
#어차피 1시간씩인데, 그냥 할걸 그랬나
raw %>% group_by(gu, start) %>% summarise(summov = sum(movpop)) -> raw_gu_time
raw_gu_time$gu <- as.factor(raw_gu_time$gu)
raw_gu_time %>% ggplot(aes(x = start, y = summov, group = gu, color = gu)) +
geom_line()

admin <- readxl::read_xls("adm_code.xls")
#다른 파일을 불러왔다. 여긴 종로구가 11010이다. 행정동. 근데 생각해보니까. 그냥 이름으로 merge해도 되잖아?
admin_gu <- admin[,-c(1:2)] #필요없는 부분은 빼고
raw$gu <- as.character(raw$gu)
raw$dong <- as.character(raw$dong)
raw_gu <- inner_join(raw, admin_gu, by = c("dong" = "읍면동코드"))
#구, 동이름 합쳤다
#지금 필요한 것 만 뽑자
dplyr::select(raw_gu, spot, gu, dong, day, movpop, start, 시군구명칭, 읍면동명칭) -> seoul_mov
names(seoul_mov) <- c("spot",
"gu",
"dong",
"day",
"movpop",
"start",
"guname",
"dongname")
#seoul_mov는 이제 동이름이 있습니다. 이제 할 일은 동이름을 기준으로 기존의 법정동 코드 파일이랑 합쳐서,
#유동인구 + 동이름 + 법정동 코드가 있어야겠죠. 뒤에 나올 shape파일들은 죄다 법정동 기준이라서 그 때 합치려면!
head(seoul_mov) #신흥모피는 종로구 부암동에 있구나!?
## spot gu dong day movpop start guname dongname
## 1 신흥모피명품전문크리닝. 11010 1101055 토 51 7 종로구 부암동
## 2 신흥모피명품전문크리닝. 11010 1101055 월 27 13 종로구 부암동
## 3 신흥모피명품전문크리닝. 11010 1101055 월 30 16 종로구 부암동
## 4 신흥모피명품전문크리닝. 11010 1101055 금 21 7 종로구 부암동
## 5 신흥모피명품전문크리닝. 11010 1101055 화 63 8 종로구 부암동
## 6 신흥모피명품전문크리닝. 11010 1101055 금 36 11 종로구 부암동
seoul_2 <- readxl::read_xlsx("seoul_20190701.xlsx")
head(seoul_2)
## # A tibble: 6 x 6
## 행정동코드 시도명 시군구명 읍면동명 생성일자 말소일자
## <chr> <chr> <chr> <chr> <chr> <lgl>
## 1 1100000000 서울특별시 <NA> <NA> 19880423 NA
## 2 1111000000 서울특별시 종로구 <NA> 19880423 NA
## 3 1111051500 서울특별시 종로구 청운효자동 20081101 NA
## 4 1111053000 서울특별시 종로구 사직동 19880423 NA
## 5 1111054000 서울특별시 종로구 삼청동 19880423 NA
## 6 1111055000 서울특별시 종로구 부암동 19880423 NA
#자, 여기는 법정동이네
seoul_mov_2 <- inner_join(seoul_mov, seoul_2, by =c("dongname" = "읍면동명"))
seoul_mov_3 <- seoul_mov_2 %>% select(spot, day, movpop, start, guname, dongname, 행정동코드)
head(seoul_mov_3)
## spot day movpop start guname dongname 행정동코드
## 1 신흥모피명품전문크리닝. 토 51 7 종로구 부암동 1111055000
## 2 신흥모피명품전문크리닝. 월 27 13 종로구 부암동 1111055000
## 3 신흥모피명품전문크리닝. 월 30 16 종로구 부암동 1111055000
## 4 신흥모피명품전문크리닝. 금 21 7 종로구 부암동 1111055000
## 5 신흥모피명품전문크리닝. 화 63 8 종로구 부암동 1111055000
## 6 신흥모피명품전문크리닝. 금 36 11 종로구 부암동 1111055000
#shape파일을 가져오는 방법이 여러가지가 있는데,
#먼저 shapefile
korea_emd_ras <- shapefile("TL_SCCO_EMD.shp")
fort_korea_emd_ras <- fortify(korea_emd_ras, region = "EMD_CD")
#region을 정해주면, 아래와 같은 에러가 날 수 있음, 그렇다면 https://coding-law.tistory.com/30 를 참고하자.
#Error in maptools::unionSpatialPolygons(cp, attr[, region]) : isTRUE(gpclibPermitStatus()) is not TRU
head(fort_korea_emd_ras) #long, lat인 좌표값은 보인다.
## long lat order hole piece id group
## 1 953700.0 1954605 1 FALSE 1 11110101 11110101.1
## 2 953693.9 1954591 2 FALSE 1 11110101 11110101.1
## 3 953690.8 1954583 3 FALSE 1 11110101 11110101.1
## 4 953689.6 1954577 4 FALSE 1 11110101 11110101.1
## 5 953687.9 1954569 5 FALSE 1 11110101 11110101.1
## 6 953682.3 1954556 6 FALSE 1 11110101 11110101.1
fort_korea_emd_ras %>% filter(id == "11110101") %>%
ggplot(aes(x=long, y=lat, group=group)) + geom_polygon(fill='white', color='black') + coord_fixed()

#다행히도, dplyr랑 ggplot, geom_polygon을 쓰면 그림이 그려진다.
#자, 이제 동코드와 유동인구를 가진 seoul_mov_3와 fortify된 읍면동 지도를 merge해보자.
seoul_mov_3$id <- str_sub(seoul_mov_3$행정동코드, 1,8)
head(seoul_mov_3) #11110550 00
## spot day movpop start guname dongname 행정동코드
## 1 신흥모피명품전문크리닝. 토 51 7 종로구 부암동 1111055000
## 2 신흥모피명품전문크리닝. 월 27 13 종로구 부암동 1111055000
## 3 신흥모피명품전문크리닝. 월 30 16 종로구 부암동 1111055000
## 4 신흥모피명품전문크리닝. 금 21 7 종로구 부암동 1111055000
## 5 신흥모피명품전문크리닝. 화 63 8 종로구 부암동 1111055000
## 6 신흥모피명품전문크리닝. 금 36 11 종로구 부암동 1111055000
## id
## 1 11110550
## 2 11110550
## 3 11110550
## 4 11110550
## 5 11110550
## 6 11110550
seoul_mov_3 %>% filter(id == "11110101") %>% head
## [1] spot day movpop start guname dongname
## [7] 행정동코드 id
## <0 rows> (or 0-length row.names)
head(fort_korea_emd_ras) #11110101 8자리
## long lat order hole piece id group
## 1 953700.0 1954605 1 FALSE 1 11110101 11110101.1
## 2 953693.9 1954591 2 FALSE 1 11110101 11110101.1
## 3 953690.8 1954583 3 FALSE 1 11110101 11110101.1
## 4 953689.6 1954577 4 FALSE 1 11110101 11110101.1
## 5 953687.9 1954569 5 FALSE 1 11110101 11110101.1
## 6 953682.3 1954556 6 FALSE 1 11110101 11110101.1
# View(fort_korea_emd_ras)
# View(seoul_mov_3)
seoul_mov_map <- merge(seoul_mov_3, fort_korea_emd_ras, by = "id")
head(seoul_mov_map)
## [1] id spot day movpop start guname
## [7] dongname 행정동코드 long lat order hole
## [13] piece group
## <0 rows> (or 0-length row.names)
#엇, 잠깐, 왜 겹치는게 없니?
#merge 하기전에 다시 봐야겠다.