此文用于记录在Allen B. Downey所著的《统计思维-程序员数学之概率统计》这本书的学习过程和一些理解
第二章 描述性统计量
均值和平均值
均值(mean):一个包含
n
个值的样本
均值计算公式: μ=1n∑nixi
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=1n∑ni(xi−μ)2
标准差计算公式: σ=σ2−−√=1n∑ni(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)