コレスポンデンス分析(対応分析:Multiple Correspondence Analysis)とは、多変量解析法の一つで、アンケート結果のクロス集計表など、行と列からなるデータの項目間の関係を散布図のかたちで可視化する手法です。
マーケティングの分野では、Segmentation, Targeting, Positioning (STP)という3つのキーワードがありますが、特に最後のポジショニングに関して、自社と競合他社との棲み分けを検討する際に、コレスポンデンス分析が多用されます。
以下の表は、4つの企業の製品を対象に、当該製品の購入者に対して、その購買動機を 機能・形・色・ブランド・価格の5項目から複数選択で回答してもらった結果を集計したものです。
企業\購買動機 | 機能 | 形状 | 色 | ブランド | 価格 |
A社 | 10 | 5 | 3 | 4 | 7 |
B社 | 5 | 1 | 4 | 2 | 10 |
C社 | 8 | 10 | 6 | 5 | 2 |
D社 | 2 | 6 | 5 | 6 | 1 |
これぐらい小さな表であれば、どこの製品が、どのような動機で選ばれているのかを見てとることができますが、縦横の項目数が多くなると、それを簡単に捉えるのは難しくなります。そこで、これを2次元の散布図上で、ざっくりと可視化するために、コレスポンデンス分析を使います。
右の散布図が、分析の結果です。
分布は、中央から遠ざかるほど特徴的で、プロットされた位置が近いほど、項目間の関連性が強いことを意味します。グラフの中央に横軸と縦軸の 0 を意味する十字の線が入るのが一般的で、横軸と縦軸、それぞれの意味づけは分析者が任意に行うものとなります。
この散布図からは、以下のようなことが読み取れます。
コレスポンデンス分析では、複雑なデータをざっくりと可視化する手法なので、結果の散布図のみに頼ると、勘違いも生じます。結果を詳しく検証するには、元のクロス集計表の見ながら考察することが必要です。
上記の事例分析の実際のプログラムを、JupyterNotebook形式で紹介します。
> https://github.com/koichi-inoue/DataScience/blob/main/MCA.ipynb
以下、プログラムの概説です。
Pythonでコレスポンデンス分析を行う場合は、mca というライブラリをインストールして利用します。
Google Colaboratory を利用する場合、このライブラリーは入っていないので、以下のようにライブラリーのインストールが必要です。
!pip install mca
import する際は、以下のように書くのが一般的です。
import mca
クロス集計のデータは、前の節のサンプルと同じものです。
df = pd.read_csv('/・・・・/mca_sample.csv', index_col=0, header=0 )
表は pands のデータフレーム形式で読み込みます。なお、クロス集計表は、通常のデータと異なり、表の左端の列がカテゴリ項目名になるので、以下のようにオプションを付けて読む必要があります。
分析処理自体は以下の1行で完了です。
mca_counts = mca.MCA(df, benzecri=False)
2つの配列 raws と cols に、各カテゴリ項目のプロット座標を代入
rows = mca_counts.fs_r(N=2)
cols = mca_counts.fs_c(N=2)
表側のカテゴリ項目 rows を青色で散布図をプロット。また同様に表頭のカテゴリ項目 cols を赤色で同じ散布図上にプロットします。
plt.scatter( rows[:,0], rows[:,1], marker="None") labels = df.index for label,x,y in zip(labels,rows[:,0],rows[:,1]): plt.annotate(label,xy = (x, y), c="b") plt.scatter(cols[:, 0], cols[:, 1], marker="None") labels = df.columns for label, x, y in zip(labels, cols[:, 0], cols[:, 1]): plt.annotate(label, xy=(x, y), c="r")
以上、ほぼ定番のコードなので、お手元にクロス集計表があれば、プログラムのファイル読み込みの部分を変えるだけで利用できるかと思います。