無料ColabとSheetsで実践!バスケット分析入門:商品間の意外な関連性を見つける
購買データの裏に隠された顧客インサイトを見つける
ビジネスにおいて、顧客がどのような商品を同時に購入するのか、その関連性を理解することは非常に重要です。例えば、ECサイトで商品Aを購入した顧客が、高確率で商品Bも購入していることが分かれば、これらをセットで提案したり、近くに陳列したりすることで、「ついで買い」を促進し、売上向上に繋げることができます。
しかし、このような商品間の「隠れた関連性」を手作業で見つけ出すのは困難です。また、専門的な分析ツールは高価であるため、導入をためらっているという方もいらっしゃるかもしれません。
この記事では、手軽に無料で使えるGoogle SheetsとGoogle Colaboratory(Colab)というツールを組み合わせ、顧客の購買データから商品間の関連性を見つけ出す「バスケット分析(併売分析)」を実践する方法を解説します。特別なプログラミング知識がなくても始められるよう、手順とコード例を分かりやすくご紹介します。
バスケット分析(併売分析)とは
バスケット分析、あるいは併売分析とは、顧客のトランザクション(購買履歴)データを分析し、どの商品がどの商品と一緒に購入される傾向があるかを発見するデータ分析手法です。スーパーマーケットで買い物かご(バスケット)の中に何が入っているかを分析することから、この名前がついています。
この分析から得られる情報は、以下のようなビジネス施策の立案に役立ちます。
- クロスセル・アップセル戦略: 同時に購入される可能性が高い商品を顧客に推奨する。
- 商品陳列の最適化: 関連性の高い商品を店舗内で近くに配置する。
- バンドル販売・セット割引: 関連性の高い商品をまとめて販売する。
- プロモーション企画: 特定商品の購入者をターゲットにした関連商品のプロモーションを行う。
- 在庫管理の最適化: 同時に売れる商品は一緒に在庫を確保しておく。
バスケット分析は、「アソシエーションルール(Association Rule)」という形式で商品間の関連性を表現します。「XならばYである(If X, then Y)」のようなルールです。例えば、「おむつを購入する顧客はビールも購入する」といったルールが発見されることがあります(これは有名な事例の一つです)。
アソシエーションルールを評価する際には、主に以下の3つの指標が用いられます。
- 支持度(Support): 全トランザクションのうち、ルールに含まれる全ての商品(例: XとY)が同時に購入されたトランザクションの割合。単純にその組み合わせがどれくらい頻繁に出現するかを示します。
支持度(X→Y) = (XとYを含むトランザクション数) / (全トランザクション数)
- 確信度(Confidence): Xが購入されたトランザクションのうち、Yも同時に購入されたトランザクションの割合。Xが購入された場合に、どれくらいの「確信」を持ってYも購入されるかを示します。
確信度(X→Y) = (XとYを含むトランザクション数) / (Xを含むトランザクション数)
- リフト値(Lift): Xが購入された条件下でYが購入される確率(確信度)が、Yが単独で購入される確率(支持度(Y))と比べてどれだけ高いかを示します。リフト値が1より大きければ、XとYは正の相関があり、同時に購入されやすい傾向があると言えます。1に近い場合は偶然、1より小さい場合は負の相関があると考えられます。ビジネスにおいては、リフト値が高いルールに注目することが多いです。
リフト値(X→Y) = 確信度(X→Y) / 支持度(Y) = 支持度(XとY) / (支持度(X) * 支持度(Y))
なぜGoogle Sheets + Colab + Pythonで実践するのか
バスケット分析、特に多くのアソシエーションルールを効率的に計算するには、専用のアルゴリズムが必要です。表計算ソフトであるGoogle Sheetsだけでは、これらの複雑な計算を実行することは困難です。
そこで活用するのが、Google Colaboratory(Colab)とPythonというプログラミング環境です。
- Google Sheets: 普段使い慣れている方も多く、データの入力や簡単な整形、分析結果の整理や可視化に適しています。手元の購買データを簡単に準備するのに利用できます。
- Google Colaboratory (Colab): Googleが提供する、ブラウザからPythonコードを実行できる無料のサービスです。環境構築が一切不要で、すぐに分析を始められます。バスケット分析に必要なライブラリも簡単に利用できます。
- Python: データ分析の世界で広く使われているプログラミング言語です。バスケット分析のための効率的なライブラリが豊富に提供されています。
この組み合わせにより、データの準備はSheetsで手軽に行い、複雑な分析処理はColabとPythonに任せる、という無料かつ実践的なデータ分析フローを実現できます。
バスケット分析の実践手順
ここでは、架空の購買データを使ったバスケット分析の手順を解説します。
ステップ1:データの準備(Google Sheets)
バスケット分析に必要なデータは、「どのトランザクション(購入)で」「どの商品が」購入されたか、という情報です。一般的には、以下のような形式のデータを用意します。
| トランザクションID | 商品ID/商品名 | | :----------------- | :------------ | | T001 | Apple | | T001 | Banana | | T002 | Apple | | T002 | Orange | | T002 | Grape | | T003 | Apple | | T003 | Banana | | T004 | Orange | | T004 | Grape | | T004 | Pear | | T004 | Pineapple |
お手元にこのような購買データ(CSVファイルなど)がある場合は、Google Sheetsにインポートしてください。もしデータ形式が異なる場合は、Sheetsの機能を使ってこの形式に整形します。各行が「あるトランザクションで特定の商品が購入された」という記録に対応します。
整形が完了したら、このデータをCSVファイルとしてエクスポートしておきます(例: transactions.csv
)。このファイルは後でColabから読み込みます。
ステップ2:Google Colabでの分析実行(Pythonコード)
次に、Colab上でPythonを使ってバスケット分析を実行します。
- Google Colabを開く: ウェブブラウザでGoogle Colaboratoryにアクセスし、新しいノートブックを作成します。
-
Google Driveをマウント: ColabからSheetsからエクスポートしたCSVファイルを読み込むために、Google Driveをマウントします。以下のコードを実行し、表示される指示に従って認証を行います。
python from google.colab import drive drive.mount('/content/drive')
3. 必要なライブラリのインストール: バスケット分析にはmlxtend
というライブラリが便利です。Colabには多くのライブラリがプリインストールされていますが、もしmlxtend
が利用できない場合は、以下のコードでインストールします。```python
mlxtendがインストールされていない場合のみ実行
!pip install mlxtend ``` 4. ライブラリのインポートとデータの読み込み: 必要なライブラリをインポートし、Google DriveにアップロードしたCSVファイルを読み込みます。ファイルパスはご自身の環境に合わせて修正してください。
```python import pandas as pd from mlxtend.frequent_patterns import apriori, association_rules
CSVファイルのパスを指定(Google Driveのマイドライブ直下に transactions.csv を置いた場合)
file_path = '/content/drive/My Drive/transactions.csv' df = pd.read_csv(file_path)
print("--- 読み込んだデータ(最初の5行) ---") print(df.head()) print("\n") ```
-
データをバスケット形式に変換:
mlxtend
ライブラリで分析するために、データを「バスケット形式」に変換します。これは、トランザクションIDを行、商品名を列とし、そのトランザクションで商品が購入されたら1、されていなければ0、とする形式(One-Hot Encoding)です。```python
データをバスケット形式に変換(トランザクションIDを行、商品名を列とするOne-Hot Encoding)
basket = (df.groupby(['TransactionID', '商品ID/商品名'])['商品ID/商品名'] .count() .unstack() .reset_index() .fillna(0) .set_index('TransactionID'))
購入数をバイナリ(0または1)に変換
def encode_units(x): if x <= 0: return 0 if x >= 1: return 1
basket_sets = basket.applymap(encode_units)
print("--- バスケット形式データ(最初の5行) ---") print(basket_sets.head()) print("\n") ```
-
頻繁なアイテムセットの抽出:
apriori
アルゴリズムを使って、頻繁に同時に購入される商品の組み合わせ(Frequent Itemsets)を抽出します。min_support
パラメータで、抽出する組み合わせの最低支持度を指定します。小さすぎると組み合わせが膨大になり、大きすぎると有用な組み合わせが見つかりにくいため、データの特性に合わせて調整が必要です。```python
頻繁なアイテムセットの抽出(min_supportは適切な値を設定)
例として、支持度が20%以上の組み合わせを抽出
frequent_itemsets = apriori(basket_sets, min_support=0.2, use_colnames=True)
print("--- 頻繁なアイテムセット ---") print(frequent_itemsets) print("\n") ```
-
アソシエーションルールの生成: 抽出した頻繁なアイテムセットから、アソシエーションルールを生成します。
association_rules
関数を使用し、どの指標(metric
)で、どの閾値(min_threshold
)以上のルールを抽出するかを指定します。ここではリフト値(lift
)を指標とし、リフト値が1.0以上のルールを抽出する例を示します。```python
アソシエーションルールの生成(リフト値1.0以上のルールを抽出)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.0)
結果をリフト値の高い順にソートして表示
rules = rules.sort_values(by='lift', ascending=False)
print("--- 生成されたアソシエーションルール ---") print(rules) ```
ステップ3:結果の活用と可視化(Sheetsなど)
Colabで生成されたルール一覧(pandas DataFrame形式)には、前提となる商品(antecedents)、結果として購入されやすい商品(consequents)、支持度、確信度、リフト値などが含まれています。この結果をCSVファイルとしてエクスポートし、Google Sheetsで確認したり、ビジネスに活用したりします。
# 結果をCSVファイルとしてGoogle Driveに保存
rules.to_csv('/content/drive/My Drive/association_rules.csv', index=False)
print("\n--- ルール一覧を association_rules.csv として保存しました ---")
Sheetsで association_rules.csv
を開き、リフト値が高いルールや、ビジネス的に関連付けたい商品を含むルールに注目します。例えば、条件付き書式を使ってリフト値が特定の閾値以上の行を目立たせると、注目すべきルールを見つけやすくなります。
得られたルールを基に、以下のような施策を検討できます。
- ウェブサイト/アプリ: 「この商品を購入した人はこちらも購入しています」といった推薦機能を実装する。
- 実店舗: 関連性の高い商品を近くに陳列する。
- マーケティング: 特定の商品購入者リストに対し、関連商品のメールマガジンや広告を配信する。
- 商品企画: 同時に購入されやすい商品をセットにした新しい商品を開発する。
具体的な分析例のイメージ
上記のサンプルデータでmin_support=0.2
、min_lift=1.0
としてバスケット分析を実行すると、以下のようなルールが得られる可能性があります(データの件数が少ないため、あくまでイメージです)。
例えば、以下のようなルールが見つかったとします。
| antecedents | consequents | support | confidence | lift | | :-------------- | :------------ | :--------- | :---------- | :--------- | | (Banana) | (Apple) | 0.5 | 1.0 | 2.0 | | (Orange, Grape) | (Pineapple) | 0.25 | 1.0 | 4.0 | | (Apple) | (Banana) | 0.5 | 0.667 | 1.333 |
- ルール1: {Banana} → {Apple} (支持度: 0.5, 確信度: 1.0, リフト値: 2.0)
- 「バナナ」を買った顧客の100%が「リンゴ」も買っている(確信度1.0)。
- 「バナナ」と「リンゴ」が同時に購入される確率は、それぞれの購入確率から期待されるよりも2倍高い(リフト値2.0)。
- → バナナの近くにリンゴを置く、バナナ購入者にリンゴを推奨するなどの施策が有効かもしれない。
- ルール2: {Orange, Grape} → {Pineapple} (支持度: 0.25, 確信度: 1.0, リフト値: 4.0)
- 「オレンジ」と「ブドウ」を両方買った顧客の100%が「パイナップル」も買っている(確信度1.0)。
- この3つの商品が同時に購入される傾向は非常に高い(リフト値4.0)。
- → これら3点セットで割引販売する、フルーツコーナーで近くに陳列するなどの施策が考えられる。
このように、得られたルールをビジネス的な視点で解釈することが重要です。リフト値が高いルールは、単なる偶然ではなく、顧客の購買行動に強い関連性があることを示唆しています。
よくある疑問や注意点
- データ量と処理時間: データの量が多い場合(数百万トランザクションなど)、Colabの無料版ではメモリや処理時間に制限がある可能性があります。まずは一部のデータで試してみることをお勧めします。
- データの前処理: 商品名の表記ゆれ(例:「リンゴ」「りんご」)があると、異なる商品として扱われてしまいます。分析の前に、データをクレンジング(きれいにする作業)することが非常に重要です。OpenRefineなどの無料ツールもデータクリーニングに役立ちます。
- 指標の解釈: 支持度、確信度、リフト値のどれを重視するかは、分析の目的によります。網羅的に関連性を見たい場合は支持度を、特定商品を起点とした推奨には確信度を、偶然ではない関連性にはリフト値を見るといった使い分けが考えられます。特にリフト値は、ビジネス的に意味のある関連性を見つける上で有用な指標です。
- 因果関係ではない: バスケット分析で見つかるのは「一緒に購入されやすい」という統計的な関連性であり、必ずしも「一方を購入したことが原因でもう一方を購入した」という因果関係を示すものではありません。ルールの背景にある顧客心理や利用シーンを考察することも重要です。
結論:無料ツールでデータ分析の第一歩を踏み出す
この記事では、Google SheetsとGoogle Colaboratory(Colab)、そしてPythonのmlxtend
ライブラリを使い、無料でバスケット分析(併売分析)を実践する手順を解説しました。
手元にある購買データをSheetsで準備し、Colab上でPythonコードを実行することで、普段見過ごしがちな商品間の関連性を数値として把握することができます。この分析結果は、クロスセル促進、商品陳列の最適化、効果的なプロモーションなど、具体的なビジネス施策の立案に直接繋がります。
まずは少量のサンプルデータや、特定の期間のデータを使って、この記事で紹介した手順を試してみてはいかがでしょうか。データに基づいた意思決定は、ビジネスの成長を加速させるための強力な一歩となります。バスケット分析で得られた知見を、他の顧客分析(RFM分析など)と組み合わせることで、さらに深い顧客理解に繋がる可能性もあります。無料ツールを活用して、データ分析のスキルを磨き、日々の業務に活かしていきましょう。