当数据量太大时,往往需要讲数据进行分组,这样能够有效的减少统计误差。
组数要适当,太少会有较大误差,太多规律显示不明显。
组数:将数据分组,当数据在100个以内时,按数据多少分为5-12组
组距:指小组的两个端点的距离。
极差 max(a) - min(a)
组数 = ------ = ----------------
组距 bin width
事例:假如你获取了250部电影的时长(列表a中),希望统计出这些电影时长的分布状态(比如时长为100分钟到120分钟的电影的数量,出现的频率)等信息,你应该如何呈现出这些数据?
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc",
size="x-small")
a = [73, 113, 90, 77, 98, 147, 150, 144, 90, 100, 76, 153, 124, 87, 108, 97, 98, 72, 113, 120, 83, 97, 111, 108, 116,
147, 127, 97, 137, 131, 137, 111, 88, 119, 82, 120, 135, 135, 89, 76, 112, 110, 142, 136, 89, 117, 103, 79, 133,
92, 124, 88, 83, 80, 125, 99, 114, 124, 140, 81, 143, 101, 150, 117, 113, 155, 90, 145, 122, 95, 100, 125, 83, 76,
131, 91, 151, 122, 151, 115, 77, 146, 145, 79, 80, 100, 108, 104, 105, 140, 110, 90, 133, 137, 152, 96, 151, 102,
146, 154, 136, 125, 88, 142, 82, 148, 105, 128, 118, 88, 74, 110, 75, 80, 107, 116, 94, 88, 132, 89, 123, 93, 116,
73, 148, 102, 153, 151, 154, 111, 111, 109, 142, 87, 75, 135, 120, 146, 120, 154, 131, 140, 85, 102, 138, 127, 72,
98, 124, 127, 112, 138, 105, 152, 97, 88, 126, 129, 118, 137, 155, 102, 85, 71, 110, 105, 132, 86, 86, 109, 131,
127, 149, 70, 83, 143, 148, 139, 91, 96, 148, 153, 134, 151, 103, 76, 111, 110, 93, 105, 101, 75, 137, 120, 89,
133, 151, 103, 108, 92, 111, 151, 127, 127, 72, 101, 77, 74, 136, 109, 141, 114, 100, 147, 128, 93, 103, 114, 97,
82, 111, 152, 142, 79, 142, 91, 152, 99, 81, 97, 83, 136, 105, 146, 148, 84, 141, 154, 138, 121, 153, 141, 102,
120, 72, 75, 143, 100, 83, 113]
# 组距
d = 5
# 计算组数
# 此处应注意 num_bins最好是整除的结果,否则可能会出现图形与刻度对应有偏差
num_bins = (max(a) - min(a)) // d
# 绘图
plt.hist(a, num_bins)
# x轴坐标
plt.xticks(range(min(a), max(a)+d, d))
# 绘制网格
plt.grid(alpha=0.3)
# 展示
plt.show()
在美国2004年人口普查发现有124million的人在距离家相对较远的地方工作,根据他们从家到上班地点所需的时间,通过抽样统计(最后一列)出了下标的数据,根据这些数据能够绘制直方图吗?
- 不能,直方图的绘制必须拿到原始数据
- 下面的数据是已经统计好的,所以我们可以使用条形图进行展示
Interval | Width | Quantity | Quantity/Width |
---|---|---|---|
0 | 5 | 4180 | 836 |
5 | 5 | 13687 | 2737 |
10 | 5 | 18618 | 3723 |
15 | 5 | 19634 | 3926 |
20 | 5 | 17918 | 3596 |
25 | 5 | 7190 | 1438 |
30 | 5 | 16369 | 3273 |
35 | 5 | 3212 | 642 |
40 | 5 | 4122 | 824 |
45 | 15 | 9200 | 613 |
60 | 30 | 6461 | 215 |
90 | 60 | 3435 | 57 |
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc",
size="x-small")
# 耗时
interval = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 90]
# 耗时间距
width = [5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 30, 60]
# 人数
quantity = [836, 2737, 3723, 3926, 3596, 1438, 3273, 642, 824, 613, 215, 47]
# 绘图
plt.bar(interval, quantity, width=width)
# x轴刻度
_x = [i-2.5 for i in interval]
plt.xticks(_x, interval)
# 网格
plt.grid(alpha=0.3)
# 展示
plt.show()