はじめに
このガイドでは、データマイニングの一手法であるアプリオリ法のPythonによる実装方法を初学者にもわかりやすく解説します。アプリオリ法は、トランザクションデータからアイテムセット間の関係性を発見するために使用されます。ここでは、そのプロセスをステップバイステップで紹介します。
実装手順
1. 必要なライブラリのインストールとインポート
アプリオリ法の実装にあたり、まず必要なPythonライブラリをインストールし、プログラム内で使用できるようにインポートする必要があります。ここでは、numpy
、matplotlib.pyplot
、pandas
、そしてアプリオリ法を実行するためのapyori
を使用します。
# apyoriライブラリのインストール
!pip install apyori
# 必要なライブラリのインポート
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from apyori import apriori
2. データセットのインポート
アプリオリ法を適用するためのデータセットをインポートします。この例では、UCI Machine Learning Repositoryから提供されているオンライン小売のデータセットを使用します。このデータセットはExcel形式で提供されており、pandas
のread_excel
メソッドを使用して読み込みます。
# データセットのインポート
df = pd.read_excel('http://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx')
df
出力:

データセットの特徴:
このデータセットには、商品購入記録が含まれています。各記録には請求書番号(InvoiceNo
)、商品コード(StockCode
)、商品説明(Description
)、数量(Quantity
)、請求日時(InvoiceDate
)、単価(UnitPrice
)、顧客ID(CustomerID
)、国名(Country
)の情報が含まれます。
3. データセットの確認
データセットに含まれる情報の確認と、データの整合性や欠損値の確認を行います。これにより、データの前処理が必要かどうかを判断します。
# データセットの先頭5行を表示
print(df.head())
# データの形式と欠損値の確認
print(f'データの形式:{df.shape}')
print(f'欠損値の数:{df.isnull().sum().sum()}')
出力:
データの形式:(541909, 8)
欠損値の数:136534
4. データの前処理
データ分析に不適切なデータを除外し、分析に適した形式にデータを整形します。ここでは、キャンセルされた注文を除外し、顧客ごとに購入した商品コードをリスト化します。
# 請求番号の最初の文字を新しい列に格納
df["InvoiceNo_first"] = df["InvoiceNo"].astype(str).str[0]
# キャンセルされた注文を除外し、顧客IDがnullでないものを抽出
df = df[(df.InvoiceNo_first == "5") & (df.CustomerID.notnull())]
# 商品コードを文字列型に変換
df['StockCode'] = df['StockCode'].astype(str)
# 顧客IDごとに商品コードをリスト化
transactions = df.groupby('CustomerID')['StockCode'].apply(list).values.tolist()
# CustomerIDごとにStockCodeをリスト化する
transactions = df.groupby('CustomerID')['StockCode'].apply(list).values.tolist()
#1週間のトランザクション数を調査
transactions_per_week = df.groupby(pd.Grouper(key='InvoiceDate', freq='W'))['InvoiceNo'].nunique()
# 週ごとのトランザクション数の平均を計算
average_transactions_per_week = transactions_per_week.mean()
# 平均値を表示
print(f'平均トランザクション数(週ごと): {average_transactions_per_week}')
出力:
平均トランザクション数(週ごと): 343.25925925925924
5. アプリオリアルゴリズムの適用
前処理したデータをもとに、アプリオリアルゴリズムを適用します。ここでは、最小サポート(min_support
)、最小確信度(min_confidence
)、最小リフト(min_lift
)、アイテムセットの最小および最大の長さ(min_length
、max_length
)を指定します。
# アプリオリアルゴリズムの実行
rules = apriori(transactions=transactions,
min_support=(3*7)/343,
min_confidence=0.65,
min_lift=3,
min_length=2,
max_length=2)
パラメータの設定基準
アプリオリアルゴリズムを用いてモデルを学習させる際には、いくつかの重要なパラメータを適切に設定する必要があります。これらのパラメータには、最小サポート(min_support)、最小確信度(min_confidence)、最小リフト(min_lift)、アイテムセットの最小長さ(min_length)、最大長さ(max_length)が含まれます。ここでは、これらのパラメータが何を意味するのか、そしてどのように設定すべきかを詳しく説明します。
最小サポートの決め方
最小サポートとは、アイテムセットがデータセット全体に占める割合の最小値です。例えば、「1日に3回以上購入があるアイテムセットのみを考慮する」とします。1週間(7日)で343のトランザクションがある場合、最小サポートは (3回×7日) / 343
となります。この値は、アイテムセットが分析対象として十分に頻繁に登場するかどうかを決定するために使用されます。
最小確信度の決め方
最小確信度は、ルールがどれだけ確信(信頼)できるかを示す指標です。デフォルトでは0に設定されていますが、分析の結果が10行程度になるように小さい値から試していくのが一般的です。確信度が高いほど、ルールが成立する確率が高いことを意味します。
最小リフトの決め方
リフト値は、ルールの有効性を示す指標で、特定のアイテムセットが一緒に購入される確率が、それぞれのアイテムが独立して購入される確率に比べてどれだけ高いかを示します。リフト値が3以上のルールは一般的に強い関連性を持つと考えられ、分析に値するものとされます。
最大長さと最小長さの決め方
アイテムセットの長さとは、そのセットに含まれるアイテムの数を意味します。最小長さと最大長さを設定することで、分析対象とするアイテムセットのサイズを限定することができます。例えば、最小長さを2、最大長さを2に設定すると、正確に2つのアイテムからなるアイテムセットのみが分析の対象となります。これにより、特定のサイズのアイテムセット間の関連性に焦点を当てることができます。
これらのパラメータを適切に設定することで、アプリオリアルゴリズムによる分析の精度を向上させることができます。それでは、これらの概念を踏まえた上で、パラメータを設定してアプリオリアルゴリズムを実行してみましょう。
6. 結果の可視化と分析
アプリオリアルゴリズムから得られた結果を分析しやすい形で表示します。ここでは、関連する商品のペア、それらのサポート、信頼度、リフト値を含むデータフレームを作成し、リフト値が高い上位10件のルールを表示します。
### 学習結果をデータフレームに格納
def inspect(results):
lhs = [tuple(result[2][0][0])[0] for result in results]
rhs = [tuple(result[2][0][1])[0] for result in results]
supports = [result[1] for result in results]
confidences = [result[2][0][2] for result in results]
lifts = [result[2][0][3] for result in results]
return list(zip(lhs, rhs, supports, confidences, lifts))
results = list(rules)
resultsinDataFrame = pd.DataFrame(inspect(results), columns = ['Product1(StockCode)', 'Product2(StockCode)', 'Support', 'Confidence', 'Lift'])
resultsinDataFrame
出力:

「支持度」Top10を表示
支持度:全体の販売数において、Product1とProduct2が両方購入された割合
resultsinDataFrame.nlargest(n = 10, columns = 'Support')
出力:

上記より一番併売の可能性が高いのは、Product 22910を買った人がProduct 22086も買っていた人が75.3%もいることが分析できる。
「リフト値」Top10を表示
確信度:Product1を購入した人において、Product1とProduct2が両方購入される割合
リフト値:Product1を購入した人において、Product1とProduct2が両方購入される割合に対する、全体の販売数において、Product1とProduct2が両方購入された割合の比率(確信度/支持度):1.0を超えると併売しやすい商品と言える
resultsinDataFrame.nlargest(n = 10, columns = 'Lift')
出力:

上記より、一番併売しやすいものはProduct 22697を買った人がProduct 22698を同時に買いやすいことがわかる。
resultsinDataFrame[resultsinDataFrame['Product1(StockCode)']=="22697"].nlargest(n = 10, columns = 'Lift')
出力:

上記より、Product 22697を買った人は、Product 22698,22699,22423を同時に買いやすいことがわかる。
まとめ
このガイドでは、アプリオリ法をPythonで実装する方法について、初心者向けに分かりやすく説明しました。各ステップを丁寧に実行することで、トランザクションデータから有意義な関連ルールを発見することができます。この手法は、販売戦略の策定や顧客の購買行動の理解に役立つため、ビジネスのさまざまなシーンで活用されています。
本コンテンツへの意見や質問