Pandasでデシル分析をしたい(qcutを使う)

デシル分析は、施策の範囲や打ち分けを決める際にシンプルにできる手法です。

現状では、デジタルでは、施策を全体にうってもコストが変わらなかったり、 初めからidと紐づいたデータが取れることも増えたので、あまり使うことはなかもしれませんが、 それでも覚えておくと便利です。

デシル分析のイメージ

ユーザー単体の行動数や、売り上げなどをもとに、ユーザーを10個のグループに分けます。 このグループは、ユーザー数が同数になっていますが、行動数や売上の値がグループごとに異なっています。

そのため、ユーザーあたりの施策コストが同じ場合、コストはユーザーあたりコスト✖️グループあたりユーザー✖️対象グループ数で計算でき、 取り扱いが非常に楽になります。

似たような分析で行動数や売上を等分する方法もありますが、こちらは、グループ数あたりのユーザー数にばらつきが生まれるため、 コスト計算や、施策あたりのターゲットユーザー数の計算が別途必要になります。

デシル分析の進め方(売上の場合)

  1. ユーザーごとに売上を持ったデータを用意
  2. 売上をもとにユーザー数が等分となるようなグループを作成
  3. グループで集計し、そのグループの特徴や、総売上に占める割合を出す

Pandasには2を簡単にできるqcutが存在します。

実際のコード

1. ユーザーごとに売上を持ったデータを用意

import numpy as np
import pandas as pd
import random

# 平均売上3000円のデータを作成
dat = pd.Series([round(random.gauss(3000,800)) for i in range(1000)])

# 分布をみておく
dat.hist()

2. 売上をもとにユーザー数が等分となるようなグループを作成

dec_label = ['d' + str(i + 1) for i in range(10)]
dec = pd.qcut(dat,10,dec_label)

df = pd.DataFrame({'sales':dat,'dec':dec})

3. グループで集計し、そのグループの特徴や、総売上に占める割合を出す

# 集計
# 個数、グループ内合計売上、グループ内平均
df_agg = df.groupby(dec).agg([len,sum,np.mean])
df_agg.columns = ['count','total_of_sales','mean_of_sales']

# 表計算
# 全体売上に対するグループ売上の割合、割合の累計、割合が何番目か
df_agg['rate_of_total_sales'] = df_agg.total_of_sales/df_agg.total_of_sales.sum()
df_agg['cumrate_of_total_sales'] = df_agg.total_of_sales.cumsum()/df_agg.total_of_sales.sum()
df_agg['rank_of_rate'] = df_agg.rate_of_total_sales.rank(ascending=False)

df_agg

ここから

ここから、コストが許す範囲で施策効果検証をし、そこから施策のROIを算出することで、どのグループにどこまでコストをかけられるかが計算できます。