Tokyo.Webmining #3

『市場細分化とクラスター分析』
                   Bob#3



2010/04/17
自己紹介

●   【はてな】  id:bob3
●   【 Twitter 】 @bob3bob3

●
    バリバリの文系です。
●   仕事はマーケティング・リサーチャー。
●   本日はマーケティングの中で「クラスター分析」が、どのよ
    うに使われているか、その一例をお話します。
STP戦略
●   市場が成熟し消費者の行動や価値観も多様化し
    た今日にあって、ひとつの製品やサービスで市場
    のすべてのニーズを満たすことはできない。
●   そこで必要になるのが「STP戦略」というフレーム
    ワーク。
    ●
        Segmentation
        –   市場(消費者)をいくつかのグループに細分化。
    ●   Targeting
        –   ターゲットとなるグループを選択。
    ●
        Positioning
        –   どんな価値を提供するのかを明確にする。
市場細分化 Segmentation
             10 代
             20 代
     市
     場       30 代   男 女
     全       40 代   性 性
     体
             50 代
             60 代

●   セグメントごとにマーケティング・ミックスを決定する。
マーケティング・ミックス
●   製品( Product )
      –   仕様、機能、性能、パッケージなど
●   価格( Price )
      –   小売価格、値引き、特売など
●   流通( Place )
      –   販売経路など
●   プロモーション( Promotion )
      –   広告、PR、パブリシティ、イベント、キャンペーンなど
ダニエル・ヤンケロビッチ曰く
●   「年齢、性別、学歴、年収など、従来のデモグラ
    フィックスは、すでにマーケティング戦略の拠りどこ
    ろとしては不十分である。」
●   「それよりも、価値観や嗜好、選好といった特性の
    ほうが、消費者の購買行動への影響が大きい。」
●   「適切なマーケティング戦略を立案するには、まず
    特定のブランドや商品カテゴリーを受け入れそうな
    市場セグメントを特定することである。」
    ●
        社会心理学者。
    ●   1964年のお話。
市場細分化の基準
●   客観的基準
    ●
        デモグラフィック(人口統計学的基準)
        –   年齢、性別、所得、家族構成、職業、ライフステージなど
    ●   ジオグラフィック(地理的基準)
        –   居住地、気候、文化など
●   主観的基準
    ●   サイコグラフィック(心理的基準)
        –   価値観、嗜好、性格、ライフスタイルなど
    ●
        ビヘイビアル(行動的基準)
        –   使用頻度、使用の仕方、求めるベネフィットなど
今回使うデータ
 ●   『経済・経営のための統計学』
     ●
         有斐閣
     ●   Rを使った分析例も一部載って
         ます。
     ●   第8章「マーケティング」で使わ
         れているデータを使わせていた
         だきます。
缶コーヒーに関するアンケート
●
     調査票
     ●
         http://yuhikaku-nibu.txt-nifty.com/blog/files/COFFEE-survey.pdf
●    データ
     ●
         http://yuhikaku-nibu.txt-nifty.com/blog/files/COFFEE.txt
●
     今回使う質問。Q7“「缶コーヒー」について以下の考えがあります。それぞれにつ
     いて、あなたのお考えに近い番号に○をつけてください。”

                              非常に      そうである   どちらとも    そう     まったく
                              そうである            いえない     ではない   そうではない
    味や、品質にこだわる                   5        4      3         2      1
    ときと場合により、飲みわける               5        4       3       2         1
    気に入ったブランドはない                 5        4       3       2         1
    人よりよく知っている                   5        4       3       2         1
    ひとより多く飲む                     5        4       3       2         1
    特に気にしない                      5        4       3       2         1
    新製品が出ると試してみる                 5        4       3       2         1
    好きなブランドを人に勧めることがある           5        4       3       2         1
分析の手順
1.次元縮約
 ●
     7つの質問項目を少数の変数に要約する。
 ●   因子分析、主成分分析、 SEM などを使う。
 ●   理由:解釈のしやすさ、“次元の呪い”。

2.グループ分け
 ●
     ブランド、製品などには階層型クラスター分析。
 ●
     消費者をグループ分けするときは分割型。
 ●
     決定木、潜在クラスモデルなども使われる。
R にデータを読み込む
# ワーキングディレクトリの設定と確認。 COFFEE.txt を置いておく。
setwd("C:/R/dat")
getwd()

# タブ区切りのテキストファイル。欠損値は“ .” で入力されている。
COFFEE <- read.delim("COFFEE.txt", na.strings=".")

# 対象者番号と Q7 の回答を取り出す。欠損値のある対象者は除く。
Q7 <- na.omit(COFFEE[, c(1, 34:41)])

# 変数名を付ける。
colnames(Q7) <- c(" 対象者番号 ", " 味や品質にこだわる ",
                  " 時と場合により飲みわける ", " 気に入ったブランドはない ",
                  " 人よりよく知っている ", " ひとより多く飲む ", " 特に気にしない ",
                  " 新製品が出ると試してみる ",
                  " 好きなブランドを人に勧めることがある ")

# 属性。ただし Q7 で欠損値のある人を除く。対象者番号は連番になっていること。
FACE <- COFFEE[Q7[, 1], c(8, 75, 76)]

# 変数名を付ける。
colnames(FACE) <- c(" 飲用頻度 ", " 年齢 ", " 性別 ")
R で因子分析
#   因子分析。 factanal 関数を使うのが一般的だと思いますが、ここでは出力が親切な
#   psych パッケージの fa 関数を使ってみます。
#   2因子、最尤法、プロマックス回転で因子分析。
#   実際にはいくつかのパターンを試して最終的な結果を決めます。

library(psych)
Q7.fa <- fa(Q7[, -1], nfactors=2, rotate = "promax", scores=TRUE, fm="ml")
print(Q7.fa, sort=TRUE)

#   Factor Analysis using method = ml
#   Call: fa(r = Q7[, -1], nfactors = 2, rotate = "promax", scores = TRUE,
#       fm = "ml")
#                                        item   ML2   ML1   h2   u2
#   好きなブランドを人に勧めることがある                       8 0.78        1.00 0.00
#   新製品が出ると試してみる                             7 0.67        0.16 0.84
#   人よりよく知っている                               4 0.63        0.26 0.74
#   ひとより多く飲む                                 5 0.59        0.55 0.45
#   特に気にしない                                  6 -0.51       0.27 0.73
#   気に入ったブランドはない                             3 -0.50       0.26 0.74
#   味や品質にこだわる                                1        0.93 0.47 0.53
#   時と場合により飲みわける                             2        0.39 0.66 0.34
#   (以下略)

# ML1 、 ML2 が因子負荷量、 h2 が共通性、 u2 が独自性
# ここでは仮に ML1 を「機能的関与因子」、 ML2 を「情緒的関与因子」と名づけてみます。
因子分析の結果を確認
# 因子得点を X に付値
X <- Q7.fa$scores

# 因子得点をヒストグラムで確認。
# hist 関数でも良いのですが、ここでは
# MASS パッケージの truehist 関数を
# 使ってみます。
library(MASS)
par(mfrow=c(2,1))
truehist(X[,1], main=" 情緒的関与因子 (ML2)",
         col="lightgreen")
truehist(X[,2], main=" 機能的関与因子 (ML1)",
         col="lightblue")
par(mfrow=c(1,1))
因子分析の結果を確認
# 因子得点を散布図で確認                   # こんな散布図も描ける
plot(X, pch=3,                  smoothScatter(X, pch=3,
     main=" 因子得点の散布図 (plot)")    main=" 因子得点の散布図 (smoothScatter)")
いよいよクラスター分析
# 階層型クラスター分析(ウォード法)
Q7.wa <- hclust(dist(X)^2, "ward")

# 樹形図(デンドログラム)を描く
plot(Q7.wa)

# クラスター数を3として枠を描く
rect.hclust(Q7.wa, k=3, border=1:3)

# クラスター数を3としてクラスター番号を
# 保存
Q7.wa.clust <- cutree(Q7.wa, 3)

# 構成の確認。
table(Q7.wa.clust)
# Q7.wa.clust
# 1 2 3
# 27 30 23
結果の確認
# クラスターごとの平均値
aggregate(X, by=list(Q7.wa.clust), FUN=mean)
# Group.1          ML2        ML1
# 1       1 1.0042568 -0.0564751
# 2       2 -0.6966410 0.8983492
# 3       3 -0.2702479 -1.1054630

# 箱髭図(3変数以上ならレーダーチャート)
par(mfrow=c(1, 2))
boxplot(X[, 1] ~ Q7.wa.clust,
        main=" 情緒的関与因子 (ML2)",
        xlab=" クラスタ ", col="lightgreen")
boxplot(X[, 2] ~ Q7.wa.clust,
        main=" 機能的関与因子 (ML1)",
        xlab=" クラスタ ", col="lightblue")
par(mfrow=c(1, 1))
結果の確認
# 飲用頻度のモザイクプロット
FREQ <- table(Q7.wa.clust, FACE[, 1])
rownames(FREQ) <- c("clust1", "clust2",
                     "clust3")
colnames(FREQ) <- c(" 毎日 ",
                     " 週に数回 ",
                     " 月に数回 ",
                     " 年に数回 ")
mosaicplot(FREQ,
           main=" クラスタ毎の飲用頻度 ",
           ylab=" 飲用頻度 ",
           xlab=" クラスタ ",
           col=TRUE)
結果の確認
# 年代のモザイクプロット
AGE <- table(Q7.wa.clust, FACE[, 2])
rownames(AGE) <- c("clust1", "clust2",
                   "clust3")
colnames(AGE) <- c(" ~ 20", "21 ~ 25",
                   "26 ~ 30", "31 ~ 35",
                   "36 ~ 40", "41 ~ 60",
                   "61 ~ ")
mosaicplot(AGE, main=" クラスタ毎の年齢 ",
           ylab=" 年齢 ", xlab=" クラスタ ",
           col=TRUE, las=1)
結果の確認
# 性別のモザイクプロット
SEX <- table(Q7.wa.clust, FACE[, 3])
rownames(SEX) <- c("clust1", "clust2",
                   "clust3")
colnames(SEX) <- c(" 男性 ", " 女性 ")
mosaicplot(SEX, main=" クラスタ毎の性別 ",
           ylab=" 性別 ", xlab=" クラスタ ",
           col=TRUE)
実例の紹介
PAM (Partitioning Around Medoids)

# PAM は分割型クラスタリングの一種。
# K-means よりも頑健であるとされる。
library(cluster)
Q7.pam <- pam(X, 3, metric = "manhattan")
plot(Q7.pam, col=TRUE)

# クラスター構成の確認
table(Q7.pam$clustering)

# ウォード法の結果とクロス集計
table(Q7.wa.clust, Q7.pam$clustering)

tokyo webmining3 2010.04.17.

  • 1.
  • 2.
    自己紹介 ● 【はてな】  id:bob3 ● 【 Twitter 】 @bob3bob3 ● バリバリの文系です。 ● 仕事はマーケティング・リサーチャー。 ● 本日はマーケティングの中で「クラスター分析」が、どのよ うに使われているか、その一例をお話します。
  • 3.
    STP戦略 ● 市場が成熟し消費者の行動や価値観も多様化し た今日にあって、ひとつの製品やサービスで市場 のすべてのニーズを満たすことはできない。 ● そこで必要になるのが「STP戦略」というフレーム ワーク。 ● Segmentation – 市場(消費者)をいくつかのグループに細分化。 ● Targeting – ターゲットとなるグループを選択。 ● Positioning – どんな価値を提供するのかを明確にする。
  • 4.
    市場細分化 Segmentation 10 代 20 代 市 場 30 代 男 女 全 40 代 性 性 体 50 代 60 代 ● セグメントごとにマーケティング・ミックスを決定する。
  • 5.
    マーケティング・ミックス ● 製品( Product ) – 仕様、機能、性能、パッケージなど ● 価格( Price ) – 小売価格、値引き、特売など ● 流通( Place ) – 販売経路など ● プロモーション( Promotion ) – 広告、PR、パブリシティ、イベント、キャンペーンなど
  • 6.
    ダニエル・ヤンケロビッチ曰く ● 「年齢、性別、学歴、年収など、従来のデモグラ フィックスは、すでにマーケティング戦略の拠りどこ ろとしては不十分である。」 ● 「それよりも、価値観や嗜好、選好といった特性の ほうが、消費者の購買行動への影響が大きい。」 ● 「適切なマーケティング戦略を立案するには、まず 特定のブランドや商品カテゴリーを受け入れそうな 市場セグメントを特定することである。」 ● 社会心理学者。 ● 1964年のお話。
  • 7.
    市場細分化の基準 ● 客観的基準 ● デモグラフィック(人口統計学的基準) – 年齢、性別、所得、家族構成、職業、ライフステージなど ● ジオグラフィック(地理的基準) – 居住地、気候、文化など ● 主観的基準 ● サイコグラフィック(心理的基準) – 価値観、嗜好、性格、ライフスタイルなど ● ビヘイビアル(行動的基準) – 使用頻度、使用の仕方、求めるベネフィットなど
  • 8.
    今回使うデータ ● 『経済・経営のための統計学』 ● 有斐閣 ● Rを使った分析例も一部載って ます。 ● 第8章「マーケティング」で使わ れているデータを使わせていた だきます。
  • 9.
    缶コーヒーに関するアンケート ● 調査票 ● http://yuhikaku-nibu.txt-nifty.com/blog/files/COFFEE-survey.pdf ● データ ● http://yuhikaku-nibu.txt-nifty.com/blog/files/COFFEE.txt ● 今回使う質問。Q7“「缶コーヒー」について以下の考えがあります。それぞれにつ いて、あなたのお考えに近い番号に○をつけてください。” 非常に そうである どちらとも そう まったく そうである いえない ではない そうではない 味や、品質にこだわる 5 4 3 2 1 ときと場合により、飲みわける 5 4 3 2 1 気に入ったブランドはない 5 4 3 2 1 人よりよく知っている 5 4 3 2 1 ひとより多く飲む 5 4 3 2 1 特に気にしない 5 4 3 2 1 新製品が出ると試してみる 5 4 3 2 1 好きなブランドを人に勧めることがある 5 4 3 2 1
  • 10.
    分析の手順 1.次元縮約 ● 7つの質問項目を少数の変数に要約する。 ● 因子分析、主成分分析、 SEM などを使う。 ● 理由:解釈のしやすさ、“次元の呪い”。 2.グループ分け ● ブランド、製品などには階層型クラスター分析。 ● 消費者をグループ分けするときは分割型。 ● 決定木、潜在クラスモデルなども使われる。
  • 11.
    R にデータを読み込む # ワーキングディレクトリの設定と確認。COFFEE.txt を置いておく。 setwd("C:/R/dat") getwd() # タブ区切りのテキストファイル。欠損値は“ .” で入力されている。 COFFEE <- read.delim("COFFEE.txt", na.strings=".") # 対象者番号と Q7 の回答を取り出す。欠損値のある対象者は除く。 Q7 <- na.omit(COFFEE[, c(1, 34:41)]) # 変数名を付ける。 colnames(Q7) <- c(" 対象者番号 ", " 味や品質にこだわる ", " 時と場合により飲みわける ", " 気に入ったブランドはない ", " 人よりよく知っている ", " ひとより多く飲む ", " 特に気にしない ", " 新製品が出ると試してみる ", " 好きなブランドを人に勧めることがある ") # 属性。ただし Q7 で欠損値のある人を除く。対象者番号は連番になっていること。 FACE <- COFFEE[Q7[, 1], c(8, 75, 76)] # 変数名を付ける。 colnames(FACE) <- c(" 飲用頻度 ", " 年齢 ", " 性別 ")
  • 12.
    R で因子分析 # 因子分析。 factanal 関数を使うのが一般的だと思いますが、ここでは出力が親切な # psych パッケージの fa 関数を使ってみます。 # 2因子、最尤法、プロマックス回転で因子分析。 # 実際にはいくつかのパターンを試して最終的な結果を決めます。 library(psych) Q7.fa <- fa(Q7[, -1], nfactors=2, rotate = "promax", scores=TRUE, fm="ml") print(Q7.fa, sort=TRUE) # Factor Analysis using method = ml # Call: fa(r = Q7[, -1], nfactors = 2, rotate = "promax", scores = TRUE, # fm = "ml") # item ML2 ML1 h2 u2 # 好きなブランドを人に勧めることがある 8 0.78 1.00 0.00 # 新製品が出ると試してみる 7 0.67 0.16 0.84 # 人よりよく知っている 4 0.63 0.26 0.74 # ひとより多く飲む 5 0.59 0.55 0.45 # 特に気にしない 6 -0.51 0.27 0.73 # 気に入ったブランドはない 3 -0.50 0.26 0.74 # 味や品質にこだわる 1 0.93 0.47 0.53 # 時と場合により飲みわける 2 0.39 0.66 0.34 # (以下略) # ML1 、 ML2 が因子負荷量、 h2 が共通性、 u2 が独自性 # ここでは仮に ML1 を「機能的関与因子」、 ML2 を「情緒的関与因子」と名づけてみます。
  • 13.
    因子分析の結果を確認 # 因子得点を Xに付値 X <- Q7.fa$scores # 因子得点をヒストグラムで確認。 # hist 関数でも良いのですが、ここでは # MASS パッケージの truehist 関数を # 使ってみます。 library(MASS) par(mfrow=c(2,1)) truehist(X[,1], main=" 情緒的関与因子 (ML2)", col="lightgreen") truehist(X[,2], main=" 機能的関与因子 (ML1)", col="lightblue") par(mfrow=c(1,1))
  • 14.
    因子分析の結果を確認 # 因子得点を散布図で確認 # こんな散布図も描ける plot(X, pch=3, smoothScatter(X, pch=3, main=" 因子得点の散布図 (plot)") main=" 因子得点の散布図 (smoothScatter)")
  • 15.
    いよいよクラスター分析 # 階層型クラスター分析(ウォード法) Q7.wa <-hclust(dist(X)^2, "ward") # 樹形図(デンドログラム)を描く plot(Q7.wa) # クラスター数を3として枠を描く rect.hclust(Q7.wa, k=3, border=1:3) # クラスター数を3としてクラスター番号を # 保存 Q7.wa.clust <- cutree(Q7.wa, 3) # 構成の確認。 table(Q7.wa.clust) # Q7.wa.clust # 1 2 3 # 27 30 23
  • 16.
    結果の確認 # クラスターごとの平均値 aggregate(X, by=list(Q7.wa.clust),FUN=mean) # Group.1 ML2 ML1 # 1 1 1.0042568 -0.0564751 # 2 2 -0.6966410 0.8983492 # 3 3 -0.2702479 -1.1054630 # 箱髭図(3変数以上ならレーダーチャート) par(mfrow=c(1, 2)) boxplot(X[, 1] ~ Q7.wa.clust, main=" 情緒的関与因子 (ML2)", xlab=" クラスタ ", col="lightgreen") boxplot(X[, 2] ~ Q7.wa.clust, main=" 機能的関与因子 (ML1)", xlab=" クラスタ ", col="lightblue") par(mfrow=c(1, 1))
  • 17.
    結果の確認 # 飲用頻度のモザイクプロット FREQ <-table(Q7.wa.clust, FACE[, 1]) rownames(FREQ) <- c("clust1", "clust2", "clust3") colnames(FREQ) <- c(" 毎日 ", " 週に数回 ", " 月に数回 ", " 年に数回 ") mosaicplot(FREQ, main=" クラスタ毎の飲用頻度 ", ylab=" 飲用頻度 ", xlab=" クラスタ ", col=TRUE)
  • 18.
    結果の確認 # 年代のモザイクプロット AGE <-table(Q7.wa.clust, FACE[, 2]) rownames(AGE) <- c("clust1", "clust2", "clust3") colnames(AGE) <- c(" ~ 20", "21 ~ 25", "26 ~ 30", "31 ~ 35", "36 ~ 40", "41 ~ 60", "61 ~ ") mosaicplot(AGE, main=" クラスタ毎の年齢 ", ylab=" 年齢 ", xlab=" クラスタ ", col=TRUE, las=1)
  • 19.
    結果の確認 # 性別のモザイクプロット SEX <-table(Q7.wa.clust, FACE[, 3]) rownames(SEX) <- c("clust1", "clust2", "clust3") colnames(SEX) <- c(" 男性 ", " 女性 ") mosaicplot(SEX, main=" クラスタ毎の性別 ", ylab=" 性別 ", xlab=" クラスタ ", col=TRUE)
  • 20.
  • 21.
    PAM (Partitioning AroundMedoids) # PAM は分割型クラスタリングの一種。 # K-means よりも頑健であるとされる。 library(cluster) Q7.pam <- pam(X, 3, metric = "manhattan") plot(Q7.pam, col=TRUE) # クラスター構成の確認 table(Q7.pam$clustering) # ウォード法の結果とクロス集計 table(Q7.wa.clust, Q7.pam$clustering)