Tableauによるデータ理解から始めるディープラーニング

皆さんこんにちは! 今回はTableauでデータを理解することから始めて、ディープラーニング(ニューラルネットワーク)による予測と連携することに挑戦していきたいと思います。題材として東京の気象情報から、東京電力の電力使用量を予測するモデルを作っていきたいと思います。

以下分析のステップです。

① データを入手する

② データの準備をする (Tableau Prep)

③ データを理解し説明変数を検討する(Tableau Desktop / Prep)

④ ニューラルネットによる予測モデルを作成する(Chainer / Python)

⑤ モデルを評価し、新たな説明変数を作成する(Tableau Desktop / Prep)

⑥ 新たな検証データで電力使用量を予測する(Chainer / Python)

早速始めていきましょう!!

① データを入手する

それでは、今回利用するデータをダウンロードしましょう。以下リンクを利用します。

電力使用量実績 (東京電力)

気象情報(気象庁)

② データの準備をする (Tableau Prep)

電力消費量、気象情報共に一度にダウンロード出来るデータ量に限りがあるため、数回に分けてダウンロードし、Tableau Prepで複数ファイルをユニオンした後、タイムスタンプで気象情報と電力情報を結合します。それぞれ1日1時間の単位で計測されているのでTableau Prepで簡単にデータを結合できます。本当に簡単なのでステップは省略します。

③ データを理解し説明変数を検討する(Tableau Desktop / Prep)

それでは早速データを可視化して、理解していきましょう!

下のグラフの上段が2018年一年間の電力使用量(青色)、下段が気温の変化(緑色)です。平均気温から離れる(暑いまたは寒い)ときに電力使用量が増えることが分かります。ですので、気温は説明変数として電力の予想に利用できそうですね。

Tableau で可視化することで時間帯、曜日(平日・土日)によって電力利用量に差があることもわかります。平日の日中は色が濃いので電力の使用量が多いということになります。

④ ニューラルネットによる予測モデルを作成する

ここからはJupyter Notebookを使用して作業を行います。今回は株式会社キカガクさん講習で学んだ内容をもとに、Chainerを使ってニューラルネットワークのモデルを作成し電力利用量を学習させます。Pythonコードの詳細な説明については省略させていただきますが、Chainerのインストール方法については、こちらの資料や株式会社キカガクさんのトレーニングコースを参照ください。

では、2018年1年間の1時間おきの気温、降水量、日照時間、気圧、湿度と電力使用量を教師データとして利用するためPandasのデータフレームに読み込みましょう。

訓練データの準備を行います。

Chainerをインポートします。

ニューラルネットのクラスを定義します。

中間層のノード数、バッチサイズを変化させながら誤差の変化を確認します。

↓トレーニングを実行し、エポック数が進むごとに誤差が減っていく様子

色々とハイパーパラメータを変えてみてエポック数(何回データを総なめして学習したか)が進むごとにどれだけ学習できたか(誤差が減ったか)をグラフにします。値が低くなっているほど誤差が小さくなり、学習が進んだことを表します。

このように、ニューラルネットワークのハイパーパラメータ・チューニングを色々やってみて、バッチサイズを5、LeRU関数(活性化関数)を利用する、中間ノードの数を20とするときに平均二乗誤差(平方根)が最も小さくなる(637) になることが分かりましたので、ハイパーパラメータのチューニングの結果としてはこの設定が良い感じのようです。

 モデルを評価し、新たな説明変数を作成する(Tableau Desktop / Prep)

2018年の訓練データ全体に、ニューラルネットで予測した予測値を列としてデータフレームの一番右端に追加しCSV形式で出力します。

Tableau で可視化します。青色が実績で、オレンジが予測です。実績と予測の動きに大きな乖離が見られますね。結構頑張ってニューラルネットワークのハイパーパラメータをチューニングしてみましだが、気象情報をそのまま使っても、当てはまりの良い予測モデルはできていないようです。

パッと見ても予測値と実測値が乖離していることが分かるのですが、どれくらい当てはまっているかをRMSE(Root Mean Square Error)という指標を使って数値化しましょう。

定義はこういった形になりますが、ざっくりいうと、それぞれのデータの誤差を全部足して平均したようなもの(小さいほど誤差が少ないということ)です。

Tableau で同じことを計算しちゃうこともできて、こんな感じになります。

ちなみに、最初のトライ(気象データをそのまま使う)ではRMSE=638.2でした。これを何とか減らしていけるよう頑張ってみましょう!

ここで、①の データの理解 に戻り、気温が平温より高い、または低い時に電力消費が上がる(おそらく暖房、冷房を利用するのだろう・・・という)ことが想像出来るため、仮に摂氏20度からの気温の差異の絶対値を説明変数として加えてみましょう。

Tableau Prepで摂氏20度からの差異の絶対値を作成します。これを説明変数としてニューラルネットに入れます。

再度できあがった予測モデルを可視化してみます。青い線(実測値)だとオレンジ色の線(予測値)がだいぶ近くなってきました。RMSE=507.3 となりました。

電力の利用量は時間帯に依存することが分かっていますので、時間帯を切り出してこれを説明変数に加えて同じハイパーパラメータ条件で予測モデルを作成します。

可視化します。更に当てはまりが良くなりました。 RMSE=448.4 です。

もう一歩モデルの精度を追求していきましょう。誤差を計算式として作成し、日付別で誤差の大きな日付を確認します。

可視化を行うと、周期的に実績が予測を下回るように見受けられます。これはどうしてでしょうか?

ここに土日かどうかを表す「土日フラグ」を作成してオレンジ色で着色してみます。

すると、やはり土日については実績が予測より下回っている(誤差がマイナスになっている)ことが分かります。

また、正月、ゴールデンウィークについても実際の電力消費量は予測より少ないことが分かります。このことから、土日以外にも祝日をカレンダーとして持たせて祝日フラグを作成し判別させるようにした方が良さそうです。

ということで、以下のようなカレンダーテーブルを作成し、Tableau Prep を使って祝日休日フラグを作成します。

Tableau Prepでカレンダーテーブルを外部結合し、土日または祝日に該当する日を識別するフラグを作成します。

下のグラフで上段が祝日フラッグ無しの場合、下段が祝日フラッグ有の場合の誤差です。全体的に日付ごとの誤差が小さくなっていることが分かりますね。

もう一度予測モデルを作って可視化します。全体的に青色(実績)とオレンジ色(予測)がシンクロしている様子が見られます。RMSE=296.5 まで落ちました!

⑥ 新たな検証データで電力使用量を予測する(Chainer / Python)

では、ここで良い感じのモデルができたところで、2018年のモデルを使って2019年の電力需要予測も実施してみましょう。

今まで色々なデータ加工を行ってきましたが、同じことを新たなデータに対して同じ順番で実施するのは結構大変ですね。でも、Tableau Prep を使えば、データ結合、計算式、フラグの作成がすべて終わった段階で、最終的に日付を2019年にフィルタするブランチ(枝分かれ)を作って出力するだけで2019年の検証データが作成できます。

さて、2018年のデータをもとに作成した予測モデルに、2019年のデータを投入し予測値を得ます。

同様に可視化を行います。このブログを書いている時点では、2019年6月1日までのデータしかありませんが、ほぼ予測値がほぼ実績値と一致しており、2018年のデータを使った予測モデルで2019年の電力消費量が予測できていることが分かりました。

2018年の予測モデルを使って2019年の予測もそこそこの精度が出ていますので、2018年の訓練データに対して過学習している(あまりに訓練データに真面目に適合しすぎて新しいデータには応用が利かない状態になっている)ということもなさそうです。RMSE=330.2 です。

以上、ディープラーニング(ニューラルネットワーク)を使った電力使用量の予測を行いましたが、より良い精度のモデルを作るためには、モデルのハイパーパラメータをチューニングするのと同時に、データを理解して、良い感じの特徴量をモデルに投入することがとても大事だということがわかりました。

ディープラーニングを利用すると、非常に精度の高いモデルが作れると思いました。しかし何が功を奏しているのか説明するのが難しくて色々と試行錯誤してみるしかなくて、正しいドメイン知識も必要になるんだなぁと感じました。

今回は検証しませんが、1週間先の天気予報が分かれば未来の電力需要が予測できそうです。気温の他にも、降雪日や猛暑日フラグ、主要工場の稼働時間等新たな説明変数を組み合わせると更に精度の高いモデルができるかもしれませんね!

以上、参考になれば幸いです。

※ 今回のブログ作成にあたり、株式会社キカガクの 酒井 健三郎さん、一花 徳行さんに多大なるご協力とご指導いただきました。本当にありがとうございました!!

返信を残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください