アソシエーション分析の説明

アソシエーション分析とは データの中から意味のある関連性を抽出する 手法を指す。

相関係数 はふたつの変数の関係を数値的に示すものだが アソシエーション分析では「Aという条件の時にBが起こる確率」を求めることができる。

相関関係はふたつの変数「A」と「B」があった場合、計算時に「A」「B」を入れ替えても相関係数は変わらないが アソシエーション分析では「A」と「B」を入れ替えると結果は異なる。

つまり変数に方向性があるので、「A ⇒ B」と表記される。この表記を アソシエーション ルール と呼ぶ。

アソシエーション分析の結果は カイ二乗検定t検定 における p値 のようにひとつの計算結果では判断できない。 アソシエーション ルールの強さと有効性は以下の3つの値で判断する。

  • 支持度
  • 信頼度
  • リフト値
支持度 (Support)
すべてのデータのなかで「A ⇒ B」といったルールが出現する割合。
信頼度 (Confidence)
条件(A)が出現するデータのなかで、条件(A)と結論(B)が同時に出現する割合。確信度とも言う。
リフト値 (Lift)
「A ⇒ B」のルールがあった場合、結論(B)の支持度で、「A ⇒ B」の信頼度を割った数値。

それぞれの値の解釈はだいたい下記のようになる。

値の解釈
  支持度 信頼度 リフト値
高い 全データに対する影響が大きい よくある組み合わせ ルールが起こりやすい
低い 全データに対する影響が小さい まれにある組み合わせ ルールが起こりにくい

ちなみに、アソシエーション ルールを求める時に組み合わせが膨大になるという問題が起こりうるが すべての組み合わせを試すことなく効率的に計算するアルゴリズムとして アプリオリ アルゴリズム というのが使われる。

アソシエーション分析は購買データにおいて同時に買われた商品を分析するときによく使われる手法なのでマーケット・バスケット分析とも呼ばれる。


ナンバーズの予想に使うには

「Aという条件の時にBが起こる」というのを分析するので抽せん数字の出現傾向を分析するのに使える。

例えば「『1』が出現したときに同時に出現しやすい数字は何か?」を知ることができる。

第1回から第5回の抽せん数字を用いてアソシエーション分析を行ってみます。

ナンバーズ3 第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: 先頭5行(インデックス 0 から 5)の内容
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 ]
support_itemsets: 信頼度 confidece が 0.7 以上のアソシエーションルールからリフト値 (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」になります。

上の表の解釈としては

  • リフト値が 5.0 と高いルールは「(1,5) -> (0)」「(0) -> (1,5)」と、「(9,5) -> (2)」「(2) -> (9,5)」である。 * 予想数字として 150 や 952 を選択することが検討できる。

ただし、アソシエーション ルールに方向はあっても、抽せん数字の順序は考慮されないのでストレートを狙うことはできず、ボックスやセット買いの予想として有効である。


最終更新日: 2020年01月24日(金)


目次

プロローグ

統計解析

データマイニング

資料集

Back to top