O2O优惠券核销-模型预测

目录

一、项目背景与目标

二、数据描述

三、问题分析

四、数据探索与预处理

五、特征工程(构造特征)

5.1 特征构造-整体数据

5.1.1 时间特征

5.1.2 优惠券特征

5.1.3 预测目标值构造

5.2 数据划分-时间滑窗

5.3 特征构造-滑窗数据

5.3.1 用户特征

5.3.2 商户特征

5.3.3 优惠券特征

5.3.4 用户-优惠券联合特征

5.3.5 用户-商户联合特征

5.3.6 商户-优惠券联合特征

5.3.7 用户-商户-优惠券联合特征

六、模型构建

七、数据保存

八、心得体会


一、项目背景与目标

O2O行业关联数亿消费者,各类APP每天记录了超过百亿条用户行为和位置记录,因而成为大数据科研和商业化运营的最佳结合点之一。以优惠券盘活老用户或吸引新客户进店消费是O2O的一种重要营销方式。然而随机投放的优惠券对多数用户造成无意义的干扰。对商家而言,滥发的优惠券可能降低品牌声誉,同时难以估算营销成本。个性化投放是提高优惠券核销率的重要技术,它能让具有一定偏好的消费者得到真正的实惠,同时赋予商家更强的营销能力。

利用用户在2016年1月1日至2016年6月30日之间真实线下消费行为数据,预测用户在2016年7月领取优惠券后15天以内的使用情况。

预测前的进行了初步数据分析:O2O优惠券数据分析报告

二、数据描述

编程语言:Python
数据来源:https://tianchi.aliyun.com/competition/entrance/231593/information
数据字段:

三、问题分析

问题一:预测数据集特征只有6个,如何全面构造特征工程来表达样本?

 

 

问题二:如何划分数据集,利用历史数据预测未来数据?

历史数据——>提取特征——>代表一种习惯或者固有惯性——>不易改变

因此可以利用7月份(待预测)的前几个月数据集——>提取固有特征——>基于固有特征进行预测

数据划分:

  • 2016.01.01-2016.04.30预测→2016.05.01-2016.05.31(数据集1)
  • 2016.02.01-2016.05.31预测→2016.06.01-2016.06.30(数据集2)
  • 2016.03.01-2016.06.30预测→2016.07.01-2016.07.31(待预测数据集)

实现过程:

- 对2016.01.01-2016.04.30的数据提取特征

- 将提取的特征应用于2016.05.01-2016.05.31数据中,另外两组同理

- 将处理后的2016.05.01-2016.05.31和2016.06.01-2016.06.30的数据合并为一个数据集

- 将合并后的数据集划分train、test进行模型训练

- 将训练好的模型用于预测2016.07.01-2016.07.31。

四、数据探索与预处理

import pandas as pd
import numpy as np
data_off = pd.read_csv("/项目准备/O2O优惠券使用预测/offline_train.csv")
off_test = pd.read_csv("/项目准备/O2O优惠券使用预测/offline_test.csv")
off_test1 = off_test
off_test.head()
data_off.shape
data_off.info()
data_off.describe()
# 消费日期的最大最小值
# 领券日期的最大最小值
print(data_off['Date'].max(),data_off['Date'].min())
print(data_off['Date_received'].max(),data_off['Date_received'].min())

输出:
20160630.0 20160101.0
20160615.0 20160101.0
# 缺失值
data_off.isnull().sum()
# 没有优惠券时coupon_id,字段discount_rate和date_received也同时没有
nan1 = data_off["Discount_rate"].isnull()
nan2 = data_off['Date_received'].isnull()
nan3 = data_off['Coupon_id'].isnull()
np.all(nan1==nan2),np.all(nan1==nan3)

输出:
(True, True)
# 删除重复值
data_off.drop_duplicates(inplace=True) 
data_off.info()
# 将日期float64类型转换为日期类型
data_off['Date'] = pd.to_datetime(data_off['Date'],format='%Y%m%d')
data_off['Date_received'] = pd.to_datetime(data_off['Date_received'],format='%Y%m%d')
off_test['Date_received'] = pd.to_datetime(off_test['Date_received'],format='%Y%m%d')
data_off.info()

五、特征工程(构造特征)

5.1 特征构造-整体数据

5.1.1 时间特征

# 从领券到消费的天数
date_interval = data_off['Date']-data_off['Date_received']
data_off['date_interval'] = [d.days for d in date_interval]
#领券日期是周几
data_off['receive_week']=[d.weekday()+1 for d in data_off['Date_received']]
off_test['receive_week']=[d.weekday()+1 for d in off_test['Date_received']]

#优惠券领取时间是否是周末
data_off['receive_isWeekend']=data_off['receive_week'].apply(lambda x:1 if x>5 else 0)
off_test['receive_isWeekend']=off_test['receive_week'].apply(lambda x:1 if x>5 else 0)

5.1.2 优惠券特征

# 折扣率
def deal_rate(x):
    if pd.isna(x):
        y =float(x)
    elif ":" in x:
        a = float(x.split(":")[0])# 分母
        b = a-float(x.split(":")[1])# 分子
        y = np.round(b/a,2)
    else:
        y = float(x)
    return y
data_off['Discount_rate_%'] = data_off['Discount_rate'].map(deal_rate)
off_test['Discount_rate_%'] = off_test['Discount_rate'].map(deal_rate)

# 门槛
def deal_mk(x):
    if pd.isna(x):# nan
        y =float(x)
    elif ":" in x:# 满减券
        y = int(x.split(":")[0])# 分母
    else:# 打折券
        y = np.nan
    return y
data_off['Discount_rate_mk'] = data_off['Discount_rate'].apply(deal_mk,1)
off_test['Discount_rate_mk'] = off_test['Discount_rate'].apply(deal_mk,1)
data_off.head()

5.1.3 预测目标值构造

data_off['Y'] = data_off['date_interval'].apply(lambda x:1 if x<=15 else 0)
data_off.head()

5.2 数据划分-时间滑窗

feature1=data_off[((data_off['Date_received']>='2016-01-01')&(data_off['Date_received']<='2016-04-30')) | ((data_off['Date']>='2016-01-01')&(data_off['Date']<='2016-04-30'))]
feature1.reset_index(drop=True,inplace=True)
database1=data_off[((data_off['Date_received']>='2016-05-01')&(data_off['Date_received']<='2016-05-31')) | ((data_off['Date']>='2016-05-01')&(data_off['Date']<='2016-05-31'))]
database1.reset_index(drop=True,inplace=True)
print(' 1-4月数据总计%i行'%len(feature1))
print(' 5月数据总计%i行'%len(database1))
feature2=data_off[((data_off['Date_received']>='2016-02-01')&(data_off['Date_received']<='2016-05-31')) | ((data_off['Date']>='2016-02-01')&(data_off['Date']<='2016-05-31'))]
feature2.reset_index(drop=True,inplace=True)
database2=data_off[((data_off['Date_received']>='2016-06-01')&(data_off['Date_received']<='2016-06-30')) | ((data_off['Date']>='2016-06-01')&(data_off['Date']<='2016-06-30'))]
database2.reset_index(drop=True,inplace=True)
print(' 2-5月数据总计%i行'%len(feature2))
print(' 6月数据总计%i行'%len(database2))
feature3=data_off[((data_off['Date_received']>='2016-03-01')&(data_off['Date_received']<='2016-06-30')) | ((data_off['Date']>='2016-03-01')&(data_off['Date']<='2016-06-30'))]
feature3.reset_index(drop=True,inplace=True)
database3=off_test
print(' 3-5月数据总计%i行'%len(feature3))
print(' 7月数据总计%i行'%len(database3))

5.3 特征构造-滑窗数据

对每个划分后的数据集分别进行指标提取

5.3.1 用户特征

def user_feature(feature):
    all_users = feature['User_id']
    users = all_users.drop_duplicates()
    # 1.用户消费次数(不对商家去重)
    users_goods = feature[pd.notna(feature.Date)][['User_id','Merchant_id']]
    users_goods['Merchant_id']=1
    users_goods_nums = users_goods.groupby(by = 'User_id').sum('Merchant_id')
    users_goods_nums.columns=['buy_num']
    users = pd.merge(users,users_goods_nums,on='User_id',how = 'left')
    # 2.每个用户的领券次数
    Coupon = feature[pd.notna(feature['Coupon_id'])][['User_id','Coupon_id']]
    Coupon['Coupon_id'] = 1
    Coupon_num = Coupon.groupby(by='User_id').sum('Coupon_id')
    Coupon_num.columns = ['Coupon_get_num']
    users = pd.merge(users,Coupon_num,on='User_id',how='left')
    users['Coupon_get_num']=users['Coupon_get_num'].replace(np.nan,0)
    # 3.用户领券消费次数
    Used_Coupon = feature[(pd.notna(feature['Date']))&(pd.notna(feature['Date_received']))][['User_id','Coupon_id']]
    Used_Coupon['Coupon_id'] = 1
    Used_Coupon_num = Used_Coupon.groupby(by='User_id').sum('Coupon_id')
    Used_Coupon_num.columns = ['Coupon_use_num']
    users = pd.merge(users,Used_Coupon_num,on='User_id',how='left')
    users['Coupon_use_num']=users['Coupon_use_num'].replace(np.nan,0)
    # 4.用户用券购买概率
    users['yqgmgl'] = users['Coupon_use_num']/users['buy_num']
    # 5.用户核销率
    users['Coupon_use_rate'] = users['Coupon_use_num']/users['Coupon_get_num']
    # 6.每个用户15天内核销优惠券的张数
    Used_Coupon = feature[(pd.notna(feature['Date']))&(pd.notna(feature['Date_received']))&(feature['date_interval']<=15)][['User_id','Coupon_id']]
    Used_Coupon['Coupon_id'] = 1
    Used_Coupon_num15 = Used_Coupon.groupby(by='User_id').sum('Coupon_id')
    Used_Coupon_num15.columns = ['Coupon_use_num15']
    users =
  • 11
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
O2O优惠券使用预测数据集 背景描述 随着移动设备的完善和普及,移动互联网+各行各业进入了高速发展阶段,这其中以O2O(Online to Offline)消费最为吸引眼球。 据不完全统计,O2O行业估值上亿的创业公司至少有10家,也不乏百亿巨头的身影。O2O行业天然关联数亿消费者,各类APP每天记录了超过百亿条用户行为和位置记录,因而成为大数据科研和商业化运营的最佳结合点之一。 以优惠券盘活老用户或吸引新客户进店消费是O2O的一种重要营销方式。然而随机投放的优惠券对多数用户造成无意义的干扰。对商家而言,滥发的优惠券可能降低品牌声誉,同时难以估算营销成本。 个性化投放是提高优惠券核销率的重要技术,它可以让具有一定偏好的消费者得到真正的实惠,同时赋予商家更强的营销能力。 本数据集为研究人员提供了O2O场景相关的丰富数据,通过分析建模精准预测用户是否会在规定时间内使用相应优惠券。 数据说明 注意: 为了保护用户和商家的隐私,所有数据均作匿名处理,同时采用了有偏采样和必要过滤。 offline_train.csv | 用户线下消费和优惠券领取行为表 字段 说明 User id 用户ID Merchant id 商户ID Coupon id 优惠券ID:null表示无优惠券消费,此时 Discount_rate 和 Date_received 字段无意义 Discount rate 优惠率:x \in [0,1]代表折扣率;x:y表示满x减y。单位是元 Distance user经常活动的地点离该 merchant 的最近门店距离是 x * 500米(如果是连锁店,则取最近的一家门店),x\in[0,10];null 表示无此信息,0表示低于500米,10表示大于5公里; Date received 领取优惠券日期 Date 消费日期:如果 Date=null & Coupon_id != null,该记录表示领取优惠券但没有使用,即负样本;如果 Date!=null & Coupon_id = null,则表示普通消费日期;如果 Date!=null & Coupon_id != null ,则表示用优惠券消费日期,即正样本; online_train.csv | 用户线上点击/消费和优惠券领取行为表 字段 说明 User_id 用户ID Merchant_id 商户ID Action 0 点击, 1购买,2领取优惠券 Coupon_id 优惠券ID:null表示无优惠券消费,此时 Discount_rate 和 Date_received 字段无意义。“fixed”表示该交易是限时低价活动。 Discount_rate 优惠率:x \in [0,1]代表折扣率;x:y表示满x减y;“fixed”表示低价限时优惠; Date_received 领取优惠券日期 Date 消费日期:如果 Date=null & Coupon_id != null,该记录表示领取优惠券但没有使用,即负样本;如果 Date!=null & Coupon_id = null,则表示普通消费日期;如果 Date!=null & Coupon_id != null,则表示用优惠券消费日期,即正样本; offline_test.csv | 用户O2O线下优惠券使用预测样本 字段 说明 User_id 用户ID Merchant_id 商户ID Coupon_id 优惠券ID Discount_rate 优惠率:x \in [0,1]代表折扣率;x:y表示满x减y. Distance user经常活动的地点离该merchant的最近门店距离是 x * 500米(如果是连锁店,则取最近的一家门店),x\in[0,10];null表示无此信息,0表示低于500米,10表示大于5公里; Date_received 领取优惠券日期 研究人员需要为上述预测预测出15天内用户线下使用优惠券的概率,其中 user_id, coupon_id 和 date_received 均来自上述预测样本, 而 Probability 为预测值。 字段 说明 Coupon_id 优惠券ID Date_received 领取优惠券日期 Probability 15天内用券概率,需预测给出 问题描述 数据提供了用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为,可以预测用户在2016年7月领取优惠券后15天以内的使用情况。
您好!针对O2O优惠券使用预测的问题,您可以考虑使用机器学习算法来进行预测。以下是一个简单的预测流程: 1. 数据收集:收集O2O优惠券使用的历史数据,包括用户的消费行为、领取优惠券的情况以及优惠券的属性等信息。 2. 数据预处理:对收集到的数据进行清洗和处理,包括处理缺失值、异常值和重复值等,同时进行特征工程,从原始数据中提取有用的特征。 3. 特征选择:根据问题的具体情况,选择合适的特征进行建模,可以考虑用户的历史消费情况、优惠券的属性、用户的个人信息等。 4. 模型选择和训练:选择适合的机器学习模型进行训练。常用的模型包括逻辑回归、决策树、随机森林、支持向量机等。可以使用交叉验证等技术来评估模型性能并选择最佳模型。 5. 模型评估和优化:使用测试集对训练好的模型进行评估,评估指标可以包括准确率、召回率、F1值等。如果模型表现不佳,可以考虑调整模型参数或者尝试其他模型。 6. 使用模型进行预测使用训练好的模型对新数据进行预测,可以根据用户的消费行为、优惠券属性等信息,预测用户是否会使用优惠券。 需要注意的是,预测的准确性可能会受到数据质量和特征选择的影响,因此在进行预测之前,确保数据的质量和特征的有效性非常重要。另外,不同业务场景下可能需要调整模型和特征选择的方法,具体情况需要根据实际需求进行调整。希望这些信息对您有所帮助!如果还有其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十二十二呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值