美文网首页解密大数据
说说统计图表 | Daily Python

说说统计图表 | Daily Python

作者: 张利东 | 来源:发表于2017-07-19 08:08 被阅读325次
    statistic-diagram.png

    首发于微信公众号东哥夜谈。欢迎关注东哥夜谈,让我们一起聊聊个人成长、投资、电影、音乐、运动等话题。
    本帐号所有文章均为原创。文章可以随意转载,但请务必注明作者。如果觉得文章有用,欢迎转发朋友圈分享。


    0. 前言

    跟着鱼老师的PPT,大致整理了一下图表的相关内容。最后一个问题 RcParams 的设置把我给难住了,无论如何解不出来……

    实际上我真想要的也不是RcParams到底怎么设置这条鱼,而是如何查找相关资料这个渔。

    唔,好多鱼……

    1. 背景

    解密大数据社群在第一节热身之后,直接开讲数据可视化,可见可视化在数据分析之中的重要性。图表的好处在于,把精确的数字用更利于人类识别的方式展现出来,让人类的创造力得意充分释放。所以,用好图表是学习数据统计的第一步。Matplotlib 是 Python 中用的最广泛的图形库之一,值得好好研究。

    2. 内容

    Matplotlib 图形中,各主要内容如下图所示:

    Matplotlib-python

    根据课程内容,整理最常用的几种图表类型如下。

    2.1 直方图(Histogram)和条形图(Bar Chart)

    用「Bar Chart Histogram」为关键字搜了一下,出来很多文章讨论 Bar Chart 和 Histogram 的区别。需要这么特殊的讨论说明其区别不大,对我而言都是用来表示一组数据分布的柱状图,没啥大区别。下面就都统一称为柱状图(Bar Chart)罢。

    柱状图主要用来把数据集合成一组,然后取其和或平均值之类画图。这样的好处是可以避免数据因上下偏差导致遮盖其规律。最典型的应用应该是年龄分布了吧。

    至于在 matplotlib 里面,plt.hist(data) 只需输入数据即可,plt.bar(x, y) 则需要同时给出 x 轴和 y 轴的数据。

    2.2 箱图(box diagram)

    箱图这个比较高端,可以直接给出数据统计比较关键的一些数据,比如各分位数之类。可惜名字略显低端,俺觉得叫诸如分位图之类的更显得高大上一点。

    关于分位数/中位数之类的概念,根据维基百科整理如下

    分位数(英语:Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。

    至于四分位数,有

    四分位数即把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。

    所以,有如下定义

    1. 第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。
    2. 第二四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。
    3. 第三四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。

    这个图信息量比较大,我觉得可以用来观察离散值的分散程度。比如最大值和最小值的偏差,Q3-Q1 的间距之类。显然 Q3-Q1 越小数据越密集,越大则分布越分散。

    不过貌似是个初期用来观察分析用的,对实际决策并没有太大价值……

    2.3 饼状图(Pie Chart)

    人家是馅饼,不是普通的饼啦啦~~

    饼状图最常用在展示比例上,比如男女比例、投票比例之类。概念简单,形象直观。

    2.4 散点图(Scatter diagram)

    散点图将数据按照最原始的方式在坐标系中以点集的方式展现,可以说是最原始的图表。这种图表有两种好处,一是可以用最原始、未加工的方式展现图表,最具可靠性;二是直观,给人完全无束缚的发挥空间。

    散点图通常可以作为数据分析的第一步,然后需要数据工程师在其中发现下一步可供分析的内容。

    2.5 多变量 – 矩阵图(scatter_matrix)

    scatter_matrix 不是 matplotlib 包的内容,包含在 pandas 里面。它可以把 pandas 里面的各数据组成矩阵,用以批量生成相关图形。这样便方便一次性很直观的观察到数据之间的关系了。

    scatter_matrix.png

    2.6 图表设置

    2.6.1 常用图元设置

    图表常用的最主要一些图元设置可以参考如下:

    • plt.xlabel()
    • plt.ylabel()

    这个可以用来设置 x 轴和 y 轴的坐标轴标签。

    • plt.title()

    设置图形标题。

    • plt.xscale(‘log’)
    • plt.xticks(tick_val, tick_lab)

    设置X轴刻度。轴刻度默认为线性,log 表示对数坐标。呃,尴尬症表示有一次被高大上了。关于 xticks,查文档描述为 matplotlib.pyplot.xticks(*args, **kwargs)

    说实话,每次看到*args, **kwargs,我就感觉自己陷入了死胡同。好在后面的代码里有写 locs, labels = xticks(),也即两个参数分别表示位置和标签。

    呃,还能更不直观一些么?

    • plt.scatter(x,y,s=size,c=color, alpha=alpha)

    散点图,可以设置点的大小、颜色和透明度。

    • plt.grid(True)

    控制是否显示栅格,默认为关。不明白为什么,显然应该默认显示为开啊。

    2.6.2 图表设置

    鱼老师在设置中文字体的时候用到了 plt.rcParams 命令。查了一下,这是个动态改变绘图参数的命令。rc settings 被存储在 matplotlib.rcParams 变量里,这个变量类似词典,所以赋值的时候用的是方括号[]

    不过,谁能知道这个 rc 是什么意思?文档里也没有解释,感觉怪怪的啊。

    鱼老师在视频中用rcParams改变了字体。我试着在文档里找了找,看还能改变些什么以及如何改变,但遍翻文档而不得。

    • matplotlib.rcParams 显示,这个设置时类 RcParams 的一个实例;
    • RcParams 显示,RcParams 里面的东西和matplotlib.rcsetup相关;
    • rcsetup 里却给出一些奇怪的验证信息,没有列出我想要的我能改变什么参数及如何改变的相关资料;

    至此,没了从文档里面查找资料的路子。遂决定试试Python自带的帮助行不行。

    In [1]: import matplotlib as mp
    In [3]: dir(mp.RcParams)
    Out[3]:
    ['__class__',
     '__contains__',
     '__delattr__',
     ……
     'popitem',
     'setdefault',
     'update',
     'validate',
     'values']
    

    这里没有直接得出我想要的东西。试试看item里面是不是能有。

    In [5]: mp.RcParams.items()
    
    TypeError: descriptor 'items' of 'dict' object needs an argument
    

    貌似items类似dict,需要提供key。那就看看key里面有什么

    In [7]: mp.RcParams.keys()
    
    TypeError: keys() missing 1 required positional argument: 'self'
    
    In [8]: mp.RcParams.keys(self)
    
    ----> 1 mp.RcParams.keys(self)
    
    NameError: name 'self' is not defined
    

    晕死。self不应该是指自己么?我怎么定义?又陷入了死胡同。看看帮助吧。

    In [9]: help(mp.RcParams.keys)
    Help on function keys in module matplotlib:
    
    keys(self)
        Return sorted list of keys.
    

    这帮助可真简洁,简洁到几乎啥都没说。突然想到,也许items需要的不是key呢?试试items的帮助吧?

    In [10]: help(mp.RcParams.items)
    Help on method_descriptor:
    
    items(...)
        D.items() -> a set-like object providing a view on D's items
    

    囧,这些信息完全没有怎么使用嘛。再试试values?

    In [11]: help(mp.RcParams.values)
    Help on function values in module matplotlib:
    
    values(self)
        Return values in order of sorted keys.
    

    好吧,我承认到现在我败了。在线文档查了,帮助文件试了,但找不到RcParams的具体内容啊……

    我比较好奇,专业人士遇到这类问题都是怎么解决呢?总不能挨个问人吧?按说查文档是最有效的方法。是我的检索方式不对么?

    2.7 帮助检索 Update

    就在文章发出去后,因为没能搞定挺沮丧的,就坐在那里发呆。

    突然间想到,rcParams是个类似词典的变量,那直接打印不就可以么?结果……

    In [1]: import matplotlib.pyplot as plt
    
    In [2]: print(plt.rcParams)
    _internal.classic_mode: False
    agg.path.chunksize: 0
    ……
    ytick.minor.visible: False
    ytick.minor.width: 0.6
    ytick.right: False
    

    唉,可惜了我一个晚上加一个早上的时间了……

    3. 总结

    本以为社群会集中讲解 pandas 这个数据分析之瑞士军刀,谁知鱼博士告知,课程主要讲的是统计与分析,pandas 只不过是手段,需要自己搞定的……

    想想也正常。社群的价值在于思考方式、思维模式,而不应该是手把手教大伙怎么用一个工具。毕竟这是个面向成人的再教育,而不是像大学那样坐课堂里面听讲课。

    看来还是自己犯懒了。


    东哥夜谈

    相关文章

      网友评论

        本文标题:说说统计图表 | Daily Python

        本文链接:https://www.haomeiwen.com/subject/fsikkxtx.html