Python 统计基础

Posted:   January 02, 2020

Edited:   January 02, 2020

Status:   Completed

Tags :   Python

Categories :   Python

Were equations, pictures or diagrams not properly rendered, please refresh the page. If the problem persists, you can contact me.

背景

Issue 399 ~蠎周刊 ~汇集全球蠎事儿 ;-)上看到 Python Statistics Fundamentals: How to Describe Your Data – Real Python,挺感兴趣,以后或许会用到,所以跟着学了一下。

文章介绍的很详细,有具体的代码,没有完全跟着做下来,部分代码见exercise/python/statistics

本文主要拎一些基本概念,应用场景,比较等。

小结

介绍了描述性统计的几种方法:

同一数据集内:

  • central tendency:就是通常我们说的平均,描述数据的居中趋势
  • variability:描述数据的分布情况
    • Variance: 方差
    • Standard deviation:标准差 = 方差的平方根
      • 数据离中心(平均数)有多远(求平均)
    • Skewness:偏斜度
      • 数据整体偏移情况
    • Percentiles:百分位数
      • 计算有 p% 的数少于等于某个值
    • Ranges:范围
      • 这个比较简单,即 最大值 与 最小值的差
  • visuability: 可视化上面这些量化后的数据

不同数据集间:相关性

  • 正相关
  • 负相关
  • 弱相关

两个主要统计量:

  • covariance:协方差
  • correlation coefficient:相关系数

这两个目前我理解起来还有点困难,待以后补

找到一篇据说是很不错的解释协方差的文章:关于协方差矩阵的概念及意义, 待看。

介绍了 4 个 统计相关的 python 模块/包:

这么多包怎么选:

  • 小数据集、或不想不能依赖其他包:自带 statistics
  • 数据集带标签(labelled,即有 headers),选 pandas,否则 scipy 或 numpy
  • scipy 比 numpy 的功能更多一些,比如 describe()方法等
  • 数据集中多包含 nan 数据,那选 pandas,它对包含 NaN 数据的处理更友好,不会返回 NaN

介绍了 1 个可视化工具:

样本和总体

在计算方差等方法时,得注意区分是样本还是总体,因为有个问题 为什么样本方差(sample variance)的分母是 n-1? - 知乎

python 的几个包中都有这方面的处理:

比如:

数据集中包含 not-a-number value (nan)

我从文章一路看下来,感觉 scipy 和 pandas 对 nan 的容忍度比较高,通常会忽略这些值,返回需要的结果,而其他包则经常返回 nan。

打包获取所有的统计量

scipy 和 pandas 提供了这种 describe 方法:

一次性返回包含所有统计量的结果集,很是方便,不用一个一个单独的方法调用了。

Numpy 是否也有类似的,作者没有提到,待查。

感悟

开始看的时候兴致勃勃准备跟着一起录一遍代码,后来发现,数学基础不行,很多基本概念不清,光知道调用什么函数方法没啥帮助,所以还是边看边捋了一遍基本概念。

基本概念学习

单一数据集:

算术平均数:最简单易懂,但容易受 outliers 影响 中位数:可以消除 outliers 影响

平均数

通常多有简单和加权

- 算术平均数: 这个都熟悉的,数据集中的所有数之和/总数

  • 加权平均数: Σᵢ(𝑤ᵢ𝑥ᵢ) / Σᵢ𝑤ᵢ.

    了解这个概念的时候,让我终于理解了 Using the Python zip() Function 。zip 就是拉链,把 𝑤ᵢ 和 𝑥ᵢ 交织在一起,有意思。

- 几何平均数:ⁿ√(Πᵢ𝑥ᵢ)

- 倒数平均数(Harmonic mean):

  • 数据集中的每个数先取倒数
  • 然后求和
  • 然后求算术平均数
  • 然后再求倒数

公式: 𝑛 / Σᵢ(1/𝑥ᵢ)

一个经典的应用:在距离相等的情况下,求平均速度。比如你从家到公司,再从公司到家。但如果你走了不同的路线,就得考虑加权调和了。

其他应用:

  • 机器学习里面,F1
  • 求利率,费率

原理:

  • 距离相等的情况下,速度不同,用时便不同;
  • 因此,平均速度会偏向用时比较少的那个速度
  • 所以,算术平均数在这里不够准确
    • 它是以速度(公里/小时)为基数,未考虑用时的偏移
    • 用时间作为权重,即加权平均数可以得到准确的平均速度
  • 倒数平均数则是反过来
    • 以用时(小时/公里)来计算,

启发:

  • 反过来想,反过来想

中位数

位于数据集中间的数,

  • 奇数个:0.5*(n+1)
  • 偶数个:0.5n, 0.5n+1

它和平均数的主要区别在于 outliers,就是一些特别大的或者特别小的数据,这些数据对中位数的计算影响不大,而平均数则很受影响。

现实中可记得,很多大赛,在计分的时候,都会“去掉一个最高分,再去掉一个最低分,选手的最终得分是 XXX”。这个最高分和最低分就是 Outliers。

Mode

出现最多的数。这个比较简单。

方差,标准差,协方差

// TODO

可视化

数据源

2D 数据,带标签或不带标签 (头)

Numpy-: `np.array([…])

Pandas:pd.DataFrame(a, index=row_names, columns=col_names)

可以用 np.random 生成一些样本数据,快速试验。

呈现样式图

  • Box plots
  • Histograms
  • Pie charts
  • Bar charts
  • X-Y plots
  • Heatmaps

具体视需求而定,每种图都有不同的数据输入要求。

工具

>>> import matplotlib.pyplot as plt
>>> plt.style.use('ggplot')

基本就是类似以下三步:再加上一些坐标轴、样例等

fig, ax = plt.subplots()
ax.boxplot((x, y, z), vert=False, showmeans=True, meanline=True,
           labels=('x', 'y', 'z'), patch_artist=True,
           medianprops={'linewidth': 2, 'color': 'purple'},
           meanprops={'linewidth': 2, 'color': 'red'})
plt.show()

扩展

关于可视化,还有其他工具:

参考

ChangeLog

  • 2020-01-02 init

Comments


Be the first one to comment on this page!
You can use extended GitHub flavored markdown in your comment. Commenting FAQs & Guidelines