空談録

http://artfulplace.net/blogs/ からひっこしつつ

Excel 2016のForecastを利用してMy Picturesの画像枚数を予測する

すごい! なんだこのくだらない記事タイトル!

昨日Office 2016がリリースされたわけですが、新機能の一つや二つくらい触っておきたいと思ったのでとりあえずForecastを使ってみることにしました
ツイート数とかでもよかったんですけど不安定すぎるのでまだまっとうな時系列データになりそうなものにしました

My Picturesの画像枚数の変化の取得

そもそもどうやって枚数の変化を取得するの?って言われれば当然Power Queryですね!
今回のメインじゃないので一瞬で終わらせるとこんな感じ

let
    Source = Folder.Contents("F:\User\..."),
    Filter = Table.ToColumns(Table.SelectColumns(Table.SelectRows(Source, each [Extension] = ""), "Content")){0},
    comb = Table.Combine(Filter),
    Filter2 = Table.ToColumns(Table.SelectColumns(Table.SelectRows(comb, each [Extension] = ""), "Content")){0},
    comb2 = Table.Combine(Filter2),
    data = {Source, comb, comb2},
    dataTr = List.Transform(data, each Table.SelectRows(_, each ([Extension] <> "" and [Extension] <> ".zip" and [Extension] <> ".db" and ...))),
    dataComb = Table.Combine(dataTr),
    #"Added Custom" = Table.AddColumn(dataComb, "createdMonth", each Number.ToText(Date.Year([Date created])) & "-" & Number.ToText(Date.Month([Date created]))),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Content", "Name", "Extension", "Date accessed", "Date modified", "Date created", "Attributes", "Folder Path"}),
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"createdMonth"}, {{"Count", each Table.RowCount(_), type number}})
in
    #"Grouped Rows"

若干ゴミですがとりあえず取れます。特に日付をTextにするあたりがゴミなのですが気にせずいきましょう

f:id:fantasticswallow:20150923205333p:plain

実行結果が上の画像の通りです。ソートするとおかしいですね。手でソートしなおします(何を言ってるんだこいつ)
Power Queryめんどくさかった…

さっきのままだと差分しか手に入りません。これだと将来何枚の画像になるかではなく毎月何枚増えるかになってしまいます。いくらなんでも3年後は月1000枚画像を増やす人間になりました!とか出てきても困りますね
というわけで累計で出すようにしましょう。テーブルの横に一列追加します。あとは前の月までの累計とその月の増加枚数を足し算していけば出ますね

その結果がこの通り

f:id:fantasticswallow:20150923205747p:plain

これで準備は完了です

Forecastで分析してみよう

実際に分析していきましょう
テーブルを選択したらリボンの"データ"→"予測"→"予測シート"で選択しましょう
もしくは2016ユーザーっぽくTell Meに"予測"と入れてくれれば"予測シート"が候補に出ます
(英語だとForecast Sheetだった気がする)

押すとこんな画面が出てきます

f:id:fantasticswallow:20150923210217p:plain

デフォルトだと大体1年間分予測してくれます。いつまで分析するかはユーザーが指定できるのでお好きな期間を指定してください

オプションはほとんどいじらない…かなと思います
信頼区間をいじるくらいでしょうか

デフォルトでは予測値のほかに信頼下限と信頼上限も出してくれます。例えば信頼区間を95%とした場合「95%の確率でこの中のどこかにいる」という範囲の上限と下限を表しています
つまり100人が同じ傾向を示したときに95%は赤い線の間に入って5人は線の外に出るだろう ということを表しています(必ずしもそうなるとは限りません)
イメージとしては台風の進路予測みたいなものですね(基点から次の日にはどの辺にいくかを表すみたいな感じ)

数学が苦手な私が説明すると後日死にそうなのでもうやめておきましょう

とりあえず作成してみましょう。するとワークシートが追加されてテーブルとグラフが追加されます

f:id:fantasticswallow:20150923211932p:plain

Forecast.ETSを使ってデータソースとなる期間とデータをもとに指定した月のデータを予測しています
またFORECAST.ETS.CONFINTを使って指定した月のデータの信頼区間の幅を出しています。足すと信頼上限、引くと信頼下限のようですね

今回は信頼区間90%なので今月が終わるころにはMy Picturesの数は4553枚から4686枚の間に90%の確率でいるようです
また1年後の2016年の8月の終わりには5818枚から8922枚の画像を持っている可能性が高いそうです。なんかつらい予測だ…

周期性のあるデータの分析

一応まじめなForecastの例を置いときます

一年間の最高気温っぽいものを次の式ででっち上げてみます

= (12.5 * SIN(1/6 * PI() * (C2 + 1) * -1) + 12.5 )+ (1/ 12 * C2) + (RAND() * 2 - 1)
Cの列には1から現在の行数-1した数がはいってます。1,2,3,4,...って感じ

これ何かっていうと0~25までの数値を12の周期で繰り返すsin関数と12の周期で1ずつ上昇する式、あとランダムに-1~1の値の変化が起こるようになっています
つまり1年周期で0℃から25℃までを繰り返して(2月に0℃)、1年ごとに1℃ずつ気温が上昇。ランダムな値を足すことできれいな式にならないようにしています
時系列的に言うと最初の()が周期、次がトレンド、最後が残差ですかね

これをForecast Sheetにいれるとこんな感じ

f:id:fantasticswallow:20150923215933p:plain

きれいに周期とトレンドに沿った形で予測されています
まあデータがデータだし普通に出て当たり前な気もしますが

そういえばExcelの時系列分析の手法は指数平滑法(Exponential Smoothing)と言って指数関数で重みをつけ、新しいデータほど重視されるという分析手法らしいです
読んでもよくわからなかったので興味があったらググってください…


MSのForecastの関数の説明はこちら
予測関数 - Excel

ちなみに現在のMy Picturesの画像数は4542だそうです。あと一週間あることを考慮すると普通に入りそうですね
こんなつらい予測データがあっていいのか

この辺で