一、介绍

在电商竞争激烈的环境下,精准营销对于提高用户购买转化率和企业效益至关重要。本项目旨在运用 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(0, 1.01, 0.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(0, 1.01, 0.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实验分析&数分高频面试考点,欢迎扫码观看学习(阅读原文)

5c1454a7b7603c9b852afcd0a84ad1d0.png

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

联系方式:openDogs


 

 

be2fb3fe2de9116acf554a99cef42790.jpeg


 

 

 

 

 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
  • 交流群

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

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

59baca1d4a85e907cbb5b45ef22fdf14.png

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐