《统计思维》学习小记(二)——描述性统计量(1)

此文用于记录在Allen B. Downey所著的《统计思维-程序员数学之概率统计》这本书的学习过程和一些理解

第二章 描述性统计量

均值和平均值

均值(mean):一个包含 n 个值的样本xi值的总和除以值的数量的汇总统计量

均值计算公式: μ=1nnixi

Code:

def Mean(t):
    """Computes the mean of a sequence of numbers.

    Args:
        t: sequence of numbers

    Returns:
        float
    """
    return float(sum(t)) / len(t)

平均值(average):若干种可以用于描述样本的典型值或集中趋势的汇总统计量之一

方差

方差(variance):描述样本的分散情况

方差计算公式: σ2=1nni(xiμ)2
标准差计算公式: σ=σ2=1nni(xiμ)2

Code:

def MeanVar(t):
    """Computes the mean and variance of a sequence of numbers.

    Args:
        t: sequence of numbers

    Returns:
        tuple of two floats
    """
    mu = Mean(t)
    var = Var(t, mu)
    return mu, var

习题

计算南瓜重量的均值、方差和标准差

import thinkstats as ts
import math

def Pumpkin(t):
    mean,variance = ts.MeanVar(t)
    print('mean:',mean)
    print('variance:',variance)
    print('standard deviation:', math.sqrt(variance))

def main(name, data_dir='.'):
    pumpkin = [1, 1, 1, 3, 3, 591]
    Pumpkin(pumpkin)

if __name__ == '__main__':
    import sys

    main(*sys.argv)

计算第一胎婴儿的怀孕周期和其他婴儿怀孕周期的标准差,重写第一章first.py代码中的Process函数及Summarize函数

def Process(table):
    table.lengths = [p.prglength for p in table.records]
    table.n = len(table.lengths)
    # table.mu = Mean(table.lengths)
    table.mu, table.var = ts.MeanVar(table.lengths)

def Summarize(data_dir):
    table, firsts, others = MakeTables(data_dir)
    ProcessTables(firsts, others)
    print('Number of first babies', firsts.n)
    print('Number of others', others.n)
    mu1, mu2 = firsts.mu, others.mu
    print('Mean gestation in weeks:')
    print('First babies', mu1)
    print('Others babies', mu2)
    print('Difference in days', (mu1 - mu2) * 7.0)
    var1, var2 = firsts.var, others.var
    print('variance:')
    print('First babies', var1)
    print('Others babies', var2)
    print('standard deviation:')
    print('First babies', math.sqrt(var1))
    print('Others babies', math.sqrt(var2))

分布及直方图

分布(distribution):描述了各个值出现的频繁程度

# 字典 
# 给定序列t
hist = {}
for x in t:
    hist[x] = hist.get(x, 0) + 1

# 归一化:把频数转换成概率
# 给定序列t
n = float(len(t))
pmf = {}
for x, freq in hist.items():
    pmf[x] = freq / n

直方图(histogram):展示了各个值出现的频数或概率,归一化后的直方图称为PMF(Probability Mass Function, 概率质量函数)

直方图模块代码-Pmf.py

代码分析

Pmf.py中定义了以下三个类

类名描述
_DictWrapper表示一个包含字典的对象
Hist_DictWrapper的子类,表示一个直方图的对象
Pmf_DictWrapper的子类,表示一个概率质量函数对象

Pmf.py中还定义了以下七个函数

函数原型功能描述参数描述返回
MakeHistFromList(t, name=”)根据未排序的值序列生成的直方图t: 值的个数; name: 直方图的名称Hist对象
MakeHistFromDict(d, name=”)根据从值到频率的映射生成的直方图d: 从值到频率的映射字典; name: 直方图的名称Hist对象
MakePmfFromList(t, name=”)根据未排序的值序列生成的概率质量函数t: 值的个数; name: 概率质量函数的名称Pmf对象
MakePmfFromDict(d, name=”)根据从值到频率的映射生成的概率质量函数d: 值的个数; name: 概率质量函数的名称Pmf对象
MakePmfFromHist(hist, name=None)将直方图归一化为概率质量函数hist: Hist对象; name: 名称Pmf对象
MakePmfFromCdf(cdf, name=None)将CDF对象归一化为概率质量函数cdf: cdf对象; name: 新生成的Pmf对象的名称Pmf对象
MakeMixture(pmfs, name=’mix’)生成混合分布pmfs: 从Pmfs映射到概率的PMF; name: 新生成的Pmf对象的名称Pmf对象

直方图类对象使用范例

import Pmf

def main(name, data_dir='.'):
    hist = Pmf.MakeHistFromList([1, 2, 2, 3, 5])
    print(hist)
    #输出值为2的频数
    print(hist.Freq(2))
    # 输出值为4的频数
    print(hist.Freq(4))
    #返回未经排序的Hist类的对象所有值
    print(hist.Values())
    #按序遍历
    for val in sorted(hist.Values()):
        print(val, hist.Freq(val))
    #使用Items返回一组未经排序的值频数对
    for val, freq in hist.Items():
        print(val, freq)

if __name__ == '__main__':
    import sys
    main(*sys.argv)

PMF类对象使用范例

import Pmf

def main(name, data_dir='.'):
    pmf = Pmf.MakePmfFromList([6, 1, 2, 2, 3, 5])
    print(pmf)
    # 输出值为2的概率
    print(pmf.Prob(2))
    # 增加值为2的概率
    pmf.Incr(2, 0.2)
    print(pmf.Prob(2))
    # 概率扩大及缩小
    pmf.Mult(2, 0.5)
    print(pmf.Prob(2))
    # 返回所有概率的总和
    print(pmf.Total())
    # 重新归一化
    pmf.Normalize()
    print(pmf.Total())

if __name__ == '__main__':
    import sys
    main(*sys.argv)

习题

编写一个Mode函数,以Hist对象为参数,返回最频繁值

def Mode(hist):
    maxfreq = 0
    mfval = 0
    for val, freq in hist.Items():
        if freq >= maxfreq:
            mfval = val
            maxfreq = freq
    return mfval

编写一个AllModes函数,以Hist对象为参数,按频数降序排列的值频数对

import Pmf
from operator import itemgetter

def AllMode(hist):
    for val, freq in sorted(hist.Items(), key = itemgetter(1), reverse = True):
        print(val, freq)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值