クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

アソシエーション分析の信頼度とリフト

このレッスンのあとで: 頻出な組をルールにして、信頼度とリフトで強さを評価できる。

55分のレッスンコマンド2件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

頻出な組を決まりに変える

アソシエーションルールとは、「Aを買った人はBも買う」という形で、品物どうしの関係を書いた決まりです。信頼度とリフトの2つの数字で、その決まりが役に立つかを確かめられます。

頻出な組を見つけただけでは、まだ使えません。「おにぎりを買う客にお茶をすすめる」のように、向きのある決まりにして、強さを測ります。

このレッスンのゴール

メモ

頻出な組をルールにして、信頼度とリフトで強さを評価できる。

キーワード

ことばいみれい
ルール「Aが入っていたらBも入る」という形の決まりおにぎり → お茶
前提ルールの左側の品物
結論ルールの右側の品物
信頼度前提が入ったかごのうち、結論も入っていた割合
リフト信頼度を、結論だけの支持度で割った値

学生が入力するセルは、このプレビューでは空白です。

ルールには向きがある

「おにぎり → お茶」は、おにぎりが入っていたらお茶も入る、というルールです。左側を前提、右側を結論と呼びます。

信頼度は、前提が入ったかごのうち、結論も入っていた割合です。おにぎりは6かご、そのうちお茶もあるのは5かごなので、5 ÷ 6 で約 0.83 です。

例: 4つのルールの信頼度

ルール両方あるかご前提のかご信頼度
おにぎり → お茶560.83
お茶 → おにぎり551.00
パン → 牛乳350.60
牛乳 → パン331.00

学生が入力するセルは、このプレビューでは空白です。

コマンドで信頼度を求める

次のコマンドは、おにぎりが入ったかごのうち、お茶も入っていた割合を求めます。前のレッスンと同じ10かごを、文字で書きました。

r はおにぎり、t はお茶です。答えは 0.83 です。

おにぎり → お茶の信頼度

コマンド
docker exec jupyter python3 -c 'B=["rt","rte","bm","rtb","bme","rt","bm","re","be","rt"]; print(round(sum(["r" in x and "t" in x for x in B]) / sum(["r" in x for x in B]), 2))'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

信頼度だけでは人気の品物にだまされる

レジ袋のように、ほとんどの客が買う品物があるとします。どんな品物を前提にしても、袋が入る信頼度は高くなります。

リフトは、信頼度を結論の支持度で割った値です。1より大きければ、結論が単独のときより入りやすいことを表します。1なら関係なし、1より小さければ入りにくい、です。

例: 信頼度とリフト

ルール信頼度結論の支持度リフト
おにぎり → お茶0.830.51.67
パン → 牛乳0.600.32.00
パン → たまご0.400.41.00
おにぎり → たまご0.330.40.83
おにぎり → 袋(別の店)1.000.91.11

学生が入力するセルは、このプレビューでは空白です。

コマンドでリフトを求める

次のコマンドは、おにぎり → お茶のリフトを求めます。信頼度 0.83 を、お茶の支持度 0.5 で割ると 1.67 になります。

コマンドでは、かごの数だけで同じ値を計算します。答えは 1.67 です。

おにぎり → お茶のリフト

コマンド
docker exec jupyter python3 -c 'B=["rt","rte","bm","rtb","bme","rt","bm","re","be","rt"]; both=sum(["r" in x and "t" in x for x in B]); print(round(both * len(B) / (sum(["r" in x for x in B]) * sum(["t" in x for x in B])), 2))'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

信頼度が高いルールは、よいルールだと考えがちです。実際は、ほとんどのかごに入る品物が結論なら、どのルールも信頼度が高くなります。リフトが1に近いルールは、何も教えてくれません。

ノートブックに入力: 週末は忙しい

コード: python
import csv

days = []
for row in csv.DictReader(open("hires.csv")):
    items = []
    if row["weekday"] in ["Sat", "Sun"]:
        items.append("weekend")
    if row["weather"] == "rainy":
        items.append("rainy")
    if float(row["temp_c"]) >= 12:
        items.append("warm")
    if int(row["hires"]) >= 300:
        items.append("busy")
    days.append(items)

def how_many(first, second):
    total = 0
    for items in days:
        if first in items and second in items:
            total = total + 1
    return total

left = "weekend"
right = "busy"
confidence = how_many(left, right) / how_many(left, left)
print("信頼度:", round(confidence, 2))
print("リフト:", round(confidence / (how_many(right, right) / len(days)), 2))

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。