本ページには広告・プロモーションが含まれています。
アソシエーション分析とは データの中から意味のある関連性を抽出する 手法を指す。
相関係数 はふたつの変数の関係を数値的に示すものだが アソシエーション分析では「Aという条件の時にBが起こる確率」を求めることができる。
相関関係はふたつの変数「A」と「B」があった場合、計算時に「A」「B」を入れ替えても相関係数は変わらないが アソシエーション分析では「A」と「B」を入れ替えると結果は異なる。
つまり変数に方向性があるので、「A ⇒ B」と表記される。この表記を アソシエーション ルール と呼ぶ。
アソシエーション分析の結果は カイ二乗検定 や t検定 における p値 のようにひとつの計算結果では判断できない。 アソシエーション ルールの強さと有効性は以下の3つの値で判断する。
それぞれの値の解釈はだいたい下記のようになる。
| 支持度 | 信頼度 | リフト値 | |
|---|---|---|---|
| 高い | 全データに対する影響が大きい | よくある組み合わせ | ルールが起こりやすい | 
| 低い | 全データに対する影響が小さい | まれにある組み合わせ | ルールが起こりにくい | 
ちなみに、アソシエーション ルールを求める時に組み合わせが膨大になるという問題が起こりうるが すべての組み合わせを試すことなく効率的に計算するアルゴリズムとして アプリオリ アルゴリズム というのが使われる。
アソシエーション分析は購買データにおいて同時に買われた商品を分析するときによく使われる手法なのでマーケット・バスケット分析とも呼ばれる。
「Aという条件の時にBが起こる」というのを分析するので抽せん数字の出現傾向を分析するのに使える。
例えば「『1』が出現したときに同時に出現しやすい数字は何か?」を知ることができる。
第1回から第5回の抽せん数字を用いてアソシエーション分析を行ってみます。
| 抽せん数字 | 100の位 | 10の位 | 1の位 | |
|---|---|---|---|---|
| 回号 | ||||
| 1 | 191 | 1 | 9 | 1 | 
| 2 | 988 | 9 | 8 | 8 | 
| 3 | 194 | 1 | 9 | 4 | 
| 4 | 105 | 1 | 0 | 5 | 
| 5 | 592 | 5 | 9 | 2 | 
アソシエーション分析のために今回は mlxtend という機械学習ライブラリを使います。
まずは python プログラムは 前準備 で用意したデータフレームを使って第1回から第5回の抽せん数字のデータを抽出します。
dataset = df.loc[:5, ['place100', 'place10', 'place1']].values
# array([[1, 9, 1],
#     [9, 8, 8],
#     [1, 9, 4],
#     [1, 0, 5],
#     [5, 9, 2]])
ここから機械学習のコードになりますが、 dataset の数字の配列を bool 値に変換します。
bool 値への変換は One-Hotエンコーディング と呼ばれ、カテゴリー変数を学習器が学習しやすい 0 か 1 に変換する手法です。
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df_dataset = pd.DataFrame(te_ary, columns=te.columns_)
df_dataset
df_dataset の中身は行列です。
| 0 | 1 | 2 | 4 | 5 | 8 | 9 | |
|---|---|---|---|---|---|---|---|
| 0 | False | True | False | False | False | False | True | 
| 1 | False | False | False | False | False | True | True | 
| 2 | False | True | False | True | False | False | True | 
| 3 | True | True | False | False | True | False | False | 
| 4 | False | False | True | False | True | False | True | 
次は 支持度 (Support) 0.01 以上でアイテム集合を検出します。
支持度は "すべてのデータのなかで「A ⇒ B」といったルールが出現する割合" のことです。
from mlxtend.frequent_patterns import apriori
# 支持度 (Support) 0.01 以上でアイテム集合の検出
support_itemsets = apriori(df_dataset, min_support=0.01, use_colnames=True)
support_itemsets
| support | itemsets | |
|---|---|---|
| 0 | 0.2 | (0) | 
| 1 | 0.6 | (1) | 
| 2 | 0.2 | (2) | 
| 3 | 0.2 | (4) | 
| 4 | 0.4 | (5) | 
アイテム集合の変数が作成できたので 信頼度 (Confidence) または リフト値 (Lift) からアソシエーションルールを分析します。
from mlxtend.frequent_patterns import association_rules
# 信頼度 confidece が 0.7 以上のアソシエーションルールを分析
rules = association_rules(support_itemsets, metric="confidence", min_threshold=0.7)
# rules は pandas.DataFrame なので条件によるデータの選択も容易に行える
# 信頼度 confidece が 0.7 以上のアソシエーションルールからリフト値 (Lift) が 2.0 以上のルールを選択
rules[ rules['lift'] >= 2.0 ]
| antecedents | consequents | antecedent support | consequent support | support | confidence | lift | leverage | conviction | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | (0) | (5) | 0.2 | 0.4 | 0.2 | 1.0 | 2.5 | 0.12 | inf | 
| 3 | (2) | (5) | 0.2 | 0.4 | 0.2 | 1.0 | 2.5 | 0.12 | inf | 
| 7 | (0, 1) | (5) | 0.2 | 0.4 | 0.2 | 1.0 | 2.5 | 0.12 | inf | 
| 9 | (1, 5) | (0) | 0.2 | 0.2 | 0.2 | 1.0 | 5.0 | 0.16 | inf | 
| 10 | (0) | (1, 5) | 0.2 | 0.2 | 0.2 | 1.0 | 5.0 | 0.16 | inf | 
| 13 | (4) | (1, 9) | 0.2 | 0.4 | 0.2 | 1.0 | 2.5 | 0.12 | inf | 
| 14 | (9, 2) | (5) | 0.2 | 0.4 | 0.2 | 1.0 | 2.5 | 0.12 | inf | 
| 15 | (9, 5) | (2) | 0.2 | 0.2 | 0.2 | 1.0 | 5.0 | 0.16 | inf | 
| 17 | (2) | (9, 5) | 0.2 | 0.2 | 0.2 | 1.0 | 5.0 | 0.16 | inf | 
表の support が支持度、 confidence が信頼度、lift がリフト値です。
antecedents が「A ⇒ B」の条件「A」、 consequents が「A ⇒ B」の結論「B」になります。
上の表の解釈としては
ただし、アソシエーション ルールに方向はあっても、抽せん数字の順序は考慮されないのでストレートを狙うことはできず、ボックスやセット買いの予想として有効である。
最終更新日: 2020年01月24日(金)