上个实例讲解了直方图的制作,本文讲解另一个表示分布的方法——概率质量函数(probability mass function, PMF)。概率质量函数将每个值映射到其概率,概率是频数的分数表示,样本量为n。Hist和Pmf的区别是,Hist将值映射到整型的计数值,Pmf将值映射到浮点型的概率值。
课堂规模悖论
在很多美国大学和学院里,学生与教师的比率约为10:1。但是学生们经常会惊讶地发现自己课上的平均学生数大于10.
造成这一现象的原因有两个:
- 学生通常每学期修4到5门课,但是教授经常只教1门或2门;
- 上小课的学生少,但上大课的学生人数非常多。
假设一所学院某学期开了65门课,选课人数分布如下:
size | count |
---|---|
5-9 | 8 |
10-14 | 8 |
15-19 | 14 |
20-24 | 4 |
25-29 | 6 |
30-34 | 12 |
35-39 | 8 |
40-44 | 3 |
45-49 | 2 |
每门课平均选课人数为23.7,具体实现代码如下:
import ThinkStats2_PMF
d = {7: 8, 12: 8, 17: 14, 22: 4,
27: 6, 32: 12, 37: 8, 42: 3, 47: 2}
pmf = ThinkStats2_PMF.Pmf(d, label='actual')
print('mean', pmf.Mean())
上面实现的ThinkStats2_PMF具体内容为:
import pandas
import numpy as np
from collections import Counter
import copy
import logging
class _DictWrapper(object):
#此处代码请参考《统计思维(实例1)》
#下面为该类新加代码
def __iter__(self):
return iter(self.d)
#返回keys迭代器
def iterkeys(self):
return iter(self.d)
#返回浅拷贝
def Copy(self, label=None):
new = copy.copy(self)
new.d = copy.copy(self.d)
new.label = label if label is not None else self.label
return new
#计算值和频率乘积
def Mult(self, x, factor):
self.d[x] = self.d.get(x, 0) * factor
#返回Map中频率的总和
def Total(self):
total = sum(self.d.values())
return total
#Pmf对象
class Pmf(_DictWrapper):
def Prob(self, x, default=0):
return self.d.get(x, default)
#计算PMF的均值