前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python实战项目——O2O_优惠券使用情况分析(五)

Python实战项目——O2O_优惠券使用情况分析(五)

作者头像
老虎也淘气
发布于 2024-01-30 06:58:52
发布于 2024-01-30 06:58:52
50200
代码可运行
举报
文章被收录于专栏:Data分析Data分析
运行总次数:0
代码可运行

O2O优惠券线下使用情况数据分析

一 项目简介

随着移动设备的完善和普及,移动互联网+各行各业进入了高速发展阶段,这其中以O2O(Online to Offline)消费最为吸引眼球。据不完全统计,O2O行业估值上亿的创业公司至少有10家,也不乏百亿巨头的身影。O2O行业关联数亿消费者,各类APP每天记录了超过百亿条用户行为和位置记录,因而成为大数据科研和商业化运营的最佳结合点之一。 以优惠券盘活老用户或吸引新客户进店消费是O2O的一种重要营销方式。然而随机投放的优惠券对多数用户造成无意义的干扰。对商家而言,滥发的优惠券可能降低品牌声誉,同时难以估算营销成本。个性化投放是提高优惠券核销率的重要技术,它可以让具有一定偏好的消费者得到真正的实惠,同时赋予商家更强的营销能力。

二 分析目标

  1. 分析店面客流量是否火爆的影响因素
  2. 分析顾客的消费习惯
  3. 分析投放的优惠券的使用情况

三 数据来源

本数据提供用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为。

四 数据分析

本次分析仅使用线下交易数据
1 字段表:
线下消费情况表(ccf_offline_stage1_train.csv):

Field

Description

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,则表示用优惠券消费日期,即正样本;

加载库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns  #绘图模块,基于matplotlib的可视化python包,不能完全替代matplotlib,只是对matplotlib进行升级
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
%matplotlib inline

#pip install seaborn

1.加载数据

#parse_dates:将指定的列加载成日期的格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
offline = pd.read_csv('ccf_offline_stage1_train.csv',parse_dates=['Date_received','Date'])
offline.info()  #175+万条数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
offline.head(10)  

NaT:时间日期格式的空值

2.数据的规整

判断每一列当中有多少个空值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
offline.isnull().sum()

优惠券id,折扣率,领券日期,三者可能存在同时==null的情况

2.1把“Discount_rate”列中的满减政策转换成折扣率

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
offline['Discount_rate'] = offline['Discount_rate'].fillna('null')
offline.head()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def discount_rate_opt(s): #s代表每一个元素
    if ':' in s:
        split = s.split(':')
        discount_rate = (int(split[0]) - int(split[1]))/int(split[0])
        return round(discount_rate,2)  #折扣率保留两位小数
    elif s == 'null':
        return np.NaN
    else:
        return float(s)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
offline['Discount_rate']  = offline['Discount_rate'].map(discount_rate_opt)
offline.head()

2.2 Coupon_id字段:null代表无优惠券,此时Discount_rate与Date_received字段无意义

检查Coupon_id和Discount_rate与Date_received判断空值和非空值是否一一对应。

np.all():判断一个课迭代数据中是否都为True,如果是返回True,否则返回False

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.all([True,False,True])

2.3

如果Date=null & Coupon_id!=null,有券未消费(cpon_no_consume) 如果Date=null & Coupon_id =null,无券未消费(no_cpon_no_consume) 如果Date!=null & Coupon_id=null,无券消费(no_cpon_consume) 如果Date!=null & Coupon_id!=null,有券消费(cpon_consume)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cpon_no_consume = offline[(offline['Date'].isnull() & offline['Coupon_id'].notnull())]
no_cpon_no_consume = offline[(offline['Date'].isnull() & offline['Coupon_id'].isnull())]
no_cpon_consume = offline[(offline['Date'].notnull() & offline['Coupon_id'].isnull())]
cpon_consume = offline[(offline['Date'].notnull() & offline['Coupon_id'].notnull())]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('有券未消费:{}'.format(len(cpon_no_consume)))
print('无券未消费:{}'.format(len(no_cpon_no_consume)))  #无意义,不需分析
print('无券消费:{}'.format(len(no_cpon_consume)))
print('有券消费:{}'.format(len(cpon_consume)))

用优惠券消费的用7万,相比其他用户来说,占比较少

3.数据分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#绘制饼图占比
consume_status_dict = {'cpon_no_consume':len(cpon_no_consume),'no_cpon_consume':len(no_cpon_consume),'cpon_consume':len(cpon_consume)}
consume_status = pd.Series(consume_status_dict)
consume_status
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#消费方式构成的饼图(figure:看作是一张画布,axes:代表画布内的多个坐标系)
fig,ax=plt.subplots(1,1,figsize=(8,10))
consume_status.plot.pie(ax = ax,
                       autopct='%1.1f%%',
                       shadow=True,
                        explode=[0.02,0.05,0.2],
                        textprops={'fontsize':15,'color':'blue'},
                        wedgeprops={'linewidth':1,'edgecolor':'black'},
                        labels=['有券未消费 \n ({})'.format(len(cpon_no_consume)),
                                '无券消费 \n ({})'.format(len(no_cpon_consume)),
                               '用券消费 \n ({})'.format(len(cpon_consume))
                               ]
                       )
ax.set_ylabel('')  #去除ylable
ax.set_title('消费占比情况')
plt.legend(labels=['有券未消费','无券消费','用券消费'])
  • 有券未消费占比55.7%最大,说明大多数人拿完券之后,尚未使用
  • 无圈消费用户占比40%,说明很多人没有使用优惠券,可能优惠券的吸引力不大,客户没在意;可能,新用户比较多。
  • 用券消费用户占比较小4.3%,说明我们的优惠券使用率不高。可以考虑是不是加大优惠券力度…

3.1在有券消费人群中,分析距离和优惠折扣

各商家对应的顾客到店平均距离

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Merchant_distance = cpon_consume.groupby('Merchant_id')['Distance'].mean()
Merchant_distance[Merchant_distance==0]

有4076个商家,有1431个商家的用券消费用户平均范围在500米以内

各商家对应的顾客到店消费平均折扣力度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Merchant_discount_rate = cpon_consume.groupby('Merchant_id')['Discount_rate'].mean()
Merchant_discount_rate.sort_values()
Merchant_discount_rate.hist()
Merchant_discount_rate.mean()  #所有商家平均折扣的平均值:0.88
Merchant_discount_rate

3.2持券到店消费人数最多的商家

对商家进行分组,取出用户id,对用户id进行去重统计数量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
popular_merchant = cpon_consume.groupby('Merchant_id')['User_id'].apply(lambda x:len(x.unique())).sort_values(ascending=False)
#找出持券消费人数>500的商家id
popular_merchant500 = popular_merchant[popular_merchant>500]
popular_merchant500.name = 'customer_count'  #指定列名为消费者数量(持券消费者)
print(len(popular_merchant500))
print(popular_merchant500)
  • 共有16家店铺,持券消费人数在500人以上
  • 持券消费人数最多商家是5341,持券消费人数在2800
  • 排名最后的商家,持券消费人数未559人
  • 这批商家对优惠券的使用方法得当,消费者喜欢用优惠券进行消费,可以适当借鉴这批商家的推广力度

3.3持券消费人数在500人以上的商家,连接顾客到店平均距离和平均折扣力度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
merchant_pop_dis = pd.merge(left=popular_merchant500,right=Merchant_distance,on='Merchant_id',how='inner')
merchant_pop_dis_rate = pd.merge(left=merchant_pop_dis,right=Merchant_discount_rate,on='Merchant_id',how='inner')
merchant_pop_dis_rate

3.4计算到店消费人数与平均距离和折扣力度的相关系数

  • corr(correlation:相关系数),用来计算df数据中列与列的相关性(皮尔逊相关系数),取值范围[-1,1]之间
  • 1:完全正相关,-1:完全负相关
  • 绝对值越大:相关性越大,反之成立
  • 正相关:随着变量的增大,而增大,反之同理
  • 负相关:随着变量的增大,而减小,反之同理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
merchant_pop_dis_rate.corr()

持券消费人数,与距离和折扣率都呈现出负相关,属于生活中的正常现象

用热力图展示相关系数(data:相关系数,annot:显示相关系数值,cmap:颜色范围,vmax:最大值,vmin:最小值)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sns.heatmap(data=merchant_pop_dis_rate.corr(),annot=True,cmap='Accent',vmax=1,vmin=-1)

由图可知:

  1. 到店消费人数的多少与顾客到店铺的距离之间呈现负相关,相关系数0.31,在0.3~0.5之间,为低度相关
  2. 到店消费人数的多少与优惠打折力度呈现负相关,相关系数0.2,在0~0.3之间,为相关程度极弱 综上所述,这些店家之所以火爆,应该是物美价廉导致,与距离和优惠力度相关性不大

4.1分析每天中优惠券的总体发放量与使用量情况

  • 业务分析:日期(优惠券的发放日期Date_received,使用日期date)用作图表的x轴
  • 需要统计每天优惠券发放数量和使用数量

每天优惠券的使用量(即持券消费人群)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
consume_num_everday =  cpon_consume[['User_id','Date_received']]
consume_num_everday = consume_num_everday.groupby('Date_received').count()
consume_num_everday = consume_num_everday.rename(columns={'User_id':'count'})
consume_num_everday

每天发放的优惠券数量(取出所有领券日期!=null的数据,在进行按天分组,计数就可以)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
coupon_sendout_everyday = offline[offline['Date_received'].notnull()][['Date_received','User_id']]
coupon_sendout_everyday = coupon_sendout_everyday.groupby('Date_received').count()
coupon_sendout_everyday = coupon_sendout_everyday.rename(columns={'User_id':'count'})
coupon_sendout_everyday

绘制每天发券量和每天用券量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.figure(figsize=(18,6))
# plt.bar(x=date_receive_sort,height=coupon_sendout_everyday['count'],label='每天发券量')
plt.bar(x=date_sort,height=consume_num_everday['count'],label='每天用券量')
plt.yscale('log')  #对y轴进行对数缩放
plt.legend()

16年2月为例,用券量级别再1000,发券量再10万左右,在100倍左右,优惠券的使用率还是非常低的

计算每天的优惠券与发券量占比

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.figure(figsize=(18,6))
plt.bar(x=date_receive_sort,height=consume_num_everday['count']/coupon_sendout_everyday['count'],
       label='百分比')
plt.legend()
  • 由图可知,优惠券使用率最高在16年3月底,达到了30%
  • 使用率最低在16年1月底,最低为3%左右。
  • 整体来看,优惠券使用率波动较大。

五 结论

  1. 顾客光顾最多的比较火爆的店面,并不受距离和打折力度影响,应该是商品品质或消费体验等水平较高所致
  2. 各店家发放的优惠券,被使用总数和发放总数的比例不到一成,所以随机发放优惠券的效果并不理想,有很大的优化空间
  3. 个性化投放是提高优惠券核销率的重要技术,它可以让具有一定偏好的消费者得到真正的实惠,通过分析发现,属于’shopping_mania’这个集合的1万4千多名消费者对于优惠券比较依赖,可以成为个性化发放的重点对象
  4. 更进一步有针对性的个性化投放可以通过机器学习建模来拟合顾客的消费习惯,从而更精确的挖掘优惠券的适用对象
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
阿里大数据竞赛第一名大神github源代码分享(O2O优惠券使用预测)
队伍简介 队伍名 “诗人都藏在水底”,三位队员分别是来自北大的wepon和charles,来自中科大的云泛天音 赛题介绍 本赛题提供用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为,预测用户在2016年7月领取优惠券后15天以内是否核销。评测指标采用AUC,先对每个优惠券单独计算核销预测的AUC值,再对所有优惠券的AUC值求平均作为最终的评价标准。 解决方案 本赛题提供了用户线下消费和优惠券领取核销行为的纪录表,用户线上点击/消费和优惠券领取核销行为的纪录表,记录的时间区间是2
机器学习AI算法工程
2018/03/15
1.9K0
阿里大数据竞赛第一名大神github源代码分享(O2O优惠券使用预测)
天池 O2O 优惠券使用预测思路解析与代码实战
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/red_stone1/article/details/83859845
红色石头
2019/05/25
5K0
MySQL数据库基础练习系列45、优惠券发放系统
很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。
红目香薰
2024/06/16
1630
MySQL数据库基础练习系列45、优惠券发放系统
大厂的优惠券系统是如何设计的?
如商家创建了一批优惠券,共1000张,使用时间为2022-11-11 00:00:00 ~ 2022-11-11 23:59:59,规定只有数码类目商品才能使用,满100减50。
JavaEdge
2022/05/10
9K2
大厂的优惠券系统是如何设计的?
电商优惠券simple
create table t_coupon ( coupon_id int null comment '券ID,主键',
用户7635214
2022/08/20
4380
根据自己的业务需求,用PHP做一个优惠券活动
优惠券活动,具体还是要根据自己的需求。以下是最近实现的优惠券活动,主要的业务需求:根据后端设置优惠券模板,用户类型设置,优惠券活动的开始与结束时间,最后生成不同的优惠券活动链接。
golang开发者
2019/07/07
8260
根据自己的业务需求,用PHP做一个优惠券活动
优惠券微服务开发(2)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】
第十三章 电商优惠券微服务业务介绍和模块开发 第1集 互联网公司中优惠券微服务业务介绍和效果体验 简介:介绍常见的优惠券业务和课程案例效果体验 互联网企业最重要的是拉新业务,产品经理 自然诞生了很多玩法 砍价 拼团 裂变 优惠券 电商优惠券逻辑,优惠券的玩法很多,主要讲一下比较常见的优惠券 获取方式维度 被动:新人优惠券 无门槛现金劵 …其他 第一次登录注册某平台,登录成功后进入到首个页面弹出新人红包或者某固定位置领取新人红包,前端领取位置及细节不做详细讲解,根据实际业务场景而定 主动:领取优惠券
高大北
2022/09/16
1.1K0
优惠券微服务开发(2)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】
公司新来一个同事,把优惠券系统设计的炉火纯青!
如:A优惠券一共发行120张,每一个用户可以领取140张,当一个用户领取优惠券成功的时候,把领取的记录写入到另外一个表中(这张表我们暂且称为表B)
Java团长
2022/12/20
1.6K1
公司新来一个同事,把优惠券系统设计的炉火纯青!
活动、节假日、促销等营销方式的因果效应评估——特征工程篇(一)
本系列旨在挖掘活动、节假日、促销、优惠券、积分等营销权益因果效应评估,目前规划两个篇幅:
悟乙己
2022/05/11
3.8K0
活动、节假日、促销等营销方式的因果效应评估——特征工程篇(一)
MySQL数据库基础练习系列5、会员管理系统
很多学生或者说是初学者在学习完成数据库的基础增删改查后就自认为在数据库这里就很熟悉了,但是不接触项目根本部知道需求,我这里准备了50个项目的基本需求来让大家来熟练各类项目的列信息,让大家更好的深入项目进行实战式的练习,可以让大家在后面面试的时候有更多更丰富的资历让大家可以与面试官侃侃而谈。
红目香薰
2024/06/07
1170
E-commerce 中促销系统的设计
在电商平台中,促销是必不可少的营销手段,尤其在国内 各种玩法层出不穷,最开始的满减/秒杀 到优惠卷 再到 拼团/砍价等等
全栈程序员站长
2022/07/08
3.6K0
E-commerce 中促销系统的设计
电商管理系统的数据库设计思路和数据库代码
实现用户注册、登录和个人信息管理功能,并对不同用户类型(普通用户、商家、管理员)进行权限管理。
GeekLiHua
2025/01/21
520
RocketMQ实战—10.营销系统代码优化二
首先营销系统对全量用户发放优惠券的任务进行分片,然后将分片的消息发送到如下Topic。
东阳马生架构
2025/04/18
580
day100-Exception继承定义错误信息&结算接口&结算数据结构
1.Exception的继承 # 自定义继承类继承 Exception class MyException(Exception): def __init__(self, code, msg): self.code = code self.msg = msg # 自定义相应信息 class BaseResponse: def __init__(self): self.code = '' self.error = ''
少年包青菜
2020/03/26
7010
机器学习中的分类:决策树、随机森林及其应用
今日推荐:数学的算法代码如何实现:神奇的斐波那契数列(Fibonacci sequence)
小馒头学Python
2024/11/16
2140
机器学习中的分类:决策树、随机森林及其应用
常用23种设计模式Java经典实现(使用常用电商业务订单、购物车,商户,支付,优惠券为例)
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
jack.yang
2025/04/05
1170
独家揭秘:小程序如何借势热门营销玩法,流量订单双丰收
嘿,各位小伙伴们!在如今这个互联网飞速发展的时代,小程序就像是一颗璀璨的新星,在商业的天空中闪耀着独特的光芒。它轻巧便捷,无需下载安装,用户轻轻一点就能快速使用,简直就是 “互联网界的小精灵”。但是呢,在这竞争激烈的小程序世界里,想要脱颖而出,实现流量订单双丰收,可不是一件容易的事儿哦。别着急,今天小编就来给大家独家揭秘,小程序如何巧妙借势热门营销玩法,走上人生巅峰!
小白的大数据之旅
2025/03/19
860
数据分析与数据挖掘 - 02基础操练
在这一章我们将使用基础的Python库pandas,numpy,matplotlib来完成一个数据分析的小项目,推荐使用Anaconda环境下的jupter-notebook来进行练习。
马一特
2020/09/08
7350
订单服务以及优惠券服务及rabbitmq(7)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】
第二十七章 新版消息队列RabbitMQ回顾和容器化安装部署 第1集 基于Linux服务器安装RabbitMQ容器化部署 简介:Docker安装RabbitMQ消息队列 阿里云安装RabbitMQ 最少 2核4g或者推荐 2核8g(用家人账号购买,接近1折,初次买1年或者3年) 登录个人的Linux服务器 ssh root@8.129.113.233 Docker安装RabbitMQ 地址:https://hub.docker.com/_/rabbitmq/ #拉取镜像 docker pull ra
高大北
2022/09/16
1.6K0
订单服务以及优惠券服务及rabbitmq(7)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】
RocketMQ实战—9.营销系统代码初版
接下来实现营销系统四大促销场景的代码初版:全量用户推送促销活动、全量用户发放优惠券、特定用户推送领取优惠券消息、热门商品定时推送
东阳马生架构
2025/04/17
360
推荐阅读
阿里大数据竞赛第一名大神github源代码分享(O2O优惠券使用预测)
1.9K0
天池 O2O 优惠券使用预测思路解析与代码实战
5K0
MySQL数据库基础练习系列45、优惠券发放系统
1630
大厂的优惠券系统是如何设计的?
9K2
电商优惠券simple
4380
根据自己的业务需求,用PHP做一个优惠券活动
8260
优惠券微服务开发(2)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】
1.1K0
公司新来一个同事,把优惠券系统设计的炉火纯青!
1.6K1
活动、节假日、促销等营销方式的因果效应评估——特征工程篇(一)
3.8K0
MySQL数据库基础练习系列5、会员管理系统
1170
E-commerce 中促销系统的设计
3.6K0
电商管理系统的数据库设计思路和数据库代码
520
RocketMQ实战—10.营销系统代码优化二
580
day100-Exception继承定义错误信息&结算接口&结算数据结构
7010
机器学习中的分类:决策树、随机森林及其应用
2140
常用23种设计模式Java经典实现(使用常用电商业务订单、购物车,商户,支付,优惠券为例)
1170
独家揭秘:小程序如何借势热门营销玩法,流量订单双丰收
860
数据分析与数据挖掘 - 02基础操练
7350
订单服务以及优惠券服务及rabbitmq(7)-1024电商平台项目技术选择和创 建聚合工程项目【工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战】
1.6K0
RocketMQ实战—9.营销系统代码初版
360
相关推荐
阿里大数据竞赛第一名大神github源代码分享(O2O优惠券使用预测)
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验