統計学といくつかのよしなしごと

つれづれなるままに、日くらし統計学にむかひて、心にうつりゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。

中心極限定理に頼ってイノベーター理論をそれっぽく使う

イノベーター理論はなぜ正規分布なのか?

 マーケターなら誰でも知っているだろう古典的な理論に、イノベーター理論がある。セグメントの設定とその切り方(分布)について実務的、概念的にはわかりやすく納得感があるのでよく出てくる考え方だが、統計をかじる人間からすると「なんで正規分布なん?」という疑問が出てくるだろう。実際この理論を根拠にターゲティングの提案をしたとき「なんで正規分布なん?」と思いいろいろググったことがあり、その時見つけた記事が以下。

 

ロジャースのイノベーター理論ってこれでいいの? - 廿TT

 

よく参考にさせてもらっているブログで、特に仮説検定のシリーズ

 

A/Bテストのガイドライン:仮説検定はいらない(Request for Comments|ご意見求む) - 廿TT

 

はとても面白く、また参考になった。

 

 で今回も参考にさせていただいたのだが、やはりとても面白く、続きの記事に書かれている実務マーケターのフィードバックまで鮮明にイメージできた(笑)

 

 そういうわけで基本的には記事に沿ってマーケティングを考えていけば良いと思うのだけれど、普及した理論や概念を修正したりそれらの範疇外のアプローチをとろうとすると予想以上に混乱を招き、現場の停滞を生むことが往々にしてある*1

ということで本記事では観点を変えて、イノベーター理論に「当てはまるような」アプローチをとってみる*2。ビジネスが停滞するくらいなら、「馴染みのある理論からも実際の観点からもそんなに間違ってない」提案をしてコトを進めようという試みである*3

 

着想

 ということで思いついたのが、「中心極限定理」を利用するというアプローチ。統計学の中核をなす定理でその内容は、「x1, x2, …, xnが独立に同一の分布にしたがうときnが十分大きいとき、その平均は近似的に正規分布に従う」というものである。これを基礎に「経済数学の直感的方法 確率・統計編」では、

この世の中には多種多様な確率分布があって、その分布パターンは当然どれも違う形をしている。(中略)ところが実はそれらを全部集めて混ぜると、それらの様々な確率分布を合成したものは、驚いたことに結局はきれいな正規分布になってしまうというのである。

と説明しており*4、ピンときた。以下はたぶんマーケターの方にはウケが良いだろうアプローチ。

 

Rでシミュレーション

 まず、イノベーター理論の5セグメントの順序に比例して強く(or弱く)なる変数を定義する。今回は以下の6つの変数を定義。

①先進性:新しい商品は進んで採用する

②流行感度:流行に敏感である

③情報収集:情報収集を自ら積極的に行う

④波及性:他者への影響力を持っている

⑤自分本位:他人の評価よりも自分の判断基準に従う

⑥情動性:費用対効果を重視せずに商品を購入する傾向がある

これらについて順序尺度でアンケートとってスコアとみなして足せばイノベーター理論になるよ、という話。やってみる。

 まずは6カテゴリそれぞれについて「あなた自身に当てはまる度合いはどの程度ですか?」と5件法でデータを得るケースを想定。各6カテゴリが5値のいずれかをとる確率分布に従うよう、適当に確率分布を作成する。

#イノベーター理論のためのダミーデータ作成
set.seed(123)

#N=1,000で4桁のユニークIDを作成
sampleID <- sample(1000:9999, 1000, replace = F)


#5値の確率分布を6つ作成
tekito <- sample(20:70, 30)
tekito <- matrix(tekito, c(6,5))
p <- prop.table(tekito, margin = 1) #pの各行を6カテゴリそれぞれの5段階値の出る確率として与える

-----------------------------------------------
> p
          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 0.1358025 0.2222222 0.2798354 0.1440329 0.2181070
[2,] 0.2462312 0.1608040 0.1959799 0.1407035 0.2562814
[3,] 0.1764706 0.1437908 0.1307190 0.2222222 0.3267974
[4,] 0.2752294 0.1743119 0.2155963 0.1972477 0.1376147
[5,] 0.2468619 0.2552301 0.2384937 0.1506276 0.1087866
[6,] 0.1518519 0.2592593 0.2407407 0.1148148 0.2333333
-----------------------------------------------

次に上記で作った確率分布をもとにサイズ1,000の回答データを作成し、アンケートローデータを得る。

#5段階尺度のアンケート回答データを適当に作成
for (i in 1:6){
  x <- sample(1:5, 1000, replace = T, prob = p[i, ] )
  assign(paste("category", i, sep = ""), x)
}

score <- as.data.frame(cbind(sampleID, category1, category2, category3, category4, category5, category6))

-----------------------------------------------
> head(score)
  sampleID category1 category2 category3 category4 category5 category6
1     3588         3         3         1         5         1         4
2     8093         5         3         4         3         3         3
3     4679         2         3         4         1         3         5
4     8944         3         5         5         4         2         5
5     9460         5         5         2         3         2         4
6     1409         5         2         4         5         4         5
-----------------------------------------------

ここで各カテゴリについてヒストグラムを書いて確認すると、こんな感じ。

#6カテゴリーのヒストグラムは
par(mfrow = c(2, 3))
hist(score$category1, breaks = seq(0.5, 5.5, 1), ylim = c(0, 350), xlab = "自分には当てはまらない ⇔ 自分には当てはまる",
     col = "slateblue2", labels = T, main = "先進性")
hist(score$category2, breaks = seq(0.5, 5.5, 1), ylim = c(0, 350), xlab = "自分には当てはまらない ⇔ 自分には当てはまる",
     col = "slateblue2", labels = T, main = "流行感度")
hist(score$category3, breaks = seq(0.5, 5.5, 1), ylim = c(0, 350), xlab = "自分には当てはまらない ⇔ 自分には当てはまる",
     col = "slateblue2", labels = T, main = "情報収集")
hist(score$category4, breaks = seq(0.5, 5.5, 1), ylim = c(0, 350), xlab = "自分には当てはまらない ⇔ 自分には当てはまる",
     col = "slateblue2", labels = T, main = "波及性")
hist(score$category5, breaks = seq(0.5, 5.5, 1), ylim = c(0, 350), xlab = "自分には当てはまらない ⇔ 自分には当てはまる",
     col = "slateblue2", labels = T, main = "自分本位")
hist(score$category6, breaks = seq(0.5, 5.5, 1), ylim = c(0, 350), xlab = "自分には当てはまらない ⇔ 自分には当てはまる",
     col = "slateblue2", labels = T, main = "情動性")

f:id:yanbow221:20170701014059p:plain

これらの値は順序尺度なので扱い的に問題ありそうだが、やむを得ずイノベーターとしての強さを表現するスコアの要素(=間隔尺度とみなす)とし、足し合わせた値をイノベータースコアとして定める。

#6カテゴリの回答を足し合わせた「イノベータースコア」を作成
score$innovator.score <- apply(score[2:7], 1, sum)

-----------------------------------------------
> head(score)
  sampleID category1 category2 category3 category4 category5 category6 innovator.score
1     3588         3         3         1         5         1         4              17
2     8093         5         3         4         3         3         3              21
3     4679         2         3         4         1         3         5              18
4     8944         3         5         5         4         2         5              24
5     9460         5         5         2         3         2         4              21
6     1409         5         2         4         5         4         5              25
-----------------------------------------------

#イノベータスコアのヒストグラム
par(mfrow = c(1, 1))
hist(score$innovator.score, breaks = seq(6.5, 30.5, 1), ylim = c(0, 150), xlab = "ラガード ⇔ イノベーター",
     col = "#ff00ff40", labels = T, main = "イノベータースコア")

#Q-Qプロット
qqnorm(score$innovator.score)

f:id:yanbow221:20170701014511p:plain
f:id:yanbow221:20170701014522p:plain

分布を見てみるとこんな感じで、正規分布っぽい。正規性を確認するためのQ-Qプロットを描いてみると、割と綺麗な直線になっていて正規分布とみなしてよさそう。

せっかくなのでもう一つ、正規性を検定するためのシャピロ・ウィルク検定をやってみると、

shapiro.test(score$innovator.score)

-----------------------------------------------
	Shapiro-Wilk normality test

data:  score$innovator.score
W = 0.99149, p-value = 1.59e-05
-----------------------------------------------

え…?高度に有意な結果。シャピロ・ウィルク検定の帰無仮説は「対象が正規分布に従う」なので、これを棄却すると「対象が正規分布に従わない」と結論づけることになる。
これではすっきりしないので、今回のイノベータースコアの平均と標準偏差に従う正規乱数を同じ1,000サイズで出し、それの結果を見比べてみることにする。

score.mean <- mean(score$innovator.score) #イノベータースコアの平均
score.sd <- sd(score$innovator.score) #イノベータースコアの標準偏差

#イノベータースコアで算出した平均と標準偏差に従う正規分布をプロット
n <- rnorm(1000, mean = score.mean, sd = score.sd)
hist(n, breaks = seq(6.5, 30.5, 1), ylim = c(0, 150), xlab = "ラガード ⇔ イノベーター",
     col = "#0000ff40", labels = T, main = "イノベータースコア")

f:id:yanbow221:20170701014830p:plain

#ヒストグラムを重ね合わせる
par(mfrow = c(1, 1))
hist(score$innovator.score, breaks = seq(6.5, 30.5, 1), ylim = c(0, 150), col = "#ff00ff40")
hist(n, breaks = seq(6.5, 30.5, 1), ylim = c(0, 150), col = "#0000ff40", add = T)

#正規性の検定
shapiro.test(n)

-----------------------------------------------
	Shapiro-Wilk normality test

data:  n
W = 0.99928, p-value = 0.9745
-----------------------------------------------

f:id:yanbow221:20170701014948p:plain

分布に関してはよく重なっている(図中紫の部分)にも関わらず、データnの方は検定の結果p=0.97で帰無仮説を棄却できない(=正規分布に従っていないとはいえない≒正規分布に従うとみなす)。ということでもうひと手間、正規乱数の小数点以下を丸めたデータn2を作り、同じことをやってみると、

#nの小数点を丸める
n2 <- round(n, digits = 0)
hist(n2, breaks = seq(6.5, 30.5, 1), ylim = c(0, 150), col = "#00FF7F44", add = T)

#正規性の検定
shapiro.test(n2)

-----------------------------------------------
	Shapiro-Wilk normality test

data:  n2
W = 0.99151, p-value = 1.616e-05
-----------------------------------------------

分布はnと同一なのに検定結果は有意という結果になる。これはどうも質的データを量的データとみなして進めてしまったことが原因みたい。

シャピロ・ウィルク検定

 シャピロ・ウィルクの検定における検定統計量はwikiシャピロ–ウィルク検定 - Wikipedia)をざっと見た感じ、順序統計量ってのが出てきてるからこれに25値しかとらないイノベータースコアを当てはめてしまったのが良くない気がする。

終わりに

 ということで、4尺度に関して勉強するとき必ず出てくる「順序尺度において四則演算は意味がない」というのはこういうときに効いてくる話なんだと思った。シャピロ・ウィルクの検定を材料にしたこのあたりの数理の検討はまた別の記事で頑張ってみよう。

 一方でもともとの主題だったイノベータースコアの妥当化?というか作り方については、発想としてはそんなに間違ってないと思うし実際正規分布に従う分布を描けることを確認した*5

 ビジネスの理論が先走って後戻りできないときに、ひとまずの妥協案として今回みたいなやり方でセグメントを定義しておいて、その後集めたデータで修正を図っていくという進め方も時にはありなんじゃないかな、と思った次第です。

*1:「小難しいこと言いやがって。こまけぇこたぁいいんだよ!」

*2:問題解決の本質的なアプローチでは全くないと思います。

*3:コミュニケーション能力

*4:定理では「xが同一の分布に従うとき」を条件にしているので本来は一つの変数における定理だが、同じ個に対して与えられる複数の変数の組み合わせの在り方を一つの分布として考えるというイメージかな?

*5:冒頭のとおり、正規分布に従わねばならない理由は全くないとは思いますが…