前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hipo Desktop 免费发布
目前先放出Mac版本,其他版本测试后放出,~~待稳定后也会提交到Mac App Store浏览器较多,需要些兼容新的处理,Web版也在后续放出~~
小刀c
2022/08/16
8050
Hipo Desktop 免费发布
Video Ocean V2.0:视频质量全面升级,依旧完全免费,薅羊毛的快乐等你来!
今日,潞晨 Video Ocean V2.0 正式来袭,本次升级不仅在模型、速度、功能玩法上 “大步进化”,还依旧完全免费,等着你来薅羊毛。创新的技术架构和用户导向的视频生成体验为你呈现全新的数字互动世界。
机器之心
2025/02/03
2060
Video Ocean V2.0:视频质量全面升级,依旧完全免费,薅羊毛的快乐等你来!
Swift学习资源
Swift,一种强大的开源编程语言, 让大家都能开发出众的 App。 Swift 是一种强劲而直观的编程语言,它由 Apple 创造,可用来为 iOS、Mac、Apple TV 和 Apple Watch 开发 app。它旨在为开发者提供充分的自由。Swift 易用并且开源,只要有想法,谁都可以创造非凡。 Swift is a high-performance system programming language. It has a clean and modern syntax, of
庞小明
2018/03/09
2.5K0
Swift学习资源
Swift 2.0 简要介绍
看了很多篇介绍 Swift 2.0 的,感觉 Appcoda 这篇介绍的比较清楚,顺手学习并翻译了一下,英文原文看 这里.
用户8710806
2021/06/08
7870
Swift快速入门指南
Apple 开发者在 2014 年发布 Xcode 时,很快就学会了依赖它。我已经提供了关于 Xcode 入门、其安装、通用特性和功能的信息。
云云众生s
2025/03/11
1730
新手必看,史上最全的iOS开发教程集锦,没有之一!
最近大火的iPhone XS Max和iPhone XS,不知道有没有同学已经下手了呢?一万三的价位确实让很多人望而却步啊。据说为了赢得中国的用户,专门出了双卡双待的,可想而知中国市场这块“肥肉”人人都想要。
奔跑的小鹿
2019/01/24
6.1K0
新手必看,史上最全的iOS开发教程集锦,没有之一!
肘子的 Swift 周报 #027 | 苹果助你成为一日“百万富翁”
1976 年 4 月 11 日,苹果公司迈出了重要一步,Steve Wozniak 设计的 Apple I 型电脑问世。尽管仅是一块需要用户自行添加键盘和显示器的电路板,但历史意义却极为重大,这款产品奠定了苹果公司的市场地位。
东坡肘子
2024/04/18
1700
肘子的 Swift 周报 #027 | 苹果助你成为一日“百万富翁”
苹果全新UI框架来了!可视化编程,自动化减少20%代码量
SwiftUI是一个非常方便快速的构建UI的框架,与最新Xcode设计工具无缝协作,可为所有苹果设备构建UI。开发者通过SwiftUI,利用Swift语法就能够完成代码和设计的同步。
CDA数据分析师
2019/06/11
5.5K0
苹果全新UI框架来了!可视化编程,自动化减少20%代码量
Mac效率工具
使用 Mac 开发也有几个年头了,积累了一些效率工具和开发工具,今天整理了一下并分享给大家,工具几乎都是开源免费的,也期待大家有更多好的工具推荐给我,我补充上去。
CoderStar
2022/08/24
2.4K0
Mac效率工具
上架即封神!3.6k Star 的开源游戏模拟器,Delta 冲上 App Store 免费榜
一直以来,苹果设备的应用商店(App Store)都是禁止游戏模拟器上架,所以 iPhone/iPad 用户不能直接安装 GBA、红白机之类的模拟器应用,这也让想在 iPhone 上重温童年游戏机的机友们,十分羡慕 Android 用户。
HelloGitHub
2024/04/25
5500
上架即封神!3.6k Star 的开源游戏模拟器,Delta 冲上 App Store 免费榜
【解放ipad生产力】如何在平板上使用免费IDE工具完成项目开发
很多人应该会像我一样吧,有时候身边没电脑突然要写项目,发现自己的平板没有一点作用,毫无生产力可言,在了解了几家IDE工具后,给大家罗列出来,根据自己的需求进行挑选 现在IDE工具不少,像lightly、cloud stdio 等等……lightly在线版是免费的,现在客户端是需要收费,认证学生后标配版一个月大概是8元左右,比较良心;腾讯推出的功能要齐全一点,但是毕竟刚刚起步,有的东西还是做得不好,我们下面进行比对。
德宏大魔王
2023/08/08
1.5K0
【解放ipad生产力】如何在平板上使用免费IDE工具完成项目开发
一个机械人到半只程序猿的进化之旅
开篇语 好吧,名字是不是很有新意?写出来的刹那我差点在自习室感动到落泪,但是后来想想,好像有点文不对题啊~~但是谁叫这个标题这么帅呢?一向务实的我都忍不住败倒在这么霸气的名字下面,吾神,终光照世人~~~让我来扫盲,给那些迷茫的大学生伙伴们举点例子,然后指引下他们的方向吧! 程序猿的日常自黑 正文 笔者背景交代 我是一名现在在武汉某“职校”--人称“关山口男子职业技术学院”的地方就读的大三学生,本科专业是机械,这算是我们学校最好的专业了。当初高考的时候,为了不浪费自己全省一千多名的分数,经历了
用户1687088
2018/05/07
1.1K0
一个机械人到半只程序猿的进化之旅
六个方向关于iOS100个面试题,你都会了吗?
请概括一下你在构建iOS应用时的测试过程。iOS应用如何实现对其他语言、日期格式以及货币单位的支持?
Kris大鲨
2018/05/08
3.7K5
六个方向关于iOS100个面试题,你都会了吗?
苹果app怎么上架
1、苹果要求版本更新必须使用iOS版本更新内置更新机制。 Design: Preamble Design Preamble Your app includes a responsive version button or alerts the user to update the app. To avoid user confusion, app version updates must utilize the iOS built-in update mechanism. Please see attached screenshots for details. Next Steps To resolve this issue, please remove the responsive version button feature from your app. To distribute a new version of your app, upload the new app binary version into the same iTunes Connect record you created for the app's previous version. Updated versions keep the same Apple ID, iTunes Connect ID (SKU), and bundle ID as the original version, and are available free to customers who purchased a previous version. Resources To create new versions of your app, please review the Create a new version section in iTunes Connect Developer Help. 翻译过来: 设计:序言 设计前言 您的应用程式包含响应式版本按钮,或提醒用户更新应用程式。 为了避免用户混淆,应用版本更新必须利用iOS内置的更新机制。 详情请参阅附录截图。 下一步 要解决此问题,请从应用程序中删除响应式版本按钮功能。 要分发新版本的应用程序,请将新的应用程序二进制版本上传到为应用程序的以前版本创建的iTunes Connect记录中。 更新的版本保持相同的Apple ID,iTunes Connect ID(SKU)和捆绑ID作为原始版本,对于购买以前版本的客户可以免费使用。 资源 要创建新版本的应用程序,请查看iTunes Connect开发人员帮助中的创建新版本部分。 解决办法:我的做法是给审核的时候隐藏检查版本检查更新功能 2、应用程序是专门为iPhone开发的,用户仍然可以在iPad上使用您的应用程序,而且不能影响正常的功能使用 2. 4 Performance: Hardware Compatibility Guideline 2.4.1 - Performance - Hardware Compatibility We noticed that your app did not run at iPhone resolution when reviewed on iPad running iOS 10.3.2. Specifically, the UI in this iPhone app is cut-off and unaccessible via scrolling on iPad. Please see attached screenshots for details. Next Steps To resolve this issue, please revise your app to ensure it runs and displays properly at iPhone resolution on iPad. Even if your app was developed specifically for iPhone, users should still be able to use your app on iPad. Resources For information on iOS device screen sizes and resolutions, please review the iOS Human Interface Guidelines as well as Points versus Pixels in the View Programming Guide for iOS. 翻译结果: 2.4性能:硬件兼容性 准则2.4.1 - 性能 - 硬件兼容性 我们注意到,在运行iOS 10.3.2的iPad上进
iOS程序应用
2023/04/17
4590
苹果app怎么上架
学习苹果iOS手机开发App的准备
学习iOS开发是一个系统性的过程,需要做好多方面的准备,以便能够有效地掌握相关技能。以下是详细的准备步骤:
AntDream
2024/07/22
1640
学习苹果iOS手机开发App的准备
谷歌推出 Kotlin 免费课程,让你轻松入门 Android 开发!
最近,微软推出了一套免费的 Python 在线视频课程,为 Python 初学者提供学习材料。无独有偶,谷歌近日也宣布推出两个 Kotlin 免费在线课程,正如苹果将 iOS 开发人员从 Objective-C 转移到 Swift,谷歌也在将 Android 开发者从 Java 转移到 Kotlin。
GitHubDaily
2019/09/29
1.6K0
谷歌推出 Kotlin 免费课程,让你轻松入门 Android 开发!
Swift 中的热重载
这一年是2040年,我们最新的 MacBook M30X 处理器可以感知到瞬间编译大型 Swift 项目,听起来很神奇,对吧?除此之外,编译代码库只是我们迭代周期的一部分。包括:
Swift社区
2022/07/05
2.1K0
Swift 中的热重载
Swift 语言:现代高性能系统编程 | 开源日报 No.292
ckeditor5 是一个功能强大的富文本编辑器框架,具有模块化架构、现代集成和协同编辑等特性。
小柒
2024/07/10
1110
Swift 语言:现代高性能系统编程 | 开源日报 No.292
用 SwiftUI 实现一个开源的 App Store
App Store 一直以来都是 iPhone 生态的最重要一环,在初代 iPhone 商店,因为 App 比较少,当时就有 Top 25 榜单:
Swift社区
2022/02/09
1.9K0
用 SwiftUI 实现一个开源的 App Store
2020 年,苹果的 AI 还有创新吗?
2020 年,移动设备上的机器学习将不再是什么热门的新事物。在移动应用中添加某种智能已经成为一种标准做法。
深度学习与Python
2020/08/07
1.2K0
推荐阅读
相关推荐
Hipo Desktop 免费发布
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验