#!/usr/bin/env python # coding: utf-8 # # 概率统计方法 # ## 简介 # **`Python`** 中常用的统计工具有 **`Numpy, Pandas, PyMC, StatsModels`** 等。 # # **`Scipy`** 中的子库 `scipy.stats` 中包含很多统计上的方法。 # # 导入 `numpy` 和 `matplotlib`: # In[1]: get_ipython().run_line_magic('pylab', 'inline') # In[2]: heights = array([1.46, 1.79, 2.01, 1.75, 1.56, 1.69, 1.88, 1.76, 1.88, 1.78]) # `Numpy` 自带简单的统计方法: # In[3]: print 'mean, ', heights.mean() print 'min, ', heights.min() print 'max, ', heights.max() print 'standard deviation, ', heights.std() # 导入 **`Scipy`** 的统计模块: # In[4]: import scipy.stats.stats as st # 其他统计量: # In[5]: print 'median, ', st.nanmedian(heights) # 忽略nan值之后的中位数 print 'mode, ', st.mode(heights) # 众数及其出现次数 print 'skewness, ', st.skew(heights) # 偏度 print 'kurtosis, ', st.kurtosis(heights) # 峰度 print 'and so many more...' # ## 概率分布 # 常见的[连续概率分布](https://zh.wikipedia.org/wiki/Category:%E8%BF%9E%E7%BB%AD%E5%88%86%E5%B8%83)有: # # - 均匀分布 # - 正态分布 # - 学生`t`分布 # - `F`分布 # - `Gamma`分布 # - ... # # [离散概率分布](https://zh.wikipedia.org/wiki/Category:%E7%A6%BB%E6%95%A3%E5%88%86%E5%B8%83): # # - 伯努利分布 # - 几何分布 # - ... # # 这些都可以在 `scipy.stats` 中找到。 # ## 连续分布 # ### 正态分布 # 以[正态分布](https://zh.wikipedia.org/wiki/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83)为例,先导入正态分布: # In[6]: from scipy.stats import norm # 它包含四类常用的函数: # # - `norm.cdf` 返回对应的[累计分布函数](https://zh.wikipedia.org/wiki/%E7%B4%AF%E7%A7%AF%E5%88%86%E5%B8%83%E5%87%BD%E6%95%B0)值 # - `norm.pdf` 返回对应的[概率密度函数](https://zh.wikipedia.org/wiki/%E6%A9%9F%E7%8E%87%E5%AF%86%E5%BA%A6%E5%87%BD%E6%95%B8)值 # - `norm.rvs` 产生指定参数的随机变量 # - `norm.fit` 返回给定数据下,各参数的[最大似然估计](https://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1)(MLE)值 # # 从正态分布产生500个随机点: # In[7]: x_norm = norm.rvs(size=500) type(x_norm) # 直方图: # In[8]: h = hist(x_norm) print 'counts, ', h[0] print 'bin centers', h[1] # 归一化直方图(用出现频率代替次数),将划分区间变为 `20`(默认 `10`): # In[9]: h = hist(x_norm, normed=True, bins=20) # 在这组数据下,正态分布参数的最大似然估计值为: # In[10]: x_mean, x_std = norm.fit(x_norm) print 'mean, ', x_mean print 'x_std, ', x_std # 将真实的概率密度函数与直方图进行比较: # In[11]: h = hist(x_norm, normed=True, bins=20) x = linspace(-3,3,50) p = plot(x, norm.pdf(x), 'r-') # 导入积分函数: # In[12]: from scipy.integrate import trapz # 通过积分,计算落在某个区间的概率大小: # In[13]: x1 = linspace(-2,2,108) p = trapz(norm.pdf(x1), x1) print '{:.2%} of the values lie between -2 and 2'.format(p) fill_between(x1, norm.pdf(x1), color = 'red') plot(x, norm.pdf(x), 'k-') # 默认情况,正态分布的参数为均值0,标准差1,即标准正态分布。 # 可以通过 `loc` 和 `scale` 来调整这些参数,一种方法是调用相关函数时进行输入: # In[14]: p = plot(x, norm.pdf(x, loc=0, scale=1)) p = plot(x, norm.pdf(x, loc=0.5, scale=2)) p = plot(x, norm.pdf(x, loc=-0.5, scale=.5)) # 另一种则是将 `loc, scale` 作为参数直接输给 `norm` 生成相应的分布: # In[15]: p = plot(x, norm(loc=0, scale=1).pdf(x)) p = plot(x, norm(loc=0.5, scale=2).pdf(x)) p = plot(x, norm(loc=-0.5, scale=.5).pdf(x)) # ### 其他连续分布 # In[16]: from scipy.stats import lognorm, t, dweibull # 支持与 `norm` 类似的操作,如概率密度函数等。 # 不同参数的[对数正态分布](https://zh.wikipedia.org/wiki/%E5%AF%B9%E6%95%B0%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83): # In[17]: x = linspace(0.01, 3, 100) plot(x, lognorm.pdf(x, 1), label='s=1') plot(x, lognorm.pdf(x, 2), label='s=2') plot(x, lognorm.pdf(x, .1), label='s=0.1') legend() # 不同的[韦氏分布](https://zh.wikipedia.org/wiki/%E9%9F%A6%E4%BC%AF%E5%88%86%E5%B8%83): # In[18]: x = linspace(0.01, 3, 100) plot(x, dweibull.pdf(x, 1), label='s=1, constant failure rate') plot(x, dweibull.pdf(x, 2), label='s>1, increasing failure rate') plot(x, dweibull.pdf(x, .1), label='0= abs(t_val)] p = fill_between(lower_x, my_t.pdf(lower_x), color='red') p = fill_between(upper_x, my_t.pdf(upper_x), color='red')