見出し画像

都道府県別エネルギー消費統計のデータ処理

はじめに

データ分析の分野では、生のデータを取り扱い、有意義な情報を抽出することが重要です。本ブログでは、Pythonを活用して、日本の都道府県別のエネルギー消費統計データを処理し、分析する高度な手法を紹介します。このプロセスでは、Pandas、Numpy、およびその他のユーティリティが使用されます。

今回は研究の効率を向上させることを目的に、都道府県別エネルギー消費統計を辞書型で保存するコードを作成しました。

必要なライブラリのインポート

import pandas as pd
import numpy as np
import os
import glob
import re
  • pandas: データフレーム操作に不可欠

  • numpy: 数値計算のため

  • os, glob, re: ファイル操作と正規表現マッチングに使用

データ抽出関数の定義

def extract_data_to_dict(file_path):
    # 特定のセル範囲を定義(この例ではA81からAB128)
    start_row = 80  # A81に相当(Pythonは0から数えるので80)
    end_row = 128
    start_col = 'A'
    end_col = 'AB'

    # pandasを使ってExcelファイルから特定の範囲を読み込む
    df_specific_range = pd.read_excel(file_path, sheet_name='21FY', skiprows=start_row, nrows=end_row - start_row,
                                      usecols=f"{start_col}:{end_col}")

    # カラム名を設定
    column_names = [
        '産業コード', 'Final Energy Consumption', None, 'name', '名前', None,
        '100', '150', '200', '250', '250A', '250B', '250C', '400', '450', '500', '550', '600', '700', '800', None,
        '900', '910', '920', None, '940', '960', '999'
    ]

    # DataFrameのカラム数をcolumn_namesの長さに合わせる
    if len(df_specific_range.columns) > len(column_names):
        df_specific_range = df_specific_range.iloc[:, :len(column_names)]
    elif len(df_specific_range.columns) < len(column_names):
        extra_cols = [None] * (len(column_names) - len(df_specific_range.columns))
        column_names = column_names[:len(df_specific_range.columns)] + extra_cols

    df_specific_range.columns = column_names

    # すべての要素がNaNの行と列を削除
    df_specific_range = df_specific_range.dropna(how='all').dropna(how='all', axis=1)

    # DataFrameを辞書に変換
    data_dict = {}
    for i in range(len(df_specific_range)):
        industry_code = df_specific_range.iloc[i, 0]
        data_dict[industry_code] = {}
        for j, col_name in enumerate(df_specific_range.columns):
            if col_name is not None:  # Noneでないカラム名のみを含める
                data_dict[industry_code][col_name] = df_specific_range.iloc[i, j]

    return data_dict

ここで、都道府県別のエネルギー消費統計ファイルを読み込みます。

  1. 範囲の定義: 最初に、データを読み込むExcelシートの特定の範囲を定義します。この例ではA81からAB128までの範囲を指定しています。

  2. データ読み込み: pd.read_excelを使用して、指定した範囲のデータを読み込みます。ここでsheet_nameskiprowsnrowsusecolsパラメータを適切に設定して、必要なデータのみを取得します。

  3. カラム名の設定: 事前に定義したカラム名のリストを使用してDataFrameのカラムに名前を付けます。DataFrameのカラム数とカラム名リストの長さが異なる場合、適宜調整を行います。

  4. 不要な行列の削除: dropnaメソッドを使用して、すべての要素がNaNの行と列を削除します。

  5. 辞書への変換: DataFrameの各行をループして、産業コードをキーとする辞書を作成します。各産業コードに対して、対応するカラムのデータを辞書に格納します。

データ集計のための辞書

  • prefecture_dict: 都道府県コードと地域名のマッピング

  • industry_code_list: 産業コードと産業名のマッピング

  • energy_type_dict: エネルギー種類コードとエネルギー種類名のマッピング

これらの辞書を使用して、データを構造化します。

集計関数の定義

def sum_energy_consumption(prefecture_dict, industry_code_list, energy_type_dict, energy_barance_dict):
    # 結果を格納するための辞書を初期化
    result_dict = {}

    # 都道府県コードをキーとして、各都道府県のデータを処理
    for prefecture_key, prefecture_value in prefecture_dict.items():
        # 地域名を第一のキーとして使用し、辞書を初期化
        if prefecture_value not in result_dict:
            result_dict[prefecture_value] = {}

        # 産業コードごとに処理
        for industry_code_key, industry_code_value in industry_code_list.items():
            # 産業名を第二のキーとして使用し、辞書を初期化
            if industry_code_value not in result_dict[prefecture_value]:
                result_dict[prefecture_value][industry_code_value] = {}

            # エネルギー種類ごとに処理
            for energy_type_key, energy_type_value in energy_type_dict.items():
                # エネルギー種類名を第三のキーとして使用し、辞書を初期化
                if energy_type_value not in result_dict[prefecture_value][industry_code_value]:
                    result_dict[prefecture_value][industry_code_value][energy_type_value] = 0

                # 実際の集計処理
                # 現在の都道府県の、特定産業の、特定エネルギー種類の値を加算
                result_dict[prefecture_value][industry_code_value][energy_type_value] += energy_barance_dict[prefecture_key].get(industry_code_key, {}).get(energy_type_key, 0)

    return result_dict

この関数は、エネルギー消費量を都道府県、産業、エネルギー種類ごとに集計します。

以下のステップでデータを集計します。

  1. 結果の初期化:最終的な集計結果を格納するための辞書result_dictを初期化します。

  2. 都道府県のループprefecture_dictを用いて、すべての都道府県に対してループを行います。各都道府県に対して、対応する地域名をキーとする辞書をresult_dict内に作成します。

  3. 産業コードのループ:次に、各産業コードに対してループを行います。各産業に対して、対応する産業名をキーとする辞書を都道府県の辞書内に作成します。

  4. エネルギー種類のループ:さらに、各エネルギー種類に対してループを行います。各エネルギー種類に対して、対応するエネルギー種類名をキーとする辞書を産業の辞書内に作成します。

  5. 集計処理:最後に、各都道府県のデータ(energy_barance_dict)から、該当する都道府県、産業、エネルギー種類のデータを取得し、対応する場所に加算します。存在しないデータは0として扱われます。

この関数を使用することで、日本全国の都道府県別、産業別、エネルギー種類別のエネルギー消費量を簡単に集計できます。集計されたデータは、さらなる分析や可視化の基礎として使用することが可能です。

完成されたコード

import pandas as pd
import numpy as np
import os
import glob
import re

def extract_data_to_dict(file_path):
    start_row = 80  # A81から始まるため、80を指定(0-indexed)
    end_row = 128
    start_col = 'A'
    end_col = 'AB'

    # 特定の範囲のデータを読み込む
    df_specific_range = pd.read_excel(file_path, sheet_name='21FY', skiprows=start_row, nrows=end_row - start_row,
                                      usecols=f"{start_col}:{end_col}")

    column_names = [
        '産業コード', 'Final Energy Consumption', None, 'name', '名前', None,
        '100', '150', '200', '250', '250A', '250B', '250C', '400', '450', '500', '550', '600', '700', '800', None,
        '900', '910', '920', None, '940', '960', '999'
    ]

    # DataFrameのカラム数を調整
    if len(df_specific_range.columns) > len(column_names):
        df_specific_range = df_specific_range.iloc[:, :len(column_names)]
    elif len(df_specific_range.columns) < len(column_names):
        extra_cols = [None] * (len(column_names) - len(df_specific_range.columns))
        column_names = column_names[:len(df_specific_range.columns)] + extra_cols

    df_specific_range.columns = column_names

    df_specific_range = df_specific_range.dropna(how='all').dropna(how='all', axis=1)

    data_dict = {}
    for i in range(len(df_specific_range)):
        industry_code = df_specific_range.iloc[i, 0]
        data_dict[industry_code] = {}
        for j, col_name in enumerate(df_specific_range.columns):
            if col_name is not None:
                data_dict[industry_code][col_name] = df_specific_range.iloc[i, j]

    return data_dict

# 全てのExcelファイルを読み込む
file_list = glob.glob('都道府県別エネルギー消費統計/*.xls')

energy_barance_dict = {}
for file_path in file_list:
    pref_num = re.search(r'\d+', os.path.basename(file_path)).group()
    energy_barance_dict[pref_num] = extract_data_to_dict(file_path)

# 都道府県、産業コード、エネルギー種類の辞書
prefecture_dict = {
    "01": "hokkaido", ... , "47": "okinawa"
}
industry_code_list = {
    610000: "農林水産工業", ..., 800000: "運輸"
}
energy_type_dict = {
    "100": "coal", ..., "800": "heat"
}

# 集計関数
def sum_energy_consumption(prefecture_dict, industry_code_list, energy_type_dict, energy_barance_dict):
    result_dict = {}
    for prefecture_key, prefecture_value in prefecture_dict.items():
        if prefecture_value not in result_dict:
            result_dict[prefecture_value] = {}
        for industry_code_key, industry_code_value in industry_code_list.items():
            if industry_code_value not in result_dict[prefecture_value]:
                result_dict[prefecture_value][industry_code_value] = {}
            for energy_type_key, energy_type_value in energy_type_dict.items():
                if energy_type_value not in result_dict[prefecture_value][industry_code_value]:
                    result_dict[prefecture_value][industry_code_value][energy_type_value] = 0
                result_dict[prefecture_value][industry_code_value][energy_type_value] += energy_barance_dict[prefecture_key].get(industry_code_key, {}).get(energy_type_key, 0)
    return result_dict

# 最終的な集計結果
final_result = sum_energy_consumption(prefecture_dict, industry_code_list, energy_type_dict, energy_barance_dict)

このスクリプトは、データの読み込みから始まり、データの整形、そして都道府県、産業、エネルギータイプごとの集計を行います。最終的な集計結果は final_result 変数に格納されます。データのパスやシート名、必要な辞書の内容などは、実際のデータセットに応じて適宜調整してください。

by CHATGPT

画面には複雑なデータチャートやグラフが映し出されており、周囲にはエネルギー消費や統計に関連する書籍や文書が散らばっています。このシーンは、日本の各地域のエネルギー消費を表すデータの視覚化とともに、深い分析と集中を伝えています。

この記事が気に入ったらサポートをしてみませんか?