ここでは、QGIS, Rを用いて空間統計学の基礎的な演習を説明しています。
[GRASSのインストール、標高データを用いた地滑り危険度マップの作成]
[植生指数 (NDVI) の計算、表示]
[標高データ (SRTM)の表示、植生指数 (NDVI) の3次元表示]
[反射率、輝度温度、標高データを用いた土地被覆分類]
[QGIS, Rを用いた公示地価データの空間統計分析:空間的自己回帰モデル]
[QGIS, Rを用いた公示地価データの空間統計分析:静的な時空間モデリング]
![]() |
この演習で最終的に得られる結果の一例 |
以下のサイトからインストーラーをダウンロードし、インストールする。
(参考)Rの解説ページRjpWiki
空間統計解析の前に、上記のデータを処理する必要がある。
QGISを起動する。本来は不要かもしれないが、念のために以下の処理を済ませておく。
新規プロジェクトを選択し、何もレイヤを追加していない段階で、座標参照系 (coordinate reference system: CRS)を設定する。
続いて、「japan_ver83.shp」を表示させる。
「japan_ver83.shp」は日本測地系 2011(JGD2011)の座標系で作成されている。これを平面直角座標系VI系に変換する。 注意:座標系を変換するには、別名で保存する必要あり。
その後、右クリックで「レイヤの削除」を選んで一旦画面から消去する。その後、「japan_ver83_VI.shp」を読み込めば、平面直角座標系VI系で表示されるようになる。
注意: 上記画像の右下のように、座標が平面直角座標系(m単位)で表示されているか確認する。度の単位だとこの時点で何か誤りが発生していると思われる。
その上で、京都市及び周辺の市を選択する。
記述する式
その後、選択した複数の市を別のshapeファイルとして保存する。
以下の処理のために、「japan_ver83_Kyoto.shp」は残し、平面直角座標系第VI系で表示されているはずである。「japan_ver83_VI.shp」は「レイヤの削除」で削除しておく。
公示地価データ「L01-21_26.shp」は京都府全域の公示地価データが含まれている。上記の対象地域だけのデータを抽出するために下記の処理を行う。
この後、CRSに平面直角座標系第IV系を指定した別のshapeファイルとして保存する。
上記の平面直角座標系第IV系の公示地価データ(L01-21_26_VI)に対して処理を進めていく。属性テーブルを開き、下記の処理をフィールド名「X」と「Y」(共にm単位)について行う。
後の重回帰分析において特定地点との直線距離(本来なら移動に要する時間距離が望ましい)を用いる為、ここで計算する。以下、四条駅の平面直角座標系VI系での座標値(単位はm)を記す。これを利用して、上記で作成した「L01-21_26_VI.shp」の属性テーブル内に新たなフィールドを設け、距離を格納する。
最後に、Excel上で今回の演習に関係のない列を削除して、列の項目名を変更する。下記に示す列だけを残し、1行目に記された列名を変更した後に、CSVファイル「L01-21_26_Kyoto_edited.csv」として保存する。
以下の手順に従って入力していく。
install.packages("mgcv") install.packages("RColorBrewer") install.packages("sp") library(mgcv) library(RColorBrewer) library(sp) # CSVファイルの読み込み dat <- read.csv("L01-21_26_Kyoto_edited.csv") # 奇数:モデル作成用, 偶数:検証用 dat_tmp <- split(dat, rep(c("odd", "even"))) dat1 <- dat_tmp$odd # モデル作成用 dat2 <- dat_tmp$even # 検証用 # 各年度のデータを下記の並びに整理 # Station, Dist, Price, X, Y, Dist2Shijo, Year dat1a <- data.frame(Station=dat1$Station, Dist=dat1$Dist, Price=dat1$p2010, X=dat1$X, Y=dat1$Y, Dist2Shijo=dat1$Dist2Shijo, Year=2010) dat2a <- data.frame(Station=dat2$Station, Dist=dat2$Dist, Price=dat2$p2010, X=dat2$X, Y=dat2$Y, Dist2Shijo=dat2$Dist2Shijo, Year=2010) year_list <- 2011:2021 for (year in year_list) { # "p2011", "p2012"のような列名を作成 yearid <- paste0("p", year) dat1b <- data.frame(Station=dat1["Station"], Dist=dat1["Dist"], Price=dat1[yearid], X=dat1["X"], Y=dat1["Y"], Dist2Shijo=dat1["Dist2Shijo"], Year=year) dat2b <- data.frame(Station=dat2["Station"], Dist=dat2["Dist"], Price=dat2[yearid], X=dat2["X"], Y=dat2["Y"], Dist2Shijo=dat2["Dist2Shijo"], Year=year) # 上記のままでは列名が"Price"ではなく、"p2001"のように代入されるため、 # 下記の処理で"Price"へ置換 dat1b <- dplyr::rename(dat1b, Price=yearid) dat2b <- dplyr::rename(dat2b, Price=yearid) dat1a <- rbind(dat1a, dat1b) dat2a <- rbind(dat2a, dat2b) } # Priceを対数化 dat1a$Pricelog <- log(dat1a$Price) dat2a$Pricelog <- log(dat2a$Price) # Pricelogが無効な行を削除 dat1 <- dat1a[!(dat1a$Pricelog == "-Inf"),] dat2 <- dat2a[!(dat2a$Pricelog == "-Inf"),] # モデル用関数1 f1 <- Pricelog ~ te(X, Y, Year, k=c(50, 10), d=c(2, 1)) + s(Year) + s(Dist) + s(Dist2Shijo) model1 <- gam(f1, data = dat1) # 結果の出力1 sink("output_f1.txt") summary(model1) jpeg("fig1-1.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") plot(model1, select=1) dev.off() jpeg("fig1-2.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") plot(model1, select=2,ylim=c(-1,1)) dev.off() jpeg("fig1-3.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") plot(model1, select=3,ylim=c(-1,1)) dev.off() jpeg("fig1-4.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") plot(model1, select=4) dev.off() # 検証1 pred01 <- predict(model1, dat2, se.fit = TRUE) pred1 <- data.frame(dat2[,c("X","Y")], pred=pred01$fit, se.pred=pred01$se.fit) pred sink() # jetカラーマップの作成 jet.colors <- colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan", "#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000")) cuts_val <- c(8, seq(10, 13, 0.25), 14) cuts_err <- c(0, seq(0.03, 0.1, 0.01), 0.2) coordinates(pred1)<-c("X","Y") jpeg("fig1-val.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") spplot(pred1, "pred", xlab="Lat (deg)", ylab="Lon (deg)", cex.lab=1.5, cex.axis=2.0, cuts=cuts_val, col.regions=jet.colors(7), cex=2.5, pch=20, main="Estimated land price (log): Year, Dist, Dist2Shijo") dev.off() jpeg("fig1-error.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") spplot(pred1, "se.pred", xlab="Lat (deg)", ylab="Lon (deg)", cex.lab=1.5, cex.axis=2.0, cuts=cuts_err, col.regions=jet.colors(7), cex=2.5, pch=20, main="Stardard error (log) distribution: Year, Dist, Dist2Shijo") dev.off() # モデル用関数2:四条駅までの距離を説明変数から除外 f2 <- Pricelog ~ te(X, Y, Year, k=c(50, 10), d=c(2, 1)) + s(Year) + s(Dist) model2 <- gam(f2, data = dat1) # 結果の出力2 sink("output_f2.txt") summary(model2) jpeg("fig2-1.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") plot(model2, select=1) dev.off() jpeg("fig2-2.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") plot(model2, select=2,ylim=c(-1,1)) dev.off() jpeg("fig2-3.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") plot(model2, select=3, ylim=c(-1,1)) dev.off() # 検証2 pred02 <- predict(model2, dat2, se.fit = TRUE) pred2 <- data.frame(dat2[,c("X","Y")], pred=pred02$fit, se.pred=pred02$se.fit) pred sink() cuts_val <- c(8, seq(10, 13, 0.25), 14) cuts_err <- c(0, seq(0.03, 0.1, 0.01), 0.2) coordinates(pred2)<-c("X","Y") jpeg("fig2-val.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") spplot(pred2, "pred", xlab="Lat (deg)", ylab="Lon (deg)", cex.lab=1.5, cex.axis=2.0, cuts=cuts_val, col.regions=jet.colors(7), cex=2.5, pch=20, main="Estimated land price (log): Year, Dist") dev.off() jpeg("fig2-error.jpg", units = "px", pointsize = 24, quality = 80, bg = "white") spplot(pred2, "se.pred", xlab="Lat (deg)", ylab="Lon (deg)", cex.lab=1.5, cex.axis=2.0, cuts=cuts_err, col.regions=jet.colors(7), cex=2.5, pch=20, main="Stardard error (log) distribution: Year, Dist") dev.off()
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
推定結果をQGIS上で表示する。上記の出力結果「L01-21_26_Kyoto_rst1.csv(モデル1)」「L01-21_26_Kyoto_rst2.csv(モデル2)」をGIS上に取り込でいく。その前に、各列の名前(フィールド名)が存在しないので、Excelでもテキストエディタでも結構なので、下記のように命名する。
上記のCSVファイルをQGISでインポートする。
次に、他のデータと重ね合わせて表示させるためにも、上記のファイルに座標系を与えて保存する。
この時点で表示されている「Kyoto10_Price_rst」は表示画面から削除する。最終結果を分かりやすく表示させるために、下記のデータも事前にダウンロードし表示させておく。(注意:別名で保存して、座標系の変換が必要)
最後に、上記で作成した「L01-21_26_Kyoto_rst1.shp」を表示させ、標準誤差に応じて表示させる色を変えていく。
![]() |
![]() |
モデル1による推定の標準誤差 | モデル2による推定の標準誤差 |
3人一組のグループで以下の課題に取り組んで、3人一組で一つのレポートを作成して提出する。
[GRASSのインストール、標高データを用いた地滑り危険度マップの作成]
[植生指数 (NDVI) の計算、表示]
[標高データ (SRTM)の表示、植生指数 (NDVI) の3次元表示]
[反射率、輝度温度、標高データを用いた土地被覆分類]
[QGIS, Rを用いた公示地価データの空間統計分析:空間的自己回帰モデル]
[QGIS, Rを用いた公示地価データの空間統計分析:静的な時空間モデリング]