#276 年間品類別流動量を算出するコードを改善する
前回の投稿では、マテリアルフロー推計の改善について、言及しました。今回の投稿から、具体的な改善点について述べていこうと思います。
マテリアルフロー推計手順の概要
2015年大阪府のマテリアルフローの作成にあたり、島崎(2008)、天野ら(2001)の手法を参照しました。以下に推計手順の概要を示します。
- 「都道府県間年間流動量調査」のデータから、年間の品類別の純移出量、純移入量、内部流動量を求めます。
- 「都道府県間流動量3日間調査」のデータから、3日間の品類・品目別の純移出量、純移入量、内部流動量を求めます。
- 上記1.の結果に、2.で求めた3日間の品類と品目の比率を配分し、年間の品類・品目別の純移出量、純移入量、内部流動量を算出します。
- 上記3.の結果を、表274−1で示した9品類67品目に集約します。
- 「港湾統計(年報)2014」および「港湾統計(年報)2015」の「第3表 海上出入貨物表 (2)品種別都道府県別表(輸移出入) 」のデータから、2014年度(2014年4月〜2015年3月)の輸出入量を求めます。
- 上記5.の結果を、表274−1で示した9品類67品目に集約します。
- 上記4.と6.の結果を合計して、純流入量・純流出および総流入量・総流出量を算出します。
- 上記7.の結果に「発産業業種別・品類品目別流動量3日間調査」と「着産業業種・品類品目別流動量3日間調査」の2つのデータから業種別比率を求め、各産業に配分します。
- 上記8.で配分する際、これらのデータは全国平均を意味するため、大阪府の産業構造や取引状況が考慮されていません。そのため、平成28年経済センサスを用いて、着産業は製造品出荷額、発産業は原材料・燃料・電気使用額を参照し、重みづけによる補正を施します。
- 業種別、品類・品目別の年間流動量を求めた後、産業廃棄物排出量、一般廃棄物排出量、県内総生産、エネルギー消費量、二酸化炭素排出量など、他の統計データを追加します。
このうち、手順1.と2.では、物流センサスのデータを使用します。
現時点(2025年9月23日)では、物流センサスはe-stat上でデータベース化されておらず、APIを利用することもできない状態です。提供されているのはExcelファイルのみです。
したがって、
推計に必要な最低限のExcelファイルのみをダウンロードし、それらをpandasで読み込み、DataFrameに変換してから推計を行っていきます。Excelファイル上での手計算の工程をなくすことで、生成されるエクセルの数をできるだけ抑えるようにします。
および
jupyterLab上に分散しているセルをできるだけマージして、コードをまとめていきます。
本ブログ投稿#275より引用
ということを意識して、推計のコードを書いていくことにしました。
推計手順1.のコード
上記の推計手順1.のコードは、以下のようになります。
import openpyxl
import os
import pandas as pd
from glob import glob
import numpy as np
# 都道府県コードを変数pref_codeに格納
# 大阪府のコードは26
pref_code = 26
# < ---年間品類別流動量の算出--->
file_path = '物流センサスデータ/都道府県間年間流動量(年間品類別).xlsx'
try:
# Excelファイルを開く
wb = openpyxl.load_workbook(file_path, data_only=True)
except FileNotFoundError:
print(f"エラー: ファイルが見つかりません。パスを確認してください: {file_path}")
row_dict = {}
for name in wb.sheetnames:
if name == '合計':
continue
else:
ws = wb[name]
flow_list = []
# datumにセルの値を格納する
datum = []
for row in ws['C9:AX56']:
# 各行の値を格納しておくリストrow_datumを用意
row_datum = []
for cell in row:
# セルの値をrow_datumに格納
row_datum.append(cell.value)
# 1行分の値が格納されたrow_datumをdatumに格納
datum.append(row_datum)
df = pd.DataFrame(datum)
flow_list.append(round(df.iloc[47, pref_code], 1)) # 総着量
flow_list.append(round(df.iloc[pref_code, 47], 1)) # 総発量
flow_list.append(round(df.iloc[pref_code, pref_code], 1)) # 内部流動量
flow_list.append(flow_list[0] - flow_list[2]) # 純移入(総着量 - 内部流動量)
flow_list.append(flow_list[1] - flow_list[2]) # 純移出 (総発量 - 内部流動量)
row_dict[name] = flow_list
df_year_pref_goods = pd.DataFrame(row_dict).T
df_year_pref_goods.columns = ['総着量', '総発量', '内部流動量', '純移入', '純移出']
# index名を変更
df_year_pref_goods = df_year_pref_goods.rename(index={'農水': '農水産品',
'林産': '林産品',
'鉱産': '鉱産品',
'金属機械': '金属機械工業品',
'化学': '化学工業品',
'軽工': '軽工業品',
'雑工': '雑工業品',
'排出': '排出物',
'特殊': '特殊品'
}
)
df_year_pref_goods # 年間品類別流動量のデータが格納されたDataFrame`
物流センサスのデータベース化とAPI利用可を希望
将来、物流センサスがe-statにおいてデータベース化され、APIが利用できるるようになることも予想されます。その際には、APIをたたくことで、物流センサスのデータを使用することができるようにコードを改変することになると思います。
なので、総務省統計局には、物流センサスのデータベース化及びAPIの利用可を早期に実現してほしいなと思っています。