数据可视化第五周
常用图表对比,当我们需要展示的时候,该如何选择图表?
根据学习提供的思路:
🔽可视化目标
🔽数据集格式
🔽图表异同
🔽适用场景
一.常用图表的对比
- 柱状图&条形图
联系:
🔽 两者均是两个字段,一个代表分类,另一个代表数值。
🔽当数据的记录数不大于12条,分类字段的字符长度小于5时,两者可以互换。
区别:
🛰柱状图:如果分类字段时时间序列,可以优先使用柱状图,能更好的体现数据随着时间变化的情况。
🔼条形图:如果分类字段字符长度较长,且数据的记录数大于12,建立用条形图。
- 柱状图&直方图
举例:如不同品类的商品销售数量,或者在不同区间对应数值关系,如
价格区间 | 订单数 |
---|---|
[0,10) | 10 |
[10,50) | 27 |
[50,100) | 30 |
类似的数据关系,频数,可以用直方图表示。
联系:
🔽柱状图和直方图有相同的数据结构,都是由一个分类/分组字段+一连续数值字段,构成的柱条状结构
区别:
🔽直方图显示的是数据分布情况,柱状图则是比较数据的大小
🔽直方图是连续数据的分组,柱状图则是分类
- 堆叠柱状图&百分比堆叠柱状图
-
联系:对分类数据构成对比或构成时间的变化趋势,一般对时间序列来使用,或者分类时使用。
-
区别:
🔽 堆叠柱状图既可以对比各构成部分的数值差异,还可以对比各组数据的整体差异。
🔽百分比堆叠柱状图,只能对整体中各构成部分做分析,但是整体都是1(100%)
- 折线图&面积图
- 联系
- 关于与时间趋势相关数据展示
- 区别
- 面积图来映射数值的大小,面积图用来表示整体及其构成部分随时间的变化趋势;但是折线图却不能展示构成比例关系
- 面积图表示多系列的趋势,需要用不同系列颜色的面积区块设置透明度
- 当系列过多时,可以用折线图表示
- 堆叠面积图&百分比堆叠面积图
如:某集团由电商/物流/云计算三块的业务构成,现需要展示2015~2019,三大业务对集团的年度收入的贡献比例。总收入=电商业务收入+物流业务收入+云计算收入
- 联系
- 堆叠面积图和百分比面积图,均可以是时间序列的数值,都可以展示随时间的变化趋势
- 区别
- 堆叠面积图是构成部分随时间变化的趋势,而百分比堆叠面积图展示的是构成各部分的占比的趋势。
- 堆叠面积图可以展示部分和整体的变化趋势,而百分比堆叠面积图则是各构成部分的变化趋势,不能表示整体,因为整体总是100%。
- 堆叠面积图&堆叠柱状图
展示如:
👟 某个国家近6年来GDP的增长趋势及其三大产业的产值趋势;
👟 2019年第二季度,6大主流手机品牌的总出货量排名,及其各品牌在5大洲的出货量对比。
-
联系
- 堆叠面积图和堆叠柱状图,两者的数据集都类似,一个分类和多组数据
- 都具有在每个节点各分类数据进行对比的功能
-
区别
- 堆叠面积图一般都是时间序列,其中既有整体的变化趋势也有各分类的变化趋势
- 堆叠柱状图一般可以是非时间类型的分类数据,对整体和各部分大小变化展示。一般如果整体项构成过多时,可以展示TOP5,其余的则归为其他。
- 散点图&气泡图
对于这里有些疑问,材料里面介绍展示华为不同型号手机的售价和成本的分布,或者再加一个销量,不同型号受是否是用了不同颜色来表示,应该是这样子的。
- 联系
- 散点图和气泡图都可以用来展示数据分布情况。
- 两者均可以展示多组数据系列的分布
- 区别
- 散点图,一般是二位数据展示,表示两者之间相关性
- 气泡图,展示三位数据分布情况,气泡大小事多出来的一个维度。当数据量过多时,气泡图则不适合展示。
- 当数据两比较多时,一般可以选取抽样,分层抽样,具体场景具体分析。
二.实践
-
数据结构:
-
问题:
根据一下可视化目标,自行构建数据集格式,并选择合适图表进行可视化呈现。
- 了解一下全部发货物品的单价的分布情况,每10元作为一个区间?
- 展示销售额TOP5的产品二级大类
- 按月份展示商品的销售数量趋势
- 展示不同年份的商品的销售数量,及其不同年份三种运输方式的数量占比
-
分析:拿到题目,
(1)题目1 其中可直观感觉是要用直方图,每10作为一个区间进行展示需要对数据进行汇总计算
通过python 计算,获得单价数据其统计数据值:
count 300.000000 mean 90.062233 std 270.083912 min 1.680000 25% 6.670000 50% 20.195000 75% 69.330000 max 3502.140000
由上面数据可知,一共有300组数据,最小值为1.68 ,最大值为3502.14,如果按照每10 各一组 ,MAX-MIN=3502.14-1.68 = 3500.46 ,3500.46/10= 350组数据,这里划分为351组,划分:
区间 频数 [0,10) [10,20) [20,30) [30,40) [40,50) … [3480,3490) [3490,3500) [3500,3510) 当在计算时,通过查找python实现方式,可以直接通过以下方式快速实现,不过区间范围,则根据程序绘画成了另外的区间范围:
#等价格为350给区间 quartiles =pd.cut(price,350) #定义聚合函数 def get_stats(group): return {'amount': group.count()} #分组统计 groupd = price.groupby(quartiles) price_bucker_amount = groupd.apply(get_stats).unstack()
得到数据结果为:
(-1.82, 11.681] 120
(11.681, 21.683] 36
(21.683, 31.684] 20
(31.684, 41.685] 20
(41.685, 51.687] 8
(51.687, 61.688] 5
(61.688, 71.689] 17
(71.689, 81.691] 2
(81.691, 91.692] 3
(91.692, 101.693] 6
(101.693, 111.694] 4
(111.694, 121.696] 4
(121.696, 131.697] 10
(131.697, 141.698] 3
(141.698, 151.7] 5
(151.7, 161.701] 2
(161.701, 171.702] 0
(171.702, 181.704] 5
(181.704, 191.705] 0
(191.705, 201.706] 4
(201.706, 211.708] 3
(211.708, 221.709] 2
(221.709, 231.71] 0
(231.71, 241.712] 1
(241.712, 251.713] 1
(251.713, 261.714] 0
(261.714, 271.715] 0
(271.715, 281.717] 0
(281.717, 291.718] 1
(291.718, 301.719] 0
... ...
(3472.136, 3482.137] 0
(3482.137, 3492.139] 0
(3492.139, 3502.14] 1
由于数据量比较多,且分析后认为绝大多数数据集中在前1/10处,上面图形展示不方便查看,同时结合统计数据量,
mean 90.062233
std 270.083912
min 1.680000
25% 6.670000
50% 20.195000
75% 69.330000
max 3502.140000
中位数为20.195,且std标准差为270左右,而且由四分位数位6.67,四分三分位数为69.33,因此可以选区70一下数据重新进行直方图展示:
其中这数据含有225,225/300 = 75%左右,占所有数据中的75%,涵盖了箱型图上下四分位数中的数值,
单价
(1.613, 11.27] 119
(11.27, 20.86] 32
(20.86, 30.45] 17
(30.45, 40.04] 26
(40.04, 49.63] 8
(49.63, 59.22] 4
(59.22, 68.81] 19
取,数值在单价<200的数值绘制图形,(总数据量300,<200的数据取值有274个):
基本能够体现数据分布情况,因为后面数据每个区间基本为0,或者为1,可以体现数据大体的分布。
-
展示销售额TOP5的产品二级大类,按照产品二级大类进行分组,并进行求和,排序后进行柱状图展示
#coding=utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt import squarify plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus']=False #解决负数坐标显示 df = pd.read_excel(r'd://excel/ksjweek5_ds.xlsx',sheet_name=0) #print(df.head()) #定义聚合函数 def get_stats(group): return {'amount': group.sum()} #分组统计 groupd = df['销售额'].groupby(df['产品二级子类别']) price_bucker_amount = groupd.apply(get_stats).unstack() print(price_bucker_amount.sort_values(by='amount',ascending=False)) new_result = price_bucker_amount.sort_values(by='amount',ascending=False) new_result.plot(kind='bar') plt.show()
产品二级子类别 办公机器 110071.020 电话通信产品 84453.586 桌子 68514.348 容器,箱子 42704.190 椅子 24924.980 办公装饰品 24796.430
取TOP5,则只需要把前五保留绘制图形即可。
-
按月份展示商品的销售数量趋势,X坐标轴可以是月份,然后各类产品名称作为分类,采用折线图这是每个产品在不同月份的销量。如果要是带有城市,则每个城市各个产品销售趋势,或者再加上省份/区域,可能有需要其他的形式。这里仅以折线图进行展示:
用折线图统计,按照订单日期/产品名称进行分组汇总销售数量求和,然后绘制曲线:
#coding=utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt import squarify plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus']=False #解决负数坐标显示 df = pd.read_excel(r'd://excel/ksjweek5_ds.xlsx',sheet_name=0) #print(df.head()) #定义聚合函数 def get_stats(group): return {'amount': group.sum()} #分组统计 groupd = df['商品数量'].groupby([df['订单日期'],df['产品名称']]) price_bucker_amount = groupd.apply(get_stats).unstack() print(price_bucker_amount)
订单日期 产品名称 2009-01-05 Rediform Wirebound "Phone Memo" Message Book, 1... 24 2009-01-07 i1000 34 2009-01-10 Imation 3.5, DISKETTE 44766 HGHLD3.52HD/FM, 10/... 30 2009-01-14 Hoover Commercial Soft Guard Upright Vacuum And... 27 Okidata ML184 Turbo Dot Matrix Printers 23 Xerox 1939 13
这里遇到一个问题,就是这样的数据如何快速绘制出折线图或者其他图形,如何进行数据转化为类似:
订单日期 产品名称1 产品名称2 ..... 2009-01-05 24 10 2009-01-06 34 15
汇总到月份,或者直接从开始处理时间为年月,直接分类汇总,但这遇到一个问题,python如何实现
年月 产品名称 2009/01 Hoover Commercial Soft Guard Upright Vacuum And... 27 Imation 3.5, DISKETTE 44766 HGHLD3.52HD/FM, 10/... 30 Newell 340 41 Okidata ML184 Turbo Dot Matrix Printers 23 Rediform Wirebound "Phone Memo" Message Book, 1... 24 Xerox 1939 13 i1000 34 2009/02 #10- 4 1/8" x 9 1/2" Recycled Envelopes 4 Computer Printout Paper with Letter-Trim Perfor... 3 Eldon® Expressions™ Wood and Plastic Desk Acces... 15
-
展示不同年份的商品的销售数量,及其不同年份三种运输方式的占比,这里可以用堆叠柱状图,这有一个整体的数量,还有整体下的三种运输数量的占比,取数据年份/销售数量/运输方式,按照年份,运输方式进行分组汇总:
#coding=utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt import squarify plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus']=False #解决负数坐标显示 df = pd.read_excel(r'd://excel/ksjweek5_ds.xlsx',sheet_name=0) #print(df.head()) #yymm = pd.to_datetime(df['订单日期'],format='%Y%M%d') #print(yymm.dt.year) #sell = pd.DataFrame(df['','销售额']) #print(sell) #定义聚合函数 def get_stats(group): return {'amount': group.sum()} #分组统计,excel表中数据加了一列年份 groupd = df['商品数量'].groupby([df['年'],df['运输方式']]) price_bucker_amount = groupd.apply(get_stats).unstack() #dfvalue = pd.DataFrame(price_bucker_amount,index =price_bucker_amount['订单日期'],columns=price_bucker_amount['产品名称']) print(price_bucker_amount)
#部分数据示例: amount 年 运输方式 2009 大卡 214 火车 1299 空运 105 2010 大卡 288 火车 1753 #这里绘图使用了excel,python数据转换暂时还没搞明白怎么做
-
作业地址:
https://docs.qq/sheet/DTGdGQW5pUG15d0lv?c=C8A0A0
更多推荐
数据可视化第5周:常用图表对比
发布评论