データ分析・GA4

バスケット分析とは?アソシエーション分析との違いと指標・Excel・Pythonでのやり方

バスケット分析とは?アソシエーション分析との違いと指標・Excel・Pythonでのやり方

バスケット分析は、1回の買い物かご(レシート)に何と何が一緒に入っていたかを数え、同時に買われやすい組み合わせを見つける手法です。支持度・信頼度・期待信頼度・リフト値の4指標で組み合わせを評価し、陳列やレコメンド、セット販売の設計に使います。この記事では、混同されやすいアソシエーション分析との関係、4指標の計算、Excelで足りる範囲とPythonでの実行結果、そして有名な「おむつとビール」が実際にはどこまで本当だったのかまでを扱います。

まとめ:バスケット分析の要点

  • バスケット分析は、POSやECの購買履歴(バスケットデータ)にアソシエーションルールの抽出を当てはめたもの。アソシエーション分析のほうが広い概念で、対象データが買い物かごに限定されたときの呼び名がバスケット分析。
  • 評価は支持度(同時購買レシートの割合)→信頼度(Aを含むレシートのうちBも含む割合)→期待信頼度(全レシートにBが含まれる割合)→リフト値(信頼度÷期待信頼度)の順。集計の単位は人ではなくレシート(トランザクション)。1994年のApriori論文も「最小支持度を満たす集合を先に求め、そこからルールを作る」2段階で定義している。
  • 売れ筋どうしの組み合わせはリフト値が構造的に伸びない。リフト値の上限は1÷(2商品の支持度の大きいほう)なので、支持度0.7の商品同士では最大1.43にしかならない。このため、定番商品を一律のリフト値の閾値だけで評価するのは避ける。
  • 商品数が増えると2商品ペアの組み合わせ数は二次関数的に増える(1,000品目で499,500通り)。Excelは仮説のあるペアの検算まで、網羅的な抽出はmlxtendなどのライブラリに任せる。
  • 「おむつとビール」は分析結果としては実在するが、棚を並べ替えた事実は確認されていない。1998年のComputer Business Reviewは「Oscoはビールとおむつを並べる棚替えを実施しなかった」と報じている。

バスケット分析とアソシエーション分析の違い

まず、バスケット分析とアソシエーション分析の関係を整理します。結論は、アソシエーション分析(アソシエーションルールマイニング)が手法の名前で、バスケット分析はその適用先を買い物かごに限定した呼び方です。分析のアルゴリズムは同じものを使います。

原典が「バスケットデータ」と呼んだ対象

アソシエーションルールという枠組みを最初に示したのは、Agrawal・Imieliński・Swamiが1993年のACM SIGMODで発表した「Mining association rules between sets of items in large databases」です。続く1994年のVLDB論文「Fast Algorithms for Mining Association Rules」(Agrawal・Srikant、IBM Almaden研究所)は冒頭で、バーコード技術の進歩により小売業が大量に蓄積できるようになった販売データを the basket data と呼び、その1レコードは取引日と購入商品からなると定義しています。つまり「バスケット」は分析手法ではなくデータの形を指す語でした。日本語で「マーケットバスケット分析」と呼ぶ場合も同じ対象です。

買い物かご以外にも使えるアソシエーション分析

アソシエーション分析は、1件の記録を項目の集合として表せれば商品以外にも適用できます。例えばWeb閲覧では、同一セッションを1件、閲覧ページを項目として定義します。Webサイトの同一セッション内で閲覧されたページ、診療報酬データの併用薬、製造ラインで同時に出たアラートなどが例です。バスケット分析だけを学ぶと小売の話に見えますが、レシート=トランザクションという読み替えができれば適用先は広がります。手法全体の位置づけはデータマイニングとは?意味・手法・事例と導入の進め方をわかりやすく解説で整理しています。

支持度・信頼度・期待信頼度・リフト値の計算

10件のレシートを例にします。ビールは7件、おむつは7件、総菜は6件、ミルクは4件に含まれ、ビールとおむつが同時に入っているレシートは5件です。この数字から4指標を計算します。

指標 意味 計算式 ビール→おむつ
支持度 全レシートに占める同時購買レシートの割合 同時購買件数 ÷ 全レシート件数 5 ÷ 10 = 0.50
信頼度 ビールを含むレシートにおむつも含まれる割合 同時購買件数 ÷ ビールの購買件数 5 ÷ 7 = 0.714
期待信頼度 全レシートにおむつが含まれる割合 おむつの購買件数 ÷ 全レシート件数 7 ÷ 10 = 0.70
リフト値 信頼度が期待信頼度の何倍か 信頼度 ÷ 期待信頼度 0.714 ÷ 0.70 = 1.02

リフト値1.02は「ビールが入っているレシートでおむつも買われる確率は、全体の平均より2%高いだけ」という意味です。信頼度は71.4%と高く見えますが、おむつ自体が10件中7件に入っている定番商品なので、信頼度の高さは関連の強さを意味しません。この落差が期待信頼度とリフト値を併記する理由です。指標ごとの詳しい計算例と読み違えのパターンはリフト値とは?計算方法と1.0基準の目安・ExcelとPythonでの求め方にまとめています。

最小支持度と抽出ルール件数の関係

ルール抽出では、先に最小支持度を決めて対象の商品集合を絞ります。1994年のApriori論文はこの手順を「最小支持度以上の頻出集合をすべて求める」「その集合から信頼度の条件を満たすルールを作る」の2段階に分解しており、支持度を先に決める設計は原典どおりです。先ほどの10件のデータで最小支持度だけを動かすと、リフト値1.0以上のルール件数は次のように変わりました(mlxtend 0.23.4で実行)。

最小支持度 頻出アイテム集合 リフト値1.0以上のルール
0.5 4件 2件
0.3 8件 4件
0.2 11件 8件
0.1 12件 8件

商品4つでもこの増え方です。実データでも最小支持度を下げると候補が増える場合がありますが、増加幅は商品数や購買分布、ルールの採用条件によって変わります。最初から低い値で回さず、施策に使える件数(目安として数十件)に収まる値を上から探すほうが早く終わります。

Excelで足りる範囲と、ツールに渡すべき範囲

「この2商品は一緒に売れているのか」を検算するだけなら、Excelで十分です。レシートIDを縦、商品を横に並べた0と1の表を作り、COUNTIFSで同時購買件数を数えれば4指標は計算できます。注意点は分母の取り方で、全レシート件数はCOUNTAを必ず全行が埋まるレシートID列に当てること。商品列が「○」と空白で構成されていると、COUNTAは○の件数を返して分母が壊れます。

一方で、網羅的な抽出をExcelでやるのは現実的ではありません。2商品の組み合わせ数は商品数nに対してn×(n−1)÷2で増え、100品目で4,950通り、1,000品目で499,500通りになります。3商品の組み合わせまで見るならさらに桁が上がります。Excelは仮説のあるペアの検算、ライブラリは全件からの候補抽出、と役割を分けるのが実務的です。Excelでの計算式そのものはリフト値とは?計算方法と1.0基準の目安・ExcelとPythonでの求め方の手順に沿って組めます。

PythonのmlxtendによるApriori・FP-Growthの実行例

Pythonの実行例では、頻出アイテム集合からルールを抽出し、支持度・信頼度・リフト値を一覧にします。ここでは先ほどと同じ10件のサンプルレシートを使い、実行コードとその出力例を掲載します。この例で用いるバージョンはPython 3.9.6・pandas 2.3.3・mlxtend 0.23.4です。

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules

transactions = [
    ["ビール", "おむつ", "総菜"], ["ビール", "おむつ"], ["ビール", "総菜"],
    ["おむつ", "ミルク"], ["ビール", "おむつ", "ミルク"], ["総菜", "ミルク"],
    ["ビール", "おむつ", "総菜"], ["おむつ", "総菜"], ["ビール", "総菜"],
    ["ビール", "おむつ", "ミルク"],
]
te = TransactionEncoder()
df = pd.DataFrame(te.fit(transactions).transform(transactions), columns=te.columns_)

freq = apriori(df, min_support=0.2, use_colnames=True)
rules = association_rules(freq, num_itemsets=len(df), metric="lift", min_threshold=1.0)

rules["antecedents"] = rules["antecedents"].apply(lambda s: ",".join(sorted(s)))
rules["consequents"] = rules["consequents"].apply(lambda s: ",".join(sorted(s)))
out = rules[["antecedents", "consequents", "support", "confidence", "lift"]]
out = out.sort_values(["lift", "antecedents", "consequents"], ascending=[False, True, True])
print(out.to_string(index=False, float_format="%.3f"))
antecedents consequents  support  confidence  lift
    ビール,ミルク         おむつ    0.200       1.000 1.429
        おむつ     ビール,ミルク    0.200       0.286 1.429
        おむつ         ミルク    0.300       0.429 1.071
        ミルク         おむつ    0.300       0.750 1.071
        おむつ         ビール    0.500       0.714 1.020
        ビール         おむつ    0.500       0.714 1.020
    おむつ,ビール         ミルク    0.200       0.400 1.000
        ミルク     おむつ,ビール    0.200       0.500 1.000

コードで2つ押さえるべき点があります。ひとつは association_rules の第2引数が num_itemsets であること。0.23.2でこの引数が追加されたため、association_rules(freq, "lift", 1.0) のように位置引数で書くと、第2引数の num_itemsets に文字列が渡って失敗します。metricとmin_thresholdはキーワード引数で指定してください。もうひとつは並べ替えです。抽出結果の行順はPythonの文字列ハッシュの影響を受けるため、資料に貼る前に sort_values で並びを固定しないと、実行環境やハッシュシードによって順番が変わる場合があります。出力順の再現性は、PYTHONHASHSEEDを変えて複数回実行し、整形済みの出力を比較することで確認できます。最新版は0.25.0(2026年6月6日公開、Python 3.11以上が必要)で、引数の並びは同じです。

AprioriとFP-Growthの選択基準

Aprioriは「頻出集合の部分集合は必ず頻出である」という性質(1994年の原典では any subset of a large itemset must be large)を使い、前段で残った集合からのみ候補を作ることで探索を絞ります。ただし候補集合の生成と照合を繰り返すため、商品数が多く長いパターンが出るデータでは負荷が高くなります。

その弱点に対して提案されたのがFP-Growthです。Han・Pei・Yinが2000年のSIGMODで発表した「Mining Frequent Patterns without Candidate Generation」は、データをFP-treeという接頭辞木に圧縮し、候補集合を作らずに頻出パターンを求めます。mlxtendでは from mlxtend.frequent_patterns import fpgrowth を追加し、頻出集合を求める行も freq = fpgrowth(df, min_support=0.2, use_colnames=True) に変更します。この例で指定するキーワード引数は共通ですが、両関数の引数一覧と位置は同一ではありません。掲載の10件のデータに最小支持度0.2を設定すると、どちらの手法でも同じ11件の頻出アイテム集合が得られます。結果が変わるわけではないので、同じデータと最小支持度で比較し、処理時間やメモリ使用量が改善するならFP-Growthへ替える、という判断で足ります。

「おむつとビール」の分析結果と棚替えの裏付け

バスケット分析の説明でほぼ必ず登場するのが、「若い父親がおむつを買うついでにビールを買うという意外な組み合わせを発見し、隣り合わせに陳列したら両方の売上が伸びた」という話です。この逸話は、分析結果の部分と施策の部分を分けて見る必要があります。

出所は1992年、当時NCRにいたThomas Blischokがアメリカの小売チェーンAmerican Storesの傘下Osco Drug向けに行った分析です。約120万件のバスケットデータを調べ、夕方5時から7時の時間帯にビールとおむつが同時に買われる傾向を含む多数の相関を見つけました。ここまでは実際にあった分析です。

問題は後半です。1998年4月6日のComputer Business Review(現Tech Monitor)はForbesの記事を引いて、この話の出所がBlischokの講演であることを特定したうえで、it turns out that Osco never did rearrange its shelves to put the beer and diapers together(Oscoはビールとおむつを並べる棚替えを結局行わなかった)と書いています。2006年のThe Registerの検証記事も、このチェーンが商品配置を動かして情報を活用した形跡はない、としています。つまり「売上が伸びた」という結末の部分は、一次情報では裏付けられていません。

ここから引き出せる教訓は、逸話の真偽そのものより実務的です。相関が見つかることと、それが棚替えや販促に値することは別の判断だということ。午後5時から7時という時間帯の条件を落として「ビールとおむつ」だけを取り出した時点で、この発見は施策に落とせる粒度を失っています。ルール一覧から施策を選ぶときは、時間帯・店舗・顧客層といった条件をセットで残してください。

売れ筋商品でリフト値が伸びない理由と分析設計

多くの解説が「売れ筋商品は分析対象から外す」と書いていますが、理由まで示している記事は多くありません。理由は計算式から導けます。AとBの同時購買件数は、Aの購買件数もBの購買件数も超えられません。したがってリフト値の上限は1÷(Aの支持度とBの支持度のうち大きいほう)になります。

先ほどの例では、ビールもおむつも支持度0.7なので上限は1÷0.7=1.43です。実測値の1.02はこの天井の範囲内で、どれだけ強く併売されていても1.43を超えることはありません。一方、支持度0.2の商品集合「ビールとミルク」を条件部とする「ビールとミルクを買った人はおむつも買う」というルールは信頼度1.000・リフト値1.429となり、上限に到達しています。「リフト値1.5以上を採用ラインにする」といった固定閾値を置くと、支持度0.667を超える商品は組み合わせる相手にかかわらず全滅します。これは定番商品を必ず除外する理由ではありません。共通のリフト値閾値では採用されない商品も、併売件数や施策の利益など、目的に合う基準で評価します。

分析期間と商品粒度の決め方

もうひとつ結果を大きく動かすのが、集計の単位です。商品をJANコード単位で扱うと、購買がサイズや味ごとに分散し、設定した最小支持度に届く組み合わせが少なくなる場合があります。逆に中分類(「飲料」「日用品」など)まで粗くすると、当たり前の組み合わせしか出てきません。サイズ違い・味違いを統合した「商品グループ」の粒度から始め、出てきたルールが施策に落とせるかで上下に調整するのが手堅い進め方です。

期間も同様で、季節商材を含む3か月と、特売週を含む1週間では出るルールが変わります。クリスマスやお中元の週を含めるかどうかは分析前に決め、特売は「特売期間を含めた全体」と「特売を除いた通常期」を分けて出すと、施策に使えるルールと一過性のルールを切り分けられます。

小売・ECでの使いどころ

実店舗では、抽出したルールを陳列、クロスマーチャンダイジング、セット販売の設計に使います。掲載例のように同時購買が2件しかないルールは、リフト値が高くても追加データで確かめます。そのうえで、「一緒に買われているのに売場が離れている」組み合わせを優先すると、動線の改善につながります。併売を前提とした価格設計の考え方はクロスセルとアップセルの違い|使い分け・計算方法・業種別の実践例で扱っています。

ECでは、ルールをそのままレコメンドの候補に使えるのが強みです。「この商品を買った人はこちらも買っています」という枠の実装例として、アソシエーションルールの信頼度順に候補を並べる方法があります。ただしルール数が数千件に膨らむと運用しきれないため、支持度で足切りしてから表示件数を決めます。購買履歴が少ない立ち上げ期のECでは、そもそも最小支持度を満たす組み合わせが出ないことが多く、その場合は商品属性を使うコンテンツベース方式や、担当者が選ぶ関連商品から始めます。協調フィルタリングを併用する場合も、学習に使える行動履歴があるかを確認します。方式ごとの向き不向きはレコメンドエンジンとは?仕組み・種類と導入判断(SaaS/受託開発の選び分け)を分かりやすく解説で比較しています。

飲食チェーンでは注文明細がレシートに相当し、サイドメニューやドリンクの組み合わせからセットメニューを設計できます。いずれの業種でも共通するのは、抽出したルールの検証方法を先に決めておくことです。曜日構成・価格・特売条件を揃えて棚替え前後の併売率を比べる、レコメンド枠を同時期に無作為にA/Bで出し分けるなど、効果を測る設計がないと、ルールが正しかったのか判断できません。

よくある質問

アソシエーション分析とバスケット分析の違いは何ですか?

アソシエーション分析は「同時に出現する項目の関係を見つける手法」全般を指し、バスケット分析はその対象を購買履歴(買い物かご)に限定した呼び方です。アルゴリズムは同じで、AprioriやFP-Growthを使います。Webの閲覧ログや併用薬の分析に適用する場合はバスケット分析とは呼びません。

バスケット分析のエクセルでのやり方は?

レシートIDを行、商品を列にした0と1の表を作り、COUNTIFSで同時購買件数、COUNTIFで各商品の購買件数を数えれば、支持度・信頼度・期待信頼度・リフト値を計算できます。全レシート件数は、見出しと集計行を除いたレシートIDのデータ範囲にCOUNTAを当ててください。ただし全組み合わせの網羅はExcelでは現実的でないため、仮説のあるペアの検算に使うのが向いています。

バスケット分析の信頼度とは何ですか?

商品Aを含むレシートのうち、商品Bも含むレシートの割合です。同時購買件数をAの購買件数で割って求めます。掲載例のビール→おむつでは5÷7≒71.4%です。Bが定番商品なら信頼度が高くても強い関連があるとは限らないため、全レシートにBが含まれる割合(期待信頼度)と比べたリフト値も確認します。

最小支持度はどのくらいに設定すればよいですか?

一律の正解はなく、出てくるルール件数から逆算します。0.01(100件に1件)から始め、ルールが多すぎれば上げ、ゼロなら下げる、という調整が実務的です。商品数が多いEC向けのデータでは0.001以下にしないとルールが出ないこともありますが、その水準では候補件数が大幅に増える場合があるので、カテゴリ単位に粒度を上げるほうが扱いやすくなります。

ネットショップでもバスケット分析はできますか?

できます。ECの注文明細はレシートと同じ形式なので、注文IDをトランザクション、商品IDをアイテムとして扱えば同じ計算が成立します。1注文あたりの商品点数が少ないショップでは、同時購買の支持度が低く、設定した最小支持度ではルールが出にくい場合があります。対策としては、カテゴリ単位に粒度を上げる方法があります。カート投入履歴を使う場合は、購入済みデータと分けて集計し、同時購入ではなく同時投入の傾向として評価します。

関連記事

お気に入りに入れた記事の一覧

資料請求

RELATED POSTS 関連記事

目次