マルチアンサー(MA)データに対してクラスター分析を行う際の注意点

はじめに

年に1度ぐらいの頻度で「重視点などを聴取したマルチアンサーデータ(MA)でクラスター分析を行いたい」という相談を受けます。その際、MA データをそのままクラスター分析(※ここでは一般的な階層クラスタリングおよび k-means を想定)している事例をよく目にします。

このアプローチは ロジック的にも多くの問題があり、経験的にも上手くいかないことが多いことから全くおすすめしません。

それにもかかわらず、大手マーケティング・リサーチ会社ですら特に疑問を持たず実施しているケースもよく見かけます。ただ、MAに対するクラスター分析は、適切に分析しないとミスディレクション(誤った示唆)を引き起こしてしまうため、業界への警鐘も含めて記事にしてみました。できるだけ多くの人に認識してもらいたく、直感的な理解を重視してます。そのため、厳密性などを担保していない部分もありますが予めご容赦ください。

MAをそのままクラスター分析しない方が良い理由

クラスター分析の本質は「類似する回答者同士の距離」を適切に計測することです。しかし MA(2値反応データ 0/1)のまま距離として扱うと様々な問題が生じます。分かりやすい問題を3つほど挙げてみます。ここでいう距離はユークリッド距離を想定します。

1. 0と1では距離を適切に表せない

0と1の差で距離を表そうとすることはかなり無理があります。例えば、家から10kmのお店、20kmのお店、100kmのお店があるとします。距離を0/1に変換してしまうと、すべての距離が同じとなり、本来は大きく異なる対象が距離的には等しいものとして扱われてしまいます。

2.選択肢が多い人・少ない人で距離が歪んでしまう

回答者のMA回答のクセで距離が大きく変わってしまいます。項目に対して、「少しでも当てはまると思えば選ぶ人」や「かなり当てはまらないと選ばない人」といった傾向があります。MAのデータで距離を計算すると、この回答行動の個人差が反映されてしまい、本来考慮すべきではない要素がクラスタリングの結果に影響を与えてしまいます

3.スパースな 0/1 データだと偶然一致の影響が大きくなる

MA設問で幅広い選択肢から回答を求める場合、未選択の部分が多くなることでスパース(多くが0)なデータになります。その場合、何も選択していない多くの箇所が最初から0であることから偶然一致する部分が多く、そのため選択した項目がズレると距離が大きくなってしまいます

シミュレーション検証

MAデータをクラスター分析の距離として扱うには問題がある点はなんとなく理解してもらったと思います。しかし、マーケティング領域では「論より実」を優先することも多々あり、「完璧ではなくても、傾向が読み取れれば良い」と考える人も少なくありません。そこで、簡易的なシミュレーションを行い、SD 法でのクラスタリング と SD→MA(0/1)後のクラスタリング の一致率を比較してみます。

検証プロセス

  1. SD法(7段階尺度)の仮想データ(100名 × 10項目)を作成
  2. SDデータで k-means によりクラスタリング
  3. SD データを TOP3BOX(5点以上)で 0/1 に変換
  4. MA(0/1)データで再びクラスタリング
  5. 両者の結果がどれだけ一致するかを比較

「回答のクセ」や「スパース性」などは考慮していませんが、TOP◯BOXの変換はマーケティング・リサーチでよく用いられるので直感的に理解しやすいかと思います。

サンプルコード

python

import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score

np.random.seed(0)

# 100名×10項目、1〜7のSD法データを仮想で生成
n, p = 100, 10
sd_data = np.random.randint(1, 8, (n, p))

# SDをTOP2BOX(二値MA)に変換(6,7を1、それ以外0)
ma_data = (sd_data >= 5).astype(int)

# クラスタ数
k = 3

# SDデータでクラスタリング
km_sd = KMeans(n_clusters=k, random_state=0).fit(sd_data)
sd_labels = km_sd.labels_

# MA(二値)データでクラスタリング
km_ma = KMeans(n_clusters=k, random_state=0).fit(ma_data)
ma_labels = km_ma.labels_

# 所属クラスターのクロス集計
cross_tab = pd.crosstab(sd_labels, ma_labels)
# ARIの算出
ari = adjusted_rand_score(sd_labels, ma_labels)

print(cross_tab, ari)

結果

クラスタリング手法はk-means、距離はユークリッド距離、クラスター数は3としました。

SD → MA でクラスター所属がどれほど変わるかをクロス集計で確認します。表側がSDの結果、表頭がMDでの結果になります。

CL_SD/CL_MACL_0CL_1CL_2
CL_023230
CL_131113
CL_212114

対角線上にデータが集まっておらずあまり一致していないことが見て取れます。傾向すら把握することは難しそうです。

各クラスターの一致率を指標で表してみます。指標にはARI(Adjusted Rand Index)を算出しました。完全一致のときは1を表し、0に近いほどランダムだと表現できます。

ARI = 0.197

これは別物の結果と捉えたほうが良さそうです。さらに回答傾向(クセ)やスパース性の影響などがこれに加わることを考えると、やはりMAデータに対してそのままクラスター分析を行うことは控えたほうが良いです。

対応策

MAデータに対してクラスター分析を行いたい場合は、距離を適切に定義・変換する必要があります。例えば代表的なものだと、以下のような方法があります。

  • ジャッカード係数
  • コサイン類似度
  • MCA(多重対応分析)

要望があれば、いずれこのあたりも記事にしようかと思います。

まとめ

  • MAデータをそのままクラスター分析に用いるべきではない
  • クラスタリングを目的とするならばSD法で聴取する方が望ましい
  • MAでクラスタリングしたい場合は、適切なデータ処理と手法を選ぶ必要がある

コストの都合で SD 法ではなく MA を選ぶケースもありますが、クラスタリングを前提とするなら、適切な前処理なしでは有益な結果は得られません。結果として誤った示唆を与えたり、分析のやり直しが必要になって かえってコスト増になることもあります。

もし「多くの MA 項目を使ってクラスタリングしたい」という明確な目的があるのであれば、データ取得だけリサーチ会社に依頼し、分析は専門家に任せることを推奨します。

コメント

PAGE TOP