./
直下にgisdata
フォルダを作成し、setwd("gisdata")
とディレクトリを指定していますinstall.packages()
でパッケージをインストールし、library()
でパッケージを呼び出すinstall.packages("spdep")
install.packages("sf")
install.packages("spatstat")
install.packages("tidyverse")
install.packages("kokudosuuchi")
library(spdep)
library(sf)
library(spatstat)
library(tidyverse)
library(kokudosuuchi)
以下の方法でパイプ %>% の優先順位を高める
needs::prioritize(magrittr)
神奈川県の市区町村境界データを国土数値情報から入手する
kokudosuuchi::getKSJURL("N03", prefCode = 14) %>%
filter(year==2015) %>% select(zipFileUrl) %>%
pull(1) -> url
tf <- tempfile(fileext = ".zip")
curl::curl_download(url, tf)
unzip(tf, exdir = getwd(), junkpaths = TRUE)
unlink(tf)
rm(tf)
神奈川県の行政境界データを読み込み、更に横浜市を抽出する。その際、同じ行政コードのポリゴンを統合する。
ad <- sf::st_read('N03-15_14_150101.shp')%>%
dplyr::group_by(N03_007) %>%
dplyr::summarise(geometry = st_union(geometry)) %>%
dplyr::ungroup()
ad %>%
filter(N03_007 %in% c(14101:14118)) -> y_ad
横浜市の行政境界を描画する。
y_ad %>%
st_geometry() %>%
plot(border="white", col="grey")
y_ad_cen <- sf::st_centroid(y_ad)
y_ad_coord <- sf::st_coordinates(y_ad_cen)
y_ad.tri.nb <- spdep::tri2nb(y_ad_coord)
y_ad %>%
st_geometry() %>%
plot(border="white", col="grey")
plot(y_ad.tri.nb, y_ad_coord, add=TRUE)
st_centroid assumes attributes are constant over geometries of xst_centroid does not give correct centroids for longitude/latitude data
k=4の場合
y_ad.knn4.nb <- spdep::knn2nb(knearneigh(y_ad_coord, k=4))
y_ad %>%
st_geometry() %>%
plot(border="white", col="grey")
plot(y_ad.knn4.nb, y_ad_coord, add=TRUE)
k=3の場合
y_ad.knn3.nb <- spdep::knn2nb(knearneigh(y_ad_coord, k=3))
y_ad %>%
st_geometry() %>%
plot(border="white", col="grey")
plot(y_ad.knn3.nb, y_ad_coord, add=TRUE)
k=3とk=4の違い
diffs <- diffnb(y_ad.knn3.nb, y_ad.knn4.nb)
y_ad %>%
st_geometry() %>%
plot(border="white", col="grey")
plot(y_ad.knn3.nb, y_ad_coord, add=TRUE)
plot(diffs, y_ad_coord, col="red", lty=2, lwd=2, add=TRUE)
y_ad.r.nb <- spdep::dnearneigh(y_ad_coord, 0, 0.06)
y_ad %>%
st_geometry() %>%
plot(border="white", col="grey")
plot(y_ad.r.nb, y_ad_coord, add=TRUE)
y_ad.poly.nb <- spdep::poly2nb(as(y_ad, "Spatial"))
y_ad %>%
st_geometry() %>%
plot(border="white", col="grey")
plot(y_ad.poly.nb, y_ad_coord, add=TRUE)
次に、空間的自己相関を示す指標(Moran’s I)を計算します。
ここでは、関東圏の市区町村別住宅地平均地価に関する空間的自己相関を算出する例を示します。
関東圏の市区町村境界データに、市区町村別住宅地平均地価データを結合します。
kanto <- sf::st_read('kanto_area.shp')
lph <- readr::read_csv("lph.csv")
kanto_lph <- dplyr::inner_join(kanto, lph, by=c("JCODE"="JCODE"))
ggplot2::ggplot(data = kanto, aes(fill=LPH)) +
geom_sf() +
scale_fill_distiller(palette="Blues", trans = "reverse") +
theme_bw() +
labs(title = "Land Price of House in Kanto Region")
ここでは、ドロネー三角網を使って空間隣接行列を定義する
kanto.tri.nb <- sf::st_coordinates(st_centroid(kanto)) %>%
spdep::tri2nb()
moran.test()
関数を使ってMoran’s Iを計算します。
空間重み付け行列のスタイルをstyle=
で指定する。ここでは、style="W"
とした場合の例を示します。
moran.test(kanto$LPH,nb2listw(kanto.tri.nb, style="W"))
事例2として、都道府県別死亡者数データの例を示します
都道府県境界データ(ポリゴン)、都道府県庁所在地データ(ポイント)及び都道府県別属性データを読み込みます。
pref.pnt <- sf::st_read('pref_gov.shp')
jpn.pref <- sf::st_read('jpn_pref.shp')
jpn.pref <- readr::read_csv("pref_gov.txt")
ここでは、ドロネー三角網を使って空間隣接行列を定義する
pref.tri.nb <- sf::st_coordinates(st_centroid(pref.pnt)) %>%
spdep::tri2nb()
moran.test()
関数を使ってMoran’s Iを計算します。
ここでは、diabetes
に関するMoran’s Iを算出します。
moran.test(pref.pnt$diabetes, nb2listw (pref.tri.nb,style="W"))
Local Moran’s Iを計算し、局地的な空間的自己相関を可視化しよう。
LMI1 <- localmoran(pref.pnt$diabetes, nb2listw(pref.tri.nb, style="W"))
pref.lm <- data.frame(cbind(LMI1[,1],
(pref.pnt$diabetes-mean(pref.pnt$diabetes))/sd(pref.pnt$diabetes)),
row.names=pref.pnt$KENCODE)
colnames(pref.lm) <- c("Ii","standardized diabetes")
pref.lm
# 図をプロットする
plot(pref.lm,xlab="Local Moran's I", ylab="死亡率(標準化済み)", pch=20,
cex=1, cex.axis=1, cex.lab=1)
lines(x=c(-1,2), y=c(0,0), col="grey", lwd=1)
lines(x=c(0,0), y=c(-3,4), col="grey", lwd=1)
# text(pref.lm,rownames(pref.lm), adj=1.2, cex=0.8)
text(1.55, 3.3, "徳島県", cex=0.7)
text(1.16, 1.63, "香川県", cex=0.7)
text(-0.32, 2.15, "大分県", cex=0.7)
text(-0.8, -1.45, "愛知県", cex=0.7)
text(-0.72, 1.8, "富山県", cex=0.7)
text(0.82, -0.57, "東京都", cex=0.7)
text(0.75, -1.91, "神奈川県", cex=0.7)