1 目的

ある地点周辺の統計地図の作成,および統計量の計算を試みる.ここでは,商店街を一点で表し,その商圏を描写.

  • 商圏として一次商圏(ここでは半径1.2kmの円として定義)を考え,その商圏内の高齢者割合(メッシュデータ)を可視化.1
    • 一次商圏の高齢者を65歳以上人口と総人口から計算.
    • 対象地区は横浜市保土ケ谷区の笹山商店街(ピンクの点を中心としたピンクの円)と神奈川区の六角橋商店街(緑の点を中心として緑の円).2

参考:横浜市内商店街の商圏実態

今回は利用しないが,下記のような情報源もある.

ライブラリ:sftidyverseunits

library(sf)
library(tidyverse)

#商圏半径の付与に利用
library(units)

2 行政区域と商店街ポイント

2.1 行政区域データダウンロード

  • 国土数値情報ダウンロードサービス > 行政区域(ポリゴン) > 神奈川県 > 神奈川 世界測地系 2024年(令和6年) 4.33MB N03-20240101_14_GML.zip
    • ダウンロードしたZIPファイルは同じフォルダ(ディレクトリ)に納め,ZIPファイルを選択 > 右クリック > すべて展開 > 展開先の選択とファイルの選択 > 展開を実行する.展開後は最初にダウンロードしたZIPファイルを削除.
    • シェープファイルの読込(read_sf()):行政区域をKanagawaと名付ける.
      • st_transform():地理座標系の投影変換(JGD2011WGS84).
      • Kanagawaから横浜市の行政区域を抜き出し(filter()),Yokohamaと名付ける.
      • 対象商店街周辺の行政区域の抜き出し(filter()),peripheryと名付ける.
#神奈川県の行政区域(2024年・令和6年)
Kanagawa <-
  read_sf("N03-20240101_14_GML/N03-20240101_14.shp")

#世界測地系を指定
Kanagawa <- 
  Kanagawa %>% 
  st_transform("WGS84") 
#横浜市
Kanagawa %>%
  filter(N03_004=="横浜市")->
  Yokohama

#周辺区
Yokohama %>%
  filter(N03_005=="保土ケ谷区" |
           N03_005=="旭区" |
           N03_005=="神奈川区" |
           N03_005=="緑区" |
           N03_005=="港北区") ->
  periphery

2.2 商店街ポイント

#笹山商店街のポイント(世界測地系)
Sasayama_ss_sfg <-
  st_point(c(139.567458, 35.4870312))

#世界測地系を指定
Sasayama_ss_sfc <-
  st_sfc(Sasayama_ss_sfg, crs="WGS84")

#六角橋商店街のポイント(世界測地系)
Rokkakubashi_ss_sfg <-
  st_point(c(139.6260256, 35.4875658))
  
#世界測地系を指定 
Rokkakubashi_ss_sfc <-
  st_sfc(Rokkakubashi_ss_sfg, crs="WGS84")

対象商店街周辺の行政区域の可視化

#完成図
ggplot()+
  geom_sf(data=periphery, fill="white")+
  geom_sf(data=Sasayama_ss_sfc,
             color="deeppink", size=3)+
  geom_sf(data=Rokkakubashi_ss_sfc,
             color="green", size=3)+
  labs(caption="出典:国土数値情報(国土交通省)")+
  ggtitle("横浜市内対象商店街の位置")+
  theme_bw()

統計データ:500mメッシュ

市区町村別メッシュ・コード一覧(3次メッシュの情報)から保土ケ谷区や神奈川区のコードの最初の4桁が5339からはじまることがわかる.

人口

  • 統計地理情報システム > 統計データダウンロード > 国勢調査 > 2020年 > 4次メッシュ(500mメッシュ) > 人口及び世帯 > 都道府県で絞込みはコチラ > 14 神奈川県 > M5339 3

  • read.table()を用いてデータを読込.popと名付ける.

#人口
pop <-
  read.table("tblT001101H5339/tblT001101H5339.txt", 
             header=TRUE, sep=",",
             fileEncoding = "CP932")

#便宜上1行目削除(データ名が2行にわたるため)
pop %>% 
  slice(-1) ->
  pop

#メッシュデータと結合するため,KEY_CODEのデータ型変換
pop %>%
  mutate(KEY_CODE=as.character(KEY_CODE)) ->
  pop

境界

メッシュデータの人口総数を地図上に可視するには,シェープファイルと結合する必要がある.そこで,境界データをダウンロードし,結合する.

  • 統計地理情報システム > 境界データダウンロード > 4次メッシュ(500mメッシュ) > 世界測地系緯度経度・Shapefile > 都道府県で絞込みはコチラ > 13 神奈川県 > M5339

    • read.sf()を用いてデータを読込.meshと名付ける
    • meshpopKEY_CODEで結合.
      • T001101001:人口総数(人)
      • T001101019:65歳以上人口総数(人)
mesh <-
  read_sf("HDDSWH5339/MESH05339.shp")

#データ結合
mesh_pop <-
  left_join(mesh, pop, by=c("KEY_CODE"))

#人口総数,65歳以上人口総数を数値(integer:整数)に変更
mesh_pop <-
  mesh_pop %>%
  mutate(population=as.integer(T001101001),
         elderly=as.integer(T001101019),
         elderly_ratio=elderly/population*100) 

高齢者割合の可視化

meshの境界ボックス(Bounding box)は広範囲に及ぶ.ここでは,周辺区(periphery)だけを示したい.そこで,周辺区(periphery)とmeshの重複する部分を抽出する.

  • st_intersection()を用いて,2つのシェープファイル(meshperiphery)の重複部分を抽出.
    • そのためには以下の準備で示されている指示が必要.4
#準備(投影変換JSD2000→WGS84)
mesh_wgs84 <-
  mesh_pop %>%
  st_transform("WGS84") 

#このおまじないがないと次の結合できない
st_agr(mesh_wgs84)="constant"
st_agr(periphery)="constant"

#高齢者割合が加わったメッシュデータの完成
periphery_mesh <-
  st_intersection(x=mesh_wgs84,
                  y=periphery)

高齢者割合の可視化

  • NA(欠損値)は情報(ここでは高齢者割合)が含まれないことを意味する.
ggplot()+
  geom_sf(data=periphery_mesh, aes(fill=elderly_ratio))+
  scale_fill_viridis_c(option="G", direction=-1)+
  geom_sf(data=Sasayama_ss_sfc,
             color="deeppink", size=3)+
  geom_sf(data=Rokkakubashi_ss_sfc,
             color="green", size=3)+
  geom_sf(data=periphery, fill="NA",
          linewidth=0.8)+
  labs(fill="高齢者割合(%)", caption="出典:国土数値情報(国土交通省),
       国勢調査4次メッシュ(総務省統計局)")+
  ggtitle("2020年の高齢者割合")+
  theme_void()

3 商圏の可視化

  • 商店街のポイントの一次商圏(半径1.2km)を可視化.
    • st_buffer():円(ポリゴン)を作成.
      • dist:円の距離.
      • set_units():単位を付与.ここでは1200mを指示.
Sasayama_ss_sfc %>%
  st_buffer(dist=set_units(1200, m)) ->
  Sasayama_buffer

Rokkakubashi_ss_sfc %>%
  st_buffer(dist=set_units(1200, m)) ->
  Rokkakubashi_buffer

商圏の可視化

ggplot()+
  geom_sf(data=periphery_mesh, aes(fill=elderly_ratio))+
  scale_fill_viridis_c(option="G", direction=-1)+
  geom_sf(data=Sasayama_ss_sfc,
             color="deeppink", size=3)+
  geom_sf(data=Sasayama_buffer, color="deeppink",
          fill="NA", linewidth=0.8)+
  geom_sf(data=Rokkakubashi_ss_sfc,
             color="green", size=3)+
  geom_sf(data=Rokkakubashi_buffer, color="green",
          fill="NA", linewidth=0.8)+
  geom_sf(data=periphery, fill="NA",
          linewidth=0.6)+
  labs(fill="高齢者割合(%)", caption="出典:国土数値情報(国土交通省),
       国勢調査4次メッシュ(総務省統計局)")+
  ggtitle("一次商圏と高齢者割合")+
  theme_void()

4 商圏内の高齢者割合の計算

4.1 一次商圏メッシュの抽出

  • 上の図「一次商圏と高齢者割合」からは商圏内の高齢者割合が計算されたわけではない.
    • そこで円と重なるメッシュを抽出し,計算.
  • st_intersects()mesh_wgs84から円(buffer)ポリゴンと重なるメッシュを検索.
    • lengths()>0:重なるメッシュを抽出しTRUEに.
    • mesh_wgs84はメッシュ形状のみ.periphery_meshとの交差(st_intersects())にしてしまうと行政区域が邪魔するので注意.
#エラーが出ないためのおまじない
sf_use_s2(FALSE)

#笹山商店街の商圏の高齢者
Sasayama_elderly <-
  lengths(st_intersects(mesh_wgs84,
                        Sasayama_buffer))>0 

#六角橋商店街の商圏の高齢者
Rokkakubashi_elderly <-
  lengths(st_intersects(mesh_wgs84,
                        Rokkakubashi_buffer))>0
  • periphery_meshからSasayama_elderly==TRUEを満たすメッシュを抽出(filter()).
    • 第1引数.ですべての変数を残す.
    • Sasayama_meshと名付ける.
    • 同様のことを六角橋についても行う.
#笹山商圏内の重なるメッシュの抽出
mesh_wgs84 %>%
  filter(., Sasayama_elderly==TRUE) ->
  Sasayama_mesh

#六角橋商圏内の重なるメッシュの抽出
mesh_wgs84 %>%
  filter(., Rokkakubashi_elderly==TRUE) ->
  Rokkakubashi_mesh

一次商圏メッシュの可視化

ggplot()+
  geom_sf(data=periphery_mesh, aes(fill=elderly_ratio))+
  scale_fill_viridis_c(option="G", direction=-1)+
  geom_sf(data=Sasayama_ss_sfc,
             color="deeppink", size=3)+
  geom_sf(data=Sasayama_buffer,
          color="deeppink",
          fill="NA", linewidth=0.6)+
  geom_sf(data=Sasayama_mesh, 
          color="pink", fill="NA",
          linewidth=0.8)+
  geom_sf(data=Rokkakubashi_ss_sfc,
             color="green", size=3)+
  geom_sf(data=Rokkakubashi_buffer,
          color="green", fill="NA", 
          linewidth=0.6)+
  geom_sf(data=Rokkakubashi_mesh, 
          color="darkgreen", fill="NA", 
          linewidth=0.8)+
  labs(fill="高齢者割合(%)",
  caption="出典:国土数値情報(国土交通省),
       国勢調査4次メッシュ(総務省統計局)")+
  ggtitle("一次商圏メッシュ")+
  theme_void()

  • 円(buffer)ポリゴンと重なるメッシュ(一次商圏メッシュ)が取り出せていることが確認できる.

4.2 周辺メッシュに含まれる高齢者割合の計算

  • 上の図の通り,重複するデータ(ここではメッシュ)が存在すると,統計量を計算できない.重複するデータはないが,練習のためdistinct()で削除.
#重複するメッシュ(KEY_CODE)を取り除く
#(.keep_all=TRUE)その他の変数残す
Sasayama_mesh %>% 
  distinct(KEY_CODE,.keep_all=TRUE)->
  Sasayama_mesh
  • 欠損値(NA)が含まれる場合も統計値を計算できない.欠損値を無視して計算するには追加的なコード(na.rm=TRUE)が必要だが,ここでは欠損値がないため指示していない.
    • 地図のメッシュには各メッシュ内の高齢者割合(%)が示されている.今回は一次商圏メッシュ全体の高齢者割合(%)を計算.
    • そのために,一次商圏メッシュ内の人口総数(人)sum_popと65歳以上人口総数(人)sum_eldを計算し,sum_eldsum_popから割ることにより高齢者割合を計算.
Sasayama_mesh %>%
  summarize(sum_pop=
            sum(population),
            sum_eld=
            sum(elderly),
          "笹山高齢者割合"=sum_eld/sum_pop*100)
sum_pop sum_eld 笹山高齢者割合 geometry
54367 17183 31.60557 POLYGON ((139.55 35.4875, 1…
Rokkakubashi_mesh %>%
  summarize(sum_pop=
            sum(population),
            sum_eld=
            sum(elderly),
          "六角橋高齢者割合"=sum_eld/sum_pop*100)
sum_pop sum_eld 六角橋高齢者割合 geometry
112589 23345 20.73471 POLYGON ((139.625 35.475, 1…

4.3 まとめ

  • OSMデータによる商店街の可視化では笹山商店街,六角橋商店街を事例として,商店街の店舗数を計算.

    • この結果と今回の結果を次のように表にまとめる.
#データを作成
商店街 <- c("笹山商店街", "六角橋商店街")
店舗数 <- c(17, 153)
一次商圏内高齢者割合 <- c(31.6, 20.8)

#データフレームを作成
商店街データ <- data.frame(商店街, 店舗数, 一次商圏内高齢者割合)

#結果を表示
商店街データ
商店街 店舗数 一次商圏内高齢者割合
笹山商店街 17 31.6
六角橋商店街 153 20.8

Rによる地理空間データの可視化


  1. OSMデータによる商店街の可視化では笹山商店街,六角橋商店街を事例として,商店街の店舗の可視化や店舗数の計算を試みている. ↩︎

  2. この図はmapview()を用いている.mapview()を用いた地理空間データの可視化についてはインタラクティブな地図によるデータの可視化参照.↩︎

  3. 統計地理情報システムの国勢調査からは1995年から2020年(5年ごと)までの人口総数(男女),世帯総数などがわかる(アクセス日:2022-10-29).2015年からは年齢別人口,外国人人口など詳しく記録されている.↩︎

  4. 準備に示されているRコードの類似コードはコミュニティバス路線上の人口密度の可視化に説明あり.↩︎