一、介绍
在电商竞争激烈的环境下,精准营销对于提高用户购买转化率和企业效益至关重要。本项目旨在运用 Uplift Model 分析电商用户数据,识别对营销活动响应积极的用户群体,以便制定针对性策略,优化营销资源配置,提升营销效果。
二、数据生成与准备
- 用户基本信息:用户 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)和对照组(未参与营销活动,标识为 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)
- 对于测试集中的用户,分别用处理组和对照组模型进行预测,得到处理组预测概率和对照组预测概率,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
- 根据 Uplift Score 对测试集用户降序排列。
- 按一定比例(如 10%、20%等)逐步选取用户群体,计算处理组和对照组的购买转化率。
- 绘制 Qini Curve,横坐标为选取用户比例,纵坐标为处理组购买转化率与对照组购买转化率差值(uplift)。若曲线高于随机猜测曲线(对角线),说明模型能较好区分不同响应用户群体。
- 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.")
四、结果分析
- 将用户按 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,说明模型有一定的有效性,但仍有提升空间。
- 重点营销对象,发送个性化强、吸引力大的促销邮件,如提供大额优惠券(如 50 元以上无门槛优惠券)或专属折扣(如 8 折优惠)。
- 推荐与他们历史购买和浏览兴趣相关的高价值商品,提高购买转化率和客单价。
- 定期发送一般性促销信息,给予一定程度折扣(如每月 20 元优惠券)或积分奖励。
- 通过个性化推荐引导发现感兴趣商品,培养购买习惯,推荐热门或新品。
- 减少直接营销推送,避免过度打扰导致反感,可每季度发送简单产品推荐邮件。
- 进一步分析需求偏好,调整营销方式或内容,或优化产品服务体验提高兴趣,如进行用户调研了解不满意之处并改进。
- 模型优化:定期收集新数据,重新评估模型性能,如每季度进行一次。根据新数据调整模型参数或特征,提高模型准确性。
- 策略效果监控:监控营销活动效果,比较不同用户群体实施策略前后的购买转化率、客单价、用户忠诚度等指标变化。如每周分析高 uplift 区间用户购买转化率和客单价变化,若效果不理想及时调整营销策略。
本人耗时半年打造的因果分析-AB实验分析&数分高频面试考点,欢迎扫码观看学习(阅读原文)
![](http://mmbiz.qpic.cn/sz_mmbiz_png/IsEdiaoUibV6L2VER2JRgUDH1PdQCxMhEdhkicsHqKaYcKvO5F1gqsUHtIpFmoOJRft5fiaUyASYs2yB6PsFv6cy3Q/640?wx_fmt=png&from=appmsg)
代码和数据一键运行前往:https://www.heywhale.com/mw/project/67092674a659683ff5cce7a8