GIS奮闘記

元GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Prophet で時系列解析を行い電力需要の推論値を Tableau で可視化してみよう!

さて、本日は Prophet を利用して電力需要の推論値を可視化してみようと思います。前回に引き続き今回も機械学習に関するエントリーを書いてみました。機械学習に関してはまだまだ学習中の身で拙い内容かもしれませんがこれから機械学習を始めてみようという方の一助になれたら幸いです。

今回チャレンジすること

気象情報を利用した東京都の電力需要推論

使用する機械学習ライブラリ

Prophet というライブラリを使用します。Prophet は Facebook が公開してるライブラリで、簡単に時系列予測が行え、トレンドや季節性などが構造化された結果を得ることができます。 なお、インストール前に PyStan というライブラリもインストールする必要があります。Windows 環境でのインストール方法は以下エントリーで紹介していますので、興味のある方はぜひ読んでみてください。

www.gis-py.com

使用するデータ

f:id:sanvarie:20210505060552p:plain

f:id:sanvarie:20210506105040p:plain

  • 気象データ(気象庁) ・・・以下エントリーでスクレイピングした東京都の2016年1月1日~2020年12月31日までのデータを使用します(weather.csv)。

www.gis-py.com

f:id:sanvarie:20210506104218p:plain

環境

Windows10 64bit
Python3.8.5
Tableau Desktop Public Edition 2021.1.0

手順

  1. データ加工
    1. 電力データに対する処理
      1. 電力データを一つのCSVにまとめる
      2. 「DATE」「TIME」カラムを結合して「DATE_TIME」カラムを作成
    2. 気象データに対する処理
      1. 24時を0時に変換
      2. weather.csv の 「年月日」「時間」カラムを結合して「年月日_時間」カラムを作成し weather_data.csv として CSV 出力
  2. データの確認
  3. モデルの作成
  4. モデルの評価

1.データ加工

電力データに対する処理

# -*- coding: utf-8 -*-
import os
import glob
import pandas as pd

data_dir = r"D:\data\machine learning"
file_name = "union_electricity_data.csv"

df_list = []

# 電力データ検索
for data in glob.glob(r"D:\data\machine learning/?????????.*"):
    df = pd.read_csv(data, encoding = "cp932")
    df_list.append(df)

# CSVをマージ
df_concat = pd.concat(df_list)

# DATE_TIME列作成
df_concat["DATE_TIME"] = pd.to_datetime(df_concat["DATE"].str.cat(df_concat["TIME"], sep=" "))

# 出力
df_concat.to_csv(os.path.join(data_dir, file_name), index=False, encoding = "utf-8")

以下のようになりました。

f:id:sanvarie:20210506115500p:plain

f:id:sanvarie:20210506115528p:plain

気象データに対する処理

# -*- coding: utf-8 -*-
import os
import pandas as pd

data_dir = r"D:\data\machine learning"
file_name = "weather.csv"

# CSV 読込
df = pd.read_csv(os.path.join(data_dir, file_name), encoding = "cp932")

# 24時を0時に変換
df["時間"] = df["時間"].replace(24, 0)

# 年月日_時間カラム作成
df["年月日_時間"] = df["年月日"].str.cat(df["時間"].astype(str), sep=" ") + ":00:00"
df["年月日_時間"] = pd.to_datetime(df["年月日_時間"])

# 出力
df.to_csv(os.path.join(data_dir, "weather_data.csv"), index=False, encoding = "utf-8")

以下のようになりました。

f:id:sanvarie:20210506122043p:plain

2.データの確認

加工したデータを Tableau で確認します。

f:id:sanvarie:20210507072157p:plain

2018年のデータに絞って表示してみました。これを見ると夏場と冬場に電力消費量が高くなるのがわかります。

f:id:sanvarie:20210507073319p:plain

f:id:sanvarie:20210507073452p:plain

曜日と時間帯でもデータを確認してみると、平日の日中に電力使用量が多いことがわかります。

f:id:sanvarie:20210507073806p:plain

上段が電力使用量、下段が気温です。気温が低いもしくは高いときに電力使用量が多くなる傾向にある気がしますね。

f:id:sanvarie:20210507074144p:plain

3.モデルの作成

Prophet では時刻や日時を表すカラムをds、推論したい値をyという名前に変更する必要があるので、まずはカラム名を変更します。また、ここで不要なカラムの削除と2016年~2019年のデータを学習データとして抽出します。

import pandas as pd

# 電力データを読み込み
df = pd.read_csv(r"D:\data\machine learning\union_electricity_data.csv")

# 予測に不要なカラムを削除
df = df.drop(["DATE", "TIME"], axis=1)

# 2016年~2019年のデータに絞る
df = df.query("DATE_TIME >= '2016-04-01' and DATE_TIME <='2019-12-31'")

# カラム名変更(Prophet対応)
df = df.rename(columns={"DATE_TIME":"ds","実績(万kW)":"y"})

df.head()

f:id:sanvarie:20210507075226p:plain

上記で抽出した2016年~2019年のデータを使用して2020年の電力使用量を推論し結果を CSV 出力します。

from fbprophet import Prophet

data_dir = r"D:\data\machine learning"
model = Prophet()
model.fit(df)

# 24サンプル×365日(予測したい2020年の日数)
future = model.make_future_dataframe(24*365, freq="H")

# 推論
forecast = model.predict(future)

# CSVに出力
forecast.to_csv(r"D:\data\machine learning\future.csv", index=False, encoding = "utf-8")

4.モデルの評価

前項で出力した future.csv を Tableau で可視化してみます。電力データ、気象データと結合します。

f:id:sanvarie:20210507082925p:plain

オレンジが2020年の推論値で青が実績値です。夏場と冬場に電力使用量が多くなる傾向はしっかり推論できている感じですね。

f:id:sanvarie:20210507083649p:plain

誤差の確認のため、計算フィールドとして「MAPE」を作成します。

f:id:sanvarie:20210507084046p:plain

MAPE とは

平均絶対パーセント誤差は、平均絶対パーセント偏差とも呼ばれ、統計における予測方法の予測精度の尺度です。通常、精度は次の式で定義される比率として表されます(出典:Wikipedia)。

シートのタイトルに MAPE を表示させました。MAPE=8.416%とということがわかりました。まぁ悪くはない結果でしょうか。

f:id:sanvarie:20210507092333p:plain

もう少し詳細を確認するために計算フィールドとして「誤差」を作成します。

f:id:sanvarie:20210507092657p:plain

下段が誤差の表示です。夏と冬を中心に大きな誤差が出てしまっていますね。

f:id:sanvarie:20210507092754p:plain

猛暑日や真冬日などのデータを追加して学習すればもう少し誤差を小さくすることができそうな気がします。

さいごに

Prophet を使うことで時系列解析がすごく簡単にできることがわかりました。難しいのはそこまでにどのようにデータを整備すればという部分でしょうか。今回は簡単な分析になってしまったのですが、祝日やお盆など不定期なイベントのデータを Prophet に読み込ませた方がより正確な推論ができるかと思います。あとはもっと詳細な気象データを使うことで今まで見えてこなかった傾向が見えるかもしれません。機械学習に関しては今後も本ブログで紹介したいと思います。本日は以上です。