python 来做统计分析时一般使用 scipy 中的 stats。 numpy 也能生成一定概率分布的随机数,但如果需要更具体的概率密度,累积概率等,就用用到 scipy.stats 了,感觉它类似 java 中的 ssj 包。下面简单总结一些它的功能。
默认的正态分布为标准正态分布,
方法:
pdf 概率密度
cdf 累积概率
ppf 百分比(累积概率的反函数)
例如
(1) 标准正态分布累计分布到零的概率
import scipy.stats as st
st.norm.cdf(0)
输出:0.5
(2) 均值为 3, 标准差为1,累计分布到 3 的概率
st.norm(3,1).cdf(3)
或
st.norm.cdf(3,3,1)
输出:0.5
(3) 均值为 3, 标准差为 1, 累计概率为 0.5 的反函数值
st.norm.ppf(0.5,3,1)
输出:3.0
在计算一个样本的偏度或峰度时,对于一般的数组类型,要用到统计分析工具包 scipy,对于 pandas 中的数据类型,可以调用 pandas 自带的计算偏度或峰度的函数。
>>> import scipy.stats as st
>>> a = [89, 23, 45, 18]
>>> st.skew(a) # 计算偏度
0.7565543738808015
>>> st.kurtosis(a) # 计算峰度
-1.0489580648783101
需要注意的是,pandas 计算峰度时需要至少 4 个数据。
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame(np.array([[85, 68, 90], [82, 63, 88], [84, 90, 78]]), columns=['统计学', '高数', '英语'], index=['张三', '李四', '王五'])
>>> df
统计学 高数 英语
张三 85 68 90
李四 82 63 88
王五 84 90 78
>>> df.iloc[1, :].skew() # 计算第二行的偏度
-1.3294040702410526
>>> df.skew(axis = 0) # 计算所有列的偏度
统计学 -0.935220
高数 1.498959
英语 -1.545393
dtype: float64
>>> df.skew(axis = 1) # 计算所有行的偏度
张三 -1.373033
李四 -1.329404
王五 0.000000
dtype: float64
>>> df1 = pd.DataFrame(np.array([[85, 68, 90, 65], [82, 63, 88, 83], [84, 90, 78, 90], [72, 68, 91, 84]]), columns=['统计学', '高数', '英语', '计算机'], index=['张三', '李四', '王五', '马六'])
>>> df1
统计学 高数 英语 计算机
张三 85 68 90 65
李四 82 63 88 83
王五 84 90 78 90
马六 72 68 91 84
>>> df1.kurt(axis = 0) # 计算 df1 所有列的偏度
统计学 3.090874
高数 3.365664
英语 3.090874
计算机 2.769386
dtype: float64
>>> df1.iloc[:, 2].kurt() #计算 df1 第 3 列的偏度
3.090874188966101