# アソシエーション分析を事例と共に解説！Pythonで実装してみよう！

> 当サイト【スタビジ】の本記事では、データマイニングの一種であるアソシエーション分析について解説していきます！考え方や事例を紹介した後、Pythonで実装していきます！

- URL: https://toukei-lab.com/association-analysis
- 公開: 2023.08.11 / 更新: 2025.03.06
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、データマイニングの一種であるアソシエーション分析について解説していきます！考え方や事例を紹介した後、Pythonで実装していきます！
:::

こんにちは！

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

あるコンビニにコーヒーを買いに行っただけなのに、近くに置いてあったスイーツもついつい手に取ってしまった、、、

そんな経験ありませんか？

:::talk{who="robotan"}
いいところに置いてあるんだよな〜ほんと
:::

<mark>もしかしたらそのコンビニでは、アソシエーション分析により商品陳列が最適化され、「ついで買い」が増やされているかもしれません！</mark>

この記事では、そんなアソシエーション分析の特徴とPythonでの実装を見ていきたいと思います。

以下のYoutube動画でアソシエーション分析について分かりやすく解説しているのでこちらも合わせてチェックしてみてください！

::youtube{#wOtIvPZbDs4}

## アソシエーション分析とは

![Site Stats](/wp-content/uploads/2017/11/Site-Stats-amico.png)

それでは、まずアソシエーション分析とは何なのか見ていきましょう！

アソシエーション分析のアソシエーションとは、英語で「つながり・関連」などの意味。

すなわち<mark>アソシエーション分析とは**関連性を見つけ出す分析手法。**</mark>

もう少し細かく説明すると、大量のデータから「〇〇ならば△△」という関係を**アソシエーション・ルール**として抽出して、ビジネスへ応用する[データマイニング](/data-mining)手法です。

:::talk{who="umatan"}
アソシエーション・ルールとは、ある事象が発生すると別の事象が発生するといった関係のこと！
:::

:::talk{who="robotan"}
じゃあ例えば「サンドイッチを買う人はコーヒも買う」っていうのもアソシエーション・ルールってこと？
:::

:::talk{who="umatan"}
そういうこと！
:::

アソシエーション分析により「もし〇〇ならば△△である」という規則性を定量的に把握できるため、**セールスにおける戦略を効率良く考えることができます。**

![アソシエーション分析](/wp-content/uploads/2023/08/association_1-1.jpg)

## アソシエーション分析の活用例

![Business Plan](/wp-content/uploads/2020/07/Business-Plan-amico-e1613688762889-1024x903.png)

アソシエーション分析は**対象事象が行動記録である全ての事象**に対して適用することができます。

ここでは3つの活用例を紹介していきます。

### 1. 商品販売

アソシエーション分析の代表例として有名なのが「<mark>おむつとビール</mark>」の事例。

アメリカのドラッグストアにおいて、25店舗・120万個の顧客の買い物かごの中身を分析し、顧客に共通する傾向を導き出す試みが行われました。

その結果、「金曜日の17～19時に30～40代の男性が来店し、**おむつとビールをよく併せ買いする**」という傾向が明らかになったのです！

そこから、「<mark>仕事終わりにおむつを買って帰るよう頼まれた父親が、ついでにビールを購入しているのではないか</mark>」という仮説が立てられました。

そして仮説に基づきおむつの隣にビールを配置したところ、**実際に売上が増加する効果が現れたそうです。**

:::talk{who="robotan"}
一見なんの関連もなさそうだけど、分析によってこんなことがわかるんだな〜
:::

:::talk{who="umatan"}
これがアソシエーション分析の力！
:::

### 2. 検索履歴

ECサイトにおける検索履歴データに対してアソシエーション分析を行うことで、特定の商品・サービスを検索する際に**一緒に検索されやすい単語を明らかにすることができます。**

それにより、サイト上での商品訴求をより効率的に行うことができるようになるのです。

例えば、<mark>「エアコン」と「フィルター自動掃除」が同時に検索されることが多い</mark>とわかれば、エアコンの商品訴求時にフィルター自動掃除機能を売りにした内容にすることで**売上向上が期待できるでしょう。**

![アソシエーション分析　検索履歴](/wp-content/uploads/2023/08/association_search-1.jpg)

### 3. 位置情報

位置情報データに対してアソシエーション分析を行うことにより、ある人が特定の場所を訪問した際に**一緒に訪問しやすい場所を明らかにすることができます。**

それにより、行動のパターンを効率よく把握することができるようになるのです。

例えば、<mark>「観光地Aを訪れる観光客は観光地Bを訪れる割合が高い」</mark>ということがわかれば、「観光地Aと観光地Bのコラボキャンペーン」を行うことで**観光客の増加が期待できるでしょう。**

![アソシエーション分析　位置情報](/wp-content/uploads/2023/08/association_sightseeing.jpg)

## アソシエーション分析で用いる3つの指標

![Data Trends](/wp-content/uploads/2020/12/Data-Trends-amico-min-e1615808046774-1024x913.png)

上で説明したように、アソシエーション分析の目的は**アソシエーション・ルール**をデータから抽出することです。

そのために必要な指標が3つあるので、それぞれ見ていきましょう！

:::talk{who="umatan"}
話をわかりやすくするため、「商品販売」を例として取り上げるよ！
:::

### 1. 支持度 (Support)

支持度(Support)は、<mark>全データの中で、「ある商品Aとある商品Bが一緒に購入される割合」を表す指標です。</mark>

つまり、**支持度が高ければそれだけ商品Aと商品Bが同時に購入される傾向にある**ということです。

例えば、ある小売店で100件の購買データを得られたとしましょう。そのうち、20件のデータで「カレー粉と牛乳が一緒に購入されていた」場合、**支持度は0.2**となります。一方、80件のデータで「シチュー粉と牛乳が一緒に購入されていた」場合、**支持度は0.8**となります。

よって、「シチュー粉と牛乳」の組み合わせの方がより一緒に購入される傾向にあるということがわかり、小売店側は<mark>「シチュー粉売り場の近くに牛乳を置こう」</mark>といった**決断を下しやすくなるのです。**

![アソシエーション分析　支持度](/wp-content/uploads/2023/08/association_support-1.jpg)

### 2. 信頼度(Confidence)

信頼度(Confidence)は、<mark>「ある商品Aが購入された中で、ある商品Bも購入された割合」を表す指標です。</mark>

つまり、**信頼度が高ければそれだけ商品Aと商品Bが同時に購入される傾向にある**ということです。

例えば、「カレー粉」の購入データが20件あり、そのうち「牛乳」も一緒に購入されているものが10件であった場合、**信頼度は0.5**となります。

:::talk{who="robotan"}
ん？支持度と信頼度って何が違うんだ？
:::

:::talk{who="umatan"}
支持度は「全体」が分母、信頼度は「ある商品A」が分母である、というところかな！
:::

そうなんです。

そのため、例えば購買データ100件を得られたとき、「カレー粉と牛乳が一緒に購入されたデータ」が1件だけであった場合でも、**信頼度**は「カレー粉が購入された中で牛乳も購入された割合」となり、**1.0**と算出されてしまいます。

しかし、「全体」を分母とする**支持度**を算出すると**0.01**となり、カレー粉と牛乳が一緒に購入される割合は高くないということがわかります。

<mark>つまり、**信頼度**だけで判断せず、**支持度**と合わせて判断する必要があります。</mark>

:::talk{who="umatan"}
両指標の値が高ければ関連性があることは間違いないね！
:::

![アソシエーション分析　信頼度](/wp-content/uploads/2023/08/association_confidence_2.jpg)

### 3. リフト値(Lift)

リフト値(Lift)は、<mark>全データの中で、「ある商品Aが購入された中で、ある商品Bも購入された割合」が、「ある商品Bだけを購入した割合」に比べてどれくらい多いかを表す指標です。</mark>

つまり、**リフト値が高ければそれだけ商品Aの影響で商品Bが同時に購入される傾向にある**ということです。

:::talk{who="umatan"}
「商品Aの影響で」というのがポイント！
:::

例えば、ある小売店で100件の購買データを得られたとしましょう。

「シチュー粉」の購入データが80件あり、そのうち「牛乳」も一緒に購入されているものが60件であった場合、**信頼度は0.75**となります。一方、全データ中、「牛乳」を購入したデータが70件あった場合、**「牛乳」を購入した割合は0.70**となります。このとき**リフト値は0.75÷0.70=1.07**となります。

:::talk{who="robotan"}
「信頼度」を「商品Bが購入された割合」で割ってリフト値を算出しているんだな！
:::

一般的に、<mark>リフト値が1を超える場合は、AとBに強い関係性があるといえます。</mark>

![アソシエーション分析　リフト値](/wp-content/uploads/2023/08/association_lift.jpg)

## Pythonでアソシエーション分析をやってみよう

![](/wp-content/uploads/2018/09/goriIMGL9703_TP_V1-e1555747456954.jpg)

ここからは、Pythonで実際にアソシエーション分析をやっていきます。

<mark>分析の目的は、アソシエーション・ルールを抽出すること！</mark>

以下の流れで分析を進めていきます。

:::box
**1. ライブラリのインストール\
2\. データの準備\
3\. データの加工\
4\. 支持度(Support)の算出\
5\. アソシエーション・ルール抽出のための評価指標の算出\
6\. アソシエーション・ルールの抽出**
:::

### 1. ライブラリのインストール

今回はmlxtendと呼ばれるライブラリを使用します。

また、分析で使用するモジュール等もここで全てimportしておきます。

```python
pip install mlxtend
```

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

### 2. データの準備

データは以下のように作成したものを用います。

```python
dataset = [
    ['玉ねぎ', 'にんじん','じゃがいも', '牛乳', 'カレー粉'],
    ['玉ねぎ', 'じゃがいも', 'シチュー粉', '牛乳'],
    ['牛乳', 'シチュー粉', 'にんじん', 'カレー粉'],
    ['牛乳','にんじん','玉ねぎ', 'シチュー粉'],
    ['玉ねぎ', 'にんじん', '牛乳', 'シチュー粉', 'じゃがいも'],
    ['玉ねぎ', 'カレー粉' ,'じゃがいも', '牛乳'],
    ['にんじん', 'シチュー粉', '玉ねぎ', 'じゃがいも'],
    ['シチュー粉', '牛乳', '玉ねぎ', 'カレー粉'],
    ['シチュー粉', '牛乳', 'にんじん'],
]
```

### 3. データの加工

続いて、データセットをテーブル形式に加工します。

:::talk{who="umatan"}
後でアソシエーション分析のためのモデルを構築するんだけど、その際のデータ形式は「テーブル型」という制約があるよ！
:::

```python
# データをテーブル形式に加工
table = TransactionEncoder()
table_array = table.fit(dataset).transform(dataset)
df = pd.DataFrame(table_array, columns=table.columns_)
df
```

![](/wp-content/uploads/2023/08/4d0cc6a90f5e7026c5aeeb4ab6618682-1.png)

購入された商品であれば「True」、購入されていなければ「False」がそれぞれ格納されています。

### 4. 支持度(Support)の算出

続いて、商品の組み合わせごとに支持度を算出していきます。

```python
# 支持度の算出
freq_items = apriori(df,  # データフレーム
min_support  = 0.01,    # 支持度(support)の最小値
use_colnames = True,    # 出力値のカラムに購入商品名を表示
max_len      = None,    # 生成されるitemsetsの個数
#verbose = 0,            # low_memory=Trueの場合のイテレーション数
#low_memory = False,    # メモリ制限あり＆大規模なデータセット利用時に有効
)

# 結果出力
freq_items = freq_items.sort_values("support", ascending = False).reset_index(drop=True)
freq_items
```

![](/wp-content/uploads/2023/08/68428622f6770a57c42de661c54d9bf1.png)

支持度の大きい順に並んでいることがわかります。

今回は上位5件だけを表示していますが、実際は**全ての商品の組み合わせ**で支持度が算出されています。

この時、組み合わせではなくて単一の商品が上位に並んでいますが、例えば1位の牛乳は全データのうち牛乳が買われた割合を表しています。9人のうち8人が牛乳を購入しているので8/9で0.888889となるわけです。

### 5. アソシエーション・ルール抽出のための評価指標の算出

次に、**信頼度**や**リフト値**などの各評価指標を算出していきます。

下記のコードでアソシエーション・ルールの抽出まで一気にできるのですが、今回は例を示すために2段階に分けて説明します。

```python
# アソシエーション・ルール抽出のための評価指標の算出
df_rules = association_rules(
freq_items,             # supportとitemsetsを持つデータフレーム
metric = "confidence",  # アソシエーション・ルールの評価指標
min_threshold = 0.0,    # metricsの閾値
)
df_rules
```

![](/wp-content/uploads/2023/08/5b271c92f270e371fdb9309979f20bd9-1.png)

全ての商品の組み合わせにおける**支持度**、**信頼度**、**リフト値**が算出されています。

antecedents(前半)が1つ目の商品、consequents(後半)が2つ目の商品を表しています。

すなわち、antecedents_supportが1つ目の商品単体での支持度、consequents_supportが2つ目の商品単体での支持度を表し、supportが組み合わせとしての支持度、confidenceが信頼度、liftがリフト値を表します。

### 6. アソシエーション・ルールの抽出

5.で述べたように、コードの中の引数「metric = 」と「min_threshold = 」の部分でアソシエーション・ルールを抽出することができますが、ここで改めてルールを抽出していきます。

```python
#結果を絞る
df_rules2 = df_rules[(df_rules["support"]>=0.4)&(df_rules["confidence"]>=0.8)&(df_rules["lift"]>1.0)]
df_rules2
```

![](/wp-content/uploads/2023/08/0181bc788be983dea9e2bcf3fbd8334c-1.png)

出力結果より、**支持度が0.4以上**かつ、**信頼度が0.8以上**かつ、**リフト値が1.0より大きい**商品組み合わせが抽出できていることがわかります（自分で作成したデータなので現実だとあまりなさそうな「カレー粉」と「牛乳」の組み合わせもルールとして抽出されてしまいました、、、）。

全ての指標を並べた後にこのように各指標の条件で抽出するほうがおすすめです。

<mark>実際には膨大な量のデータに対して分析を行うので、より各指標の値が高い組み合わせを抽出できると思います！</mark>

## アソシエーション分析　まとめ

ここまでご覧いただきありがとうございました！

本記事ではアソシエーション分析の概要からPythonでの実装方法まで解説していきました。

<mark>アソシエーション分析は、ビジネスの現場においてよく用いられる手法です。</mark>

上の「ビールとおむつ」の事例のように、**今まで見えていなかった改善ポイント**が明らかになる場合もあるので、蓄積したデータがあれば積極的にアソシエーション分析を行なっていきましょう！

また、今回分析に用いたPythonについて勉強したい方は以下の記事を参考にしてみてください！

<https://toukei-lab.com/python-learn>

さらに詳しくAIやデータサイエンスの勉強がしたい！という方は当サイト「スタビジ」が提供する[スタビジアカデミー](https://toukei-lab.com/achademy/)というサービスで体系的に学ぶことが可能ですので是非参考にしてみてください！

:::box
**AIデータサイエンス特化スクール「スタアカ」**

![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)
:::

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>統計学・機械学習・ディープラーニングを網羅的に学ぶ<br>
生成AI（LLM・RAG・プロンプトエンジニアリング）を学ぶ<br>
SQLとPythonを組み合わせて実データを使った様々なワークを行う<br>
実践的なビジネスフレームワークを学ぶ<br>
マーケティングの実行プラン策定</td>
</tr>
</tbody>
</table>

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」！！

当メディアが運営するスクールです。

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

<mark>そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解なども合わせて学べるボリューム満点のコース</mark>になっています！

Pythonが初めての人でも学べるようなカリキュラムにしておりますので是非チェックしてみてください！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}