kaggle

【テーブルコンペで使える!】リフト値の計算方法!

テーブルコンペの特徴量何使えばいいのかわかんなーい!!

ならばアソシエーションルールを入れてみよう!

バスケットマーケティングを取り入れよう!

あるお店での商品の購入数や、商品の価格を予測するタスクがあったとします。

そんなときに、役立つ特徴量です。

バスケットマーケティングって?

バスケットマーケティングで都市伝説的に有名な言葉があります。

「おむつを購入する顧客は同時にビールも買う」

夕方に、おむつの隣にビールを置いておくと、おむつを買いに来たお客さん(仕事帰りの男性)がついでにビールを購入しているという関係です。

一見、ビールとおむつは全く関係がなさそうですが、分析をしてみると無関係そうななもの同士にも何かしらの関係があることが分かってきます。

この関係を定性的に評価できるようにした指標が今回紹介するリフト値です。

使うデータを確認

今回使用するデータはこちらです。

インデックスが日付、カラムが商品のid、値はその日にいくつ商品が売れたか(個数)を記載しています。(本来なら一人一人の商品の購入に関するデータであることが望ましいですが、今回は入手できたデータの都合上このようになっています。)

 

アソシエーションルールを計算しよう!

バスケットマーケティングの結果得られた、「商品Aを購入する人には商品Bも売れる」といった商品間の併売に関するルールのことをアソシエーションルールといいます。

アソシエーションルールには大きく3つの指標があります。

  1. 支持度(support)
  2. 確信度(confidence)
  3. リフト値(lift)

支持度(support)

支持度とは、ある商品Aと別の商品Bが併売された数の全体に占める割合です。

今回でいうと、item_id = 0, item_id = 1の商品に関する支持度は、

t = 28
# 商品のid 0と1が一緒に購入された(このデータでは同じ日に売れた)個数
demands_ab = demands.iloc[300:430,[0,1]].min(axis=1).rolling(28).sum().values.reshape(-1,1)
# 商品のid 0が一緒に購入された個数
demands_a = demands.iloc[300:430,[0]].rolling(t).sum().values
# 商品のid 1が一緒に購入された個数
demands_b = demands.iloc[300:430,].rolling(t).sum().values
# その日の0,1の取引量(本当は一日に出たレシートの枚数が適切。今回は得られたデータの都合によりこれを指標にする)
demands_all = demands_a + demands_b


# それぞれの支持度を求める
support_ab = demands_ab/demands_all
support_a = demands_a/demands_all
support_b = demands_b/demands_all
support_ab:
 [0.55263158]
 [0.51428571]
 [0.5       ]
 [0.45945946]
 [0.47368421]
...
support_a:
...

となります。ちなみに、rolling(28).sum()の部分は、その日から過去28日までさかのぼって、その情報を使って、その日の支持度を算出するという意味です。

 

今回ですと、支持度は、0.5くらいのオーダーになります。相対的な指標なのでこれだけを見て大小を判断することはできません。

確信度(confidence)

確信度とは、商品Aの購入数をベースに、その商品Aとある商品Bの組み合わせ購買がどれくらいの割合であるのかを表します。

つまり、商品Aを購入するなら商品Bも購入する、というルールの確信度は、

confidence_a = demands_ab/demands_a
confidence_b = demands_ab/demands_b
print("confidence_a",confidence_a[28:])
print("confidence_b",confidence_b[28:])
confidence_a 
 [0.22222222]
 [0.26315789]
 [0.35294118]
 [0.33333333]
 [0.35294118]
...

confidence_b 
 [0.23529412]
 [0.23529412]
 [0.26315789]
 [0.3       ]
 [0.3       ]
...

 

こんな感じになります。この場合だと、どちらの確信度も低いので、あまり参考になりませんが、確認度が高いときは一緒に購入されていることが考えられます。

ただ、確信度だけでは、本当に一緒に購入される割合が高いのか、それとも、どちらか一方が常に購入されるような商品で、たまたま一緒に購入されているように見えるだけで実は意味のない数値なのかどうかが分かりません。

これを解決するのがリフト値です。

リフト値(lift)

商品Aを購入するなら商品Bを購入するという関係において、

そのリフトとは、商品Aを購入するなら商品Bを購入する確信度(%)を商品Bの支持度(%)で割った値のことです。

つまり、全体に占める商品Bの購買率に対する、商品Aを購買したときの商品Bの購買率の比率がリフト値です。

 

当然、リフト値が1.0よりも大きければ併売しやすい商品になりますし、1.0よりも小さければ併売しにくい商品と解釈できます。

商品Aを購入するなら商品Bを購入する、というルールのリフトは以下のように求められます。

lift = confidence_a / support_b

= (demands_ab/demands_a) / (demands_b/demands_all)

= (demands_ab* demands_all) / (demands_a*demands_b)

となります。

lift = demands_ab*(demands_a+demands_b)/(demands_a*demands_b)
think = np.concatenate([lift, demands_ab, demands_all, demands_a, demands_b, demands.iloc[:,0]].values,demands.iloc[:,].values], axis=1)
lift = pd.DataFrame(think,columns=["lift"," demands_ab", "demands_all", "demands_a", "demands_b", "a", "b"])
lift.iloc[28:38]

今回だと、1を超えていないので、一緒に購入はされていなさそうですね。

まとめ

バスケットマーケティングを指標を紹介しました!

特徴を数字に起こすって面白いですよね。

もっと、データサイエンスについて勉強していきたいです!

 

 

オススメのプログラミングスクールをご紹介

タイピングもままならない完全にプログラミング初心者から

アホいぶきんぐ
アホいぶきんぐ
プログラミングってどこの国の言語なの~?

たった二ヶ月で

いぶきんぐ
いぶきんぐ
え!?人工知能めっちゃ簡単にできるじゃん!

応用も簡単にできる…!!

という状態になるまで、一気に成長させてくれたオススメのプログラミングスクールをご紹介します!

テックアカデミーのPython+AIコースを受講した僕が本音のレビュー・割引あり! というプログラミング完全初心者だった僕が Tech Academy(テックアカデミー)のPython×AIコース を二ヶ月間...

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です