インターネット広告代理店で働くデータサイエンティストのブログ -11ページ目
前回からの続きです。

今回も安井(@housecat442)が担当します。

さて、前回簡単な回帰分析でデバイス間の相関を取ってもそれって怪しいんじゃないか?というお話をしました。

ちょっとおさらいのためにRで実験をしてみましょう。

まずはsinカーブと乱数を使って周期性のデータを二つ作ります。

cycle.a <- ts(sin(1:168)+rnorm(168,0,0.5) + 5 ,frequency=6) #SPのimp
cycle.b <- ts(sin(1:168)*10+rnorm(168,0,5) + 50 ,frequency=6)  #PCのimp


cycle.aはスマホのある広告における表示回数だとして、cycle.bはPCのある広告における表示回数だとしましょう。
それぞれ4時間ごとに集計をしたデータだと仮定します。なので、6回データが観測されると1日という感じになります。

周期性は人間の行動に基づいていると仮定して1日ごとに周期していると考えます。

時系列のグラフを書いてみるとこんな感じです。



SPとPCの表示回数の散布図を描いてみましょう。

さて、この図を見てみると一見これだけでPCの表示回数が増えるとSPの表示回数が増える!と思えるように見えます。
が、まだPCとSPには何の関係性も持たせていません。

次にデータにPCの表示回数が100増えるとその効果によってSPの表示回数が5回増えるような関係性を持たせます。

da <- cycle.b*0.05
a <- da + cycle.a

図にしてみるとこんな感じになります。


さて、じゃぁここで回帰分析をしてみるとこんな感じの結果になります。

Call:
lm(formula = a ~ cycle.b - 1)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.04590 -0.47622 -0.01143  0.67430  2.29573 

Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
cycle.b 0.147902   0.001162   127.3   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7713 on 167 degrees of freedom
Multiple R-squared:  0.9898, Adjusted R-squared:  0.9897 
F-statistic: 1.621e+04 on 1 and 167 DF,  p-value: < 2.2e-16


結果を見てみると、PCの表示回数が100回増えるとSPの表示回数が15回増えるといったかんじの結果になっています。
あれ、5回じゃないんでしたっけ?という話になりますよね。

実は残りの10回は最初に作った二つの周期性の関係からきています。

つまりこの結果の15回は、周期性と実際の効果が入り混じったものになってしまっているわけです。

この結果を元にPCの表示回数の間接効果なんかについて説くと怒られてしまいます。


さて、こんな時に利用できる処理の一つに「季節差分」というものがあります。

経済学に関連した時系列分析では一般的には今年と去年の差分を取ることをで用いられます。

例えば春夏秋冬という季節性によって周期が発生しているとすると、今年の春の値から去年の春の値を差し引くわけです。

季節による効果というのが今年と去年で変わらないと考えるとすると、以下のことが言えます。

今年の値 = (周期性+今年のほかの要因)
昨年の値 = (周期性+昨年のほかの要因)

今年の値-昨年の値 = (周期性+今年のほかの要因) - (周期性+昨年のほかの要因) = 今年のほかの要因 - 昨年のほかの要因

これによって周期性を打ち消すことが出来るわけです。

これを用いてPCの表示回数とSPの表示回数で同様に差分を取って分析を行えば、

PCの表示回数が昨日の同時間帯よりも多かったときに、SPの表示回数が昨日よりも多かったのか?を問うことが出来ます。

おー

って感じですね。

季節差分を取った状態でかいきぶんせきをしてみるとこんな感じになります。

Call:
lm(formula = diff.a ~ diff.b - 1)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.09208 -0.48072  0.02798  0.44265  1.66901 

Coefficients:
       Estimate Std. Error t value Pr(>|t|)    
diff.b 0.050765   0.006595   7.698 1.32e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.6565 on 161 degrees of freedom
Multiple R-squared:  0.269, Adjusted R-squared:  0.2645 
F-statistic: 59.25 on 1 and 161 DF,  p-value: 1.32e-12


推定値はちゃんと0.05と出てくれましたので、PCで表示回数が100増えるとSPでの表示回数が5回増えるとなってくれました。



現実の場合ではPCとSPの周期性が重なる事ってあまりないのですが、ラグを取って相関を見るケースなどが多々あるので、そのようなケースにはこういった罠に陥りがちです。

VARモデルでIRFなんかを使った場合には、出てきた結果がただの周期性でしたなんて話も実は合ったりなかったり・・・

結構そういった結果を目にする事があったりなかったり・・・

といったようにですね、周期性に配慮しつつ分析することはかなり大事ですねというお話でした。



以下Rのサンプルコードです。

###########################################

#sinカーブを利用して二つの周期性を持つデータを作る。
cycle.a <- ts(sin(1:168)+rnorm(168,0,0.5) + 5 ,frequency=6) #SPのimp
cycle.b <- ts(sin(1:168)*10+rnorm(168,0,5) + 50 ,frequency=6) #PCのimp

#とりあえずプロットしてみる
plot(cycle.a,cycle.b)
ts.plot(cycle.a)
ts.plot(cycle.b)

#PCのimpが100回増えるとSPのimpが5回増えるようにデータを加工する。
da <- cycle.b*0.05
a <- da + cycle.a
a <- ts(a,frequency=6)

#プロットしてみる
plot(cycle.b,a)

#周期性への配慮なしに回帰分析をしてみる
reg <- lm(a ~ cycle.b)
summary(reg)

#季節差分をとって周期性を消す。
diff.a <- diff(a,6)
diff.b <- diff(cycle.b,6)

#周期性への配慮ありで回帰分析してみる
reg<-lm(diff.a ~ diff.b)
summary(reg)

###########################################