美文网首页
Python 全栈:统计学练习

Python 全栈:统计学练习

作者: you的日常 | 来源:发表于2020-12-01 14:17 被阅读0次

    381 什么是一个事件?

    抛硬币出现正面就可以定义为一个事件 X;抛硬币出现反面也能被定义为一个事件 Y;抛硬币 10 次,正面朝上次数也可定义为一个事件 Z;在101班测量了40名学生的身高,学生的平均身高也可以被定义为一个事件 H.

    382 什么是概率?

    概率描述某个事件发生的概率,比如上面事件 X 发生的概率为 0.4,则对应的事件 Y 发生的概率就为 0.6,事件 X 和 事件 Y 为一对对立事件。抛硬币 10 次,正面朝上次数为事件 Z ,可能的取值为 0 到 10 ,发生 0 次的概率一般记做 P(X=0) ,它等于 0.6^10;出现 1 次的概率 P(X=1) ,等于 0.4 * 0.6 ^ 9,后面依次类推。

    383 什么是离散型随机变量?

    比如上面的事件 Z ,可能取值为 0 到 10, 这是一个离散型随机变量,因为事件 Z 可能的取值个数是有限的。

    384 什么是连续型随机变量?

    101班 40 名学生的平均身高对应的事件 H 取值就有各种可能性,因此事件 H 取值为连续型随机变量

    385 概率分布描述的是什么?以二项分布为例阐述

    概率分布表示某个事件的所有可能取值对应的概率情况。求出每个可能的取值对应的概率,就相当于得到事件 Z 的概率分布。此处事件 Z 的概率分布实际上就是我们常见的 二项分布,下面绘制出事件 Z 在正面发生概率为 0.4 情况下的概率分布图:

    ph = 0.4
    pt = 1 - ph 
    sumn = 10 
    
    zi = range(0,sumn+1)
    
    def combine_number(sumn, headn):
        return math.factorial(sumn) / math.factorial(headn) / math.factorial(sumn - headn)
    
    pi = [combine_number(10,headn)* math.pow(ph,headn) * math.pow(pt,sumn - headn) for headn in zi]
    
    plt.plot(zi,pi,color='r')
    plt.scatter(zi,pi,color='', marker='o',edgecolor='b')
    plt.grid()
    plt.xlabel('count of head')
    plt.ylabel('p distribute')
    plt.show()
    
    
    image

    看到正面出现 4 次的概率最大为 0.25.

    386 累积分布函数 x, y 的意义是什么?

    如上事件 Z 出现次数不大于 4 次的概率累加和,记做 F(4),等于 P(Z<=4) 的概率,逐个计算出 F(n),n 等于 0 到 10, 这样就得到一个累积分布函数,离散型变量的累积分布函数被称作概率质量函数。

    代码接着第 6 节,下面绘制出事件 Z 的概率质量函数:

    cfd = np.cumsum(pi)
    plt.step(zi,cfd,color='g')
    for i,j in zip(zi,cfd):
        plt.text(x=i-0.75,y=j,s=round(j,2))
    
    plt.xlabel('count of head')
    plt.ylabel('cumulation p')
    plt.grid()
    plt.show()
    
    
    image

    387 NumPy 求平均值、中位数、标准差、方差

    描述性变量是对已有数据的基本情况统计量,比如测量出 101 班 40 名学生的身高,我们就能基于这些数据,计算出以下描述性统计量:

    • 平均值
    • 中位数
    • 标准差
    • 方差

    假定下面为 101 班级 40 名学生测量身高值:

    hs = array([189., 158., 178., 169., 146., 169., 168., 169., 160., 177., 161.,
           191., 155., 177., 171., 183., 168., 181., 189., 180., 170., 168.,
           170., 169., 176., 163., 136., 165., 179., 150., 186., 160., 177.,
           154., 165., 186., 168., 182., 167., 162.])
    
    

    使用 NumPy 很容易计算出 40 名学生的平均身高值:169.8

    np.mean(hs)
    
    

    中位数:169.0,按照身高从低到高排序后,位于中间的数值。

    np.median(hs)
    
    

    它与均值不同,某些场景选用中位数会更加合适,尤其数据分布不均匀时。比如中等收入家庭占多,富豪还是少数但是财富值远多于中等收入家庭。如果取所有样本的均值就会高于大多数中等家庭收入均值,此时选用样本中位数更能贴近家庭实际收入情况。

    方差:144.16

    np.var(hs)
    
    

    标准差:12.0

    np.std(hs)
    
    

    方差取根号得到标准差,它们表示数据偏离平均值的程度,标准差越小表示数据整体更靠近均值,反之越偏离均值,也就更加分散。

    展示 40 位学生身高数据偏离平均值的柱状图:

    import matplotlib.pyplot as plt
    import numpy as np
    import math
    
    plt.figure(figsize=(12,8))
    plt.bar(np.arange(40),hs-np.mean(hs),color='blue')
    plt.plot(np.arange(40),np.repeat(0,40),color='r')
    plt.xlabel('student id')
    plt.ylabel('subtract mean height')
    
    
    image

    从上图看出偏离平均值(红线水平线)最大的样本 id 位于 25 到 30 间,偏离值为 30 多。

    388 分位数和箱型图传递什么信息?

    快速了解数据的分布最便捷的方法之一就是通过分位数,绘制箱型图。

    常用的分位数有上、下分位数和中位数,分别对应数据 75%,25%,50% 比例处。

    使用 NumPy 分别求出 40 位学生身高的上、下分位数和中位数,依次为:178.25,169.0,169.0.

    p3 = np.percentile(hs,75)
    p1 = np.percentile(hs,25)
    p2 = np.percentile(hs,50)
    
    

    接下来绘制箱型图,进一步获取到更多数据分布的信息:

    plt.figure(figsize=(12,8))
    plt.grid()
    d = plt.boxplot(hs)
    
    
    image

    从箱型图中看出如上标注的信息,位于上、下限之外的样本点是异常值,用圆圈表示,如上图所示。

    389 期望和频率分布直方图的案例

    101 班 40 名学生的身高值是连续性随机变量,很显然研究具体某个身高值的概率没有意义。一般的,将样本集合的最小值、最大值对应的区间均分为若干等分,求出某个样本落在对应区间的概率值,记做此身高值的概率。

    使用 Matplotlib 绘制频率分布直方图,得到 10 个区间,以及落入每个区间的样本个数:

    plt.figure(figsize=(8,6))
    hsh = plt.hist(hs,color='b')
    hsh 
    
    

    注意 hist 方法返回的结果为一个元组,第一个元素为区间内样本的个数,第二个元素表示划分的10个区间,例如落在区间[136.,141.5] 的样本个数为 1, 落在区间 [152.5, 158] 内元素个数为 2.

    相关文章

      网友评论

          本文标题:Python 全栈:统计学练习

          本文链接:https://www.haomeiwen.com/subject/kekdrktx.html