社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

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

机器学习初学者 • 3 月前 • 191 次点击  

一、介绍

在电商竞争激烈的环境下,精准营销对于提高用户购买转化率和企业效益至关重要。本项目旨在运用 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
     
    191 次点击