🐍

【Python】複数条件を満たすフラグを付与する(セグメント分析の前処理)

2024/12/22に公開

やりたいこと

ビジネスの分析ではユーザー(or 顧客)が持つ複数の属性によって、それぞれが特定の行動にどれくらい影響を及しているのか確認したい場合があります。
例えば、属性A、B、Cがあったときに、ユーザーがある行動に至る(=CVする)とき、属性Bよりも属性Aを持っている方がCVRが高いのか、もしくは属性A、B、C全て持っている方がCVRが高いのか、逆にどの属性も持っていない場合はCVRが低いのかなど、こういったセグメント別にCVRを集計したいユースケースがあると思います。

今回はPythonを使って、その検証を進めるための簡単な前処理を整理してみました。

実際にやってみる

まずは基本ライブラリをimportします。

import numpy as np
import pandas as pd

説明用のdataframeを作成します。
各ユーザーに対して、属性A、B、Cを持つかどうかを判定するフラグを付与します。

df = pd.DataFrame(
    {
        'user_id': [100, 108, 107, 110, 113, 105, 101, 120, 106, 111],
        'attribute_A_flg': [1, 0, 0, 1, 1, 1, 0, 0, 0, 1],
        'attribute_B_flg': [1, 1, 0, 1, 0, 0, 0, 1, 0, 1],
        'attribute_C_flg': [1, 0, 1, 0, 1, 0, 0, 1, 1, 1],
    })

dfを呼び出すとこんなdataframeができました。

これに対して、先述のユースケースに沿って、セグメントを付与してみます。
apply()メソッドの中のlambdaの指定では、通常は1カラムを指定することでそのカラムに対する条件分岐によって演算することができますが、ここでは各行(row)を指定することで、一回の処理でdataframe内全てのカラムに対して柔軟に演算することが可能です。

# 集計カテゴリを作成
df['attribute_category'] = df.apply(
    lambda row:
    'Aのみ該当' if row['attribute_A_flg']==1  and row['attribute_B_flg']==0 and row['attribute_C_flg']==0 else
    'Bのみ該当' if row['attribute_A_flg']==0 and row['attribute_B_flg']==1 and row['attribute_C_flg']==0 else
    'Cのみ該当' if row['attribute_A_flg']==0 and row['attribute_B_flg']==0 and row['attribute_C_flg']==1 else
    'AとBのみ該当' if row['attribute_A_flg']==1 and row['attribute_B_flg']==1 and row['attribute_C_flg']==0 else
    'BとCのみ該当' if row['attribute_A_flg']==0 and row['attribute_B_flg']==1 and row['attribute_C_flg']==1 else
    'AとCのみ該当' if row['attribute_A_flg']==1 and row['attribute_B_flg']==0 and row['attribute_C_flg']==1 else
    'AとBとC全て該当' if row['attribute_A_flg']==1 and row['attribute_B_flg']==1 and row['attribute_C_flg']==1 else
    'どれも該当しない', axis=1)

dfを呼び出すと、こんなカラムが完成しました。

あとはここで作成した集計カテゴリに対して、groupby()などを使ってCVRなどを計算します。

Discussion