UCB Data100:数据科学的原理和技巧:第六章到第十章(4)https://developer.aliyun.com/article/1427171
8.3.1 信息通道
可视化能够通过各种编码传达信息。在本讲座的其余部分,我们将看看颜色、规模和深度的使用。
8.3.1.1 Rugplots 中的编码
在我们早期讨论 rugplots 时,我们可能忽视了编码的重要性。Rugplots 是有效的可视化,因为它们利用线条粗细来编码频率。考虑以下图表:
8.3.1.2 多维编码
编码也对表示多维数据很有用。注意以下可视化突出了数据的四个不同“维度”:
- X 轴
- Y 轴
- 面积
- 颜色
人类视觉感知系统只能在三维平面上可视化数据,但正如你所见,我们可以编码更多的信息通道。
8.3.2 利用坐标轴
8.3.2.1 考虑数据的规模
然而,我们应该小心,不要通过操纵比例尺或坐标轴来误传数据中的关系。下面的可视化不正确地描绘了同一图上两个看似独立的关系。作者明显改变了 y 轴的比例尺,以误导他们的观众。
注意向下的线段包含数百万的值,而向上趋势的线段只包含接近三十万的值。这些线段不应该相交。
当数据的数量级差异很大时,建议分析百分比而不是计数。以下图表正确显示了癌症筛查和流产率的趋势。
8.3.2.2 揭示数据
出色的可视化不仅考虑数据的规模,还利用坐标轴以最佳方式传达信息。例如,数据科学家通常设置某些坐标轴限制以突出他们最感兴趣的可视化部分。
右侧的可视化捕捉了 2020 年 3 月冠状病毒病例的趋势。仅仅通过观察左侧的可视化,观众可能会错误地认为冠状病毒在 2020 年 3 月 4 日开始急剧上升。然而,第二幅插图讲述了一个不同的故事-病例在 2020 年 3 月 21 日左右上升。
8.3.3 利用颜色
颜色是可视化中的另一个重要特征,它的作用远不止看上去的那么简单。
我们已经探讨了在散点图中使用颜色来编码分类变量。现在让我们讨论在新颖的可视化中使用颜色的用途,比如色图和热图。
世界上 5-8%的人是红绿色盲,所以我们必须非常注意我们的配色方案。我们希望尽可能地使这些配色方案易于访问。选择一组能够很好地配合的颜色显然是一项具有挑战性的任务!
8.3.3.1 色图
色图是从像素数据到颜色值的映射,它们经常用于突出图像的不同部分。让我们来研究一下色图的一些特性。
Jet Colormap
Viridis Colormap
jet 色图因为不是感知均匀而臭名昭著。虽然它看起来比 viridis 更生动,但是激烈的颜色很差地编码了数值数据。为了理解原因,让我们分析以下图像。
左侧的图表比较了各种色图如何表示从高到低强度的像素数据。这些包括 jet 色图(a 行)和灰度(b 行)。注意灰度图像在平滑过渡像素数据方面做得最好。jet 色图在这方面是最差的 - a 行的四幅图像看起来像是一团独立的颜色。
这种差异在左侧标有(a)和(b)的图像中也是明显的。灰度图像更擅长保留垂直线条中的细节。此外,X 射线扫描中更偏好灰度图像,因为它更加中性。jet 色图中深红色的强度令人恐惧,并且表明出现了问题。
为什么 jet 色图要糟糕得多?答案在于它的颜色组合对人眼的感知。
Jet Colormap Perception
Viridis Colormap Perception
jet 色图在很大程度上是误导性的,因为它不是感知均匀的。感知均匀色图具有这样的特性,即如果像素数据从 0.1 到 0.2,感知变化与数据从 0.8 到 0.9 时的感知变化相同。
注意在 viridis 色图中显示的线性趋势中存在的均匀性。另一方面,jet 色图大部分是非线性的 - 这正是为什么它被认为是一个更糟糕的色图的原因。
8.3.4 利用标记
在我们之前对多维编码的讨论中,我们分析了一个带有四个伪维度的散点图:两个轴,面积和颜色。这些是否适合使用?以下图表分析了人眼在这些“标记”之间的区分能力。
从这张图表中有一些关键的收获
- 长度很容易辨别。不要使用有杂乱基线的图表 - 保持一切与坐标轴对齐。
- 避免使用饼图!角度判断不准确。
- 面积和体积很难区分(面积图,词云等)。
8.3.5 利用条件
条件是比较属于不同组的数据的过程。我们之前在叠加分布,并排箱线图和带有分类编码的散点图中见过这种情况。在这里,我们将介绍正式化这些例子的术语。
考虑一个例子,我们想要分析男性和女性在不同教育水平下的收入。有多种方法可以比较这些数据。
条形图是并列的一个例子:将多个图表并排放置,使用相同的比例尺。散点图是叠加的一个例子:将多个密度曲线和散点图叠加在一起。
哪种更好取决于手头的问题。在这里,叠加使得从一个快速浏览中清楚地看出了精确的工资差异。然而,许多复杂的图表传达的信息更有利于使用并列。下面是一个例子。
8.3.6 利用上下文
一个出色可视化的最后组成部分可能是最关键的 - 使用上下文。添加信息丰富的标题,坐标轴标签和描述性标题都是我们在 Data 8 中一再听到的最佳实践。
一张可发布的图(以及每个 Data 100 图)需要:
- 信息丰富的标题(要点,而不是描述),
- 坐标轴标签,
- 参考线,标记等,
- 图例,如果适用,
- 描述数据的标题,
标题应该:
- 要全面和自包含,
- 描述了图表中的内容,
- 吸引人们注意重要的特征,
- 描述了从图表中得出的结论。
九、抽样
原文:Sampling
译者:飞龙
学习成果
- 了解如何适当地收集数据以帮助回答问题。
在数据科学中,了解人口特征始于拥有质量数据进行调查。虽然通常不可能收集描述人口的所有数据,但我们可以通过适当地从人口中抽样来克服这一问题。在本文中,我们将讨论从人口中抽样的适当技术。
生命周期图
9.1 普查和调查
一般来说:普查是“对人口的官方计数或调查,通常记录个体的各种细节。”一个例子是 2020 年 4 月举行的美国十年一次人口普查。它统计了居住在所有 50 个州、哥伦比亚特区和美国领土的每个人,而不仅仅是公民。法律要求参与(这是由美国宪法规定的)。重要用途包括联邦资金的分配、国会代表权以及划分国会和州立法机构选区。普查由寄往美国不同住房地址的调查组成。
调查是一组问题。一个例子是工作者对个人和家庭进行抽样。提出的问题以及提问的方式可能会影响受访者的回答,甚至可能影响他们是否首先回答。
虽然普查很好,但往往很难和昂贵地对人口中的每个人进行调查。想象一下美国在 2020 年人口普查上花费的资源、金钱、时间和精力。虽然这确实给我们提供了更准确的人口信息,但通常是不可行的。因此,我们通常只对人口的一个子集进行调查。
样本通常是人口的子集,通常用于对人口进行推断。如果我们的样本很好地代表了我们的人口,那么我们可以使用它以较低的成本获取有用信息。也就是说,样本的抽取方式将影响这种推断的可靠性。抽样中的两个常见误差来源是偶然误差,随机样本可能与预期的任何方向不同,以及偏差,这是一个方向上的系统误差。偏差可能是许多因素的结果,例如我们的抽样方案或调查方法。
让我们定义一些有用的词汇:
- 人口:你想了解的群体。
- 人口中的个体并不总是人。其他人口包括你肠道中的细菌(使用 DNA 测序进行抽样)、某种树木、获得小额贷款的小企业,或者学术期刊或领域中发表的结果。
- 抽样框架:从中抽取样本的列表。
- 例如,如果抽样人员,则抽样框架是可能最终进入样本的所有人的集合。
- 样本:你最终抽样的对象。因此,样本是你的抽样框架的一个子集。
虽然理想情况下,这三组将完全相同,但实际上通常并非如此。例如,可能有个体在你的抽样框架(因此也在你的样本)中,而不在你的人口中。而且一般来说,样本大小要比人口大小小得多。
抽样框架
9.2 偏差:案例研究
以下案例研究改编自 Freedman、Pisani 和 Purves 的《统计学》,W.W. Norton NY,1978 年。
1936 年,民主党总统富兰克林·D·罗斯福竞选连任,对手是共和党的阿尔夫·兰登。和往常一样,选举前几个月进行了民意调查,试图预测结果。文学文摘是一本成功预测了 1936 年之前 5 次大选结果的杂志。在他们对 1936 年选举的调查中,他们向从电话簿、杂志订阅者名单和乡村俱乐部会员名单中找到的 1000 万人发送了调查。在大约 240 万人中,只有 43%的人报告说他们会投票给罗斯福;因此,文摘预测兰登会获胜。
在选举日,罗斯福以压倒性优势获胜,获得了约 4500 万选民中 61%的普选票。为什么文摘的民意调查会出现如此错误的情况?
事实证明,文学文摘的样本并不代表人口。他们在电话簿、杂志订阅者名单和乡村俱乐部会员名单中找到的样本更富裕,倾向于投票共和党。因此,他们的抽样框架在本质上偏向兰登。文学文摘完全忽视了仍然在大萧条中受苦的大多数选民。此外,他们的回应率很低(约 24%);谁知道其他未回应者会如何投票?文学文摘在这场灾难后仅 18 个月就倒闭了。
与此同时,正在崛起的统计学家乔治·盖洛普也对 1936 年的选举做出了预测。尽管他的样本量“只有”5 万人(这仍然比必要的要多;我们在讨论中心极限定理时会更多),但他对 56%的选民会选择罗斯福的估计更接近实际结果(61%)。盖洛普还预测了文学文摘的预测,样本量只有 3000 人,通过预测文学文摘的富裕抽样框架并对这些个体进行子抽样,预测了文学文摘的预测,只有 1%的误差。
所以这个故事的寓意是什么?样本虽然方便,但容易受到偶然误差和偏见的影响。选举民意调查,特别是可能涉及许多偏见来源。举几个例子:
- 选择偏见系统性地排除(或偏爱)特定群体。
- 例如:文学文摘调查排除了不在电话簿上的人。
- 如何避免:检查抽样框架和抽样方法。
- 回应偏见是因为人们并不总是如实回答。调查设计者特别注意问题的性质和措辞,以避免这种偏见。
- 例如:非法移民在人口普查调查中被问及公民身份问题时可能不会如实回答。
- 如何避免:检查问题的性质和调查方法。
- 非响应偏见是因为人们并不总是回应调查请求,这可能会扭曲回应。
- 例如:只有 1000 万人中的 240 万人回应了文学文摘的调查。
- 如何避免:保持调查简短,坚持不懈。
今天,盖洛普民意调查是选举结果的主要民意调查之一。许多偏见来源——谁会回答民意调查?选民是否会说实话?我们如何预测投票率?——仍然存在,但盖洛普民意调查采用了几种策略来减轻这些偏见。在他们的抽样框架中,“美国大陆的成年电话家庭的非机构化人口”,他们使用随机数字拨号来包括列出/未列出的电话号码,并避免选择偏见。此外,他们使用了一个在家庭内部的选择过程,随机选择一个或多个成年人的家庭。如果没有人回答,多次重新拨号以避免非响应偏见。
9.3 概率样本
在取样时,关注样本的质量而不是样本的数量至关重要。庞大的样本量并不能弥补糟糕的取样方法。我们的主要目标是收集代表所在人口的样本。在本节中,我们将探讨不同类型的取样及其优缺点。
便利样本是你能够得到的任何样本;这种取样是非随机的。请注意,潦草的取样不一定是随机取样;存在许多潜在的偏差来源。
在概率样本中,我们提供了任何指定的个体集将被选入样本的机会(人口中的个体可以有不同的被选中机会;它们不必全部一致),我们根据这个已知的机会随机取样。因此,概率样本也被称为随机样本。随机性带来了一些好处:
- 因为我们知道源概率,我们可以测量误差。
- 随机取样使我们得到人口更具代表性的样本,从而减少偏见。(注意:只有在我们从中进行取样的概率分布准确时才是这样。使用“糟糕”或不准确的分布进行随机取样可能会产生对人口数量的偏见估计。)
- 概率样本使我们能够估计偏差和机会误差,这有助于我们量化不确定性(在未来的讲座中会详细介绍)。
现实世界通常更加复杂,我们经常不知道最初的概率。例如,我们通常不知道微生物组样本中某个细菌的概率,或者盖洛普打电话时人们是否会接听。尽管如此,我们仍然尽力模拟概率取样,即使取样或测量过程并不完全在我们的控制之下。
一些常见的随机取样方案:
- 带替换的随机样本是一个均匀随机带替换的样本。
- 随机并不总是意味着“均匀随机”,但在这个特定的上下文中,它是这样的。
- 人口中的一些个体可能会被多次选中。
- 简单随机样本(SRS)是一个均匀随机不带替换的样本。
- 每个个体(和个体子集)被选中的机会都是相同的。
- 每对的机会都与其他每对相同。
- 每个三元组的机会都与其他三元组相同。
- 等等。
- 分层随机样本,在这种样本中,对分层(特定群体)进行随机抽样,这些群体一起构成一个样本。
9.3.1 示例方案 1:概率样本
假设我们有 3 个助教(Alan,Bennett,Celine):我决定按以下方式对其中 2 个进行取样:
- 我以 1.0 的概率选择 A
- 我选择 B 或 C,每个的概率为 0.5。
我们可以在表中列出所有可能的结果及其相应的概率:
结果 | 概率 |
{A, B} | 0.5 |
{A, C} | 0.5 |
{B, C} | 0 |
这是一个概率样本(尽管不是很好的样本)。在我的人口中有 3 个人,我知道每个子集的机会。假设我正在测量助教离校园的平均距离。
- 这个方案没有看到整个人口!
- 我使用我取得的单个样本进行估计,这取决于我看到 AB 还是 AC 的机会误差。
- 这个方案对 A 的回应有偏见。
9.3.2 示例方案 2:简单随机样本
考虑以下取样方案:
- 一个班级花名册上按字母顺序列出了 1100 名学生。
- 随机选择名单上的前 10 个学生中的一个(例如学生 8)。
- 要创建你的样本,取那个学生以及其后每 10 个学生(例如学生 8、18、28、38 等)。
这是一个概率样本吗?
是的。对于一个样本[n, n + 10, n + 20, …, n + 1090],其中 1 <= n <= 10,该样本的概率为 1/10。否则,概率为 0。
只有 10 个可能的样本! 每个学生被选中的概率相同吗? 是的。每个学生被选择的概率是 1/10。 这是一个简单随机样本吗? 不是。选择(8, 18)的机会是 1/10;选择(8, 9)的机会是 0。
9.3.3 演示:Barbie v. Oppenheimer
我们正在尝试从伯克利居民中收集一个样本,以预测 Barbie 和 Oppenheimer 中哪一个在它们的开放日 7 月 21 日表现更好。
首先,让我们获取一个数据集,其中包含伯克利的每个居民(这是一个虚假数据集),以及他们实际在 7 月 21 日观看的电影。
让我们加载movie.csv
表。我们可以假设:
is_male
是一个布尔值,表示居民是否认为自己是男性。- 他们在 7 月 21 日只能观看两部电影:Barbie 和 Oppenheimer。
- 每个居民在 7 月 21 日都会观看一部电影(要么是 Barbie,要么是 Oppenheimer)。
代码
import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns sns.set_theme(style='darkgrid', font_scale = 1.5, rc={'figure.figsize':(7,5)}) rng = np.random.default_rng()
movie = pd.read_csv("data/movie.csv") # create a 1/0 int that indicates Barbie vote movie['barbie'] = (movie['movie'] == 'Barbie').astype(int) movie.head()
age | is_male | movie | barbie | |
0 | 35 | False | Barbie | 1 |
1 | 42 | True | Oppenheimer | 0 |
2 | 55 | False | Barbie | 1 |
3 | 77 | True | Oppenheimer | 0 |
4 | 31 | False | Barbie | 1 |
伯克利居民中选择 Barbie 的比例是多少?
actual_barbie = np.mean(movie["barbie"]) actual_barbie
0.5302792307692308
这是比赛的实际结果。根据这个结果,Barbie 会获胜。我们的退休人员样本的表现如何?
9.3.3.1 便利样本:退休人员
让我们方便地抽取已经退休的人(年龄>=65 岁)。其中有多少比例的人去看 Barbie 而不是 Oppenheimer?
convenience_sample = movie[movie['age'] >= 65] # take a convenience sample of retirees np.mean(convenience_sample["barbie"]) # what proportion of them saw Barbie?
0.3744755089093924
根据这个结果,我们本来会预测 Oppenheimer 会获胜!发生了什么?我们的样本可能太小或者太嘈杂了吗?
# what's the size of our sample? len(convenience_sample)
359396
# what proportion of our data is in the convenience sample? len(convenience_sample)/len(movie)
0.27645846153846154
看起来我们的样本相当大(大约 360,000 人),所以误差很可能不仅仅是由于偶然性造成的。
9.3.3.2 检查偏差
让我们按年龄汇总所有选择,并可视化按性别分割的 Barbie 观看比例。
votes_by_barbie = movie.groupby(["age","is_male"]).agg("mean", numeric_only=True).reset_index() votes_by_barbie.head()
age | is_male | barbie | |
0 | 18 | False | 0.819594 |
1 | 18 | True | 0.667001 |
2 | 19 | False | 0.812214 |
3 | 19 | True | 0.661252 |
4 | 20 | False | 0.805281 |
代码
# A common matplotlib/seaborn pattern: create the figure and axes object, pass ax # to seaborn for drawing into, and later fine-tune the figure via ax. fig, ax = plt.subplots(); red_blue = ["#bf1518", "#397eb7"] with sns.color_palette(red_blue): sns.pointplot(data=votes_by_barbie, x = "age", y = "barbie", hue = "is_male", ax=ax) new_ticks = [i.get_text() for i in ax.get_xticklabels()] ax.set_xticks(range(0, len(new_ticks), 10), new_ticks[::10]) ax.set_title("Preferences by Demographics");
- 我们看到退休人员(在伯克利)倾向于观看 Oppenheimer。
- 我们还看到,认为自己不是男性的居民倾向于喜欢 Barbie。
9.3.3.3 简单随机样本
假设我们取了一个与我们的退休人员样本相同大小的简单随机样本(SRS):
n = len(convenience_sample) random_sample = movie.sample(n, replace = False) ## By default, replace = False np.mean(random_sample["barbie"])
0.5304483077162795
这与 0.5302792307692308 的实际投票结果非常接近!
事实证明,我们可以用更小的样本量(比如 800)得到类似的结果:
n = 800 random_sample = movie.sample(n, replace = False) # Compute the sample average and the resulting relative error sample_barbie = np.mean(random_sample["barbie"]) err = abs(sample_barbie-actual_barbie)/actual_barbie # We can print output with Markdown formatting too... from IPython.display import Markdown Markdown(f"**Actual** = {actual_barbie:.4f}, **Sample** = {sample_barbie:.4f}, " f"**Err** = {100*err:.2f}%.")
实际 = 0.5303,样本 = 0.5275,误差 = 0.52%。
我们将在本学期后期(重新)学习中心极限定理时学习如何选择这个数字。
UCB Data100:数据科学的原理和技巧:第六章到第十章(6)https://developer.aliyun.com/article/1427173