• 数据来源:天池大赛数据集:天池新人实战赛o2o优惠券使用预测;数据链接: https://tianchi.aliyun.com/competition/entrance/231593/introduction?spm=5176.12281925.0.0.6c917137mTMSDc.
  • 分析过程为:
  1. 数据规整处理
  2. 数据分析

准备工作

  • 首先导入包和数据。然后查看数据的整体信息,观察以下结果
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns  # 绘图模块,基于matplotlib可视化的python包,不能完全替代matplotlib,只是对mpl进行升级
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示符号# parse_dates:将指定的列加载成日期的格式
offline = pd.read_csv('D:\Download\Microsoft Edge\数据分析实战项目资料\O2O\资料\ccf_offline_stage1_train.csv', parse_dates=['Date_received', 'Date'])
print(offline.info())  # 175+万条数据
print(offline.head(10))  # NaT:时间日期格式的空值
  • 输出结果为:


    结果运行出来后,进行数据清洗。

数据规整

  • 分析:判断每一列当中有多少个空值,优惠券id,折扣率,领券日期,三者可能存在同时==null的情况
  • Discount_rate列中的满减政策转换成折扣率
  1. 先填充空值
  2. 200:20替换成比例,计算折扣率
offline['Discount_rate'] = offline['Discount_rate'].fillna('null')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.NaNelse:return float(s)# map对这个变量数据里的每一个值都进行同一种操作
offline['Discount_rate'] = offline['Discount_rate'].map(discount_rate_opt)
print(offline['Discount_rate'].head())

结果:

  • 分析:Coupon_id字段:null代表无优惠券,此时Discount_rateDate_received字段无意义。检查Coupon_idDiscount_rateDate_received判断空值和非空值是否一一对应。np.all():判断一个课迭代数据中是否都为True,如果是返回True,否则返回False
nan1 = offline['Coupon_id'].isnull()  #判断优惠券是否为空
nan2 = offline['Date_received'].isnull()   #判断领券日期是否为空
print(np.all(nan1 == nan2))
nan3 = offline['Discount_rate'].isnull()   #判断折扣率是否为空
print(np.all(nan1 == nan3))

分析:如果结果=true,说明之前的猜测:Coupon_idDate_received空值与非空值是一一对应的关系;如果结果=true,说明之前的猜测:Coupon_idDiscount_rate空值与非空值是一一对应的关系
结果:

  • 进一步将消费者分成四类
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()]
print('有优惠券未消费:{}'.format(len(cpon_no_consume)))
print('无优惠券未消费:{}'.format(len(no_cpon_no_consume)))
print('无优惠券有消费:{}'.format(len(no_cpon_consume)))
print('有优惠券有消费:{}'.format(len(cpon_consume)))

结果:

分析:用优惠券消费的有7w,相比其他用户来说,占比较少

数据分析

  1. 分析店面流量是否火爆的影响因素
  • 绘制饼图占比:先要得到df类型的数据,再将消费方式绘制成饼图
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)
print(consume_status)
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.02],  # 各个参数间隔出来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('')  # 取去掉None
ax.set_title('消费的占比情况')  # 加标题
plt.legend(labels=['有优惠券未消费', '无优惠券有消费', '有优惠券有消费'])  # 加图例
plt.show()

结果:

分析:有优惠券未消费占比55.7%最大,说明大多数人拿完券之后,尚未使用;无优惠券有消费用户占比40%,说明很多人没有使用优惠券,可能优惠券的吸引力不大,客户没在意;可能新用户比较多优惠券有消费用户占比较小4.3%,说明我们的优惠券使用率不高,可以考虑是不是加大优惠券力度

  1. 分析顾客的消费习惯
  • 在有券消费人群中,分析距离和优惠折扣;计算各个商家对应的顾客到店平均距离
Merchant_distance = cpon_consume.groupby('Merchant_id')['Distance'].mean()
print(Merchant_distance[Merchant_distance == 0])
# 距离值乘以500

结果:

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

  • 各商家对应的顾客到店消费平均折扣力度
erchant_distance_rate = cpon_consume.groupby('Merchant_id')['Discount_rate'].mean()
print(Merchant_distance_rate.sort_values())
Merchant_distance_rate.hist()  # 绘制直方图,看折扣力度所在范围
print(Merchant_distance_rate.mean())
plt.show()

结果:
分析:大部分商家的折扣集中到0.8~1.0之间,所有商家平均折扣的平均值:0.88,折扣力度不是很大

  • 持券到店消费人数最多的商家:对商家进行分组,取出用户id,对用户id进行去重统计数量
popular_merchant = cpon_consume.groupby('Merchant_id')['User_id'].apply(lambda x: len(x.unique())).sort_values(ascending=False)
popular_merchant500 = popular_merchant[popular_merchant > 500]  # 找出持券消费人数>500的商家id
popular_merchant500.name = 'customer_count'  # 指定列明为消费者数量(持券消费者)
print(len(popular_merchant500))
print(popular_merchant500)

结果:

分析:共有16家店铺,持券消费人数在500人以上;持券消费人数最多的商家是5341,持券消费人数在2800;排名最后的商家,持券消费人数是559人;这批商家对优惠券的使用方法得当,消费者喜欢使用优惠券进行消费,可以适当借鉴这批商家的推广力度

  • 持券消费人数在500人以上的商家,链接顾客到店平均距离和平均折扣力度
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_distance_rate,on='Merchant_id', how='inner')
print(merchant_pop_dis_rate)

结果:

  • 计算到店消费人数和平均距离和折扣力度的相关系数:corr(correlation:相关系数),用来计算df数据中列与列的相关性(皮尔逊相关系数)取值范围[-1,1]之间;1:完全正相关,-1:完全负相关;绝对值越大,相关性越大,反之成立;正相关:随着变量的增大而增大,反之同理;负相关:随着变量的增大而减小,反之同理;持券消费人数与距离和折扣率都呈现负相关,属于生活中的正常现象
# 用热力图展示相关系数(data:相关系数,annot:显示相关系数的值,cmap:颜色范围,vmax:最大值,vmin:最小值)
sns.heatmap(data=merchant_pop_dis_rate.corr(), annot=True, cmap='RdPu', vmax=1, vmin=-1)
plt.show()

结果:

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

  1. 分析投放的优惠券的使用情况
  • 分析每天优惠券的总体发放量与使用量情况:业务分析:日期(优惠券的发放日期Date_received,使用日期Date)用作图标的x
  • 需要统计每天优惠券发放数量和使用数量,取出存在消费日期的记录,进行升序,再去重;取出存在领券日期的记录,进行升序,再去重
print('消费数量 %d' % offline['Date'].notnull().sum())
print('发送优惠券', offline['Date_received'].notnull().sum())
date_sort = offline[offline['Date'].notnull()]['Date'].sort_values().unique()
print(date_sort[:5])
date_received_sort = offline[offline['Date_received'].notnull()]['Date_received'].sort_values().unique()
print(date_sort[:5])

结果:

  • 绘制每天的发券量和用券量
# 每天优惠券的使用量(即持券消费人数)
consume_num_everyday = cpon_consume[['User_id', 'Date_received']]
consume_num_everyday = consume_num_everyday.groupby('Date_received').count()
consume_num_everyday = consume_num_everyday.rename(columns={'User_id': 'count'})
# 每天发放的优惠券数量(取出所有领券日期!=null的数据,在进行天数分组,计数就可以)
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'})
# 绘制每天的发券量和用券量
plt.figure(figsize=(18, 6))
plt.bar(x=date_received_sort, height=coupon_sendout_everyday['count'], label='每天发券量')
plt.bar(x=date_received_sort, height=consume_num_everyday['count'], label='每天用券量')
# 对y轴进行对数缩放--量级相差比较多
plt.yscale('log')
plt.legend()
plt.show()

结果:

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

  • 计算每天优惠券与发券量占比
plt.figure(figsize=(18, 6))
plt.bar(x=date_received_sort, height=consume_num_everyday['count']/coupon_sendout_everyday['count'], label='百分比')
plt.legend()
plt.show()

结果:

分析:由图可知,优惠券使用率最高在16年3月底,达到了30%;使用率最低在16年1月底,最低为3%左右;整体来看,优惠券使用率波动较大。结合生活可以发现,优惠券投放与使用是否有三波小高峰?分别是元旦三八六一八活动左右,而且优惠券的使用力度也与这个时间段相关。

总结

  1. 有优惠券未消费占比55.7%最大,说明大多数人拿完券之后,尚未使用;无优惠券有消费用户占比40%,说明很多人没有使用优惠券,可能优惠券的吸引力不大,客户没在意;可能新用户比较多优惠券有消费用户占比较小4.3%,说明我们的优惠券使用率不高,可以考虑是不是加大优惠券力度
  2. 有些店家生意之所以火爆,应该是物美价廉导致,与距离和优惠力度相关性不大
  3. 优惠券使用率最高在16年3月底,达到了30%;使用率最低在16年1月底,最低为3%左右;整体来看,优惠券使用率波动较大。优惠券投放与使用有三波小高峰,分别是元旦三八六一八活动左右,而且优惠券的使用力度也与这个时间段相关。

python项目--O2O优惠券线下使用情况数据分析相关推荐

  1. O2O模式成功的原因是什么 O2O对线下连锁的重要意义是什么?

    随着互联网的不断发展,电商企业成为现在商业模式的主力军,而电商所依靠的就是商城平台系统,自行开发和入驻更好的平台商城系统是常见的模式,不管O2O商业模式,还是哪种模式,想要得到更好的使用效果,就必须要 ...

  2. Python项目实战:数据可视化与股票数据分析-关东升-专题视频课程

    Python项目实战:数据可视化与股票数据分析-333人已学习 课程介绍         本视频内容包括使用Matplotlib绘制图表.MySQL数据库.Python访问数据库和Lambda表达式. ...

  3. O2O优惠券发放与使用情况分析

    一. 项目背景 随着互联网+行业的趋势不断加快,各行各业逐渐通过线上(online)与线下(offline)结合的方式来扩大营销面.与此同时,消费者也越来越愿意为便利以及更多更优的选择买单,也就促进了 ...

  4. 【Python】红旗超市线下缴电费用户数据分析及可视化(pandas+pyecharts)

    场景分析: 一部分用户习惯在红旗超市线下进行缴电费,电力公司希望了解哪些用户喜欢到线下缴费,具体分布在哪里,才能有针对性地宣传掌上电力app引导用户体验更高效的线上缴费方式,提升用户满意度. 需求分析 ...

  5. window部署python项目_Django在Window下的部署

    转载 : codingsoho.com 前言 本文主要介绍利用apache去部署Django项目,所有步骤均在本机Window7和阿里云验证通过. 配置 本例的基本配置如下: 工作目录: C:/vir ...

  6. O2O优惠券使用预测项目总结

    O2O优惠券使用预测笔记 前言 项目介绍 数据 评价方式 赛题分析 基本思路 数据集划分 特征工程 模型选取 过程及代码 导入python库 导入与划分数据集 特征工程 模型训练与调参 预测测试集 总 ...

  7. python线下培训-天津python培训,0基础学python线上还是线下好?

    0基础开始选择学习python的时候就注定要纠结于学习方式是线上学习好呢还是线下学习好呢?其实两者都各有各的优势,线上课程便宜,时间自由灵活,不过需要我们强大的自学能力以及自控能力:线下的话学习氛围. ...

  8. 线上学python哪家好-Python线上和线下培训哪个好?老男孩Python

    学习Python对于很多人来说都是非常不错的选择,也是最合适的选择.想必不少人都知道,学习Python分为线上和线下两种模式,那么这两种模式有什么区别呢?我们简单的了解一下. 先来为大家介绍一下线上培 ...

  9. o2o的关健在于线下!

    其实,说到底,O2O不是那么简单的. 一堆空降兵和一群自以为是的风投都把所有的线下产业想简单了.没有真正的去了解和体验这个产业,就动不动一个小点子,创新一个小平台就妄想能改变或替代中国某某产业.看看这 ...

最新文章

  1. CTP综合交易平台-开发后感
  2. Python极简入门:数据类型、条件语句、循环语句、异常处理
  3. 智能文案app_智能营销,用实力说话!按效果付费!
  4. GridView隐藏列, 并能读取列值的解决方法(转载)
  5. 分布式ID-数据库多主模式
  6. Msc系统上的eclipse遇到乱码问题解决方式
  7. redis笔记——redis事务及锁应用
  8. java int 128 ==_为什么 Java Integer 中“128==128”为false,而”100==100“为true?
  9. 让你事半功倍的小众 Python库
  10. HTML 事件响应函数,HTML5: 事件处理函数的this指向问题
  11. python糖尿病数据挖掘
  12. 三、EasyExcel实现数据填充
  13. 压缩文件并删除源文件
  14. 趣味测试类微信小程序
  15. elasticsearch 安装拼音分词
  16. Axure 8.1.0.3377 注册码激活
  17. 【Java基础】使用swing对话框编写一个程序:输入长和宽,计算矩形的周长和面积
  18. HBase Scan命令详解
  19. Whale帷幄 - 餐厅数字化运营 餐饮 智慧门店
  20. 曙光服务器制作raid文档,曙光服务器制作RAID.docx

热门文章

  1. 数学之路(4)-数学基础-幂函数图像与函数平移
  2. js时间戳转时间(年-月-日 时:分:秒)
  3. 日志20130104~0308
  4. Hi3518E音频部分设计
  5. 正确计算linux系统内存使用率
  6. [Matlab]篇----回归分析Matlab命令(regress篇)
  7. 数据挖掘面试题(1)
  8. 【粤教版必修一《数据与计算》】知识总结
  9. 智利银行在勒索软件攻击后关闭了所有分行
  10. 用python绘制玫瑰花的代码_Python 玫瑰花绘制