【python】计算偏度和峰度

本篇博文,首发在AIexplore微信公众号,内容总体相同,均为原创,特此申明。

0.教程代码环境

其他环境也可以,不一定非要一样
python 3.6
numpy 1.19.3
matplotlib 3.2.1
scipy 1.4.1

1.偏度

定义:偏度(skewness),是统计数据分布偏斜方向和程度的度量,或者说是统计数据分布非对称程度的数字特征。

说人话:偏度或偏态系数或偏度系数(Skewness)用来度量分布是否对称,一个分布如果不对称,则被称为偏度。

分布分为三种:对称分布(正态分布)、正偏分布(右偏分布)、负偏分布(左偏分布)
对称分布的特点:左右对称,均值 = 中位数 = 众数,偏度 = 0
正偏分布的特点:右侧长尾,均值 >中位数 >众数,偏度 > 0
负偏分布的特点:左侧长尾,均值 < 中位数 < 众数,偏度 < 0

1.1 绘制三种分布图

1.1.1 使用python代码绘制正态分布:

代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

def plot():
"""
    绘制标准的正态分布
    draw standard deviation normal distribution
"""
    mu = 0.0
    sd = 1.0
    x = np.linspace(mu - 4 * sd, mu + 4 * sd, 100)
    y = stats.norm.pdf(x)
    plt.plot(x, y, "g", linewidth = 2)
    plt.grid(True)
    plt.show()

if __name__ == '__main__':
    plot()

分布图:

【python】计算偏度和峰度

1.1.2 使用python代码绘制右偏分布:

代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

def plot():
"""
    绘制标准的正偏分布
"""
    mu = 0.0
    sd = 1.0
    x = np.linspace(mu - 3 * sd, mu + 5 * sd, 100)
    y = stats.norm.pdf(x)
    plt.plot(x, y, "g", linewidth = 2)
    plt.grid(True)
    plt.show()

if __name__ == '__main__':
    plot()

分布图:

【python】计算偏度和峰度

1.1.3 使用python代码绘制左偏分布:

代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

def plot():
"""
    绘制标准的正偏分布
"""
    mu = 0.0
    sd = 1.0
    x = np.linspace(mu - 5 * sd, mu + 3 * sd, 100)
    y = stats.norm.pdf(x)
    plt.plot(x, y, "g", linewidth = 2)
    plt.grid(True)
    plt.show()

if __name__ == '__main__':
    plot()

分布图:

【python】计算偏度和峰度

1.2 偏度计算

计算公式:

【python】计算偏度和峰度

有的文章里面计算公式是这样的:

【python】计算偏度和峰度

以上公式来自不同的出处,我不是学数学的,因此对这些内容没有太深入的研究(主要是我以前从来没遇到过,知识盲区;如果有学数学的朋友懂这方面知识,可以私聊我给我普及一下),我的理解是公式1和公式2应该没有对错之分,只是”选择”不同罢了(不知道对不对,如有大佬请在评论区修正),那我们计算偏度到底使用哪个公式呢?请继续阅读下文。

具体例子:
一组数据:arr = [1,4,6,8,10,20]

arr的均值和标准差我们使用numpy库直接进行计算 :

均值

import numpy as np

arr = np.array([1,4,6,8,10,20])

u = arr.mean()
print("均值:", u)

【python】计算偏度和峰度

标准差
标准差分为总体标准差(分母位n)和样本标准差(分母n-1)【为什么分为总体标准差和样本标准差,感兴趣的可以自己找资料研究,在此不深入说明了】

import numpy as np

arr = np.array([1,4,6,8,10,20])

a = arr.std(ddof=1)
print("标准差:", a)

这里我们使用无偏的标准差(不要问为什么,因为用无偏的比较”好”,大家都是用的无偏)。

【python】计算偏度和峰度
知道了均值和标准差,就可以带入公式计算偏度了。
那么问题来了,我们应该带入到哪个公式呢?下面我们分别带入到2个公式中,查看一下结果。

使用公式1:

import numpy as np
import pandas as pd
from scipy import stats

arr = np.array([1,4,6,8,10,20])

n = len(arr)
u = arr.mean()
print("均值:", u)

a = arr.std(ddof=1)
print("标准差:", a)

a1 = sum(((arr-u)/a)**3)
a2 = a1*n/((n-1)*(n-2))
print("偏度:", a2)

【python】计算偏度和峰度
使用公式2:
import numpy as np
import pandas as pd
from scipy import stats

arr = np.array([1,4,6,8,10,20])

n = len(arr)
u = arr.mean()
print("均值:", u)

a = arr.std(ddof=1)
print("标准差:", a)

a1 = sum(((arr-u)/a)**3)
a2 = a1/n
print("偏度:", a2)

【python】计算偏度和峰度
可以看到使用不同公式计算得到的偏度不同:
公式1得到的偏度:1.2737636108819756
公式2得到的偏度:0.7076464504899865

不同公式得到的偏度肯定是不一样的,那我们到底应该采用哪一个偏度值呢?下面我们使用python科学计算包直接计算偏度:

使用pandas计算:

import numpy as np
import pandas as pd

arr = np.array([1,4,6,8,10,20])

print("--------使用pandas计算偏度和峰度--------")

data = pd.DataFrame(arr)
print("标准差:", data[0].std())
print("偏度:", data[0].skew())

【python】计算偏度和峰度
可以看到,标准差6.5853372477547923,使用的是无偏标准差;偏度1.2737636108819759,和公式1计算的结果相同。从侧面验证了pandas库使用的是无偏标准差+公式1来计算偏度。

使用scipy计算:

import numpy as np
from scipy import stats

arr = np.array([1,4,6,8,10,20])

print("--------使用scipy计算偏度和峰度--------")

print("标准差:", stats.tstd(arr, ddof=1))
d = stats.skew(arr, bias=False)
print("偏度:", d)

【python】计算偏度和峰度
可以看到,标准差6.585337247754792,使用的是无偏标准差;偏度1.2737636108819756,和公式1计算结果、pandas库计算结果相同。再次验证了应该使用公式1来计算偏度。

2.峰度

定义:峰度(peakedness;kurtosis)又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。
说人话:峰度反映了峰部的尖度,用来度量数据在中心聚集程度,峰度越大分布图越尖,峰度越小分布图越矮胖。

2.1 绘制三种不同峰度的分布图

代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

def plot():
"""
    draw standard deviation normal distribution
"""
    mu = 0.0
    sd1 = 1.0
    sd2 = 2.0
    sd3 = 3.0

    x = np.linspace(mu - 3 * sd1, mu + 3 * sd1, 50)
    y = stats.norm.pdf(x)
    plt.plot(x, y, "r", linewidth = 2)

    x2 = np.linspace(mu - 6 * sd1, mu + 6 * sd1, 50)
    y2 = stats.norm.pdf(x2, mu, sd2)
    plt.plot(x2, y2, "g", linewidth = 2)

    x3 = np.linspace(mu - 10 * sd1, mu + 10 * sd1, 50)
    y3 = stats.norm.pdf(x3, mu, sd3)
    plt.plot(x3, y3, "b", linewidth = 2)

    plt.grid(True)
    plt.show()

if __name__ == '__main__':
    plot()

分布图:
相同均值,不同标准差的正态分布曲线

【python】计算偏度和峰度

红色线条标准差是1,绿色线条标准差是2,蓝色线条标准差是3。
标准差越小,曲线越陡
标准差越大,曲线越平缓
红色线条:尖峰
绿色线条:中锋
蓝色线条:低峰

对于正态分布来说峰度=3,部分统计软件会给出超额峰度,超额峰度=峰度-3。
中锋分布的超额峰度=0, 尖峰分布的超额峰度>0,低峰分布的超额峰度<0。

2.2 峰度计算

峰度的计算公式,我也看到好几个版本,我想应该和偏度的计算类似,因此不再纠结它的计算公式,直接使用pandas或scipy进行计算。

代码:

import numpy as np
import pandas as pd
from scipy import stats

arr = np.array([1,4,6,8,10,20])

print("--------使用scipy计算偏度和峰度--------")

print("标准差:", stats.tstd(arr, ddof=1))
d = stats.skew(arr, bias=False)
print("偏度:", d)
e = stats.kurtosis(arr, bias=False)
print("峰度:", e)

print("--------使用pandas计算偏度和峰度--------")

data = pd.DataFrame(arr)
print("标准差:", data[0].std())
print("偏度:", data[0].skew())
print("峰度:", data[0].kurt())

结果:

【python】计算偏度和峰度

3.整体代码

import numpy as np
import pandas as pd
from scipy import stats

arr = np.array([1,4,6,8,10,20])

print("--------使用scipy计算偏度和峰度--------")

print("标准差:", stats.tstd(arr, ddof=1))
d = stats.skew(arr, bias=False)
print("偏度:", d)
e = stats.kurtosis(arr, bias=False)
print("峰度:", e)

print("--------使用pandas计算偏度和峰度--------")

data = pd.DataFrame(arr)
print("标准差:", data[0].std())
print("偏度:", data[0].skew())
print("峰度:", data[0].kurt())

print("--------自己通过代码计算偏度和峰度,方式 1--------")
n = len(arr)
u = arr.mean()
print("均值", u)

a = arr.std(ddof=1)
print("标准差:", a)

a1 = sum(((arr-u)/a)**3)
a2 = a1*n/((n-1)*(n-2))
print("偏度:", a2)

print("--------自己通过代码计算偏度和峰度,方式 2--------")
list_v = []
for v in arr:

    q = (v-u)**3
    list_v.append(q)

b1 = sum(list_v)
b2 = b1/(a**3)
b3 = b2*n/((n-1)*(n-2))
print("偏度:", b3)

4.附录

我们也可以使用Excel直接计算一组数据的偏度和峰度。

Excel中的数据如下:

【python】计算偏度和峰度

计算A1、A2、A3、A4、A5、A6数据的偏度和峰度。

偏度计算公式:=SKEW(A1:A6)
峰度计算公式:=KURT(A1:A6)

【python】计算偏度和峰度

【python】计算偏度和峰度

【python】计算偏度和峰度

偏度1.2737,再一次验证了使用无偏标准差和公式1计算;峰度2.1546。

; 参考资料:

  1. https://blog.csdn.net/weixin_36236293/article/details/102632084
  2. https://zhidao.baidu.com/question/133028474.html
  3. https://blog.csdn.net/qq_36523839/article/details/88671873
  4. https://zhuanlan.zhihu.com/p/346810231
  5. https://zhuanlan.zhihu.com/p/84614017

Original: https://blog.csdn.net/AugustMe/article/details/127012415
Author: 机器不学习我学习
Title: 【python】计算偏度和峰度

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/763651/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • openpyxl 模块学习记录

    多单元格操作 通过切片 >>> cell_range = ws[‘A1′:’C2’] 通过行(列) >>> colC = ws[‘C’] &gt…

    Python 2023年6月10日
    088
  • [Pandas]Dataframe赋值

    在进行Titanic幸存者预测的过程中,数据预处理涉及到空值填充。我的想法是以Pclass分组,为Age的空值填充随机值x~ U(mean-σ,mean+σ) 开始是参考其他文章的…

    Python 2023年8月17日
    038
  • 37.(前端)菜单的展示

    1.前端的左侧菜单栏展示 对于菜单栏,我们可以从element-ui官网中获取到展示的代码 ; 1.1导入代码 <template> <el-container …

    Python 2023年8月9日
    042
  • Skywalking Swck Agent注入实现分析

    项目地址: 项目简介: A bridge project between Apache SkyWalking and Kubernetes. SWCK is a platform …

    Python 2023年10月20日
    056
  • [附源码]Node.js计算机毕业设计高校社团管理系统Express

    项目运行 环境配置: Node.js 最新版+ V s code + Mysql5.7 + HBuilderX+Navicat11+Vue。 项目技术: Express 框架+ N…

    Python 2023年10月7日
    034
  • 2022年亚太数学建模竞赛-问题C:全球变暖与否?-思路详解

    一、题目分析 数据分析典中典,数据量适中,主要考察预测模型,另外还需要收集额外的数据辅助建模和判断。 要求 1.你同意全球气温的说法吗?使用2022_APMMC_C_Data。cs…

    Python 2023年9月16日
    052
  • Python __dict__属性详解

    我们都知道Python一切皆对象,那么Python究竟是怎么管理对象的呢? 首先看一下 类的__dict__属性和 类对象的__dict__属性 -*- coding: utf-8…

    Python 2023年9月30日
    039
  • Python蓝桥杯易错点整理和心得总结【一】

    1.当输入包括数字 且需要根据数字大小进行排序 时,一定要加上int,否则就是字符串类型的数字比较了——来自蓝桥杯算法训练:预备爷的悲剧 2.gcd(最大公约数)和lcm(最小公倍…

    Python 2023年8月2日
    057
  • 绘制折线图分析股票涨跌

    绘制折线图分析股票涨跌 * – 利用numpy加载文件 – 平均值 – + 算术平均值 + 加权平均值 + * VWAP – 成交量…

    Python 2023年9月3日
    058
  • Python自动化办公–Pandas玩转Excel【一】

    相关文章: Python自动化办公–Pandas玩转Excel数据分析【二】 Python自动化办公–Pandas玩转Excel数据分析【三】_汀、的博客-…

    Python 2023年8月17日
    069
  • 【NumPy教程】(快速入门版)

    文章目录 * – 读者 – 阅读条件* NumPy是什么* – NumPy使用需求 – NumPy应用场景* NumPy下载与安装*…

    Python 2023年8月24日
    057
  • python series去重_pandas中DataFrame和Series的数据去重

    在SQL语言中去重是一件相当简单的事情,面对一个表(也可以称之为DataFrame)我们对数据进行去重只需要GROUP BY 就好。 select custId,applyNo f…

    Python 2023年8月19日
    067
  • VS2019发布至远程IIS部署流程

    服务器部署 传统的开发将项目发布至本地桌面之后,复制至站点目录或通过FTP上传站点目录,有点小麻烦,通过开发工具VS2019本身集成的功能,可以一步到发布到远程IIS站点。 条件:…

    Python 2023年10月12日
    045
  • python+numpy+pandas数据类型+类/对象

    写代码时逻辑明确,但是被各种数据类型以及对象类型搞蒙了,补习并简单记录一下。 在进行数据分析之前需要对数据进行数据处理,其中就包含转化数据格式,可以先查看数据信息,再依据分析需求对…

    Python 2023年8月25日
    045
  • python:矩阵的基本运算

    一、Python 矩阵基本运算 引入 numpy 库 import numpy as np python矩阵操作 1)使用 mat 函数创建一个 2X3矩阵 a = np.mat(…

    Python 2023年8月30日
    059
  • Task1 Pandas基础学习(一)

    DataFrame介绍: DataFrame是一个表格型的数据结构,它含有一组 有序 的列,每列可以是不同的值类型(数值、字符串、布尔值等)。 导入包: 1.将字典转化为DataF…

    Python 2023年8月20日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球