python与统计学 - 概述之基础概念

1 前言

前段时间因为研究了一下量化的东西,接触到了python科学计算相关的内容。结果是猛然发现自己以前的统计学都白学了,很多相关的知识都还给了老师。

然后我就找来本统计学的书看,看了一段后,忽然发现,使用python结合书本里的东西一起看,边看边写代码,觉得自己的理解比以前深多了 – 为什么以前在学校里老师教概率论与统计学时不一边使用python工具来结合学习呢?我上网搜了一搜,发现系统讲这个的还真不多,而且自己也想记录下自己所学以加深自己的印象。于是就想边学边记,也一边强迫自己不要放弃。

结合python来学习统计学知识,本系列希望大家可以跟着我一起学习,主要是学习统计学知识,然后使用python来应用之,解决一些日常可能会用到的问题。我们会一边学习一边思考,希望可以将所学用在如投资交易、数据分析、数据化运营这种生活或工作中的应用上。

2 统计学主要是研究些什么?怎样研究之?

统计学主要是研究些什么呢?用我的话来解释就是,首先前提是你要有研究的对象,然后我们用各种量化的方法给这些对象以度量,也就是可以将之数字化。比如你要研究一个地区的小朋友的发育正不正常,我们用高度这个度量去将之量化,然后求出这个地区小朋友的平均高度与其它地方相比,从而推断出这个地区的小朋友发育正不正常。

统计学之所以谓之统计,就是对研究对象量化后的数据加以统计研究,从中看出他们的规律。然后再希望可以利用这些个规律进行推测。

而前者,我们称之为描述性统计,即通过数据分析得出其中的规律。后者称之为推断性统计,利用分析出的规律作出推测。

那么这个研究是怎么展开的呢?首先我们要定义下研究的对象,也就是什么是总体,什么是样本。也顺便解释下这些个术语。

2.1 总体与样本,统计量与参数

  • 总体(Population) - 我们要研究的特定类别的所有成员。
  • 样本(Sample) - 从总体中抽样出的一个子集。

看概念比较抽象,简单来说下总体,如果我们要研究A股中所有股票涨跌的规律,那么,我们要研究的总体就是A股中所有的股票(这里的特定类别就是A股,不是基金也不包括纳斯达克)。而样本呢,就是我们不可能把所有的股票都研究个遍,我们从中抽出10支股票来分析,这10支股票就是我们研究的样本。(比如我们常听到的上证300指数,就是从中抽了有代表性的300支股票,以它们的走势加权代表了大盘的走势)

  • 参数(Parameter)
  • 统计量(Statistic)

参数是来自于总体的,比如全班同学的平均身高,就是一个参数,它取之于总体,用于之总体。我们先这样记着。。而统计量相似,取之于样本用之于样本。我们只需要这样死记硬背:

1
2
总体 --> 参数
样本 --> 统计量

这其实记住就行了,因为我们要做的通常就是通过容易获得的统计量来推测总体的参数。比如我们通过上证300的股价做出的指数作为统计量,来对整个大盘参数的做出定论。

2.2 量化

我们要研究的东西有具体的也有抽象的,但是要科学地对之进行分析,我觉得关键就在于量化。这里的量化不是我们常说的量化交易,而是将研究数字化,从而可以运用数学的知识对之进行研究。

常用的量化手段有4种:定类、定序、定距、定比。

定类 :比如男性用“0”表示,女性用“1”表示。就是利用无权重的值作为符号来识别变量的不同水平。这样我们就可以将之用数字化的形式表示在图表中或数据库中,比如我们统计男女身高上的差异就利用这种方式来表达。

定序 : 比如富豪排行榜,排第1的取1,排第2的取2.

定距定比: 就是将研究对象用相同的单位测量后,再作比较。比如A高180cm, B高150cm,是一个距离的维度。定比的话比如摄氏度。

3 使用python模拟统计学研究对象

3.1 常用的python科学库

我们在python中常用3个库来作科学运算:numpypandasmatplotlib

  • 其中numpy是常用的科学运算库,擅长高维数组、矩阵的运算。
  • pandas 也是常用的科学运算库,特别擅长统计学的运算与有大量的数据分析方法。
  • matplotlib - 绘图库,可以将分析得到数据直观地展现出来。

一般在py文件中我们这样导入他们:

1
2
3
import numpy as np
import pandas as pd
import matplotlib as mtl

3.2 使用python生成统计总体、样本及显示

我们常使用numpyrandom.choice(a, size, replace, p)方法来模拟一个总体或样本。

我先来小解释下这个方法,比如下面的代码:

生成随机投100遍骰子的结果
1
2
3
4
5
6
7
result = np.random.choice(a=[1,2,3,4,5,6], size=100, replace=True, p=[1/6, 1/6, 1/6, 1/6, 1/6, 1/6])
print(result)

# --- output:
# > [4 2 1 1 5 5 2 5 6 4 2 5 1 6 6 5 3 6 1 5 5 3 2 5 3 4 6 4 6 2 2 5 6 2 2 3 1
# 5 3 4 3 5 1 6 1 1 1 1 6 5 3 2 4 4 6 5 2 5 4 2 4 1 2 5 1 4 6 5 6 3 6 4 1 5
# 2 5 4 5 4 4 6 6 1 2 2 4 4 3 5 2 2 1 5 2 1 5 5 1 4 2]

在上面的方法里,a表示一个随机变量的所有取值(也就是我们投一个骰子可能得到的所有结果)。 size就是随机实验的次数(投多少次骰子,就得到多少次结果)。replace表示是否独立实验,也就是每次抽到的样品要不要放回去(搁这里就是每次投到的数字下次还算不算数,我这里为True,就是当然算数)。p就是每个取值抽样的概率,这里每个面投到的概率是一样的,都是 1/6,其实直接p=None就可以了,表示每个取值的概率都是一样的。

然后从输出的结果我们就可以看到模拟出来了投100遍骰子的结果。

再比如我们模拟全公司50个人的身高统计

模拟全公司50个人的身高统计
1
2
3
4
5
6
7
population = np.random.choice(a=range(150,180), size=50, replace=True, p=None)
print(population)

# - output:
# > [155 159 175 162 161 158 163 168 177 165 156 157 169 170 178 152 166 172
# 168 161 155 165 152 173 177 160 165 162 154 164 151 156 169 168 164 156
# 179 171 174 164 155 155 163 173 165 172 177 158 153 152]

这里 range生成从150到180这么多数的数组作为抽样所有可能取值,也就是我假设公司的人高度都在 150cm到180cm之间。size=50,抽50人。这样就得到了一个总数是50的总体。

3.2.1 抽样

其实你可以先想下,那么我们要从这50人中抽10个人的样本,怎么抽样呢?(建议你先不要往下看,自己思考一下)

哈哈哈,答案如下:

这50人的身高总体中抽10个人的样本
1
2
sample = np.random.choice(a=population, size=10, replace=False, p=None)
print(sample)

其实很简单,也是使用 random.choice(),从先前生成的population总体中再 choice出来就OK了,注意下,这里replace=False,你自己思考下为什么。

3.2.2 图表显示数据

可以使用 matplotlib.pyplot来作出简单的曲线图,比如我们要将上面讲到的10人样本输出,我下面给出py文件的全部源代码:

公司50人中随机抽样10人的身高源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def _showArray(array, title='My Matrix'):
plt.plot(array)
plt.title(title)
plt.show()


def main():
population = np.random.choice(a=range(150,180), size=50, replace=True, p=None)
print(population)
sample = np.random.choice(a=population, size=10, replace=False, p=None)
print(sample)
_showArray(sample,'公司50人中随机抽样10人的身高曲线图')

if __name__ == '__main__':
main()

运行上述脚本,会成生如下的图片:

py-statistics-foudation-char

4 小结

我们本章学会了统计学是研究些什么的,有什么用。学习了总体-参数、样本-统计量的概念。学会了怎样使用python模拟生成一个总体与抽样,并使用图表显示出来。

路漫漫其修远兮,吾将上下而求索

5 引用

  1. Timothy C.Urdan著,彭志文 译 -《白话统计学》 - 适合统计学入门的书,个人认为讲的很清楚,没太多深奥的推导。
  2. 韦斯·麦金尼(Wes McKinney)著,徐敬 译 -《利用Python进行数据分析》
  3. 《量化投资-以python为工具》 - 蔡立耑著 - 讲述了使用python进行量化投资实战;一本比较全面基础的介绍量化的书,讲的面比较广,适合作为导论来看,然后每个细分的领域再借由网上的资料或其它书籍做补充,总的来说算是我的学习引导。
  4. 《程序员的数据之概率统计-平冈和幸》 - 主要讲解概率统计,讲得非常细而且语言通俗易懂,适合非数学专业人事学习。
  5. 《概率论与数理统计-陈希孺》 - 概率论入门经典中的经典,个人认为陈院士的几本著作都是非常好的教材,比平冈和幸的更符合我的思考习惯更容易理解。学习概率与数理逻辑我都更推荐陈院士的书。院士2005年8月8日21点5分,在北京肿瘤医院逝世,享年71岁。感恩他为我们贡献了这么好的教材!
  6. 《概率论基础教程》- Sheldon M.Ross(罗斯)著, 童行伟、梁宝生译 这本书讲的也非常之好。和陈老的书不同,陈院士的书比较多公式推理,非常严谨。这本比较多例子,看人觉得,适合和陈老的那本书一起看(我就是这样做的 :) )。