python实现常见统计量与统计分布

一. 基本概念
1. 总体

一个统计问题研究对象的全体称为总体,构成总体的每个成员称为个体。

2. 样本

一般由于总体的数量是非常巨大的,不可能对全部总体进行研究,通常会对总体进行抽样进行研究。

从总体中按一定规则抽出的一部分个体称为样本,样品的个数称为样本容量。

3. 统计量

X 1 , X 2 X 3 . . . X n X_1,X_2X_3...X_n X1,X2X3...Xn 为取自某总体的样本, 若样本函数中 T = ( X 1 , X 2 X 3 . . . X n ) T=(X_1,X_2X_3...X_n) T=(X1,X2X3...Xn)不含有任何未知参数, 则称 T T T为统计量。

二. 常见统计量
1. 样本均值

X 1 , X 2 . . . X n X_1,X_2...X_n X1,X2...Xn为取自某总体的样本,样本均值 X ‾ = 1 n ∑ i = 1 n X i \overline{ X}=\frac{1}{n}\sum_{i=1}^{n} X_i X=n1i=1nXi

import numpy as np

if __name__ == '__main__':
    data = np.array([3, 4, 5, 6, 2, 1])
    print(data.mean())
2. 样本方差与标准差

X 1 , X 2 . . . X n X_1,X_2...X_n X1,X2...Xn为取自某总体的样本, X ‾ \overline{ X} X为样本均方差,则样本方差 S 2 = 1 n − 1 ∑ i = 1 n ( X i − X ‾ ) 2 S^2=\frac{1}{n - 1}\sum_{i=1}^{n} (X_i - \overline{ X})^2 S2=n11i=1n(XiX)2 S S S称为样本标准差。

import numpy as np
from scipy import stats

if __name__ == '__main__':
    data = np.array([3, 4, 5, 6, 2, 1])
    # ddof为0时自由度是n, ddof参数为1时自由度是n-1,所以我们需要指定该参数
    print(np.var(data, ddof=1))
    print(np.std(data, ddof=1))
3. 偏度

X 1 , X 2 . . . X n X_1,X_2...X_n X1,X2...Xn为取自某总体的样本,则偏度 S K = n ( n − 1 ) ( n − 2 ) ∗ ∑ i = 1 n ( X i − X ‾ ) 3 S 3 SK = \frac{n}{(n - 1)(n - 2)} * \frac{\sum_{i=1}^{n}{(X_i - \overline{X}})^3}{S^3} SK=(n1)(n2)nS3i=1n(XiX)3其中 n n n 为样本量, S S S为样本标准差。

  1. 偏度的计算

    import pandas as pd
    import numpy as np
    from scipy import stats
    
    
    def my_skew(data):
        n = np.size(data)
        mean = np.mean(data)
        std = np.std(data, ddof=1)
    
        tmp1 = np.sum(np.power(data - mean, 3))
        return (n * tmp1) / ((n - 1) * (n - 2) * (std ** 3))
    
    
    if __name__ == '__main__':
        # 1.使用scipy计算偏度,
        data = np.array([25.78, 15.05, 4.26, 19.14, 3.30, -35.75, 25.62, 15.15, -0.72, 17.25])
        print("scipy skewness:", stats.skew(data, bias=False))
    
        # 2.使用pandas 计算
        df = pd.DataFrame()
        df['data'] = data
        print('pandas skewness: ', df['data'].skew())
    
        # 3.自己实现偏度计算
        print("my skewness: ", my_skew(data))
    
  2. 偏度与数据分布的关系

    • 如果一组数据是对称的,则偏度为0;如果偏度大于0,则数据右偏;如果偏度小于0,则数据左偏。
    • 一般偏度的绝对值大于1,数据为高度偏态分布;若绝对值在0.5 ~ 1之间,数据为中等偏态分布;绝对值越接近0,数据的偏斜程度越小。
    
    from scipy import stats
    import matplotlib.pyplot as plt
    
    plt.rcParams["font.family"] = "SimHei"  # 设置字体
    plt.rcParams["axes.unicode_minus"] = False  # 正常显示负号
    
    
    if __name__ == '__main__':
        fig, ax = plt.subplots(3, 1, figsize=(10, 8))
    
        data1 = stats.skewnorm(4).rvs(size = 10000)
        skew1 = stats.skew(data1, bias=False)
    
        data2 = stats.norm().rvs(size = 10000)
        skew2 = stats.skew(data2, bias=False)
    
        data3 = stats.skewnorm(-4).rvs(size = 10000)
        skew3 = stats.skew(data3, bias=False)
    
        ax[0].hist(data1, bins=50, label='右偏分布, skewness:{:.4f}'.format(skew1))
        ax[1].hist(data2, bins=50, label='无偏分布, skewness:{:.4f}'.format(skew2))
        ax[2].hist(data3, bins=50, label='左偏分布, skewness:{:.4f}'.format(skew3))
    
        for i in range(3):
            ax[i].legend()
    
        plt.show()
    
    

    运行结果:
    在这里插入图片描述

4. 峰度

X 1 , X 2 . . . X n X_1,X_2...X_n X1,X2...Xn为取自某总体的样本,峰度 K = n ( n + 1 ) ∑ i = 1 n ( X i − X ‾ ) 4 − 3 [ ∑ i = 1 n ( X i − X ‾ ) 2 ] 2 ( n − 1 ) ( n − 1 ) ( n − 2 ) ( n − 3 ) S 4 K=\frac{n(n + 1)\sum_{i=1}^{n}(X_i - \overline{X})^4 - 3[\sum_{i=1}^{n}(X_i - \overline{X})^2]^2(n - 1)}{(n - 1)(n - 2)(n - 3)S^4} K=(n1)(n2)(n3)S4n(n+1)i=1n(XiX)43[i=1n(XiX)2]2(n1),其中 n n n为样本量, S S S为样本标准差,峰度用来对数据分布的平峰或尖峰程度的测量。

  1. 峰度的计算

    import pandas as pd
    import numpy as np
    from scipy import stats
    
    def my_kurtosis(data):
        n = np.size(data)
        mean = np.mean(data)
        std = np.std(data, ddof=1)
    
        tmp1 = n * (n + 1) * np.sum(np.power(data - mean, 4)) - 3 * (n - 1) * np.power(np.sum(np.power(data - mean, 2)), 2)
        tmp2 = (n - 1) * (n - 2) * (n -3) * np.power(std, 4)
        return tmp1 / tmp2
    
    
    if __name__ == '__main__':
        # 1.使用scipy计算峰度,
        data = np.array([25.78, 15.05, 4.26, 19.14, 3.30, -35.75, 25.62, 15.15, -0.72, 17.25])
        print("scipy kurtosis:", stats.kurtosis(data, bias=False))
    
        # 2.使用pandas 计算
        df = pd.DataFrame()
        df['data'] = data
        print('pandas kurtosis: ', df['data'].kurt())
    
        # 3.自己实现峰度计算
        print("my kurtosis: ", my_kurtosis(data))
    
  2. 峰度与数据分布的关系

    • 峰态通常是与正太分布相比较而言,正太分布的峰度为0,峰度大于0表明数据呈现尖峰分布,峰度小于0表明数据呈现平峰分布。
      在这里插入图片描述
    • 通过对不同分布进行1000000次抽样,并计算抽样值的峰度,再对比抽样值的频率分布
    from scipy import stats
    from scipy.stats import norm
    from scipy.stats import laplace
    from scipy.stats import cosine
    import matplotlib.pyplot as plt
    
    plt.rcParams["font.family"] = "SimHei"  # 设置字体
    plt.rcParams["axes.unicode_minus"] = False  # 正常显示负号
    
    
    if __name__ == '__main__':
    
        fig, ax = plt.subplots(3, 1, figsize= (10, 8))
        sample_size = 1000000
        # 从标准正太分布抽样
        data1 = norm(loc = 0, scale = 1).rvs(size = sample_size)
        kur1 = stats.kurtosis(data1, bias = False)
    
        # 从拉普拉斯分布抽样
        data2 = laplace().rvs(size = sample_size)
        kur2 = stats.kurtosis(data2, bias =False)
    
        # 从cosine分布抽样
        data3 = cosine().rvs(size = sample_size)
        kur3 = stats.kurtosis(data3, bias=False)
    
        ax[0].hist(data1, bins = 100, density=True, label = '标准正太分布, kurtosis:{:.2f}'.format(kur1))
        ax[0].legend()
    
        ax[1].hist(data2, bins = 100, density=True, label = '尖峰分布, kurtosis:{:.2f}'.format(kur2))
        ax[1].legend()
    
        ax[2].hist(data3, bins = 100, density=True, label = '平峰分布, kurtosis:{:.2f}'.format(kur3))
        ax[2].legend()
    
        plt.show()
    

    运行结果:
    在这里插入图片描述

三. 常见统计分布

正太分布是统计中最常见的分布,以标准正太分布为基础构造的三个重要的统计量在实际中也有广泛的应用。

1. 卡方分布

随机变量 X 1 , X 2 . . . X n X_1,X_2...X_n X1,X2...Xn相互独立,且都服从标准正太分布,则随机变量 Y = X 1 2 + . . . + X n 2 Y=X_1^2 + ... + X_n^2 Y=X12+...+Xn2的分布称为自由度为n的卡方分布,记为 Y ∼ χ 2 ( n ) Y\sim\chi^2(n) Yχ2(n)

  • 期望: E ( Y ) = n E(Y)=n E(Y)=n

  • 方差: D ( Y ) = 2 n D(Y)=2n D(Y)=2n

  • 画出不同参数下的卡方分布,自由度分别为 5 , 10 , 20 5,10,20 5,10,20

    
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.stats  import chi2
    
    plt.rcParams["font.family"] = "SimHei"  # 设置字体
    plt.rcParams["axes.unicode_minus"] = False  # 正常显示负号
    
    if __name__ == '__main__':
    
        fig,ax = plt.subplots(figsize=(10, 8))
        params = [(5, 'red'), (10, 'blue'), (15, 'green')]
        x = np.linspace(0, 30, 100)
        for param in params:
            n = param[0]
            color = param[1]
            mean, var = chi2.stats(n, moments='mv')
            y = chi2(n).pdf(x)
            ax.plot(x, y, color = color, label= 'n = {:.2f}, 均值:{:.2f}, 方差: {:.4f}'.format(n, mean, var))
    
        ax.legend()
        plt.show()
    
    
    

    运行结果:
    在这里插入图片描述

2. t分布

随机变量 X 1 ∼ N ( 0 , 1 ) X_1\sim N(0,1) X1N(0,1) X 2 ∼ χ 2 ( n ) X_2\sim \chi^2(n) X2χ2(n) X 1 , X 2 X_1,X_2 X1X2相互独立,则 Y = X 1 X 2 / n Y=\frac{X_1}{\sqrt{X_2/n}} Y=X2/n X1的分布称为自由度为 n n n t t t分布,记为 Y ∼ t ( n ) Y\sim t(n) Yt(n)

  • 期望: E ( Y ) = 0 E(Y)=0 E(Y)=0

  • 方差: D ( Y ) = n n − 2 ( n > 2 ) D(Y)=\frac{n}{n - 2} (n > 2) D(Y)=n2n(n>2)

  • 画出不同参数下的 t t t分布,自由度分别为 3 , 6 , 15 3,6,15 3,6,15

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.stats  import t
    
    plt.rcParams["font.family"] = "SimHei"  # 设置字体
    plt.rcParams["axes.unicode_minus"] = False  # 正常显示负号
    
    if __name__ == '__main__':
    
        fig,ax = plt.subplots(figsize=(10, 8))
        params = [(3, 'red'), (6, 'blue'), (15, 'green')]
        x = np.linspace(-10, 10, 1000)
        for param in params:
            n = param[0]
            color = param[1]
            mean, var = t.stats(n, moments='mv')
            y = t(n).pdf(x)
            ax.plot(x, y, color = color, label= 'n = {:.2f}, 均值:{:.2f}, 方差: {:.4f}'.format(n, mean, var))
    
        ax.legend()
        ax.grid()
        plt.show()
    

    运行结果:
    在这里插入图片描述

3. F分布

随机变量 X 1 , X 2 X_1,X_2 X1X2相互独立, X 1 ∼ χ 2 ( m ) , X 2 ∼ χ 2 ( n ) X_1\sim \chi^2(m),X_2\sim\chi^2(n) X1χ2(m)X2χ2(n),则 Y = X 1 / m X 2 / n Y = \frac{X_1/m}{X_2/n} Y=X2/nX1/m的分布称为自由度为 m m m n n n F F F分布,记为 Y ∼ F ( m , n ) Y\sim F(m,n) YF(m,n)

  • 期望: E ( Y ) = n n − 2 ( n > 2 ) E(Y)=\frac{n}{n-2} (n > 2) E(Y)=n2n(n>2)

  • 方差: E ( Y ) = 2 n 2 ( m + n − 2 ) m ( n − 2 ) 2 ( n − 4 ) ( n > 4 ) E(Y)=\frac{2n^2(m + n - 2)}{m(n - 2)^2(n - 4)} (n > 4) E(Y)=m(n2)2(n4)2n2(m+n2)(n>4)

  • 画出不同参数下的 F F F分布,自由度分别为 ( 100 , 20 ) , ( 100 , 40 ) , ( 100 , 60 ) (100, 20),(100, 40),(100, 60) (100,20),(100,40),(100,60)

    
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.stats  import f
    
    plt.rcParams["font.family"] = "SimHei"  # 设置字体
    plt.rcParams["axes.unicode_minus"] = False  # 正常显示负号
    
    if __name__ == '__main__':
    
        fig,ax = plt.subplots(figsize=(10, 8))
        params = [(100,20,'red'), (100,40,'blue'), (100,60,'green')]
        x = np.linspace(0, 10, 1000)
        print(x)
        for param in params:
            m = param[0]
            n = param[1]
            color = param[2]
            mean, var = f.stats(m, n, moments='mv')
            y = f(m,n).pdf(x)
            ax.plot(x, y, color = color, label= 'm = {:.2f}, n = {:.2f}, 均值:{:.2f}, 方差: {:.4f}'.format(m, n, mean, var))
    
        ax.legend()
        ax.grid()
        plt.show()
    
    

    运行结果:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE4_官方动画内容示例1.2_动画蓝图——使用蓝图告知Actor播放动画

展示了两个示例:在其中一个示例中,使用蓝图告知Actor播放动画,在另外一个示例中,展示了告知Actor播放动画的动画蓝图(例如,此示例展示了如何将变量从蓝图传递给动画蓝图,并演示了如何将现有姿势…

.NET高级面试指南专题二十三【 B+ 树作为索引有什么优势】

B 树作为索引有许多优势,这些优势使其成为许多数据库管理系统中首选的索引结构之一。以下是 B 树作为索引的一些主要优势: 高效的查询性能:B 树是一种平衡树结构,具有良好的平衡性和高度平衡的性质,这使得在 B 树上进行…

leetcode刷题日记-滑铁卢了家人们(解数独)

问题描述 解题思路 看到这个题,给我的感觉是什么玩意啊!仔细读题之后,真的没想到解题思路。然后看了题解,用到了回溯算法,感觉这个回溯和N皇后的问题差不太多。然后就照着思路尝试理解了一遍,感觉这种题目…

电脑怎么解除安全模式?

安全模式是windows系统中的一种特殊模式,在安全模式可以让系统仅载入最低需求的驱动程序来启动电脑,用户可以在此模式下检测或故障排除。可是一些用户却不知道怎么解除安全模式。下面,极客狗就为大家带来电脑怎么解除安全模式的方法吧。 解除安全模式的方法: 1、 首先,在安…

Python使用flask框架与前端建立websocket链接,并进行数据交互

Python使用flask框架与前端建立websocket链接,并进行数据交互 后端采用的框架为flask,前端用的flask自带的html编写,实现的功能为:前后端建立websocket链接并进行数据交互 一、编写一个flask后端服务 常规创建方式就可以,创建一个flask服务。声明一个websocket实例,以we…

详解mysql安装与配置,及Mac中常见的安装问题

目录 1 数据库介绍 什么是数据库 数据库分类 2 MySQL服务器安装 2.1 Windows绿色安装 2.2 Windows中重装MySQL 3 Mac中常见的安装问题 4 客户端连接MySQL服务器 5 SQL分类 1 数据库介绍 什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 文件…

文件上传一-WEB攻防-PHP应用文件上传函数缺陷条件竞争二次渲染黑白名单JS绕过9

演示案例: PHP-原生态-文件上传-前后端验证PHP-原生态-文件上传-类型文件头验证PHP-原生态-文件上传-后缀黑白名单验证PHP-原生态-文件上传-解析配置&二次渲染PHP-原生态-文件上传-逻辑缺陷&函数缺陷 #学习前必读: 1、课前一定要明白&#xff1a…

【教程】高效数据加密混淆方法及实现简介

背景 在需要对数据进行传输或者表达时,通常要求数据加密的安全级别不高,但希望加解密时间复杂度尽可能低。这时使用传统的对称加密(如3DES、AES)或非对称加密(如RSA、ECC)显然不太适合。因为加密的安全级别…

PSO-CNN-BiLSTM多输入时序预测|粒子群优化算法-卷积-双向长短期神经网络时序预测|Matlab

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…

Linux manim安装

ERROR No package ‘pangocairo’ found Getting requirements to build wheel ... errorerror: subprocess-exited-with-error Getting requirements to build wheel did not run successfully.│ exit code: 1╰─> [31 lines of output]Package pangocairo was not fou…

青少年扁平足也需要手术?家长可千万不要忽视!

近日,在门诊遇到一位年轻妈妈带着孩子来看诊,反应孩子从一年前体育活动时就莫名喊双脚疼,长时间走路或者站立疼痛会加重,休息了就好些,担心孩子脚是不是有什么问题。医生听了先给孩子做了查体,后又让孩子脱…

基于ArUco码测量蓝色区域长度

基于ArUco码测量蓝色区域长度 ,并把各个参数画在图上

【郭林保大夫】——这些事情做到了,想患上帕金森都难!

郭林保大夫说:帕金森病的发病原因尚不完全清楚,但可能与多种因素有关,包括遗传因素、环境因素、神经系统老化等。具体病因可能是这些因素相互作用的结果。病情后期,严重程度会因个体差异而异。一些患者可能出现严重的运动障碍&…

JVM系列之JVM体系(一)

一、前言 为什么要学习了解Java虚拟机 1.我们需要更加清楚的了解Java底层是如何运作的,有利于我们更深刻的学习好Java。 2.对我们调试错误提供很宝贵的经验。 3.这是合格的Java程序必须要了解的内容。 基于此,我打算出一个Java虚拟机的系列&#xf…

电脑哥的励志创业路:蹭别人的电脑做抖店

我是王路飞。 没有一步到位的创业项目,也没有一击必中的解决方法,有的只是需要时刻解决的当下问题。 做事/创业/成长/生活/人生,都不要追求百分百的圆满,不要抱有一帆风顺的幻想,不要期待十全十美的结果。 它们的第…

windows一键快速安装python方法

正常我们安装python的时候,需要先去下载python压缩包,然后再一步步安装,今天发现一个windows10下,一键安装python的方法; 电脑环境:windows10以上 安装方法: 0:在应用商店搜索pyt…

OpenHarmony使用智能指针管理动态分配内存对象

概述 智能指针是行为类似指针的类,在模拟指针功能的同时提供增强特性,如针对具有动态分配内存对象的自动内存管理等。 自动内存管理主要是指对超出生命周期的对象正确并自动地释放其内存空间,以避免出现内存泄漏等相关内存问题。智能指针对…

【数据结构取经之路】队列循环队列

目录 引言 队列的性质 队列的基本操作 初始化 判空 销毁 队列的长度 插入 删除 返回队头元素 循环队列 假溢出 空与满的判定 实现 初始化 插入 判空 销毁 删除 返回队列长度 返回队列头元素 判满 引言 队列和栈一样,也是数据结构的一种&…

python初级2条件与循环笔记

两个课堂小练习: 1、(计算圆柱体的体积) 编写一个读取圆柱的半径和高并利用公式计算圆柱体底面积和体积的程序 iimport math reval(input("enter the r")) heval(input("enter the h")) arear*r*math.pi print("the area ",area,…

java 三元搜索 - 迭代与递归(Ternary Search)

计算机系统使用不同的方法来查找特定数据。有多种搜索算法,每种算法更适合特定情况。例如,二分搜索将信息分为两部分,而三元搜索则执行相同的操作,但分为三个相等的部分。值得注意的是,三元搜索仅对排序数据有效。在本…