Pythonでウォレットシェア計算(transform)

Pythonでウォレットシェア計算(transform)

こんにちは。マスジュンです。

最近、pandasでtransformという関数を知ったので、ウォレットシェアの計算を例にメモとして残しておきます。ちなみに、ウォレットシェアとは、「その人のお財布のうちに占める割合」を表します。財布に占める割合が高いほど良く、ブランドのポジショニング、ロイヤル顧客の判定など、マーケティングにとっては重要な指標の1つです。

パッケージを呼び出して、サンプルデータを作成します。

In [3]:
import pandas as pd
import numpy as np

np.random.seed(100)

df = pd.DataFrame(data = {
 'ID' : pd.Series([1] * 4 + [2] * 4).astype(str).str.zfill(3),
 'brand' : ['bland_A','bland_B'] * 4,
 'sales' : np.random.normal(100, 40, 8).round()
    })
df
Out[3]:
ID brand sales
0 001 bland_A 30.0
1 001 bland_B 114.0
2 001 bland_A 146.0
3 001 bland_B 90.0
4 002 bland_A 139.0
5 002 bland_B 121.0
6 002 bland_A 109.0
7 002 bland_B 57.0

IDが顧客ID、brandは購入ブランド、salesは購入価格とします。 基本的な購買データは上記のような形だと思います。
では、最初に、顧客ごとのブランド購入金額を計算します。

ウォレットシェアの計算

個人ごとのブランド購入金額

最初に、顧客がどれだけブランドにお金を費やしているかを計算します。

In [4]:
id_bland_sum = df.groupby(['ID','brand']).sum()
id_bland_sum
Out[4]:
sales
ID brand
001 bland_A 176.0
bland_B 204.0
002 bland_A 248.0
bland_B 178.0

個人ごとに購入しているブランドごとの金額が計算されました。

個人の合計金額の計算

ウォレットシェアを計算する場合、これらの値を個人が費やしている金額で割れば計算されます。では、次に顧客ごとの合計金額を計算してみましょう。ただし、そのまま個人ごとに合計を計算すると行数が異なってしまいます。そこで、transform関数を用います。SQLでいうWindow関数ですね。

In [6]:
id_sum = id_bland_sum.groupby('ID').transform(sum)
id_sum
Out[6]:
sales
ID brand
001 bland_A 380.0
bland_B 380.0
002 bland_A 426.0
bland_B 426.0

ちゃんと、個人の合計金額がブランドごとに出力されています。

ウォレットシェアの計算

仕上げに、上記で計算した2つを使って、ウォレットシェアを計算しましょう。

In [8]:
wallet_share_df = id_bland_sum / id_sum
wallet_share_df
Out[8]:
sales
ID brand
001 bland_A 0.463158
bland_B 0.536842
002 bland_A 0.582160
bland_B 0.417840

無事にウォレットシェアが計算されました。お好みで100をかけて、%表記にして下さい。

このままだと確認しにくいと思うので、縦に出力されている形を横に整形します。

In [11]:
wallete_share_df = wallet_share_df.unstack()
wallete_share_df
Out[11]:
sales
brand bland_A bland_B
ID
001 0.463158 0.536842
002 0.582160 0.417840

見やすくなりましたね。

最後に

今回はtransform関数の紹介のために、ウォレットシェアを計算という例で説明しました。SQLでもWindow関数を使うことで計算できるので、データがちゃんとDBに書くのされているならば、そちらで計算したほうが速いと思います。SQLの記述について、また機会があったら記載しておこうと思います。

では、今日はこの辺で。

Pythonカテゴリの最新記事