データ分析
2025/08/28
池田 悠真

主成分分析によるアソシエーションルールのスコアリング

マーケットバスケット分析を実施すると、数百から数千のアソシエーションルールが生成されることがあります。しかし、「どのルールが本当に価値があるのか?」という根本的な問題に直面したことはありませんか?本記事では、主成分分析(PCA)を活用して、アソシエーションルールをスコアリングする方法を考えてみました。

基本3指標のおさらい

まず、アソシエーション分析の基本となる3つの指標について確認しておきましょう。


 


支持度(Support)は、全取引に占める該当ルールの発生頻度を表します。数学的には以下で定義されます:



Support(A → B) = P(A ∩ B) = |A ∩ B| / |D|


ここで、|A ∩ B|はAとBが同時に発生した取引数、|D|は全取引数を表します。例えば支持度0.1なら全取引の10%でそのルールが発生していることを意味し、売上ボリュームやビジネスインパクトの大きさを判断する際に重要です。


 


信頼度(Confidence)は、条件となる商品Aが購入された場合に、結果となる商品Bも購入される条件付き確率を示します:



Confidence(A → B) = P(B|A) = P(A ∩ B) / P(A) = |A ∩ B| / |A|


信頼度0.8なら「Aを買った人の80%がBも購入する」ことを表し、レコメンデーションシステムの精度に直結する指標です。


 


リフト値(Lift)は、偶然以上の関連性があるかどうかを測る指標で、以下のように定義されます:



Lift(A → B) = P(B|A) / P(B) = Confidence(A → B) / Support(B)


リフト値が1.0なら偶然と同じ、2.0なら偶然の2倍の確率でBが購入されることを意味し、商品間の真の関連性を発見するために使用されます。

なぜ従来の評価方法では限界があるのか?

アソシエーション分析の現場でよく遭遇するのが、以下のような矛盾です:


ルールA: パン → バター


– 支持度: 0.15(15%の取引で発生)

– 信頼度: 0.7(70%の確率)

– リフト値: 1.8


ルールB: 高級ワイン → トリュフ


– 支持度: 0.005(0.5%の取引で発生)

– 信頼度: 0.95(95%の確率)

– リフト値: 8.0


どちらが「優秀」なルールでしょうか?


ルールAは頻度が高く安定していますが、リフト値が小さい、すなわち驚きは少ないと言えます。一方、ルールBは稀だが強い関連性を示しています。従来の評価では、この判断を分析者の主観に委ねることが多く、客観性に欠けるという問題がありました。


また、多くの実務担当者が「支持度30%、信頼度40%、リフト値30%」のような主観的な重み付けを行っていますが、この根拠は何でしょうか?業界や目的によって最適な重みは変わるはずです。

PCAによる客観的重み決定:データが答えを教えてくれる

主成分分析(PCA)を用いることで、データ自身から最適な重み付けを導き出すことができます。この手法の核となる考え方は以下の通りです:



「データの分散を最大化する方向が、最も情報量の多い方向である」



この考え方を用いて、重みの算出やアソシエーションルールのスコアリングを行います。


PCAによる重み算出

以下は、実際にPCAを用いて重みを算出するPythonのソースコードです:


import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

def calculate_pca_weights(data):
"""PCAによる客観的重み計算"""
features = ['support', 'confidence', 'lift']
X = data[features].values

# 標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA実行
pca = PCA()
pca.fit(X_scaled)

# 第1主成分の負荷量から重み計算
pc1_loadings = np.abs(pca.components_[0])
weights = pc1_loadings / pc1_loadings.sum()

return {
'w_support': weights[0],
'w_confidence': weights[1],
'w_lift': weights[2],
'explained_variance': pca.explained_variance_ratio_[0]
}

# サンプルデータ(12個のルール)
sample_data = pd.DataFrame({
'itemset_A': ['おにぎり', 'コーヒー', 'ビール', 'アイス', 'お弁当', 'タバコ',
'パン', 'お茶', 'お菓子', 'ドリンク', 'サラダ', 'デザート'],
'itemset_B': ['お茶', 'サンドイッチ', 'おつまみ', 'チョコ', 'サラダ', 'ライター',
'ジャム', 'おにぎり', 'ジュース', 'アイス', 'ドレッシング', 'コーヒー'],
'support': [0.25, 0.15, 0.08, 0.30, 0.12, 0.05,
0.18, 0.22, 0.35, 0.20, 0.14, 0.28],
'confidence': [0.85, 0.90, 0.75, 0.60, 0.88, 0.95,
0.72, 0.80, 0.65, 0.78, 0.83, 0.70],
'lift': [3.2, 4.1, 2.8, 1.9, 3.5, 5.2,
2.4, 3.0, 1.8, 2.6, 3.8, 2.2]
})

# 重み計算
weights = calculate_pca_weights(sample_data)

実行結果は以下の通りです。



PCA重み結果:
支持度重み: 0.317
信頼度重み: 0.339
リフト重み: 0.344
第1主成分説明力: 0.880


ここで、PCAで算出した重みの信頼性は、第1主成分の寄与率で判断できます。寄与率による信頼性の判断の目安は以下の通りです:



  • ・寄与率 ≥ 0.6: 非常に信頼性が高い

  • ・寄与率 0.4-0.6: 信頼性が高い

  • ・寄与率 0.3-0.4: 中程度の信頼性

  • ・寄与率 < 0.3: 他手法の検討推奨


今回は、第1主成分の説明力: 0.880となっているので、重みの信頼性が非常に高いことが分かります。


 


 

PCA重みを使った総合スコア算出

PCAを用いて重みを算出を行ったので、以下のように、総合スコアの算出をしました。


 


def calculate_comprehensive_score(data, pca_weights):
"""PCA重みによる総合スコア算出"""
# リフト値の正規化(1を引いて0基準にする)
lift_normalized = data['lift'] - 1

# 総合スコア計算
scores = (
pca_weights['w_support'] * data['support'] +
pca_weights['w_confidence'] * data['confidence'] +
pca_weights['w_lift'] * lift_normalized
)

return scores

# 前のコードで算出した重みを使用
sample_data['pca_score'] = calculate_comprehensive_score(sample_data, weights)

# 上位5ルールの抽出
top_rules = sample_data.nlargest(5, 'pca_score')
print(f"\nPCAスコア上位5ルール:")
print(top_rules[['itemset_A', 'itemset_B', 'pca_score']])

【実行結果】



PCAスコア上位5ルール:
itemset_A itemset_B pca_score
5 タバコ ライター 1.784154
1 コーヒー サンドイッチ 1.420042
10 サラダ ドレッシング 1.289840
4 お弁当 サラダ 1.197103
0 おにぎり お茶 1.124817


これによって、アソシエーションルールをスコアリングすることができました!


「タバコを買う人はライターも買う」というアソシエーションルールが、売上ボリューム(支持度)・レコメンデーション精度(信頼度)・意外な商品の組み合わせ(リフト値)を総合的に考慮したスコアが一番高いことが分かります。


また、2番目の「コーヒーを買う人はサンドイッチも買う」というルールのスコアも高いというのも面白いです。

まとめ

PCAを活用したアソシエーションルール評価により、従来の主観的な重み付けから脱却し、データ自身が教える客観的な基準でルールの優劣を判定することが可能になります。第1主成分の寄与率によって重みの信頼性を定量的に評価でき、継続的にデータを蓄積することで評価精度を向上させられるため、より効果的で説明可能なビジネス意思決定を実現できるでしょう。

New call-to-action