#284 着産業業種別比率を算出するコードを改善する

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

今回の投稿では、「着産業業種・品類品目別流動量3日間調査」のデータから着産業業種別比率を求め、各産業に配分します。

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

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. 都道府県品類別内部流動量を算出します。

今回の投稿は、上記手順の8.に該当します。

「着産業業種・品類品目別流動量3日間調査」のデータから着産業業種別比率を算出するコードを改善すると以下のようになります。

# <--- 集約品目での発着産業業種別流動量を算出する関数を定義 --->
def make_df_agg_industry(df_industry):
    df_industry = df_industry.T
    # index,columnsを指定
    index_labels = df_agg_year_pref_item.index
    column_names = df_industry.columns

    # DataFrameの形状を決定
    num_rows = len(df_agg_year_pref_item.index)
    num_cols = len(df_industry.columns)

    # すべて0.0のデータ配列を作成(float型を指定)
    # np.zerosは指定された形状の配列を0で初期化
    data = np.zeros((num_rows, num_cols), dtype=float)

    # DataFrameを作成
    df_agg_industry = pd.DataFrame(
        data, 
        index=index_labels, 
        columns=column_names
    )

    dist_unique_list = []   # 発着産業業種別流動量特有の品目名を格納するリスト
    agg_unique_list = []      # 発着産業業種別流動量になくて、新たに集約品目名となる品目名を格納するリスト
    [dist_unique_list.append(idx) for idx in df_industry.index if idx not in df_agg_year_pref_item.index]
    [agg_unique_list.append(idx) for idx in df_agg_year_pref_item.index if idx not in df_industry.index]

    # キーを集約品目名、値をその集約品目に集約される物流センサスの品目名とする辞書を作成
    agg_dict = {}
    agg_dict[agg_unique_list[0]] = dist_unique_list[:4]
    agg_dict[agg_unique_list[1]] = dist_unique_list[4:6]
    agg_dict[agg_unique_list[2]] = dist_unique_list[6:8]
    agg_dict[agg_unique_list[3]] = dist_unique_list[8:21]
    agg_dict[agg_unique_list[4]] = dist_unique_list[21:]

    # 物流センサスと集約品目名一覧で品目名が一致する品目について、業種別着量を格納
    for agg_idx in df_agg_industry.index:
        if agg_idx not in df_industry.index:
            continue
        else:
            for col in df_agg_industry.columns:
                df_agg_industry.loc[agg_idx, col] = df_industry.loc[agg_idx, col]

    # 集約品目名での発着産業業種別着量を算出
    for col in df_agg_industry.columns:
        for key in agg_dict.keys():
            sum_agg = 0
            for i in range(len(agg_dict[key])):
                sum_agg += df_industry.loc[agg_dict[key][i], col]
            df_agg_industry.loc[key, col] = sum_agg

    df_agg_industry = df_agg_industry.T
    return df_agg_industry

# 着産業業種・品類品目別流動量.csvをDataFrame形式で読み込み
df_chaku_industry = pd.read_csv("着産業業種・品類品目別流動量.csv", index_col=0)
df_chaku_industry.head()

df_agg_chaku_industry = make_df_agg_industry(df_chaku_industry)
df_agg_chaku_industry.tail()
``````python
# <--- 集約品目での発着産業業種別流動量を算出する関数を定義 --->
def make_df_agg_industry(df_industry):
    df_industry = df_industry.T
    # index,columnsを指定
    index_labels = df_agg_year_pref_item.index
    column_names = df_industry.columns

    # DataFrameの形状を決定
    num_rows = len(df_agg_year_pref_item.index)
    num_cols = len(df_industry.columns)

    # すべて0.0のデータ配列を作成(float型を指定)
    # np.zerosは指定された形状の配列を0で初期化
    data = np.zeros((num_rows, num_cols), dtype=float)

    # DataFrameを作成
    df_agg_industry = pd.DataFrame(
        data, 
        index=index_labels, 
        columns=column_names
    )

    dist_unique_list = []   # 発着産業業種別流動量特有の品目名を格納するリスト
    agg_unique_list = []      # 発着産業業種別流動量になくて、新たに集約品目名となる品目名を格納するリスト
    [dist_unique_list.append(idx) for idx in df_industry.index if idx not in df_agg_year_pref_item.index]
    [agg_unique_list.append(idx) for idx in df_agg_year_pref_item.index if idx not in df_industry.index]

    # キーを集約品目名、値をその集約品目に集約される物流センサスの品目名とする辞書を作成
    agg_dict = {}
    agg_dict[agg_unique_list[0]] = dist_unique_list[:4]
    agg_dict[agg_unique_list[1]] = dist_unique_list[4:6]
    agg_dict[agg_unique_list[2]] = dist_unique_list[6:8]
    agg_dict[agg_unique_list[3]] = dist_unique_list[8:21]
    agg_dict[agg_unique_list[4]] = dist_unique_list[21:]

    # 物流センサスと集約品目名一覧で品目名が一致する品目について、業種別着量を格納
    for agg_idx in df_agg_industry.index:
        if agg_idx not in df_industry.index:
            continue
        else:
            for col in df_agg_industry.columns:
                df_agg_industry.loc[agg_idx, col] = df_industry.loc[agg_idx, col]

    # 集約品目名での発着産業業種別着量を算出
    for col in df_agg_industry.columns:
        for key in agg_dict.keys():
            sum_agg = 0
            for i in range(len(agg_dict[key])):
                sum_agg += df_industry.loc[agg_dict[key][i], col]
            df_agg_industry.loc[key, col] = sum_agg

    df_agg_industry = df_agg_industry.T
    return df_agg_industry

# 着産業業種・品類品目別流動量.csvをDataFrame形式で読み込み
df_chaku_industry = pd.read_csv("着産業業種・品類品目別流動量.csv", index_col=0)
df_chaku_industry.head()

df_agg_chaku_industry = make_df_agg_industry(df_chaku_industry)
df_agg_chaku_industry.tail()

引用文献・参考文献

Follow me!

コメントを残す

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