国勢調査の小地域を町名でまとめる

国勢調査の小地域を町名でまとめます。

# ライブラリのインポート

!pip install -U matplotlib
import warnings
warnings.simplefilter('ignore')

import numpy as np
import pandas as pd
from shapely import wkt
from shapely.geometry import Point

try:
  import geopandas as gpd
  from geoalchemy2 import Geometry, WKTElement
  
  from shapely import wkt
  from shapely.ops import unary_union
  from shapely.geometry import MultiPolygon, Polygon
except:
  !pip install geopandas
  !pip install geoalchemy2
  import geopandas as gpd
  from geoalchemy2 import Geometry, WKTElement

# データの読み込み

下記のコードでデータを読み込みます。

# 国勢調査の小地域
df_sjinko = gpd.read_file("./data/R2_JINKO_SMALL/r2ka13.shp")
df_sjinko["CITY"] = df_sjinko["CITY"].astype(int)
# df_sjinko = df_sjinko[(df_sjinko["CITY"]<200)&(df_sjinko["KEY_CODE"]!="13")]
df_sjinko = df_sjinko.reset_index(drop=True)
df_sjinko.tail(2)

# KEYCODEの整理

# S_NAMEがNoneでない
df_sjinko = df_sjinko[~df_sjinko["S_NAME"].isnull()].reset_index(drop=True)
df_sjinko["geof_code"] = df_sjinko["KEY_CODE"].apply(lambda x: x[:-1])
df_sjinko.head(2)

# 町名を接頭文字で抽出

町名を接頭文字で抽出します。

# keycodeリスト
key = df_sjinko["geof_code"].drop_duplicates().tolist()
len(key)

# 町名を接頭文字で抽出
df_sjinko["geof_name"] = ""
for key in key:
  A = df_sjinko[df_sjinko["geof_code"]==key]["S_NAME"].tolist()

  prefix = []
  for x in zip(*A):  # リストAをUnpackingしてzip()に渡します。
      if len(set(x)) == 1:
          prefix.append(x[0])
      else:
          break
  df_sjinko.loc[df_sjinko["geof_code"]==key, "geof_name"] = "".join(prefix)

# 町名ごとに人口と世帯を合計

町名ごとに人口と世帯を合計します。

# データフレームの整形
df = df_sjinko.groupby(["PREF", "CITY", "PREF_NAME", "CITY_NAME", "geof_code", "geof_name"]).sum()[["JINKO", "SETAI"]].reset_index()
df.head(2)
PREF CITY PREF_NAME CITY_NAME geof_code geof_name JINKO SETAI
13 101 東京都 千代田区 1310100100 丸の内 10 10
13 101 東京都 千代田区 1310100200 大手町 2 2

# 町名ごとにgeometryを統合

町名ごとにgeometryを統合します。

# GeoDataFrameを作成
geometry = df_sjinko_23sec['geometry'] #.apply(wkt.loads)
gdf_extract = gpd.GeoDataFrame(df_sjinko_23sec[["geof_code"]], geometry=geometry)

# labelで結合
gdf_custom = gdf_extract.dissolve(by='geof_code', aggfunc='sum')
gdf_custom = gdf_custom.reset_index()
# MULTIPOLYGONをPOLYGONに変換
gdf_custom = gdf_custom.explode().reset_index(drop=True)
# POLYGONの空洞(hole)を埋める
gdf_custom['geometry'] = gdf_custom['geometry'].apply(lambda p: Polygon(p.exterior))
# labelで再結合
gdf_custom = gdf_custom.dissolve(by='geof_code', aggfunc='sum')

# csvで保存

# データフレームを統合
gdf_out = pd.merge(df, gdf_custom, on="geof_code")
gdf_out.to_csv("./data/jinko_small_merge.csv", index=False)

# まとめ

国勢調査の小地域を町名でまとめました。

BigQueryのカラム設定を簡単に

BigQueryのカラム設定を簡単に

BigQueryのカラム設定を簡単にします

geometry(ポイント型)で座標抽出

geometry(ポイント型)で座標抽出

geometry(ポイント型)で座標抽出します