『予測にいかす統計モデリングの基本』
の売上データの分析をトレースしてみた
2013.12.22
@berobero11
BUGS/Stan勉強会 #2 於 ドリコム
良書です!
買いましょう.
本発表のデータは書籍を参考にデータをゼロか
ら作成したものであり, 分析手法も異なります.
それらについて書籍の著者や統計数理研究所
に問い合わせたりしてはいけません.
仮想売上データ
オフィス街の近くのレストラン
• 2012/1/1~2013/12/31
• 繁忙期(8月)は欠損

売上
[千円]
day
Year Month Day
Wday
Weather
Head.count
2012
1
1
0
1
0
2012
1
2
1
1
7800
2012
1
3
2
1
0
2012
1
4
3
2
19400
2012
1
5
4
1
32000
2012
1
6
5
3
0
…
…
…
…
…
…
2013
12
27
5
5
14100
2013
12
28
6
3
6300
2013
12
29
0
1
17700
2013
12
30
1
1
0
2013
12
31
2
2
0

天気

曜日

0: 日
1: 月
…
6: 土

1:
2:
3:
4:
5:

晴れ
曇り
雨
大雨
雪

Sale
39.225
44.043
51.804
92.846
126.064
99.976
…
148.769
49.090
126.074
67.274
56.311

近くのイベント
の参加人数
売上
[千円]

イベントの参加人数

lm(formula = d$Sale ~ Sun + Mon + Tue + Wed + Thu + Fri + Sat
+ d$Weather + d$Head.count)

?
そこで統計モデリングですよ!
今回はStan, RStanを使いました

http://www.slideshare.net/berobero11/bugs-26159695
売上データの分解モデル
𝑆𝑎𝑙𝑒 𝑡 = 𝑡𝑟𝑒𝑛𝑑 𝑡 + 𝑤𝑒𝑒𝑘 𝑡 + 𝑟𝑎𝑖𝑛 𝑡 + 𝑒𝑣𝑒𝑛𝑡 𝑡 + 𝑎𝑟 𝑡 + 𝜀 𝑡

トレンド

雨効果
週効果

先頭が

AR項
イベント
効果

残差

小文字の変数: 推定すべきパラメータ
大文字の変数: すでに与えられているデータ・数値

とします.
モデル | トレンド
長期的変動を表す. 二次トレンドモデルを使う.
𝑡𝑟𝑒𝑛𝑑 𝑡 − 𝑡𝑟𝑒𝑛𝑑 𝑡−1 ≈ 𝑡𝑟𝑒𝑛𝑑 𝑡−1 − 𝑡𝑟𝑒𝑛𝑑 𝑡−2

𝑡𝑟𝑒𝑛𝑑 𝑡 = 2𝑡𝑟𝑒𝑛𝑑 𝑡−1 − 𝑡𝑟𝑒𝑛𝑑 𝑡−2 + 𝜀1 𝑡

𝜀1 𝑡 ~𝒩 0, 𝜎 𝑡𝑟𝑒𝑛𝑑
モデル | 週効果
𝑤𝑒𝑒𝑘 𝑡 = 𝑠 𝑡
+ 𝐷1 𝑡 𝑏1 𝑠 日,𝑡 − 𝑠 𝑡
+ 𝐷2 𝑡 𝑏2 𝑠 金,𝑡 − 𝑠 𝑡 + 𝑏3 𝑠 土,𝑡 − 𝑠 𝑡
値=1

値=0

𝐷1 𝑡

月~金の祝日

それ以外

𝐷2 𝑡

祝日でない月~木
かつ翌日が祝日

それ以外
モデル | 週効果
基本パターン (周期7)

7

𝑠 𝑡−𝑙 ≈ 0
𝑙=1

6

𝑠𝑡 = −

𝑠 𝑡−𝑙 + 𝜀2 𝑡
𝑙=1

𝜀2 𝑡 ~𝒩 0, 𝜎 𝑠
モデル | 週効果
祝日効果
祝日の売上がどのくらい直近の日曜の売上に似ているか
類似度 0 ≤ 𝑏1 ≤ 1

祝前日効果
祝前日の売上がどのくらい直近の金曜 or 土曜の売上に似ているか
類似度 0 ≤ 𝑏2, 𝑏3 ≤ 1
モデル | 雨効果
『悪天候になればなるほど・・・』
経験で変換: 天気数値
推定する係数 [千円]

Rain_val

𝑟𝑎𝑖𝑛 𝑡 = 𝑐_𝑟𝑎𝑖𝑛 ∗ 𝑅𝑎𝑖𝑛_𝑣𝑎𝑙

𝑡
モデル | イベント効果
経験で変換: 参加人数数値
推定する係数 [千円]

𝑒𝑣𝑒𝑛𝑡 𝑡 = 𝑐_𝑒𝑣𝑒𝑛𝑡 𝑡 ∗ 𝐸𝑣𝑒𝑛𝑡_𝑣𝑎𝑙
Event_val

イベントの参加人数
[万人]

𝑐_𝑒𝑣𝑒𝑛𝑡 𝑡 = 𝑐_𝑒𝑣𝑒𝑛𝑡 𝑡−1 + 𝜀3 𝑡
𝜀3 𝑡 ~𝒩 0, 𝜎 𝑒𝑣𝑒𝑛𝑡

𝑡
モデル | AR項
𝑎𝑟 𝑡 は 𝑡𝑟𝑒𝑛𝑑 𝑡 よりは短く 𝑤𝑒𝑒𝑘 𝑡 よりは長い時間スケール、
具体的には1ヶ月程度の周期を担う成分
このような他の項では説明できない時間スケール変動を表す
項をあらかじめ入れておくことが, モデリングに基づくデータ分
析の秘訣である.
[書籍より]
2

𝑎𝑟 𝑡 =

𝑐_𝑎𝑟𝑙 𝑎𝑟 𝑡−𝑙 + 𝜀4 𝑡
𝑙=1

𝜀4 𝑡 ~𝒩 0, 𝜎 𝑎𝑟
Stanコード (data, parametersブロック)
欠損値を別ループで回すため

範囲の制限
Stanコード (modelブロック)
モデルで事前分布を指定しなければ,
無情報事前分布が自動で設定されるので,
これだけでOK!

欠損値を別ループで回す
現在のマイポリシー
『Stanコードはなるべく減らす』
• transformed dataブロック
• generated quantitiesブロック
– なるべく使わないでRで計算
kickするRコード (RStanを使用)

今回, 欠損値は自分で入れました

{doParallel}を使って並列計算!
環境:
Windows 7 64 bit
R 3.0.2
Stan 2.0.1
分解の結果
売上データ, トレンド
週
雨
イベント

AR
売上
[千円]

残差
day

真の値
MCMCサンプル (n=1500)
MCMCサンプルの中央値
結果: トレンド
𝑡𝑟𝑒𝑛𝑑 𝑡

2年間

𝑡𝑟𝑒𝑛𝑑 𝑡
2013
2012
1年間
結果: 週効果 | 基本パターン
𝑠𝑡

売上
[千円]

真の値
MCMCサンプルの中央値

週末に売上が減る.
ビジネス街の影響.
結果: 週効果 | 祝日効果

類似度

真の値
MCMCサンプルの密度関数
MCMCサンプルの中央値, 95%CI

𝐷2 𝑡 = 1の日は3日だけだったので 𝑏2, 𝑏3の推定は厳しかった.
0 ≤ 𝑏1 ≤ 1の範囲の境界の値(=1.0)を推定させるのも厳しい様子.
結果: 雨効果

係数
[千円]

真の値
MCMCサンプルの密度関数
MCMCサンプルの中央値, 95%CI

悪天候になると売上が伸びる.
ビジネス街の影響.
結果: イベント効果
𝑒𝑣𝑒𝑛𝑡 𝑡

𝑐_𝑒𝑣𝑒𝑛𝑡 𝑡
売上
[千円]

day

真の値
MCMCサンプル (n=1500)
MCMCサンプルの中央値
結果: AR項, 残差
𝑎𝑟 𝑡

欠損値のあるところ

𝜀𝑡
売上
[千円]
day
気になる計算時間は・・・

☹

残念ながら約24時間とちょっと長い.
–
–
–
–

𝜎 𝑠 (s_s)だけが収束しにくかった.
このパラメータ以外は iter=10000 あればOK.
収束をよくする余地はあるのか?要調査.
vector化?
まとめ
• Stanで売上データの分解モデルを試しました.
割とうまくいきました. Stanと時系列データは相性良さそう.
• GARCH, ARIMAなどの時系列分析の手法と比べて, 様々な知
見やデータを組み合わせることで現象の理解がすすみそう.
Web上の情報(予定含む)
• Small Data Scientist Memorandum
– http://heartruptcy.blog.fc2.com/blog-entry-90.html
– R Advent Calendar 2013の26日目の記事になります.

• 書籍の元となった研究はこちら.
– 状態空間モデルを用いた飲食店売上の要因分解
• http://ci.nii.ac.jp/naid/110001183787

– 状態空間モデルによる 時系列データ解析 樋口知之 - 統計数理研究所
• http://tswww.ism.ac.jp/higuchi/index_e/papers/Kouza-TSA-Higuchi.pdf‎

『予測にいかす統計モデリングの基本』の売上データの分析をトレースしてみた