Python数据分析_Pandas_分组_会员数据分析_6.1
在实际生产场景中,比如销售数据分析,透视表可以帮助快速识别最畅销的产品、最佳销售时段或最有效的销售渠道,从而为决策提供直观的数据支持。总之,透视表是数据探索和报告制作中的得力助手,它能够帮助用户从复杂的数据集中提炼出关键信息,以高效、灵活的方式展现数据分析的结果,助力于洞察趋势和制定策略。简单来说,透视表是数据分析中的“变形金刚”,它能将繁琐的数据表格转换成清晰、动态的汇总视图,让数据背后的故事一
文章目录
-
- Pandas分组会员数据分析
-
- 分组查询和透视表回顾
-
- 分组聚合
- 透视表
- 零售项目会员分析
-
- 1.会员分析-会员月增量和月存量
- 2.会员分析-会员增量等级分析
- 3.会员分析-会员每月占比分析
- 4.会员分析-整体等级占比
- 5.会员分析-线上线下增量分析
-
- 01_matplotlib制作柱状图.py
- 02_matplotlib制作饼图.py
- 03_pyecharts制作柱状图.py
- 04_pyecharts制作饼图.py
- 05_列表推导式.py
- 06_零售会员分析案例.py
- test.py
Pandas分组会员数据分析
分组查询和透视表回顾

分组聚合
-
分组group by
-
聚合aggregate
-
概述
- 在SQL中我们经常使用 GROUP BY 将某个字段,按不同的取值进行分组,
- 在pandas中也有groupby函数, 分组之后,每组都会有至少1条数据, 将这些数据进一步处理,
- 返回单个值的过程就是聚合,比如分组之后计算算术平均值, 或者分组之后计算频数,都属于聚合
-
pandas中常用操作
-
df.groupby([“分组列名”])[“聚合列名”].聚合函数()
-
df.groupby([“分组列名”]).聚合列名.聚合函数()
-
df.groupby([“分组列名”]).agg({
“聚合列名1”:“聚合函数”
“聚合列名2”:“聚合函数”
…
})
- …
-
透视表
简单来说,透视表是数据分析中的“变形金刚”,它能将繁琐的数据表格转换成清晰、动态的汇总视图,让数据背后的故事一目了然。
具体而言,透视表是一种交互式的数据汇总工具,它允许用户通过拖放字段来重新排列和汇总数据。用户可以选择行、列以及筛选条件,甚至应用各种计算如求和、平均值、计数等,来从不同角度审视数据。在实际生产场景中,比如销售数据分析,透视表可以帮助快速识别最畅销的产品、最佳销售时段或最有效的销售渠道,从而为决策提供直观的数据支持。
总之,透视表是数据探索和报告制作中的得力助手,它能够帮助用户从复杂的数据集中提炼出关键信息,以高效、灵活的方式展现数据分析的结果,助力于洞察趋势和制定策略。
-
透视表概述
- 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等。
- 所进行的计算与数据跟数据透视表中的排列有关。之所以称为数据透视表,是因为可以动态地改变它们的版面布置,以便按照不同方式分析数据,也可以重新安排行号、列标和页字段。每一次改变版面布置时,数据透视表会立即按照新的布置重新计算数据。
- 另外,如果原始数据发生更改,则可以更新数据透视表。在使用Excel做数据分析时,透视表是很常用的功能,Pandas也提供了透视表功能,对应的API为pivot_table
-
透视表pivot_table函数介绍
- pandas有两个pivot_table函数
- pandas.pivot_table
- pandas.DataFrame.pivot_table
- pandas.pivot_table 比 pandas.DataFrame.pivot_table 多了一个参数data,data就是一个dataframe,实际上这两个函数相同
- pivot_table参数中最重要的四个参数 :
- values: 要做聚合操作的列名
- index: 行索引, 传入原始数据的列名, 这一列中每个取值会作为透视表结果的1个行索引.
- columns: 列索引, 传入原始数据的列名, 这一列中每个取值会作为透视表结果的1列.
- aggfunc: 聚合函数
- pandas有两个pivot_table函数
零售项目会员分析
1.会员分析-会员月增量和月存量
-
会员分析介绍
-
分析会员运营的基本情况, 从量的角度分析会员运营情况:
① 整体会员运营情况(存量,增量)
② 不同渠道(线上,线下)的会员运营情况
③ 线下业务,拆解到不同的地区、门店会员运营情况
-
从质的角度分析会员运营情况:
① 会销比, 即: 会员消费占整体消费的占比
② 连带率, 即: 是不是每次购买商品的时候, 都购买一件以上
③ 复购率, 即: 是不是买了之后, 又来买
-
-
需求1: 按月统计注册的会员数量(即: 月增量)
代码实现
思路1: 透视表的方式实现
# 需求1: 按月统计注册的会员数量, 注册时间原始数据需要处理成 年-月 的形式 # 1 给 会员信息表 添加年月列 customer_info.loc[:, '注册年月'] = customer_info['注册时间'].apply(lambda x: x.strftime('%Y-%m')) # 2 查看我们要的 几列信息. customer_info[['会员卡号', '会员等级', '会员来源', '注册时间', '注册年月']].head() # 3 根据注册年月分组, 统计每组的 总数, 即为: 当月注册的会员数量 customer_info.pivot_table(index='注册年月', values='会员卡号', aggfunc='count') # 参数解释: # index: 哪一列数据作为 行索引. # columns: 哪一列数据作为列名. # values: 对哪一列值做统计. # aggfunc: 聚合方式 # 修改列名 month_count.columns = ['月增量'] month_count.head()思路2: 普通方式实现.
# 需求1: 按月统计注册的会员数量, 注册时间原始数据需要处理成 年-月 的形式 from datetime import datetime # 1 给 会员信息表 添加年月列 customer_info.loc[:, '注册年月'] = customer_info['注册时间'].apply(lambda x: x.strftime('%Y-%m')) # 2 查看我们要的 几列信息. customer_info[['会员卡号', '会员等级', '会员来源', '注册时间', '注册年月']].head() # 3 根据注册年月分组, 统计每组的 总数, 即为: 当月注册的会员数量 month_count = customer_info.groupby('注册年月')[['会员卡号']].count() # 修改列名 month_count.columns = ['月增量'] month_count.head()可视化方式
# 设置中文正常展示 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 # 4 绘图. month_count['月增量'].plot(figsize=(10, 5)) -
需求2: 按月统计注册的会员存量
代码实现
# 需求2: 计算 月会员存量 # 1. 基于每月的 月增量, 累加求和即可. month_count.loc[:, '会员存量'] = month_count['月增量'].cumsum()可视化
# 2. 报表展示下, 月会员存量. month_count['会员存量'].plot(kind='bar', figsize=(16, 8))增量和存量一起可视化
import matplotlib as plt month_count['月增量'].plot(figsize=(10, 5), color='red', secondary_y=True) # legend: True, 显示图例. month_count['会员存量'].plot(kind='bar', figsize=(10, 5), color='gray', xlabel='年月', legend=True, ylabel='存量')

2.会员分析-会员增量等级分析
-
概述
- 会员增量存量不能真实反映会员运营的质量,需要对会员的增量存量数据做进一步拆解
- 从哪些维度来拆解?
- 从指标构成来拆解:
- 会员 = 白银会员+黄金会员+铂金会员+钻石会员
- 从业务流程来拆解:
- 当前案例,业务分线上、线下,又可以进一步拆解:按大区,按门店
- 从指标构成来拆解:
- 由于会员等级跟消费金额挂钩,所以会员等级分布分析可以说明会员的质量
-
需求: 统计月增量会员中-会员等级分布
# 方式1: groupby写法. month_degree_count = customer_info.groupby(['注册年月','会员等级'])['会员卡号'].count() member_rating = month_degree_count.unstack() member_rating=member_rating[1:] -- ------------------------------------------------------------------------ # 方式2: 透视表写法. member_rating = customer_info.pivot_table(index='注册年月',columns='会员等级',values='会员卡号',aggfunc='count') member_rating=member_rating[1:] -
可视化
# 3. 绘制图表-增量等级分布 import matplotlib.pyplot as plt # 3.1 构建坐标系 fig, ax1 = plt.subplots(figsize=(20, 8)) # 3.2 构建双胞胎坐标系, 即: 通过ax1 创建了一个共享x轴的坐标系 ax2 ax2 = ax1.twinx() # 3.3 plt.subplots 创建了一个绘图区域 fig 和坐标系 ax1 # grid=True 添加网格线 # xlabel/ylabel x轴y轴 起名 # legend 图例 member_rating[['白银会员', '黄金会员']].plot.bar(ax=ax1, grid=True, xlabel='年月', ylabel='白银黄金', legend=True) member_rating[['铂金会员', '钻石会员']].plot(ax=ax2, color=['red', 'gray'], ylabel='铂金钻石', legend=True) # 3.4 把ax2 坐标系 图例显示的地方调整到左上角 ax2.legend(loc='upper left') plt.title('会员增量等级分布')

3.会员分析-会员每月占比分析
代码实现
# 需求: 计算不同等级会员占比
member_rating.loc[:, '总计'] = member_rating.sum(axis=1)
member_rating.loc[:, '白银会员占比'] = member_rating['白银会员'] / member_rating['总计']
member_rating.loc[:, '黄金会员占比'] = member_rating['黄金会员'] / member_rating['总计']
可视化
# 黄金白银会员占比可视化
member_rating[['白银会员占比', '黄金会员占比']].plot(color=['r', 'g'], ylabel='占比', figsize=(16, 8), grid=True)

4.会员分析-整体等级占比
代码实现
# 方式1: 普通方式
ratio = customer_info.groupby('会员等级')[['会员卡号']].count()
# 求占比
ratio.columns=['会员数']
ratio['占比'] = ratio['会员数']/ratio['会员数'].sum()
-- ------------------------------------------------------------------------
# 方式2: 透视表
ratio = customer_info.pivot_table(index='会员等级',values='会员卡号',aggfunc='count')
# 求占比
ratio.columns=['会员数']
ratio['占比'] = ratio['会员数']/ratio['会员数'].sum()
绘制饼图
ratio.loc[['白银会员','铂金会员','黄金会员','钻石会员'],'占比'].plot.pie(figsize=(16,8), autopct='%.2f%%',fontsize=16)
由于铂金会员/钻石会员占比较低, 绘图之前先调整在数据中的顺序, 让铂金会员和钻石会员在数据中不要挨着
pie 绘制饼图
autopct 控制显示饼图的占比数据图例 .2f% 表示保留两位有效数字
fontsize = 16 控制字体大小

5.会员分析-线上线下增量分析
代码实现
customer_info['会员来源'].value_counts()
从数据中看出, 主要来线下扫码, 计算每个月 线上线下的会员增量
# 方式1: groupby分组信息
online_offline = customer_info.groupby(['注册年月','会员来源'])['会员卡号'].count().unstack()
# 方式2: pirvot_table 透视表方式实现
online_offline = customer_info.pivot_table(index='注册年月',columns='会员来源',values='会员卡号',aggfunc='count')
数据可视化
online_offline[1:].plot(figsize=(16,8),grid=True)
plt.title('线上线下会员增量分析',fontsize=18)
plt.show()

01_matplotlib制作柱状图.py
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 创建一个图表和子图
fig, ax = plt.subplots()
# 定义水果名称列表
fruits = ['苹果', '蓝莓', '樱桃', '橘子']
# 定义每种水果的数量列表
counts = [140, 100, 80, 85]
# 定义条形图标签列表
bar_labels = ['green', 'blue', 'purple', 'orange']
# 定义条形图颜色列表
bar_colors = ['tab:green', 'tab:blue', 'tab:purple', 'tab:orange']
# 绘制条形图,参数包括水果名称、数量、标签和颜色
ax.bar(fruits, counts, label=bar_labels, color=bar_colors)
# 设置纵轴标签
ax.set_ylabel('水果供应情况')
# 设置图表标题
ax.set_title('各类水果供应情况对比')
# 添加图例,并设置图例标题
ax.legend(title='水果颜色')
# 显示图表
plt.show()
02_matplotlib制作饼图.py
# 导入matplotlib库中的pyplot模块,并重命名为plt
import matplotlib.pyplot as plt
# 设置matplotlib的参数,确保图表中的汉字能够正常显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字
# 设置matplotlib的参数,确保图表中的负号能够正常显示
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 定义饼图的标签和对应的数据
labels = '中国', '美国', '俄罗斯', '欧洲'
sizes = [115, 90, 100, 10]
# 创建一个图表和子图,并绘制饼图
explode = (0.1, 0, 0, 0) # only "explode" the 2nd slice (i.e. 'Hogs')
fig, ax = plt.subplots()
ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', pctdistance=1.2, labeldistance=0.5,
shadow=True, startangle=90)
# 显示图表
plt.show()
03_pyecharts制作柱状图.py
# 导入pyecharts库的相关模块
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker
# 打印Faker生成的随机数据值
print(Faker.values())
# 创建一个条形图实例
c = (
Bar()
# 添加x轴数据,使用Faker生成的随机选择
.add_xaxis(Faker.choose())
# 为商家A添加y轴数据,使用Faker生成的随机值
.add_yaxis("商家A", Faker.values())
# 为商家B添加y轴数据,使用Faker生成的随机值
.add_yaxis("商家B", Faker.values())
# 设置全局配置项,包括标题和副标题
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
# 渲染图表为HTML文件
.render("bar_base.html")
)
04_pyecharts制作饼图.py
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker
# 创建一个Pie实例,用于生成饼图
c = (
Pie()
# 添加数据到饼图中,数据是Faker生成的随机选择和随机值组成的列表
# 注意: 饼图要列表套元组的形式
.add("", [list(z) for z in zip(Faker.choose(), Faker.values())])
# 设置饼图的色彩,包括一系列预定义的颜色
.set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
# 设置全局配置项,包括标题配置
.set_global_opts(title_opts=opts.TitleOpts(title="Pie-设置颜色"))
# 设置系列配置项,包括标签格式化
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
# 渲染饼图为HTML文件
.render("pie_set_color.html")
)
05_列表推导式.py
# 需求: 生成1-10的一个列表
# 方式1: 原始方式
list1 = []
for i in range(1, 11):
list1.append(i)
print(list1)
# 方式2: 类型转换
list2 = list(range(1, 11))
print(list2)
# 方式3: 列表推导式
list3 = [i for i in range(1, 11)]
print(list3)
# 需求: 生成1-10的一个偶数列表
# 方式1: 原始方式
list1 = []
for i in range(1, 11):
if i % 2 == 0:
list1.append(i)
print(list1)
list11 = []
for i in range(2, 11, 2):
list11.append(i)
print(list11)
# 方式2: 类型转换
list2 = list(range(2, 11, 2))
print(list2)
# 方式3: 列表推导式
list3 = [i for i in range(1, 11) if i % 2 == 0]
print(list3)
list33 = [i for i in range(2, 11, 2)]
print(list33)
print('-------------------------------------------')
# [list(z) for z in zip(列表1, 列表2)]
# 定义水果名称列表
fruits = ['苹果', '蓝莓', '樱桃', '橘子']
# 定义每种水果的数量列表
counts = [140, 100, 80, 85]
# zip打包 fruit和count索引位置对应变成一对
zip = zip(fruits, counts)
print(zip)
# 列表类型转换
zip_list = list(zip)
print(zip_list)
06_零售会员分析案例.py
#%%
# 1.导包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 正常显示汉字
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
#%%
# 2.数据加载
df = pd.read_excel('数据集/会员信息查询.xlsx')
#%%
df.info()
#%%
df.head()
#%%
# 测试截取年月
df['注册时间'].head().dt.strftime('%Y-%m')
#%% md
# # 需求1: 计算每月注册会员数(会员月增量)
#%%
# 1.因为注册时间都是年月日时分秒,所以需要截取年月
df['注册年月'] = df['注册时间'].apply(lambda x: x.strftime('%Y-%m'))
#%%
df.head()
#%%
# 2.根据注册年月分组,统计会员数
# 注意:两种方式使用1种就行
# 方式1: 普通分组聚合
month_count = df.groupby('注册年月')[['会员卡号']].count()
# 方式2: 透视表方式
df.pivot_table(index='注册年月', values='会员卡号', aggfunc='count')
#%%
# 注意: 统计后month_count是s对象还是df对象, 需要查看
type(month_count)
#%%
# 3.默认分组聚合后的列名名称,叫会员卡号, 重命名为月增量
# s对象的列名是name设置, df对象的列名是columns设置
month_count.columns = ['月增量']
month_count
#%% md
# # 需求2: 计算每月会员存量
#%%
# 先查看增量情况
month_count
#%%
# 在增量基础上,cumsum()累加会员数
month_count['月存量'] = month_count['月增量'].cumsum()
#%%
# 最后查看月增量/存量情况
month_count
#%% md
# # 需求3:月增量和存绘图
#%%
# 基础绘图
month_count.plot(kind='line')
month_count.plot(kind='bar')
#%%
# 注意: 上述month_count直接调用plot(),增量和存量展示方式都一样,要么都是线,要么都是柱状图
# 接下来我们学习分开展示
month_count['月增量'][1:].plot(kind='line', color='red', secondary_y=True, legend=True, figsize=(10, 5))
month_count['月存量'][1:].plot(kind='bar', color='green', legend=True, ylabel='月存量')
plt.title('会员增量和存量图')
#%% md
# # 需求4: 计算各个月份各个等级的会员增量
#%%
# 查看已经截取出'注册年月'的新df数据
df.head()
#%%
# 需求: 按照注册年月和会员等级分组,统计会员数量
# 方式1: 普通分组聚合
member_rating = df.groupby(['注册年月', '会员等级'])[['会员卡号']].count()
# 修改列名
member_rating.columns = ['会员数量']
# 不想使用注册年月和会员等级,一起作为索引
member_rating.unstack()
#%%
# 方式2: 数据透视表
member_rating = pd.pivot_table(df, index='注册年月', columns='会员等级', values='会员卡号', aggfunc='count')
member_rating
#%%
# 基础绘图 注意: 铂金和钻石的会员数量比较小,四个一起绘制,大小不好展示
member_rating[1:].plot(figsize=(10, 5))
#%%
# 注意: 上述铂金和钻石的会员数量比较小,四个一起绘制,大小不好展示
# 分块两部分展示 白银和黄金一起用柱状图,铂金和钻石一起用折线图
fig, ax1 = plt.subplots(figsize=(10, 5), dpi=100)
# 构建双胞胎坐标系
ax2 = ax1.twinx()
# 绘制白银和黄金会员的图
member_rating[['白银会员', '黄金会员']][1:].plot(kind='bar', ax=ax1, ylabel='白银/黄金会员数量')
# 绘制铂金和钻石会员的图
member_rating[['铂金会员', '钻石会员']][1:].plot(kind='line', ax=ax2, ylabel='铂金/钻石会员数量')
ax2.legend(loc='upper left')
#%% md
# # 需求5: 各个月份各个等级会员增量占比
#%%
# 分析思路: 各个月份各个等级会员增量占比 = 各个月份各等级会员数量/各个月份会员总量
# 各个月份各等级会员数量在需求4中已经计算
# 1.只需要计算出各个月份会员总量即可,但是注意: 汇总的方向
member_rating['总计'] = member_rating.sum(axis=1)
#%%
# 2.分别计算白银/黄金/铂金/钻石会员占比
member_rating['白银会员占比'] = member_rating['白银会员'].div(member_rating['总计'])
member_rating['黄金会员占比'] = member_rating['黄金会员'].div(member_rating['总计'])
member_rating['铂金会员占比'] = member_rating['铂金会员'].div(member_rating['总计'])
member_rating['钻石会员占比'] = member_rating['钻石会员'].div(member_rating['总计'])
#%%
# 查看结果是否新增完毕
member_rating
#%%
# 绘图 使用占比数据绘制,因为钻石铂金比较少,此处直接忽略不计
member_rating[['白银会员占比', '黄金会员占比']][1:].plot(kind='bar', figsize=(10, 5))
#%%
# 注意: 当下member_rating数据是每个月的各个等级增量占比,不能直接用饼图展示
# 但是可以单独拿出指定月份数据展示或者整体所有月份重新计算占比展示
member_rating.loc['2017-09', ['白银会员占比', '铂金会员占比','黄金会员占比','钻石会员占比']].plot(kind='pie', autopct='%.2f%%', figsize=(10, 5))
# 设置标题
plt.title('2017年9月份会员等级增量占比')
#%% md
# # 需求6: 各个等级注册会员人数占比
#
#%%
# 1.先按照会员等级分组,统计会员数量
# 方式1: 普通分组聚合
ratio = df.groupby('会员等级')[['会员卡号']].count()
#%%
# 方式2: 透视表方式
ratio = df.pivot_table(index='会员等级', values='会员卡号', aggfunc='count')
#%%
# 2.修改列名
ratio.columns = ['会员数量']
#%%
# 3.计算占比
# 先计算总量
meber_all = ratio['会员数量'].sum()
# 计算每个等级占比
ratio['会员数量占比'] = ratio['会员数量'].div(meber_all)
#%%
# 4.可视化展示
# 注意: 铂金和钻石数量太小,那就不要挨着展示
ratio.loc[['白银会员','铂金会员','黄金会员','钻石会员'],'会员数量占比'].plot(kind='pie', autopct='%.2f%%', figsize=(10, 5))
# 设置标题
plt.title('截止到目前为止各会员等级增量占比')
#%% md
# # 每月线上线下增量情况
#%%
# 查看数据是否包含了年月
df.head()
#%%
# 需求: 按照注册年月和会员等级分组,统计会员数量
# 1.分组聚合
# 方式1: 普通分组聚合
df.groupby(['注册年月','会员来源'])[['会员卡号']].count().unstack()
# 方式2: 透视表方式
member_online_offline = df.pivot_table(index=['注册年月'],columns='会员来源', values='会员卡号', aggfunc='count')
#%%
# 2.可视化
# 默认折线图
member_online_offline[1:].plot(kind='line',figsize=(10, 5),grid=True,ylabel='会员数量',color=['red','green'])
# 设置标题
plt.title('各个会员来源增量')
test.py
#%%
# 导包
import pandas as pd
#%%
# 创建df对象,包含姓名,数量,时间
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六'],
'数量': [10, 20, 30, 40],
'时间': ['2020-01-01 10:55:03.977', '2020-01-02 10:55:03.977', '2020-01-03 10:55:03.977', '2020-01-04 10:55:03.977']
})
df
#%%
# 累加所有的数量
df['数量'].sum()
#%%
# 按照索引累加数量
df['数量'].cumsum()
#%%
# 按照日期截取出年月
df['时间'].str.slice(0, 7)
#%%
# 元组拆包
a = 10
b = 20
# 先执行后面的b,a打包,再执行=前面的拆包a,b
a, b = b, a
print(a,b)
#%%
更多推荐
所有评论(0)