数据可视化第5周:常用图表对比

数据可视化第五周

常用图表对比,当我们需要展示的时候,该如何选择图表?

根据学习提供的思路:

🔽可视化目标

🔽数据集格式

🔽图表异同

🔽适用场景

在这里插入图片描述

一.常用图表的对比
  1. 柱状图&条形图

在这里插入图片描述

联系:

🔽 两者均是两个字段,一个代表分类,另一个代表数值。

🔽当数据的记录数不大于12条,分类字段的字符长度小于5时,两者可以互换。

区别:

🛰柱状图:如果分类字段时时间序列,可以优先使用柱状图,能更好的体现数据随着时间变化的情况。

🔼条形图:如果分类字段字符长度较长,且数据的记录数大于12,建立用条形图。

  1. 柱状图&直方图

在这里插入图片描述
举例:如不同品类的商品销售数量,或者在不同区间对应数值关系,如

价格区间订单数
[0,10)10
[10,50)27
[50,100)30

类似的数据关系,频数,可以用直方图表示。

联系:

🔽柱状图和直方图有相同的数据结构,都是由一个分类/分组字段+一连续数值字段,构成的柱条状结构

区别:

🔽直方图显示的是数据分布情况,柱状图则是比较数据的大小

🔽直方图是连续数据的分组,柱状图则是分类

  1. 堆叠柱状图&百分比堆叠柱状图

在这里插入图片描述

  • 联系:对分类数据构成对比或构成时间的变化趋势,一般对时间序列来使用,或者分类时使用。

  • 区别:

​ 🔽 堆叠柱状图既可以对比各构成部分的数值差异,还可以对比各组数据的整体差异。

​ 🔽百分比堆叠柱状图,只能对整体中各构成部分做分析,但是整体都是1(100%)

  1. 折线图&面积图

在这里插入图片描述

在这里插入图片描述

  • 联系
    • 关于与时间趋势相关数据展示
  • 区别
    • 面积图来映射数值的大小,面积图用来表示整体及其构成部分随时间的变化趋势;但是折线图却不能展示构成比例关系
    • 面积图表示多系列的趋势,需要用不同系列颜色的面积区块设置透明度
    • 当系列过多时,可以用折线图表示
  1. 堆叠面积图&百分比堆叠面积图

在这里插入图片描述
如:某集团由电商/物流/云计算三块的业务构成,现需要展示2015~2019,三大业务对集团的年度收入的贡献比例。总收入=电商业务收入+物流业务收入+云计算收入

  • 联系
    • 堆叠面积图和百分比面积图,均可以是时间序列的数值,都可以展示随时间的变化趋势
  • 区别
    • 堆叠面积图是构成部分随时间变化的趋势,而百分比堆叠面积图展示的是构成各部分的占比的趋势。
    • 堆叠面积图可以展示部分和整体的变化趋势,而百分比堆叠面积图则是各构成部分的变化趋势,不能表示整体,因为整体总是100%。
  1. 堆叠面积图&堆叠柱状图

在这里插入图片描述
展示如:

👟 某个国家近6年来GDP的增长趋势及其三大产业的产值趋势;

👟 2019年第二季度,6大主流手机品牌的总出货量排名,及其各品牌在5大洲的出货量对比。

  • 联系

    • 堆叠面积图和堆叠柱状图,两者的数据集都类似,一个分类和多组数据
    • 都具有在每个节点各分类数据进行对比的功能
  • 区别

    • 堆叠面积图一般都是时间序列,其中既有整体的变化趋势也有各分类的变化趋势
    • 堆叠柱状图一般可以是非时间类型的分类数据,对整体和各部分大小变化展示。一般如果整体项构成过多时,可以展示TOP5,其余的则归为其他。
  1. 散点图&气泡图

在这里插入图片描述
对于这里有些疑问,材料里面介绍展示华为不同型号手机的售价和成本的分布,或者再加一个销量,不同型号受是否是用了不同颜色来表示,应该是这样子的。

  • 联系
    • 散点图和气泡图都可以用来展示数据分布情况。
    • 两者均可以展示多组数据系列的分布
  • 区别
    • 散点图,一般是二位数据展示,表示两者之间相关性
    • 气泡图,展示三位数据分布情况,气泡大小事多出来的一个维度。当数据量过多时,气泡图则不适合展示。
    • 当数据两比较多时,一般可以选取抽样,分层抽样,具体场景具体分析。
二.实践
  1. 数据结构:在这里插入图片描述

  2. 问题:

    根据一下可视化目标,自行构建数据集格式,并选择合适图表进行可视化呈现。

    1. 了解一下全部发货物品的单价的分布情况,每10元作为一个区间?
    2. 展示销售额TOP5的产品二级大类
    3. 按月份展示商品的销售数量趋势
    4. 展示不同年份的商品的销售数量,及其不同年份三种运输方式的数量占比
  3. 分析:拿到题目,

    (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,可以体现数据大体的分布。

  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,则只需要把前五保留绘制图形即可。

  1. 按月份展示商品的销售数量趋势,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
    
    1. 展示不同年份的商品的销售数量,及其不同年份三种运输方式的占比,这里可以用堆叠柱状图,这有一个整体的数量,还有整体下的三种运输数量的占比,取数据年份/销售数量/运输方式,按照年份,运输方式进行分组汇总:

      #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.com/sheet/DTGdGQW5pUG15d0lv?c=C8A0A0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值