python 中的 scipy.stats 统计分析包,偏度峰度

python 来做统计分析时一般使用 scipy 中的 stats。 numpy 也能生成一定概率分布的随机数,但如果需要更具体的概率密度,累积概率等,就用用到 scipy.stats 了,感觉它类似 java 中的 ssj 包。下面简单总结一些它的功能。

文章目录

  • 1. 正态分布 norm
  • 2. 计算偏度和峰度

1. 正态分布 norm

默认的正态分布为标准正态分布,
方法:
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

2. 计算偏度和峰度

在计算一个样本的偏度或峰度时,对于一般的数组类型,要用到统计分析工具包 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

你可能感兴趣的:(python)