Python を使用して Apriori アソシエーション ルール アルゴリズムを実装する

アソシエーション ルール

        ビールとオムツのデータマイニングを推進した事例を聞いたことがあるかもしれませんが、ウォルマートスーパーマーケットが顧客の購入記録を分析したところ、多くの顧客がビールと赤ちゃんのオムツを同時に購入していることが判明したため、スーパーマーケットは調整したと言われています。ビールとオムツという2つのカテゴリーを合わせた結果、この2つのカテゴリーの売上が大幅に伸びたのは、出産したばかりの男性がビールを買うときにベビー用品を持参する人が多いからです。

この事例が真実であるかどうかに関係なく、この事例で顧客の購入記録を分析する方法は、アソシエーション ルールです。

アソシエーション ルール分析は、マーケット バスケット分析とも呼ばれ、データ セット内の項目間の関係を分析するために使用されます。

アソシエーション ルールの基本概念

アイテムセット: コレクション {milk, cereal, sugar} などのアイテムのコレクションは 3 つのアイテムセットであり、購入レコード内のアイテムのコレクションと見なすことができます。

頻出アイテムセット: 名前が示すように、頻出アイテムのコレクションです。頻繁に定義する方法は?比率によって決定される支持と信頼の 2 つの概念は、相関ルールで比率値を計算するために使用されます。

サポート:アイテム全体に占める共起アイテムの割合。購入実績を例にとると、100件の購入実績があり、商品AとBの同時購入実績が50件ある場合(つまり、AとBの同時購入実績が50件ある場合)、あちらのAとBの2点セットの支持率は50%

信頼度: A を購入した後に B を購入する条件付き確率は、ベイジアン式に従って、次のように表すことができます。

 リフト度:生成ルールの実際の値、つまり、ルールを使用した後の製品の出現数が、製品のみの評価率よりも高いかどうかを判断するために、リフト度とのプロモーション効果を測定します。 Yを購入する確率でXを購入する. 次の式は、X と Y が互いに独立している場合、リフトは 1 であり、リフトが大きいほど X->Y の相関が強いことを示しています。

アソシエーション ルール アプリオリ アルゴリズム

1. Apriori アルゴリズムの基本的な考え方は
、データ セットを複数回スキャンすることです. 最初のスキャンは、頻繁に 1 項目セットのセット L1 を取得します. k 番目のスキャンは、最初に k-1 番目のスキャンの結果 Lk-1 を使用して候補 k-itemset Ck を生成し, 走査過程で Ck の支持度を計算し, 走査後に頻出 k-itemset Lk を計算し, 候補 k-itemset の集合 Ck が空になったらアルゴリズムを終了する.
2. Apriori アルゴリズムによる頻出アイテムセットの生成過程
(1) 接続ステップ
(2) 枝刈りステップ

3. Apriori アルゴリズムの主なステップ
(1) すべてのデータをスキャンして候補 1 アイテムセットの集合 C1 を生成する
(2) 最小サポートに従って、候補の集合 C1 から高頻度 1 アイテムセットの集合 L1 を生成する1-itemset
( 3) k>1 の場合、手順 (4) (5) (6)
(4) を繰り返し、Lk による接続と枝刈り操作を実行して、候補 (k+1)-itemset Ck+1
(5)を生成します。候補 (k+1)-itemset 集合 Ck+1 から頻度の高い (k+1)-itemset 集合 Lk+1 を生成するための最小サポート (6 )
L が空集合でない場合、k = k+1、ジャンプステップ (4) へ、そうでない場合はステップ (7) へスキップ (
7) 最小信頼度に従って、頻出アイテムセットから強い関連ルールを生成する

Apriori アルゴリズムは、古典的なアソシエーション ルール アルゴリズムです。Apriori アルゴリズムの目標は、K 個のアイテムの最大頻度セットを見つけることです。Apriori アルゴリズムは、1 アイテムセットの検索から開始し、最小サポートしきい値をプルーニングしてから、アイテムセットがなくなるまで 2 アイテムセット、3 アイテムセットを検索します。

コード 

このアルゴリズムの実装では、mlxtend のサードパーティ パッケージを使用します。pip install mlxtend でインストールするだけです。

コンパイルツール: jupyter ノートブック

最初に、このプロジェクトで使用されているサードパーティ パッケージをインポートします。

import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
import warnings
warnings.filterwarnings('ignore')

次に、2 つの小さなケースを使用して、アソシエーション ルール アルゴリズムの使用方法を示します。

ケースナンバーワン

データを準備する

order = {'001': '面包,黄油,尿布,啤酒', 
        '002': '咖啡,糖,小甜饼,鲑鱼,啤酒',
        '003': '面包,黄油,咖啡,尿布,啤酒,鸡蛋', 
        '004': '面包,黄油,鲑鱼,鸡',
        '005': '鸡蛋,面包,黄油', 
        '006': '鲑鱼,尿布,啤酒',
        '007': '面包,茶,糖鸡蛋', 
        '008': '咖啡,糖,鸡,鸡蛋',
        '009': '面包,尿布,啤酒,盐', 
        '010': '茶,鸡蛋,小甜饼,尿布,啤酒'}
data_set = []
id_set= []
shopping_basket = {}
for key in order:
    item = order[key].split(',')
    id_set.append(key)
    data_set.append(item)
shopping_basket['ID'] = id_set
shopping_basket['Basket'] = data_set
shopping_basket

データを DataFrame 型に変換する

data = pd.DataFrame(shopping_basket)
data

 

次に、バスケット データをワンホット (0, 1) エンコーディングに変換する必要があります。

このステップは、主にデータの ID と Basket を分割して処理し、最終的にマージすることです。

data_id = data.drop('Basket',1)
data_basket = data['Basket'].str.join(',')
data_basket = data_basket.str.get_dummies(',')
new_data = data_id.join(data_basket)
new_data

 アプリオリ アルゴリズムを呼び出す

apriori()では、min_support、つまり最小サポート度がデフォルトで0.5なので、変更したい場合はこの値を直接変更してください。

frequent_itemsets = apriori(new_data.drop('ID',1),min_support=0.5,use_colnames=True)
frequent_itemsets

 その結果、二項集合ではおむつとビールが出現し、おむつとビールの相関が高いことがわかりました。

次に、その特定の関連付けルールを見ていきます

association_rules(frequent_itemsets,metric='lift')

おむつとビールのプロモーション値も非常に大きい (1 より大きい) ことがわかります。これは、おむつとビールが高い相関関係にあることをさらに示しているため、販売時には一緒に販売するか、適切にプロモーションを増やす必要があります。 .

ケース2

手順はケース 1 と同様です。

データを準備する

shopping_backet = {'ID':[1,2,3,4,5,6],
                    'Basket':[['Beer','Diaper','Pretzels','Chips','Aspirin'],
                              ['Diaper','Beer','Chips','Lotion','Juice','BabyFood','Milk'],
                              ['Soda','Chips','Milk'],
                              ['Soup','Beer','Diaper','Milk','IceCream'],
                              ['Soda','Coffee','Milk','Bread'],
                              ['Beer','Chips']
                              ]
                    }
data = pd.DataFrame(shopping_backet)
data

アプリオリ アルゴリズムで必要なデータ型にデータを変換します。

data_id = data.drop('Basket',1)
data_basket = data['Basket'].str.join(',')
data_basket = data_basket.str.get_dummies(',')
new_data = data_id.join(data_basket)
new_data

アプリオリ アルゴリズムを呼び出す

frequent_itemsets = apriori(new_data.drop('ID',1),min_support=0.5,use_colnames=True)
frequent_itemsets

 

 サポートサポートだけを考えると【ビール、チップス】と【オムツ、ビール】が多いので、どちらの組み合わせがより適切でしょうか?

association_rules(frequent_itemsets,metric='lift')

 明らかに[おむつ、ビール]のリフト値が大きく、この組み合わせがより関連性が高いことを示しています

おすすめ

転載: blog.csdn.net/m0_64336780/article/details/125355963