#必要パッケージの読み込み

library(sf)
library(tidyverse)
library(spdep)
library(spgwr)
library(modelsummary)

#データの読み込み

# 公示地価
l01 <- sf::read_sf("L01-19_11.shp")

# 駅データ
station <- sf::read_sf("N02-19_Station.geojson") 

# 行政界
admin <- sf::read_sf("N03-19_11_190101.shp")

#データ作成 ##座標系を揃える→埼玉県の周辺だけ駅を抜き出す

target_crs <- 32654

l01_saitama   <- st_transform(l01,    target_crs)
admin_saitama <- st_transform(admin,  target_crs)
station_all   <- st_transform(station, target_crs)

# 埼玉県全体のポリゴンを1つにまとめる
pref_union <- admin_saitama |> st_union()

# 県境から20kmバッファしたエリアを作る
bb_poly <- pref_union |> st_buffer(20000)

# その中に入っている駅だけ残す
station_near <- station_all[
  st_intersects(station_all, bb_poly, sparse = FALSE)[, 1],
]

# 確認用プロット
plot(st_geometry(admin_saitama))
plot(st_geometry(station_near), add = TRUE, pch = 16, cex = 0.4)

##最寄り駅までの距離を計算

# 最寄り駅のインデックス
nearest_idx <- st_nearest_feature(l01_saitama, station_near)
nearest_station_sf <- station_near[nearest_idx, ]

# 距離(メートル)
dist_station <- st_distance(
  l01_saitama,
  station_near[nearest_idx, ],
  by_element = TRUE
)

# 数値化して変数に追加
l01_access <- l01_saitama %>%
  mutate(
    price       = as.numeric(L01_006),
    ln_price    = log(price),
    dist_sta_m  = as.numeric(dist_station),
    dist_sta_km = dist_sta_m / 1000,
    ln_dist_sta = log(dist_sta_km + 1e-6) 
  ) %>%
  
  filter(!is.na(price), price > 0)

nearest_station_attr <- nearest_station_sf %>%
  st_drop_geometry() %>%
  transmute(
    nearest_sta_name = `駅名`,      # 駅名の列
    nearest_line     = `路線名`,    # 路線名の列
    operator         = `運営会社`,  # 事業者名(使いたければ)
    rail_type        = `鉄道区分`,  # 鉄道区分(使いたければ)
    operator_type    = `事業者種別` # 事業者種別(使いたければ)
  )

# 行ごとの並び順は l01_access と一致しているので、そのまま bind_cols でOK
l01_access <- l01_access %>%
  bind_cols(nearest_station_attr)

##行政界との結合(市町村情報)

# 公示地ポイントを市町村ポリゴンに空間結合
l01_access_admin <- st_join(
  l01_access,
  admin_saitama,
  left = TRUE,
  largest = TRUE
)
## Warning: attribute variables are assumed to be spatially constant throughout
## all geometries
l01_access_admin <- l01_access_admin %>%
  mutate(
    city_name = N03_004,
    city_code = N03_007 
  )

##回帰用データフレームを作成

l01_reg <- l01_access_admin %>%
  st_drop_geometry() %>%
  select(
    price,
    ln_price,
    dist_sta_km,
    ln_dist_sta,
    nearest_sta_name,
    nearest_line,
    city_name,
    city_code
  ) %>%
  
  filter(
    !is.na(ln_price),
    !is.na(dist_sta_km),
    !is.na(city_name)
  )

##駅密度(1km・3km以内の駅数)を計算

# 1km 以内に入る駅の数
n_sta_1km <- st_is_within_distance(
  l01_access,    # 標準地
  station_near,  # 駅
  dist = 1000    # 1,000m
) %>%
  lengths()

# 3km 以内に入る駅の数
n_sta_3km <- st_is_within_distance(
  l01_access,
  station_near,
  dist = 3000
) %>%
  lengths()
l01_access_admin <- l01_access_admin %>%
  mutate(
    n_sta_1km = n_sta_1km,
    n_sta_3km = n_sta_3km
  )

# 回帰用 df にも反映
l01_reg <- l01_access_admin %>%
  st_drop_geometry() %>%
  select(
    price,
    ln_price,
    dist_sta_km,
    ln_dist_sta,
    n_sta_1km,
    n_sta_3km,
    nearest_sta_name,
    nearest_line,
    city_name,
    city_code
  ) %>%
  filter(
    !is.na(ln_price),
    !is.na(dist_sta_km),
    !is.na(city_name)
  )

#記述統計

summary(select(l01_reg, ln_price, dist_sta_km, n_sta_1km, n_sta_3km))
##     ln_price       dist_sta_km        n_sta_1km         n_sta_3km     
##  Min.   : 8.132   Min.   :0.01748   Min.   : 0.0000   Min.   : 0.000  
##  1st Qu.:11.126   1st Qu.:0.46684   1st Qu.: 0.0000   1st Qu.: 2.000  
##  Median :11.678   Median :0.85335   Median : 1.0000   Median : 4.000  
##  Mean   :11.612   Mean   :1.08198   Mean   : 0.9862   Mean   : 4.909  
##  3rd Qu.:12.139   3rd Qu.:1.39303   3rd Qu.: 1.0000   3rd Qu.: 6.000  
##  Max.   :14.940   Max.   :7.07419   Max.   :11.0000   Max.   :21.000
# 市区町村別の平均地価・平均最寄り駅距離
city_summary <- l01_reg %>%
  group_by(city_name) %>%
  summarise(
    n_point      = n(),
    mean_lnprice = mean(ln_price),
    mean_price   = mean(price),
    mean_dist_km = mean(dist_sta_km),
    mean_sta1km  = mean(n_sta_1km),
    mean_sta3km  = mean(n_sta_3km),
    .groups = "drop"
  )
head(city_summary)
## # A tibble: 6 × 7
##   city_name n_point mean_lnprice mean_price mean_dist_km mean_sta1km mean_sta3km
##   <chr>       <int>        <dbl>      <dbl>        <dbl>       <dbl>       <dbl>
## 1 ときがわ…       3         9.90     20033.        1.23        0.333        1   
## 2 ふじみ野…      15        12.2     203600         0.887       0.667        3.07
## 3 三芳町          6        11.8     139333.        1.32        0.167        3.83
## 4 三郷市         23        11.7     125313.        1.37        0.391        4.48
## 5 上尾市         38        11.6     120692.        1.11        0.763        4   
## 6 上里町          4        10.5      35725         1.27        0.5          2.25
# log地価と最寄り駅距離
ggplot(l01_reg, aes(x = dist_sta_km, y = ln_price)) +
  geom_point(alpha = 0.3) +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(
    x = "最寄り駅までの距離 (km)",
    y = "対数地価 log(price)",
    title = "最寄り駅距離と地価の関係(2019年・埼玉県)"
  ) +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

#データ可視化

ggplot() +
  geom_sf(data = admin_saitama, fill = NA, color = "grey70") +
  geom_sf(
    data = l01_access_admin,
    aes(color = ln_price),
    size = 0.6
  ) +
  scale_color_viridis_c(option = "plasma") +
  coord_sf() +
  labs(
    color = "log地価",
    title = "埼玉県における地価公示とその空間分布(2019年)"
  ) +
  theme_minimal()

ggplot() +
  geom_sf(data = admin_saitama, fill = NA, color = "grey70") +
  geom_sf(
    data = l01_access_admin,
    aes(color = dist_sta_km),
    size = 0.6
  ) +
  scale_color_viridis_c(option = "magma") +
  coord_sf() +
  labs(
    color = "最寄り駅距離 (km)",
    title = "埼玉県における最寄り駅距離の空間分布(2019年)"
  ) +
  theme_minimal()

#回帰分析 ##ヘドニック回帰(OLS)

# モデル1:駅距離だけ
m1 <- lm(ln_price ~ ln_dist_sta, data = l01_reg)
summary(m1)
## 
## Call:
## lm(formula = ln_price ~ ln_dist_sta, data = l01_reg)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0511 -0.4597  0.1135  0.5323  2.7762 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 11.49632    0.02161  532.09   <2e-16 ***
## ln_dist_sta -0.43616    0.02323  -18.78   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7471 on 1299 degrees of freedom
## Multiple R-squared:  0.2135, Adjusted R-squared:  0.2129 
## F-statistic: 352.6 on 1 and 1299 DF,  p-value: < 2.2e-16
# モデル2:駅距離 + 駅密度(1km・3km)
m2 <- lm(ln_price ~ ln_dist_sta + n_sta_1km + n_sta_3km, data = l01_reg)
summary(m2)
## 
## Call:
## lm(formula = ln_price ~ ln_dist_sta + n_sta_1km + n_sta_3km, 
##     data = l01_reg)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.97790 -0.37353  0.08297  0.44901  1.72290 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 10.993908   0.029565 371.850   <2e-16 ***
## ln_dist_sta -0.296118   0.022805 -12.985   <2e-16 ***
## n_sta_1km    0.002027   0.016398   0.124    0.902    
## n_sta_3km    0.109494   0.005605  19.536   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6395 on 1297 degrees of freedom
## Multiple R-squared:  0.4247, Adjusted R-squared:  0.4234 
## F-statistic: 319.2 on 3 and 1297 DF,  p-value: < 2.2e-16
# モデル3:市区町村ダミーも入れる
m3 <- lm(ln_price ~ ln_dist_sta + n_sta_1km + n_sta_3km + factor(city_name), data= l01_reg)
summary(m3)
## 
## Call:
## lm(formula = ln_price ~ ln_dist_sta + n_sta_1km + n_sta_3km + 
##     factor(city_name), data = l01_reg)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.64684 -0.14048  0.03633  0.18640  1.47050 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  9.89419    0.19990  49.496  < 2e-16 ***
## ln_dist_sta                 -0.31307    0.01372 -22.813  < 2e-16 ***
## n_sta_1km                    0.07033    0.01043   6.742 2.39e-11 ***
## n_sta_3km                    0.03450    0.00505   6.832 1.32e-11 ***
## factor(city_name)ふじみ野市  2.02852    0.21910   9.259  < 2e-16 ***
## factor(city_name)伊奈町      1.06857    0.25353   4.215 2.68e-05 ***
## factor(city_name)羽生市      0.07499    0.21721   0.345 0.729971    
## factor(city_name)浦和区      2.34021    0.21210  11.033  < 2e-16 ***
## factor(city_name)越生町      0.04799    0.26485   0.181 0.856247    
## factor(city_name)越谷市      1.54976    0.20774   7.460 1.63e-13 ***
## factor(city_name)横瀬町      0.28254    0.31633   0.893 0.371930    
## factor(city_name)桶川市      1.37390    0.21674   6.339 3.24e-10 ***
## factor(city_name)加須市      0.48310    0.20894   2.312 0.020932 *  
## factor(city_name)皆野町     -0.32284    0.31733  -1.017 0.309185    
## factor(city_name)滑川町      0.48091    0.25301   1.901 0.057569 .  
## factor(city_name)岩槻区      1.27103    0.21594   5.886 5.10e-09 ***
## factor(city_name)寄居町     -0.03063    0.31774  -0.096 0.923206    
## factor(city_name)吉見町      0.78557    0.24514   3.205 0.001387 ** 
## factor(city_name)吉川市      1.53742    0.23888   6.436 1.76e-10 ***
## factor(city_name)久喜市      0.86620    0.20814   4.162 3.38e-05 ***
## factor(city_name)宮代町      0.59013    0.23125   2.552 0.010834 *  
## factor(city_name)狭山市      1.38945    0.20926   6.640 4.70e-11 ***
## factor(city_name)熊谷市      0.72786    0.20871   3.488 0.000505 ***
## factor(city_name)見沼区      1.53338    0.21538   7.119 1.84e-12 ***
## factor(city_name)戸田市      2.04257    0.21684   9.420  < 2e-16 ***
## factor(city_name)幸手市      0.67491    0.23085   2.924 0.003524 ** 
## factor(city_name)行田市      0.30816    0.21336   1.444 0.148909    
## factor(city_name)鴻巣市      0.95969    0.21107   4.547 5.98e-06 ***
## factor(city_name)坂戸市      1.18188    0.21826   5.415 7.37e-08 ***
## factor(city_name)桜区        1.81421    0.22959   7.902 6.06e-15 ***
## factor(city_name)三郷市      1.62862    0.21311   7.642 4.28e-14 ***
## factor(city_name)三芳町      1.85244    0.24512   7.557 8.01e-14 ***
## factor(city_name)志木市      2.19604    0.23153   9.485  < 2e-16 ***
## factor(city_name)春日部市    1.08291    0.20755   5.217 2.13e-07 ***
## factor(city_name)所沢市      1.67948    0.20733   8.101 1.31e-15 ***
## factor(city_name)小鹿野町    0.75679    0.31660   2.390 0.016980 *  
## factor(city_name)小川町      0.22069    0.22800   0.968 0.333264    
## factor(city_name)松伏町      1.46755    0.25303   5.800 8.44e-09 ***
## factor(city_name)上尾市      1.46650    0.20802   7.050 2.98e-12 ***
## factor(city_name)上里町      0.49290    0.26434   1.865 0.062472 .  
## factor(city_name)新座市      2.18174    0.21235  10.274  < 2e-16 ***
## factor(city_name)深谷市      0.54104    0.21033   2.572 0.010217 *  
## factor(city_name)神川町     -0.26300    0.31589  -0.833 0.405239    
## factor(city_name)杉戸町      0.74554    0.23903   3.119 0.001857 ** 
## factor(city_name)西区        1.45447    0.22843   6.367 2.71e-10 ***
## factor(city_name)川越市      1.57633    0.20505   7.688 3.05e-14 ***
## factor(city_name)川口市      2.05696    0.20399  10.083  < 2e-16 ***
## factor(city_name)川島町      1.00658    0.26493   3.799 0.000152 ***
## factor(city_name)草加市      1.66060    0.20764   7.997 2.91e-15 ***
## factor(city_name)大宮区      1.91134    0.22633   8.445  < 2e-16 ***
## factor(city_name)秩父市      0.66794    0.24566   2.719 0.006642 ** 
## factor(city_name)中央区      1.80810    0.22203   8.144 9.35e-16 ***
## factor(city_name)朝霞市      2.08813    0.21355   9.778  < 2e-16 ***
## factor(city_name)鶴ヶ島市    1.15650    0.22241   5.200 2.34e-07 ***
## factor(city_name)東松山市    0.94949    0.21504   4.415 1.10e-05 ***
## factor(city_name)南区        2.15382    0.21532  10.003  < 2e-16 ***
## factor(city_name)日高市      0.47199    0.22349   2.112 0.034899 *  
## factor(city_name)入間市      1.43103    0.21092   6.785 1.80e-11 ***
## factor(city_name)白岡市      1.13117    0.23080   4.901 1.08e-06 ***
## factor(city_name)八潮市      1.79172    0.21677   8.266 3.57e-16 ***
## factor(city_name)鳩山町      0.82387    0.26466   3.113 0.001895 ** 
## factor(city_name)飯能市      1.07257    0.21661   4.952 8.38e-07 ***
## factor(city_name)美里町     -0.09578    0.31602  -0.303 0.761869    
## factor(city_name)富士見市    1.93552    0.21627   8.949  < 2e-16 ***
## factor(city_name)北区        1.31240    0.21946   5.980 2.92e-09 ***
## factor(city_name)北本市      1.27136    0.21895   5.807 8.11e-09 ***
## factor(city_name)本庄市      0.53629    0.21890   2.450 0.014429 *  
## factor(city_name)毛呂山町    0.07256    0.22926   0.316 0.751681    
## factor(city_name)嵐山町      0.36787    0.25277   1.455 0.145822    
## factor(city_name)緑区        2.05569    0.21507   9.558  < 2e-16 ***
## factor(city_name)蓮田市      1.29161    0.22172   5.825 7.27e-09 ***
## factor(city_name)和光市      2.10974    0.22335   9.446  < 2e-16 ***
## factor(city_name)蕨市        2.09797    0.24024   8.733  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.346 on 1228 degrees of freedom
## Multiple R-squared:  0.8405, Adjusted R-squared:  0.8312 
## F-statistic: 89.89 on 72 and 1228 DF,  p-value: < 2.2e-16

##OLS残差の空間自己相関(Moran’s I)

# 残差ベクトル(モデル2を使用)
res_m2 <- residuals(m2)

# 公示地点の座標を取得
coords <- l01_access_admin %>%
  st_centroid() %>%
  st_coordinates()

# 距離20km以内を近傍とする距離ベース近傍
nb_20km <- dnearneigh(coords, d1 = 0, d2 = 20000)

# listw(重み行列)を作成
lw_20km <- nb2listw(nb_20km, style = "W")

# Moran's I 検定
moran_m2 <- moran.test(res_m2, lw_20km)
moran_m2
## 
##  Moran I test under randomisation
## 
## data:  res_m2  
## weights: lw_20km    
## 
## Moran I statistic standard deviate = 203.96, p-value < 2.2e-16
## alternative hypothesis: greater
## sample estimates:
## Moran I statistic       Expectation          Variance 
##      3.332187e-01     -7.692308e-04      2.681391e-06

##南部 vs 北部の異質性(交差項付きOLS)

# 座標のY座標を使って南北を分割(基準は中央値)
coords_df <- l01_access_admin %>%
  st_centroid() %>%
  st_coordinates() %>%
  as_tibble() %>%
  rename(x = X, y = Y)
y_median <- median(coords_df$y, na.rm = TRUE)

l01_reg_zone <- l01_access_admin %>%
  st_drop_geometry() %>%
  bind_cols(coords_df) %>%
  mutate(
    # 南部 = 1, 北部 = 0
    south = if_else(y < y_median, 1L, 0L),
    south_factor = factor(south, labels = c("North", "South"))
  ) %>%
  select(
    price, ln_price,
    dist_sta_km, ln_dist_sta,
    n_sta_1km, n_sta_3km,
    city_name, city_code,
    south, south_factor
  )

# 交差項付きモデル(駅距離 * 南部dummy)
m4 <- lm(
  ln_price ~ ln_dist_sta * south + n_sta_1km + n_sta_3km,
  data = l01_reg_zone
)
summary(m4)
## 
## Call:
## lm(formula = ln_price ~ ln_dist_sta * south + n_sta_1km + n_sta_3km, 
##     data = l01_reg_zone)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.3824 -0.2942  0.0620  0.3586  1.8963 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       10.711627   0.026210 408.680  < 2e-16 ***
## ln_dist_sta       -0.264879   0.023517 -11.263  < 2e-16 ***
## south              0.786798   0.031009  25.373  < 2e-16 ***
## n_sta_1km          0.068229   0.013422   5.083 4.25e-07 ***
## n_sta_3km          0.074565   0.004695  15.883  < 2e-16 ***
## ln_dist_sta:south -0.024578   0.032215  -0.763    0.446    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5142 on 1295 degrees of freedom
## Multiple R-squared:  0.6286, Adjusted R-squared:  0.6271 
## F-statistic: 438.3 on 5 and 1295 DF,  p-value: < 2.2e-16
# ついでに、市区町村FEも入れたバージョン
m5 <- lm(
  ln_price ~ ln_dist_sta * south + n_sta_1km + n_sta_3km + factor(city_name),
  data = l01_reg_zone
)
summary(m5)
## 
## Call:
## lm(formula = ln_price ~ ln_dist_sta * south + n_sta_1km + n_sta_3km + 
##     factor(city_name), data = l01_reg_zone)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.62870 -0.13995  0.03615  0.18816  1.43182 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  9.891141   0.199897  49.481  < 2e-16 ***
## ln_dist_sta                 -0.296579   0.017828 -16.635  < 2e-16 ***
## south                        0.004372   0.057487   0.076 0.939383    
## n_sta_1km                    0.071450   0.010536   6.782 1.84e-11 ***
## n_sta_3km                    0.034387   0.005052   6.806 1.56e-11 ***
## factor(city_name)ふじみ野市  2.021023   0.226397   8.927  < 2e-16 ***
## factor(city_name)伊奈町      1.076844   0.253583   4.247 2.34e-05 ***
## factor(city_name)羽生市      0.082160   0.217254   0.378 0.705365    
## factor(city_name)浦和区      2.326650   0.219451  10.602  < 2e-16 ***
## factor(city_name)越生町      0.061188   0.265002   0.231 0.817434    
## factor(city_name)越谷市      1.546006   0.211140   7.322 4.40e-13 ***
## factor(city_name)横瀬町      0.287471   0.316331   0.909 0.363651    
## factor(city_name)桶川市      1.377418   0.216737   6.355 2.93e-10 ***
## factor(city_name)加須市      0.483031   0.208924   2.312 0.020943 *  
## factor(city_name)皆野町     -0.284187   0.318438  -0.892 0.372331    
## factor(city_name)滑川町      0.496968   0.253244   1.962 0.049941 *  
## factor(city_name)岩槻区      1.278523   0.215991   5.919 4.19e-09 ***
## factor(city_name)寄居町     -0.020313   0.317811  -0.064 0.949048    
## factor(city_name)吉見町      0.765584   0.245517   3.118 0.001862 ** 
## factor(city_name)吉川市      1.543524   0.245976   6.275 4.84e-10 ***
## factor(city_name)久喜市      0.870482   0.208155   4.182 3.10e-05 ***
## factor(city_name)宮代町      0.602993   0.231414   2.606 0.009280 ** 
## factor(city_name)狭山市      1.383800   0.216896   6.380 2.50e-10 ***
## factor(city_name)熊谷市      0.731816   0.208714   3.506 0.000471 ***
## factor(city_name)見沼区      1.536912   0.215400   7.135 1.65e-12 ***
## factor(city_name)戸田市      2.036938   0.224231   9.084  < 2e-16 ***
## factor(city_name)幸手市      0.682815   0.230905   2.957 0.003165 ** 
## factor(city_name)行田市      0.315419   0.213413   1.478 0.139671    
## factor(city_name)鴻巣市      0.967402   0.211123   4.582 5.07e-06 ***
## factor(city_name)坂戸市      1.189711   0.218321   5.449 6.11e-08 ***
## factor(city_name)桜区        1.813478   0.236600   7.665 3.63e-14 ***
## factor(city_name)三郷市      1.628753   0.220728   7.379 2.93e-13 ***
## factor(city_name)三芳町      1.855834   0.251854   7.369 3.16e-13 ***
## factor(city_name)志木市      2.188888   0.238469   9.179  < 2e-16 ***
## factor(city_name)春日部市    1.092589   0.207654   5.262 1.68e-07 ***
## factor(city_name)所沢市      1.668495   0.214985   7.761 1.77e-14 ***
## factor(city_name)小鹿野町    0.728969   0.317164   2.298 0.021707 *  
## factor(city_name)小川町      0.222872   0.227990   0.978 0.328488    
## factor(city_name)松伏町      1.450186   0.253305   5.725 1.30e-08 ***
## factor(city_name)上尾市      1.472420   0.208045   7.077 2.47e-12 ***
## factor(city_name)上里町      0.494266   0.264330   1.870 0.061738 .  
## factor(city_name)新座市      2.181717   0.220029   9.916  < 2e-16 ***
## factor(city_name)深谷市      0.548497   0.210379   2.607 0.009240 ** 
## factor(city_name)神川町     -0.266342   0.315876  -0.843 0.399289    
## factor(city_name)杉戸町      0.749216   0.239033   3.134 0.001763 ** 
## factor(city_name)西区        1.463343   0.228825   6.395 2.28e-10 ***
## factor(city_name)川越市      1.577350   0.206404   7.642 4.29e-14 ***
## factor(city_name)川口市      2.052434   0.211793   9.691  < 2e-16 ***
## factor(city_name)川島町      0.982398   0.265437   3.701 0.000224 ***
## factor(city_name)草加市      1.655190   0.215350   7.686 3.10e-14 ***
## factor(city_name)大宮区      1.914291   0.227934   8.398  < 2e-16 ***
## factor(city_name)秩父市      0.680483   0.245814   2.768 0.005720 ** 
## factor(city_name)中央区      1.792102   0.229354   7.814 1.19e-14 ***
## factor(city_name)朝霞市      2.077056   0.221044   9.397  < 2e-16 ***
## factor(city_name)鶴ヶ島市    1.168884   0.222565   5.252 1.77e-07 ***
## factor(city_name)東松山市    0.955500   0.215069   4.443 9.68e-06 ***
## factor(city_name)南区        2.145644   0.222835   9.629  < 2e-16 ***
## factor(city_name)日高市      0.467547   0.227640   2.054 0.040199 *  
## factor(city_name)入間市      1.427364   0.218591   6.530 9.62e-11 ***
## factor(city_name)白岡市      1.139076   0.230846   4.934 9.15e-07 ***
## factor(city_name)八潮市      1.793164   0.224331   7.993 3.01e-15 ***
## factor(city_name)鳩山町      0.805168   0.264959   3.039 0.002425 ** 
## factor(city_name)飯能市      1.059156   0.224345   4.721 2.62e-06 ***
## factor(city_name)美里町     -0.105285   0.316073  -0.333 0.739114    
## factor(city_name)富士見市    1.924144   0.223648   8.603  < 2e-16 ***
## factor(city_name)北区        1.326950   0.219682   6.040 2.04e-09 ***
## factor(city_name)北本市      1.280492   0.219027   5.846 6.44e-09 ***
## factor(city_name)本庄市      0.542481   0.218934   2.478 0.013352 *  
## factor(city_name)毛呂山町    0.091856   0.229648   0.400 0.689235    
## factor(city_name)嵐山町      0.373669   0.252786   1.478 0.139610    
## factor(city_name)緑区        2.055926   0.222720   9.231  < 2e-16 ***
## factor(city_name)蓮田市      1.293315   0.221708   5.833 6.94e-09 ***
## factor(city_name)和光市      2.098147   0.230521   9.102  < 2e-16 ***
## factor(city_name)蕨市        2.086746   0.246783   8.456  < 2e-16 ***
## ln_dist_sta:south           -0.033553   0.023368  -1.436 0.151289    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.346 on 1226 degrees of freedom
## Multiple R-squared:  0.8408, Adjusted R-squared:  0.8312 
## F-statistic:  87.5 on 74 and 1226 DF,  p-value: < 2.2e-16

#GWR

gwr_sf_base <- l01_access_admin %>%
  drop_na(ln_price, ln_dist_sta, n_sta_1km, n_sta_3km)
gwr_df <- gwr_sf_base %>%
  st_drop_geometry() %>%
  select(
    ln_price,
    ln_dist_sta,
    n_sta_1km,
    n_sta_3km
  )

# 座標行列
coords_gwr <- gwr_sf_base %>%
  st_centroid() %>%
  st_coordinates()

# バンド幅の推定
set.seed(123)
bw_gwr <- gwr.sel(
  ln_price ~ ln_dist_sta + n_sta_1km + n_sta_3km,
  data   = gwr_df,
  coords = coords_gwr
)
## Bandwidth: 37198.41 CV score: 461.1809 
## Bandwidth: 60128.2 CV score: 502.5902 
## Bandwidth: 23027.02 CV score: 388.2373 
## Bandwidth: 14268.62 CV score: 296.1994 
## Bandwidth: 8855.63 CV score: 221.2646 
## Bandwidth: 5510.219 CV score: 175.818 
## Bandwidth: 3442.641 CV score: 155.5805 
## Bandwidth: 2164.807 CV score: 145.5323 
## Bandwidth: 1375.063 CV score: 158.1093 
## Bandwidth: 2462.002 CV score: 147.0105 
## Bandwidth: 1863.152 CV score: 145.9767 
## Bandwidth: 2082.399 CV score: 145.3803 
## Bandwidth: 2062.655 CV score: 145.3684 
## Bandwidth: 2047.717 CV score: 145.3665 
## Bandwidth: 2050.556 CV score: 145.3664 
## Bandwidth: 2050.706 CV score: 145.3664 
## Bandwidth: 2050.687 CV score: 145.3664 
## Bandwidth: 2050.687 CV score: 145.3664 
## Bandwidth: 2050.687 CV score: 145.3664 
## Bandwidth: 2050.687 CV score: 145.3664 
## Bandwidth: 2050.687 CV score: 145.3664
bw_gwr
## [1] 2050.687
# GWR本体
gwr_fit <- gwr(
  ln_price ~ ln_dist_sta + n_sta_1km + n_sta_3km,
  data      = gwr_df,
  coords    = coords_gwr,
  bandwidth = bw_gwr,
  hatmatrix = TRUE,
  se.fit    = TRUE
)

# SpatialPointsDataFrame → sf に変換 & CRS設定
gwr_sf <- st_as_sf(gwr_fit$SDF)
st_crs(gwr_sf) <- st_crs(l01_access_admin)

# 係数マップ(ln_dist_sta)
ggplot() +
  geom_sf(data = admin_saitama, fill = NA, color = "grey70") +
  geom_sf(
    data = gwr_sf,
    aes(color = ln_dist_sta),
    size = 0.7
  ) +
  scale_color_viridis_c(option = "plasma") +
  coord_sf() +
  labs(
    color = "GWR係数(ln_dist_sta)",
    title = "最寄り駅距離の局所係数分布(GWR, ln_dist_sta)"
  ) +
  theme_minimal()

#回帰結果テーブル

models_ols <- list(
  "M1: ln_distのみ"                 = m1,
  "M2: ln_dist + 駅密度"           = m2,
  "M3: M2 + 市区町村FE"            = m3,
  "M4: 南部dummy × ln_dist"       = m4,
  "M5: M4 + 市区町村FE"           = m5
)
modelsummary(
  models_ols,
  gof_map = c("nobs", "r.squared", "adj.r.squared", "AIC", "BIC"),
  stars   = TRUE
)
M1: ln_distのみ M2: ln_dist + 駅密度 M3: M2 + 市区町村FE M4: 南部dummy × ln_dist M5: M4 + 市区町村FE
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
(Intercept) 11.496*** 10.994*** 9.894*** 10.712*** 9.891***
(0.022) (0.030) (0.200) (0.026) (0.200)
ln_dist_sta -0.436*** -0.296*** -0.313*** -0.265*** -0.297***
(0.023) (0.023) (0.014) (0.024) (0.018)
n_sta_1km 0.002 0.070*** 0.068*** 0.071***
(0.016) (0.010) (0.013) (0.011)
n_sta_3km 0.109*** 0.035*** 0.075*** 0.034***
(0.006) (0.005) (0.005) (0.005)
factor(city_name)ふじみ野市 2.029*** 2.021***
(0.219) (0.226)
factor(city_name)伊奈町 1.069*** 1.077***
(0.254) (0.254)
factor(city_name)羽生市 0.075 0.082
(0.217) (0.217)
factor(city_name)浦和区 2.340*** 2.327***
(0.212) (0.219)
factor(city_name)越生町 0.048 0.061
(0.265) (0.265)
factor(city_name)越谷市 1.550*** 1.546***
(0.208) (0.211)
factor(city_name)横瀬町 0.283 0.287
(0.316) (0.316)
factor(city_name)桶川市 1.374*** 1.377***
(0.217) (0.217)
factor(city_name)加須市 0.483* 0.483*
(0.209) (0.209)
factor(city_name)皆野町 -0.323 -0.284
(0.317) (0.318)
factor(city_name)滑川町 0.481+ 0.497*
(0.253) (0.253)
factor(city_name)岩槻区 1.271*** 1.279***
(0.216) (0.216)
factor(city_name)寄居町 -0.031 -0.020
(0.318) (0.318)
factor(city_name)吉見町 0.786** 0.766**
(0.245) (0.246)
factor(city_name)吉川市 1.537*** 1.544***
(0.239) (0.246)
factor(city_name)久喜市 0.866*** 0.870***
(0.208) (0.208)
factor(city_name)宮代町 0.590* 0.603**
(0.231) (0.231)
factor(city_name)狭山市 1.389*** 1.384***
(0.209) (0.217)
factor(city_name)熊谷市 0.728*** 0.732***
(0.209) (0.209)
factor(city_name)見沼区 1.533*** 1.537***
(0.215) (0.215)
factor(city_name)戸田市 2.043*** 2.037***
(0.217) (0.224)
factor(city_name)幸手市 0.675** 0.683**
(0.231) (0.231)
factor(city_name)行田市 0.308 0.315
(0.213) (0.213)
factor(city_name)鴻巣市 0.960*** 0.967***
(0.211) (0.211)
factor(city_name)坂戸市 1.182*** 1.190***
(0.218) (0.218)
factor(city_name)桜区 1.814*** 1.813***
(0.230) (0.237)
factor(city_name)三郷市 1.629*** 1.629***
(0.213) (0.221)
factor(city_name)三芳町 1.852*** 1.856***
(0.245) (0.252)
factor(city_name)志木市 2.196*** 2.189***
(0.232) (0.238)
factor(city_name)春日部市 1.083*** 1.093***
(0.208) (0.208)
factor(city_name)所沢市 1.679*** 1.668***
(0.207) (0.215)
factor(city_name)小鹿野町 0.757* 0.729*
(0.317) (0.317)
factor(city_name)小川町 0.221 0.223
(0.228) (0.228)
factor(city_name)松伏町 1.468*** 1.450***
(0.253) (0.253)
factor(city_name)上尾市 1.467*** 1.472***
(0.208) (0.208)
factor(city_name)上里町 0.493+ 0.494+
(0.264) (0.264)
factor(city_name)新座市 2.182*** 2.182***
(0.212) (0.220)
factor(city_name)深谷市 0.541* 0.548**
(0.210) (0.210)
factor(city_name)神川町 -0.263 -0.266
(0.316) (0.316)
factor(city_name)杉戸町 0.746** 0.749**
(0.239) (0.239)
factor(city_name)西区 1.454*** 1.463***
(0.228) (0.229)
factor(city_name)川越市 1.576*** 1.577***
(0.205) (0.206)
factor(city_name)川口市 2.057*** 2.052***
(0.204) (0.212)
factor(city_name)川島町 1.007*** 0.982***
(0.265) (0.265)
factor(city_name)草加市 1.661*** 1.655***
(0.208) (0.215)
factor(city_name)大宮区 1.911*** 1.914***
(0.226) (0.228)
factor(city_name)秩父市 0.668** 0.680**
(0.246) (0.246)
factor(city_name)中央区 1.808*** 1.792***
(0.222) (0.229)
factor(city_name)朝霞市 2.088*** 2.077***
(0.214) (0.221)
factor(city_name)鶴ヶ島市 1.157*** 1.169***
(0.222) (0.223)
factor(city_name)東松山市 0.949*** 0.956***
(0.215) (0.215)
factor(city_name)南区 2.154*** 2.146***
(0.215) (0.223)
factor(city_name)日高市 0.472* 0.468*
(0.223) (0.228)
factor(city_name)入間市 1.431*** 1.427***
(0.211) (0.219)
factor(city_name)白岡市 1.131*** 1.139***
(0.231) (0.231)
factor(city_name)八潮市 1.792*** 1.793***
(0.217) (0.224)
factor(city_name)鳩山町 0.824** 0.805**
(0.265) (0.265)
factor(city_name)飯能市 1.073*** 1.059***
(0.217) (0.224)
factor(city_name)美里町 -0.096 -0.105
(0.316) (0.316)
factor(city_name)富士見市 1.936*** 1.924***
(0.216) (0.224)
factor(city_name)北区 1.312*** 1.327***
(0.219) (0.220)
factor(city_name)北本市 1.271*** 1.280***
(0.219) (0.219)
factor(city_name)本庄市 0.536* 0.542*
(0.219) (0.219)
factor(city_name)毛呂山町 0.073 0.092
(0.229) (0.230)
factor(city_name)嵐山町 0.368 0.374
(0.253) (0.253)
factor(city_name)緑区 2.056*** 2.056***
(0.215) (0.223)
factor(city_name)蓮田市 1.292*** 1.293***
(0.222) (0.222)
factor(city_name)和光市 2.110*** 2.098***
(0.223) (0.231)
factor(city_name)蕨市 2.098*** 2.087***
(0.240) (0.247)
south 0.787*** 0.004
(0.031) (0.057)
ln_dist_sta × south -0.025 -0.034
(0.032) (0.023)
Num.Obs. 1301 1301 1301 1301 1301
R2 0.213 0.425 0.841 0.629 0.841
R2 Adj. 0.213 0.423 0.831 0.627 0.831

1 OLS (M2) 残差マップ

l01_access_resid <- l01_access_admin %>%
  st_drop_geometry() %>%
  mutate(res_m2 = residuals(m2)) %>%
  bind_cols(
    l01_access_admin %>% st_geometry() %>% st_as_sf()
  ) %>%
  st_as_sf()

ggplot() +
  geom_sf(data = admin_saitama, fill = NA, color = "grey80") +
  geom_sf(
    data = l01_access_resid,
    aes(color = res_m2),
    size = 0.8
  ) +
  scale_color_gradient2(
    low  = "blue",
    mid  = "white",
    high = "red",
    midpoint = 0
  ) +
  coord_sf(datum = NA) +
  labs(
    color = "残差 (M2)",
    title = "OLSモデル(M2)の残差分布",
    subtitle = "ln(price) ~ ln_dist_sta + 駅密度(1km, 3km)"
  ) +
  theme_minimal()