hiroshima.r#6 by imuyaoti

37
@imuyaoti R をををををををを ををををををををを2016.2.20 HiRoshima. R #6 をををを→Stan ををををををを

Upload: imuyaoti

Post on 23-Jan-2017

479 views

Category:

Data & Analytics


1 download

TRANSCRIPT

Page 1: HiRoshima.R#6 by imuyaoti

@imuyaoti

R を小規模飲食店の   経営に活用するには?

2016.2.20 

HiR

oshima. R

#6

 

途中報告!

→Stan に挑戦しました

Page 2: HiRoshima.R#6 by imuyaoti

2

お店の売り上げデータ

好きにしていいよって

言われたけど、

R で何かできないかな

Page 3: HiRoshima.R#6 by imuyaoti

3

Page 4: HiRoshima.R#6 by imuyaoti

4

こんなことができるようになりたい!!

Page 5: HiRoshima.R#6 by imuyaoti

5 データの概要

データ・期間: 2015/3/18 ~ 2015/12/31・客数:合計、新規客

・売上:合計、チャージ、ドリンク、フード

・注文数:合計、チャージ、ドリンク、フード

・その他:天候、気温、雨量

仕入や経費のデータは今回は扱わない

Page 6: HiRoshima.R#6 by imuyaoti

6

売上を上げる

方法を考えたい!

Page 7: HiRoshima.R#6 by imuyaoti

7 売上とは?

売上

ドリンク売上

フード売上

チャージ売上 = チャージ金額 × 客数

= 1人当たりドリンク平均額 × 客数

= 1人当たりフード平均額 × 客数

ドリンク平均単価 × 1人当たりドリンク注文数

フード平均単価 × 1人当たりフード注文数

Page 8: HiRoshima.R#6 by imuyaoti

8 売上とは?

𝑺𝒕

𝑺𝒅

𝑺 𝒇

𝑺𝒄 =  × =  × 

=×𝑷 𝒅×𝑵 𝒅

𝑷 𝒇×𝑵 𝒇

:売上、:客数、

:客単価

:単価および平均単価、

:1人当たりの平均注文数、

:合計、 :チャージ、

:ドリンク、 :フード

数式にすると…

Page 9: HiRoshima.R#6 by imuyaoti

9 売上とは?

𝑺𝒕=𝑪𝒕𝒎× {𝑷𝒄+(𝑷 𝒅×𝑵 𝒅 )+ (𝑷 𝒇 ×𝑵 𝒇 ) }𝑨𝒅 𝑨 𝒇𝑨𝒕

売上 = 客数 × 客単価つまりは

整理すると…

Page 10: HiRoshima.R#6 by imuyaoti

10 売上とは?

売上アップに効果的な要因はどれか?

𝑺𝒕=𝑪𝒕𝒎× {𝑷𝒄+(𝑷 𝒅×𝑵 𝒅 )+ (𝑷 𝒇 ×𝑵 𝒇 ) }

お客さんを増やす?

チャージ金額を上げる?

価格の高いメニューをすすめる?

注文数を増やす?

商品の価格を上げる?

いろいろあるけど…

Page 11: HiRoshima.R#6 by imuyaoti

11

わたしができることは

グラスが空いているお客さんに

「もう一杯いかがですか?」と声をかけることぐらい…

現実は ...

𝑺𝒕=𝑪𝒕𝒎× {𝑷𝒄+(𝑷 𝒅×𝑵 𝒅 )+ (𝑷 𝒇 ×𝑵 𝒇 ) }1人当たりのドリンク注文数を増やす

Page 12: HiRoshima.R#6 by imuyaoti

• 売上予測モデルをつくる

• 声掛けで増加できるを推定する

• が増加した場合の今後の売上を予測する

早くもココで挫折

声かけによるドリンク注文数の増加が売上に及ぼす影響を予測したい

Page 13: HiRoshima.R#6 by imuyaoti

13 どんなモデル?

𝑪𝒕𝒎=𝑾𝒕𝒓 +𝑴𝒕𝒉+𝑫𝒂𝒚+𝑯𝒐𝒍…:アテがあればお酒がススム

天候 月 曜日 休日

𝑵 𝒅∝𝑵 𝒇

とりあえず思いついたこと

Page 14: HiRoshima.R#6 by imuyaoti

14  どんなモデル?

時系列データである!

Page 15: HiRoshima.R#6 by imuyaoti

15 データをながめるData %>% ggplot(aes(x = ymd))+ geom_line(aes( y = sal), color= "#a9a9a9", size = 0.8)+ geom_line(aes( y = TTR :: SMA(sal, n = 7)), color= "#f8766D", size = 0.8)+ geom_hline(yintercept = mean(Data$sal), color = "#dc143c", size = 0.5)+ labs(x = “Time”, y =“St :売上” )+ my.theme

3 月開店 12 月定休日なし

ゆるやかに増加傾向?

売上の推移

Page 16: HiRoshima.R#6 by imuyaoti

16 データをながめる

売上と客数の傾向は類似

客単価は横ばい

売上・客数・客単価の推移を比較

Page 17: HiRoshima.R#6 by imuyaoti

17 データをながめる

ggpairs{GGally}

客数と関連しそうな要因

Page 18: HiRoshima.R#6 by imuyaoti

18 データをながめる

細かいところは見にくいですが、

これくらい全体をざっとながめて

データの雰囲気を

つかめるようになりたい

Page 19: HiRoshima.R#6 by imuyaoti

19 データをながめる

客数と関連しそうな要因 pick up

天候

休日前日

曜日などなど。。。

Page 20: HiRoshima.R#6 by imuyaoti

20

ぜんぶ見てたら進めない…

とりあえずで

何かつくってやってみよ…

Page 21: HiRoshima.R#6 by imuyaoti

 モデル作成 21

𝑺𝒕=𝑪𝒕𝒎×𝑨𝒕

𝑵 𝒇=𝜶+𝜷𝑵 𝒅+𝜺𝟐

𝑨𝒕=𝑨𝒅+𝑨𝒇

・売上を客数と客単価から算出する・客数を天候、曜日、休日前日効果、時系列的要因で予測する・ドリンク注文数がフード注文数に影響する

こんなモデルを考えてみた

時系列プロットの比較から

の時間的変動は

によるものとした。

𝒘𝒆𝒆𝒌

Page 22: HiRoshima.R#6 by imuyaoti

22  RStan でうごか…

いろいろとひどすぎて

ぜんぜんできなかった

Page 23: HiRoshima.R#6 by imuyaoti

23

申し訳ないですが

   今ここまでです。。

真似すればできるものではなかった…

大いに反省中。。。

Page 24: HiRoshima.R#6 by imuyaoti

24

ここから延長戦。

 ・ Stan の文法をちゃんと勉強する

 ・簡単なモデルからはじめて、

  最後に組み合わせる

  で、 Stan をうごかすことはできました。

Page 25: HiRoshima.R#6 by imuyaoti

25

• 休日効果は休日前日効果のみ

• イベント効果を入れていない

• generated quantities ブロックで    予測値を計算した

と少し違うところ

Page 26: HiRoshima.R#6 by imuyaoti

26data{ int<lower=0> N; # サンプルサイズ real<lower=0> Nd[N]; # 1人当たりドリンク注文数 real<lower=0> Nf[N]; # 1人当たりフード注文数 real<lower=0> Pd[N]; # ドリンク平均単価 real<lower=0> Pf[N]; # フード平均単価 int<lower=0, upper=6> Day[N];   # 曜日 (0 ~ 6 :日~土 ) int<lower=0, upper=1> Phol[N];   # 休日前日= 1 、それ以外= 0 real<lower=0, upper=1> Rain[N]; # 雨量効果 (0~0.9mm = 0 、 1.0~9.9mm = 0.5 、

10.0~19.9mm = 0.5 、 20mm~ = 1) real<lower=0> Ctm[N]; # 客数}

  data

※ オープン月の3月のデータは除いた

Page 27: HiRoshima.R#6 by imuyaoti

27  parameters

parameters{ real<lower=0> b1; real b2; real trend[N]; real<lower=0> b3; real<lower=0> b4; real s[N]; real c_rain[N]; real ar[N]; real c_ar[2]; real<lower=0, upper=100> sigma[5];}

Page 28: HiRoshima.R#6 by imuyaoti

  modelmodel{ real week[N]; real rain[N]; real ctm_mu[N];

for(i in 1:N) Nf[i] ~ normal(b1 + b2*Nd[i], sigma[1]); for(i in 3:N) trend[i] ~ normal(2*trend[i-1] - trend[i-2], sigma[2]);   for(i in 7:N) s[i] ~ normal(-s[i-1]-s[i-2]-s[i-3]-s[i-4]-s[i-5]-s[i-6], sigma[3]); for(i in 1:4) # データが水曜 始まりのため week[i] <- s[i]; for(i in 5:N) week[i] <- s[i] + Phol[i]*(b3*(s[i-Day[i]-2]-s[i])+b4*(s[i-Day[i]-1]-s[i])); for(i in 1:N) rain[i] <- c_rain*Rain[i]; for(i in 3:N) ar[i] ~ normal(c_ar[1]*ar[i-1] + c_ar[2]*ar[i-2], sigma[4]); for(i in 1:N) ctm_mu[i] <- trend[i] + week[i] + ar[i]; for(i in 1:N) Ctm[i] ~ normal(ctm_mu[i], sigma[5]);

28の推定に必要な、

計算によって求められる変数の宣言※generated quantities に引き継げない!

Page 29: HiRoshima.R#6 by imuyaoti

29  generated quantitiesgenerated quantities{ real nf_pre[N]; real at_pre[N]; real week2[N]; real rain2[N]; real ctm_mu2[N]; real ctm_pre[N]; real sal_pre[N]; for(i in 1:N) nf_pre[i] <- normal_rng(b1 + b2*Nd[i], sigma[1]); for(i in 1:N) at_pre[i] <- Pd[i]*Nd[i] + Pf[i]*nf_pre[i] + 500; for(i in 1:4) week2[i] <- s[i]; for(i in 5:N) week2[i] <- s[i] + Phol[i]*(b3*(s[i-Day[i]-2]-s[i])+b4*(s[i-Day[i]-1]-s[i])); for(i in 1:N) ctm_mu2[i] <- trend[i] + week2[i] + ar[i]; for(i in 1:N) ctm_pre[i] <- normal_rng(ctm_mu2[i], sigma[5]); for(i in 1:N) sal_pre[i] <- ctm_pre[i]*at_pre[i];

から引き継げないので、

変数名を変えて再定義

Page 30: HiRoshima.R#6 by imuyaoti

30 kick

library(rstan)war <- 1000ite <- 10000dig <- 3cha <- 3Thi   <- 30

rstan_options(auto_write = TRUE)options(mc.cores = parallel::detectCores())

data <- list(N=nrow(Data), Nd = Data$nd, Nf = Data$nf, Pf = Data$pf, Pd = Data$pd, Day=day, Phol = Data2$phol, Rain = Data2$rain, Ctm = Data2$ctm)

fit <- stan(file = ".stan", data = data, thin = thi, verbose = F, chains = cha, warmup = war, iter = ite)

Page 31: HiRoshima.R#6 by imuyaoti

31 結果:客数の成分分解

𝒘𝒆𝒆𝒌𝑻𝒓𝒆𝒏𝒅

𝑹𝒂𝒊𝒏 𝑨𝑹

Page 32: HiRoshima.R#6 by imuyaoti

32 結果:客数…週効果

  b3 :直近の金曜日との類似度  b4 :直近の土曜日との類似度

𝑫𝒂𝒚 𝑷𝒉𝒐𝒍

Page 33: HiRoshima.R#6 by imuyaoti

33 結果:客数…雨効果

𝑪𝑹𝒂𝒊𝒏

・仮説検定的に考えると、 信頼区間がゼロをまたいでいる・値でみても、どしゃぶり 20 ㎜以上の日 でも 1 名程度しか客数に影響はない

Page 34: HiRoshima.R#6 by imuyaoti

34 結果 客単価、フード注文数

𝑵𝒇=𝒃𝟏+𝒃𝟐∗𝑵𝒅+𝜺

青:実測値赤:予測値

𝑵 𝒇青:実測値赤:予測値

単純にドリンク注文数で予測できるものではなかった

Page 35: HiRoshima.R#6 by imuyaoti

35 結果:観測値と予測値の比較

𝑺𝒕

𝑪𝒕𝒎 𝑨𝒕

客単価に占めるフードの割合が小さく、フード注文数の予測が悪くても客単価予測にあまり影響しない。

青:実測値赤:予測値

青:実測値赤:予測値

青:実測値赤:予測値

Page 36: HiRoshima.R#6 by imuyaoti

36 参考にさせていただきました

@berobero11 さんのスライドRStan で『予測にいかす統計モデリングの基本』の売上データの分析をトレースしてみたhttp://www.slideshare.net/berobero11/ss-29409382

樋口知之先生 著予測にいかす統計モデリングの基本

牛 廿 TT さんのページ状態空間モデルで自然検索トラフィックの成長を予測するhttp://abrahamcow.hatenablog.com/entry/2016/02/06/080906

などなど