数据分析:某电商优惠卷数据分析
数据分析:某电商优惠卷数据分析
作者: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%左右。
#整体来看,优惠券使用率波动较大。
人生总是在前行,不论走到哪里,只要带着信念往前走,比别人多一点努力,你就会多一份成绩;比别人多一点志气,你就会多一份出息;比别人多一点坚持,你就会夺取胜利;比别人多一点执着,你就会创造奇迹。
相关文章:

数据分析:某电商优惠卷数据分析
数据分析:某电商优惠卷数据分析 作者:AOAIYI 专栏:python数据分析 作者简介:Python领域新星作者、多项比赛获奖者:AOAIYI首页 😊😊😊如果觉得文章不错或能帮助到你学习,可…...

性能测试流程
性能测试实战一.资源指标分析1.判断CPU是否瓶颈的方法2.判断内存是否瓶颈的方法3.判断磁盘I/O是否瓶颈的方法4.判断网络带宽是否是瓶颈的方法二.系统指标分析三.性能调优四.性能测试案例1.项目背景2.实施规划(1)需求分析(2)测试方…...

zookeeper集群的搭建,菜鸟升级大神必看
一、下载安装zookeeperhttp://archive.apache.org/dist/zookeeper/下载最新版本2.8.1http://archive.apache.org/dist/zookeeper/zookeeper-3.8.1/二、上传安装包到服务器上并且解压,重命名tar -zxvf apache-zookeeper-3.8.1-bin.tar.gzmv apache-zookeeper-3.8.1-b…...

C语言之习题练习集
💗 💗 博客:小怡同学 💗 💗 个人简介:编程小萌新 💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞 文章目录牛客网题号: JZ17 打印从1到最大的n位数牛客网题号&#x…...

Buuctf [ACTF新生赛2020]Universe_final_answer 题解
1.程序逻辑 程序逻辑并不复杂: 首先输入字符串,然后对字符串进行一个判断是否满足条件的操作 如果满足则对字符串进行处理并输出,输出的就是flag 2.judge_860函数 显然根据这十个条件可以通过矩阵解线性方程组,这里对变量的命名做了一些调整,让Vi对应flag[i]方便读 …...

【Linux】环境变量
目录背景1.概念2.常见环境变量2.1 PATH指令和自定义程序向环境变量PATH中添加路径删除PATH中的路径2.2 env:显示所有环境变量2.3 环境变量相关的命令3.通过代码获取环境变量1.char* envp[]2.第三方变量enciron3.getenv函数获取指定环境变量4.利用获取的环境变量自制…...

单一职责原则
单一职责原则: 就一个类而言,应该只有一个引起它变化的原因,如果一个类承担的职责过多就等于把这些职责耦合在一起,至少会造成以下两方面的问题: 我们要去修改该类中的一个职责可能会影响到该类的其它职责。这种耦合…...

golangの并发编程(GMP模型)
GMP模型 && channel1. 前言2. GMP模型2.1. 基本概念2.2. 调度器策略2.3. go指令的调度流程2.4. go启动周期的M0和G02.5. GMP可视化2.6. GMP的几种调度场景3. channel3.1. channel的基本使用3.2. 同步器1. 前言 Go中的并发是函数相互独立运行的体现,Gorouti…...

MacBook Pro错误zsh: command not found: brew解决方法
问题描述:本地想安装Jenkins,但是brew指令不存在/我的电脑型号是19款的MacBook Pro(Intel芯片)。解决方法MacBook Pro 重新安装homebrew,用以下命令安装,序列号选择阿里巴巴下载源。/bin/zsh -c "$(cu…...

spring中BeanFactory 和ApplicationContext
在学习spring的高阶内容时,我们有必要先回顾一下spring回顾spring1.什么是springspring是轻量级的,指核心jar包时很小的;非侵入式的一站式框架(数据持久层,web层,核心aop),为了简化企业级开发。核心是IOC&a…...

HC32L17x的LL驱动库之dma
#include "hc32l1xx_ll_dma.h"/// //函 数: //功 能: //输入参数: //输出参数: //说 明: // uint8_t LL_DMA_DeInit(DMA_TypeDef* DMAx, uint32_t Channel) {__IO uint32_t* dmac NULL;dmac &(DMAx->CONFA0);Channel << 4;dmac …...

SSM项目 替换为 SpringBoot
一、运行SSM项目 保证项目改为SpringBoot后运行正常,先保证SSM下运行正常。 项目目录结构 创建数据库,导入sql文件 查看项目中连接数据jar版本,修改对应版本,修改数据库配置信息 配置启动tomcat 运行项目,测试正常…...
RL笔记:动态规划(2): 策略迭代
目录 0. 前言 (4.3) 策略迭代 Example 4.2: Jack’s Car Rental Exercise 4.4 Exercise 4.5 Exercise 4.6 Exercise 4.7 0. 前言 Sutton-book第4章(动态规划)学习笔记。本文是关于其中4.2节(策略迭代)。 (4.3) 策略迭代 基…...

2023软件测试金三银四常见的软件测试面试题-【测试理论篇】
三、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的SE会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, 我…...

蓝桥训练第二周
1 ,泛凯撒加密 内存限制:128 MB时间限制:1.000 S 题目描述 众所周知,在网络安全中分为明文和密文,凯撒加密是将一篇明文中所有的英文字母都向后移动三位(Z的下一位是A),比如a向后…...

详讲函数知识
目录 1. 函数是什么? 2. C语言中函数的分类: 2.1 库函数: 2.2 自定义函数 函数的基本组成: 3. 函数的参数 3.1 实际参数(实参): 3.2 形式参数(形参): …...

gin 框架初始教程文档
一 、gin 入门1. 安装gin :下载并安装 gin包:$ go get -u github.com/gin-gonic/gin2. 将 gin 引入到代码中:import "github.com/gin-gonic/gin"3.初始化项目go mod init gin4.完整代码package mainimport "github.com/gin-go…...

Maven的下载和安装【详细】
文章目录一、什么是Maven?二、Maven的安装与配置2.1下载Maven安装包2.2配置Maven环境变量2.3验证三、Idea配置Maven3.1配置 setting.xml文件3.2Idea配置Maven一、什么是Maven? Apache Maven是个项目管理和自动构建工具,基于项目对象模型&…...

[数据结构]:04-循环队列(数组)(C语言实现)
目录 前言 已完成内容 循环队列实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-QueueCommon.cpp 04-QueueFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代码。使用C引用主要是为了…...

buu [GWCTF 2019]BabyRSA 1
题目描述: import hashlib import sympy from Crypto.Util.number import *flag GWHT{******} secret ******assert(len(flag) 38)half len(flag) / 2flag1 flag[:half] flag2 flag[half:]secret_num getPrime(1024) * bytes_to_long(secret)p sympy.nextp…...

codeforces 1669F
题意: alice和bob从数组两边的吃糖果, 数组的值就是糖果重量 要求alice和bob吃的糖果重量必须一样, 输出能吃几个糖果 这题最先想到的是前后缀相加 模拟一个前缀和 和 后缀和 在n/2的位置向前找前缀和 在n/2的位置向后找后缀和 找到第一个前缀和后缀和的下标输出就好 …...

高数考试必备知识点
三角函数与反三角函数的知识点 正弦函数 ysin x, 反正弦函数 yarcsin x • y sin x, x∈R, y∈[–1,1],周期为2π,函数图像以 x (π/2) kπ 为对称轴 • y arcsin x, x∈[–1,1]…...

[蓝桥杯] 二分与前缀和习题练习
文章目录 一、二分查找习题练习 1、1 数的范围 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 机器人跳跃问题 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 四平方和 1、3、1 题目描述 1、3、2 题解关键思路与解答 二、前缀和习题练习 2、1 前缀和 2、1、1 题目描述…...

SpringMvc中HandlerAdapter组件的作用
概述 我们在使用springMVC时,都知道其中不仅包含handlerMapping组件还包含handlerAdapter组件,为什么呢? springMVC请求流程图 HandlerAdapter组件使用了适配器模式 适配器模式的本质是接口转换和代码复用,这里使用适配器模式的…...

FreeRTOS优先级翻转
优先级翻转优先级翻转:高优先级的任务反而慢执行,低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未…...

服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】
我是用的xshell连接的云服务器,今天想在服务器上面部署一个前后端分离【springbootvue】项目,打开我的云服务器才发现,过期了,然后又买了一个,里面环境啥都没有,正好出一期教程,方便大家也方便自…...

golang项目----家庭收支记账软件
家庭收支记账软件实现基本功能(先使用面向过程,后面改成面向对象)项目代码实现改进面向过程源码面向对象源码utils包中main包中实现基本功能(先使用面向过程,后面改成面向对象) 编写文件TestMyAccount.go完成基本功能 功能一:先完成可以显示…...

中国LNG市场投资机会研究
中国LNG市场投资机会研究中国LNG市场是一个具有巨大潜力和发展机遇的市场,尤其是在政府大力推动清洁能源发展的背景下,LNG市场投资机会正在不断扩大。首先,政府大力支持LNG市场的发展。政府实施的“十三五”规划将LNG作为清洁能源的重要来源&…...

Elasticsearch:索引数据是如何完成的
在我在之前的文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作” 文章中,我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中,我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…...

处理器管理
处理器状态处理器管理是操作系统中重要组成部分,负责管理、调度和分配计算机系统的重要资源——处理器,并控制程序执行由于处理器管理是操作系统最核心的部分,无论是应用程序还是系统程序,最终都要在处理器上执行以实现其功能&…...