Pythonプログラミング(総合演習課題)

このページでは、ARモデルを用いた時系列の予測の方法について概説する。

我々の電力使用を分析する

2011年の東日本大震災は、広い範囲にかつて経験したことの無い規模の被害をもたらし、その影響は今なお続いている。 特に、震災後しばらくは電力の不足が問題となった。 この「電力不足」については、立場や考えによって、色々な議論があるだろう。 そして、原子力を含むエネルギー問題は、我々が将来に向けて、真剣に取り組んでいかなければならない課題であることは間違いない。

そこで、この「総合演習」では、電力の使用量の時系列データを解析する作業を通じて、我々が「どのように」電力を使って いるか(きたか)について、定量的な情報を得ることを目的として課題を設定したい。

実データを入手する

東北電力でんき予報

大震災の後、各電力会社は、それぞれのウェブサイトで、管内の電力使用量データを(わかりやすく)開示するようになった。 例えば、我々が電力供給を受けている東北電力には、東北電力でんき予報 開設されており、現在の状況と今後の見通しが掲載・随時更新されている。 さらに、同じページの中で、過去実績データのダウンロードができるようになっている。 そこで、このデータに対して、Pythonを使った分析を加えてみたい。

ここで注意したいのは、電力の利用状況を分析する場合、本来ならば、送・発電量以外にも、気温や湿度などの天候、カレンダー(曜日・祝日)、社会・経済活動の状況、 など、様々な要因まで考慮すべきであって、実際に、電力会社が受給見通しを立てる際にも、何らかの形でこれらのファクターが加味されているはずである。 ただ、あまりに複雑で膨大なデータ処理を目指すのは、授業の主旨からは(かなり)逸脱するので、ここでは、「過去実績データ」のみを対象として、先に進もう。

試しに、過去実績データのダウンロードの中から、 各年度の「実績データ(CSV形式)」をダウンロードして見よう。 ファイルには "juyo_2018_tohoku.csv" といった名前が付けられているはずだ。

CSV形式のデータ

理系学生の素養として、CSVは押さえておきたい。

「過去実績データ」は、CSV(comma separated values)というデータ形式のファイルになっている。 直訳すると、コンマで区切られた値(の列)、ということになる。 CSVは、エクセルなどの表計算ソフトに(から)簡単に読み込む(書き出す)ことが出来るので、テーブル形式のデータ交換に広く用いられている「共通的な」フォーマットである。 電力の実績データの先頭部分は、例えば、

2019/1/1 3:02 UPDATE
DATE,TIME,実績(万kW)
2018/1/1,0:00,903
2018/1/1,1:00,916
2018/1/1,2:00,929
2018/1/1,3:00,945
...

のようになっている。先頭行は、データ更新の日付、各コラム(フィールド)の名称、続いて、データが「コンマに区切られて」並んでいる格好だ。 フィールドは順に、日付(年/月/日)、時刻、そして「万kW時」単位の電力使用量、となっている。 こうしたデータが、年ごとに、元旦の深夜0時から順に1時間間隔で並んでいる。 毎時のデータが掲載されているので、1年分では 24時間 × 365日 = 8760 サンプルになる。

さきほどダウンロードしたCSVファイルを、LibreOfficeやエクセルなどの表計算ソフトで「開く」と、 データが表のセルの中に収まった格好で見られるはずだ。 この程度のデータ量ならば、こうした表計算ソフトでも扱えないことはないが、込み入った計算をするには、このデータをPythonのプログラムで読み込んで処理するほうが、 はるかに能率的だろう。

時系列情報としての電力使用量

電力会社が提供するデータをプログラムで処理するには、日付と時刻ではなくて、「注目する年の元旦零時を起点として、それからXXXX時間後の電力量」として 扱うのが(プログラムを組む上では)簡単だ。 ここでは、元旦零時から$t$時間後の電力量を$P(t)$と表記することにする(これは数学的な表記であって、Pythonのそれではないことに注意せよ)。 $P(t)$は$t$を変数として複雑に変動する関数、あるいは時系列(time series)、と見なすことができる。 電力データに限らず、実験や観測で得られるデータの多くはこうした時系列情報であって、それをコンピュータで料理する作業は「理系のいろは」と言えよう。

話しを電力に戻すと、この$P(t)$について、誰でも以下のような分析をしてみてはどうかと考えつくだろう:

こうした分析にPythonプログラムを利用するためには、データファイルの読み込み、経過時間$t$と月日・曜日などとの「換算」などを 具体的にどうすればよいか、などが少し心配になるけれども、それらを除けば、これまで学んだ知識の範囲で十分対処可能なはずだ。

さらに、電力使用量の予測に繋がるような事柄として、

等にも関心を持つ者があるかもしれない。 そこで、より進んだ解析手法として、比較的簡単な予測アルゴリズムとして知られているARモデルを以下に紹介しておこう:

ARモデルで未来を予測する

ARモデルの計算式で、「総和」は$a(i) P(t-i)$について取る。念のため。

時刻$t$でのデータ値$P(t)$、および、それよりも過去のデータ $P(t-1),P(t-2),P(t-3),\cdots$ が与えられたときに、 これらと1ステップだけ次のデータ点$P(t+1)$と関係づけるモデルとして、ARモデル(AutoRegressive model:自己回帰モデル) がよく知られている。 その関係式は非常に簡単で、$t$から$p$ステップ前までのデータの荷重付きの和として、「その先」の値を \[ P(t+1) = \sum_{i=0}^{p-1} a(i) P(t-i) + c + \sigma \, \xi \] で表現する、というものだ。 ここで、$a(i)$は現在から$i$ステップ前のデータに対する重み付けを表すある数値、 $c, \sigma$もある数値、 $\xi$は平均0で標準偏差1のガウス乱数(つまり、$\sigma \, \xi$で、平均0、標準偏差$\sigma$の乱数)、である。 $a(i), c, \sigma$の具体的な値は、時系列の統計的な性質から推定することができる。 $p$はモデルの次数と呼ばれ、電力データの場合、$p$を24に設定すれば、23時間前(1日)前までのデータによって、次の時刻の 電力が決まる、という具合になる。 もちろん、電力のような複雑な現象においては、「以前」の値だけから「次」の値が完全に(決定論的に)決まってしまうわけがないから、 $\sigma \, \xi$で決定不能なランダムな変動分を表そう、というアイデアだ。 従って、$\sigma$は各ステップでの予測不能な変動の大きさの程度を表している。

電力などの時系列$P(t)$から、(ここでその方法は具体的に示さないけれども)ARモデルの式中に現れる $a(i), c, \sigma$の値が推定できたとしよう。すると、これらを使って、 既知のデータ点$\{P(t),P(t-1),\cdots,P(t-p+1)\}$から、1ステップ先の、未知の$\tilde{P}(t+1)$を予測する式 \[ \tilde{P}(t+1) = \sum_{i=0}^{p-1} a(i) P(t-i) + c \] を立てることができる。

例えば、最も簡単な$p=1$の場合、予測式は \[ \tilde{P}(t+1) = a(0) P(t) + c \] となるから、仮に、$a(0)=0.9, c = 1, \sigma=10 $だったとすると、未来予測の計算ステップは

1. P(t)の現在値が 923 だったとする
2. 0.9 * 923 + 1 → 831.7 を予測値P(t+1)とする
3. このときの予測のあいまいさは 10 程度

といった具合になる。本当にこんなので「予測」になるのか、心配なくらいだ。

このように、ARモデルの予測式自体は(何しろ、かけ算と足し算だけなので)非常に簡単なのだけれども、

  1. $a(i), c$および$\sigma$の値はどうやって求めらたらよいのか、
  2. $p$もどういう値にすれば良いのか、

が分からなくては、全くお話にならない。 けれども、そこのところに深く立ち入っている余裕はないので、 1については、対象とする時系列データを使ってこれらの値を求めるプログラム(関数)をあらかじめ「こちら(教員側)」で用意しておく、 2については、大体1日(24)〜数日(24*日数)程度の長さを目安にする、 ということにして、話しを先に進めることにする。

予測の精度を別にすれば、1ステップ先の予測を行うと、今度はそれを用いて、さらにもう1ステップ先、・・・・、 と、予測のレンジをもっと未来まで広げることが原理的には可能だ。

時系列の可視化

時系列に限らず、データ分析において、汎用性があり、「感度」も高いのは、何と言ってもグラフ化して「眺める」ことだろう。 例えば、電力会社のウェブサイトには、一日の電力使用量の推移が折れ線グラフや棒グラフで掲載されている。 こうしたデータの可視化において、一番手軽なのは、表計算ソフトのグラフ化機能を用いる方法だろう。 確かに表計算でかなりのことができるけれども、データの点数が多い(数千ポイント以上、など)と、マウスでの操作が煩わしく 感じるし、(ビジネス文書ではなくて)科学論文に掲載するようなキッチリとした書式のグラフを作るのも、どちらかと言えば苦手だ。

そこで登場するのが、いわゆる「グラフ作成用ライブラリ」だ。 この課題の「準備編」では、matplotlibという定番ライブラリの使用例を簡単に紹介した。

加えて、(i)Pythonなどのプログラミングで計算とデータの生成を行い、その結果を(例えばCSV形式等の)ファイルに保存する。 (ii) それをさらにグラフ作成ソフトで読み込んで表示、印刷する、というのがよくあるパターンだ。 そうして得た大規模で複雑なデータを可視化する専用のツールもよく使われる (商用ソフトは一般にかなり高額)。 どのようなソフトが利用可能か、ウェブで調べてみると良いだろう。