小而全的Pandas数据分析案例
公众号:尤而小屋
作者:Peter
编辑:Peter
大家好,我是Peter~
写过很多关于Pandas的文章,本文开展了一个简单的综合使用,主要分为:
- 如何自行模拟数据
- 多种数据处理方式
- 数据统计与可视化
- 用户RFM模型
- 用户复购周期
构建数据
本案例中用的数据是小编自行模拟的,主要包含两个数据:订单数据和水果信息数据,并且会将两份数据合并
import pandas as pd
import numpy as np
import random
from datetime import *
import timeimport plotly.express as px
import plotly.graph_objects as go
import plotly as py# 绘制子图
from plotly.subplots import make_subplots
1、时间字段
2、水果和用户
3、生成订单数据
order = pd.DataFrame({"time":time_range, # 下单时间"fruit":fruit_list, # 水果名称"name":name_list, # 顾客名# 购买量"kilogram":np.random.choice(list(range(50,100)), size=len(time_range),replace=True)
})order
4、生成水果的信息数据
infortmation = pd.DataFrame({"fruit":fruits,"price":[3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],"region":["华南","华北","西北","华中","西北","华南","华北","华中"]
})infortmation
5、数据合并
将订单信息和水果信息直接合并成一个完整的DataFrame,这个df就是接下来处理的数据
6、生成新的字段:订单金额
到这里你可以学到:
- 如何生成时间相关的数据
- 如何从列表(可迭代对象)中生成随机数据
- Pandas的DataFrame自行创建,包含生成新字段
- Pandas数据合并
分析维度1:时间
2019-2021年每月销量走势
1、先把年份和月份提取出来:
df["year"] = df["time"].dt.year
df["month"] = df["time"].dt.month
# 同时提取年份和月份
df["year_month"] = df["time"].dt.strftime('%Y%m')df
2、查看字段类型:
3、分年月统计并展示:
# 分年月统计销量
df1 = df.groupby(["year_month"])["kilogram"].sum().reset_index()fig = px.bar(df1,x="year_month",y="kilogram",color="kilogram")
fig.update_layout(xaxis_tickangle=45) # 倾斜角度fig.show()
2019-2021销售额走势
df2 = df.groupby(["year_month"])["amount"].sum().reset_index()df2["amount"] = df2["amount"].apply(lambda x:round(x,2))fig = go.Figure()
fig.add_trace(go.Scatter( #x=df2["year_month"],y=df2["amount"],mode='lines+markers', # mode模式选择name='lines')) # 名字fig.update_layout(xaxis_tickangle=45) # 倾斜角度fig.show()
年度销量、销售额和平均销售额
分析维度2:商品
水果年度销量占比
df4 = df.groupby(["year","fruit"]).agg({"kilogram":"sum","amount":"sum"}).reset_index()
df4["year"] = df4["year"].astype(str)
df4["amount"] = df4["amount"].apply(lambda x: round(x,2))from plotly.subplots import make_subplots
import plotly.graph_objects as gofig = make_subplots(rows=1, cols=3,subplot_titles=["2019年","2020年","2021年"],specs=[[{"type": "domain"}, # 通过type来指定类型{"type": "domain"},{"type": "domain"}]]
) years = df4["year"].unique().tolist()for i, year in enumerate(years):name = df4[df4["year"] == year].fruitvalue = df4[df4["year"] == year].kilogramfig.add_traces(go.Pie(labels=name,values=value),rows=1,cols=i+1)fig.update_traces(textposition='inside', # 'inside','outside','auto','none'textinfo='percent+label',insidetextorientation='radial', # horizontal、radial、tangentialhole=.3,hoverinfo="label+percent+name"
)# fig.update_layout(title_text="多行多列子图制作")fig.show()
各水果年度销售金额对比
years = df4["year"].unique().tolist()for _, year in enumerate(years):df5 = df4[df4["year"]==year]fig = go.Figure(go.Treemap( labels = df5["fruit"].tolist(),parents = df5["year"].tolist(),values = df5["amount"].tolist(),textinfo = "label+value+percent root"))fig.show()
商品月度销量变化
fig = px.bar(df5,x="year_month",y="amount",color="fruit")
fig.update_layout(xaxis_tickangle=45) # 倾斜角度
fig.show()
折线图展示的变化:
分析维度3:地区
不同地区的销量
不同地区年度平均销售额
df7 = df.groupby(["year","region"])["amount"].mean().reset_index()
分析维度4:用户
用户订单量、金额对比
df8 = df.groupby(["name"]).agg({"time":"count","amount":"sum"}).reset_index().rename(columns={"time":"order_number"})df8.style.background_gradient(cmap="Spectral_r")
用户水果喜好
根据每个用户对每种水果的订单量和订单金额来分析:
df9 = df.groupby(["name","fruit"]).agg({"time":"count","amount":"sum"}).reset_index().rename(columns={"time":"number"})df10 = df9.sort_values(["name","number","amount"],ascending=[True,False,False])df10.style.bar(subset=["number","amount"],color="#a97fcf")
px.bar(df10,x="fruit",y="amount",
# color="number",facet_col="name")
用户分层—RFM模型
RFM模型是衡量客户价值和创利能力的重要工具和手段。
通过这个模型能够反映一个用户的交期交易行为、交易的总体频率和总交易金额3项指标,通过3个指标来描述该客户的价值状况;同时依据这三项指标将客户划分为8类客户价值:
Recency(R)是客户最近一次购买日期距离现在的天数,这个指标与分析的时间点有关,因此是变动的。理论上客户越是在近期发生购买行为,就越有可能复购
Frequency(F)指的是客户发生购买行为的次数–最常购买的消费者,忠诚度也就较高。增加顾客购买的次数意味着能占有更多的时长份额。
Monetary value(M)是客户购买花费的总金额。
下面通过Pandas的多个方法来分别求解这个3个指标,首先是F和M:每位客户的订单次数和总金额
如何求解R指标呢?
1、先求解每个订单和当前时间的差值
2、根据每个用户的这个差值R来进行升序排列,排在第一位的那条数据就是他最近购买记录:以xiaoming用户为例,最近一次是12月15号,和当前时间的差值是25天
3、根据用户去重,保留第一条数据,这样便得到每个用户的R指标:
4、数据合并得到3个指标:
当数据量足够大,用户足够多的时候,就可以只用RFM模型来将用户分成8个类型
用户复购分析
复购周期是用户每两次购买之间的时间间隔:以xiaoming用户为例,前2次的复购周期分别是4天和22天
下面是求解每个用户复购周期的过程:
1、每个用户的购买时间升序
2、将时间移动一个单位:
3、合并后的差值:
出现空值是每个用户的第一条记录之前是没有数据,后面直接删除了空值部分
直接取出天数的数值部分:
5、复购周期对比
px.bar(df16,x="day",y="name",orientation="h",color="day",color_continuous_scale="spectral" # purples)
上图中矩形越窄表示间隔越小;每个用户整个复购周期由整个矩形长度决定。查看每个用户的整体复购周期之和与平均复购周期:
得到一个结论:Michk和Mike两个用户整体的复购周期是比较长的,长期来看是忠诚的用户;而且从平均复购周期来看,相对较低,说明在短时间内复购活跃。
从下面的小提琴中同样可以观察到,Michk和Mike的复购周期分布最为集中。
小而全的Pandas数据分析案例相关推荐
- 小而全的Pandas使用案例
写过很多关于Pandas的文章,本文开展了一个简单的综合使用,主要分为: 如何自行模拟数据 多种数据处理方式 数据统计与可视化 用户RFM模型 用户复购周期 构建数据 本案例中用的数据是小编自行模拟的 ...
- Pandas数据分析案例(盛华化工锅炉排放数据可视化分析)
Pandas数据分析案例(盛华化工锅炉排放数据可视化分析) 实验环境 数据集介绍 问题描述 实验步骤 一.数据导入与观察 二.数据转换 三.数据可视化分析 相关资源 实验环境 操作系统:Linux/W ...
- pandas数据分析案例--2012美国总统竞选赞助数据分析
美国总统竞选赞助数据分析 本文内容参考阿里云天池实验室,在原有基础上添加了一些结论的分析. 原案例地址 数据来源 1.首先导入相关的python数据分析的库 import pandas as pd i ...
- 超全的pandas数据分析常用函数总结:上篇
公众号后台回复"图书",了解更多号主新书内容 作者:雅痞绅士JM 来源:凹凸数据 基础知识在数据分析中就像是九阳神功,熟练的掌握,加以运用,就可以练就深厚的内力,成为绝顶高手自然不 ...
- 9个value_counts()的小技巧,提高Pandas 数据分析效率
来源:DeepHub IMBA本文约1800字,建议阅读5分钟 我们将探讨 Pandas value_counts() 的不同用例. 数据科学家通常将大部分时间花在探索和预处理数据上.当谈到数据分析和 ...
- Python 全栈 400 之Pandas数据分析练习
288 Pandas 读取 URL 路径的文件 数据输入路径,可以是文件路径,也可以是 URL,或者实现 read 方法的任意对象. 如下经典的数据集 iris,直接通过 URL 获取. In [16 ...
- Python数据分析案例08——预测泰坦尼克号乘员的生存(机器学习全流程)
上一篇数据分析案例是回归问题,本次案例带来分类问题的 机器学习案例.这个数据集比上个案例更小.更简单,代码也不复杂,新手都可以学一学. 1.背景分析 预测乘客是否存活下来 泰坦尼克号是数据科学机器学习 ...
- Pandas数据分析实战案例之青春有你2(获取人物名称与头像)
Pandas数据分析实战案例之青春有你2 看前须知:如果有需要借鉴的地方的话,可以把 导出数据 和 下载图片 的地址改掉.除此以外,可能定义函数的时候里面的 获取资料地址有误 ,会显示404,在文章末 ...
- Pandas 数据分析 5 个实用小技巧
Python与算法社区 第443篇原创,干货满满 值得星标 01 02 03 三步加星标 你好,我是 zhenguo 我攥了很久才汇总出这个小技巧系列手册,现暂命名为:<Pandas数据分析小技 ...
最新文章
- ALD和CVD晶体管薄膜技术
- api.533.net 文章迁移计划
- 2019-11-09 正定矩阵的一些常见概念
- 2017年初随想——几个小目标
- [vue] 你有使用过动态组件吗?说说你对它的理解
- java版本streamgobbler_java调用本地命令 Runtime class's exec() method
- Hanoi Tower 模拟
- 【软件测试从入门到放弃】入门阶段:迈入软件测试大门
- linxu /proc/stat 文件
- Mac 上设置文件共享教程
- python matplotlib包图像配色方案
- 同步异步线程进程的一些思考
- 华为手机海拔测试软件,华为手机海拔高度测量仪
- Python新手入门第一步:什么是 IDE?IDE 有什么用?
- tableau-瀑布图
- 如何快速有效的复习教师资格证?
- 红米k30至尊纪念版和华为mate30pro哪个值得买
- Android开发我音乐App
- OpenStack 虚拟机冷/热迁移功能实践与流程分析
- 防火墙添加ip白名单_宝塔防火墙IP白名单添加/导入云盾YUNDUN高防CDN节点IP段
热门文章
- 记一次QC35-1固件降级之旅
- mysql 中文 特殊字符_mysql实现数字、字母、中文、特殊字符排序
- 2014版学车考驾照精华攻略 总有一个你需要!赶紧收藏吧!!
- 用一个随机数函数去生成另一个随机数函数:rand(a)生成rand(b)以及rand(a,b) 生成rand(c,d)
- upp(统一流程平台)项目,如果需要项目章程会怎么写
- SQL经典练习题(x30)
- 如何接管SBO系统的内置业务流程
- 模仿天猫实战【SSM版】——项目起步
- iOS 学习笔记 一【经典】
- matlab曲面与直线交点,MATLAB中求椭圆与直线的交点为什么交点不在椭圆和直线上?...