アソシエーション分析(バスケット分析)|頻出アイテムとルールを見つける(実務ガイド)
カゴ内で一緒に買われやすい組合せや、購買の“つながり”をルールとして抽出します。サポート(出現頻度)、信頼度(条件付き確率)、リフト(期待比)を使って有用な知見に絞り込みます。
この記事が想定する読者:POS/ECで「一緒に買われやすい組合せ」を施策(クロスセル・棚割り・セット販促)に活かしたい担当者。
判断を誤るとどうなるか:リフトだけ見て高すぎる小規模ルールを採用すると誤検知になり、施策が効かない。先にサポート・信頼度・リフトの意味を押さえ、前処理→頻出アイテム→ルール→スクリーニングの順で絞り込むと失敗しにくい。
TL;DR
- 目的: 「A を買う人は B も買う」タイプのルールを抽出
- 指標: サポート(頻度)/信頼度(P(B|A))/リフト(独立からのずれ)
- 手順: 前処理(ワンホット化)→ Apriori で頻出アイテム → ルール生成 → リフト等で選別
まずはここだけ(やさしい導入)
- 何をする?: 「一緒に現れる」アイテムの組を見つけ、施策(クロスセル/陳列)に活かす
- いつ使う?: POS/EC のレコメンド、棚割り、セット販促
- どう読む?: リフト>1 は“期待より一緒に出る”。高すぎる小規模ルールは要注意(誤検知)
用語ミニ辞典(1 行で)
- アイテムセット: 同時に観測されたアイテムの集合
- サポート: そのアイテムセットの出現割合
- 信頼度: ルール A→B の条件付き確率 P(B|A)
- リフト: A と B が独立なら 1、1 より大きいほど関係が強い
- 前件/後件: ルールの左側/右側(A→B の A/B)
ミニ例題と Python コード(Apriori + ルール抽出)
# pip install mlxtend
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules
transactions = [
['milk','bread','butter'],
['bread','eggs'],
['milk','bread'],
['beer','chips'],
['milk','eggs','bread'],
]
te = TransactionEncoder()
ohe = te.fit(transactions).transform(transactions)
df = pd.DataFrame(ohe, columns=te.columns_)
# 頻出アイテムセット
freq = apriori(df, min_support=0.3, use_colnames=True)
# ルール生成
rules = association_rules(freq, metric='confidence', min_threshold=0.6)
rules = rules.sort_values('lift', ascending=False)
print(rules[['antecedents','consequents','support','confidence','lift']].head())
読み方のコツ:
- サポートが低すぎるルールは安定しない。最低サンプルの下限を設ける
- 信頼度が高くても後件が極端に多い/少ないと偏る。リフトと一緒に確認
- 前件や後件のアイテム数(1→1 か 2→1 か)で実装のしやすさが変わる
実務ケーススタディ(グロサリーのクロスセル)
目的: 食品カテゴリで「一緒に買われる」組合せから、棚割りと推薦を改善。
- 前処理
- アイテム定義の粒度を揃える(例: “牛乳 1L”を“牛乳”に集約)
- 季節性やキャンペーン期間を分けて集計
- 抽出と選別
- min_support を段階的に上げて冗長ルールを除去
- lift、confidence、conviction、chi-square などで多角的に評価
- 運用
- 陳列の近接/セット割引/レコメンドに反映。週次で見直し
よくある落とし穴(チェックリスト)
- リフトが高いがサポートが極小(偶然)
- 後件が超頻出で何でもヒット(意味が薄い)
- アイテム粒度が細かすぎ/粗すぎ(設計の見直し)
練習問題(理解を定着)
- confidence は高いが lift≈1。どう解釈?
- ヒント: 後件が元々頻出。ルールの価値は限定的
- 有望な 2→1 ルールが多すぎる。どう絞る?
- ヒント: support 下限、前件の長さ上限、後件の多様性でスクリーニング
- 季節性の影響をどう見る?
- ヒント: 期間を分割し、共通ルールと季節限定ルールを比較
判断の土台として押さえておくこと
- サポート・信頼度・リフトの役割を分ける:サポートは出現頻度、信頼度はP(B|A)、リフト>1は「期待より一緒に出る」。高信頼でもリフト≈1なら後件が元々頻出で価値は限定的。
- 前処理(ワンホット化)→頻出アイテム→ルール→スクリーニングの順:min_supportで頻出を出し、confidenceでルール生成、リフト等で選別。有望ルールが多すぎる場合はsupport下限・前件長・後件の多様性で絞る。
- リフトが高すぎる小規模ルールは誤検知に注意:季節性の影響は期間分割で共通ルールと季節限定を比較する。
関連記事と次の一歩
アソシエーション分析についてのご相談はこちら