电商平台零售数据分析

2023-10-29

本次目标主要是利用RFM模型对用户进行分类。通过对比分析不同用户群体在时间、地区等维度下的交易量、交易金额等,总结分析结果并提出优化建议。

R(Recently):最近一次的消费时间

F(Frequency):消费频率(单位时间的消费次数)

M(Money):消费金额(单位时间的消费金额)

本次数据来源于在线零售业务的交易数据,以下是礼品数据的相关字段:

InvoiceNO:订单编号,每笔交易有六个整数,退货订单编号开头有字母“C”

StockCode:产品编号,由五个整数组成

Description:产品描述

Quantity:产品数量,正号表示成功出售,负号表示退货

InVoiceDate:订单日期和时间

UnitPrice:单价(英镑),单位产品的价格

CustomerID:客户编号,每个客户编号由五位整数组成

Country:国家的名称,每个客户所在的国家/地区的名称

一、读取数据

#忽视警告信息
import warnings
warnings.filterwarnings('ignore')
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# import os
# os.chdir('')
# 更改文件存放目录

关于seaborn库的使用

import plotly as py # 用来与plotly服务器通信
import plotly.graph_objs as go # 用来生成图形对象
pyplot=py.offline.iplot
py.offline.init_notebook_mode()
# 初始化jupyter notebook中的绘图模式

关于plotly库的使用 

#读取数据
df=pd.read_csv('E:\Kaggle\data.csv',encoding='utf-8')
df.shape
df.info()

二、 数据清洗

df.apply(lambda x: sum(x.isnull())/len(x),axis=0)
# 每一列缺失值的占比情况

 

可见客户编号CustomerID缺失值占比较多 

df.head()

df.drop(['Description'],axis=1,inplace=True)
# 产品描述我们可以进行删除,因为其对数据分析无意义
df['CustomerID']=df['CustomerID'].fillna('U')
# 将缺失的CustomerID填充为"U"
df['amount']=df['Quantity']*df['UnitPrice']
# 订单的交易总额,数量*单价
df['date']=[x.split(' ')[0] for x in df['InvoiceDate']]
df['time']=[x.split(' ')[1] for x in df['InvoiceDate']]
df[['date','time']]
# 将InvoiceDate的日期和时间分为两列
# PLAN B:
# df['Date'] = pd.to_datetime(df['InvoiceDate']).dt.date
# df['Time'] = pd.to_datetime(df['InvoiceDate']).dt.time
# df['Date'] = pd.to_datetime(df['Date'])
# 删除InvoiceDate列,分割年、月、日

df.drop(['InvoiceDate'],axis=1,inplace=True)
df['year']=[x.split('/')[2] for x in df['date']]
df['month']=[x.split('/')[0] for x in df['date']]
df['day']=[x.split('/')[1] for x in df['date']]
df[['year','month','day']].head()
df['date']=pd.to_datetime(df['date'])
df['date']
df=df.drop_duplicates()
# 删除重复值
df.describe()
# 对单价进行异常分析
df2=df.loc[df['UnitPrice'] <=0]
df2.head()
df2.shape[0]/df.shape[0]
# 异常值里边单价的分类情况
df2['UnitPrice'].groupby(df2['UnitPrice']).count()
df['month'].groupby(df['month']).count()
df2['UnitPrice']


 三、数据分析

(1)退货率

df1=df.loc[df['Quantity'] <=0]
df1.columns
# 每个月的退货情况
tt=pd.pivot_table(df1,index=['year'],columns=['month'],values=['amount'],aggfunc={'amount':np.sum},margins=False)
# 销售的正常数据
df2=df[(df['Quantity'] >0) & (df['UnitPrice'] >0)]
# 每个月的营业额
pp=pd.pivot_table(df2,index=['year'],columns=['month'],values=['amount'],aggfunc={'amount':np.sum},margins=False)

# 2011年每月的退货率
np.abs(tt/pp)
# 2011年月平均退货率
np.abs(tt / pp).loc['2011'].mean()

 (2)用户分级

# 计算R、F、M
# 客户最近一次的消费时间
R_value=df2.groupby('CustomerID')['date'].max()
df2['date'].max()
# 用户最近消费时间和目标时间的距离
R_value=(df2['date'].max() -R_value).dt.days
# nunique()用于统计同一列中不同值的个数
F_value=df2.groupby('CustomerID')['InvoiceNo'].nunique()
# 消费总金额
M_value=df2.groupby('CustomerID')['amount'].sum()

import seaborn as sns
sns.set(style='darkgrid')
plt.hist(R_value,bins=30)
plt.show()
# 根据得到的图形可知异常值严重
plt.hist(M_value,bins=30)
plt.show()

# 绘制金额小于2000
plt.hist(M_value[M_value<2000],bins=30)
plt.show()

F_value.describe()

# 最大值是1428,中位数是2,可知异常值严重
count    4339.000000
mean        4.600138
std        22.943499
min         1.000000
25%         1.000000
50%         2.000000
75%         5.000000
max      1428.000000
Name: InvoiceNo, dtype: float64
# 消费频率小于20的
plt.hist(F_value[F_value<20],bins=30)
plt.show()

 

# 设置分段指标
R_bins=[0,30,90,180,360,720]
F_bins=[1,2,5,10,20,5000]#F代表消费频次,边界一定要高于最高值
M_bins=[0,500,2000,5000,10000,200000]
# 设置权重,R,值越小目标时间越近,所占权重越大,F值越小频率越高,M值越小金额越大
R_score=pd.cut(R_value,R_bins,labels=[5,4,3,2,1],right=False)
M_score=pd.cut(M_value,M_bins,labels=[1,2,3,4,5],right=False)
F_score=pd.cut(F_value,F_bins,labels=[1,2,3,4,5],right=False)
# axis=1,横向合并;纵向合并 axis=0
rfm=pd.concat([R_score,F_score,M_score],axis=1)
# 重命名
rfm.rename(columns={'date':'R_score','InvoiceNo':'F_score','amount':'M_score'},inplace=True)
rfm.info()
# 转换类型方便计算
for i in ['R_score','F_score','M_score']:
    rfm[i] = rfm[i].astype(float)
rfm.describe()
# 根据平均值设置分级
rfm['R']=np.where(rfm['R_score'] >3.82,'高','低')
rfm['F']=np.where(rfm['F_score'] >2.03,'高','低')
rfm['M']=np.where(rfm['M_score'] >1.89,'高','低')

# rfm.describe()
	R_score	F_score	M_score
count	4339.000000	4339.000000	4336.000000
mean	3.821618	2.028117	1.885609
std	1.174880	0.997989	0.951810
min	1.000000	1.000000	1.000000
25%	3.000000	1.000000	1.000000
50%	4.000000	2.000000	2.000000
75%	5.000000	3.000000	2.000000
max	5.000000	5.000000	5.000000
# 进行汇总
rfm['value']=rfm['R'].str[:]+rfm['F'].str[:]+rfm['M'].str[:]
# 去除空格处理
rfm['value']=rfm['value'].str.strip()
# 用户分级函数
def trans_value(x):
    if x =='高高高':
        return '重要价值客户'
    elif x =='高低高':
        return '重要发展客户'
    elif x =='低高高':
        return '重要保持客户'
    elif x =='低低高':
        return '重要挽留客户'
    elif x =='高高低':
        return '一般价值客户'
    elif x =='高低低':
        return '一般发展客户'
    elif x =='低高低':
        return '一般保持客户'
    else:
        return '一般挽留客户'
rfm['用户等级']=rfm['value'].apply(trans_value)
rfm
rfm['用户等级'].value_counts()
trace_basic=[go.Bar(x=rfm['用户等级'].value_counts().index,
            y=rfm['用户等级'].value_counts().values,
            marker=dict(color='orange'),opacity=0.50)]

layout=go.Layout(title='用户等级情况',xaxis=dict(title='用户重要度'))

figure_basic=go.Figure(data=trace_basic,layout=layout)
pyplot(figure_basic)

 

# 用户等级比例
trace=[go.Pie(labels=rfm['用户等级'].value_counts().index,
            values=rfm['用户等级'].value_counts().values,
            textfont=dict(size=12,color='white'))]
layout=go.Layout(title='用户等级比例')
figure_basic=go.Figure(data=trace,layout=layout)
pyplot(figure_basic)

 

总结

重要价值客户和重要发展客户占据较高比例。可以提高重要发展客户的购买频率,适时进行商品推送等。

1.生命周期:

平均生命周期为130天,生命周期的分布呈两极分化的状态。消费两次及以上的客户平均生命周期是203天,远高于总体均值103天。建议更加重视客户初次消费的体验感,可以考虑通过网站内服务评价、客服电询等方式获知新客对于购买流程中不满意之处,针对性地加以改进;并且花更多的精力引导其进行再次消费,如发放有时限的优惠券等。

2.挽留情况:

客户群体的采购并非高频行为,但留存下来的老客户忠诚度极高。而仅有首次购买行为的客户占总客户的37.5%,如能提高这部分群体的留存率,将会带来很高的收益。

3.购买周期:

大部分留存客户的购买周期集中在15-70天,建议可以每隔30天左右对客户进行些优惠活动的信息推送。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

电商平台零售数据分析 的相关文章

  • 2020-08-28生活记录

    今天在无意之间发现一个大神上传的技术类的PDF书籍和学习资料 满满的干货现在放出链接地址 雨夜的博客
  • 买服务器操作系统怎么选择,买服务器操作系统怎么选择

    买服务器操作系统怎么选择 内容精选 换一换 提供预装操作系统 应用环境和各类软件的优质第三方镜像 无需配置 可一键部署 满足建站 应用开发 可视化管理等个性化需求 市场镜像经过服务商和华为云的严格测试 可保证镜像内容的安全性 市场镜像主要有
  • 【python】操作Excel和word模块

    一 Excel操作操作模块 xls和 xlsx使用的两种不同的模块 xls xlrd 常用函数 python操作excel主要用到xlrd和xlwt这两个库 即xlrd是读excel xlwt是写excel的库 data xlrd open

随机推荐

  • 混合双向无线传输装置助力智能工厂建设

    智能制造的出现 将为各制造企业解决现有问题 实现创新驱动转型提供了一条全新的发展思路和技术途径 智能工厂建设作为智能制造发展的载体 是当前制造业的发展愿景 也是正在积极努力的重点方向 但对于如何建设与企业战略规划一致且符合企业自身实际应用需
  • ES数据库学

    一 es数据库简介 1 简介 es数据库的英文全称为ElsticSearch 是位于Elastic Stack核心的分布式搜索和分析引擎 是一个由Apache开源的高扩展 全文检索和分析引擎 NoSQL数据库功能 的系统 它可以准实地快速存
  • ​5- GPIO操作

    本笔记是根据STM32F429单片机的 其他STM32单片机与此类似 基本上都一样的 会一款 其他的基本上没啥问题 本人也是刚学 有不足之处请下方评论 目录 笔记1 GPIO操作 1 1 读 修改 写操作 常用操作 位与 可实现目标字段的清
  • mysql 中show 命令用法详细介绍

    a show tables或show tables from database name 显示当前数据库中所有表的名称 b show databases 显示mysql中所有数据库的名称 c show columns from table
  • 专升本——倒装

    文章目录 1 动词的分类 2 完全倒装 3 部分倒装 3 1 前倒后不倒 4 也 的倒装 4 1 肯定 也 关键词 so 4 2 否定的 也 4 3 Only的倒装 4 3 1 补充 5 练习 6 As的倒装 7 练习 1 动词的分类 V
  • stm32学习笔记---GPIO口操作

    一 GPIO的基本概念及寄存器介绍 1 GPIO接口简介 通用输入输出接口GPIO是嵌入式系统 单片机开发过程中最常用的接口 用户可以通过编程灵活的对接口进行控制 实现对电路板上LED 数码管 按键等常用设备控制驱动 也可以作为串口的数据收
  • spring boot 处理请求的方式 Controller 与RestController

    spring boot 基于spring MVC的基础上进行了改进 将 Controller 与 ResponseBody 进行了合并成一个新的注解 RestController 当用户请求时 需要有视图渲染的 与请求数据的请求分别使用 C
  • 利用java工具实现发送Email

    目录 一 引言 二 封装建立相关session的工具类 三 发送电子邮件 一 引言 在电子邮件之前 人们发邮件通常是通过将信件投放到邮筒或交给邮递员然后经过交通运输到达收件人手里 电子邮件出现之后 类似的也是模仿这个原理 不过不是具体的纸质
  • 调试与优化

    文章目录 IDEA常用快捷键 单元测试JUnit 导包步骤 进行JUnit测试 IDEA常用快捷键 提示与代码生成部分 Alt Enter IDEA 根据光标所在问题 提供快速修复选择 Ctrl Alt T 对选中的代码弹出环绕选项弹出层
  • 毕业设计 单片机自动写字机器人 - 物联网 嵌入式 stm32

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 4 1 总体框架 4 2 AB32VG1主控MCU 5 软件说明 5 1 总体框架 6 部分核心代码 7 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提
  • java parser_java parser

    package org javaparser examples chapter2 import com github javaparser StaticJavaParser import com github javaparser ast
  • Seaborn常见绘图总结

    以前粗略的学习过Matplotlib绘图 Pandas绘图 这里是pandas的常见绘图总结 但是都未深入的去学习过 一遇到问题就翻文档 效率低下 听 他们 说matplotlib中的seaborn绘图很好看而且实用 所以 这里系统的总结一
  • web渗透测测试(sqlmap)

    通过分析靶机JLS02页面信息 寻找漏洞页面 将WEB服务存在SQL注入漏洞的页面名称作为Flag提交 Flag index2 php 通过本地PC中的渗透测试平台KALI2020对靶机进行SQL注入攻击 获取靶机的数据库信息 将用来存放W
  • JavaScript-----变量与数据类型

    目录 前言 1 注释 2 变量 定义变量 关键字 命名规范 3 数据类型 数据类型的判断 4 类型转换 前言 前面我们学过了C语言 Python Java之类的编程语言 所以我们有一定的基础的话学起来会比较轻松 同样的JavaScript也
  • hbase 知识点(1) hbase涉及维度

    1 数据模型 数据的存储方式 kv 非结构 2 存储模型 内存 磁盘 3 一致性 强一致性 4 物理模型 分布式 5 读写性能 同步写 副本支持读 6 辅助索引 key有效 bloom 7 故障管理 region移动 8 压缩 多种压缩算法
  • docker环境搭建实战--腾讯云课堂

    看完这篇文章 你会从一个docker小白变为一个不是那么菜的菜鸟 docker简介 docker是一个开放源代码软件项目 让应用程序部署软件的工作可以自动化进行 借此在linux操作系统上 提供一个额外的软件抽象层 以及操作系统层虚拟化的自
  • delphi操作ini文件

    INI文件操作 1 INI文件的结构 这是关于INI文件的注释部分 节点 关键字 值 INI文件允许有多个节点 每个节点又允许有多个关键字 后面是该关键字的值 类型有三种 字符串 整型数值和布尔值 其中字符串存贮在INI文件中时没有引号 布
  • J2SE-API:Object和System类的基本操作

    Object类 所有对象 包括数组 都实现这个类的方法 protected Object clone 创建并返回此对象的一个副本 boolean equals Object obj 指示其他某个对象是否与此对象 相等 protected v
  • PEP544——协议-结构化子类型(静态鸭子类型)

    文章目录 2 基本原理和目标 2 1 名义子类型 vs 结构子类型 2 2 非目标 3 结构子类型的现有方法 4 规范 4 1 术语 4 2 定义一个协议 4 3 协议成员 4 4 显式声明实现 4 5 合并以及拓展协议 4 6 泛型协议
  • 电商平台零售数据分析

    本次目标主要是利用RFM模型对用户进行分类 通过对比分析不同用户群体在时间 地区等维度下的交易量 交易金额等 总结分析结果并提出优化建议 R Recently 最近一次的消费时间 F Frequency 消费频率 单位时间的消费次数 M M