読者です 読者をやめる 読者になる 読者になる

Rを通じて統計学を学ぶ備忘録ブログ

SPSSからRに移行したい私のような人向けのR解説ブログ兼学習用備忘録。

大学の時にもっと勉強しておけばよかったマーケティング・リサーチ〜その7〜

大学の時にもっと勉強しておけばよかったマーケティング・リサーチの7話目です。毎度、更新するたびに、もっと勉強しておけばよかったと思います・・・。

市場反応分析

マーケティング戦略を考える場合、可能なのであれば予測または結果の分析をして、次回の戦略に生かしたいものです。そこで、今回はなんらかの効果を予測する分析(広告効果と新規店舗の売上についてですが・・・)、市場反応分析について書いていきます。この分析の目的は、マーケティング戦略が売上に対して意味があったのか否かを調べることにあります。現状の影響度合いを分析し、最適な結果が得られるように調整するために実施されるとも言えます。そして、この分析で用いられる一般的な分析手法が「一般化線形モデル(Generalized linear model:GLM、以下GLM)」です。 GLMは、1972年にネルダーとウェダーバーンによって提唱されました。線形回帰分析では正規分布を使うことを仮定していますが、GLM は、それ以外の確率分布を使った回帰分析(ロジスティック回帰、ポアソン回帰など)の統一的な枠組みのことです。頻繁に説明されている回帰分析をGMLの枠組みの中で考えると、誤差構造が正規分布でリンク関数は恒等リンク(gaussian(link = “identity”))を仮定している回帰分析と言えます。GMLは、線形予測子、リンク関数、誤差構造の3つの観点からモデルを構成することによって、さまざまな課題を解決します。例えば、誤差構造が正規分布しないとか、目的変数はマイナスの値を取らないはずが計算ではマイナス値をとってしまうなどです。そのような問題を柔軟に対応できるのがGMLです。

広告効果測定モデル

簡単にいうと、広告の効き目があるかどうかを分析します。つまり、売上高への影響が広告投入量とどのような関係にあるのかをみます。広告投下量だけではなく、ウェブ広告であればKPIの項目なんかでもいいですし、分析の仮説をうまく説明できる変数であればなんでも大丈夫かと・・・。以下の事例では「線形型」と「逓減型」を実施しています。「線形型」は説明変数が1単位あがると、係数β分だけ増加するするという単純な回帰モデルです。「逓減型」は、線形モデルとは異なり、説明変数の増加とともに、目的変数の値が鈍化していくようなモデルです。

新店舗出店にかかる売上予測モデル

こちらはこれまでの店舗のデータを生かして、新たな店舗を出店する際に、どれだけ売上を上げることができるのかを分析するものです。既存店の売上を目的変数にし、立地要因と言われるような「店舗面積」「交通量」「周辺人口」「競合店数」「駅からの距離」などなどを説明変数にして重回帰分析を行うことになります。

回帰分析、取りそぎのイロハ

回帰分析で気にするところは以下のような項目かと思われます。今回の記事のテーマはあくまでマーケティングリサーチなので、大まかな概要にとどめます。回帰モデルの有意性、係数の有意性(t値)、寄与率、回帰診断図、AIC、VIF。信頼区間とか予測区間とかいろいろありますが、今回はこれだけにします。

回帰モデルの有意性

回帰モデルが意味があるかどうかを検定します。「全ての回帰係数は0」という帰無仮説をたて、F検定を行い、有意性を検定します。具体的には、「回帰のばらつき」と「残差のばらつき」の分散比を検討します。「回帰のばらつき」を「残差のばらつき」で割ることで計算されます。回帰のばらつきが残差のばらつきに対して大きければ、モデルは有効であると考えれます。

係数の有意性(t value)

帰無仮説は「回帰係数が0」という帰無仮説に対し、t検定を行います。回帰係数をその標準誤差で割った数値。説明変数の目的変数に対する影響度合いと解釈できます。分野によりますが、私の分野では、t valueの絶対値が2以上あれば有効な変数と判断していました。というより、t valueが2だと、t分布の95%両側信頼区間で計算した場合のp<0.05(5%)が1.96なので有効というカラクリだったような・・・。

寄与率

R2は重相関係数を2乗した値です。モデルによって、全データの何%を説明変数で表現できるかを表しています。重回帰分析では、調整済みR2を確認します。変数が多いほど値が大きくなる傾向があるので、それを修正したものを調整済R2といいます。

回帰診断図

回帰診断図の詳しい解説は、バージニア大学のこちらページにあります。 http://data.library.virginia.edu/diagnostic-plots/

Residuals vs Fitted
均等水平線に対し散布する方がよい。横軸が予測値、縦軸が残差。残差の振る舞いを観察する。残差が0からどのように散らばっているかを確認する。外れ値がある時は、回帰係数がそれに引っ張られるので、外したほうがいいかも。

NormalQ-Q

データが正規分布に従う場合は、直線上にのる。データの正規性を確認するためのもの。データが正規分布に従っている場合は、直線にデータがのってきます。

Scale-Location

均等水平線に対し散布する方がよい。残差の変動状況を考察するために使用します。標準化した残差の絶対値の平方根を縦軸にし、予測値を横軸にした散布図。残差の大きさを確認するために使います。

Residuals vs Leverage

クック距離が0.5を超えると影響力あり。1を超えると特異に大きい。横軸は梃子値で、縦軸は標準化残差。赤線でクックの距離0.5を示している。クックの距離が0.5を超えると異常値として扱われます。梃子値は1以下で、残差とともに大きくなると問題あり。

AIC

モデル選択では、問題意識として、どのような統計モデルを選択するべきなのかを考えます。その判断基準の一つとして用いられるのが「AIC」です。AICは「よい予測をすることができる」モデルを選ぶための基準です。AICは「予測力の悪さ」を表すため、最小のモデルが「予測力の高い」モデルと言えます。従って、AICが小さいモデルを選択することで「予測力の高い」モデルを選択できるというわけです。モデルの説明変数については下記が詳しいです。 http://logics-of-blue.com/%E3%83%A2%E3%83%87%E3%83%AB%E9%81%B8%E6%8A%9E_%E7%90%86%E8%AB%96%E7%B7%A8/

VIF

Variance Inflation Factorの略で多重共線性と言われているやつです。マルチコリニアリティ(multicollinearity)とも言われます。 多重共線性とは、説明変数が相関している組み合わせが存在するため、係数が正しく推定できない状態になっていることをさします。つまる、説明変数のどちらkがいらない、ということです。すべてのVIFが1の場合は多重共線性はなく、VIFが1よりも大きい場合は予測変数が相関、VIFが5~10の場合、その項の回帰係数は適切に推定されないと考えれます。

R実践〜告効果測定モデル〜

今回用意している仮想データは、SalesAmount(売上)とAdvertisement(広告投下量)の2つの変数が格納されているデータセットです。売上に対し、広告が影響を与えているのかどうかを分析します。

> library(ggplot2)
> library(scales)
> library(car)
> Dataset <- read.csv("regression1.csv", header = TRUE)
> head(Dataset)

  SalesAmount Advertisement
1        2372           132
2        2590           108
3        2461            91
4        2409            78
5        2523            74
6        2690           161

#線形型モデル
> ggplot(Dataset, aes(x = Advertisement, y = SalesAmount)) + geom_point() + geom_smooth(method = "lm")
rplot02

> fit <- lm(SalesAmount ~ Advertisement, data = Dataset)
> summary(fit)

Call:
lm(formula = SalesAmount ~ Advertisement, data = Dataset)

Residuals:
    Min      1Q  Median      3Q     Max 
-329.19  -78.71    2.18   78.10  328.52 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)   2414.3693    23.0281 104.845   <2e-16 ***
Advertisement    1.3133     0.1432   9.172   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 117.5 on 198 degrees of freedom
Multiple R-squared:  0.2982,    Adjusted R-squared:  0.2947 
F-statistic: 84.13 on 1 and 198 DF,  p-value: < 2.2e-16

上記の結果より、広告投下量が「1」増加すると、売上が「1.31」増加することがわかりました。また、当てはまりの良さについては、0.298となっていますので、売上を説明することに対し、広告投下量は29%ほどしか説明できない、ということがわかります。また、広告投下量を増やせば、売上が上がり続けるというわけでもないので、逓減型モデルも見ておきます。

# 逓減型モデルの構築
> fit <- lm(log(SalesAmount) ~ log(Advertisement), data = Dataset)
> summary(fit)

Call:
lm(formula = log(SalesAmount) ~ log(Advertisement), data = Dataset)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.140544 -0.028072  0.000661  0.031569  0.114171 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)        7.538827   0.036218 208.152   <2e-16 ***
log(Advertisement) 0.066490   0.007327   9.074   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.04542 on 198 degrees of freedom
Multiple R-squared:  0.2937,    Adjusted R-squared:  0.2902 
F-statistic: 82.34 on 1 and 198 DF,  p-value: < 2.2e-16

> fit.data <- data.frame(Advertisement = Dataset$Advertisement, SalesAmount = exp(fit$fitted.values))
> ggplot(Dataset, aes(x = Advertisement, y = SalesAmount)) + geom_point() +
  geom_line(data = fit.data, aes(x = Advertisement, y = SalesAmount))
rplot

上記の結果より、広告投下量が「1%」増加すると、売上が「0.06%」増加することがわかりました。仮に広告投下量が100%増しで100→200に上がった場合、100×0.06=6%増に対して、200→300に上がった場合、50*0.06=3%増となり、増分が小さくなります。また、当てはまりの良さについては、0.293となっていますので、売上を説明することに対し、広告投下量は29%ほどしか説明できない、ということがわかります。 xが1%増加した時にyが××××%増加するというのは以下のように対数から戻すと解釈しやすくなります。

log(y) = 7.538827 + 0.066490*log(x)
↓
y = (e^7.538827) * (x^0.066490)

henkan <- function(a, b, x){
  yy <- (2.71826395^a) * x^b
  print(yy)
}

従って、x=100の場合はy=2551.006ですし、x=200の場合はy=2671.327、x=500の場合はy=2839.135、x=1000の場合はy=2973.045となりますね。

R実践〜新店舗出店にかかる売上予測モデル〜

今回用意している仮想データは、size(店舗サイズ)、distance(駅からの距離)、amount(売上)、competitor(競合店舗のありなし)、variety(取り扱い商品種類)の変数が格納されているデータセットになります。新たに出店する店舗の売上を予測するために過去のデータを用いて、売上に対する各変数の影響力を測定します。

> Dataset <- read.csv("regression2.csv", header = TRUE)
> head(Dataset)

  size distance amount competitor variety
1   10       80    469          0     100
2    8        0    366          0      78
3    8      200    371          0      89
4    5      200    208          1      50
5    7      300    246          1      47
6    8      230    297          0      56

> plot(Dataset)
rplot

> round(cor(Dataset), 2)

            size distance amount competitor variety
size        1.00     0.13   0.20      -0.17    0.14
distance    0.13     1.00  -0.09       0.06   -0.18
amount      0.20    -0.09   1.00      -0.33    0.13
competitor -0.17     0.06  -0.33       1.00   -0.39
variety     0.14    -0.18   0.13      -0.39    1.00

> fit <- glm(amount ~ size + distance + competitor + variety, data = Dataset, family = gaussian(link = "identity"))
summary(fit)

Call:
glm(formula = amount ~ size + distance + competitor + variety, 
    family = gaussian(link = "identity"), data = Dataset)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-277.472   -51.431     2.663    56.635   184.819  

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 330.45375   49.07320   6.734 1.25e-09 ***
size          5.38462    3.23512   1.664  0.09932 .  
distance     -0.09118    0.09049  -1.008  0.31620    
competitor  -61.44525   21.04431  -2.920  0.00437 ** 
variety      -0.12423    0.41554  -0.299  0.76563    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 7741.824)

    Null deviance: 851311  on 99  degrees of freedom
Residual deviance: 735473  on 95  degrees of freedom
AIC: 1186.1

Number of Fisher Scoring iterations: 2

以下のような予測モデルになっています。 y = 330.4 + (size5.3) + (distance-0.09) + (competitor-61.4) + (variety-0.12) 店舗サイズが大きくなると売上にはプラスで、駅から遠くなったり、競合店舗があるとマイナス影響という結果になっています。また、商品の種類は増えすぎるとマイナス影響という結果になっています。また、size(10%)、competitor(1%)が有意な変数となっており、amountに影響を与えていることがわかります。以下はt valueを元に影響度合いを見たものになります。

> df <- data.frame(x = c("Intercept","size","distance", "competitor", "variety"), y = c(6.734, 1.664, -1.008, -2.920, -0.299))
> ggplot(df, aes(x, y)) + geom_bar(stat = "identity") + ylab("t value") + xlab(NULL)
rplot03
> par(mfrow=c(2,2))
> plot(fit)
rplot01
# Residuals vs Fitted:均等水平線に対し散布する方がよい。
# NormalQ-Q:データが正規分布に従う場合は、直線上にのる。
# Scale-Location:均等水平線に対し散布する方がよい。
# Residuals vs Leverage:クック距離が0.5を超えると影響力あり。1を超えると特異に大きい
  
> vif(fit) #check multicollinearity

      size   distance   competitor    variety 
  1.061552   1.059872   1.201283      1.232412 
#すべてのVIFが1の場合は多重共線性はない。
#VIFが1よりも大きい場合は予測変数が相関。
#VIFが5~10の場合、その項の回帰係数は適切に推定されない。

> Dataset_scale <- as.data.frame(scale(Dataset))
> fit <- step(glm(amount ~ ., data = Dataset_scale, family = gaussian(link = "identity")))

Start:  AIC=280.16
amount ~ size + distance + competitor + variety

             Df Deviance    AIC
- variety     1   85.610 278.25
- distance    1   86.443 279.22
            85.529 280.16
- size        1   88.023 281.03
- competitor  1   93.204 286.75

Step:  AIC=278.25
amount ~ size + distance + competitor

             Df Deviance    AIC
- distance    1   86.455 277.23
            85.610 278.25
- size        1   88.037 279.05
- competitor  1   93.856 285.45

Step:  AIC=277.23
amount ~ size + competitor

             Df Deviance    AIC
            86.455 277.23
- size        1   88.532 277.61
- competitor  1   95.176 284.84

> summary(fit)

Call:
glm(formula = amount ~ size + competitor, family = gaussian(link = "identity"), 
    data = Dataset_scale)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.0306  -0.6192   0.1147   0.5607   1.9965  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept)  1.327e-16  9.441e-02   0.000  1.00000   
size         1.468e-01  9.620e-02   1.526  0.13017   
competitor  -3.009e-01  9.620e-02  -3.128  0.00232 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 0.8912914)

    Null deviance: 99.000  on 99  degrees of freedom
Residual deviance: 86.455  on 97  degrees of freedom
AIC: 277.23

Number of Fisher Scoring iterations: 2

AICをもとに最適なモデルを返してくれるStep関数を使った結果です。size、competitorを使ったモデルがAICが最小になり、予測力の高いモデルということになりました。また、標準化しているため、偏回帰係数で変数の数値で影響度合いを比較できます。おしまい。