ブログ

Blog

絞り込んで表示する

2018.6.18 - 

電力需要予測をMAGELLAN BLOCKSでやってみた(1)

Groovenautsコンサルタントの吉村です。
今回はMAGELLAN BLOCKSのドキュメントに含まれる数値回帰のチュートリアルを少し手順を変えてやってみました。
このブログの手順を見ていただければ、機械学習で需要予測を行うことが簡単だと理解していただけると思います。

おそらく長くなるので4回に分かれます。


せっかくなので最初の記事で書いた下記の流れで進めましょう。

  1. 課題をブレイクダウンし問題を式にする
  2. 何を予測・判定するのか決定する
  3. 業務での使い方を考える
  4. データを準備する
  5. 学習・予測・評価する

1.課題をブレイクダウンし問題を式にする

まず誰がなんの為にやるかということからなりきってみます。
例えば電力会社の人が無駄な発電を減らしたいと考えています。


2.何を予測・判定するのか決定する

a) 何を予測するかとアクションをセットで考える
電力需要を予測し無駄な発電を減らしてコスト削減ができます。

b) 予測したいものが何単位かを考える
今回は1日ごとの1つの電力会社全体で供給する電力量を予測します。

c) 予測したいものに影響しうるもの・ことを考える
電力は人間の行動により利用されます。
人間はカレンダーで行動するので、月・曜日・休みかどうかが影響するでしょう。
また空調を使うので最高気温、最低気温なども必要です。
暗くなれば照明も使うので1日の陽の長さも必要になります。


3.業務での使い方を考える

発電は原子力・火力・揚力・風力などありますが、それぞれ自然環境からの影響など特徴があります。電力需要の予測値をもとに翌日どの種類のど発電所で発電するかバランスを担当者が決めて制御する。(これは出来たらいいなという個人的な想像です)
翌日の需要がわかればいいので天気の情報は天気予報が使えます。


4.データを準備する

それではデータの準備にかかります。
これまでの内容から今回データの作る形式はこの様にしようと思います。

  • key:日付
  • month:月(1〜12のいずれか)
  • weekday:曜日(0〜6のいずれか)
  • holiday:休日(土日または祝日の時に1、それ以外の時に0)
  • weather:晴れとか雨とかいわゆる天気の種類
  • max_temp:最高気温
  • min_temp:最低気温
  • rainfall:降水量
  • daytime:1日の日の長さ(日の入りの時刻から日の出の時刻を引きます)
  • actual:日毎の電力需要実績

それぞれのデータはこちらから準備します。

日付、月、曜日、休日 → 自分で作る
天気関係 → 気象庁のサイトからデータをダウンロードして使う
日の長さ → 天文台のサイトからデータをダウンロードして使う
電力需要 → 東京電力パワーグリッドのサイトからデータをダウンロードして使う


ここでデータの制約がでてきます。
というのも電力需要だけ2016年4月からしか公開されていないためです。
この記事を書いている2018年6月時点で収集できるデータということで、「2016年4月1日〜2018年6月16日」のうち26ヶ月のデータをトレーニングに利用しようと思います。

集めて加工する手順ですが、チュートリアルではフローデザイナーを利用し、BigQueryを使ってデータ加工をしています。
今回はGoogleスプレッドシートとMAGELLAN BLOCKSに含まれるData Editorを利用してみます。




まずはベースとなるデータのシートを準備します。
ここには前述のデータ形式で最初に日付と中身の列だけ入力しています。

日付の列は最初の行に 2016-04-01 として後は +1 ずつしました。

★ここで日付に関するデータを扱う際の非常に重要なポイントです。

書式を YYYY-MM-DD にします。

日付を見るのは人間ですがデータとして扱うのはコンピューターです。
コンピューターは上記以外の形の日付が苦手です。この形はISOでも定義されておりまず問題ないです。(これ以外の形でデータを提供する団体が多すぎて大変残念です)

適切に日付の形式にしておけば後でグラフにする、月ごとに集計する曜日ごとに集計するなどの際にストレスなく利用できます。
逆に日付として取り扱えない形になっていると再利用時のストレスが非常に大きくなります。

それでは続いて残りの列のデータを準備していきます。

月と曜日は簡単です。
月 → 日付 の列から MONTH関数で 1〜12 の値を取り出します。
曜日 → 日付 の列から WEEKDAY関数で 0〜6 の値を取り出します。

休日は土日以外の祝日情報が必要になります。
計算で出せないこともないのですがハッピーマンデーなどもあり面倒なので必要な分だけ単純にデータ化します。

なのでこの様に準備しました。

休日 → =IF(OR(WEEKDAY(A3,3)>=5,NOT(ISNA(VLOOKUP(A3,holiday!A:A,1,FALSE)))),1,0)

ちょっと計算式がややこしいですがやっていることは「曜日が土か日または休日シートにデータがあれば1、そうでない場合0」としています。




次に天気のデータです。
気象庁からダウンロードしたデータはこの様になっていました。

Googleスプレッドシートは文字コードが Windows の SJIS でもインポート機能を使うといい塩梅に取り込んでくれますし、システム苦手な日付も変換してくれるので助かります。
後は必要な列を VLOOKUP関数 で参照します。

天気概況 → =VLOOKUP(A3,weather!A:B,2,FALSE)

最高気温 → =VLOOKUP(A3,weather!A:E,5,FALSE)

最低気温 → =VLOOKUP(A3,weather!A:H,8,FALSE)

降水量 → =VLOOKUP(A3,weather!A:K,11,FALSE)




続いて日の長さです。
天文台のデータを利用するのですが、こちらがデータの提供方法があまり再利用を意識されていません。
非常に面倒なのですが地道な作業をしていきます。

このようにコピーして

これを必要な月の数だけ実施してデータを完成させます。
日の入りの時刻から日の出の時刻を引いて陽の長さを算出します。

HOUR(C2)*60 + MINUTE(C2) - HOUR(B2) * 60 - MINUTE(B2)

このデータを参照して陽の長さを埋めます。

陽の長さ → =VLOOKUP(A3,daytime!A:H,8,false)




最後の電力需要にたどり着きました。
東京電力パワーグリッドが配布するデータは年度ごとになっているので3つダウンロードして引っ付けます。
またデータの中身は1時間ごとの電力需要になっているので1日ごとに集計します。

電力需要 → =SUMIFS(power_hourly!C:C,power_hourly!A:A,A3)

これでベースとなるデータセットが作成できました。
ちょっと長くなりましたので、今回は一旦ここまでで切ります。

次回は作成したデータセットを使ってMAGELLAN BLOCKSで学習と予測する手順に進みます。