Pythonでコレスポンデンス分析:mca

Pythonで対応分析(コレスポンデンス分析)するのにmcaというPackage使いましたので簡単なメモです。

公式ページはこちら
“Download files”で落とせるzipに入っている”burgundies.csv”のデータを使ってトライしてみます。

ワイン6種に対する味の評価データが入っているので味とワインの関係性をポジションマップ化します。

環境はGoogle Colaboratoryを使用しました。
# mcaをインストール
!pip install mca
mcaの他にpandasとmatplotlibを入れておきます
# mca, matplotlib, pandasのインポート
import mca
import pandas as pd
import matplotlib.pyplot as plt
Google Colaoratoryにuploadしたcsvファイルを読みます。
簡易化のため最初の行は外してクロス集計された形にしました。
# クロス集計データ取得
# skiprowでexpertのrowは外す
data = pd.read_table('/content/burgundies.csv', sep=',', skiprows=1, index_col=0, header=0)

# 確認
data
では、計算してみましょう。
# 計算
mca_counts = mca.MCA(data.drop("oak_type", axis=1))

# 結果データ抜き出し
# 2次元表示のためN=2まで
rows = mca_counts.fs_r(N=2) # 表側データ
cols = mca_counts.fs_c(N=2) # 表頭データ
いよいよ図示です。
Wineと評価を一つのMapに表します。
近いものが関係性の強さを表しますが、質的データの可視化なので距離が違いの量を表すわけではないことに注意ですね。
# 図示
# 表側
plt.scatter(rows[:,0], rows[:,1], c='b',marker="None")
labels = data.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], c='r',marker="None")
labels = data.columns
for label,x,y in zip(labels,cols[:,0],cols[:,1]):
    plt.annotate(label,xy = (x, y), c="r")

# xy軸
plt.axhline(0, color='gray')
plt.axvline(0, color='gray')
中心から遠いほど特徴的ということになります。

最後に寄与率を確認しておきましょう。
しかし対応分析の寄与率は意味がないとされてるので参考程度に。
ここら辺もただ数字出すだけでなく中身ちゃんと調べないと失敗するので危険ですね。
# 寄与率の確認
print(mca_counts.L)

# 2軸での寄与率
print(mca_counts.L[0]+mca_counts.L[1])

最後に

ちょっと情報が少なくてどれが何を意味するのかいまいちわからず時間かかってしまいました。
一方で使い方はシンプルなので便利ですね。R でもできるので比べてみるのも面白いかも知れませんね。