#287 総流出量および純流出量を補正するコードを改善する

投稿#276から、都道府県のマテリアルフローを推計するコードの改善に取り組んでいます。

今回の投稿では、投稿#283で算出した総流出量および純流出量を補正するコードを改善していきます。

マテリアルフロー推計手順の概要

2015年大阪府のマテリアルフローの作成にあたり、島崎(2008)、天野ら(2001)の手法を参照しました。以下に推計手順の概要を示します。

  1. 「都道府県間年間流動量調査」のデータから、年間の品類別の純移出量、純移入量、内部流動量を求めます。
  2. 「都道府県間流動量3日間調査」のデータから、3日間の品類・品目別の純移出量、純移入量、内部流動量を求めます。
  3. 上記1.の結果に、2.で求めた3日間の品類と品目の比率を配分し、年間の品類・品目別の純移出量、純移入量、内部流動量を算出します。
  4. 上記3.の結果について、物流センサスでの調査品目と港湾統計での調査品目を統合して67品目に集約します。
  5. 「港湾統計(年報)2014」および「港湾統計(年報)2015」の「第3表 海上出入貨物表 (2)品種別都道府県別表(輸移出入) 」のデータから、2014年度(2014年4月〜2015年3月)の輸出入量を求めます。
  6. 上記5.の結果について、物流センサスでの調査品目と港湾統計での調査品目を統合して67品目に集約します。
  7. 上記4.と6.の結果を合計して、純流入量・純流出および総流入量・総流出量を算出します。
  8. 「着産業業種・品類品目別流動量3日間調査」のデータから着産業業種別比率を算出します。
  9. 対象都道府県の産業構造や取引状況が考慮に入れるため、上記8.で算出した比率を平成28年経済センサスの製造品出荷額を参照し、重みづけによる補正を施します。その後、上記7.で算出した総流入量および純流入量を補正後の比率で各産業に配分します。
  10. 「発産業業種別・品類品目別流動量3日間調査」のデータから発産業業種別比率を算出します。
  11. 対象都道府県の産業構造や取引状況を考慮に入れるため、上記10.で算出比率を平成28年経済センサスの原材料・燃料・電気使用額を参照し、重みづけによる補正を施します。その後、その後、上記7.で算出した総流出量および純流出量を補正後の比率で各産業に配分します。
  12. 都道府県品類別内部流動量を算出します。

今回の投稿は、上記手順の11.に該当します。
つまり、対象都道府県の産業構造や取引状況を考慮に入れるため、投稿#286で算出した# 発産業業種別比率を平成28年経済センサスの原材料・燃料・電気使用額を参照し、重みづけによる補正を施します。

その後、投稿#283で算出した総流出量および純流出量を補正後の比率で各産業に配分します。

改善したコードは、以下のようになります。

# -----------------------------------------------------------
# 1. APIエンドポイントとパラメータの定義 (辞書形式に修正)
# -----------------------------------------------------------

APP_ID = "ここにAPIのIDを入力"
# e-Stat APIのベースURL(クエリパラメータなし)
BASE_URL = "http://api.e-stat.go.jp/rest/3.0/app/json/getStatsData"

# APIリクエストのクエリパラメータを辞書形式で定義
# cdCat01とcdAreaの値は、URLエンコード前のカンマ区切りの文字列を使用します。
# requestsライブラリがこれを自動的にエンコードします。
API_PARAMS = {
    "cdCat01": "01500,02040,02280,03050,03310,03480,03730,03880,04370,04510,04860,05070,05300,05870,06210,06490,06950,07220,07600,07930,08180,08530,08750,09010",
    "cdTab": "9650",
    "cdArea": "00000," + str(pref_code + 1) + "000",   # cdAreaをpref_codeを利用して指定。
    "lang": "J",
    "statsDataId": "0003389393",
    "metaGetFlg": "Y",
    "cntGetFlg": "N",
    "explanationGetFlg": "Y",
    "annotationGetFlg": "Y",
    "sectionHeaderFlg": "1",
    "replaceSpChars": "0"
}

API_PARAMS["appId"] = APP_ID

# -----------------------------------------------------------
# 4. メイン処理 (一括実行)
# -----------------------------------------------------------
if __name__ == "__main__":
    # 1. データ取得
    # base_urlとAPI_PARAMSを引数として渡すように変更
    raw_data = fetch_estat_data(base_url, API_PARAMS)

    # 2. DataFrameへの変換と表示
    if raw_data:
        df = convert_to_dataframe(raw_data)

        # Jupyter Notebook/Labでは、最後の行にdfと書くだけで整形された表が出力されます
        print("\n--- 統計データのDataFrame(最初の5行)---")
        print(df.head())
        print("\n--- 全体のDataFrameの表示(データ分析用)---")
    else:
        print("\nDataFrameは作成されませんでした。")

# <---経済センサスにおける製造業のコードと業種名の一覧を格納したDataFrameを取得する--->

data = raw_data['GET_STATS_DATA']['STATISTICAL_DATA']['CLASS_INF']['CLASS_OBJ']

df_rawmate_value = df.copy()
# 不要な列を削除
cols_to_drop = ['tab', 'time', 'unit']
df_rawmate_value = df_rawmate_value.drop(columns=[col for col in cols_to_drop if col in df.columns], errors='ignore')
df_rawmate_value = df_rawmate_value.rename(columns={'cat01': 'コード', 'area': '地域', 'Value': '原材料使用額'})
df_rawmate_value = df_rawmate_value.set_index('コード')
df_rawmate_value.head()

# 都道府県の原材料使用額のDataFrameを作成
df_rawmate_pref = df_rawmate_value.copy()

# '地域'列の値が '00000' ではない行だけを選択し、DataFrameを更新する
df_rawmate_pref = df_rawmate_pref[df_rawmate_pref['地域'] != '00000']
df_rawmate_pref = df_rawmate_pref.drop('地域', axis=1)
df_rawmate_pref = df_rawmate_pref.rename(columns={'原材料使用額': 'pref'})

# 全国の原材料使用額のDataFrameを作成
df_rawmate_japan = df_rawmate_value.copy()

# '地域'列の値が '00000' の行だけを選択し、DataFrameを更新する
df_rawmate_japan = df_rawmate_japan[df_rawmate_japan['地域'] == '00000']
df_rawmate_japan = df_rawmate_japan.drop('地域', axis=1)
df_rawmate_japan = df_rawmate_japan.rename(columns={'原材料使用額': 'japan'})

# df_rawmate_prefとdf_rawmate_japanを横にconcateする
df_rawmate_value = pd.concat([df_rawmate_pref, df_rawmate_japan], axis=1)

df_rawmate_value = pd.concat([df_manu_industry, df_rawmate_value], axis=1)
df_rawmate_value = df_rawmate_value.reset_index()
df_rawmate_value = df_rawmate_value.drop('コード', axis=1)
df_rawmate_value = df_rawmate_value.set_index('業種')

# 新規列「補正前総流出量」、「全国平均」、「重み」、「補正後総流出量」を追加、算出する
df_agg_hatsu_industry['合計'] = df_agg_hatsu_industry.sum(axis=1)
df_rawmate_value['補正前総流出量'] = 0.0
for raw_ind in df_rawmate_value.index:
    df_rawmate_value.loc[raw_ind, '補正前総流出量'] = df_agg_hatsu_industry.loc[raw_ind, '合計']
df_rawmate_value['全国平均'] = round(df_rawmate_value['japan'] / 47, 1)
df_rawmate_value['重み'] = df_rawmate_value['pref'] / df_rawmate_value['全国平均']
df_rawmate_value['補正後総流出量'] = round(df_rawmate_value['補正前総流出量'] * df_rawmate_value['重み'], 1)

# 製造業において、補正後総流出量を各品目に配分する
df_after_hatsu_industry = df_agg_hatsu_industry.copy()
for raw_ind in df_rawmate_value.index:
    for item in df_after_hatsu_industry.columns:
        if item == '合計':
            df_after_hatsu_industry.loc[raw_ind, item] = df_rawmate_value.loc[raw_ind, '補正後総流出量']
        else:
            df_after_hatsu_industry.loc[raw_ind, item] = df_rawmate_value.loc[raw_ind, '補正後総流出量'] * \
                                                        df_agg_hatsu_industry.loc[raw_ind, item] / \
                                                        df_agg_hatsu_industry.loc[raw_ind, '合計']

# セクター別総発量を算出する

# 補正後の発産業業種・品類別品目別流動量における業種別比率を算出する
df_hatsu_item_to_industry = df_after_hatsu_industry.copy()
# 列「合計」を削除する
df_hatsu_item_to_industry = df_hatsu_item_to_industry.drop('合計', axis=1)
# 行「合計」を追加する
df_hatsu_item_to_industry = append_sum_row_label(df_hatsu_item_to_industry)
# 各品目における業種別比率を算出する
for item in df_hatsu_item_to_industry.columns:
    for industry in df_hatsu_item_to_industry.index:
        if industry == '合計':
            continue
        else:
            df_hatsu_item_to_industry.loc[industry, item] = df_hatsu_item_to_industry.loc[industry, item] / \
                                                        df_hatsu_item_to_industry.loc['合計', item]
df_hatsu_item_to_industry = df_hatsu_item_to_industry.drop('合計')

# 行「合計」を追加する
df_hatsu_item_to_industry = append_sum_row_label(df_hatsu_item_to_industry)

# 年間集約品目別総流出量を業種別比率で各産業に配分する
for item in df_hatsu_item_to_industry.columns:
    for industry in df_hatsu_item_to_industry.index:
        if industry == '合計':
            continue
        else:
            df_hatsu_item_to_industry.loc[industry, item] = df_hatsu_item_to_industry.loc[industry, item] \
                                                        * df_agg_year_pref_item.loc[item, "総流出量"]

df_hatsu_item_to_industry = df_hatsu_item_to_industry.drop('合計')

# 発産業業種一覧.csvを読み込む
df_hatsu_sector_view = pd.read_csv('発産業業種一覧.csv', index_col=0)

# 合計列を追加する
df_hatsu_item_to_industry['合計'] = df_hatsu_item_to_industry.sum(axis=1)

# df_item_to_industryに新規に列「sector」を追加する
df_hatsu_item_to_industry['sector'] = df_hatsu_sector_view['sector']

# 産業大分類別総流出量のDataFrameを作成する
df_sector_hatsu = pd.DataFrame([0.0,0.0,0.0,0.0],
                               index=['鉱業','製造業','卸売業','倉庫業'],
                               columns=['総流出量']
                              )
for sector, group in df_hatsu_item_to_industry.groupby('sector'):
    df_sector_hatsu.loc[sector, '総流出量'] = round(group['合計'].sum(), 1)

'''都道府県品類別純流出量を算出する'''

# 対応表のDataFrameに新規列「純流入量」を追加する
df_item_to_goods['純流出量'] = df_agg_year_pref_item['純移出'] + df_agg_year_pref_item['輸出']

# 都道府県品類別純流入量のデータフレームを作成する
df_goods_netoutflow = pd.DataFrame([0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,],
                               index=['農水産品','林産品','鉱産品','金属機械工業品','化学工業品','軽工業品',
                                      '雑工業品','排出物','特殊品'],
                               columns=['純流出量']
                              )
for goods, group in df_item_to_goods.groupby("goods"):
    df_goods_netoutflow.loc[goods, "純流出量"] = round(group["純流出量"].sum(), 1)
df_goods_netoutflow

引用文献・参考文献

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です