3
5

More than 3 years have passed since last update.

2日後の電力使用量を予測してCSVで公開してみる

Last updated at Posted at 2020-09-02

はじめに

色々なところで機械学習を用いた電力使用量の予測方法についてレクチャーをしてきましたが、実際に予測した値はそんなに当ってないんじゃない?とか所詮はPoCでしょ?とか、様々なご意見を頂きましたので、実際に予測した値をCSVで公開して、その実力のほどを検証してもらおうかなと...

予測方法

過去に複数の方法で予測する例をQiitaの記事として公開しているので、ご覧下さい。

電力使用量予測 with Keras (TensorFlow)

予測対象

中国電力エリアにおける2日後の電力使用量を予測します。

予測結果の検証

2日後の予測結果をWebサイトにて公開し、中国電力さんの公開されている電力使用量の実績と比較できるようにしています。

https://blueomega.jp/20200811_power_prediction_challenge/yyyy-mm-dd_.csv
※ yyyy-mm-ddには予測対象の年月日が入ります。

2020年9月2日であれば、以下のURLとなります。
https://blueomega.jp/20200811_power_prediction_challenge/2020-09-02_.csv

以下のスクリプトをColaboratory上で実行すると比較ができます。

import datetime as dt
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score

# 中国電力エリアの前日までの実績データを取得
url = "https://www.energia.co.jp/nw/jukyuu/sys/juyo-2020.csv"
df_juyo = pd.read_csv(url, skiprows=2, encoding="Shift_JIS")
df_juyo.index = pd.to_datetime(df_juyo["DATE"] + " " + df_juyo["TIME"])

# 中国電力エリアの当日の実績データを取得
d = dt.datetime.now() + dt.timedelta(hours=9) - dt.timedelta(days=0)
url = "https://www.energia.co.jp/nw/jukyuu/sys/juyo_07_" + d.strftime("%Y%m%d") + ".csv"
df_tmp = pd.read_csv(url, skiprows=13, encoding="Shift_JIS",nrows=24)
df_tmp.index = pd.to_datetime(df_tmp.DATE + " " + df_tmp.TIME)

# 8月31日以降の予測データを取得
df = pd.DataFrame()
d = dt.datetime(2020,8,31)
while d < dt.datetime.now() + dt.timedelta(days=3):
  try:
    url = "https://blueomega.jp/20200811_power_prediction_challenge/" + d.strftime("%Y-%m-%d") + "_.csv"
    df = pd.concat([df, pd.read_csv(url)])
  except:
    print("No file.")
  d += dt.timedelta(days=1)

df.index = pd.to_datetime(df.pop("datetime"))

# 前日までの実績値を反映
df["act"] = df_juyo["実績(万kW)"]

# 当日の実績値を反映
for idx in df_tmp[df_tmp["当日実績(万kW)"] > 0].index:
  df.loc[idx, "act"] = df_tmp.loc[idx]["当日実績(万kW)"]

# 予測と実績を可視化
df_plot = df.copy()
df_plot = df_plot[["act", "y2"]]
df_plot.columns = ["act", "pred tuned"]

df_plot["2020-08-31":].plot(figsize=(15,5), ylim=(300,1200))
plt.show()

# 決定係数
df_scr = df[df.act > 0]
print("決定係数(R2 SCORE) : ", r2_score(df_scr.act, df_scr.y2))

9月3日 5時時点の実行結果です。
Unknown-2.png
決定係数(R2 SCORE) : 0.9494716417755021

予測値は毎日1:00と12:00に更新されますので、ご興味のある方はご覧下さい。
また、同じように予測するという力が業務に必要な方からのご連絡もお待ちしております。

追記

9月4日 6時時点の実行結果です。
Unknown-3.png
決定係数(R2 SCORE) : 0.9454478929760703

ちょっと悪くなったかな...

3
5
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
3
5