数据分析:某电商优惠卷数据分析

news/2024/9/21 8:48:59/

数据分析:某电商优惠卷数据分析

作者:AOAIYI
专栏:python数据分析

作者简介:Python领域新星作者、多项比赛获奖者:AOAIYI首页

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


文章目录

  • 数据分析:某电商优惠卷数据分析
  • 一、实验目的
  • 二、加载数据
  • 三、数据规整
  • 四、数据分析
  • 五、分析每天中优惠券的总体发放量与使用量情况


一、实验目的

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

二、加载数据

1.导入所需的模块

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

2.导入数据

offline = pd.read_csv(r"C:\Users\XWJ\Desktop\ccf_offline_stage1_train.csv",parse_dates=['Date_received','Date'])
offline.head(10)

在这里插入图片描述

parse_dates:将指定的列加载成日期的格式
NaT:时间日期格式的空值

3.使用函数info():数据表的基本信息(维度,列名称,数据格式,所占空间等)

offline.info()

在这里插入图片描述

三、数据规整

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

offline.isnull().sum()

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

offline['Discount_rate'] = offline['Discount_rate'].fillna('null')
offline.head()

在这里插入图片描述

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)
offline['Discount_rate']  = offline['Discount_rate'].map(discount_rate_opt)
offline.head()

在这里插入图片描述

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

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

np.all([True,False,True])

在这里插入图片描述

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

判断优惠卷是否为空以及领券日期是否为空

nan1 = offline['Coupon_id'].isnull()  
nan2 = offline['Date_received'].isnull() 
np.all(nan1 == nan2)

在这里插入图片描述

结果=true,说明之前的猜测:Coupon_id与Date_received空值与非空值是一一对应的关系

nan3 = offline['Discount_rate'].isnull()
np.all(nan1 == nan3)

在这里插入图片描述

结果=true,说明之前的猜测:Coupon_id与Discount_rate空值与非空值是一一对应的关系

4.如果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)

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)))

在这里插入图片描述

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

四、数据分析

1.绘制饼图占比

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

在这里插入图片描述

2.绘制消费方式构成的饼图

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.在有券消费人群中,分析距离和优惠折扣

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

Merchant_distance = cpon_consume.groupby('Merchant_id')['Distance'].mean()
Merchant_distance[Merchant_distance==0]

在这里插入图片描述

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

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

Merchant_discount_rate = cpon_consume.groupby('Merchant_id')['Discount_rate'].mean()
Merchant_discount_rate.sort_values()
Merchant_discount_rate.hist()
Merchant_discount_rate.mean()  
Merchant_discount_rate

在这里插入图片描述
在这里插入图片描述

所有商家平均折扣的平均值:0.88

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

#对商家进行分组,取出用户id,对用户id进行去重统计数量、
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人
这批商家对优惠券的使用方法得当,消费者喜欢用优惠券进行消费,可以适当借鉴这批商家的推广力度

6.持券消费人数在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_discount_rate,on='Merchant_id',how='inner')
merchant_pop_dis_rate

在这里插入图片描述

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

#corr(correlation:相关系数),用来计算df数据中列与列的相关性(皮尔逊相关系数),取值范围[-1,1]之间
#1:完全正相关,-1:完全负相关
#绝对值越大:相关性越大,反之成立
#正相关:随着变量的增大,而增大,反之同理
#负相关:随着变量的增大,而减小,反之同理

merchant_pop_dis_rate.corr()

在这里插入图片描述

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

用热力图展示相关系数

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

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之间,为相关程度极弱
#综上所述,这些店家之所以火爆,应该是物美价廉导致,与距离和优惠力度相关性不大

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

1.统计每天优惠券发放数量和使用数量

offline['Date'].notnull().sum() 

在这里插入图片描述

77.7万消费数据

offline['Date_received'].notnull().sum()

在这里插入图片描述

已经发送出105万优惠券

取出存在消费日期的记录,进行升序,再去重

date_sort = offline[offline['Date'].notnull()]['Date'].sort_values().unique()
date_sort[:5]

在这里插入图片描述

取出存在领券日期的记录,进行升序,再去重

date_receive_sort = offline[offline['Date_received'].notnull()]['Date_received'].sort_values().unique()
date_receive_sort[:5]

在这里插入图片描述

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

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

在这里插入图片描述

每天发放的优惠券数量

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

在这里插入图片描述

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

plt.figure(figsize=(18,6))
plt.bar(x=date_receive_sort,height=coupon_sendout_everyday['count'],label='每天发券量')plt.yscale('log')  #对y轴进行对数缩放
plt.legend()

在这里插入图片描述

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倍左右,优惠券的使用率还是非常低的

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

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%左右。
#整体来看,优惠券使用率波动较大。


人生总是在前行,不论走到哪里,只要带着信念往前走,比别人多一点努力,你就会多一份成绩;比别人多一点志气,你就会多一份出息;比别人多一点坚持,你就会夺取胜利;比别人多一点执着,你就会创造奇迹。


http://www.ppmy.cn/news/28302.html

相关文章

电脑技巧:分享8个Win11系统必备小技巧

目录 1、让任务栏显示“右键菜单” 2、任务栏置顶 3、还原经典右键菜单 4、Win11版任务管理器 5、新版AltTab 6、开始菜单不再卡 7、为Edge浏览器添加云母效果 8、自动切换日/夜模式 Win11在很多地方都做了调整,但由于涉及到诸多旧有习惯,再加上…

python之并发编程

一、并发编程之多进程 1.multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。 multiprocess…

Qt音视频开发17-vlc内核回调拿图片进行绘制

一、前言 在众多播放器中,支持的种类格式众多,并支持DVD影音光盘,VCD影音光盘及各类流式协议,提供了sdk进行开发,这点是至关重要的,尽管很多优秀的播放器很牛逼,由于没有提供sdk第三方开发&…

Connext DDS录制服务 Recording Service(2)

2.4 远程管理 控制客户端(如RTI管理控制台)可以使用此接口远程控制录制服务。 注:记录服务远程管理基于第10.3节中描述的RTI远程管理平台。有关录制服务中远程管理工作的详细讨论,请参阅该手册 下面是所有支持操作的API引用。 2.4.1 启用远程管理 默认情况下,在录制服务中…

【C++】仿函数、lambda表达式、包装器

1.仿函数 仿函数是什么?仿函数就是类中的成员函数,这个成员函数可以让对象模仿函数调用的行为。 函数调用的行为:函数名(函数参数)C中可以让类实现:函数名(函数参数)调用函数 自己写一个仿函数: 重载()运算符 cla…

Qt中信号与槽的使用

Qt中信号与槽的使用 Qt当中一个重要的东西是信号和槽,它被用于对象之间的通信。 在Qt中,例如“点击按钮”这个事件就是发送信号的对象,接收信号的是某一个窗口,响应信号的是一个处理,可以是隐藏窗口或者是关闭窗口。…

Linux安装云原生网关Kong/KongA

目录1 概述2 创建服务器3 安装postgres4 安装kong5 安装node6 安装KONGA1 概述 Kong Kong是一款基于OpenResty(NginxLua模块)编写的高可用、易扩展的开源API网关,专为云原生和云混合架构而建,并针对微服务和分布式架构进行了特别…

ccc-台大林轩田机器学习基石-hw1

文章目录Question1-14Question15-PLAQuestion16-PLA平均迭代次数Question17-不同迭代系数的PLAQuestion18-Pocket_PLAQuestion19-PLA的错误率Question20-修改Pocket_PLA迭代次数Question1-14 对于有明确公式和定义的不需要使用到ml 智能系统在与环境的连续互动中学习最优行为策…