Py学习  »  机器学习算法

【机器学习】Uplift Model 在电商营销中的因果归因分析

机器学习初学者 • 1 年前 • 616 次点击  

一、介绍

在电商竞争激烈的环境下,精准营销对于提高用户购买转化率和企业效益至关重要。本项目旨在运用 Uplift Model 分析电商用户数据,识别对营销活动响应积极的用户群体,以便制定针对性策略,优化营销资源配置,提升营销效果。

二、数据生成与准备

  1. 数据基本信息
  • 用户基本信息:用户 ID、年龄、性别(0 为女性,1 为男性)、注册时间(2010 - 2023 年)、地域(华北、华东、华南、西南、西北)、会员等级(1 - 普通会员,2 - 银牌会员,3 - 金牌会员)。
  • 购买行为:购买次数(0 - 50 次)、购买金额(0 - 5000 元)、最近一次购买时间(2023 年 1 月 1 日 - 12 月 31 日)。
  • 浏览行为:浏览商品类别(0 - 9)、浏览时长(0 - 100 分钟)、浏览频率(0 - 10 次)。
  • 营销活动参与标识(0 - 未参与,1 - 参与),生成时确保 0 和 1 有一定比例分布(如 0.4 和 0.6)。
  • 数据集包含以下特征:
  • 数据预处理
    • 对分类变量进行编码,如性别、会员等级用 LabelEncoder 转换为数值,地域用 OneHotEncoder 进行独热编码。
    • 对数值变量(年龄、购买金额)进行标准化处理,使其均值为 0,标准差为 1。
    • 创建新特征,如购买频率(购买次数除以时间跨度)、浏览活跃度(浏览时长与浏览频率乘积)。
    • 添加目标列 has_purchased,根据购买次数是否大于 0 来判断。
    • 去除重复记录,保证数据的唯一性。
    • 处理缺失值,对年龄、购买金额等数值型数据采用均值填充,性别、地域等分类变量缺失值采用最常见类别填充(如男性较多则性别缺失值填 0,地域缺失值填华东等),并剔除年龄不合理(小于 18 或大于 100)及购买金额为负的异常值。
    • 数据清洗
    • 特征工程
    import pandas as pd
    from sklearn.preprocessing import LabelEncoder, StandardScaler, OneHotEncoder
    from sklearn.impute import SimpleImputer

    # 读取数据
    data = pd.read_csv('电商用户数据.csv')

    # 数据清洗
    # 去除重复记录
    data.drop_duplicates(inplace=True)
    # 处理缺失值
    numeric_imputer = SimpleImputer(strategy='mean')
    data['年龄'] = numeric_imputer.fit_transform(data[['年龄']])
    data['购买金额'] = numeric_imputer.fit_transform(data[['购买金额']])
    data['性别'].fillna(0, inplace=True)
    data['地域'].fillna('华东', inplace=True)
    data = data[(data['年龄'] >= 18) & (data['年龄'] <= 100) & (data['购买金额'] >= 0)]

    # 特征工程
    # 编码分类变量
    le = LabelEncoder()
    data['性别' ] = le.fit_transform(data['性别'])
    data['会员等级'] = le.fit_transform(data['会员等级'])
    ohe = OneHotEncoder()
    region_ohe = ohe.fit_transform(data[['地域']]).toarray()
    region_columns = [f'region_{i}' for i in range(region_ohe.shape[1])]
    region_df = pd.DataFrame(region_ohe, columns=region_columns)
    data = pd.concat([data, region_df], axis=1).drop('地域', axis=1)
    # 标准化数值变量
    scaler = StandardScaler()
    data[['年龄''购买金额']] = scaler.fit_transform(data[['年龄''购买金额']])
    # 创建新特征
    data['购买频率'] = data['购买次数'] / (data['最近一次购买时间'] - data['注册时间'])
    data['浏览活跃度'] = data['浏览时长'] * data['浏览频率']
    # 添加目标列
    data['has_purchased'] = data['购买次数'] > 0

    三、建模与分析

    1. 划分处理组和对照组
    • 根据营销活动参与标识将用户分为处理组(参与营销活动,标识为 1)和对照组(未参与营销活动,标识为 0)。
  • 选择建模方法与模型训练
    • 采用 Two Model Approach,分别为处理组和对照组建立逻辑回归模型。
    • 使用 sklearn.linear_model.LogisticRegression 进行训练,将预处理后的数据按 70%和 30%划分为训练集和测试集(使用 train_test_split)。
    from sklearn.linear_model import LogisticRegression
    from sklearn.model_selection import train_test_split

    # 划分特征和目标变量
    X = data.drop(['has_purchased''营销活动参与标识'], axis=1)
    y = data['has_purchased']

    # 划分处理组和对照组
    treatment_group = data[data['营销活动参与标识'] == 1]
    control_group = data[data['营销活动参与标识'] == 0]

    # 处理组数据
    X_treatment = treatment_group.drop(['has_purchased''营销活动参与标识'], axis=1)
    y_treatment = treatment_group['has_purchased']

    # 对照组数据
    X_control = control_group.drop(['has_purchased''营销活动参与标识'], axis=1)
    y_control = control_group['has_purchased']

    # 划分训练集和测试集
    X_treatment_train, X_treatment_test, y_treatment_train, y_treatment_test = train_test_split(X_treatment, y_treatment, test_size=0.3, random_state=42)
    X_control_train, X_control_test, y_control_train, y_control_test = train_test_split(X_control, y_control, test_size=0.3, random_state=42)

    # 建立处理组模型
    treatment_model = LogisticRegression()
    treatment_model.fit(X_treatment_train, y_treatment_train)

    # 建立对照组模型
    control_model = LogisticRegression()
    control_model.fit(X_control_train, y_control_train)
    1. 计算 Uplift Score
    • 对于测试集中的用户,分别用处理组和对照组模型进行预测,得到处理组预测概率和对照组预测概率,Uplift Score = 处理组预测概率 - 对照组预测概率。
    
    
    
        
    uplift_scores = []
    for index, row in X_test.iterrows():
        treatment_prediction = treatment_model.predict_proba([row])[0][1]
        control_prediction = control_model.predict_proba([row])[0][1]
        uplift_scores.append(treatment_prediction - control_prediction)

    X_test['uplift_score'] = uplift_scores
    1. 模型评估与可视化分析
    • 根据 Uplift Score 对测试集用户降序排列。
    • 按一定比例(如 10%、20%等)逐步选取用户群体,计算处理组和对照组的购买转化率。
    • 绘制 Qini Curve,横坐标为选取用户比例,纵坐标为处理组购买转化率与对照组购买转化率差值(uplift)。若曲线高于随机猜测曲线(对角线),说明模型能较好区分不同响应用户群体。
    • Qini Curve 绘制与分析
    • AUUC 计算与分析:计算 Area Under the Uplift Curve(AUUC),越接近 1 表示模型性能越好,可与其他模型或基准比较。

    以下是绘制 Qini Curve 和计算 AUUC 的代码:

    import matplotlib.pyplot as plt
    from sklearn.metrics import auc

    def qini_curve(data):
        data_sorted = data.sort_values(by='uplift_score', ascending=False)
        total_positives = data_sorted['has_purchased'].sum()
        total_negatives = len(data_sorted) - total_positives
        treatment_positives = data_sorted[data_sorted['营销活动参与标识'] == 1]['has_purchased'].sum()
        control_positives = total_positives - treatment_positives
        qini = []
        treatment_rate = []
        control_rate = []
        n = len(data_sorted)
        fractions = np.arange(01.010.01)
        fraction_steps = (n * fractions).astype(int)
        for i in fraction_steps:
            top_i = data_sorted.head(i)
            if i > 0:
                top_treatment_positives = top_i[top_i['营销活动参与标识'] == 1]['has_purchased'].sum()
                top_control_positives = top_i[top_i['营销活动参与标识'] == 0]['has_purchased'].sum()
                if treatment_positives > 0 and control_positives > 0:
                    treatment_rate.append(top_treatment_positives / treatment_positives)
                    control_rate.append(top_control_positives / control_positives)
                    qini.append(treatment_rate[-1] - control_rate[-1])
                else:
                    treatment_rate.append(0 if treatment_positives == 0 else top_treatment_positives / treatment_positives)
                    control_rate.append(0 if control_positives == 0 else top_control_positives / control_positives)
                    qini.append(treatment_rate[-1] - control_rate[-1])
        return qini

    qini = qini_curve(X_test)

    fractions = np.arange(01.010.01)

    # 确保 qini 和 fractions 长度匹配且不为空
    if len(qini) > 0 and len(fractions) == len(qini):
        plt.plot(fractions, qini, label='Qini Curve')
        plt.xlabel('Fraction of population')
        plt.ylabel('Uplift')
        plt.legend()
        plt.show()
    else:
        print("Qini calculation resulted in empty or incorrect data.")

    # 计算 AUUC
    if len(qini) > 0 and len(fractions) == len(qini):
        auuc = auc(fractions, qini)
        print(f'AUUC: {auuc}')
    else:
        print("AUUC calculation not possible due to incorrect Qini data.")

    四、结果分析

    1. 结果解读
    • 将用户按 Uplift Score 分为高、中、低区间(如高 uplift:Uplift Score > 0.5;中 uplift:0.2 < Uplift Score <= 0.5;低 uplift:Uplift Score <= 0.2)。
    • 分析不同区间用户特征,如高 uplift 区间用户可能购买频率高、会员等级高、浏览活跃度强等,通过这些分析可理解用户对营销活动的响应机制。
    • 观察绘制的 Qini Curve 形状和 AUUC 值。若 Qini Curve 明显高于对角线且 AUUC 值接近 1,表明模型能有效区分对营销活动响应不同的用户。例如,假设得到的 AUUC 值为 0.7,说明模型有一定的有效性,但仍有提升空间。
    • Qini Curve 和 AUUC 结果分析

    • Uplift Score 分布分析

  • 应用策略制定
    • 高 uplift 区间用户(积极响应者)
    • 中 uplift 区间用户(适度响应者)
    • 低 uplift 区间用户(响应较弱者)
    • 重点营销对象,发送个性化强、吸引力大的促销邮件,如提供大额优惠券(如 50 元以上无门槛优惠券)或专属折扣(如 8 折优惠)。
    • 推荐与他们历史购买和浏览兴趣相关的高价值商品,提高购买转化率和客单价。
    • 定期发送一般性促销信息,给予一定程度折扣(如每月 20 元优惠券)或积分奖励。
    • 通过个性化推荐引导发现感兴趣商品,培养购买习惯,推荐热门或新品。
    • 减少直接营销推送,避免过度打扰导致反感,可每季度发送简单产品推荐邮件。
    • 进一步分析需求偏好,调整营销方式或内容,或优化产品服务体验提高兴趣,如进行用户调研了解不满意之处并改进。
    • 基于 Uplift Score 的精准营销策略
  • 持续优化与监控
    • 模型优化:定期收集新数据,重新评估模型性能,如每季度进行一次。根据新数据调整模型参数或特征,提高模型准确性。
    • 策略效果监控:监控营销活动效果,比较不同用户群体实施策略前后的购买转化率、客单价、用户忠诚度等指标变化。如每周分析高 uplift 区间用户购买转化率和客单价变化,若效果不理想及时调整营销策略。


    本人耗时半年打造的因果分析-AB实验分析&数分高频面试考点,欢迎扫码观看学习(阅读原文)

    代码和数据一键运行前往:https://www.heywhale.com/mw/project/67092674a659683ff5cce7a8


    联系 方式openDogs

    往期精彩回顾




    • 交流群

    请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,

    例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。



    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/175263