본문 바로가기

배운 책들 정리/공공데이터로 배우는 R 데이터 분석 with 샤이니

공공데이터 with 샤이니 6,7 - 지오 데이터 프레임, 분석 주제를 지도로 시각화하기

1. 지오 데이터 프레임 CP 6

1) 전처리한 주소 데이터 + 지오 코딩 데이터 (경도, 위도 = 좌표) 합치기 // 결측치 제거까지

# 지오 데이터프레임
# 전처리 완료한 데이터 불러오기
apt_price <- read.csv("./data/preprocess.csv")
head(apt_price)
# 지오 코딩 데이터 불러오기
juso_geocoding <- read.csv("./data/05_juso_geocoding.csv")
head(juso_geocoding)
# 전처리 완료 데이터 (주소) & 지오 코딩 데이터(경도, 위도 = 좌표) 합치기
library(tidyverse)
apt_price <- left_join(apt_price, juso_geocoding, by = c("juso" = "apt_juso"))
# 결측치 확인
table(is.na(apt_price))
# 결측치 제거
apt_price<- na.omit(apt_price)

left_join(apt_price, juso_geocoding, by = c("juso" = "apt_juso"))

2) 지오데이터프레임 생성해서 시각화 후 저장까지

# 지오데이터프레임 만들기
# 라이브러리 준비
# install.packages("sp")
library(sp)
# install.packages("sf")
library(sf)


# 좌표값 설정
coordinates(apt_price) <- ~coord_x+coord_y
# 좌표계 정의
proj4string(apt_price) <- "+proj=longlat +datum=WGS84 +no_defs"
# sp형을 sf형으로 변환
apt_price <- st_as_sf(apt_price)


head(apt_price)

# 시각화
plot(apt_price$geometry, axes =T , pch = 1)
# install.packages("leaflet")
library(leaflet)
leaflet() %>% 
  addTiles() %>% 
  addCircleMarkers(data = apt_price[1:10,], label = ~apt_nm)
# 지오 데이터프레임 저장
write.csv(apt_price, file = "./data/apt_price1.csv", row.names = F)

plot(apt_price$geometry, axes =T , pch = 1)
leaflet() %>% addTiles() %>% addCircleMarkers(data = apt_price[1:10,], label = ~apt_nm)

 

 

2. 분석 주제를 지도로 시각화하기 CP 7

분석 주제 1 : 상반기와 하반기를 비교해서 상반기보다 하반기에 많이 올라간 아파트는 무엇인지 2021

1) 데이터 합치기, 시각화

# 분석 주제를 지도 시각화하기
# 1. 어느 지역이 제일 비쌀까?
# 어느 지역이 비싼지 표현하기 위해 커널 밀도 함수를 사용할 예정
# 지수 표현 비활성화
options(scipen = 99)
head(apt_price)
# 데이터 불러오기
load("./data/apt_price.rdata")
head(apt_price)
# 서울시 1km 그리드 데이터 불러오기
grid <- st_read("./data/sigun_grid/seoul.shp")
head(grid)

# 데이터 합치기
apt_price <- st_join(apt_price, grid, join = st_intersects)
head(apt_price)
# 그리드 ID별 평균 가격 만들기
apt_high <- aggregate(apt_price$py, by= list(apt_price$ID), mean )
colnames(apt_high) <- c("ID","avg_price")
head(apt_high) 
# 그리드 데이터와 평균 가격 합치기
apt_high <- merge(grid, apt_high, by = "ID")
head(apt_high)
# 시각화
library(ggplot2)
library(tidyverse)

apt_high %>% ggplot(aes(fill=avg_price))+
 geom_sf() + scale_fill_gradient(low="white", high="red")

 

2) 지도 경계 그리기, 지도 경계선 시각화

# 지도 경계 그리기
library(sp)
# sf형을 sp형으로 변환
apt_high_sp <- as(st_geometry(apt_high), "Spatial")
head(apt_high_sp)
# 경도
x <- coordinates(apt_high_sp)[,1]
# 위도
y <- coordinates(apt_high_sp)[,2]
# 외곽 끝 지점
bbox(apt_high_sp)
# 
l1 <- bbox(apt_high_sp)[1,1] # 서쪽 끝
l2 <- bbox(apt_high_sp)[1,2] # 동쪽 끝
l3 <- bbox(apt_high_sp)[2,1] # 남쪽 끝
l4 <- bbox(apt_high_sp)[2,2] # 북쪽 끝
# spatial statistics 공간 통계 분석 패키지
# install.packages("spatstat")
library(spatstat)
# 지도 경계선 만들기
win <- owin(xrange = c(l1,l2),
            yrange = c(l3,l4))
# 지도 경계선 시각화
plot(win)

plot(win)

3) 밀도 그래프 시각화

# 
# 밀도 그래프 시각화
# 경도와 위도를 포인트로 전환
# point pattern datasets
p <- ppp(x,y, window = win)
# 포인트를 커널밀도로 변환
d <- density.ppp(p,
            weights = apt_high$avg_price,
            sigma = bw.diggle(p),
            kernal = "gaussian")
plot(d)

 

 

4) 레스터 이미지

# 레스터 이미지
library(raster)
raster_high <- raster(d)
plot(raster_high)
# 커널밀도하무에서 의미 있는 데이터는 상위 20~30% 범위 안에 있음 = 노이즈 제거하는 법 
d[d<quantile(d)[4]] <- NA
raster_high <- raster(d)
plot(raster_high)
# +(quantile(d)[4]*0.1)] <- NA

5) 서울시 외각선 그리기

# 서울시 경계선 데이터 불러오기
bnd <- st_read("./data/sigun_bnd/seoul.shp")
# 서울시 경계선으로 레스터 이미지 자르기
raster_high <- crop(raster_high,extent(bnd))
plot(raster_high)
# 좌표계 정의
crs(raster_high) <- sp::CRS("+proj=longlat +datum=WGS84 +no_defs")
# 레스터 이미지를 지도로 그리기
plot(raster_high)https://blog.kakaocdn.net/dn/c7GfHO/btr2DDQg4k8/hLkwJ3PfA4KASjj9gE8J71/img.png
# 서울시 외곽선을 빨간선으로 그리기
plot(bnd,
     col = NA,
     border = "red",
     add = T)

6) 지도에 레스터 이미지 시각화하기 : 저장까지

# 지도에 레스터 이미지 시각화하기
# r geospatial data abstraction library = 지리 공간 정보를 가지고 있는 레스터 데이터 처리하는 패키지
install.packages("rgdal")
library(leaflet)
leaflet() %>% 
  addProviderTiles(providers$CartoDB.Positron) %>% 
  #서울시 외곽선(경계선)
  addPolygons(data = bnd,
              fill = NA,
              weight = 2,
              color = "red") %>% 
# 레스터 이미지
addRasterImage(raster_high,
               colors = colorNumeric(palette = c("blue","green","yellow","red"), domain=values(raster_high),
                                     na.color = "transparent"), opacity = 0.4)
# 저장하기
save(raster_high, file = "./data/raster_high.rdata")

 

* join은 merge에서 by에 공통된 변수 입력

 

7) 뜨고 있는 지역 확인하기

# 2. 요즘 뜨는 지역은 어디일까?
load("./data/apt_price.rdata")
head(apt_price)
grid <- st_read("./data/sigun_grid/seoul.shp")
head(grid)
# 그리드 데이터 합치기
apt_price <- st_join(apt_price, grid, join = st_intersects)
head(apt_price)
# 전과 후 데이터 만들기
# 기준 날짜 : 2021년 7월 1일
# 기준 날짜 이전 데이터
apt_before <- subset(apt_price, ymd < "2021-07-01")
# 기준 날짜 이후 데이터
apt_after <- subset(apt_price, ymd >= "2021-07-01")

# 전과 후 가격의 변화율 계산
# 조인 (before,after)
apt_diff <- merge(apt_before, apt_after, by = "ID" )
head(apt_diff)
# (후 가격 - 전 가격)/ 전 가격 * 100
apt_diff$diff <- round((apt_diff$after - apt_diff$before)/apt_diff$before * 100)
head(apt_diff$diff)

 

기준 날짜 이전, 이후 데이터 확인 (colname 변경까지)

전과 후 가격 변화율 계산 1

# 가격이 오른 지역
library(sf)
apt_diff <- apt_diff[apt_diff$diff>0,]
# 그리드 데이터와 상승 지역 데이터 합치기
apt_hot <- merge(grid,apt_diff,by = "ID")
head(apt_hot)

# 시각화
library(ggplot2)
apt_hot %>% 
  ggplot(aes(fill=diff))+
  geom_sf() + scale_fill_gradient(low="white", high="red")

그리드 데이터 + 상승 지역 데이터 합치기

시각화

# 지도 경계선 그리기 (이전 코드 변수명만 바꿔서 복사)
library(sp)
# sf형을 sp형으로 변환
apt_hot_sp <- as(st_geometry(apt_hot),"Spatial")
# 지도 경계 그리기
library(sp)
# 경도
x <- coordinates(apt_hot_sp)[,1]
# 위도
y <- coordinates(apt_hot_sp)[,2]
# 외곽 끝 지점
bbox(apt_hot_sp)
# 
l1 <- bbox(apt_hot_sp)[1,1] # 서쪽 끝
l2 <- bbox(apt_hot_sp)[1,2] # 동쪽 끝
l3 <- bbox(apt_hot_sp)[2,1] # 남쪽 끝
l4 <- bbox(apt_hot_sp)[2,2] # 북쪽 끝
# spatial statistics 공간 통계 분석 패키지
# install.packages("spatstat")
library(spatstat)
# 지도 경계선 만들기
win <- owin(xrange = c(l1,l2),
            yrange = c(l3,l4))
# 지도 경계선 시각화
plot(win)

#
# 이후 코드 복사
#


# 밀도 그래프 시각화
# 경도와 위도를 포인트로 전환
# point pattern datasets
p <- ppp(x,y, window = win)
# 포인트를 커널밀도로 변환
d <- density.ppp(p,
                 weights = apt_hot$avg_price,
                 sigma = bw.diggle(p),
                 kernal = "gaussian")
plot(d)



# 레스터 이미지
library(raster)
raster_hot <- raster(d)
plot(raster_hot)
# 커널밀도하무에서 의미 있는 데이터는 상위 20~30% 범위 안에 있음 = 노이즈 제거하는 법 
d[d<quantile(d)[4]] <- NA
raster_hot <- raster(d)
plot(raster_hot)
# +(quantile(d)[4]*0.1)] <- NA




# 서울시 경계선 데이터 불러오기
bnd <- st_read("./data/sigun_bnd/seoul.shp")
# 서울시 경계선으로 레스터 이미지 자르기
raster_hot <- crop(raster_hot,extent(bnd))
plot(raster_hot)
# 좌표계 정의
crs(raster_hot) <- sp::CRS("+proj=longlat +datum=WGS84 +no_defs")
# 레스터 이미지를 지도로 그리기
plot(raster_hot)
# 서울시 외곽선을 빨간선으로 그리기
plot(bnd,
     col = NA,
     border = "red",
     add = T)


# 지도에 레스터 이미지 시각화하기
# r geospatial data abstraction library = 지리 공간 정보를 가지고 있는 레스터 데이터 처리하는 패키지
# install.packages("rgdal")
library(leaflet)
leaflet() %>% 
  addProviderTiles(providers$CartoDB.Positron) %>% 
  #서울시 외곽선(경계선)
  addPolygons(data = bnd,
              fill = NA,
              weight = 2,
              color = "red") %>% 
  # 레스터 이미지
  addRasterImage(raster_hot,
                 colors = colorNumeric(palette = c("blue","green","yellow","red"), domain=values(raster_hot),
                                       na.color = "transparent"), opacity = 0.4)

# 저장하기
save(raster_hot, file = "./data/raster_hot.rdata")

변수 high -> hot으로 변경 후 복사

 

 

* 핵심

- ppp 문법 이해하기

- bbox 사용법 이해

- 좌표계 정의 이해

- 조인 방법 (merge) 이해하기 // 그리드 데이터 합치기

- addPolygons (외곽선 그리기)

- addRasterImage (레스터 이미지)

728x90
반응형
LIST