ラベル データ解析 の投稿を表示しています。 すべての投稿を表示
ラベル データ解析 の投稿を表示しています。 すべての投稿を表示

2020年7月21日火曜日

LSTMによる卸電力価格(スポット価格)の変化点検知(時系列データ、異常検知、ディープラーニング)

前回の続き、東京大学松尾研ディープラーニング講座 DL4US 3rdの最終課題(自由課題)についてです。

最終課題
「講座で学んだ技術を利用する独自プロジェクトに取り組み、その結果をレポートせよ」

ということで、私は卸電力価格(スポット価格)の変化点検知と予測に取り組みました。


背景と目的

電力スポット市場(一日前市場)とは
卸電力取引所が開催する最もポピュラーな電力取引市場の一つであり、翌日に発電または販売する電気を前日までに入札し、売買を成立(マッチング)させるものです。https://pps-net.org/glossary/5072

スポット市場の約定価格(以下、スポット価格)は発電事業者にとっては電気の卸販売価格、小売電気事業者等にとっては調達価格として重要なものとなっています。

スポット価格の一般的な特徴
・日変動(昼間、夜間などの時間帯による変動)
・季節変動
・平日・休日による差
・需要・供給力による変動
・気温による変動

スポット価格1週間の変動例

上記の一般的な特徴のほかに、中長期でトレンドが変化しています。最近では太陽光発電が増加したことなどの影響で特に西日本で昼間のスポット価格の低下が大きくなってきました。


ススポット価格 時間別平均値の変化

今回のスポット価格の変化点検知の目的は、変化を早めに察知することで戦略見直しの必要性を明確にするということです。また、政策立案者にとっては介入効果の検証やある事象による影響を知ることもできるかと思います。

目標:スポット価格のトレンドの変化(変化点)を検出する。


変化点検知の手法

変化点を検出するにあたり、LSTMで特定の時点までの時系列データのモデルを作成し、その後の時点での実測値と予測とのずれをトレンドの変化とすることとしました。

異常検知として外れ値を検出するという手法が取り上げられていますが、瞬間的にスポット価格が高騰することはよくあります。このため、外れ値だけではなく変化は比較的小さくても一定期間続く傾向を検出したいことから、予測誤差の集合による異常度の判定としました。



データ

日本卸取引所(JEPX)のスポット市場取引結果(2005年~2019年12月 エリアプライス)
気象データ:気象庁過去データより代表1地点の気温、日射量の1時間値

スポット市場は対象期間の1日前に取引を行うため、本来は天気予報のデータを用いるべきですが、過去の予報データが手に入らなかったため過去気象の実測値を用いました。


変数候補としては供給力、需要、連系線の混雑状況、燃料価格など様々考えられますが、今回は気温、日射量、平日・休日フラグ、時間のみを使っています。

異常度は1週間単位の予測誤差の平均値の二乗としました。


モデル・学習

モデルの構築はPython Kerasを使いました。下記を参考にしています。

深層学習を用いた時系列データにおける異常検知 Kabuku Developers Blog
https://www.kabuku.co.jp/developers/time_series_anomaly_detect_deep_learning


スポット市場では前日10時を締め切りに翌日の24時間分を取引します。このため、学習データのスポット価格は48時間前の価格としました。24時間分のデータから1時間値を予測します。



trainデータで実測値と予測値の誤差が正規分布に近くなるまで(過学習気味になるまで)学習を行い、testデータで前述誤差の差から異常度を計算します。


結果

<結果1:train:2005年4月~2010年12月、test:2011年1月~2019年12月>


2005年4月~2010年12月までを学習し、2011年から2018年までの変化点を見た結果です。青色がスポット価格の実測値、オレンジが予測値、緑色が異常度(右軸)です。

2011年3月の東日本大震災後、2012年1月に異常度が非常に高くなり、2015年まで高い状態が継続しています。2016年ごろからは元の傾向(2010年まで)に近くなったことがわかります。

<結果2:train:2005年4月~2010年12月、test:2011年1月~2019年12月>


こちらは2005年4月~2018年を学習し、2019年1月~12月の変化点を見た結果です。

2019年2月から4月中ごろに異常度が比較的高くなっており、太陽光発電の増加により晴れた昼間にスポット価格が大きく下落するようになった時期と一致しています。結果1の2012年ごろと比べると異常度は小さくなっていて、変化の大きさも反映されています。


考察など

簡易的でありますが、LSTMによるモデルと誤差集合を用いることでトレンドの変化を検知することができました。ただし、気象データを予報値ではなく実測値を使っていること、ごく限られた変数のみを用いていることなどからあくまで参考という形です。また、異常度の判定方法や評価指標としてはもっと一般的な方法があるかと思います。

先にも述べましたが、変化点とその度合いを見ることで事業戦略転換の判断をしやすくなったり、政策等の介入効果、状態変化による影響などを明確にすることができ、適用範囲は広いと思います。最近ではコロナの影響で電力需要の減少が言われていますが、同様の手法で影響を図ることができそうです。

以前行った、エネルギー基本計画での新語・複合語を探すというのも政策での変化を見たかったという動機でした。自然言語処理を用いた変化点検知というのもやってみたいと思っています。


参考
東京大学松尾研 DeepLearning実践開発講座「DL4US」3rd
https://deeplearning.jp/lectures/dl4us_3rd
DL4US コンテンツ公開ページ
https://weblab.t.u-tokyo.ac.jp/dl4us/

東京大学松尾研ディープラーニング講座 DL4USを修了しました。
https://eneprog.blogspot.com/2020/06/dl4us.html

ReNom:LSTMによる時系列データの異常検知
https://www.renom.jp/ja/notebooks/tutorial/time_series/lstm-anomalydetection/notebook.html
Kabuku Developers Blog :深層学習を用いた時系列データにおける異常検知
https://www.kabuku.co.jp/developers/time_series_anomaly_detect_deep_learning

日本卸電力取引所(JEPX)
http://www.jepx.org/
新電力ネット スポット市場
https://pps-net.org/glossary/5072
JEPX プライスチェッカー
https://enechange.jp/jepx_checker/

日本経済新聞 :電力スポット価格、土日昼間は「ほぼ0円」
https://www.nikkei.com/article/DGKKZO58525810X20C20A4TJ3000/

エネルギー基本計画の特徴を見てみる。その4 複合語を考慮してwordcloud
https://eneprog.blogspot.com/2018/09/4-wordcloudpythonjanome.html
エネルギー基本計画から新語・複合語を探す。その2 複合語を判定する
https://eneprog.blogspot.com/2018/08/2-pythonjanome.html


謝辞
DL4USの運営スタッフのみなさま、大変有用な講座を(無料で!)提供し、サポートしていただき本当にありがとうございました。ご一緒いただいた受講者のみなさまとの交流も大変励みになりました。感謝です。

2020年6月13日土曜日

東京大学松尾研ディープラーニング講座 DL4USを修了しました。

ずいぶん久しぶりの投稿になります。2019年10月から東京大学松尾研ディープラーニング講座 DL4US 3rdを受講し、2020年2月に無事修了しました。

東京大学松尾研 DeepLearning実践開発講座「DL4US」3rd
DL4US コンテンツ公開ページ

私はDL4USの3期生になるようです。講座の内容は上記公開コンテンツで見ることができますが、ただ、コンテンツで自習するのと講座を受講するのでは大きく異なる点があります。

・1受講者 – 1GPUサーバ、ブラウザのみで構築済みの環境が使える。
・毎週の課題提出(コンペ形式)
・SLACKでほかの受講者・TAとのコミュニケーション
・コンペ課題上位者の解法の共有

講座募集のページにも書かれていますが、

第3期では、”受講生コミュニティ” の価値最大化を目指して、1)コンペ形式の課題を通じた競争、2)受講生フォーラムでの議論・助け合い、3)講座期間中・後の交流、に重点を置いた運営を行います。

ということで、この運営が非常に効果的だったと思います。

特に毎週課題提出があることで締め切りに追われながらもスケジュール通りに講座を進めるができる、受講者同士で教えあいや励ましあい、解法の共有など、学習の継続と理解を深める工夫がありました。

正直、仕事をしながらの毎週課題をこなすのはかなりきついものがありましたが、課題コンペでの競いあいや受講者同士でコミュニケーションが取れる場があることで何とか継続できたと思っています。

DL4USの特徴にはもう一つ、最終課題があります。

最終課題
「講座で学んだ技術を利用する独自プロジェクトに取り組み、その結果をレポートせよ」

テーマは自由。データも自分で集める必要があります。

何をするか、自分の実力で何ができるか非常に悩みましたが、私は「LSTMによる電力卸価格(スポット価格)の変化点検知と予測」というテーマにしました。時系列の電力卸価格と気象データ等から変化点とその度合いを見る(さらに予測を行う)というものです。

実は自然言語処理を試してみたかったのですが、テーマも絞り切れず、一からやるには難易度が高すぎることから、やはり少しでもドメイン知識のある分野の方がやりやすいだろうという選択です(これは正解でした)。

最終課題に取り組んだのは1か月弱(一度締め切りが延びた)という短期間で、非常に苦労しましたが何とかレポートにまとめ、提出することができました。予測としての精度はあまりよくなかったものの、最終課題の評価は修了者の平均程度となり個人的には満足しています。

今まで、Andrew先生のcoursera machine learningedx UCバークレーデータサイエンス基礎講座とデータ解析系の講座を受講しましたが、DL4USは技術の習得はもとより、継続の面でとてもよく設計された講座だと感じました。受講者の修了率は半分程度だったそうですが、オンライン講座でこの修了率は高いと思います。何より、スタッフの方の対応や受講者同士のコミュニケーションが取れる仕組みやよかったです。

修了者の懇親会はコロナの影響で延期となっていますが、開催される場合はぜひ参加したいと思います。

*実はこの後、同じく東京大学松尾研のGCIデータサイエンティスト育成講座も受講しました。こちらについてもそのうち書きます。

追記:2020年7月21日 最終課題について書きました。
LSTMによる卸電力価格(スポット価格)の変化点検知(DL4US最終課題)
https://eneprog.blogspot.com/2020/07/lstmdl4us.html

参考
東京大学松尾研 DeepLearning実践開発講座「DL4US」3rd
https://deeplearning.jp/lectures/dl4us_3rd
DL4US コンテンツ公開ページ
https://weblab.t.u-tokyo.ac.jp/dl4us/

Coursera machine learningコース
https://www.coursera.org/learn/machine-learning
coursera machine learningコース修了しました。
https://eneprog.blogspot.com/2018/06/edx-uc-2python.html
Coursera machine learning コースを始めました。edX UCバークレーFoundations of Data Scienceとの違いなど
https://eneprog.blogspot.com/2018/07/coursera-machine-learning-edx-ucmooc.html
edX UCバークレー Data Science: Computational Thinking with Python
https://www.edx.org/course/foundations-of-data-science-computational-thinking
プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
プログラミング学習:edx UCバークレー データサイエンス基礎講座、第2弾受講中(python)
https://eneprog.blogspot.com/2018/06/edx-uc-2python.html

2018年5月26日土曜日

サンフランシスコのレンタサイクルのデータを見てみる その4。地図上に線を引く(python、folium、Map)

edX UCバークレー データサイエンス基礎講座(Foundation of Data Science)の演習、前回の続きです。

サンフランシスコ ベイエリアのレンタサイクル "Ford Go Bike"の利用状況を把握する。

今回は、借りたステーション(開始ステーション)と返却したステーション(返却ステーション)の組み合わせを地図上に線で表示します。下記のサイトが大変参考になりました。
folium quickstart
Deparks:Plot Lines In Folium
hibomaの日記:Python + folium で Strava の "全"記録を地図で可視化 🚲

元データ
サンフランシスコ ベイエリア レンタサイクル Ford Go Bike
https://www.fordgobike.com/
システムデータ
https://s3.amazonaws.com/fordgobike-data/index.html
2017年のトリップデータ(このデータを使います)
https://s3.amazonaws.com/fordgobike-data/2017-fordgobike-tripdata.csv

・使用するデータフレームの確認
stations_startcount.head()
stationlatlongstart_count
100San Francisco Ferry Building (Harry Bridges Pl...37.795392-122.39420313338
5San Francisco Caltrain (Townsend St at 4th St)37.776598-122.39528212320
8San Francisco Caltrain Station 2 (Townsend St...37.776639-122.39552611890
15The Embarcadero at Sansome St37.804770-122.40323411861
31Market St at 10th St37.776619-122.41738511577

common2.head()
Start StationEnd Stationcount
0San Francisco Ferry Building (Harry Bridges Pl...The Embarcadero at Sansome St2842
1The Embarcadero at Sansome StSteuart St at Market St1764
2Berry St at 4th StSan Francisco Ferry Building (Harry Bridges Pl...1671
3The Embarcadero at Sansome StSan Francisco Ferry Building (Harry Bridges Pl...1639
42nd St at S Park StMontgomery St BART Station (Market St at 2nd St)1504

前回までに作ったデータフレームを使います。start_stationcountにステーション名と座標が、common2に開始ステーションと返却ステーションの組み合わせと利用回数が入っており、利用回数の多い順に並べ替えています。

・地図上に描画
map_osm = folium.Map(location=[37.795392,-122.394203],zoom_start=13)

for i, r in common2[0:200].iterrows():
    
    start_station=stations_startcount[stations_startcount["station"]==r["Start Station"]]
    end_station=stations_startcount[stations_startcount["station"]==r["End Station"]]
                                      
    s_lat=start_station["lat"].iloc[0]
    s_long=start_station["long"].iloc[0]
    e_lat=end_station["lat"].iloc[0]
    e_long=end_station["long"].iloc[0]
    
    location=[[s_lat,s_long],[e_lat,e_long]]

    k=1
    for each in location:
        if k==1:
            station=r["Start Station"]
        else:
            station=r["End Station"]
            
        folium.Circle(
            location=each,
            popup=station,
            radius=2.5,
        ).add_to(map_osm)
        
        k=k+1
        
        
    folium.PolyLine(
        locations=location,
        weight= r["count"] / 300,
    ).add_to(map_osm)
               
map_osm


一気に描きます。開始ステーションと返却ステーションの組み合わせで、利用回数が多い順に200件を描画します。

Mapで中心座標とズームを指定してオブジェクトを作成。common2の開始、返却ステーション名をstations_startcountと比較して座標を取り出し。locationにリストとして開始ステーション、返却ステーションのそれぞれの座標を保存します。

for each in location以下では、まず、ポップアップで表示されるステーション名をstationに取得、Circleで各ステーションに小さな円とポップアップを設定します。

線を描くのはfolium.Polylineで、locationで2点の座標を指定、weightで太さを設定しています。太さは利用回数/300として、利用回数が大きいほど太く表示するようにしました。

・出力

利用経路の線が描かれました。ちょっと選択しずらいですが、線の端をクリックするとステーション名が表示されます。

東海岸沿いの太い線が最も利用が多いフェリービルディングと Embarcadero at Sansome Stの線です。数ヶ所の利用が多いステーションがあり、それらのステーション間を結んで利用されているようです。オークランドの方は中心にMacArthur BART Stationがあり、星型に4ヶ所を結ぶ形になっています。

開始ステーションと返却ステーションの方向を矢印で表示したかったのですが、やり方がわかりませんでした。これは今後の課題ということで。

参考:
folium quickstart
https://python-visualization.github.io/folium/quickstart.html
Deparks:Plot Lines In Folium https://deparkes.co.uk/2016/06/03/plot-lines-in-folium/
hibomaの日記:Python + folium で Strava の "全"記録を地図で可視化 🚲 http://hiboma.hatenadiary.jp/entry/2017/09/13/094056

edx UC Berkeley Foundations of Data Science(UCバークレー データサイエンス基礎講座)
ttps://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science
Computational Thinking with Python(pythonによるプログラミング的思考)
https://www.edx.org/course/foundations-data-science-computational-uc-berkeleyx-data8-1x

サンフランシスコ ベイエリア レンタサイクル Ford Go Bike
https://www.fordgobike.com/
システムデータ
https://s3.amazonaws.com/fordgobike-data/index.html

プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
サンフランシスコのレンタサイクルのデータを見てみる(基本統計量、python、pandas、ヒストグラム)
https://eneprog.blogspot.com/2018/05/pythonpandas_17.html
サンフランシスコのレンタサイクルのデータを見てみる その2。よく使われているステーションを調べる(python、pandas、groupby、pivot_table)
https://eneprog.blogspot.com/2018/05/pythonpandasgroupbypivottable.html
サンフランシスコのレンタサイクルのデータを見てみる その3。地図上に可視化(python、pandas、folium、Map)
https://eneprog.blogspot.com/2018/05/3pythonpandasfoliummap.html
//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語