みずぎわブログ

技術系のことや日々に考えたことを書き連ねます

Rを使っての一般化線形モデルをggplotで図示しながらやる

手を動かしながら学ぶ ビジネスに活かすデータマイニングの勉強第3回

手を動かしながら学ぶ ビジネスに活かすデータマイニング

手を動かしながら学ぶ ビジネスに活かすデータマイニング

前回と似たような内容なるが,重回帰分析を一般化した一般化線形モデルについて取り組んだ.

一般化線形モデル

重回帰分析

  • 目的変数:正規分布に従う
  • 回帰方法:線形(直線的)

一般化線形モデル

カテゴリごとの価格帯と購入率の関係を分析する

カテゴリごとの価格帯にが購入率に関係していると仮説をたてる

ただ,よくわからないので試験的に売っていみるかと価格帯を適当に定めて販売する

結果を得る

> head(d1)
   d11  d12  d13  cvr
1 4400 5600 2300 0.94
2 3000 3900 3900 0.05
3 2700 3900 5400 0.01
4 4400 4300 3700 0.88
5 3000 5200 3600 0.27
6 2800 4100 4500 0.83

可視化してみる

> md1 <- melt(d1)
> md1$num <- c(1:30)
> p <- ggplot(md1, aes(x=num, y=value, fill=variable, color=variable)) + geom_line()
> p + facet_grid(variable ~ ., scales = "free_y")

f:id:yusuke0h:20140918164922j:plain


回帰分析により,購入率とカテゴリごとの価格帯の関係を得る

> d1.glm <- glm(cvr~., d1, family=binomial)
 警告メッセージ: 
In eval(expr, envir, enclos) :  二項 glm で整数でない成功数がありました! 


結果,食品の価格帯が購入率に直結していると分かった

> summary(d1.glm)

Call:
glm(formula = cvr ~ ., family = binomial, data = d1)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-1.03739  -0.28188  -0.09022   0.21891   1.57252  

Coefficients:
              Estimate Std. Error z value Pr(>|z|)   
(Intercept) -4.2249329  4.5516014  -0.928  0.35329   
d11          0.0025792  0.0009027   2.857  0.00427 ** #Estimateが正の値なので正の相関がある
d12         -0.0003517  0.0005721  -0.615  0.53867   
d13         -0.0007600  0.0007121  -1.067  0.28581   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 26.0459  on 29  degrees of freedom
Residual deviance:  7.8531  on 26  degrees of freedom
AIC: 23.461

Number of Fisher Scoring iterations: 6


つまり,食品を豪華にし,その他はそこそこで売れば儲かる

この問題の場合には重回帰分析でもよかったのでは?

ちなみに今回のデータに重回帰分析を行ってみる.

> d1.lm <- lm(cvr~., d1)
> summary(d1.lm)

Call:
lm(formula = cvr ~ ., data = d1)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.43109 -0.11438 -0.02763  0.09701  0.62835 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.114e-01  4.396e-01  -0.708   0.4850    
d11          3.613e-04  4.885e-05   7.396 7.47e-08 *** #ここ やっぱりd11が正の相関がある
d12         -8.797e-06  5.008e-05  -0.176   0.8619    
d13         -1.028e-04  5.972e-05  -1.721   0.0971 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2488 on 26 degrees of freedom
Multiple R-squared:  0.6856,  Adjusted R-squared:  0.6494 
F-statistic:  18.9 on 3 and 26 DF,  p-value: 1.031e-06

結果,d11が購入率に対して正の相関があるとなった. これは先程のロジスティック回帰の結果と同じだ. そこで,今回の目的変数である購入率(cvr)の分布を見る

> hist(d1$cvr)
> ggplot(d1, aes(x=d1$cvr)) + geom_histogram(binwidth = 0.1)

f:id:yusuke0h:20140918164945j:plain

f:id:yusuke0h:20140918164951j:plain

分布は0と1に偏っている. そのため重回帰分析では誤差が大きくなると思う. つまり,目的変数の分布を見て,最適な回帰モデルを選択するがあるのかと思う.

どのキャンペーンページが効果的だったのかを分析

キャンペーンページとそのコンバージョンのありなしのデータがある.

> head(d2)
  d21 d22 d23 d24 d25 d26 cv
1   1   0   1   1   0   1  1
2   0   1   0   1   1   0  0
3   1   0   1   0   1   1  1
4   0   1   0   0   1   0  0
5   1   0   0   1   1   1  1
6   1   0   0   1   0   1  1

データと目的変数を図で見る.

> md2 <- melt(d2)
Using  as id variables
> md2$num <- c(1:125)
> p <- ggplot(md2, aes(x=num, y=value, fill=variable, color=variable)) + geom_line()
> p + facet_grid(variable ~ ., scales = "free_y")

f:id:yusuke0h:20140918165014j:plain

> hist(d2$cv)
> ggplot(d2, aes(x=d2$cv)) + geom_histogram()
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.

f:id:yusuke0h:20140918165027j:plain

f:id:yusuke0h:20140918165033j:plain

今回は思いっきり2値で二項分布に従うと思う. なのでロジスティック回帰を行う.

> d2.glm <- glm(cv ~ ., d2, family = binomial)
> summary(d2.glm)

Call:
glm(formula = cv ~ ., family = binomial, data = d2)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.3793  -0.3138  -0.2614   0.4173   2.4641  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)  
(Intercept)  -1.0120     0.9950  -1.017   0.3091  
d21           2.0566     0.8678   2.370   0.0178 *
d22          -1.7610     0.7464  -2.359   0.0183 *
d23          -0.2136     0.6131  -0.348   0.7276  
d24           0.2994     0.8368   0.358   0.7205  
d25          -0.3726     0.6064  -0.614   0.5390  
d26           1.4258     0.6408   2.225   0.0261 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 173.279  on 124  degrees of freedom
Residual deviance:  77.167  on 118  degrees of freedom
AIC: 91.167

Number of Fisher Scoring iterations: 5

d21, d24, d26に正の相関があるのでこのページがcvに結びついているとわかる.

一方重回帰分析では

> d2.lm <- lm(cv ~ ., d2)
> summary(d2.lm)

Call:
lm(formula = cv ~ ., data = d2)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.94326 -0.02773 -0.00223  0.08225  0.97227 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.31032    0.11071   2.803 0.005919 ** 
d21          0.38937    0.10898   3.573 0.000512 ***
d22         -0.25934    0.09261  -2.800 0.005969 ** 
d23         -0.02325    0.05620  -0.414 0.679826    
d24          0.06435    0.08912   0.722 0.471729    
d25         -0.02550    0.05771  -0.442 0.659354    
d26          0.17922    0.07185   2.494 0.014007 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3091 on 118 degrees of freedom
Multiple R-squared:  0.6393,  Adjusted R-squared:  0.6209 
F-statistic: 34.86 on 6 and 118 DF,  p-value: < 2.2e-16

ロジスティック回帰と同様な結果が得られ,上手く行っているように見える. 重回帰分析ではいったい何がよくないのだろうか? 誤差が大きいのかな? もっと極端なデータを使って重回帰分析で上手く行ってない感を味わいたい.