1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【電力需要予測】EDA(電力需要、天気、日付)

Last updated at Posted at 2025-12-02

この記事は「【リアルタイム電力予測】需要・価格・電源最適化ダッシュボード構築記」シリーズの三日目です
Day1はこちら | 全体構成を見る

今回は、前回までに作成した 電力消費量・気象情報・日付情報を統合したデータセットを使って、探索的データ解析(EDA)を行います。

今回はインタラクティブなグラフが描けるplotlyを利用していきます。
使用する all_data は、2016年4月〜2025年3月 の 9 年分を 30 分間隔でまとめたDataFrameになっています。
スクリーンショット 2025-11-29 150317.png

箱ひげ図で分布をざっくりつかむ

箱ひげ図を描画して、長期の水準・ばらつき・極端な値の有無をざっくり把握します。

年ごとの電力消費量

fig = px.box(all_data, x="year", y="realized_demand", title="年別の電力消費量(箱ひげ図)")
fig.update_xaxes(tickvals=list(range(2016, 2026)))
fig.show()

スクリーンショット 2025-11-29 145910.png

  • おおよそ 20〜60のレンジに電力消費量が収まっています
  • 特に 2022 年は外れ値が多く、他の年に比べて極端に高い需要の時間が多いように見えます
  • 2025 年は 1〜3 月のみのため、レンジが狭く見える点に注意が必要です

月ごとの電力消費量

fig = px.box(all_data, x="month", y ="realized_demand", title="月別の電力消費量(箱ひげ図)")
fig.update_xaxes(tickvals=list(range(1, 13)))
fig.show()

スクリーンショット 2025-11-29 150010.png

  • 月ごとに見ると、最大値は夏と冬に高く、春〜秋にかけて下がっています
  • 一方で、最低値はどの月もそれほど変わらないのが興味深いです
    • 「最低限のベース需要」はそれほど季節で変わらず、冷暖房などによる ピーク側の上振れが季節によって変動していると解釈できます
  • 外れ値レベルの高需要は 6 月に多いです
    → 梅雨時の蒸し暑さなどで冷房需要が急に高まる日が多いのかもしれないです

月ごとの気温(箱ひげ図)

fig = px.box(all_data, x="month", y ="temperature", title="月別の気温(箱ひげ図)")
fig.update_xaxes(tickvals=list(range(1, 13)))
fig.show()

スクリーンショット 2025-11-29 155842.png
気温は教科書的な 冬低く・夏高いパターンで描いています。

年別推移(折れ線グラフ)

さて、ここからは時系列としての流れも見ていきたいので月別の平均を取っていきます。

月別平均の作成

monthly_avg = (
    all_data.groupby(["year", "month"])[["realized_demand", "temperature", "humidity", "wind_speed", "sunshine_observed", "solar_radiation"]].mean().reset_index()
)

スクリーンショット 2025-11-29 150459.png

可視化関数

def plot_monthlyavg(object):
    fig = px.line(
        monthly_avg,
        x="month",
        y=object,
        color="year",
        title=f"月別時系列推移: {object}",
    )
    # x軸を時間として設定
    fig.update_xaxes(tickvals=list(range(1, 13)))
    fig.show()
plot_monthlyavg("realized_demand")
plot_monthlyavg("temperature")
plot_monthlyavg("humidity")
plot_monthlyavg("wind_speed")
plot_monthlyavg("sunshine_observed")
plot_monthlyavg("solar_radiation")

電力消費量

スクリーンショット 2025-11-29 161202.png

  • 電力消費量は 夏と冬に山があり、春と秋は谷になる典型的な二峰性が見られます
  • 春と秋を比べると、春のほうが全体的に需要が低いです
    → 暖房も冷房も弱くなり、「一年でいちばん電気を使わない季節」という印象

気温

スクリーンショット 2025-11-29 161510.png

  • 夏に向かって滑らかに上昇し、ピーク後に下がっています
  • 年ごとの差はそこまで大きくないようです

湿度

スクリーンショット 2025-11-29 161546.png

  • 気温と同様に夏へ向けて上昇するが、年ごとの差(ジグザグ)がやや大きいです
  • 梅雨〜台風シーズンの影響が年ごとに違う印象を受けます

風速

スクリーンショット 2025-11-29 161617.png

  • 春〜夏にかけて風速が高く、秋〜冬はやや落ち着いています
  • 春一番や台風などの影響が反映されていそうな形です

日照時間

スクリーンショット 2025-11-29 161638.png

  • 日照時間は 夏前後で高く、秋で一段落ちています
  • 今年の7月など、特定の年だけ日照時間が極端に短い月もあり、冷夏などの影響が見えやすいです(冷夏だったっけ)

全天日射

スクリーンショット 2025-11-29 161743.png

  • 全天日射とは、全天日射は地表面が受け取るすべての太陽光を指しています(参考:日射・赤外放射について よくある質問)。つまり、太陽光の強さになります
  • 春〜夏にかけて高く、冬にかけて下がっています
  • こちらはのちのち「太陽光の強さ」として、太陽光発電の上限を決める重要な指標になります

月別推移(折れ線グラフ)

ここからは、一日の中の時間帯パターンと曜日パターンに着目します。

曜日×時間の平均電力消費量

week_mapping = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5: "Sat", 6: "Sun"}
all_data["week_str"] = all_data["week"].map(week_mapping)
weekly_avg = all_data.groupby(["week_str", "hour"])["realized_demand"].mean().reset_index()

スクリーンショット 2025-11-29 164210.png

可視化関数

def plot_hourly(df, object_x, object_y, color):
    fig = px.line(
        df,
        x=object_x,
        y=object_y,
        color=color,
    )
    fig.update_xaxes(tickvals=list(range(1, 25)))
    fig.show()

曜日別の時間帯推移

plot_hourly(weekly_avg, "hour", "realized_demand", "week_jp")

スクリーンショット 2025-11-30 085229.png

  • 平日(月〜金)はほぼ同じ形状をしています
    → 朝に上がり、日中も高止まりし、夜にかけてなだらかに下がっています
  • 土日(Sat, Sun)は明らかに水準が低いです
    → 工場・オフィスなどの産業需要が落ちるため、平日 vs 休日でパターンがはっきり分かれています

振替休日フラグの導入

祝日の振替休日が平日に来るパターンも補足したいので、フラグを作成します。

# 平日かつ祝日である日に7というフラグを立てる
all_data.loc[(all_data["week"] < 5) & (all_data["is_holiday"] > 0), "week"] = 7
week_mapping = {0: "Mon", 1: "Tue", 2: "Wed", 3: "Thu", 4: "Fri", 5: "Sat", 6: "Sun", 7: "sub_holi"}
all_data["week_jp"] = all_data["week"].map(week_mapping)
weekly_avg = all_data.groupby(["week_jp", "hour"])["realized_demand"].mean().reset_index()

スクリーンショット 2025-11-30 085302.png

  • 「振替休日(sub_holi)」は 土日とほぼ同じ形状をしています
  • ただし完全に重なるわけではなく、若干土曜寄りの水準です
    → 一部の業種では稼働していることが反映されていると考えられます

月 × 時間の平均電力消費量

hourly_avg = all_data.groupby(["month", "hour"])["realized_demand"].mean().reset_index()
plot_hourly(hourly_avg, "hour", "realized_demand", "month")

スクリーンショット 2025-11-29 164749.png

  • 月によって、日中に山型になる月と、逆にへこむ月があります
  • 「夏は日中に山」「冬は昼間に一度落ちて朝晩に山」がありそうだ、という仮説が立ちます

以下にその傾向を分かりやすくしてみました。

季節分類による整理

# 季節で色分けのルールを設定
def categorize_season(month):
    if month in [12, 1, 2]:  # 冬
        return 'winter'
    elif month in [6, 7, 8, 9]:  # 夏
        return 'summer'
    else:  # 春秋
        return 'spring and autumn'

hourly_avg["season"] = hourly_avg["month"].apply(categorize_season)
season_hour_avg = hourly_avg.groupby(['season', 'hour'])['realized_demand'].mean().reset_index()

plot_hourly(season_hour_avg, "hour", "realized_demand", "season")

※9月も暑いよねということで夏も9月に入れました
スクリーンショット 2025-11-29 165039.png

  • 夏(summer): 日中に大きな山 → 冷房需要が支配的です
  • 冬(winter): 朝と夜に山、日中に谷 → 通勤前後の暖房、帰宅後の家庭需要が強いです
  • 春秋: 全体的に水準が低く、ピークも穏やかです

散布図

いろいろ見てきましたが、、電力消費量と各気象要素の関係、および 特徴量同士の関係を散布図で見てみましょう。

# 季節で色分けのルールを設定
def categorize_season(month):
    if month in [12, 1, 2]:  # 冬
        return 'winter'
    elif month in [6, 7, 8, 9]:  # 夏
        return 'summer'
    elif month in [3, 4, 5]:
        return 'spring'
    else:
        return 'autumn'

season_colors = {
    "spring": "yellow",
    "summer": "red",
    "autumn": "blue",
    "winter": "purple"
}

monthly_avg["season"] = monthly_avg["month"].apply(categorize_season)
def plot_scatter(object_1, object_2):
    fig = px.scatter(
        monthly_avg,
        x=object_1,
        y=object_2,
        color="season",
        color_discrete_map=season_colors,
        title=f"散布図: {object_1} and {object_2}",
    )
    # グラフを正方形に設定
    fig.update_layout(
        width=600,  # 正方形の幅
        height=600,  # 正方形の高さ
    )
    fig.show()
plot_scatter("realized_demand", "temperature")
plot_scatter("realized_demand", "humidity")
plot_scatter("temperature", "humidity")
plot_scatter("realized_demand", "wind_speed")
plot_scatter("realized_demand", "sunshine_observed")
plot_scatter("realized_demand", "solar_radiation")

電力消費量 × 気温

スクリーンショット 2025-11-30 085340.png

  • 気温が低すぎる時・高すぎる時の 両方で消費量が高くなる U 字型の関係が見えます

  • 相関係数(線形の結びつき)を計算すると小さく見えてしまう点に注意が必要です

correlation = all_data[["temperature", "realized_demand"]].corr()
print(f"気温と電力消費量の相関係数:\n{correlation}")
気温と電力消費量の相関係数:
                 temperature  realized_demand
temperature         1.000000         0.091843
realized_demand     0.091843         1.000000

電力消費量 × 湿度

スクリーンショット 2025-11-30 085418.png

  • 気温ほど強くはないが、ある程度の傾向は見えます
  • ただし、湿度は気温と連動している部分も大きく、気温とセットで考えるか、どちらか一方で代表させる選択もあり得ます

気温 × 湿度

スクリーンショット 2025-11-30 085451.png

  • 夏季(red)で気温・湿度ともに高い点が密集しており、
  • 特徴量同士がかなり依存している(=多重共線性の可能性)ことが分かります
  • 線形モデルを使う場合は、気温だけにしたほうが良さそうです

電力消費量 × 風速

スクリーンショット 2025-11-30 085513.png

電力消費量 × 日照時間

スクリーンショット 2025-11-30 085540.png

電力消費量 × 全天日射

スクリーンショット 2025-11-30 085612.png

  • 風速・日照時間・全天日射は、電力消費量との 直接の関係はあまり強くなさそうに見えます
  • 一方で、これらは 再エネ発電量(特に太陽光)の上限を決める特徴量としては重要になる可能性があります
    → 「需要予測」よりも、「供給側(PV・風力)の予測」に効いてきます

まとめ

今回の EDA から、電力需給予測に向けて次のような知見が得られました。

季節性の影響

  • 電力需要は明確な季節性を持ち、夏と冬にピーク、春と秋に谷という二峰性を示す
  • 夏は冷房、冬は暖房に起因する需要が大きいと考えられる

平日・休日の違い

  • 土日・祝日は平日より明確に需要が低い
  • 工場やオフィスを中心とした産業需要が落ち、家庭需要が相対的に支配的になるためと考えられる
  • 振替休日も土日と近いパターンを取り、カレンダー特徴量の重要性が再確認できた

時間帯による変動

  • 夏は 日中に大きなピーク、冬は 朝と夜にピーク・昼間に谷になる
  • 日中の産業活動・帰宅後の家庭需要・暖房のオンオフなどが混ざった結果として理解できる

気象特徴量との関係

  • 気温と需要は U 字型の関係にあり、線形相関係数だけでは関係が弱く見えてしまう
  • 湿度などは気温と強く結び付いており、多重共線性の観点で整理が必要
  • 風速・日照時間・全天日射は、需要よりも供給側(再エネ)のモデルで効いてきそう

明日

次回は、これらの知見を踏まえつつ、LightGBMを用いた需要予測モデルの構築に進んでいきたいと思います!:fist_tone1:

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?