【PowerBIメモ】時系列データとうまく付き合うための整理・可視化・分析・予測Tips

**[Microsoft Power BI Advent Calendar 2017](https://qiita.com/advent-calendar/2017/power-bi)**
12/10の私の担当分！
**「PowerBIで時系列データとうまく付き合う」**です！



PowerBIでデータを扱う上で、時系列データは避けて通れません。

ただ、時系列データを思ったように集計できない、可視化できない、と悩んでしまうケースも多いはず。

私も同じ道をとおってきたので、とりあえずコレだけ覚えておけば・・・
的なTipsを紹介します。



# 【対象読者】
・PowerBI(Desktop)をちょっとでも触ったことのある人

※「まだ右も左もわからな～い！」って人はまずはこちらをチェックしてください
[【PowerBIメモ】初心者が見るべき情報まとめ](https://qiita.com/h_kobayashi1125/items/ad3d64100b92a97ab5bc)



# １　はじめに

この記事で記載する内容は、
12/2に行われたPower BI 勉強会 第6回で登壇した内容を一部補完し、記事にしたものです。

[PowerBI勉強会#6](https://powerbi.connpass.com/event/69605/)

当日使ったスライドは以下のとおり↓

[![thumbnail](http://image.slidesharecdn.com/powerbi1202-171202045744/95/slide-1-1024.jpg )](https://www.slideshare.net/HisashiKOBAYASHI2/power-bi-1202)


# ２　整理

まずは時系列データを用意しましょう！
そのデータの内容をチェックすることが先決です。
すぐにグラフ化しても、思ったような可視化ができないかもしれません。


## 2-1 日付データの整理が必要なケース
時系列データを扱う目的として、年度累計や前年同月比の集計がしたいケースが多いと思います。
PowerBIではDAXの[タイムインテリジェンス関数](https://msdn.microsoft.com/ja-jp/library/ee634763(v=sql.120).aspx)により比較的簡単に集計することができます

しかし、扱いたい時系列データが以下のような形式の場合は一手間必要です。

|Date|item|
|---|---|
|2017/12/1|15|
|2017/12/1|10|
|2017/12/1|22|
|2017/12/3|10|
|2017/12/4|22|
|2017/12/4|8|
|・・・|・|


アクセスログや売買記録などのトランザクションデータは、一意の日付がつくわけではありません。
上記では、12/1のように複数ある日付がある一方、12/2は１日もありません。
このようなデータ形式のままでは、うまくタイムインテリジェンス関数を適用することができません。

そこで、1日1レコードのテーブルを作成し、日付を[主キー](http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20000919/1/?rt=nocnt)としてリレーションを設定できるテーブル（***カレンダーテーブル（日付テーブル）***）を作成します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/5baf593f-db8a-21ac-e052-d71d56493701.png" width=600px >

このようなカレンダーテーブルをつくり、リレーションを設定できると、
カレンダーテーブルに基づく一意の日付で集計・分析できるようになります。

## 2-2 カレンダーテーブルの作り方
カレンダーテーブルは、DAXで簡単に作ることが可能です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/735c6c19-e167-c674-0205-a686f930f8f6.png" width = 300px>

「モデリング」タブ、「新しいテーブル」を選択し、
数式バーに以下を記載します。

```カレンダーテーブルの作り方.dax

CalendarTable = ADDCOLUMNS(CALENDARAUTO()
    , "Year", YEAR([Date])
    , "Month_n", MONTH([Date])
    , "Day" , DAY([Date])
    , "WeekDay", WEEKDAY([Date],1) 
    ) 

```
上記のコードを記入すると、以下のようなテーブルが作れます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/32645043-b058-78e8-1266-e0a1cc57cf4c.png" width = 400px>

少しDAX式を解説します。

`ADDCOLUMNS()`：引数の条件のカラムを追加しますよー
`CALENDARAUTO()`：データモデルに組み込まれている最初から最後までの日付を自動的に取得・生成しますよー
`YEAR()`：年を取得しますよー
`MONTH()`：月を取得しますよー
`DAY()`：日を取得しますよー
`WEEKDAY()`：曜日を取得しますよー

ちなみに、'ADDCOLUMNS()'を使わなくても、一つひとつ計算列として追加することも可能です。

カレンダーテーブルの必要性、作り方については
以下のまとめのほうが専門的かつ分かりやすいので、ご紹介させていただきます。

・[日付テーブル は必要か、それが問題だ](https://qiita.com/PowerBIxyz/items/375573ebe78a48b6d7de)
・[日付テーブルはどうやって作るか、それが問題だ](https://qiita.com/PowerBIxyz/items/41b71651f9ddb9a16419)

これで、タイムインテリジェンス関数を使う準備が整いました。
機能的に中であれこれ自動でやってくれるケースが増えたので、
カレンダーテーブルが必要ないケースも多いのですが、
私は「とりあえず作っておくか・・・」的に作っとくケースが多いです。


# ３　可視化

タイムインテリジェンス関数を使って、年間累計を出してみたいと思います。
その前に、そもそもメジャーって何かを理解しておくことが必要です。

## 3-1　メジャーって何？

DAXを勉強して最初にぶち当たる壁が、計算列とメジャーの違いではないでしょうか？

※もっと言うと、PowerQueryとDAXの違いも意味ぷーで、挫折してしまった人もいるかもしれません。
　それはまた別の機会に。

計算列、メジャーどちらもDAXで作成できるのですが、根本的な役割の違いがあります。

![図4.png](https://qiita-image-store.s3.amazonaws.com/0/165789/00e67811-6c34-71a7-6937-12402b42041b.png)

先ほどの`ADDCOLUMNS()`等でテーブルを作成しましたが、これは***[計算列](https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-tutorial-create-calculated-columns/)***です。
グラフ化する前のレコード単位の根拠になる数字です。

よく考えれば、グラフ化する前にはほぼ必然的に***集計***というプロセスが必要です。
*例：合計を足し算（SUM）、件数をカウント（COUNT）して棒グラフにする*

ざっくり言えば、この***集計***の条件を自分で作成することが、***[メジャー](https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-tutorial-create-measures/)***です。
あまり意識しないと思いますが、PowerBI上でグラフ化する際も、裏ではメジャーが動いているケースがほとんどです。

今回は、タイムインテリジェンス関数という時間を軸にした集計関数を使って年間累計をメジャーを作ります。


## 3-2 タイムインテリジェンス関数の作り方


「モデリング」タブ、「新しいメジャー」を選択し、
<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/6566eddb-ffe5-8e9e-f3dc-03efa2365073.png" width = 400px>



年間累計は以下のように数式バーに記述します。

```年間累計.dax
YTD = TOTALYTD(sum(sales[売上]),CalendarTable[Date],"12/31")

```

これは、「sales」テーブルの「売上」カラムの数値を、リレーション設定してあるカレンダーテーブルの日付で年間累計を出すDAX式になっています。

*※YTDは、Year to Dateの略で年初来を意味するみたい。
　Power BIのリファレンスにもよく出てくるから知っておくと吉かも！*

これで作成したメジャー「YTD」で年別の年間累計をグラフ化するとこんな感じ。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/04de0193-8065-d9ff-2e99-66efa00fdb89.png">

ちょっと分かりづらいデモデータですが、ちゃんと累計されています。

## 3-3 クイックメジャーを使う手も
実は、頻出な集計条件は[クイックメジャー](https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-quick-measures/)としてあらかじめクリック操作のみで作成できるようになっています。
ただ、自分の予期しない集計をしているケースがあるため、自動生成されたDAX式を結局解読することが必要になります。
個人的には慣れないうちは自分で四苦八苦してつくってみたほうが勉強になるのではないかと。


# ４　分析

単なる可視化から一歩踏み込む、分析に使える機能やカスタムビジュアルを紹介します。

## 4-1 傾向線で時系列データを分析してみる

PowerBIのラインチャートでは、データの増減の傾向を示す傾向線が使えます。
分析のアイコンから傾向線を選択して表示します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/97afb3b7-c344-4510-c220-191c66d94111.png" width = 500px>


一見便利そうな機能ですが、欠点も。
データが周期性をもって増減を繰り替えすようなケースではうまく行きません。
試しに東京都の気温データで試してみると…

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/6c61ee4c-e0bb-adf6-d41b-0a1299bf363d.png"width=400px >

ほとんど意味がなくなってしまうことが分かります。

このような周期性、実は色々なデータに潜んでいます。
商品の売上は四季や平休、アクセスログは曜日時間単位で周期性があります。

そんな時系列データを分解し、分析することができるのが***Time series decomposition chart***です。


## 4-2 季節変動、トレンド、不規則要因に分けて分析してみる

***[Time series decomposition chart](https://community.powerbi.com/t5/R-Script-Showcase/Time-Series-Decomposition/m-p/108098)***は、時系列データを
seasonal：季節変動
trend：トレンド
reminder：不規則変動
に分解し、どの影響要因が強いか分析するアルゴリズムです。


<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/10d0df84-fbd4-20dc-996e-310d2b628423.png" width = 500px>


時系列分解に関しては以下サイトなどが分かりやすかったので紹介させていただきます。
[データを長期変動、季節変動、不規則変動に分解する](http://business.nikkeibp.co.jp/atclbdt/15/recipe/102500012/)




さっそくカスタムビジュアルを追加しましょう。
*※Time series decomposition chartは、Rスクリプトビジュアルです。
   そのため、カスタムビジュアル追加時にRのインストールを求められます。
   Rの詳しい内容は以下を参照してください。
[R を使用した Power BI ビジュアルの作成](https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-r-visuals/)*


カスタムビジュアルを以下のとおり試してみます。
データは東京都の気温データです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/3d7c5132-4bba-389f-529e-e032fe180ef8.png" width = 500px>

上から、観測データ（投入変数）、季節変動、トレンド、不規則変動を示すデータとなっています。
当たり前ですが、規則正しく変動しています。
トレンドは、近年やや上がっているように見えますが・・・？
グラフ下に注目してみます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/52858f73-9e1a-ca98-364d-bd79a5edcedf.png" width = "700">

これをみると、この気温のデータは、季節変動が71％、トレンドが3％、不規則変動が27％の構成となっているようです。
*※この辺りの解釈は厳密には正しくないかもしれません。*
トレンドの影響は限りなく少ないようです。

このように、Time series decomposition chartを利用すると、
クリック操作のみでRスクリプトによる時系列分析を行うことができます。


# ５　予測

PowerBIは、過去・現在の可視化だけでなく、
予測を行うことも可能です。

## 5-1 標準のビジュアルによる予測機能

PowerBIのラインチャートでは、標準の機能として予測機能を提供しています。

先ほどの気温のデータを用いて、予測データを作成してみます。
傾向線の表示などを行った分析アイコンのメニューの中の「予測」を選択します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/85926644-32f3-ebe6-3897-4c909ce98a7c.png" width=500px>

季節性はデータに合わせて調整します。今回は年間の気温差なので、365ポイントを指定しました。
季節性も考慮されたデータの将来予測が表示されています。
*※この出力データは、CSV形式にダウンロードすることもできます。*


## 5-2 カスタムビジュアルによるより高度な予測機能

もう少し専門的な解析手法により、予測結果を表示してくれるカスタムビジュアル（Rスクリプトビジュアル）も公開されています。
例えば、年間だけでなく、曜日でも影響があるデータなどの場合、２つの季節性を考慮して分析・予測する必要があります。
２つの季節性を考慮することができる時系列分析アルゴリズムが[Forecasting TBATS](https://appsource.microsoft.com/en-us/product/power-bi-visuals/WA104381326?tab=Overview)です。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/02b0e6b8-dab1-37ac-fb70-5bff58dd79a9.png" width=500>

これも可視化してみると、このような予測結果が作成できます。
季節性などのパラメーターは、書式アイコンから選択していきます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/165789/21c66416-d885-80e7-eed0-aed619c23254.png" width=500px>

そのほかにも、時系列予測のカスタムビジュアルがいくつかあるようです。


#おわりに

時系列データの扱いは奥が深く、付け焼刃な知識では中々取り扱いづらいことを改めて思い知らされました。
DAXによるデータ整形、可視化から、R等での分析・予測に至るまで、もっと学べたらまた情報提供していきたいと思います。