グルーヴノーツ コンサルタントの吉村です。
今回は、数値回帰のチュートリアルをやってみます。このブログの手順を見ていただければ、機械学習で需要予測を行うことが簡単だと理解していただけると思います。
おそらく長くなるので、4回に分かけてご紹介します。
第1回:電力需要を予測するためのデータを準備する(本編)
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のDataEditorを利用してみます。
まずは、ベースとなるデータのシートを準備します。ここには前述のデータ形式で、最初に日付と中身の列だけ入力しています。
日付の列は最初の行に 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でやってみた(2)」は、作成したデータセットを使ってMAGELLAN BLOCKSで学習と予測する手順に進みます。
※本ブログの内容や紹介するサービス・機能は、掲載時点の情報です。