密西根大学公共部门的-R-数据分析笔记-全-
密西根大学公共部门的 R 数据分析笔记(全)
1:欢迎辞与课程概述 🎉

在本节课中,我们将学习密歇根大学《公共部门的R数据分析》证书课程的欢迎辞与整体介绍。课程将阐述数据分析在公共部门中的核心作用,并概述整个系列课程的结构与学习目标。
世界上有近200个国家,数千个州、省和地区政府,以及数十万个地方政府。每一个政府单位都需要数据和信息来完成其行政和立法工作,以分配资源和做出决策。数据的作用,以及能够收集、分析和沟通数据的专业人才的需求,对公共部门的工作至关重要。
本证书课程专为当前和未来的公共部门专业人士设计,他们的任务是收集、解释和共享数据,以用于公共行政和公共政策制定。

课程结构

该证书包含四门课程,每门课程都旨在帮助学习者掌握分析和技术技能,并了解如何在公共部门工作中应用这些技能。
以下是四门课程的具体内容:
- 使用R进行公共部门数据分析基础
- 使用GGplot进行公共管理的探索性数据分析
- 利用数据与政策分析辅助公共部门决策者
- 公共部门数据分析的政治与伦理考量
每门课程都将帮助你使用R构建数据分析技能,同时加深你对公共部门如何运作的理解,认识到高质量的数据分析对于政府功能和目标实现至关重要。



讲师介绍

我是克里斯·布鲁克斯,我是保拉·兰斯。我们在此向你介绍《公共部门的R数据分析》证书课程,并担任你的讲师。我们很高兴共同设计了这四门课程,并非常荣幸能在此次学习体验中担任你的导师。
让我们进一步介绍一下自己。
我是密歇根大学信息学院的教员。我很荣幸在Coursera平台上为数以万计的学生教授数据科学课程。在那些课程中,我主要关注Python生态系统中的数据科学,但在这门课程中,我很高兴向你介绍精彩的R语言世界。
我是密歇根大学公共政策与健康管理与政策专业的教授。我教授的课程包括公共政策基础、项目与政策评估的研究方法,以及公共卫生与社会政策。我的学术背景是社会人口学、流行病学和健康政策。在成为我热爱的“书呆子”教授之前,我曾在一个县级少年法庭系统担任政策分析师,并在一个州卫生部门担任流行病学家和政策分析师。在我的研究中,我专注于理解和解决健康方面的社会不平等问题,经常与美国联邦政府以及州和地方政府合作,主要是与他们的健康和社会福利服务部门合作。我非常高兴能成为这个系列课程的一部分,并为你提供数据分析在公共部门中重要作用的基础背景知识。
你将主要与我和布鲁克斯教授一起学习,但在学习过程中,我们还将邀请许多其他专家加入,他们渴望与你分享他们的知识和经验。
成功学习指南
我们真心希望你拥有愉快、有价值且成功的学习体验。那么,你该如何做到呢?
首先,本证书课程建立在你已有的一些知识和技能之上。我们假设你已经具备一些处理数据的基本技能(可能通过电子表格),并且至少接触过编程(尽管可能还不是R语言)。我们还假设你接触过一些入门级的统计学知识。

除此之外,如果你能采取动手实践和探索性的方法来学习课程内容,你将能在这门课程中取得最大的成功。我们努力使这一点变得容易:你不仅可以看到展示R代码的视频和笔记,我们还直接将RStudio平台嵌入到课程中供你使用,因此你无需在自己的计算机上安装任何软件。

我们不假设你之前有任何在公共部门工作的经验,或任何公共行政或公共政策方面的知识。
为了在这一系列课程中取得成功,你真正需要做的主要事情包括:
- 保持参与:尝试建立一个适合你生活节奏的学习进度。
- 完成所有内容:观看所有视频,并完成所有推荐以及要求的学习活动。这主要涉及使用RStudio实际进行数据分析,但也包括其他类型的应用技能构建活动。
- 保持好奇与热情:要知道,你正在以一种可能为你带来新工作机会的方式投资自己,并且是在全球经济中一个非常庞大的领域。
- 定义个人成功标准:最重要的是,确保定义你自己的个人成功衡量标准,并投入到我们提供的材料和技能构建练习中。
课程目标与总结



我们希望你能坚持完成所有四门课程。到课程结束时,你将掌握入门级R课程所涵盖的技能,以及公共行政和公共政策入门课程所涵盖的基础知识。这包括贯穿整个系列的一个重要主题:虽然高质量的数据和客观的数据分析对公共部门的工作至关重要,但数据本身永远不会告诉决策者该做什么,因为这不可避免地涉及相互竞争的价值观、伦理考量和政治因素。

让我们开始吧。我们期待与你共度时光,并在学习过程中保持你的兴趣和参与度。我们希望你会发现我们的共同工作有趣、富有挑战性、有价值,并且最重要的是充满乐趣。


我们很快将在第一门课程《公共部门数据分析基础》中与你见面。该课程将涵盖公共行政的核心职能、调查与人口数据的基础知识,以及如何使用R编程语言清理数据和回答问题。
2:公共部门定义与公共产品-服务解析 📚


在本节课中,我们将要学习公共部门数据分析的基础背景知识。在深入探讨具体的数据分析技术和应用之前,我们需要首先明确一些核心术语和概念。本节将重点定义四个关键术语:公共部门、公共产品与服务、公共行政以及公共政策。
公共部门的定义 🏛️
首先,什么是公共部门?公共部门是指政府行动和活动的主要活动及其后果,这些活动主要与政府提供公共产品和服务相关。

我们通常认为单个国家乃至全球的经济体包含三个主要部门:
- 私营部门:以营利为目的的商业活动。
- 非营利部门:不以营利为目的的商业和组织,例如慈善机构、教会、非政府组织、倡导团体、非营利大学等。
- 公共部门:即政府。公共部门是政府在经济中的行动及其后果,包括提供公共产品(如道路、电网、桥梁、公园)和公共服务(如邮件递送、垃圾收集、教育、各类许可证)。

在服务方面,政府还为其他部门(包括私营部门的经济市场)的活动提供法规或规则。


实际上,这三个部门存在重叠,并非完全独立运作。经济中存在一些重要的公私合作伙伴关系,以及私营、公共和非营利部门共同协作生产产品和服务的领域。然而,就我们的主要目的而言,经济中确实存在三个主要部门,而公共部门特指由政府生产的部分。
公共产品与服务 🛡️

接下来,什么是公共产品?广义上,我们讨论的是“公共利益”或政府提供服务的使命。政府提供产品和服务,也提供保护,这些是其他两个部门(私营部门和非营利部门)不愿意、无法提供,或者若由市场提供会导致严重社会公平问题的。

此外,经济学中有一个非常具体的术语叫做“公共产品”。其定义是:由政府非营利性地资助和提供的、能带来社会效益的产品和服务。它们具有两个核心特性:
- 非竞争性:一个人消费该产品或服务不会减少另一个人对其的可用性。
- 非排他性:它们广泛地对所有人可用。
以下是公共产品的一些例子:
- 国家安全:政府保护人民免受外部威胁。
- 公共安全:保护人民免受本地或国内威胁。
- 公共交通、运输和基础设施:如能源基础设施、道路、桥梁、隧道、水坝等。
- 空气、水和其他环境保护。
- 公共卫生保护。
- 互联网基础设施:需要说明的是,作为公共产品,重点在于基础设施本身,而非实际服务。例如,政府提供的是让人们能够接入互联网的基础设施,而大多数人为实际的互联网服务付费。
- 政府对科学研究的资助。
- 面向需要者的社会福利产品和服务:如收入支持、食品、住房和医疗保健。



公共行政与公共政策 ⚙️


上一节我们介绍了公共产品,本节中我们来看看公共行政。从根本上说,公共行政是运营政府的业务。




总结来说,本节课我们一起学习了公共部门数据分析的基本概念框架。我们明确了公共部门是指政府提供产品和服务(包括公共产品)的活动领域;公共产品具有非竞争性和非排他性;而公共行政则是政府运作的核心。理解这些基础概念,是后续运用R语言进行公共部门数据分析的重要前提。
3:数据科学与数据分析导论 📊

在本节课中,我们将要学习数据科学与数据分析如何应用于公共行政与政策领域。课程将避免复杂的数学形式化概念,重点在于如何通过R编程语言实际执行调查和分析公共数据。
概述:从探索性数据分析说起



我们将要进行的许多工作被称为探索性数据分析,简称EDA。这个术语源自约翰·图基1977年关于此主题的著作。图基是一位在统计建模和检验方面有影响力的统计学家,但他认为统计学界过于强调假设检验。因此,他创造了“探索性数据分析”这个短语,来概括数据分析师用于更好地理解和洞察数据的一系列技术。



通过这项工作,图基表明他认为统计学实际上有两个分支:一个是更具探索性、主要以可视化为主的分支;另一个则是更具验证性、主要基于假设检验的分支。
图基的贡献与数据思维的转变

图基的工作对本课程至关重要,我们将花大量时间探讨在R中应用EDA的不同方法。实际上,图基代表了一种数据思维的转变。早在1961年,他发表了一篇关于数据分析未来的论文,在开篇第一句就质疑自己是否真的是一名统计学家,并将我们引向“数据分析”的实践。
他将数据分析定义为:分析数据的流程、解释这些流程结果的技术、规划数据收集以使其分析更简单、更精确或更准确的方法,以及所有适用于分析数据的数理统计机制与结果。



正是这一点,将本课程与其他教授R语言的课程区分开来。虽然有许多课程介绍如何使用R进行统计学学习,但我们将在公共政策的背景下进行学习,其真正目标是帮助你成为一名由R驱动的数据分析师。
数据科学家与数据分析师的区别


我经常被问到:数据科学家和数据分析师有什么区别?这其实并不那么清晰。如果我们快进到2015年,可以看到大卫·多诺霍在图基百年诞辰研讨会上发表的演讲,他后来将其发表为《数据科学的50年》。在演讲中,多诺霍认为该领域正沿着图基指出的方向持续发展,并列举了包括约翰·钱伯斯和比尔·克利夫兰在内的其他有影响力的应用统计学家,他们帮助引入了各种其他探索性数据分析方法。
基于此,多诺霍提出,数据科学实际上由六种不同的活动组成。
以下是这六种核心活动:
- 数据收集、准备与探索:无论是清洗数据、将数据与代码簿对齐,还是进行可视化探索,这一类别可能占据了数据科学家80%的时间和活动。在本系列课程中,我们将花大量时间学习能让你快速有效理解数据的工具和技术。


-
数据表示与转换:这包括数据库等计算格式,以及数学表示形式。在本课程中,我们将主要使用一种非常具体且如今几乎无处不在的数据表示格式,称为数据框,并且这一切都将在R中完成。数据科学家还使用许多其他类型的数据表示,例如用于建模社会关系的图、树和网络,以及用于建模文本数据的嵌入和向量空间。不过,大多数公共行政和政策数据都位于关系型或表格数据中,例如CSV文件,因此本系列将重点讨论这些。
-
数据计算:在这一类别中,多诺霍首先提出,我们作为数据科学家应努力成为“多语言者”,学习多种计算机语言来处理数据。本课程将特别只关注一种语言,但我强烈建议,如果你有时间,可以考虑学习其他语言和工具,因为每种语言都有其自身的优势和机会。


-
数据可视化与呈现:这一类别与探索类别有所重叠,但更侧重于可视化的机制以及向读者传达信息。我们将在此探讨许多关于如何制作引人注目且有意义的可视化图表的话题。虽然我们无法全面讨论这个主题,但会简要介绍如何使用R创建仪表板,这是一个非常棒的功能,可以让你相对快速地从数据过渡到交互式可视化。
-
数据建模:这将是本课程仅会涉及的一个领域。数据建模是一个庞大的主题,涵盖了从基本线性回归到深度神经网络、大数据方法以及整个机器学习领域的广度。深入研究这一领域需要投入传统的推断统计学内容或机器学习算法与方法。然而,通过应用机器学习来专注于数据建模应用的机会越来越多。


- 关于数据科学的科学:多诺霍呼吁像我这样使用和教授数据科学的学者,去理解实际应用中的实践,研究如何让人们更好地进行数据科学,并将我们的学术研究转向我们所教授的这些实践。这本身不是本课程要讨论的内容,但我希望你能感受到我在这方面工作的影响。我在密歇根大学的研究专注于学习分析,即使用数据科学方法来理解和优化学习。教授多样化的数据科学课程,无论是在大学里还是像这样的慕课中,都是我理解和开展学术研究的绝佳平台。
总结


本节课中我们一起学习了数据科学与数据分析的导论。我们快速概述了数据分析与数据科学的领域,了解了探索性数据分析的起源及其重要性,并区分了数据科学家所从事的六类核心活动。我们将以非常应用化的方式,使用真实世界的数据集、示例和问题,在R语言环境中来应对这些挑战。让我们开始深入学习吧。
4:公共行政与公共政策内涵解析 📚


在本节课中,我们将要学习公共行政与公共政策这两个核心概念的定义、框架及其相互关系。理解这些概念是运用数据分析支持公共部门决策的基础。
公共行政的定义 🏛️

接下来我们要定义的是公共行政。从根本上说,公共行政是管理政府的业务。它是一个类似于工商管理的专业领域,但这里应用于公共部门所有活动的管理。这是一个领域内的宏大概念,但我们可以将其总结为:
公共行政是实现和达成政府目的与目标的工作和手段,以及执行政府职能、政策和项目,并提供公共产品所涉及的活动。


我们倾向于认为公共行政主要是政府的行政部门。一般而言,世界上大多数民主国家的政府(这是目前最常见的政府形式)都分为三个分支:立法分支(制定法律和优先事项)、行政或管理分支(实施和执行法律与优先事项),以及司法分支或法院系统(执行和解释法律)。公共行政确实是政府行政或管理分支的核心。其他两个分支(立法和司法)的工作也需要行政管理,因此公共行政涉及政府所有层级和分支的工作及其相互关系。
公共行政的框架 📊
现在,我想介绍两个与公共行政相关的框架,我们将在整个学习过程中使用它们。随着课程的深入,我们将更详细地讨论它们。但现在,我只想向你们介绍一下。


第一个框架被称为公共行政的四大支柱,你可以将其视为公共行政的使命或主要目标。
以下是四大支柱的简要介绍:

- 经济性:即如何最佳地利用和分配稀缺资源。虽然几乎所有人都认为税收太高,政府从人民和企业那里收取了太多钱,但同样的事实是,大多数政府没有足够的资金或其他资源来做所有他们需要和想做的事情。因此,公共行政的一部分就是弄清楚可以获取哪些资源,然后如何最佳地分配它们。
- 效率:这与经济性支柱相关,意味着公共管理者必须弄清楚哪些行动能针对特定的资源投入实现最大的效益。目标是尽可能高效地利用资源,或以最少的投入实现最多的产出。
- 有效性:资源的分配和投资也必须是有效的。它必须产生影响,必须有助于达成目标、减轻或缓解问题,或提供某种可衡量的效益。
- 公平性:大多数政府在其宪法或法律设计中都高度重视社会公平。这意味着在向不同人群或社区提供机会、资源和福利时必须公平。

请注意,公平并不意味着资源、机会和结果的平等或相同。公平意味着在机会和资源方面提供公平性。这通常涉及根据社会中可能存在的特定需求、能力、偏见和歧视,提供不同程度的额外援助和支持。

公共行政的这四大支柱都依赖于数据。数据收集和分析对于实现这四大支柱至关重要。

公共行政的核心职能 ⚙️

今天我想介绍的第二个公共行政概念模型,侧重于公共行政做什么,或称为公共行政的核心职能。

随着课程的推进,我们将更详细地讨论所有这些职能。但今天,这里只是快速浏览一下公共行政七大核心职能的模型:

以下是七大核心职能:
- 规划
- 组织
- 人事
- 指挥
- 预算
- 报告
- 协调

所有这些职能都很重要,并且都严重依赖于信息、指标和复杂的数据分析。
公共政策的定义 📜

好的,我们的定义部分即将完成。我们要定义的第四个关键概念是公共政策。与公共行政一样,公共政策是其自身的研究和专业实践领域。


我们将在后续课程中更深入地探讨公共政策。今天,我将为你们提供一个非常简单的解释:公共政策是宪法、法律、法规、法院裁决、行政规则、行政命令、指南、建议以及政府可能采取的其他行动方针。并且,它的定义还可以包括政府实体制定的资金优先事项。

总而言之,它是各级政府(地方市或市政府、城市、区、教区等层级政府、州/省/地区级以及国家级)制定的规则和计划或确定的行动方针。此外,实际上还存在一些国际政策和国际法。
每个国家都有成千上万的公共政策例子。同样,我们稍后会更详细地讨论这一点。但现在,关于公共政策,我希望你们记住几件事,我们可以做出一些概括。

公共政策的特征 🔍

以下是关于公共政策的几个重要概括:
- 形式多样:首先,公共政策在许多情况下可以是并且确实是非常正式的。它之所以正式,是因为它包括法律、法规、高等法院裁决等事物,如果人们不遵守,就会产生后果。但公共政策也可以是非正式的。它可以是政府制定的一系列指南,例如疫情期间推荐的口罩佩戴行为、教育或大众媒体宣传活动、专注于如何戒烟的社会营销活动、促进婴儿母乳喂养、就发短信和驾驶向公众发出警告等。即使你不遵守也不会产生后果的事情,仍然被认为是公共政策,它们是政府正在采取的特定行动方针和信息提供。
- 涉及所有政府分支:第二个概括是,公共政策发生在政府的所有分支中。我们倾向于认为公共政策主要是立法者或法律制定者做的事情,这绝对是正确的。然而,政府的其他分支也制定公共政策。司法或法院系统通过解释法律和设定新的判例法先例的裁决来制定政策。虽然行政部门不制定法律,但它确实制定行政规则、法规、行政命令、新计划以及许多非正式政策,如指南、建议和信息宣传活动。因此,政府的所有分支、部门和层级都制定公共政策。
- 影响深远:公共政策的第三个特征是它的影响非常广泛。公共政策影响经济的所有三个部门:它影响政府本身(公共部门),也影响非营利部门,当然还有私营部门。公共政策也对普通公众产生巨大影响。因此,公共政策非常强大,对世界上的每个人、家庭、组织、机构和企业都有影响。

总结与回顾 ✅


好了,让我们回顾一下刚刚定义的四个复杂且相互重叠的术语。
- 公共部门是经济中政府提供公共产品和服务的部分。
- 公共行政是政府开展其业务的手段,它有一套总体的支柱或原则,以及一套七个关键或核心职能。
- 公共政策授权、指导并限制公共部门以及其他部门和个人。
- 最后,也是最重要的部分,数据对于公共部门提供公共产品的工作、对于公共行政的职能、以及对于公共政策的设计、实施和评估都至关重要。
数据分析对于公共行政的支柱和职能、对于公共政策的设计和评估、以及对于公共产品都至关重要。



本节课中,我们一起学习了公共行政与公共政策的定义、核心框架(四大支柱与七大职能)及其基本特征。理解这些概念是后续运用R语言进行数据分析,以支持公共部门实现经济、效率、有效和公平目标的基础。
5:RStudio开发环境入门 🚀

在本节课中,我们将学习如何在Coursera平台上启动和使用RStudio。RStudio是我们进行大部分技术工作的主要环境,你可以在Coursera平台内免费使用它。我们将了解其界面布局、核心功能以及如何跟随课程进行学习和实验。
启动Coursera平台上的RStudio
你的系统界面左侧应显示课程周次,右侧是我们为你准备的各种内容,包括视频。向下滚动,你会看到一个名为“RStudio”并标记为“实验”的部分。点击此处,将弹出一个新的启动器屏幕,然后你可以打开该实验环境。


你可以在此环境中完成本课程的所有工作,包括跟随我的讲座、完成作业以及在基于Coursera的在线RStudio中探索R。我们已在课程中为你安装了必要的软件包,因此你可以直接启动并跟随学习。当然,你也可以选择在自己的电脑上下载RStudio和讲座材料进行学习。

RStudio界面概览
RStudio界面主要分为四个窗格,我们将逐一介绍其功能。


源代码窗格
左上角是源代码窗格。这是你当前正在处理的文件所在区域。在本课程中,我的大部分工作以及讲座材料都将在此处显示。
控制台窗格



底部是控制台窗格。这是一个非常有用的工具,虽然我在讲座中不会频繁使用它,但我会稍作演示,并且你将有机会大量使用它。这是一个R解释器,你可以在此直接输入R命令进行交互式实验。
例如,你可以输入 1 + 1 并按回车,R会返回结果 2。你也可以进行变量赋值:
x <- 1
y <- 1
x + y
每次输入命令并按回车后,R都会立即执行并给出结果。
环境窗格
右上角是环境窗格。这个窗格主要用于探索数据环境。例如,当你像上面那样创建了变量x和y后,它们就会显示在这个窗格中。我们将在后续讲座中详细介绍其用途。
文件/绘图/包窗格
右下角是文件、绘图和包窗格。默认情况下,它显示文件列表,你可以看到包含本课程所有讲座材料的Coursera文件系统。当我们开始绘图时,图形将在此处显示。此外,你还可以在此查看已安装的包列表、获取特定函数的帮助信息等。这是一个非常方便的区域,有时我可能会将其最小化,但在需要时它非常有用。
操作与导航
在文件窗格中,你可以点击任何以 .Rmd 结尾的R Markdown文件,它将被加载到源代码窗格中。例如,我加载了一个名为 Intro.Rmd 的文件,这是我今天准备的讲座内容之一。通过这种方式,你可以跟随讲座学习,并直接执行其中的代码。
在控制台中,你可以自由地试验R语言。这是一种交互式的学习方式。
在Coursera系统中,你还可以访问操作系统终端。这是一个控制台访问界面。不过,在本课程中我们完全不会使用它。如果你对探索其他包或了解系统工作原理感兴趣,可以在这里执行诸如列出系统文件等操作。如果不理解也不必担心。
使用R Markdown
在源代码窗格中,我们主要在 R Markdown 文件中编写内容。大部分内容是普通文本,但我们可以使用一些标记来添加结构。
例如,使用 # 可以创建标题。随着你添加标题,右侧会开始生成一个大纲,你可以通过点击这些标题进行导航。
你还可以通过点击“Visual”按钮,将文档渲染成HTML进行可视化查看,这有时会更方便。
代码块
当我们需要在R Markdown中插入可执行的R代码时,需要使用代码块。代码块以三个反引号开始,后跟 {r},再以三个反引号结束。

在代码块内部,我们可以编写常规的R语句。例如:
z <- x + y
print(z)
x <- x - 1
要运行代码块,你有几个选择:
- 要运行单行代码,可以将光标置于该行,然后按
Ctrl + Enter。 - 要运行整个代码块,可以点击代码块右上角的绿色播放按钮。
运行后,你可以在控制台看到输出结果,并且环境窗格中的变量也会相应更新。
实用资源:速查表
我想向你介绍RStudio中一个非常实用的功能。在顶部菜单栏中,点击“Help”,然后找到“Cheat Sheets”区域。

这些速查表是由我们将要使用的R包的创建者们制作的(RStudio本身也是由同一团队开发的)。点击任何一张速查表,它会在你的浏览器中打开一个PDF文件。
例如,这里有一份关于RStudio IDE本身的速查表,它会详细解释各个按钮的功能以及你输入时会看到的内容。你并不必须使用这些速查表,但它们制作得非常精良,我鼓励你去查阅。我也会在课程中提供一些供你下载,因为它们是非常棒的学习资源。
总结



本节课我们一起学习了RStudio开发环境的基础知识。我们了解了如何在Coursera平台上启动RStudio,熟悉了其四个主要窗格(源代码、控制台、环境、文件/绘图/包)的功能,并实践了在控制台进行交互式编程、在R Markdown中编写和运行代码块。最后,我们还介绍了获取官方速查表这一实用学习资源的途径。记住,你无需在本课程中安装任何软件,所有学习都可以在Coursera提供的RStudio环境中完成。你可以打开视频在另一个窗口,然后在此环境中跟随实验。在接下来的互动讲座中,我将逐步引导你更深入地使用这个环境。
6:政府官僚机构组织架构 🏛️


在本节课中,我们将继续为理解数据分析在公共部门的重要作用奠定基础。我们将简要探讨政府通常是如何构建和组织的,即所谓的政府官僚机构。
概述


上一节我们讨论了数据分析在公共政策周期中的角色。本节中,我们来看看政府自身的组织结构。理解这一点,对于把握公共部门数据产生和使用的具体情境至关重要。
全球政府概览
首先,请思考一个问题:你认为世界上有多少个政府?这个问题实际上很难精确统计。
以下是关于政府数量的估算:
- 首先,世界上有 195 个主权国家或民族国家。
- 此外,还有一定数量的领土、联邦或其他与这些国家(通常通过殖民历史)相关联的地缘政治单位。
- 每一个国家内部又划分为次国家级单位,例如地区、省份、州等。全球一级次国家级政府单位的数量估计在 3,600 到 5,200 个之间。
- 最后是地方政府,其数量更加难以统计。仅在美国,估计就有近 36,000 个不同的地方政府(县、教区、市、镇等)。在巴西,估计有约 5,000 个自治市。在西班牙,该国划分为 17 个自治区和超过 8,000 个市镇。
因此,地球上确实存在着数以万计的地方政府。好消息是,它们都拥有需要被收集、组织、管理、分析和沟通的数据。
关于政府如何运作、如何组织、权力所在、公民角色以及其他许多政治议题,既有趣又重要,但也非常复杂,遗憾的是超出了本课程的范围。尽管如此,我们可以确信地说,每个政府,无论其类型如何,其不同分支及其组成部分都有一个组织结构。这个结构以官僚机构的形式运作。
官僚机构的定义是一个拥有多个下属单位和许多层级系统与流程的复杂组织。要理解数据分析在公共部门,特别是与公共行政和公共政策相关的角色,首先理解你自己政府的结构和组织方式非常重要。
这里的重点不是要求你能说出政府的每一个部委、机构、部门、办公室及其下属单位和所有联系,那会让人抓狂。重点在于获得对组织结构的一般性理解,以便你能理解所有不同但重要的、数据被收集、管理、分析和(希望)使用的地方。
国家政府结构
让我们从国家政府开始。国家政府通常以拥有不同分支的方式构建,而这些分支又包含多个下属单位。

例如,正如我们之前讨论过的,在大多数民主国家,政府有三个分支:
- 立法分支:分为不同部分,这些部分又进一步细分。
- 司法分支:分为不同层级的法院。
- 行政分支:这往往是最复杂的。
通常,政府的行政或执行分支分为部委、机构、部门或其他部门。这些机构在不同国家有不同的名称。但不同的部门通常专注于某个重要的公共事务领域。
以下是常见的政府部门示例:
- 卫生与公众服务
- 国防或国家安全
- 教育
- 劳工
- 商业
- 能源
- 环境
- 交通
- 财政
- 司法
这些下属单位也可以专注于跨越不同政策和公共议题的交叉性问题。这包括预算与财政、人力资源管理等方面。
总结


本节课中,我们一起学习了政府官僚机构的基本组织架构。我们了解到全球政府数量庞大且层级复杂,国家政府通常分为立法、司法和行政三大分支,其中行政分支又按职能划分为众多部委和机构。理解这个结构是理解公共部门数据来源和应用场景的基础。下一节,我们将深入探讨公共行政的七大核心职能,以及数据分析在每一项职能中扮演的角色。
7:典型政府机构实例分析 🏛️

在本节课中,我们将通过分析几个典型的政府组织结构图,来理解公共部门官僚体系的复杂性及其对数据分析工作的影响。了解这些背景知识,对于在公共部门进行有效的数据分析至关重要。
政府组织结构的复杂性

上一节我们探讨了公共部门的基本概念,本节中我们来看看政府机构在实际中是如何组织的。首先,我将展示几个政府组织结构图的例子。

这里的目的是并非深入探讨这些政府官僚机构的细节及其组织方式,而是为了展示一个事实:在几乎所有情况下,组织的结构都如此复杂且层级众多,以至于几乎不可能完整阅读和理解这些结构图。
实例分析:从联邦到地方
以下是几个不同层级政府机构的组织结构图实例,它们共同揭示了公共部门组织的普遍特征。


实例一:美国联邦政府
以美国联邦政府系统的组织结构图为例。它非常复杂,尤其是行政分支。没有放大镜几乎无法阅读。但关键在于,如果你花时间去审视它,你会对事物的主要结构框架有一个概览。这是理解政府设计、组织方式以及数据在不同子部门中分布情况的良好起点。


实例二:国家部委
现在,国家政府的每个部委或主要机构也都有自己的组织结构图,用以可视化其官僚结构。

例如,这是印度卫生与福利部的组织结构图。它仍然复杂且难以阅读。但如果你是该部门的数据分析师,你需要理解其组织结构,才能把握不同类型数据在整个体系中的角色。
实例三:州政府
作为第三个例子,这是澳大利亚新南威尔士州政府的组织结构图。它读起来稍微容易一些,但请注意,它之所以更容易阅读,是因为它并未列出所有不同的部门和机构。
理解结构的另一种途径
有时,通过观察政府网站的结构,你可以对官僚机构的组织设计方式有很多了解。例如,加拿大不列颠哥伦比亚省在其网站上列出了所有不同的厅局,你可以点击每一个来进一步了解各厅局自身的组织架构。




实例五:小城市政府
最后,在今天提供的第五个例子中,我们看到了美国德克萨斯州拉瓦卡港市的组织结构图。即使你从未听说过这个城市也没关系,它的人口只有大约12,000人。这里的重点是,即使是小城市和自治市,也有以不同且复杂方式组织的官僚机构,正如这张结构图所示。更重要的观点是,无论你在公共部门的哪个层级进行数据分析工作,从国家政府的最高层到最小的城镇,你都需要了解政府是如何组织和构建的,你处于官僚机构的哪个部分,以及它如何与其他部分连接。
公共部门官僚体系面临的重大挑战
理解了政府的基本结构后,我们来看看在其中工作所面临的一些重大挑战。

除了显而易见的复杂性之外,还有一些深层次的挑战。
以下是公共部门大型官僚机构工作中的一些主要挑战:

- 复杂性与变动性:政府官僚机构不仅复杂且难以整体把握,而且它们还在不断经历重组、结构调整和人员洗牌,这通常发生在领导层变更时。例如,在我为威斯康星州卫生部门工作的不到三年时间里,它就经历了两次重大重组,不仅改变了组织结构图,还改变了汇报关系、人员办公位置以及一些项目和职能。

- 孤岛问题:政府被划分为许多独立的单元,它们之间缺乏沟通和协调。

- 错位口袋问题:这是公共行政中的一个术语,指一个政府单位承担了提供商品和服务的成本,却不一定获得这样做的主要收益。
让我举个例子。政府的住房部门通常负责为无家可归者或有高风险无家可归者提供住房和一些社会福利服务。但为无家可归者提供庇护的许多收益,却流向了应急服务、监狱、学校和医疗保健提供部门。其他单位或“孤岛”获得了主要收益,而住房单位却承担了大部分成本。


- 效率低下:由于孤岛、缺乏协调和错位口袋问题,大型官僚机构效率低下。


它们确实如此。我认为无需多言,我们都知道并认识到这一点:它们并不总是以最小努力获得最大成果的方式运作。

- 抗拒变革:尽管组织结构不断有小幅调整或变化,但官僚机构对有意义的改革和变革有着真正的抵抗力,这导致了停滞。在完成重要工作和实现公共行政四大支柱目标方面,缺乏创造力和创新。


总结与启示

本节课中,我们一起学习了政府组织结构的实际案例及其内在挑战。
总而言之,重要的是要理解,公共部门的数据分析工作始终是处于一个官僚体系之内的。


数据分析师需要理解这种官僚结构。


同时也需要了解在其中工作所面临的一些挑战。




这种理解是有效定位数据、促进跨部门协作以及推动数据驱动决策的基础。认识到孤岛、成本收益错位和变革阻力等问题,能帮助数据分析师更策略性地开展工作,在复杂的公共部门环境中找到发挥影响力的途径。
8:公共行政核心职能:规划、组织、人事、指挥

欢迎回来。在本节课中,我们将继续讨论公共行政的核心职能及其对数据分析的影响,这些内容在之前的课程中已有介绍。

我们使用一个经典模型来理解公共行政,该模型聚焦于七个核心职能。
概述
在本节课中,我们将学习公共行政的四个核心职能:规划、组织、人事和指挥。我们将了解每个职能的定义,并探讨数据分析如何在这些职能中发挥关键作用。理解这些基础职能,将帮助我们看清公共部门运作中所需的各种数据和分析类型。
模型简介与评价
我们使用的模型聚焦于七个核心活动:规划、组织、人事、指挥、预算、报告和协调。有些人用其首字母缩写“POSDCORB”来指代这个模型。我们并不要求你记忆这个模型名称。
了解这个模型及其公认的优点很重要:
- 首先,它是一个简单的模型,聚焦于运行政府和公共部门所需的最核心、最重要的活动。这些活动都是数据分析极其重要的领域。
- 其次,该模型适用于不同国家、不同政府形式以及不同层级的政府(地方、区域、国家)。
- 第三,这个模型实际上也适用于企业管理和公共部门。运行政府所需的主要职能,与管理企业或任何其他类型组织所需的行政职能是相同的。


现在,我们可以承认这个模型也有一些局限性:
- 首先,它遗漏了公共行政的一些活动和职能。实际需要完成的工作不止这七项。
- 其次,它将职能分开考虑,而现实中许多职能是同时运作的。例如,预算和规划常常齐头并进;报告是指挥和协调的重要组成部分;组织和人事也经常同时发生。因此,单独关注各项职能,低估了公共行政实际工作的复杂性。
- 该模型的其他一些局限性包括:它对公共行政领域的学术研究没有太大用处,并且没有强调不同类型领导力对每项职能的重要作用。
尽管如此,这个模型对我们的目的来说非常有用,即为了解数据和数据分析在公共部门的重要作用提供一个框架。理解公共行政的核心基本职能,将让你开始看到执行这些基本职能(无论是单独还是组合)所需的众多数据类型和分析。
核心职能详解
接下来,让我们逐一了解模型中的各项职能。
1. 规划 📝
上一节我们介绍了模型的基本情况,本节中我们来看看第一项职能:规划。


规划被定义为决定政府实体未来方向和目标以及所需行动与资源的有组织、战略性的方式。

以下是数据分析对规划职能至关重要的几个例子:
- 预测养老金系统的未来收入和支出。
- 评估或分析预测的人口变化(如人口老龄化)对公共服务需求的影响,例如医疗、公共交通、家庭服务甚至驾照更新。
2. 组织 🏢
了解了规划职能后,我们转向第二项职能:组织。
这是指识别提供公共产品和服务所需的必要财政资源(资金),以及人力资源、原材料、组织和物理基础设施。
以下是组织职能及数据作用的例子:
- 弄清楚将纸质信息收集和存储系统转移到在线系统需要什么。这是目前全球许多政府正在努力推进的工作。
- 识别所需资源并制定细节,以在紧急情况(如新冠疫情)期间实施新的失业保险计划。
3. 人事 👥
组织职能关注资源调配,而人事职能则聚焦于人力资源。
人事职能侧重于人力资源,涉及识别公共部门劳动力需求,以及与招募、聘用、培训、评估、留用和解雇政府工作人员相关的所有活动。全球三分之一的劳动力在公共部门。再次强调,地球上每三个有工作的人中就有一个为政府工作,因此人事职能至关重要。

以下是人事职能中数据分析的例子:
- 评估当前劳动力的 demographic diversity(人口多样性)、技能水平和留任问题。
- 调查公务员对专业和技能发展的兴趣和需求。在职成长和学习对每个人都很重要,无论你在哪个部门。
- 比较公共部门职位与私营部门类似职位的工资。

4. 指挥 🧭
最后,我们来看指挥职能。
这关乎实现政府提供产品和服务的目标所需的监督、管理和领导。
以下是指挥职能的例子:
- 在自然灾害中获取并分配应急服务和资源。
- 评估在线公共服务系统的用户界面和体验,例如驾照更新、福利申领、养老金福利、选民登记等系统。
- 识别并解决 foster care system(寄养照顾系统)中的问题。
总结


在本节课中,我们一起学习了公共行政的四个核心职能:规划、组织、人事和指挥。我们了解了每个职能的定义,并通过具体例子看到了数据分析如何成为执行这些职能不可或缺的工具。理解这些基础框架,是认识数据在公共部门治理中广泛而关键作用的第一步。在接下来的课程中,我们将继续探讨预算、报告和协调等其他核心职能。
9:公共行政核心职能:协调、报告、预算编制 📊

在本节课中,我们将继续探讨公共行政的核心职能,并深入了解数据分析在每一项职能中所扮演的重要角色。我们将聚焦于协调、报告和预算编制这三个关键领域。

上一节我们讨论了公共行政的规划、组织、人事和指导职能。本节中,我们来看看剩下的三项核心职能:协调、报告和预算编制。
协调职能 🔗

协调职能主要涉及连接和同步我们之前讨论过的各个“孤岛”——即跨部门、跨单位、跨政府层级之间的工作。

以下是涉及数据的协调工作示例:
- 连接邮政服务数据与其他政府数据库:例如,将包含地址变更信息的邮政数据与财产税系统、社会福利项目系统、公共医疗保险系统等其他政府数据库进行关联。
- 跨项目链接客户信息及其社会福利服务使用情况:这些信息通常也分散在不同的“孤岛”中,并由不同层级的政府提供。
此外,还有许多需要合并私营部门和公共部门数据的例子。随着课程的深入,我们肯定会更多地讨论这个话题。
报告职能 📈
报告职能是公共行政中至关重要的一个方面。政府需要向立法机构和公众报告数据,主要有两个原因:第一,法律或法规通常有此要求;第二,以清晰简洁的方式向公众报告信息或数据,其重要性远超法律要求。在重视政府透明度、诚实和公开对话的文化中,透明度已被证明对建立政府信任至关重要。
以下是报告职能的一些示例:

- 公共监测或追踪系统的持续性报告:例如,犯罪统计报告、公立学校入学报告。此外,法律要求大量疾病必须向政府报告,然后再向公众公布。
- COVID-19疫情报告:自疫情初期以来,大多数国家级和次国家级政府每天都向公众报告疫情统计数据,包括新增病例数、死亡人数以及疫苗接种率。
- 政府仪表盘:这是政府向公众报告情况的一种方式。许多政府已开始使用仪表盘来汇总在多个既定目标方面的进展,以此向公众报告,并对进展和挑战保持透明。

一个用于报告的政府仪表盘示例是令人印象深刻的“印度绩效仪表盘”。该仪表盘实时跟踪国家在36个目标上的进展,这些目标实际上是印度庞大的国家转型战略计划相关目标的一个子集。建议您查看这个网站以及其他政府仪表盘,以了解其多样化的设计和用途,并思考有多少不同类型的数据和数据分析构成了这些报告仪表盘的支柱。

预算编制职能 💰
我们需要讨论的第七项也是最后一项核心职能是预算编制。这涉及财政规划、预算审批,以及与公共财政收入和支出相关的控制、会计、审计等其他财务活动。

这同样是一个由数据驱动的重要职能。
以下是预算编制职能的一些示例:
- 使用数据来描述政府与私营部门签订的合同类型和金额。
- 评估新法律变更对某项服务项目预算的影响。
- 估算油价上涨时,罚单收入可能出现的减少(这对政府来说是个问题)。
总结




本节课中,我们一起学习了公共行政的协调、报告和预算编制这三项核心职能。我们看到了数据分析在连接信息孤岛、确保政府透明度以及支持财政决策中的关键作用。随着课程的继续,当您开始实际处理和分析数据时,我们将在实践中不断重温这些核心职能。
10:数据分析在公共行政职能中的应用 📊


在本节课中,我们将探讨数据分析在公共部门、非营利部门和私营部门之间的异同。理解这些背景差异对于在公共部门有效开展数据分析工作至关重要。

数据分析的跨部门相似性 🔄



尽管应用场景不同,但数据分析在不同部门间存在许多根本性的相似之处。

以下是数据分析在各领域共有的核心特征:


- 数据无处不在:我们不断与各类组织(企业、服务提供商、政府、社交媒体等)分享关于自身的信息和数据。所有部门的组织都在工作中收集、分析和使用海量数据来提出并解答重要问题。
- 决策依赖数据:基于证据或循证的组织政策和实践,在所有部门中都依赖于数据驱动的资源分配和决策。
- 数据质量至关重要:在所有部门中,拥有高质量、可用于指导资源分配和决策的数据都至关重要。
- 重视数据沟通:清晰、准确的数据共享、沟通和呈现方式在各个部门都受到重视。
- 面临伦理挑战:关于数据的使用、滥用和隐私问题,在各个部门都存在非常复杂且严肃的伦理议题。
公共部门数据分析的独特性 🏛️


上一节我们介绍了跨部门的共性,本节中我们来看看公共部门数据分析的关键差异。尽管使用的分析方法和技巧基本相同,但公共部门(主要指政府)与其他部门,尤其是私营部门之间,存在非常重要的区别。这些区别之多,以至于我们专门开设了这个面向公共部门的数据分析专业课程。
以下是公共部门数据分析的主要独特之处:


- 目的与数据类型不同:公共部门数据分析侧重于我们讨论过的公共行政的各项职能,例如政策分析(将在第三门课程中讨论)。此外,公共部门提供的广泛商品和服务非常注重结果,这些结果包括我们一直在讨论的四大支柱:经济性(明智地使用公共收入而不以营利为目的)、效率、有效性和公平性。因此,我们分析的数据类型和目的非常不同。
- 数据的公共属性:在民主国家,大多数公共数据是公开的(并非全部),因为公众提供了公共收入的主要部分,并且是政府行为的主要利益相关者。虽然数据本身并不总是公开,但公共数据分析的结果几乎总是以某种方式公开。在美国等许多国家,未例行公开的数据和结果,公民也可以通过《信息自由法》或其他法律获取。政府数据和分析的公共性基于透明度和信任的既定价值观。当然,对政府的信任远不止数据透明度,但从我们关注数据的角度来看,必须理解数据隐私和保密性与透明度的问题在公共和私营部门之间截然不同。
- 数据质量与资源挑战:数据分析在私营部门与公共部门之间的另一个巨大差异是数据质量和可用数据分析工具的复杂程度。众所周知,高质量的数据收集、管理和分析需要资源和资金。一般而言,私营部门的企业通常比政府拥有更多资金,或决定将更多资源投入到信息系统、数据管理和分析中。尽管过去20年左右,公共数据管理和分析的质量与复杂性确实有所提高,但这在每个政府中仍然是一个大问题。政府层级越低,问题就越大。对于世界上成千上万个市、县、省、州和其他地方级政府单位而言,以高质量和复杂的方式收集、组织、管理、检索、分析、沟通和保护数据的能力,在大多数政府中都是一个非常严峻的挑战。
- 固有的政治属性:最后但非常重要的一点是,公共部门的数据分析本质上是一项政治活动。政治最基本的定义就是人类聚在一起做出决策。而公共部门正是大量人类聚集在一起,做出对所有部门和人民都有巨大影响、并涉及稀缺资源分配的决策。众所周知,这涉及很多分歧,因为价值观、政治意识形态和文化的作用也是其中重要的一部分。当数据显示政府在效率、有效性或实现公平方面未能履行职责时,风险非常高。当数据显示可能存在资源滥用、错配甚至腐败时,风险也很高。当数据揭示民选或任命的政府官员的项目未能奏效或未达到目标时,风险同样很高。公共部门数据分析的结果常常会让人感到愤怒和担忧,这有时会导致要求改变结果、隐藏或压制结果的压力。
总结 📝

本节课中我们一起学习了公共部门数据分析的背景。我们讨论了政府是拥有多个单位和部门的复杂组织,这些部门常常各自为政,但也需要相互连接。我们探讨了公共部门行政所必需的一系列核心职能,以及数据分析对每一项核心职能的重要性。同时,尽管数据和分析的目标与使用在各部门间有许多相似之处,但公共部门涉及一些独特的要素,包括数据的类型和目的、隐私问题、对透明度的需求、政治环境以及在公共部门进行数据分析时出现的特殊伦理问题。



现在,您已经准备好与布鲁克斯教授一起投入实际的数据分析了。请享受进入数据真实乐趣的过程,同时牢记我们迄今为止讨论的公共部门广阔而独特的背景。
11:R语言编程基础入门 🚀

在本课程中,我们将学习如何使用R语言进行数据分析。本节课将介绍R语言编程的基础知识,包括R Markdown文档的格式、代码块的创建与执行,以及R语言的基本语法和操作。
概述 📋
在本节课中,我们将学习R语言编程的基础入门知识。我们将了解如何编写和格式化R Markdown文档,创建和执行代码块,以及掌握R语言中的变量赋值、数学运算和逻辑比较等基本操作。
计算叙事与R Markdown 📝
我们将以纯文本、计算机代码和图像相结合的形式编写分析报告。这种形式被称为计算叙事,它允许我们将分析讨论、执行分析的编程代码以及支持与传达结果的视觉元素编织在一起。

我尝试以这种格式完整记录我的讲座,以便您可以下载这些文件供日后参考,而无需重新观看视频。这意味着您可以快速浏览讲座,其中包含我所说的文字记录以及我编写的代码,类似于教科书和视频讲座的混合体。
在本笔记中,我将向您介绍R的一些基本功能。但在开始之前,让我们先谈谈整个笔记格式。

R Markdown文档格式 🧩
R在支持这种计算叙事分析方法方面非常强大,它通过Markdown文件来实现,这些文件通常以 .Rmd 结尾。

这些文件可以通过RStudio中的编织过程,转换为更典型的阅读格式,如PDF、HTML文件,甚至Word文档。
R Markdown有许多不同的功能和特性,以及将这些文档编织成某种输出的选项,但在本课程中,我们只处理一些基础知识。
基础文本格式化 ✏️
首先,您可以使用一种非常简单的标记语言来控制文档的格式。所有以 # 号(通常称为井号、数字符号或哈希标记)开头的行都是标题,它们会显示在RStudio中Markdown文档右侧的大纲中。
如果您点击窗口顶部的“可视化”按钮,您将看到此文档的渲染版本,并且您会看到可以通过在标题前添加更多 # 号来使用不同级别的标题。
您还可以控制一些基本的输出文本格式,例如:
- 用两个星号包围单词来加粗。
- 用一个星号包围单词来斜体。
- 用波浪号包围单词来
删除线。
在接下来的课程中,您将看到更多R Markdown格式化的例子,包括表格和列表。现在,让我们开始编写代码。

代码块与文本块 📦
R Markdown文件由文本块和代码块组成。要创建一个代码块,我们以一行三个反引号开始,后跟花括号和小写的 r,就像这样:

# 这是一个R代码块
这三个反引号告诉RStudio,所写的内容应该是可执行的。您会看到RStudio自动在右侧添加了一个小播放按钮,并改变了代码的样式。
小写的 r 告诉RStudio这个代码块的语言是R,但也支持其他语言,如SQL和Python。
在代码块内部,我们可以编写任何有效的R语法,但不能进行文本格式化。您可以按任意顺序执行代码块,但通常的做法是按照从上到下的顺序编写和执行代码块,就像我们阅读笔记或编写计算机代码一样。

R语言基础:变量与赋值 🔢
R编程语言历史悠久,细节丰富。与其全面地向您解释,我更希望通过一些示例来介绍。如果您想深入研究细节,我在课程中链接了几本书供深入学习,我强烈鼓励您这样做。
现在,让我们创建一个新的代码块,并看看一些语言基础。
在代码块中,以 # 号开头的行是注释。您会看到很多像这样的注释。通常(但不是必须)每行代码的长度有限制,所以您会看到格式略有变化。

在R中,变量是使用赋值运算符创建的,它可以是向左的箭头 <- 或向右的箭头 ->。
让我们创建两个变量。这里我创建了 a 并将其赋值为 3,然后我创建了 b 并将其赋值为 4。
a <- 3
4 -> b
在表达式的右侧赋值实际上并不常见,因此您主要会看到前面那种使用向左箭头的语法。您也可以使用单个等号 = 进行变量赋值,但这也不常见。
现在,如果我们执行这个代码块,我们会看到在右上角这里创建了变量。
变量作用域与环境 🌐
变量在代码块之间是持久存在的。如果您执行此代码,您会看到RStudio右侧的环境窗格中现在有两个变量,一个是 a,一个是 b。

数学运算与逻辑比较 ⚖️

我们可以使用典型的数学运算符来比较值。双等号 == 将检查两个变量是否相等,而大于号 > 将检查一个变量是否大于另一个。
a > b
所以,我在这里输入 a > b,然后执行这个代码块。我们看到结果是 FALSE。

代码执行与输出 📤
当我们执行一个单元格时,输出会打印在RStudio的控制台中。RStudio这样做就像我们手动在控制台中输入这些行一样。因此,我们也可以在那里看到我们的代码注释。
实际的输出(由表达式的结果组成)也会被放置在一个输出单元格中,位于代码块下方。这个单元格既存在于源代码编辑器中,也存在于可视化编辑器中。
如果您希望文本与输出一起显示,您需要使用 print 函数。

print("检查a是否大于b")
a > b
print("检查a是否等于b")
a == b
所以这里我给出一个例子,我们将创建一个新的代码块,打印“检查a是否大于b”,然后我只做我们的比较。您会注意到,对于比较,我不必在那里写 print 函数,该表达式将被直接求值然后打印。接着打印“检查a是否等于b”,然后我们输入那个比较并执行这个单元格。
我们看到该输出的所有部分都被添加到了单元格输出中。

扩展学习与资源 📚
基础的R语言包含许多不同的函数和运算符。虽然我将在本课程中介绍其中的几个,但我的进度也会相当快,并期望您已经具备一点编程知识,甚至是一些R知识。
如果没有,那也没关系,但我鼓励您查看我在课程大纲中链接的一些参考资料,作为学习该语言一些基础知识的指南。
总结 🎯


在本节课中,我们一起学习了R语言编程的基础入门知识。我们了解了R Markdown文档的用途和基本格式化方法,学会了如何创建和执行包含R代码的代码块。我们掌握了使用 <- 运算符进行变量赋值,以及使用 ==、> 等运算符进行逻辑比较。我们还看到了代码块的输出如何显示,以及如何使用 print 函数输出文本。这些是开始使用R进行数据分析的重要第一步。
12:向量化运算原理 🧮

在本节课中,我们将要学习R语言的核心特性之一:向量化运算。我们将了解什么是向量,如何创建和操作向量,以及向量化如何使R语言在数据科学中既简洁又高效。
概述

R语言被称为向量化语言,其基本数据结构都是向量。理解向量是掌握R语言数据处理的关键。本节将介绍向量的概念、创建方法、索引操作以及向量间的运算规则。

向量的本质

上一节我们介绍了R的基本操作,本节中我们来看看R的核心数据结构——向量。
在R中,即使我们创建一个看似单一的变量,它实际上也被存储为一个向量。向量是一个有序的列表,其中的所有元素都具有相同的数据格式。
例如,当我们创建一个变量 a 并赋值为一个整数时,R实际上将其存储为一个长度为1的向量。我们可以使用 typeof() 函数查看向量中元素的类型,使用 length() 函数查看向量中包含多少个元素。
# 创建一个变量,它实际上是一个长度为1的向量
a <- 5
# 查看元素类型
print(typeof(a))
# 查看向量长度
print(length(a))
执行上述代码后,我们会发现 a 的类型是 "double",长度是 1。R的这种向量化特性对于有其他编程经验的人来说起初可能有些困惑,但这正是R语言代码简洁且在数据科学领域性能较高的原因之一。
创建多元素向量
要创建包含多个不同值的向量,我们使用组合函数 c()。

以下是创建向量的步骤:
- 使用
c()函数将多个值组合起来。 - 将结果赋值给一个变量。

# 创建一个包含四个元素的向量
a <- c(2, 4, 6, 8)
# 查看元素类型
print(typeof(a))
# 查看向量长度
print(length(a))
运行代码后,向量 a 的元素类型仍是 "double",但长度变为 4。在RStudio环境面板中,变量 a 被标记为“数值型”,并显示其值。面板还使用 [1:4] 的集合符号表示,意为向量中第一个元素在位置1,最后一个元素在位置4。这种方括号语法正是我们查询向量数据的方式。
访问向量元素
我们可以使用方括号 [] 加索引号来访问向量中的特定元素。
需要注意的是,R语言的索引从 1 开始,而不是像大多数其他编程语言那样从0开始。


# 访问向量中的第一个元素
print(a[1])
我们也可以一次性提取向量中的多个元素,这称为“切片”。切片语法是在方括号中使用起始索引和结束索引,中间用冒号 : 分隔。

# 提取向量中第二到第四个元素(包含两端)
print(a[2:4])
切片操作在向量运算中非常常用。

向量间的运算

像R这样的向量化语言有一个实用功能:可以对两个长度相同的向量进行逐元素运算。
例如,将两个包含三个元素的向量相加:
# 创建两个向量
a <- c(1, 2, 3)
b <- c(4, 5, 6)
# 向量相加(逐元素相加)
print(a + b)
结果是一个新向量,其第一个元素是 a[1] + b[1],第二个元素是 a[2] + b[2],依此类推。
我们还可以将一个长度为1的向量(即单个数值)与一个较长的向量进行运算。该操作会将这个单值应用于长向量中的每一个元素。

# 创建向量a
a <- c(1, 2, 3)
# 将向量a中的每个元素乘以5
d <- a * 5
print(d)
这里有两个重要注意事项:
- 避免使用
c作为变量名:因为c()是R中基础的组合函数,如果用它作为变量名,将无法再使用该函数。 - 向量循环利用:当两个长度不同的向量进行运算时(如上面的乘法),R会自动将较短的向量循环扩展,直到其长度与较长的向量相同。这允许我们在可接受的情况下对不等长向量进行操作。

R中的主要数据类型
在R中,我们主要使用以下几种数据类型的向量:
- 整数:
integer,表示整数。 - 双精度浮点数:
double,表示可能带有小数的数字。 - 字符:
character,在其他语言中常称为字符串。 - 逻辑值:
logical,取值为TRUE或FALSE,在其他语言中常称为布尔值。
列表与向量的区别

除了向量,R中还有非向量对象。这里“对象”一词可能让有编程背景的人感到困惑。本课程不深入探讨面向对象编程,但我们会常用到以下结构:
- 列表:
list,看起来像向量,但可以包含不同类型的元素。 - 函数:
function,在R中称为闭包,用于操作数据。 - 数据框:
data.frame,一种二维表格数据,本课程将详细探讨。
让我们先看看列表。要创建列表,我们使用 list() 函数,它可以容纳不同类型的项。
# 创建一个列表,包含数字、逻辑值和字符
my_list <- list(1, 2, TRUE, "text")
print(typeof(my_list))
为了对比,我们尝试用 c() 函数组合不同类型的数据来创建“向量”:
# 尝试用c()组合不同类型数据
my_vector <- c(1, 2, TRUE, "text")
print(typeof(my_vector))
你会发现,my_list 的类型是 "list",而 my_vector 的类型是 "character"。查看环境面板会发现,my_vector 显示为一个包含四个元素的字符向量。
这是因为当使用 c() 函数时,R会自动将输入转换为单一的数据类型。在这种情况下,将所有项转换为字符字符串是R能做到的最佳方案。必须注意这一点:一个向量只能容纳单一数据类型的数据,尽管它可以容纳多个数据项。
总结



本节课中我们一起学习了R语言向量化运算的核心原理。我们了解到R中的基本数据单位是向量,学会了如何使用 c() 创建向量,如何使用索引和切片访问元素,以及如何进行向量间的运算。我们还区分了向量与列表的不同:向量要求元素类型一致,而列表可以容纳异构数据。理解这些概念是后续进行高效数据处理和分析的基础。
13:R语言数据属性解析 🧩



在本节课中,我们将学习R语言中数据的属性(Attributes)概念,以及如何处理列表(List)结构和两种特殊的“空值”:NULL与NA。理解这些概念是后续处理复杂数据结构的基础。
数据属性与列表
上一节我们介绍了R的基本数据结构。本节中我们来看看数据属性。在R中,数据可以拥有属性,即一系列描述数据的键值对。一个常用的属性是变量的名称,这在处理列表和数据框等复杂数据结构时非常有用。
现在,让我们创建一个模拟人事管理系统中的人员信息列表,并为列表中的每一项设置名称属性。

以下是创建并查看列表的步骤:
# 创建一个员工信息列表
employee <- list(
userID = "BrooksCH",
name = "Christopher Brooks",
43,
instructor = TRUE,
courses = c(101, 102, 200)
)
执行上述代码后,在环境面板中展开employee列表,可以看到四个已命名的向量(userID, name, instructor, courses)和一个未命名的元素(数字43)。列表项的类型和长度也一并显示。

访问列表元素

我们看到列表项名称前有一个美元符号$,这是一个重要的提示。可以使用$运算符根据名称从列表中选取项目。
以下是访问列表元素的示例:
# 使用 $ 运算符访问已命名的元素
print(employee$userID) # 输出: "BrooksCH"
对于未命名的元素(如年龄43),我们可以使用切片符号[[]]根据其在列表中的位置来访问。
# 使用索引访问未命名的元素
print(employee[[3]]) # 输出: 43

理解与修改属性
名称属性实际上是列表本身的属性,而不是列表内部各个项目的属性。我们可以使用attributes()函数来查看对象的属性。
以下是查看和修改属性的过程:
# 查看列表的属性
print(attributes(employee))
# 查看属性结果的类型
print(typeof(attributes(employee)))
输出显示名称存储在$names中,它是一个列表。未命名的元素(年龄)对应的名称是一个空字符串""。

要修改名称,可以使用names()函数获取名称列表,然后使用setNames()函数进行修改。setNames()函数会返回一个修改后的副本,需要重新赋值给原变量。
# 获取当前的名称列表
attribute_names <- names(employee)
# 将第三个元素的名称改为 "age"
attribute_names[3] <- "age"
# 使用新的名称列表更新 employee 对象
employee <- setNames(employee, attribute_names)
执行后,环境面板中employee列表的第三个元素现在被正确标识为age。
特殊值:NULL 与 NA



在数据处理中,我们经常需要表示“无”。这可能是由于数据缺失(在数据科学中很常见),也可能是由于对象中的某个字段尚未定义(在计算机科学中很常见)。R用两种不同的方式处理这两种情况。
NULL 用于表示对某个对象的引用缺失。
# 将 x 赋值为 NULL
x <- NULL
print(typeof(x)) # 输出: "NULL"
print(length(x)) # 输出: 0
注意:不能使用==对NULL值进行逻辑比较,这会产生警告并返回一个长度为0的逻辑向量。应使用is.null()函数进行判断。
# 错误的比较方式(会产生警告)
x == NULL
# 正确的判断方式
print(is.null(x)) # 输出: TRUE

NA 用于表示数据缺失。
# 将 x 赋值为 NA
x <- NA
print(typeof(x)) # 输出: "logical"
print(length(x)) # 输出: 1 (包含一个NA值)
判断数据是否缺失应使用is.na()函数。
print(is.na(x)) # 输出: TRUE

总结



本节课中我们一起学习了R语言中数据属性的概念,包括如何创建和操作带有名称属性的列表。我们还深入探讨了两种表示“无”的特殊值:NULL(引用缺失)和NA(数据缺失),并掌握了使用is.null()和is.na()函数进行正确判断的方法。这些基础知识是后续处理真实、复杂数据集的关键。在接下来的课程中,我们将通过实际案例来巩固这些概念。
14:R数据框变量列操作技术

在本节课中,我们将学习R语言中数据框(Data Frame)的核心概念与基本操作,特别是如何查看、选择和提取数据框中的变量(列)。我们将使用一个真实的美国高等教育数据集作为示例。
概述:数据框与变量

上一节我们介绍了R的基本环境,本节中我们来看看R中最重要的数据结构之一:数据框。数据框是R进行数据分析的核心,你可以将其理解为一个电子表格。它由行和列组成,其中每一列是一个向量,代表一个变量;每一行是一个观测,代表一个实体(例如一所大学)。
读取数据与查看结构

我们首先从CSV文件中读取数据。为此,我们使用R的基础函数 read.csv()。
admissions_df <- read.csv("your_file_path.csv")
执行上述代码后,admissions_df 这个数据框对象会出现在环境面板中。这个数据集包含了近2000所美国大学在2020年的招生数据,共有68个不同的变量。

数据框的列有标签(即变量名)。read.csv() 函数会自动将CSV文件的第一行作为列名。
以下是查看数据框列名的方法:
colnames(admissions_df)

提取单个变量(列)
在R中,数据框的列被称为变量。我们可以使用美元符号 $ 运算符来提取单个变量。
例如,如果我们想查看所有大学的申请总人数,可以提取名为 APPLCN 的变量。
total_applications <- admissions_df$APPLCN
执行后,total_applications 就成为了一个包含所有大学申请人数数据的向量。

理解行与列的不同
行(观测)与列(变量)在R中有几个关键区别:
- 行代表实体:在本数据集中,每一行代表一所美国大学。
- 行通常没有名字:这意味着我们不能用
$来提取行。 - 行的顺序是固定的:R不会随意打乱行的顺序,除非你明确要求。
- 行包含多种数据类型:因为一行跨越多个列(变量),所以提取单行时得到的是一个列表或一个新的小数据框,而不是一个单一数据类型的向量。
使用方括号进行子集选择
为了选择行、列或两者,我们需要使用方括号 [ ] 子集操作符。其通用语法非常重要。
以下是选择子集的几种方式:
-
选择特定行(所有列):
数据框[行索引, ]first_row <- admissions_df[1, ] -
选择连续的多行:使用冒号
:进行切片。first_10_unis <- admissions_df[1:10, ] -
选择特定列(所有行):
数据框[, 列索引]或数据框[, 列名]# 通过列索引选择最后三列 last_three_cols_by_index <- admissions_df[, 66:68] # 通过列名选择最后三列 last_three_cols_by_name <- admissions_df[, c("COL66", "COL67", "COL68")] -
同时选择特定的行和列:
数据框[行索引, 列索引]# 选择前5所大学的前3个变量 subset_data <- admissions_df[1:5, 1:3]

请注意语法中的逗号:逗号前用于指定行,逗号后用于指定列。留空则表示选择所有行或所有列。
总结


本节课中我们一起学习了R数据框的基本操作。我们了解了数据框是类似电子表格的结构,由变量(列)和观测(行)组成。我们掌握了如何使用 colnames() 查看变量名,使用 $ 运算符提取单个变量,以及使用方括号 [ ] 子集操作符来灵活地选择数据的特定行、列或区域。这些是进行数据探索和清洗的基础技能,在后续的分析中会频繁使用。
15:向量选择与数据分析方法

在本节课中,我们将学习在R中从数据框中选择数据的多种方法,包括使用正负索引、冒号运算符以及列名。随后,我们将应用这些选择技巧,对一个高等教育招生数据集进行初步分析,计算申请、录取和入学的性别比例,并探讨如何处理数据中的缺失值。
数据选择方法

上一节我们介绍了使用列名和行号选择数据的基本方法。本节中,我们来看看R中一些更独特的数据选择技巧。
使用负号排除列
R允许使用负整数来排除特定的列。例如,如果我们想选择除第一列和第三列之外的所有列,可以这样做。
admissions_df[, c(-1, -3)]
理解冒号运算符

冒号运算符 : 是创建连续整数向量的简写方式。它本身并不复杂,只是将两个数字之间的所有整数生成一个向量。
# 创建一个从1到10的向量
1:10
# 同样可以创建负数的连续向量
-1:-10
选择方法总结
以下是选择数据时的一般原则:
- 通常,如果只想选择一列,使用美元符号
$按列名引用是最直接的方式。 - 如果想选择多列,可以将列名组合成一个向量,然后进行选择。
- 按列的位置(索引)进行选择的情况相对较少。
初步数据分析

现在,让我们暂时放下形式化的讨论,利用这些选择方法对数据进行一些实际分析。我们将使用R的一些内置函数。
计算总申请量
首先,我们来看看所有学校的申请总量。这里我们使用 sum 函数对一个数值向量求和。

# 计算“application”列的总和
sum(admissions_df$application)
执行结果显示,该年度总申请量超过1100万份。
计算申请性别比例
接下来,我们可以通过分别计算男性和女性申请者的总和,然后相除,来查看性别比例。在该数据集中,男性申请者数量存储在列 applicationM 中,女性申请者数量存储在列 applicationW 中(数据集仅包含二元性别区分)。
# 计算男性与女性申请者数量的比例
sum(admissions_df$applicationM) / sum(admissions_df$applicationW)
计算结果显示比例约为0.74,这意味着女性申请者数量明显多于男性申请者。
提出数据问题
这个初步调查让我们开始思考可以向数据集提出的问题。例如,哪些申请者最终入学?其人口统计学特征如何?数据集中还有更多列可以帮助我们回答这些问题,比如 enrollM(男性入学人数)、enrollW(女性入学人数)、admitM(男性录取人数)和 admitW(女性录取人数)。
请思考一下:关于美国或其他地方的高等教育招生,你想了解什么?例如,男性申请者总体少于女性申请者,是因为男性申请学校更挑剔,还是女性在美国更可能上大学?如果后者成立,这是否也意味着女性获得录取的机会更多?
计算多变量性别比例
为了继续探索这些问题,我们接下来计算申请、录取和入学三个变量的性别比例。最直接的方法是复制并修改之前的代码。
# 计算三个比例
application_ratio <- sum(admissions_df$applicationM) / sum(admissions_df$applicationW)
admissions_ratio <- sum(admissions_df$admitM) / sum(admissions_df$admitW)
enrollment_ratio <- sum(admissions_df$enrollM) / sum(admissions_df$enrollW)
现在,我们希望将结果打印在一行文本中。这里我们将使用 paste0 函数,它能将所有参数转换为字符向量并连接起来,非常适合用于打印数字或其他内容。
# 使用paste0函数打印结果
paste0("申请比例是:", application_ratio,
", 录取比例是:", admissions_ratio,
", 入学比例是:", enrollment_ratio)
paste0 的一个优点是,你可以将每个参数放在单独的一行,这有助于提高代码的可读性。
执行这段代码后,我们可能会得到类似这样的输出:“申请比例是:0.739,录取比例是:NA,入学比例是:NA”。
处理缺失值(NA)
为什么录取和入学比例会显示为 NA?当数据存在缺失值时,NA(Not Available)值在进行算术运算时具有“传染性”。大多数处理数据的函数(如我们使用的 sum 函数)在遇到任何 NA 值时,通常会返回 NA。
在本例中,这意味着一个或多个机构在男性或女性的录取或入学数据上存在缺失。我们知道申请数据是完整的(因为申请比例计算成功),但录取或入学数据有缺失。
处理缺失数据不仅是一个技术挑战,也涉及数据政策和知识层面的挑战。数据缺失是因为某个群体确实无人被录取/入学,还是机构简单地报告了 NA?我们无从得知,这需要我们进行更深入的调查。
总结


本节课中我们一起学习了R中多种向量和数据框的选择方法,包括使用正负索引和冒号运算符。我们应用这些方法对一个招生数据集进行了分析,计算了性别比例,并遇到了数据缺失值 NA 带来的挑战。理解数据选择是数据分析的基础,而识别和处理缺失值是确保分析结果可靠的关键步骤。
16:数据框缺失值处理:布尔掩码技术 🎯

在本节课中,我们将要学习如何处理数据框中的缺失值。我们将重点介绍一种强大的技术——布尔掩码,它可以帮助我们识别、筛选和清理数据中的缺失值。
概述
数据清洗是数据分析的关键步骤,而缺失值处理是其中的核心环节。上一节我们介绍了数据框的基本操作,本节中我们来看看如何使用布尔掩码技术来识别和处理缺失值。
识别缺失值
我们的第一步是考虑数据中可能存在缺失值的地方。我们可以使用 is.na() 函数来检查数据列中哪些值被报告为 NA。
让我们首先查看“applications”列中是否有任何男性申请数据的缺失报告。运行以下代码:
is.na(admissions_df$applications_men)
这会返回一个巨大的布尔值向量,其中包含 TRUE 或 FALSE,取决于该列在特定观测值(即一所学院或大学)中是否为 NA。在这个例子中,我们可以瞥见男性数据中明显有一些缺失值。
布尔掩码技术

如果我们想要量化缺失值,或者无法通过肉眼观察前一千条记录来判断是否存在缺失值,该怎么办呢?这里看似麻烦的地方,实际上R提供了一种非常好的处理方式,我们称之为布尔掩码。

布尔掩码是一个由 TRUE 和 FALSE 组成的向量,我们通过选择操作将其覆盖在数据之上。结果是,选择操作只返回那些对应 TRUE 值的观测值,而不返回对应 FALSE 的观测值。
让我们看一个例子。直接应用这个布尔掩码非常简单。我将使用方括号 [] 来限制行,并且只选择那些男性录取数据确实是 NA 的行。
admissions_df[is.na(admissions_df$admissions_men), ]
这里实际发生的情况是:is.na(admissions_df$admissions_men) 创建了那个巨大的布尔向量,然后它被覆盖在我们2000行数据上,只有 TRUE 对应的行会作为结果被输出。

执行后,我们得到一个更易管理的数据框,只有92行。我们可以看到所有列,但只有92行数据。
统计缺失值数量
布尔掩码技术非常强大,在本课程结束时你会觉得它就像第二天性一样自然。但现在让我们再多做一些练习。
例如,让我们计算没有报告男性或女性录取数据的学校数量。以下是具体步骤:
# 统计男性录取数据为NA的学校数量
paste("The number of schools with NA in male admissions was", nrow(admissions_df[is.na(admissions_df$admissions_men), ]))
# 统计女性录取数据为NA的学校数量
paste("The number of schools with NA in female admissions was", nrow(admissions_df[is.na(admissions_df$admissions_women), ]))
执行后,结果显示男性录取数据缺失的学校有92所,女性录取数据缺失的学校有108所。


逻辑运算符
有些学校报告了男性数据的缺失,有些报告了女性数据的缺失。我想知道有多少学校同时报告了男性和女性数据的缺失。
布尔掩码的强大之处在于,我们可以通过逻辑运算符将这两个查询条件组合起来。我们将大量练习这个操作,一段时间后就会变得很自然。

以下是我们可以使用的几种不同的逻辑运算符:
x & y:逻辑“与”。仅当x和y都为TRUE时返回TRUE。x | y:逻辑“或”。如果x或y为TRUE,则返回TRUE。如果两者都为TRUE,同样返回TRUE。!x:逻辑“非”。它只有一个操作数,作用是取反。它将x中所有TRUE项翻转为FALSE,反之亦然。x == y:等于。仅当x等于y时返回TRUE。注意这里使用两个等号来检查是否相等,而不是一个。<,>,<=,>=:小于、大于、小于等于、大于等于。使用这些尖括号进行比较。
组合条件查询
掌握了这些知识后,让我们尝试回答这个问题:缺失指标是否在同一所学校中同时出现在男性和女性申请者数据中?
我们可以修改代码,使用两个条件:第一个是男性数据缺失的布尔掩码,第二个是女性数据缺失的布尔掩码。然后我们可以用一个“与”掩码将它们组合起来,这个掩码只对同时满足两个条件的学校为 TRUE。
missing_schools <- admissions_df[is.na(admissions_df$admissions_men) & is.na(admissions_df$admissions_women), ]
paste("The number of rows is", nrow(missing_schools))
执行后,我们得到24所学校同时报告了男性和女性数据的缺失。这意味着有68所学校只报告了男性数据的缺失,84所学校只报告了女性数据的缺失。
数据清理决策
现在,数据科学家需要做出一些选择。由于我们试图回答的关于录取率和入学率的问题无法用缺失数据来解答,我们需要处理这些缺失值。
在未来的课程中,我们将更多地讨论缺失值处理技术,因为这个问题会影响你在实践中进行的大多数分析。就本讲座的目的而言,我将排除那些在我们感兴趣的六个变量中任何一个存在缺失数据的观测值(即学校)。
我们需要进行相当多的输入。我们知道如何为缺失数据创建布尔掩码,现在只需要取反,以便只获取没有缺失的数据。记住,我们使用感叹号 ! 来取反,并且我们将用“与”条件 & 将所有掩码组合在一起。
为了清晰起见,我喜欢在多行中完成这个操作:
clean_df <- admissions_df[
!is.na(admissions_df$applications_men) &
!is.na(admissions_df$applications_women) &
!is.na(admissions_df$admissions_men) &
!is.na(admissions_df$admissions_women) &
!is.na(admissions_df$enrolled_men) &
!is.na(admissions_df$enrolled_women),
]
这只是打印最终清理后数据框的总行数:
paste("The total number of rows in the final clean DF is", nrow(clean_df))
执行后,我们的干净数据集中有1790所学校。虽然输入很多,但这就是R的工作方式。在清理数据时,了解正在发生什么非常重要。
值得庆幸的是,有一些人做了出色的工作,用其他函数扩展了R,这将使事情变得更容易。但在我们转向那些方法之前,让我们回到最初的问题:计算男性和女性在申请、录取和入学这三个变量上的比率。
总结


本节课中我们一起学习了如何使用布尔掩码技术来处理数据框中的缺失值。我们介绍了如何用 is.na() 识别缺失值,如何应用布尔掩码进行筛选,以及如何使用逻辑运算符组合多个条件。我们还通过一个实际的数据清理例子,展示了如何排除在关键变量上存在缺失值的观测记录,为后续的分析做好准备。掌握这些基础技术对于确保数据分析的准确性和可靠性至关重要。
17:数据清洗后统计量生成方法 📊

在本节课中,我们将学习如何从清洗干净的数据框中生成关键的统计量,并利用R Markdown的强大功能,将这些计算结果无缝地嵌入到一份可复现的分析报告中。
上一节我们完成了数据的清洗工作,得到了一个干净的数据框。本节中,我们来看看如何基于这个干净的数据框计算我们关心的统计指标,并生成一份动态报告。
计算核心统计量
现在我们已经有了清洗后的数据框,计算统计量变得非常简单快捷。我们将计算申请、录取和入学三个环节的男女性别比例。
以下是计算这三个比例的核心代码:
# 计算申请、录取、入学三个环节的男女性别比例
ratio_applications <- sum(clean_df$applications_male) / sum(clean_df$applications_female)
ratio_admissions <- sum(clean_df$admissions_male) / sum(clean_df$admissions_female)
ratio_enrollment <- sum(clean_df$enrollment_male) / sum(clean_df$enrollment_female)
执行这段代码后,我们可以在RStudio的环境面板中看到生成的三个比例值。
在R Markdown中嵌入结果
我没有直接打印这些结果,因为我想展示R Markdown的一个巧妙功能:我们可以在非代码块中直接嵌入变量。只需以反引号加字母R开头,后面跟上变量名即可。
这种方法允许你将计算的所有元素直接整合到叙述性文本中。你不需要执行这些文本块,而是通过“编织”过程来渲染它们。在RStudio中点击“视觉”标签页,你就能看到渲染后的结果。

为了查看这份报告的渲染效果,我们只需点击上方的“Knit”按钮。默认情况下,它会生成一个HTML文件。你可以看到这里已经生成了预览。这份报告非常实用,你可以将其展示给他人,或作为一份报告提供给利益相关者,也可以将其输出为PDF或Word文档。
报告中包含了我们所有的分析代码、实际执行的计算,以及我们创建的表格等。
优化报告输出
然而,报告也面临一个挑战:它会包含所有的输出内容。例如,这里包含了那个庞大的、包含上千个元素的布尔掩码,这并不十分有趣。有时还会输出整个数据框,而我们通常对此并不感兴趣。
我快速滚动到报告的底部,因为那里才是我真正想展示的、非常简洁的部分。在这里,我们可以看到报告中直接嵌入了计算出的数字。
这种方式的优势在于,如果我们的数据发生变化,或者我们需要回头修改脚本、改变某些假设、对数据有了新的认识,我们只需重新运行这个“编织”过程,所有数字都会自动更新,而我们之前写好的叙述性文本保持不变。这非常酷,也是R语言一个相当独特的功能。
结果解读与思考

现在,让我们看看这些数字,我们可以从中思考很多事情。
我们得到的申请男女性别比是 0.74,这意味着在所有大学中,女性的申请人数远多于男性。
录取的性别比更加悬殊,为 0.69,表明被录取的女性比例更高。
然而,入学的性别比略有回升,为 0.77。这可能是合理的,因为女性可能被更多不同的学校录取,但最终只能选择其中一所学校入学。
这只是对一个优秀的公共数据集的初步探索。关于这些数据,你希望回答哪些类型的问题呢?



本节课中我们一起学习了如何从清洗后的数据生成统计摘要,并利用R Markdown创建了包含动态结果的、可复现的分析报告。我们计算了申请、录取和入学环节的性别比例,并探讨了如何将计算结果优雅地嵌入叙述文本中,实现数据与洞察的一体化呈现。
18:本周补充内容 🧩


在本节课中,我们将回顾并整合公共部门数据分析的两个核心框架:公共行政的七项核心职能与四大支柱。我们将探讨这些概念如何共同指导数据分析实践,确保其服务于公共部门的根本使命与价值观。
公共行政的四大支柱 🏛️
上一节我们介绍了公共行政的七项核心职能,这有助于理解数据分析在公共部门中的多样化应用场景。本节中,我们来看看驱动这些职能的深层价值观,即公共行政的四大支柱。
这四大支柱是:经济、效率、效能与公平。你可以将它们视为公共部门使命背后的核心价值。
与其他组织类似,政府也有其使命或目标,即在遵循经济、效率、效能与公平这些价值观的前提下,为民众提供公共产品与服务。
四大支柱在实践中的应用 💼
在我的职业生涯中,曾有两份在公共部门从事数据分析的工作。一份是在一个大县的少年法院担任项目分析师,另一份是在一个州卫生部门担任流行病学家。在这总计六年的工作中,我所进行的所有数据清洗、管理、收集、分析、可视化、报告和沟通工作,都是由这四大支柱驱动的。
我的数据分析工作旨在回答以下类型的问题:
以下是基于四大支柱提出的典型问题示例:
- 经济:某些项目和服务成本是多少?这是否是对纳税人资金的合理使用?
- 效率:我们是否高效地利用了资源?即,所投入的资源是否产生了足够的价值?这些资源是否可用于其他方面?
- 效能:项目、服务、干预措施和政策是否有效?即,它们是否真正实现了既定目标?
- 公平:我们的项目、服务、干预措施和政策是在解决社会不平等问题,还是(不幸的是)可能正在制造不平等?
效能与公平的实践案例 📊
效能与公平这两大支柱是我特别擅长的领域。
例如,在少年法院,我通过分析数据来评估被送往一个为期六到九个月住宿项目的青少年的再犯率。
而在州卫生部门,我的一项工作是按种族、民族、性别和州内区域(关注城乡差异)分析癌症发病率的趋势。
总结与核心要义 ✅
本节课中,我们一起学习了公共行政四大支柱如何为数据分析提供价值导向。关键在于,公共部门的数据分析有时可能让人感觉相当官僚化,尤其是当我们将其置于政府行政的那些核心基础职能中思考时。


然而,正是经济、效率、效能与公平这些支柱,构成了贯穿始终的价值观,我不希望你们忘记这一点。政府需要像你们这样的聪明人进行高质量的数据分析,以确保这些价值观得以实现。
19:调查数据分析:重要性、类型及公共领域应用案例 📊

在本节课中,我们将学习调查数据分析在公共管理中的核心作用。我们将了解调查的主要目的、不同类型,并探讨其在公共部门各项核心职能中的具体应用案例。


公共管理各项核心职能都需要依赖多种不同类型的数据,这其中包括调查数据。调查的设计、实施和数据分析所涉及的方法本身就是一个完整的社会科学领域,甚至可以攻读调查研究的硕士或博士学位。我们接下来几节课的路线图,是为大家介绍调查数据分析在公共管理中的基本作用。这包括不同调查类型的定义和示例,以及使用调查时面临的共性问题介绍。
上一节我们介绍了课程的整体安排,本节中我们来看看调查在政府,特别是公共管理中的主要目的是什么。


调查的主要目的包括:
- 直接从政府产品、服务和项目的用户、客户、公民、员工及其他利益相关者那里,收集关于态度、经历和意见的信息。
- 为公共管理的所有核心职能提供信息支持。
- 客观和主观地衡量政府绩效,收集利益相关者的意见。
- 与公众互动以征求反馈、收集想法、帮助确定优先事项,并提升对政府的信任。

以下是调查如何在公共管理核心职能中发挥作用的几个例子。
在组织职能方面,一个例子是:可以对学校或学区的家庭进行调查,以获取关于该学区儿童数量以及家庭让孩子入读公立学校意向的更准确信息。

来自家庭的调查数据也可用于了解儿童是否需要课前或课后托育服务、儿童是否需要特殊教育服务、家庭在家使用何种语言等信息,这些信息将帮助学校组织其服务和项目。


对于计划职能,调查通常用于就政府新举措的想法、他们认为近期和长期的优先事项等,向公民征求系统性反馈。
对于指挥职能,客户反馈和满意度调查经常被持续使用。例如,一些司法管辖区会在犯罪受害者报案数月后对其进行调查,从受害者的角度获取关于案件是否以及如何得到解决、受害者是否对处理过程满意,以及改进反馈等信息。


对于人事职能,公共部门员工经常被调查,以获取关于他们的工作满意度、薪酬满意度,以及他们当前是否或计划在政府内部或外部寻找不同职位的反馈。
此外,还有许多调查示例横跨多项公共管理职能。

这包括可用于为信息、计划、指挥、组织等所有职能提供信息的民意调查。此外,许多政府使用调查数据来补充人口普查收集的信息,获取关于个人和家庭的更详细信息,这些信息随后被用于多种核心职能和目的。
现在让我强调一个重要观点。许多国家及其地方单位的政府会资助或支付由政府外部研究人员进行的调查研究,这些研究人员来自学术界、私营部门和非营利部门。

在这种情况下,政府资助那些它认为将为公共部门带来某种公共利益的调查研究。同样重要的是,在大多数政府调查完成且数据被分析后,通常需要将数据匿名化,即移除所有识别信息,然后公开,以便其他人可以访问和分析这些数据。
那么,公共部门使用的调查数据通常来自哪里?这在我刚才提供的例子中已有暗示,但让我们更明确一点。

首先,政府通过自己设计和实施的调查来收集数据。其次,政府使用由其他政府、非政府组织、学术研究人员、智库以及私营部门收集的外部调查数据。第三,政府使用其资助的研究所产生的调查数据,但这些数据反过来可供公众使用,包括政府本身。
让我就最后一点举一个简单的例子。我曾获得美国政府资助,进行一项全国性调查,研究人们如何理解政府发布的关于临床预防服务的指南,例如谁应该接受不同的癌症筛查测试、不同年龄的人应该接种什么疫苗等。我从联邦政府获得这笔资助的一个条件是,在我完成数据的初步分析后,不含任何受访者识别信息的调查数据将提供给其他研究人员和分析师使用。

为了继续讨论公共部门使用的调查数据来源,大多数国家和地方政府在开展自己的调查方面投入了大量资源。其中一些调查只实施一次,另一些则是持续进行的。例如,美国联邦政府每年进行大约100项调查。
这是另一个例子。许多国家进行旨在代表全国人口的持续性调查。他们从家庭收集关于劳动力参与、收入状况的重要信息,贫困统计数据就来源于此。还有其他关于他们居住的房屋类型以及与许多其他经济和社会福利问题相关的信息。这项调查在巴西被称为PNAD,英文是National Household Sample Survey;在印度被称为National Sample Survey;在美国被称为Current Population Survey。
此外,政府也使用在公共部门之外或外部收集的调查数据。简单的例子包括联合国统计数据,联合国有很多很好的统计数据,因为它定期进行大量的社会、经济和人口调查。

世界银行也进行了大量调查,包括所谓的“企业调查”,这些调查侧重于一组核心的经济和劳动力指标,并在150多个国家进行。此外,地方或社区调查通常由学术研究人员、非营利机构、当地企业、卫生系统进行,这些调查反过来为地方政府提供了有用的信息。同时,政府也可以从私营部门进行的市场研究和其他类型的调查中学到很多东西。

我毫不羞愧地向你们承认,我是一个调查数据爱好者。我数不清自己为学术研究和公共部门工作设计和实施了多少次调查。
我希望你们能和我一样,欣赏调查研究、调查数据分析以及公共管理重要工作和职能的力量与重要性。



本节课中我们一起学习了调查数据分析在公共管理中的基础作用。我们明确了调查在收集公众意见、支持政府核心职能、衡量绩效和促进公众参与等方面的主要目的,并通过具体案例看到了调查在组织、计划、指挥、人事等职能中的实际应用。我们还了解了公共部门调查数据的多种来源,包括政府自行收集、使用外部数据以及共享资助研究成果。理解这些是有效利用调查数据支持公共决策的第一步。
20:分析师必备:调查设计类型解析 📊

在本节课中,我们将学习调查数据分析的基础知识。作为一名数据分析师,在开始分析调查数据之前,必须理解调查的基本设计要素。这包括调查的目的、设计类型、数据收集方式以及时间维度。掌握这些信息是确保分析结果准确、可靠的前提。

理解调查目的与设计
上一节我们介绍了课程概述,本节中我们来看看调查数据分析的起点。在分析任何调查数据之前,分析师首先需要理解两个核心问题。

第一,需要理解调查的目的。这包括了解谁创建了这项调查,以及其目标或意图是什么。
第二,需要理解调查的设计。这意味着需要了解以下类型的信息。
以下是调查设计需要了解的关键信息:
- 调查的类型。
- 调查的目标受众或目标应答者群体。
- 抽样框和应答者选择方法。


抽样框与数据收集方法

理解了调查的基本目的后,我们需要深入了解数据是如何获取的。抽样框定义了调查的总体范围,而数据收集方法则决定了信息的获取方式。
例如,一个地方政府可能希望调查其辖区内的所有企业。它可以从税务部门获取去年纳税的企业名单,然后从该名单中随机抽取企业样本进行调查。政府可以对所有企业进行调查,但这需要更多资源且耗时。因此,通常可以从这个更大的企业总体中抽取一个随机样本。如果操作正确,从随机样本中获取的数据可以用来代表总体。这样就不必调查所有企业,抽样成本更低、效率更高,但能代表所有企业。

调查设计的另一个重要基本要素是数据实际收集的方式。这让我们回到对所用调查类型的理解。

调查类型:自填式与他人协助式


了解了数据来源后,我们来看看数据是如何被收集的。总的来说,调查可以分为自填式或他人协助式。
自填式调查由应答者自己完成。他人协助式调查则由访问员向应答者提问并记录答案。
以下是自填式调查的几种形式:
- 纸笔调查:应答者自己填写印有调查问题的纸张。
- 在线调查:应答者通过互联网(通常在家中)回答问卷问题。
- 服务亭调查:政府经常使用,通常在政府大楼等公共场所设置站点,邀请人们上前在屏幕上回答一些调查问题。服务亭显然连接到互联网,答案被收集并存储在数据集中。
- 邮寄调查:这是纸笔调查的另一种形式,但使用邮政服务将调查问卷邮寄给人们。邮寄调查的回复率通常很低。如果随信附上已付邮资的回邮信封,回复率会高得多。

对于由他人协助进行的调查,这通常昂贵得多,但出于多种原因而被采用。一个原因是当调查篇幅较长,或涉及一些复杂问题、需要比调查表上的简单复选框更详细的叙述性或定性回答时,这是一种更好的方法。当试图通过电话调查接触大量人群样本时,由访问员进行的调查也是一个好方法。此外,当政府调查的目标受众中有些人无法阅读时,采用访问员的调查方式几乎是唯一的选择。
访谈类型:结构化与半结构化
在他人协助的调查中,也存在多种形式。这包括结构化和半结构化的调查访谈。
结构化意味着所有问题都是预先确定的,访问员只需读出问题并记录应答者的答案。
半结构化意味着许多问题是预先定义和确定的,但访问员也可以追问和提出额外问题,真正与应答者进行对话,以获取更详细、清晰和有用的信息。

一个简单的例子:我曾为美国疾病控制与预防中心进行过一系列超过200次的半结构化访谈,对象是地方部落政府官员,旨在更多地了解他们实施一项最初为州而非部落设计的政府项目的经验。这些是一对一的结构化访谈,每次访谈超过一小时。这显然是一种劳动密集型的方法,但获得的信息与仅仅让人们自己填写简单的纸质表格截然不同。
其他类型的调查访谈包括小组访谈。这是一种方法,一组人同时在同一地点,由访问员同时向他们提问,但每个人私下在调查表上写下自己的答案。小组内部不讨论或分享答案。

这与所谓的焦点小组访谈不同。焦点小组访谈中,一小群人同时在一个房间或Zoom通话中,由访问员提问,但在这种情况下,小组会大声回答问题,他们不仅回答问题,还会彼此讨论自己的观点和看法。焦点小组访谈的目的实际上是引发小组讨论,以便了解在一对一提问时通常无法了解到的事情。
调查的时间维度

在深入分析数据之前,调查数据分析师还需要了解数据收集的时间跨度。
你需要知道和理解的一点是,这些调查数据是在多长时间内收集的。数据是在许多周、许多月、一年还是超过一年的时间内收集的?你需要了解所有这些,以理解你将得出的结果所代表的时间段。

此外,如果一项调查在某个事件(例如自然灾害、某种政府危机或其他我们所说的冲击或事件)发生前后都在收集数据,你需要知道这一点,以便查看该事件前后的结果是否不同。

分析师还需要知道一项调查是否是横截面调查。这意味着它是在一个时间点实施的。因此,应答只代表那一个时间点。或者,一项调查可能是横截面设计,但属于我们所说的多重横截面设计。这意味着调查会持续重复进行,但针对不同的人,或者说在每个时间点调查的是人口的不同横截面。年度调查通常就是这种情况,它们属于多重横截面调查。
然而,一项调查也可能是持续进行的,并长期跟踪同一群人,这种情况下被称为纵向调查或面板调查。


总结



本节课中我们一起学习了调查数据分析前必须掌握的基础知识。我们探讨了理解调查目的和设计的重要性,包括明确调查类型、目标受众和抽样方法。我们详细区分了自填式调查(如纸笔、在线、服务亭、邮寄)和他人协助式调查(如结构化与半结构化访谈、小组访谈、焦点小组)。最后,我们分析了调查的时间维度,包括横截面设计、多重横截面设计以及纵向(面板)设计。理解这些核心概念是确保后续数据分析工作有效、准确的关键第一步。
20:调查分析师必备:调查实施要点 📊

在本节课中,我们将深入探讨调查数据分析师必须掌握的几个核心实施要点。我们将了解如何评估调查数据的质量,以及为何需要理解调查设计和权重。


概述
作为数据分析师,理解调查数据的来源和收集方式至关重要。本节将介绍两个关键概念:调查回复率和调查权重。理解这些概念有助于我们评估数据的代表性,并确保分析结果的准确性。
调查回复率
上一部分我们讨论了数据的基本属性,本节中我们来看看调查数据特有的一个关键指标:回复率。

调查分析师需要知道调查的回复率是多少。回复率是指,在所有被邀请参与调查的单位(可以是个人、学校、企业、教堂或其他宗教组织等)中,实际完成或开始了调查访谈的比例。

回复率的计算公式如下:

回复率 = (已开始的访谈数 / 被联系、符合条件且被邀请参与调查的总人数) × 100%
需要注意的是,计算回复率实际上比我刚才提到的更复杂,大多数调查会有多个回复率。但就我们的目的而言,作为数据分析师,你应该了解总体的回复率,以及回复率是否因不同亚组(例如性别、年龄、地理区域、教育状况)而异。
回复率帮助我们理解数据是否真正代表了更广泛的人群,或者结果中是否存在某些偏差。
调查权重
了解了数据的回复情况后,我们还需要关注一个更技术性的细节:调查权重。
分析师需要知道数据集中是否存在需要使用调查权重的情况。调查权重是由调查方法学家创建的,作为分析师,你需要知道你使用的数据集是否包含调查权重、权重的不同类型,以及在分析数据时是否应该使用这些权重。
让我们更深入地探讨一下。调查几乎总是基于样本,即从更大总体中选择的一部分案例。在数据分析中,调查数据通常需要进行加权。这是一个由你所用的统计软件包执行的数学过程。
加权会对样本受访者施加不同的“计数”或“权重”,目的是使你的分析结果能更好地代表所关注的全部总体。
以下是一个例子:
一项调查可能有意过度抽样了少数种族或文化群体,以便为不同亚组的统计分析获得足够的样本量。在完整的分析中,数据必须进行加权,这样这个被过度抽样的亚组就不会在整体结果中被过度代表。这样做是为了确保完整的样本结果不会因该群体的过度代表而产生偏差,从而使其能反映总人口的情况。

我知道我向你抛出了很多术语和技术细节,但对于分析师来说,理解基本的调查设计、用于收集所分析数据的方法、回复率是多少以及分析中是否需要应用调查权重,确实非常重要。
来自调查的数字和数据都有其来源,它们并非神奇地出现在你面前的数据集中。因此,你真的需要了解数据为何以及如何被收集,以及这些其他基本细节,以便将你的分析工作置于正确的背景之中。
总结


本节课中,我们一起学习了调查数据分析师必须掌握的两个核心实施要点。我们明确了调查回复率的定义和重要性,它帮助我们评估数据的代表性。我们还深入探讨了调查权重的概念及其作用,即通过数学调整确保样本结果能无偏地推断总体。理解这些调查实施的基础,是进行严谨、可信的数据分析的前提。
22:调查数据理解方法论(第一部分)🔍

在本节课中,我们将学习如何理解调查数据集。我们将介绍数据集中变量的基本概念、类型以及解读数据的关键工具——编码手册。



上一节我们探讨了调查的目的、设计、类型和抽样方法。现在,我们将进入分析调查数据的环节。
相应地,我们需要花些时间来理解数据集的内容,了解实际收集了哪些数据以及它们的格式。


调查数据集中的每一项信息都称为一个变量。
每个数据集都附带一份编码手册,这对于理解调查数据中的所有变量至关重要。你可以将编码手册视为理解和分析调查数据的路线图,它通常包含以下内容。
以下是编码手册包含的核心信息:
- 变量名:数据中的每个变量名,通常是一个简短的名称,用于分析。
- 变量标签:对变量实际含义的较长描述。
- 调查问题编号:来自调查问卷的问题编号,确保你能将编码手册和数据中的变量与调查中提出的问题联系起来。
- 问题原文:调查中该问题的实际措辞。

编码手册还包含每个变量的类型信息。我们将主要考虑三种变量类型,当然它们各自还有子类型。
以下是三种主要的变量类型:

- 字母变量:该变量的回答仅包含字母。例如,某人的姓名,或开放式问题中的简短文本。
- 数值变量:该变量的回答仅包含数字。
- 字母数字变量:该变量的数据同时包含数字和字母。
统计分析只能在数值变量上进行。因此,当调查数据收集时,如果包含字母或字母数字的回答,通常需要在进行分析前将其重新编码为数字。
例如,一项调查可能要求人们列出他们最喜欢自己社区的哪些方面。这会生成大量文本或字母回答。这些回答随后会进行定性分析,并归类分组,每组会获得一个对应的数字,以便进行统计分析。


最后,编码手册包含每个变量的格式和潜在回答代码信息,以及每个数字的清晰标签。
需要指出的一点是,编码手册还会明确指出当数据缺失时,每个变量被赋予的代码。这意味着受访者没有回答问题,可能是因为跳过了、提前退出调查、漏答了问题,或者是明确拒绝回答。
现在,让我们回到调查中最常见的变量类型——数值变量,这也是唯一可用于统计分析的变量类型。
数值变量本身也有几种不同的类型。
首先,我们有名义变量。名义变量是指调查问题有两个或更多可能的答案,但这些答案没有内在的顺序或排名。例如,询问某人“是或否”、“对或错”。另一个例子是询问某人的婚姻状况。
在这个例子中,我们看到这是调查中的第12个问题,问题是“你目前的婚姻状况是什么?”。编码手册中这个变量名为 Mar_status。分析师在进行任何分析时,会在命令或代码中输入这个名称。这里有九个可能的值(都是数字):1=未婚,2=同居,3=已婚,等等。你还可以看到,代码8表示受访者拒绝回答问题,代码9表示数据缺失。
接下来,我们讨论连续变量。连续变量是指受访者输入一个代表实际数量的数字。例如,孩子的数量、上个月去公园的次数、月收入、拥有多少只宠物。年龄也是一个连续变量的例子。
在这个例子中,我们看到调查问题15询问“你的年龄是多少?”,并且这个变量的格式是连续的,意味着调查设计允许受访者直接填写自己的年龄。

然而,年龄在调查中也可以格式化为顺序变量。顺序变量是一种数值变量,其回答具有某种隐含的顺序或排名。
在这种情况下,变量“年龄”的顺序格式可以为受访者提供五个年龄组供选择,以表明他们的年龄落在哪个范围内:1=小于18岁,2=19至39岁,等等。调查设计者可以使用少量分组(如本例所示),但如果想获得更精确的年龄,也可能使用5岁或10岁的年龄范围。
思考一下:你认为哪种方法能从受访者那里收集到最准确的年龄数据?是让人们直接填写年龄的连续格式,还是提供不同年龄组的选择格式?
调查研究表明,提供小的年龄分组能获得最准确的信息。事实证明,很多人不喜欢报告自己的确切年龄,他们担心这会成为识别信息,从而担心结果无法匿名(而匿名性通常是调查研究中承诺的)。此外,有些人因为不想显得那么老或不想让人知道自己的年龄,会倾向于将年龄向下取整,并且通常取整到以5或0结尾的数字。因此,如果想在调查中获得非常准确(而非近似)的年龄信息,使用小的年龄分组是最佳方式。

好的,继续前进。这是调查中另一个顺序变量的例子,其定义是具有两个或更多可能回答、且回答具有某种隐含顺序或排名的变量。
这里我们有一个态度变量的例子:“你对市政府发布的统计数据有多少信任?”。我们的编码手册显示这是调查中的第33个问题,可能的答案是:1=非常信任,2=倾向于信任,3=倾向于不信任,4=非常不信任。代码8用于表示拒绝回答的受访者,代码9表示数据缺失。你可以看到,这些回答在衡量“信任”这个概念上具有隐含的顺序。



本节课中,我们一起学习了理解调查数据的基础。我们认识了变量和编码手册的重要性,区分了字母变量、数值变量和字母数字变量,并重点探讨了用于统计分析的数值变量的子类型:名义变量、连续变量和顺序变量。理解这些概念是准确分析和解读调查数据的第一步。
23:调查数据理解方法论(第二部分)📊

在本节课中,我们将继续学习调查数据的方法论,重点介绍一种特定的序数响应量表——李克特量表。我们将了解它的定义、用途和常见示例。
李克特量表:定义与起源

上一节我们介绍了变量类型和格式。本节中,我们来看看一种在态度和意见测量中极为常见的序数量表。
一种特定类型的、使用序数响应量表的调查问题被称为“李克特量表”。这个量表实际上是以密歇根大学的一位调查研究教授的名字命名的,这位教授就是李克特教授。
李克特量表的用途与结构
李克特量表用于测量态度和意见。其操作方式是向受访者提供一个陈述,然后让他们选择在多大程度上同意或不同意该陈述。相信大家都填写过包含此类问题的调查问卷。
这类问题通常有五个响应类别。以下是一个例子:
- 陈述:在我最近一次去公共卫生诊所就诊时,我受到了尊重。
- 调查问题:您在多大程度上同意或不同意这一说法?
另一个使用李克特量表的调查问题示例是向受访者提出如下陈述:
- 陈述:我支持将国家香烟税提高10%的新提案法律。
然后,受访者需要在以下选项中选择答案:
- 非常同意
- 同意
- 中立(或既不同意也不反对)
- 不同意
- 非常不同意

深入探索与展望
关于不同类型的变量格式、变量的构建与使用方法,以及在调查中如何分析数据,还有更多内容需要理解。
随着我们深入研读一些数据字典,您很快就会更详细地看到这些内容。


总结

本节课中,我们一起学习了李克特量表。我们了解到它是一种以学者命名的、用于测量态度和意见的序数量表,其核心是让受访者对给定的陈述表达同意或不同意的程度,通常包含五个标准选项。掌握这种常见的问题格式,是理解和分析调查数据的重要基础。
24:代码本解读实例 📖



在本节课中,我们将继续探讨调查数据分析,重点学习如何解读和使用调查代码本。代码本是分析师理解调查问卷结构、数据存储方式以及进行分析所需全部信息的“路线图”。
上一节我们讨论了调查数据的基本概念,本节中我们来看看如何通过一个具体实例来理解代码本。



概述:什么是调查代码本?

调查代码本为分析师提供了理解数据所需的完整蓝图。它说明了用于收集数据的调查问卷是什么样子,收集到的数据如何存储,以及分析所需的所有信息。理解这一切的最佳方式就是直接深入一个实例。

我们将以美国“行为风险因素监测系统”的代码本报告为例进行解读。这是一个基于州的电话调查,收集与健康相关的风险行为、慢性病和医疗使用等成人数据。该调查始于1984年,现已覆盖美国所有50个州、哥伦比亚特区及三个属地,并且其方法已被全球超过20个国家采用。


以下是关于该调查的一些关键信息:
- 调查类型:这是一项随机数字拨号的电话调查,旨在获取各州成年人口的随机代表性样本。最初仅使用固定电话,现已扩展到包括手机。
- 语言:调查使用英语和西班牙语进行。
- 数据类型:数据每年收集,每年使用全新的样本,因此属于横截面数据,而非追踪同一批人的纵向数据。
- 问卷结构:调查包含一套每年使用的固定核心问题集,同时每年会增加一两个附加模块,以收集关于新兴健康问题(如COVID-19)的信息。
- 地理层级:样本代表整个州,而非县或市等更小的地理单位。数据分析师需注意,不能将基于高级别地理单元抽样的数据随意向下钻取分析。
- 响应率:该调查的响应率约为50%,这对于当今的电话调查来说是相当标准的水平。
您可以在幻灯片或其他资料中找到2020年行为风险因素调查代码本报告的链接。该报告长达161页,我们不会逐一讲解,但会通过几个关键例子,展示代码本中通常包含的信息类型。





代码本信息解读示例

代码本中包含的信息,有些并不直接出现在给受访者的问卷中,但对分析师至关重要。

示例一:调查完成状态变量 (_DISPCODE)
我们来看一个名为 _DISPCODE 的变量。变量标签告诉我们,它代表“最终处置状态”,即访谈是否完成。


以下是关于此变量的关键信息:
- 变量类型:这是一个数值型变量,意味着在数据集中该变量的值只能是数字。
- 取值与含义:从代码本报告的频率表中可以看到,主要取值有两个:1代表“完成访谈”,2代表“部分完成访谈”(即未完成全部问题)。
- 数据分布:报告显示,82.25%的受访者完成了全部访谈,17.75%的受访者在结束前退出。了解这些信息对分析师很重要,不仅能知道总响应率,还能了解有多少人完整完成了整个调查。
示例二:人口统计变量 (_MARITAL)
代码本中当然包含所有关于受访者的人口统计信息,如性别、年龄、收入、教育背景等。我们以婚姻状况变量 _MARITAL 为例。


以下是关于此变量的详细信息:
- 变量含义:代表婚姻状况,属于人口统计部分。
- 定位信息:代码本会告诉你它在调查数据中的位置,例如:属于核心部分第8节,是第5个问题,位于数据文件的第167列。这些是分析师在数据集中定位该变量所必需的信息。
- 变量类型:同样是一个数值型变量。
- 问题与编码:代码本展示了受访者被问到的问题原文:“您是已婚、离异、丧偶、分居、从未结婚,还是未婚伴侣关系的一员?” 可能的回答被编码为数字:1=已婚,2=离异,3=丧偶,4=分居,5=从未结婚,6=未婚伴侣。
- 应答分布:代码本报告会展示回答的分布情况,例如:2020年,51.57%的受访者回答“已婚”,12.92%回答“离异”等。
- 特殊编码:代码本中还会显示特殊值,例如值
9代表“拒绝回答”。约有3,800人(略低于1%)拒绝回答此问题,他们被编码为9。此外,还有极少数人(12人)因故未被问及此题,属于“未询问/缺失”。区分“拒绝回答”和“缺失数据”非常重要,它们不是一回事。
示例三:健康状态变量 (GENHLTH)
几乎所有政府健康调查都会包含一个关于总体健康状况的问题。变量名为 GENHLTH。


以下是关于此变量的详细信息:
- 变量含义:指“总体健康状况”问题。
- 定位信息:它位于“健康状况”部分,是第一个问题,在数据文件的第101列。它是一个数值型变量。
- 问题与编码:访谈员问受访者:“总的来说,您认为您的健康状况是?” 选项为:极好、很好、好、一般、差。这些回答分别对应数值1到5。
- 应答分布与特殊编码:查看频率分布时,你会发现有些人回答“不知道/不确定”(尽管这不是预设选项),约有650人(不到0.5%)如此回答。此外,有303人拒绝回答此问题(编码为7)。还有极少数人因故未被问及此题。这些情况都在频率分布中有所体现。
总结与建议
我知道,深入代码本的细节可能不那么令人兴奋,但因为你将使用这个数据集进行分析,我们强烈建议你花些时间浏览整个代码本。

在开始分析数据之前,请尝试:
- 查看所有不同的变量。
- 了解不同类型问题的提问方式。
- 查看回答的分布情况。
- 注意调查中的跳转模式(在代码本中也能看到)。



本节课中,我们一起学习了如何解读调查代码本。我们通过国家行为风险因素监测系统的实例,了解了代码本如何作为数据分析的路线图,提供了变量定义、编码方式、问题原文以及数据分布等关键信息。熟悉代码本是进行准确、有效数据分析的重要第一步。
25:数据看板典型案例 📊

在本节课中,我们将学习数据看板在公共部门中的应用。数据看板已成为政府向公众沟通和报告数据的重要方式。我们将通过几个典型案例,了解不同层级政府如何使用看板来分享信息、报告目标进展,并探讨优秀看板的设计特点。
上一节我们介绍了数据看板的基本概念,本节中我们来看看具体的应用实例。
首先,我们以印度政府为例。印度国家政府拥有众多数据看板,其中一个由统计和计划执行部创建,用于展示印度可持续发展目标的进展。

该看板内容非常丰富。用户可以点击17个可持续发展目标中的任何一个。例如,点击目标3“确保健康的生活方式,促进各年龄段人群的福祉”后,可以进一步查看该目标下的13个具体指标。针对每个指标,看板都提供了展示进展的数据可视化图表。

可持续发展目标2是“零饥饿”。在看板上点击该目标,可以看到其具体描述:“消除饥饿,实现粮食安全,改善营养状况和促进可持续农业”。深入看板细节,会发现该目标下共有8个具体指标。例如,指标1是“到2030年,消除饥饿,确保所有人,特别是穷人和弱势群体,全年都能获得安全、营养和充足的食物”。看板通过数据可视化展示了这8个指标各自的进展。

这是一个高度交互式的看板,用户可以花时间探索,它以非常高效的方式提供了大量信息。

接下来,我们看另一个例子。利比里亚政府财政和发展规划部最近发布了一个看板。

该看板主要展示政府在不同部门的资金支出情况,即计划拨款与实际拨款的对比。以下是看板中展示的主要部门类别:

- 农业
- 教育
- 能源与环境
- 公共管理
- 社会发展


这个例子展示了政府如何通过看板,向公众透明地呈现其税收收入的计划支出与实际支出的对比情况。
此外,美国国际开发署(USAID)为世界上几乎每个国家都创建了数据看板。在课程提供的链接文档中,可以找到印度尼西亚和阿根廷的看板链接。实际上,你对任何感兴趣的国家,都可以在USAID网站上找到类似的看板。

让我们快速浏览一下阿根廷的看板。


每个看板的设计都各不相同。有些非常复杂且难以操作,有些则更简洁明了。USAID的网站包含大量信息。以阿根廷看板为例,你会看到与饥饿和粮食安全相关的统计数据。

这些统计数据非常详细,包括:
- 谷物产量
- 全球粮食安全指数
- 总生产指数
- 农业就业人数等

你不需要完全理解所有统计指标的含义,未来你会在自己专攻的公共管理领域成为专家。这里的重点是,这些看板能让你快速获取国家层面的一些重要统计数据快照。
在USAID网站上,你还能看到与经济、国内财政收入、教育、性别平等、健康、贸易与投资、民主人权与治理、环境与全球气候变化以及信息通信技术相关的统计数据。
许多看板具有交互性,这意味着你可以控制信息的详细程度,并与看板互动以获取不同地理单元或不同子群体的深入数据。
伦敦市的犯罪数据看板就是一个很好的例子。



这个看板非常互动,提供大量信息。你可以获取行政区(Borough)和选区(Ward)级别的犯罪总量与趋势数据。看板提供基本统计数据和简单但重要的数据可视化图表。同时,它包含一张伦敦地图,你可以点击特定的行政区或选区,然后它会显示该伦敦市较小地理区域更详细的统计数据。

因此,这个看板既展示了整个城市的犯罪统计数据,也允许用户深入了解城市不同区域(这些区域的统计数据可能差异很大)的信息。
今天分享的最后一个例子来自美国加利福尼亚州的圣地亚哥市。


这个看板明确旨在与市民沟通该市的战略规划。这是一个相当大的城市。看板说明城市制定了战略规划,包含多个重点领域。进入看板后,你可以找到更多信息,例如“关注我们的进程”,在那里可以了解该市战略规划的具体过程、市民如何参与以及如何确定优先事项。

对于实际的战略规划及其重点领域,你可以查看具体内容,了解目标是什么、衡量目标进展的指标,以及当前进展状况。

该市的战略重点领域包括:
- 为我们所有人创建家园:包含住房安全目标。
- 保护和丰富每个社区:包含社区层面的目标。
- 推进交通与基础设施:包含许多与交通相关的目标。
- 倡导可持续发展目标:包含许多与环境保护和气候变化相关的目标。
- 促进区域繁荣:包含经济目标。

我建议你花些时间浏览这些看板,或者自己在网上寻找其他例子。观察它们,并思考以下问题:

首先,创建这些看板需要哪些数据?
其次,你认为看板中哪些是数据可视化和数据呈现的优秀范例?
同时,也找出那些你认为未达标准、难以操作或沟通效果不佳的看板例子。






本节课中,我们一起学习了数据看板在公共部门的多种应用案例。我们看到了从印度国家政府的可持续发展目标追踪,到利比里亚的财政支出透明化,再到USAID的国家数据概览,以及伦敦和圣地亚哥市的地方性交互看板。这些案例展示了看板如何以高效、透明和互动的方式,帮助政府与公众沟通复杂数据、报告政策进展并提升治理的透明度。理解这些典型案例,是设计和评估有效公共部门数据看板的第一步。
26:行为风险因素监测系统代码本解析 📖

在本节课中,我们将学习如何解析和使用“行为风险因素监测系统”的数据代码本。代码本是理解任何数据集的钥匙,它详细说明了每个变量的含义、编码方式以及数据收集的背景信息。
在深入研究数据的代码本之前,值得先阅读美国疾病控制与预防中心和行为风险因素监测系统提供的概述文档。该文档讨论了数据收集的参数。例如,在此次BRFS调查中,他们混合使用了固定电话和手机抽样来联系潜在受访者。此外,各州可以添加自己感兴趣的特定问题,或选择加入CDC提出的某些问题。
调查设计中有一个重要主题是如何对回答进行加权,本课程不会深入探讨。在这项调查中,由于调查的运行方式,家庭电话数量越多的人被联系到的几率就越大。这里开始显现出代表性的挑战。电话访问不便的人群,例如无家可归者、或因工作无法经常接听电话的人,在此数据集中的代表性远低于每个成员都有手机的家庭。
这种人口偏差部分是调查设计所固有的,在基于此数据得出结论时需要予以承认。然而,可以使用其他分析方法来处理部分这类回答,例如根据某人被联系到的倾向性对其进行重新加权。这对于公共部门工作是一个重要且引人入胜的考量,概述文档也提到了CDC如何处理这一问题。
现在,让我们来看看代码本的实际样子,本周我们将一直使用它。所以让我们先熟悉它。
代码本由这些不同的变量组成。这是第一个变量,它被称为州FIPS代码。这在联邦数据中非常常见,它用于标识州并将州名映射为一个数值。例如,阿拉巴马州对应数值1。
这里有很多对你有用的信息。它告诉你这是记录标识的一部分,这是确定的第一个问题。它实际上告诉你它在数据列中的起始位置是第1到2列,并给出了一些关于该变量大小的信息以及变量类型。变量类型是数值型,然后是SAS变量名。这对我们很重要,因为这就是R导入这些变量时看到的名字。



让我们看看本周会频繁使用的一个变量。实际上,这个变量是关于肺癌筛查的,我们将仔细研究它。它的SAS变量名是LCCS_FIRST。我们可以看到它是一个数值,实际存储在数据集的第316到318列。

我们使用的R包不会直接用到这个位置信息,但有时你需要知道特定列在数据中的确切位置。在顶部我们看到它有一个标签。但在下方,有一个问题。这将是直接向电话受访者提出的问题:“您几岁时开始定期吸烟?”
在代码本内部,他们定义了四个不同的类别:
- 如果值在1到100之间,代表开始吸烟的年龄。
- 如果值是777,代表“不知道或不确定”。
- 如果值是999,代表“拒绝回答”。
- 如果是空白,代表“未询问或数据缺失”。
代码本没有说明该列中超出这些范围的值。我们还看到了每个类别的频率。这实际上告诉我们数据集中每个值有多少个,以及所占的百分比。然后,正如我之前提到的,基于受访者的人口统计和联系特征,例如他们是否在拥有多部电话的家庭中,这里还有一个加权百分比。

以上就是代码本的基本结构。现在你已可以访问这个长达161页的代码本。你不需要全部阅读,但我认为其中有一些不同的代码值得你查看,并跟随课程讲座学习。这是一个非常好的代码本示例,很多代码本远没有这么完善。有些我接触过的代码本甚至是数据收集者留下的便签。
既然我们已经了解了这个代码本,我认为应该开始探索和操作这些数据了。所以,让我们获取数据集,进入R环境,开始工作吧。


本节课中,我们一起学习了如何解读BRFS数据集的代码本。我们了解了代码本的结构,包括变量名、位置、类型、标签、问题原文以及数值编码的含义。我们还讨论了调查数据中加权的重要性及其对代表性的影响。掌握代码本是进行任何数据分析的第一步,它为后续的数据导入、清理和探索性分析奠定了坚实的基础。
27:dplyr数据操作:数据探索(tidyverse应用)📊

在本节课中,我们将学习如何使用Tidyverse系列包,特别是dplyr,对2020年行为风险因素监测系统数据进行操作和探索分析。

概述:Tidyverse简介

上一节我们介绍了基础R的数据操作。本节中,我们将认识Tidyverse,这是一系列为R编写的、高度集成的扩展包,旨在使数据科学工作流程更快速、更流畅、更一致。


Tidyverse包含八个“有主见”的R包,它们扩展了基础R的功能。之所以称为“有主见”,是因为它们要求用户遵循其提供的编程接口和数据分析风格。以下是Tidyverse的核心包:



- ggplot2:一个基于图形语法分层的绘图系统,用于在R中创建图形。它是R中最受欢迎的库之一,其语法(通常简称为ggplot)非常独特。从下一门课程开始,我们将大量使用ggplot2。
- dplyr:一个用于数据清洗的工具箱,提供了一系列函数,使我们能够以更易读、更快捷的方式筛选和整理数据集。这是我们今天课程剩余部分将要探索的主要工具包。
- tidyr:提供帮助你将数据整理成一致形式的函数。在整个专项课程中,我们会用到其中的许多函数。
- readr:提供读取多种不同文件格式表格数据的机制。处理公共数据的一个挑战是,许多数据集仅以基础R无法处理的格式提供,而readr为处理其他类型的数据集提供了一些功能。
- purrr:一套R的函数式编程工具。作为向量化语言,R可以非常快速且易读,而purrr通过允许我们编写更简洁、循环更少的代码来进一步提升这一点。虽然purrr很有趣,但我们在本专项课程中实际不会过多使用它。
- tibble:R数据结构
data.frame的替代品。请放心,tibble构建在data.frame之上,因此你不会丢失已学知识。相反,它有助于在实际错误影响你之前提供反馈。我们将在本课程及后续课程中使用tibble,但为便于理解,我通常仍将其称为数据框。 - stringr:用于操作字符串的函数。在公共数据中,我们经常获得清理得相当好的数据文件,不需要进行字符串解析。然而,当我们处理来自网络的数据或通过光学字符识别(OCR,有时称为扫描)产生的数据时,这个库就非常宝贵。
- forcats:一套用于处理R中分类变量的工具。我们将不再仅仅使用字符串和整数,而是会在整个专项课程中稍微使用这个包,以便更好地分类和可视化我们的数据。


对于这些库,作者都提供了速查表以及在线文档来支持你的使用。我在课程平台中链接了其中一些资源。


加载Tidyverse与数据
让我们在第一个代码块中加载tidyverse包。你会注意到我为这个代码块提供了一个标签或名称。通常,我们会为设置和绘图相关的代码块添加标签,这能让RStudio更智能地处理库的重载和文件输出的命名。你可以通过在代码块第一行末尾添加一个逗号和一个单词来为其添加标签。


library(tidyverse)

加载后,我们会看到一些不错的输出信息,包括每个加载包的版本以及任何冲突。当两个包被加载且它们具有相同名称的函数时,就会存在冲突。例如,在我的机器上,dplyr包与stats包冲突,它用新的函数“屏蔽”或替换了filter和lag函数。这没关系,如果我们想使用stats包中的函数,只需通过stats::filter这样的命名空间方式来指定。

读取外部数据


BRFSS数据以SAS数据文件格式提供。这种格式不是R的原生格式,而是一种专有的二进制数据格式。SAS数据在公共管理领域相当常见,我们可以使用foreign包将其加载到数据框中。
因此,我们先加载foreign包,它会创建一个名为read.xport的新函数来读取SAS数据。然后,我们将数据加载到一个数据框中。
library(foreign)
data <- read.xport("path/to/your/file.xpt", fill = NA)

fill = NA参数表示数据应被读入,任何空白项应被列为NA。这个过程可能需要一些时间,因为数据集不小。
我想解释一下我是如何做到这一点的,因为老实说,我在自己的工作中不常使用SAS数据。当我在网站上注意到它是SAS格式时,我不得不做一些调查来弄清楚如何在R中处理。但你甚至不需要离开RStudio就能做到这一点。我只需点击文件窗格中的“Packages”选项卡,然后搜索“SAS”。我看到了一些包,点击进入foreign包,查看了函数并阅读了在线文档。这一切都得益于CRAN(综合R档案网络)这个中央R代码库。一旦我决定尝试,我只需点击安装按钮即可。虽然我们已经为你安装了这些包,但你应该了解这个过程是如何工作的。如果你已经使用其他数据格式,现在可以花点时间探索RStudio的包界面,看看有哪些可用的包。

初步数据检查与变量处理
从环境选项卡中,我们可以看到这个数据非常庞大:近50万条观测记录,涉及近300个不同的变量。始终建议查阅代码簿,了解不同数据的含义。例如,在这个数据集中,有一个名为_PSU的变量,它似乎是给定年份内数据集中唯一的序列号。
但是,如果我们尝试查看该变量的前10个值,会遇到一个问题。我们可以使用美元符号$提取单个列,并使用切片符号[1:10]查看前10项。我们立即会发现这里有问题,R给出了一点提示。
data$_PSU[1:10]
问题在于,我们代码簿和数据文件中的变量并非都适合R的命名规则。R的变量名需要以字母开头,而不是下划线。因此,read.xport函数已自动将这些变量重命名,在它们前面加上了大写字母“X”。所以,让我们再次查看数据,这次在变量_PSU前加上“x”。
data$x_PSU[1:10]
现在我们看到了一些值,它们只是科学计数法表示的数字,对我们来说不是特别有用。代码簿告诉我们这些是序列号。在这个数据集中,有两列实际上代表序列号,而我们都不需要它们。
之前我们看到,可以通过在方括号中指定行号并在前面加上减号来删除行。dplyr包使删除列变得更加容易。它提供了一个名为select的函数,允许你按名称引用列,包括允许我们使用负号来删除列。
让我们删除这两个变量。为此,我们传入要处理的数据框,然后是列选择列表。这里我将使用负号来指定要删除的列。
data <- select(data, -x_PSU, -x_另一序列号变量名)
对于有编程背景的人来说,这可能看起来像一个奇怪的函数。请记住,R中的对象模式通常与其他语言大不相同。因此,几乎所有东西都是一个函数,它接受一个数据结构作为其第一个参数,然后返回该数据结构的修改版本。在R中也很常见的是,看到一个任意的参数列表(在本例中,是两个排除条件),而不是一个包含值列表的单个参数。
管道操作符 %>%
在本课程的大部分工作中,我们将持续调用函数,其中第一个参数是我们的数据,并且我们希望将其赋值回某个变量。这种“数据作为函数第一个参数”的模式写起来真的很累,因此在2021年,R语言中添加了一个名为管道操作符%>%的新运算符,它实际上非常酷。
管道操作符%>%允许你将一个表达式的结果“传递”给下一个表达式,作为其第一个参数。这使得代码更易读,更像一个从左到右的数据处理流程。例如,上面的select操作可以重写为:
data <- data %>%
select(-x_PSU, -x_另一序列号变量名)
这读作:“取data,然后(%>%)从中选择(select)删除x_PSU和另一个变量。”这避免了嵌套函数调用,使代码逻辑更加清晰。在后续的数据操作中,我们将广泛使用管道操作符来串联多个数据处理步骤。
总结


本节课中,我们一起学习了Tidyverse生态系统,这是一个强大的R包集合,旨在简化数据科学工作流程。我们重点介绍了其八个核心包的用途,并实际演示了如何使用foreign包读取SAS格式的公共数据集,以及如何使用dplyr包的select函数删除不需要的列。最后,我们认识了能极大提高代码可读性的管道操作符%>%。在接下来的课程中,我们将深入利用dplyr和ggplot2等工具,对数据进行更复杂的整理、探索和可视化。
28:dplyr管道操作与变量添加技术

在本节课中,我们将学习R语言中两个极其重要的概念:管道操作符 %>% 和 dplyr 包中的 mutate 函数。管道操作符能让我们以更清晰、更易读的方式串联多个数据操作步骤。而 mutate 函数则允许我们在数据框中创建或修改列,为数据分析和转换提供了强大的灵活性。
管道操作符 %>% 简介
管道操作符最初由 magrittr 库引入。经过多年被大量包广泛使用后,它被正式添加到了基础R语言中,尽管形式略有变化。该操作符由两个字符表示:一个竖线和一个大于号 %>%。
它的作用是将操作符左侧的变量作为第一个参数,传递给操作符右侧的函数。因此,代码 some_function(data, x) 实际上可以写成 data %>% some_function(x)。
初看之下,这似乎优势不大。但当你意识到可以借此将多个函数串联在一起,而无需面对层层嵌套的括号时,其价值便显现出来。
为了演示管道操作符,我将向你介绍 dplyr 包中的一个新函数:filter。filter 函数允许我们获取一个数据框,并对其应用多个布尔掩码,从而筛选出更小的子集。
使用管道进行数据筛选与计算
BRFSS数据集中有一个变量 LC_FIRST,它存储了对“您多大年龄开始定期吸烟?”这个问题的回答。代码手册第91页指出,其值可能在1到100之间,也可能是777(表示不知道)、999(表示拒绝回答)或空白(我们已通过 read.csv 函数将其转换为 NA)。
如果我们想快速计算人们报告开始吸烟的平均年龄,可以应用几个不同的布尔掩码。
以下是使用管道操作符的示例代码:
data %>%
filter(!is.na(LC_FIRST), LC_FIRST != 777, LC_FIRST != 999) %>%
select(LC_FIRST) %>%
unlist() %>%
mean()
运行上述代码,我们得到结果 43.4。
这个表达式看起来更复杂了,让我们逐行解析:
- 首先,我们获取名为
data的数据框,并使用管道%>%将其传递给filter函数。在filter中,我设置了三个布尔掩码:确保值不是NA、不是777、也不是999。 - 接着,我将
filter的输出(一个数据框)通过管道传递给select函数。由于我只计算平均值,所以只对一列感兴趣。我以非引号字符串的形式提供了列名LC_FIRST。 select函数有点特别,它返回的是一个列表而非向量,即使该列中的所有值都应该是数值型。因此,我需要使用基础R函数unlist将其转换回向量。- 最后,我将这个向量通过管道传递给
mean函数以计算平均值。
尽管这是一个完整的表达式,但我可以在管道内的每一行后面添加注释,这确实非常方便。
管道是现代R编程的基础,你将在本系列中频繁看到我使用它。坦率地说,你在网上的几乎每个示例中都会看到它的身影。
使用 mutate 函数添加新变量
我们不仅可以从数据框中提取变量,还可以添加新的变量。在 tidyverse 中,mutate 函数用于在数据框中创建和修改列。
例如,在我们的数据字典中,有一个名为 X_CHILDCNT 的变量,表示家庭中的儿童数量(见代码手册第144页)。如果我们想将其转换为一个新列,可以在数据框中使用条件语句来实现,tidyverse 内置的函数可以帮助我们。
使用 if_else 创建布尔列
以下是一个创建新列的例子。我将创建一个名为 child_cat 的新列,其值取决于 X_CHILDCNT 列的内容。
让我们从创建一个表示“是否有孩子”的新列开始:
data <- data %>%
mutate(child_cat = if_else(X_CHILDCNT == 9 | X_CHILDCNT == 1, FALSE, TRUE))
mutate 函数接收要创建的列名,并将其设置为某个值。在这个例子中,我们使用了 tidyverse 中的 if_else 条件函数来检查 X_CHILDCNT 的值是否为9(表示缺失)或1(表示没有孩子)。如果是,则为新列返回 FALSE;如果上述条件不成立,则意味着他们有孩子,因此我们为新列返回 TRUE。
这本质上就是布尔掩码。if_else 语句的第一个参数是掩码条件,后两个参数分别是条件为假和真时要返回的值。因此,运行 if_else 函数的结果是一个完整的新数据列,mutate 会将其赋值给指定的名称(本例中是 child_cat)。
使用 case_when 创建多分类列
我们不必局限于单一的条件检查或布尔值。例如,如果我们想根据几个不同的阈值,将新的 child_cat 列的值设置为字符串描述(或许是为了匹配另一个数据集),该怎么办?我们可以使用 case_when 条件函数来处理这种更复杂的转换。
这里,我们将覆盖之前的数据值:
data <- data %>%
mutate(child_cat = case_when(
X_CHILDCNT <= 2 ~ "one child",
X_CHILDCNT <= 6 ~ "more than one child",
X_CHILDCNT == 9 ~ "don't know/not sure/missing"
)) %>%
head(10)
请注意,mutate 会按顺序检查这些 case_when 条件。因此,如果“小于等于2”这个条件成立,它就不会继续检查“小于等于6”的条件。
mutate 的美妙之处在于,我们可以传入任何名称,并将其设置为任何与数据框长度相同的向量,从而创建一个新列。
在 mutate 外部引用变量
然而,如果我们需要在 mutate 函数外部处理某个语句,必须确保引用的是我们的变量 data,因为 mutate 函数才是真正在数据框中创建变量的函数,并且它使得这些变量在 if_else 等代码中可用。
作为一个简单的例子,如果我们只是复制粘贴之前尝试过的 if_else 语句,它将无法工作。相反,我们需要实际引用数据框。例如,在 mutate 外部使用 if_else 来处理查询的一部分时,我们必须传入 data$ 来引用列,否则它将没有该变量的引用。
# 错误示例:直接使用列名(在mutate外部可能无效)
# if_else(X_CHILDCNT == 9, FALSE, TRUE)
# 正确示例:通过数据框引用列
data$child_cat_new <- if_else(data$X_CHILDCNT == 9, FALSE, TRUE)
head(data$child_cat_new, 10)
总结
在本节课中,我们一起学习了R语言中两个核心的数据操作工具。
首先,我们深入了解了管道操作符 %>%。它通过将左侧结果作为右侧函数的第一个参数,使得多步数据处理链变得清晰、易读,避免了复杂的嵌套括号,极大地提升了代码的可维护性。
接着,我们重点掌握了 mutate 函数。这个函数是数据转换的利器,允许我们在数据框中轻松创建或修改列。我们学习了两种常用的条件赋值方法:
- 使用
if_else()进行简单的二值(真/假)逻辑判断。 - 使用
case_when()处理更复杂的多条件分类场景。



mutate 函数非常灵活,只要最终结果的向量长度与数据框一致,我们几乎可以使用任何函数来生成新列。通过结合管道操作,我们可以构建出强大而优雅的数据处理流程,为后续的数据探索和决策支持分析奠定坚实基础。
29:dplyr公式在R中的应用 🧮

在本节课中,我们将要学习R语言中一个特殊的运算符——波浪号(~),它用于定义公式。我们将重点探讨它在dplyr包(特别是case_when函数)中的具体应用,并学习如何查阅R的帮助文档来理解其用法。
公式运算符 ~
上一节我们介绍了dplyr的基本操作,本节中我们来看看一个在数据操作中扮演重要角色的特殊符号。
波浪号(~)是R语言中的一个运算符,就像加号(+)、减号(-)或美元符号($)一样。这个运算符通常用来表示一个公式。
一般来说,波浪号会将一个公式的左侧(LHS)和右侧(RHS)分开,就像大多数其他运算符一样。然而,公式的左侧是可选的,有时你根本看不到它。
这个运算符的含义完全取决于其使用的上下文,R中的所有运算符都是如此。在不同的函数中,它的用法可能会有很大差异。因此,我们需要查看具体函数(例如case_when)的文档,来了解它期望如何处理这个公式。
查阅帮助文档
在R中,我们可以轻松地获取几乎所有函数或对象的帮助信息。
只需在函数或对象名称前加上一个问号(?),然后执行,RStudio就会在帮助面板中显示相关信息。
例如,输入 ?case_when。我们可以看到case_when来自dplyr包,被描述为一个“通用的向量化if语句”。文档会列出它接受的参数,对于case_when,它接受一系列两侧公式作为动态参数。
以下是关于case_when中公式用法的核心说明:
- 左侧决定哪些值匹配这个情况,它必须能计算为一个逻辑向量(TRUE/FALSE)。
- 右侧提供匹配后的替换值。
帮助文档通常包含许多示例,你可以直接查看并尝试运行这些例子,这对于学习非常有帮助。
case_when 函数中的公式应用
让我们具体看看公式在case_when中是如何工作的。case_when允许我们根据多个条件进行向量化的条件判断。
它的基本结构由一系列公式组成:
case_when(
条件1 ~ 结果1,
条件2 ~ 结果2,
...
TRUE ~ 默认结果
)
文档中的一个示例如下:
case_when(
x %% 3 == 0 ~ “除以3余数为0”,
x %% 3 == 1 ~ “除以3余数为1”,
TRUE ~ “其他情况”
)
在这个例子中:
- 每个
条件 ~ 结果都是一个公式。 - 最后一个公式
TRUE ~ “其他情况”是一个兜底语句。因为TRUE永远为真,所以任何不满足前面条件的情况都会返回“其他情况”。 - 兜底语句必须放在最后。如果放在前面,后面的条件将永远不会被评估。
- 如果没有提供兜底语句,并且存在未匹配的情况,结果将是
NA。
总结与过渡
本节课中我们一起学习了R语言中的公式运算符(~)及其在dplyr的case_when函数中的具体应用。
我们了解到,R中的运算符高度依赖于上下文,公式运算符也不例外。虽然在数据分析中你会大量使用传统的数学公式,但公式运算符在这里允许你描述一种关系——在本例中,是布尔掩码(条件)和输出值之间的关系。接收这个公式的函数(如case_when)会决定如何处理它。
我们还掌握了使用?快速查阅内置帮助文档的技能,这对于理解任何函数的行为都至关重要。
在我们对BRFSS数据的初步探索中,我们涵盖了很多内容。我们了解到tidyverse是一个包含许多不同包的大集合,并花了相当多的时间学习了其中dplyr包的基础知识。
具体来说,我们学会了:
- 使用
filter()函数从数据框中筛选出特定的观测行。 - 使用
select()函数从数据框中选取特定的变量列。 - 使用
mutate()函数在数据框中创建新的列。
所有这些方法都大量使用了布尔掩码来实现其功能。
我们还探索了两个新的语言基础概念:
- 管道(
|>):允许我们轻松地将多个操作链接在一起。本课程中使用的是R基础语言新增的管道符号。在浏览书籍和在线文档时,你可能会看到另一个管道符号(%>%),它来自magrittr包。在本课程的讨论中,两者基本等效,但底层实现不同。预计几年后,这种新的内置管道运算符语法将会更加普及。 - 公式运算符(
~):我们学到这个运算符高度依赖于上下文,它由三部分组成:一个可选的左侧、运算符本身以及右侧。
我们的朋友(指示例中的操作)通过在RStudio中使用?查看文档,这让我们能够探索正在尝试使用的包,并实际看到我们调用的函数将如何使用公式。



tidyverse的内容远不止这些,我们将会继续探索。不过,我们首先需要对dplyr进行更多学习,接下来我们将深入其中。
30:基于变量的分组分析

在本节课中,我们将继续使用2020年行为风险因素监测系统的数据,并学习如何基于变量对数据进行分组分析。我们将重点关注数据验证、创建分类变量以及使用group_by和summarize函数进行分组统计。


上一节我们介绍了数据处理的基础知识,本节中我们来看看如何对数据进行分组分析。
加载数据与包
首先,我们需要加载必要的R包和数据。我们使用tidyverse和foreign包来处理数据。
library(tidyverse)
library(foreign)
re.export <- read.spss("path/to/your/data.sav", to.data.frame = TRUE)

数据加载需要一些时间,因为数据集比较大。

数据验证与问题发现
我们根据已发布的代码手册,关注一个关于肺癌筛查的变量LC_FIRST,它记录了患者开始吸烟的年龄。代码手册第91页说明,该变量有四种可能的响应值:
- 一个1到100之间的数字,代表患者年龄。
- 数字777,代表“不知道”或“不确定”。
- 数字999,代表“拒绝回答”。
- 空白,代表问题未被询问或数据缺失。

让我们查看这些不同数值的频率。以下是检查不同类别观测数量的方法:
# 检查年龄在1到100之间的观测数
data %>% filter(LC_FIRST >= 1 & LC_FIRST <= 100) %>% nrow()
# 检查“不知道”(777)的观测数
data %>% filter(LC_FIRST == 777) %>% nrow()
# 检查“拒绝回答”(999)的观测数
data %>% filter(LC_FIRST == 999) %>% nrow()
# 检查缺失值(NA)的观测数
data %>% filter(is.na(LC_FIRST)) %>% nrow()

# 检查数据集总行数
nrow(data)
然而,将结果与代码手册对比时,我们发现了一个问题。代码手册显示第一类(年龄)应有13596个观测值,但我们的计数少了约400个。其他类别的计数则完全吻合。这表明数据中可能存在代码手册未提及的值。
为了找出这些不符合预期的观测值,我们编写以下代码进行筛选:

# 方法一:使用一个大的布尔掩码进行筛选
bad_data <- data %>%
filter(!(LC_FIRST >= 1 & LC_FIRST <= 100) &
!(LC_FIRST == 777) &
!(LC_FIRST == 999) &
!is.na(LC_FIRST))


# 方法二:使用管道进行迭代筛选(更易读)
bad_data <- data %>%
filter(!(LC_FIRST >= 1 & LC_FIRST <= 100)) %>%
filter(LC_FIRST != 777) %>%
filter(LC_FIRST != 999) %>%
filter(!is.na(LC_FIRST))
# 查看前20个有问题的值
bad_data$LC_FIRST %>% head(20)
运行代码后,我们发现数据中存在大量编码为888的值,而代码手册并未提及。这在实际数据分析中是一个常见问题,我们必须验证数据是否已正确清理,并与分析代码手册保持一致。
数据探索技术
为了更好地理解数据,我们可以使用一些探索技术。首先是查看列中的所有唯一值:

unique(data$LC_FIRST)
这提供了直观检查,但容易遗漏信息,且不显示数据分布。dplyr包中的summarize函数可以帮助我们进行更深入的探索,它允许我们在数据框上应用一个或多个函数。
让我们为第一组数据(年龄在1到100之间)计算一些汇总统计量:
data %>%
filter(LC_FIRST >= 1 & LC_FIRST <= 100) %>%
summarize(mean_age = mean(LC_FIRST),
sd_age = sd(LC_FIRST),
min_age = min(LC_FIRST),
max_age = max(LC_FIRST),
count = n(),
unique_vals = n_distinct(LC_FIRST))

summarize函数返回一个tibble(一种更美观的数据框)。我们可以看到,人们开始吸烟的平均年龄约为17.5岁,标准差接近5。n()和n_distinct()是dplyr函数,分别用于计算总行数和唯一值数量。
使用group_by进行分组分析
现在我们需要为每个筛选条件重复上述分析。为了避免大量重复输入,dplyr提供了group_by函数。它接收一个数据框和一组变量,返回一个分组数据框。summarize函数能感知分组,并将函数分别应用到每个组上,为每个组返回一行结果。
group_by的文档建议,在分组之前,最好先通过mutate在数据中创建一个分类变量。这是一个常见的操作模式。
让我们根据不同的类别对数据进行分组。首先,创建一个新的分类变量:
grouped_summary <- data %>%
mutate(LC_FIRST_cat = case_when(
LC_FIRST >= 1 & LC_FIRST <= 100 ~ "Age (1-100)",
LC_FIRST == 777 ~ "Don't Know/Not Sure",
LC_FIRST == 999 ~ "Refused",
is.na(LC_FIRST) ~ "Missing/Not Asked",
TRUE ~ "Other" # 捕获所有其他情况,包括代码888
)) %>%
group_by(LC_FIRST_cat) %>%
summarize(mean_val = mean(LC_FIRST, na.rm = TRUE),
sd_val = sd(LC_FIRST, na.rm = TRUE),
min_val = min(LC_FIRST, na.rm = TRUE),
max_val = max(LC_FIRST, na.rm = TRUE),
count = n(),
unique_vals = n_distinct(LC_FIRST))
执行这段代码后,我们得到一个包含五行的tibble,每一行对应一个分类。我们可以看到清晰的字符串类别,以及之前未发现的“Other”类别(包含888等值)。同时,我们也获得了每个组内的描述性统计量。

总结与策略回顾
本节课中我们一起学习了基于变量的分组分析。我们的核心策略是:
- 创建分类变量:使用
mutate和case_when根据分析需求定义分组类别。 - 分组:使用
group_by函数,指定要依据哪个(些)列进行分组。 - 汇总统计:对分组后的数据使用
summarize函数,计算各组的统计量。
这种分组汇总的结果生成了一张表格,它不仅列出了类别值,还揭示了数据中隐藏的、不符合文档记录的类别(如888),并通过描述性统计量让我们对数据有了更深入的理解。虽然对于像888这样的代码,其数值均值没有实际意义,但对于“年龄”这类连续变量,平均值(如17.5岁)则提供了有价值的信息。


通过本节课的学习,你掌握了在R中使用dplyr进行数据验证、探索和分组分析的基本流程,这是理解复杂数据集结构的关键步骤。
31:多变量分组分析方法

在本节课中,我们将学习如何使用R对数据进行多变量分组分析。我们将探讨如何基于多个分类变量对数据进行分组,并计算各组的汇总统计量。同时,我们也会了解分组操作背后的机制以及需要注意的事项。
概述
上一节我们介绍了基于单一变量的分组分析。本节中我们来看看如何基于多个变量的组合进行分组。例如,我们可以在之前查询的基础上,进一步按性别拆分数据。
多变量分组操作
以下是实现多变量分组分析的核心步骤。首先,我们需要创建或指定用于分组的分类变量。
# 创建两个分类变量并分组
data %>%
mutate(
age_cat = case_when(
AGE >= 1 & AGE <= 10 ~ "1-10岁",
AGE > 10 & AGE <= 20 ~ "11-20岁",
is.na(AGE) ~ "缺失",
TRUE ~ "其他"
),
sex_cat = case_when(
cellsex == 1 ~ "男性",
cellsex == 2 ~ "女性",
is.na(cellsex) ~ "缺失"
)
) %>%
group_by(sex_cat, age_cat) %>%
summarise(
mean_age = mean(AGE, na.rm = TRUE),
sd_age = sd(AGE, na.rm = TRUE),
count = n()
)
在上述代码中,我们使用 mutate 函数创建了两个新的分类列:age_cat(年龄分组)和 sex_cat(性别分组)。随后,group_by(sex_cat, age_cat) 指定了按这两个变量进行分组。传递给 group_by 的变量顺序会影响结果表格的显示结构,您可以尝试调换顺序以观察差异。
理解分组结果

执行上述代码后,R会返回一个分组汇总表。理解这个表格的格式非常重要。
- 表格底部会显示总行数。
- 表格会分页显示数据(例如每页10行)。
- 每列标题旁会注明其数据类型(如字符向量、双精度向量、整数向量)。
- 数据首先按
sex_cat(如“女性”、“男性”)分组,然后在每个性别组内,再按age_cat(如“1-10岁”、“未知”、“缺失”)进行细分。 - 通过观察各组的均值(
mean_age)和标准差(sd_age),我们可以比较不同性别和年龄组合的吸烟起始年龄是否存在差异。
这是一种深入了解数据、开启数据分析的绝佳方式。
分组机制与注意事项
group_by 函数的工作原理是分析数据框,并通过添加分组元数据来丰富它。这意味着,在管道操作符 %>% 之后使用的函数(如 summarise)需要知晓这些元数据才能正确工作。

这种方法也带来了一些限制和影响:
- 与非Tidyverse包的兼容性:
group_by可能不太适用于tidyverse生态系统之外的函数包。 - 分组状态的持久性:分组操作会改变数据框的元数据。如果您计划对同一分组进行多次不同的分析,这很有用。但若想恢复未分组的状态,则需要手动取消分组。
以下是一个演示分组元数据及取消分组的例子:
# 对数据进行分组并查看其属性
grouped_data <- data %>%
mutate(sex_cat = ifelse(cellsex == 1, "男性", "女性")) %>%
group_by(sex_cat)

# 查看分组后数据框的属性(包含分组信息)
attributes(grouped_data)
# 取消分组以恢复原始状态
ungrouped_data <- grouped_data %>%
ungroup()
使用 attributes() 函数可以查看数据框的属性,其中包含了分组信息。当您不再需要分组,或者需要将数据传递给不识别分组的函数时,使用 ungroup() 函数清除元数据是关键步骤。
请注意:如果您不是通过管道连续进行分析,而是将分组结果赋值给新变量(如本例中的 grouped_data),则需要格外小心后续操作中的数据状态。
总结
本节课中我们一起学习了如何对数据进行多变量分组分析。其通用模板是:决定分组依据 -> 在数据集中识别或创建一个或多个分组变量 -> 使用 summarise 等函数应用统计功能以生成报告。
我们还见识了R的一些强大新特性,包括管道操作符 %>% 和 tidyverse 中的函数,它们协同工作,使得数据清洗和分析既快速又易于阅读。


最后,反思我们在使用代码簿进行数据探索时遇到的问题也很有价值。拥有清晰的代码簿实际上是一种奢侈,现实中很多数据远不如本数据集这样清晰。或许,将杂乱数据整理成整洁形式,并为他人生成这样的代码簿,正是您未来工作的一部分。
32:关于比率的补充说明 📊


在本节课中,我们将深入探讨数据分析中一个至关重要的概念——比率。我们将学习比率的定义、计算方法、常见应用场景,以及一个容易被忽视但极其重要的步骤:年龄调整。理解这些内容将帮助你避免在数据解读和政策建议中得出误导性的结论。
比率的重要性
在之前的课程中,我们讨论了调查数据和人口数据中的各种比率。当比较不同地理区域、不同亚人群或不同时期的数据差异时,比较比率而非原始数字至关重要。因为人口数量会变化,这自然会影响事件或现象发生的数量。因此,在进行数据分析时,我们必须考虑比率。
什么是比率?
一个比率总是包含一个分子和一个分母。它表示分子中某事件的发生情况相对于分母中明确人口数量的比例。
公式:比率 = (分子事件数 / 分母人口数) * 乘数
例如,失业率的计算公式为:
公式:失业率 = (失业人口数 / 劳动力人口数) * 100
这里的劳动力被定义为16岁及以上且积极寻找工作的人。计算结果乘以100,因此失业率实际上是一个百分比。例如,西班牙当前的失业率为15.3%,这意味着15.3%的可用劳动力正在寻找工作但没有工作。
比率的表示与乘数
政府关心的许多事件相对罕见,因此用百分比来分析会给解读带来挑战,因为你会看到低于1%或2%的百分比,难以解释和比较。
因此,一些比率会将计算出的百分比乘以1000、10,000甚至100,000,以获得一个更易于解读的数字,而不是一个非常小的百分比。
以下是两个关键例子:
- 婴儿死亡率:计算公式为
(一岁前死亡婴儿数 / 活产婴儿数) * 1,000。这最终得出每1000名活产婴儿中的婴儿死亡数。婴儿死亡率为5.5意味着每1000名活产婴儿中,有5.5名在满一岁前死亡。 - COVID-19病例与死亡率:通常计算公式为
(病例数或死亡数 / 人口数) * 100,000。例如,秘鲁的COVID死亡率是世界最高的,估计为每10万人中647人死亡。
比率的比较与年龄调整
上一节我们介绍了比率的基本计算,本节中我们来看看在比较不同群体的比率时一个常见的陷阱。
直接比较不同国家或群体的比率可能并不公平。例如,比较挪威(死亡率60/10万)和意大利(死亡率278/10万)的COVID死亡率是否公平?人口学家、流行病学家和为政府创建比率的数据分析师需要考虑:人口年龄分布对我们所测量指标的影响是什么?
在比较包括COVID在内的不同死因的死亡率时,确实需要考虑人口年龄分布。
一个案例分析:《纽约时报》专栏作家David Leonard曾撰文指出,在美国COVID大流行的第二年,“COVID的种族差距已经缩小甚至逆转”,白人的死亡率高于黑人和拉丁裔。然而,流行病学家和人口统计学家立即尖锐地批评了他的分析和结论。
原因在于,美国不同种族和族裔亚人群的年龄分布差异巨大,而年龄与感染和死于COVID的风险密切相关。如果不针对这些年龄差异进行调整,就无法公平地比较不同种族或族裔的COVID比率。
例如,美国的黑人和西班牙裔人口相对更年轻,平均年龄更低。因此,平均每10万白人中有更多COVID死亡并不奇怪,因为这10万人平均年龄更大。这里的核心观点是:对比率进行年龄调整通常非常重要。
什么是年龄调整?
你可能会想,什么是年龄调整?年龄调整(或称年龄标准化)是一个应用于疾病、死亡、伤害以及其他许多结果的比率的统计过程。它允许比较具有不同年龄结构的人口和社区。
我们今天不深入探讨如何进行年龄调整的技术细节(存在几种不同的方法)。今天的要点是让你意识到:如果你正在创建用于比较亚人群、不同地理区域或时间段的比率或数据可视化,而这些比较对象在年龄分布上存在差异,你就需要建议对这些比率进行年龄调整,以使它们具有可比性。
前述案例中的专栏作家错误地解读了COVID比率,也得出了关于美国COVID死亡率种族差异正在缩小和解决的错误结论。不知道如何正确地创建和解释比率,不仅会导致错误和误导性的结论,更重要的是,它还可能导致政策变化、资源重新分配,并将一个仍然重要的问题宣告为已解决。
因此,请记住,为了避免参与产生误导性的结果,某些比率需要进行年龄调整或年龄标准化。
总结


本节课中我们一起学习了比率的定义、计算及其在公共部门数据分析中的核心作用。我们明确了比较比率而非原始计数的重要性,探讨了使用不同乘数(如每千人、每十万人)的原因,并重点强调了在比较不同人口结构群体时进行年龄调整的必要性。正确理解和应用比率是做出准确数据解读和有效政策建议的基础。
33:人口数据分析重要性:三大人口过程解析 📊


在本节课中,我们将探讨人口数据分析对于公共部门所有核心职能的重要性。我们将聚焦于决定人口动态的三大关键人口过程——生育、死亡与迁移,并介绍一些关键的人口数据来源。人口数据是公共行政决策的基石,理解这些过程对于有效的规划、资源配置和政策制定至关重要。

人口数据对公共行政核心职能的重要性
上一节我们介绍了公共行政的核心职能模型。本节中我们来看看人口数据如何为这些职能提供关键信息。
人口数据对于公共行政及其所有七项核心职能都极为重要。这些职能在我们的模型图中按顺时针方向依次是:规划、组织、人事、指挥、协调、报告和预算。对于所有这些职能,关于人口的关键问题包括:
- 当前辖区内有多少人?
- 短期和长期的未来人口数量是多少?未来的人口结构如何?
- 人口有哪些人口学特征?年龄分布是怎样的?
- 人们具体居住在哪里?
- 有多少人有资格享受不同类型的公共服务和项目?
以下是人口数据支持各项核心职能的具体示例:
- 规划职能:教育系统根据年龄分布和人口预测来规划未来的学校招生。
- 人事职能:人口统计数据有助于理解劳动力动态,包括因退休造成的人员更替。
- 报告职能:人口数据被用作许多社会和经济指标(以比率或百分比形式呈现)的分母。这包括出生率、死亡率、失业率、选民登记率、犯罪率等。任何重要的比率都包含分子和分母,而分母通常由人口数据和分析提供。
- 政府预算职能:人口数据对于预测政府来自税收和费用的收入至关重要。
关键人口统计指标示例
理解了人口数据的广泛用途后,我们来看两个在全球范围内被广泛使用的具体人口统计指标。

总抚养比

一个对所有政府职能都非常重要的人口统计指标是总抚养比。这是一个粗略但非常有用的估计值,用于衡量人口中不工作、因而依赖劳动人口收入、税收和养老金缴款的人数比例。

其公式非常简单:

总抚养比 = (0-14岁人口数 + 65岁及以上人口数) / (15-64岁人口数)
这个比率可以解释为:在人口中,每有一个工作年龄人口,需要抚养的依赖人口数量。
较高的比率会引起政府关注,因为这意味著更少的人需要为更多依赖人口提供收入支持,并向社会保险、养老金体系、医疗保险体系等做出必要贡献。

以下是部分国家的总抚养比数据。可以看到,日本和尼日利亚的抚养比都相对较高,但原因截然不同:
- 日本:抚养比高是因为人口老龄化,生育率低且持续下降,同时人均预期寿命长。
- 尼日利亚:抚养比高是因为生育率非常高,导致年轻人口比例大,同时死亡率较高,人均预期寿命相对较短。
仅看总抚养比无法完全了解一个国家的情况及其成因,但它仍然是一个有用的指标,常被用于跨国比较。

婴儿死亡率
另一个全球通用的、衡量人口健康的关键指标是婴儿死亡率。婴儿死亡率衡量的是活产婴儿在一周岁前的死亡情况。
其计算公式为:
婴儿死亡率 = (一岁内死亡婴儿数 / 活产婴儿总数) × 1000
可以将其解释为:每1000名活产婴儿中,在一岁前死亡的婴儿数量(这不是一个百分比)。

2020年,世界平均婴儿死亡率估计为22.5,这意味着全球每1000名活产婴儿中,约有22名在满周岁前不幸死亡。不同国家之间差异巨大,有些国家的婴儿死亡率远高于此,而有些国家则低于5。
然而,全国性的婴儿死亡率数据掩盖了人口内部不同亚群体之间显著且令人担忧的差异。因此,政府不仅关注总体婴儿死亡率,更关注按地理或社会人口学特征划分的不同群体和亚人口中的具体比率。
以美国为例,不同种族和族裔群体间的婴儿死亡率差异和不平等是一个长期存在的严重问题。如下图所示,亚裔母亲的婴儿死亡率为3.6,而非西班牙裔黑人母亲的婴儿死亡率几乎高出三倍,达到10.8。尽管过去几十年美国所有种族和族裔的婴儿死亡率都已显著下降,但这些群体之间的差距实际上却扩大了。

这类针对特定年份、亚群体和长期趋势的统计数据对政府极其重要,因为它是衡量妇女和婴儿整体健康状况的一个非常强有力的指标。

决定人口动态的三大关键过程

既然我们已经明确了人口层面的数据对公共行政的所有核心职能都非常重要,现在让我们转向解析决定人口动态的关键人口过程,即人口如何增长、减少和随时间变化。

像我这样的人口学家主要关注三个基本的人口过程:

- 生育(出生):人口如何进入一个群体。
- 死亡:人口如何离开一个群体。
- 迁移:人口如何进入、离开一个群体,并在群体内部移动。
政府需要关于所有这些人口过程的全面而准确的信息,以便:
- 理解人口规模和动态变化。
- 获得计算比率、百分比以及其他重要指标(如劳动参与率、失业率、出生率、死亡率、预期寿命等)所必需的数据。
- 因为这些过程本身对公共部门就具有重要意义。
总结


本节课中,我们一起学习了人口数据分析在公共部门中的核心地位。我们了解到人口数据是支撑规划、组织、人事、预算等所有公共行政职能的基础。通过分析总抚养比和婴儿死亡率等关键指标,政府能够洞察社会结构、健康水平和经济负担等重要信息。最后,我们解析了决定任何人口变化的三大根本过程:生育、死亡与迁移。掌握这些过程的数据和分析方法,是进行有效公共决策和制定前瞻性政策的关键。
34:核心人口数据来源解析 📊

在本节课中,我们将要学习公共部门获取关键人口数据的主要来源。了解这些数据如何产生、收集和管理,是进行有效人口数据分析的基础。

我们已经讨论了公共部门需要关于生育、死亡、迁移等关键人口过程以及人口数量和指标的稳健数据。那么,政府从何处获取所有这些重要的人口数据呢?
人口普查 📋
首先,人口数据的一个重要来源是人口普查。
人口普查是对一个地区(无论大小)的人口规模、构成和特征进行的精确而全面的统计。几乎所有国家都每10年进行一次人口普查。有些国家实际上每5年进行一次,例如加拿大、日本、爱尔兰、新西兰和澳大利亚。联合国为人口普查推荐了一系列标准程序,这有助于进行跨国比较。如果你想了解更多关于本国人口普查方法以及跨国比较的信息,可以从联合国获取大量优质资料。
生命登记数据 📝



人口数据分析的另一个关键信息来源是生命登记数据。

大多数国家都拥有所谓的生命登记系统。这意味着通过标准化表格登记出生和死亡,收集信息,这些表格通常被称为出生证明和死亡证明。这些证明在出生和死亡发生地填写,然后提交给政府进行记录保存,并输入大型数据系统。一些国家还有民事登记系统,用于跟踪婚姻、离婚和收养等信息。生命登记系统及其产生的数据对于公共行政的所有核心职能都至关重要。

然而,必须指出,这些系统的设计和启动成本极高,并且长期维护也非常昂贵。事实上,许多中低收入国家的系统在覆盖面和数据质量方面存在严重缺陷。
迁移数据 🧳

接下来我们看看迁移数据。政府如何获取关于人口流动和进出境的所有信息呢?
对于政府来说,追踪迁移情况确实非常困难。一些有助于公共部门完成这项重要任务的数据系统包括:
以下是几种关键的迁移数据来源:
- 移民数据系统:这包括所有签证申请、签发和停留时间数据的系统。
- 外国劳工证书数据:一些国家拥有此类数据。
- 难民处理数据。
- 人口普查:人口普查也能为我们提供迁移信息。大多数国家的普查问卷中都包含收集个人是否在国外出生、在所在国时间等信息的问题。这些信息有多种用途,包括掌握一个国家内部的迁移流动情况。
- 邮政服务数据:具体来说,地址变更数据确实有助于政府更好地了解一个国家内部的迁移情况。


在本节课中,我们一起学习了公共部门获取核心人口数据的三大主要来源:人口普查、生命登记系统和迁移相关数据系统。理解这些数据的来源、优势和局限性,是进行可靠公共部门数据分析的第一步。
35:基础人口问题分析方法 📊


在本节课中,我们将要学习如何分析人口数据,特别是如何理解人口的年龄与性别分布。我们将介绍人口金字塔这一核心可视化工具,并探讨其如何揭示出生、死亡和迁移等关键人口动态。

概述人口分析的重要性
一个基础且重要的问题是:如何了解人口的年龄和性别分布?这对所有政府而言都是一个至关重要的问题。

理解人口金字塔 📐
上一节我们介绍了人口分析的重要性,本节中我们来看看如何具体呈现人口结构。这个问题通常通过一种名为“人口金字塔”的图表来解答和可视化。
人口金字塔简单地展示了按性别(男性与女性)和细分的年龄组划分的人口数量。下图展示了2021年世界人口的金字塔。



该图表明,目前地球上儿童和年轻人的数量远多于老年人。世界人口总体上相对年轻。只要各年龄组的出生率和死亡率保持不变,这种底部宽大的金字塔形状就会持续。
然而,如果出生率下降,金字塔的底部就会变小。几乎所有国家的人口金字塔形状都会随时间而变化。
人口动态与形状演变
人口动态之所以称为“动态”,是因为情况并非一成不变。下图展示了日本自20世纪60年代以来人口金字塔发生的巨大变化。


它从典型的金字塔形状,演变为2010年截然不同的形状,显示出出生率下降、人口老龄化以及某些婴儿潮世代的存在。图中还展示了日本到2060年的人口预测,呈现出另一种不同的形状,即所谓的“倒金字塔”形状。
这种形状是出生率长期下降,同时死亡率保持低位或下降的结果。其特点是老年人口更多,而金字塔底部的年轻人口更少。
案例分析:沙特阿拉伯的人口金字塔
以下是另一个例子,2021年沙特阿拉伯的人口金字塔。

关于这个金字塔的形状,你注意到什么有趣之处了吗?希望你能看到两点。

第一点是男女性别之间的明显差异,在20至65岁年龄段,男性人口相对更多。原因是什么?如果你认为这可能是由于其他国家男性移民到沙特阿拉伯工作所致,那么你的判断是正确的。因此,我们再次看到,移民对人口内部的年龄和性别分布可以产生重要影响。
你可能会注意到的第二点是,沙特阿拉伯出现过几次婴儿潮,即金字塔中某些年龄组的人口数量比其前后的年龄组都要多。当条形图比前后组更突出时,那就是一次婴儿潮。
政府需要真正理解婴儿潮及其发生时间,因为随着人口老龄化,这对于规划政府社会服务项目、社会保险项目、退休福利支付等都至关重要。
结合地图进行人口分析


再来看一张图表,这是欧盟国家及其主要地区的老龄人口抚养比可视化地图。

这与之前讨论的总抚养比略有不同,因为它只考虑老年人口对劳动年龄人口的依赖。你可以看到,老龄人口抚养比较低的地区用蓝色表示,而抚养比较高的地区用橙色和红色表示。

不要求你消化和理解这张地图中的所有信息,但重要的是,将人口数据与地图相结合,也是理解人口动态的有力工具。
关于人口数据的重要注意事项
以下是关于人口数据的几点重要评论,需要你记住。

首先,公共部门的数据分析师分析人口数据是为了服务于所有核心职能,这既帮助政府自身,同时分析师们也需要为公众发布、报告以及通过交互式网站和数据库来清理、组织和管理这些数据。因为公众,以及各行各业,都对政府发布的人口数据感兴趣。这些报告被私营部门、学术研究人员、非营利组织、倡导联盟等广泛使用。
其次,数据从收集到公开可用之间通常存在一到三年的滞后。数据需要被清理,需要确保从出生记录、死亡记录和人口普查信息等中剥离任何识别信息,并且完成这些工作并以使其他利益相关者能够高效理解、清晰沟通和呈现的方式也需要时间。

最后,在我们讨论的各类人口数据中,确实存在许多数据质量、覆盖范围和完整性问题,这在每个国家都存在,但显然对于资源较少的国家来说,这个问题尤为突出。
总结
本节课中我们一起学习了人口数据分析的基础知识。让我们快速回顾一下本节关于人口数据分析所涵盖的内容。
人口数据对于分析和公共行政的所有核心职能都至关重要,这类数据几乎是计算重要公共措施和指标比率及百分比的最重要组成部分。

此外,复杂的数据系统对于公共部门理解关键的人口过程(出生、死亡和迁移)是必要的,这对于理解人口动态至关重要。数据系统必不可少,这包括生命登记数据、人口普查数据以及来自多个数据系统的迁移数据。



我们很快将深入探讨更多人口数据分析重要性的例子,以及如何进行一些数据分析。
36:定制化分析模型构建 🛠️

在本节课中,我们将学习如何利用真实的人口普查数据,构建一个定制化的分析模型。具体来说,我们将计算总抚养比。我们将使用美国社区调查的原始数据,并在此过程中学习如何处理大型数据集、解决数据导入中的常见问题,以及运用R语言进行高效计算。
概述与数据介绍
在之前的课程中,我们学习了几种常见的人口统计指标,社会科学家和公共数据分析师使用这些指标来为公共政策提供信息。本节课程将在此基础上,探讨如何将这些指标应用于原始数据。
本节课将使用2019年美国社区调查公共使用微观数据样本。这是一项针对美国家庭和社区的横断面调查,以原始微观数据格式提供。它代表了超过300万个美国家庭的五年期样本,涵盖了人口、经济、社会、住房等多个维度,用于在十年一次的人口普查之间收集高质量的人口数据。
美国人口普查局将这些ACS家庭调查数据公开,供公众使用和分析。这几乎是公共数据集中最接近原始数据的形式,也是像Lance博士这样的研究者在政策研究工作中使用的数据类型。
PUMS数据规模庞大,不仅包含近300个变量,其数据采集、记录和加权的流程也非常复杂,测量的变量涵盖了广泛的社会背景。PUMS数据用于支持政府内部超过300个联邦指标,并为每年近7000亿美元的公共支出提供依据。
虽然无法在一节课中全面介绍PUMS,但美国人口普查局提供了一系列出色的开放资源,帮助联邦政府内外的数据分析师。这些资源包括示例、教程、录制的网络研讨会和演示文稿,强烈建议查阅,课程资料中已附上普查学院网站的链接。
本节课的目标是展示如何利用这类人口普查数据,创建像总抚养比这样的定制化分析。当然,在这个过程中,我们也会学习更多关于R和tidyverse的知识。
第一步:导入数据与Tidyverse

首先,我们需要加载Tidyverse库。由于我们使用的是人口普查局提供的CSV文件,无需额外安装包,可以直接使用Tidyverse中的read_csv函数进行导入。

library(tidyverse)
处理大型数据文件
这些数据文件在技术层面上也非常庞大。因此,它们被分成了两个文件,每个都超过1GB大小。为了获得一个完整的数据框进行处理,我们需要将这两个文件拼接起来。

然而,2GB的数据对于大多数分析需求来说有些过大,而且我们并不需要全部300个变量。因此,明智的做法是只导入我们需要的变量。我们将向read_csv函数传递一些参数来实现这一点。
read_csv函数接受许多不同的参数,你可以在控制台使用?read_csv来查看。这里,我将使用col_select参数来仅提取我们需要的几列:年龄和州代码。
# 假设文件路径为 file1.csv 和 file2.csv
# 仅导入 AGEP (年龄) 和 ST (州代码) 列
data_part1 <- read_csv("file1.csv", col_select = c(AGEP, ST))
data_part2 <- read_csv("file2.csv", col_select = c(AGEP, ST))
即使只提取这两列,这个过程也需要一些时间,因为read_csv需要读取整个文件来生成数据框。导入后,我们看到每个数据框大约有150万行和两列。
接下来,我们需要将这两个数据框拼接起来。可以使用dplyr包中的bind_rows函数。
data <- bind_rows(data_part1, data_part2)
解决数据类型冲突
执行上述代码时,可能会遇到一个错误:州代码变量ST无法合并,因为它在第一个数据框中是字符类型,在第二个数据框中是数值类型。
这是一个常见问题,通常是由于数值使用了前导零填充,以确保数据文件中每列字符数一致。例如,字符“01”和“52”长度相同。这样做主要是历史原因,便于按固定位置读取数据,而不是像CSV那样依赖规则解析。

实际上,CSV在数据科学工作流中常带来困扰,因为它缺乏一致性和模式定义。如今,大多数数据存储在关系数据库中,但CSV仍被广泛用作数据交换格式。
有一些有趣的项目试图解决这个问题,例如由R语言的Hadley Wickham和Python的Wes McKinney共同开发的Feather格式,现由Apache基金会主导。不过,我们目前仍处于CSV的世界,因此需要处理这个问题。
我们需要决定将数据表示为数值还是字符串。根据代码簿,它们应该是字符串。那么,如何实现呢?最简单的方法是回到read_csv的文档。你会发现一个名为col_types的参数,我们可以设置它,让read_csv在读取字符时按照我们想要的类型进行设置。
# 重新导入,指定两列均为字符类型
data_part1 <- read_csv("file1.csv",
col_select = c(AGEP, ST),
col_types = cols(AGEP = "c", ST = "c"))
data_part2 <- read_csv("file2.csv",
col_select = c(AGEP, ST),
col_types = cols(AGEP = "c", ST = "c"))
# 再次拼接
data <- bind_rows(data_part1, data_part2)
现在,在环境面板中可以看到,我们拥有了一个包含约300万行观测值和两个变量的巨型数据框。这说明了理解我们在课程最初几讲中讨论的数据类型基础是多么有用。虽然我们可以在不了解R语言内部机制的情况下走得很远,但有时理解这些机制对于调试遇到的问题至关重要。

计算总抚养比
现在我们有了一个统一的数据框,可以开始计算总抚养比。我们采用Lance博士在讲座中分享的公式。
我们将年龄小于等于14岁和大于等于65岁的人口数量相加,这部分人被视为被抚养人口,因为他们预计不参与工作。然后,将这个总和除以预计在工作年龄内的总人口数。
在Markdown中,我们可以将其写成一个公式,以便在编织文档时美观地显示。例如:
总抚养比公式:
其中,\(N_{dep}\) 是被抚养人口数,\(N_{work}\) 是工作年龄人口数,\(N_{total}\) 是总人口数。注意,分母被重写为总人口减去被抚养人口,这在公式中比直接定义工作人数更容易,但数值是相同的。
现在,让我们将这个公式应用到数据中。
首先,使用mutate函数创建一个新列,标识一个人是否属于被抚养人口。
data <- data %>%
mutate(dependent = case_when(
AGEP <= 14 | AGEP >= 65 ~ TRUE,
AGEP > 14 & AGEP < 65 ~ FALSE
))

接着,我们可以计算被抚养人口和工作年龄人口的数量,然后计算比率。
# 方法一:分步计算
n_dep <- data %>%
filter(dependent == TRUE) %>%
nrow()

n_total <- nrow(data)
n_work <- n_total - n_dep
tdr <- n_dep / n_work
tdr
使用这个数据集,我们得到的总抚养比约为 0.47。
更高效的计算方法

实际上,我们可以写得更简洁,无需使用nrow。在R语言中,逻辑值TRUE和FALSE在底层被表示为1和0。这种编码方式历史悠久,允许布尔值以单个比特存储,效率极高。这意味着在R中,你可以像操作整数值一样操作TRUE和FALSE值,这使得计数变得非常容易。
我们可以在单行代码中完成计算,无需创建任何中间变量。
# 方法二:利用逻辑值求和
tdr_succinct <- sum(data$dependent) / sum(!data$dependent)
tdr_succinct
这段代码直接提取dependent列,对TRUE值(被抚养人口)求和,对FALSE值(取反后为工作人口)求和,然后相除。所有TRUE计为1,FALSE计为0,非常简洁高效。
总结

在本节课中,我们一起学习了如何利用真实的美国社区调查数据构建定制化分析模型。我们完成了以下关键步骤:

- 导入与准备数据:使用
read_csv函数并指定col_types参数,解决了大型CSV文件导入时的数据类型冲突问题。 - 数据整合:使用
bind_rows函数合并了多个数据文件。 - 创建分析指标:使用
mutate和case_when函数,根据年龄条件创建了标识被抚养人口的新变量。 - 计算总抚养比:运用两种方法(分步计算和利用逻辑值求和)计算了总抚养比,并理解了R中逻辑值可视为数值进行运算的特性。


虽然过程中涉及了不少R语言知识,但至此,相信你已经掌握了从数据中提取信息并开始进行自主分析所需的工具。恭喜你创建了第一个基于真实数据集的定制化统计量!
37:分组应用定制化分析 📊

在本节课中,我们将学习如何对数据进行分组,并应用定制化的分析。我们将以计算美国各州的“总抚养比”为例,深入探索数据中的模式。
概述
上一节我们介绍了数据聚合的基本概念。本节中,我们将进一步深化,学习如何按特定类别(如州)对数据进行分组,并计算每个组的汇总统计量。我们将使用 group_by() 和 summarize() 函数来实现这一目标。
按州分组计算总抚养比

我们有一个包含各州人口数据的数据集。一个有趣的问题是:哪些州的总抚养比最高或最低?这个比率可能对就业刺激资金或医疗教育支出有重要影响。各州的比率是相近的,还是存在显著差异?
我们已经掌握了完成这项工作的部分工具。我们知道可以使用 group_by() 创建数据组,并使用 summarize() 函数在这些组上运行聚合统计。我们的分析需要一个用于分组的类别值,而数据中恰好有州标识符 ST。
以下是实现步骤:
- 首先,将数据按
ST(州)进行分组。 - 然后,使用
summarize()创建两个新变量:一个是公式的分子(依赖人口dependence),另一个是分母(适龄工作人口working)。 - 接着,使用
mutate()创建一个新列TDR,其值为依赖人口除以适龄工作人口。
让我们尝试一下。代码如下:
# 按州分组并计算总抚养比
state_tdr <- your_data %>%
group_by(ST) %>%
summarize(
dependence = sum(dependence),
working = sum(working)
) %>%
mutate(TDR = dependence / working)
运行代码后,我们就计算出了每个州的总抚养比。
对结果进行排序
现在我们可以使用 arrange() 函数对数据进行排序,只需指定要排序的变量即可。在本例中,我们希望按 TDR 降序排列,以找出适龄工作人口比例最低的州。
以下是排序的代码:
# 按总抚养比降序排列
state_tdr_sorted <- state_tdr %>%
arrange(desc(TDR))
查看排序后的数据,根据代码本可知,排名第一的州是缅因州(州编号23)。其总抚养比为0.56,这意味着与依赖人口相比,其工作人口较少。排名第二和第三的分别是佛罗里达州和蒙大拿州。有趣的是,各州之间的比率存在差异,有些州甚至低至0.28,表明那里工作人口众多,而儿童和老年人相对较少。

优化分析流程
虽然上述方法可行,但创建中间数据框再进行操作并非最理想的方式。我们完全可以在一个语句中完成分组、计算和排序。

让我们优化一下代码。我们将数据直接传入 group_by(),然后在 summarize() 中直接计算 TDR,最后用 arrange() 排序。
优化后的代码如下:
# 优化:一步完成分组、计算和排序
final_result <- your_data %>%
group_by(ST) %>%
summarize(TDR = sum(dependence) / sum(working)) %>%
arrange(desc(TDR))

这样更好,代码简洁、易读,并且在我们理清所有逻辑后,操作过程一目了然。
总结
本节课中,我们一起学习了如何利用真实数据构建第一个定制化分析。我们将对总抚养比的理解付诸实践,并识别出了总抚养比水平最高的三个美国州。
此外,我们还获得了处理大型数据文件(如PUMS数据集)的解决方案经验,并提升了使用 read.csv() 及从错误中恢复的能力。
我们学习了 tidyverse 中的一个新函数 arrange(),它让我们能够对数据框进行排序,以便输出美观的结果。
在此过程中,我们还接触了 LaTeX,这是一种在 Markdown 文档中编写公式的方法。它允许我们在分析笔记本中嵌入人类可读的数学方程,与我们的分析代码和输出相辅相成。例如,总抚养比(TDR)的公式可以表示为:



TDR = (依赖人口) / (适龄工作人口)
38:函数编写技术 🛠️

在本节课中,我们将学习如何在R中编写自定义函数。我们将以分析人口普查数据中的“抚养比”为例,探讨如何创建灵活、可复用的函数来支持数据分析工作。
概述 📋
过去几周我们已经使用了大量不同的函数。现在,随着我们开始编写自己的分析代码,是时候学习如何编写自定义函数了。我们将利用PUMS数据作为示例,因为“抚养比”存在多种定义,每种都对应特定的研究问题或主题。美国人口普查局的Fylen Kainsky提出了多种有趣的计算抚养比的方法,以反映现代社会中可能存在的潜在社会差异。例如,在美国,将15至17岁的人视为劳动者而非被抚养者是否合适?或者,在大学城(如我所在的安娜堡)中,将大学生计入就业适龄人口是否会夸大社区的劳动力容量?我们将通过解决这个问题来学习如何在R中编写自定义函数。
什么是R函数? 🤔
在R中,函数使用 function() 调用来创建。与许多其他语言不同,我们在定义函数时并不直接命名它,而是将函数绑定到一个变量,该变量随后就成为函数的名称。

让我们创建第一个函数。我们将使用 function() 函数,并将结果赋值给一个变量。我们所有的函数代码都将放在花括号 {} 之间。
custom_function <- function() {
# 函数体目前是空的
}
运行上述代码后,虽然我们创建的函数目前不执行任何操作,但你会注意到在环境面板中出现了一个新的函数对象。点击它可以查看函数的详细信息。
函数的三个核心组成部分 🧩

在高层面上,R函数有三个需要考虑的部分:
- 参数和返回值:我们称之为“形式参数”。
- 分析代码:我们称之为“函数体”。
- 执行上下文:我们称之为“环境”。
我们已经见过很多关于第一部分的例子。例如,sum() 函数接收一个列表或数据框并返回一个数字;filter() 函数接收一个数据框和任意数量的布尔掩码,并返回另一个数据框。我们也知道,函数的代码主体写在花括号 {} 之间。

然而,最后一项——函数运行的环境——则不那么清晰。到目前为止,我们的环境一直是RStudio右上角的面板,它列出了我们的数据、值和函数。那么,环境具体指什么?为什么它很重要?
理解函数环境 🌍
当你像我们刚才那样定义一个函数时,它会被绑定到你定义它时所在的环境。这意味着该函数可以访问该环境中的所有数据、值和其他函数。我们可以使用 environment() 函数来检查绑定到某个函数的环境名称。
environment(custom_function)
运行后,我们可以看到这个函数绑定到了“R_GlobalEnv”,也就是过去几周我们创建数据框的环境。实际上,我们可以通过环境面板的下拉菜单浏览不同的环境。例如,“stats”、“graphics”、“utils”等都是基础R包引入的环境。进入这些环境,我们可以看到里面定义的值、函数和数据。这为我们提供了一个强大的学习工具。
函数与数据的交互 📊
由于我们的函数绑定到一个环境,它们可以轻松访问该环境中的数据结构。在我们的例子中,我们已经导入了数据,因此可以重新定义我们的自定义函数来使用这些数据。
首先,让我们导入tidyverse包和PUMS数据。

library(tidyverse)
data <- bind_rows(read_csv("pums_data_2019.csv"), read_csv("pums_data_2020.csv"))
现在,让我们重写 custom_function,使其使用全局环境中的 data 数据框。
custom_function <- function() {
length <- nrow(data)
width <- ncol(data)
}
定义函数后,它还没有运行。R实际上尚未执行该函数,因此也没有调用 nrow() 或 ncol() 或尝试访问 data。要执行函数,我们需要在变量名后加上括号来调用它。
custom_function()
调用后,结果似乎并不起眼。特别是,我们在全局环境中并没有看到创建的新变量 length 和 width,这可能与你的预期不符。这是有意设计的,称为封装或作用域。其理念是:在函数内部创建的任何东西都保留在函数内部。最常见的解决方法是显式地让函数返回你感兴趣的值。

函数的返回值 🔄
让我们修改函数,使其返回我们计算的长度和宽度值。
custom_function <- function() {
length <- nrow(data)
width <- ncol(data)
return(c(length, width))
}

# 调用函数
custom_function()

现在,函数返回了一个包含行数和列数的向量。这个数字看起来是正确的:大约320万行和2列。
函数参数(又称实参) 🎯

有时,你可能希望将函数定义在单独的文件中,以便将其包含在其他库中(就像tidyverse所做的那样)。这允许你在项目之间或与他人共享函数。然而,当我们这样做时,就不再绑定到全局命名空间,我们将失去对 data 的访问权限。而且,坦率地说,我们通常希望数据本身是可以变化的。例如,我们可能希望使用同一个函数来分析2020年的PUMS数据。

因此,我们不应该假设存在一个名为 data 的数据框,而应该将其定义为一个需要传递的参数。
custom_function <- function(df) {
length <- nrow(df)
width <- ncol(df)
return(c(length, width))
}

在上面的代码中,我们定义了一个参数 df。在函数内部,我们将使用这个参数名来引用传入的数据框。现在,让我们尝试调用它。
# 错误的调用方式:未传递参数
custom_function()
# 这会引发错误,因为参数 `df` 没有被传入。
# 正确的调用方式:传入数据框
custom_function(df = data)

现在,函数可以正确运行并返回结果了。当我们调用函数时,可以传入任何我们想要的数据框;在函数内部,它将被称为 df 并使用它。
应用函数进行数据分析 📈

我认为我们已经掌握了如何编写自定义函数的工作知识。现在,让我们开始将其应用于数据分析。我们可以创建更复杂的函数来计算不同定义的抚养比,处理数据筛选、分组和汇总等任务。通过将分析步骤封装在函数中,代码将变得更清晰、更易于维护和复用。
例如,我们可以开始设计一个函数,根据不同的年龄组定义来计算抚养比,并允许用户指定使用哪个数据框以及哪些年龄阈值作为参数。

总结 ✨



本节课中,我们一起学习了如何在R中编写自定义函数。我们从创建一个简单的空函数开始,逐步理解了函数的三个核心部分:参数、函数体和环境。我们探讨了函数如何访问其定义环境中的数据,以及封装原则如何确保函数内部变量不影响全局空间。接着,我们学习了如何让函数通过 return() 语句返回值,以及如何定义和使用函数参数来使函数更加灵活和通用。最后,我们认识到,掌握函数编写技能是进行复杂、可复用数据分析的关键一步。现在,你已经具备了使用自定义函数来封装和自动化分析流程的基础能力。
39:TDR替代分析方法 📊


在本节课中,我们将学习如何编写一个灵活的函数来计算年龄调整后的总抚养比。我们将从创建一个通用函数开始,然后扩展其功能,以计算不同类型的抚养比,例如老年抚养比和儿童抚养比。最后,我们将应用这些函数来分析美国各州的数据,并探讨不同计算方法如何影响我们对数据的理解。

编写通用函数

上一节我们学习了如何计算总抚养比。本节中,我们将创建一个更通用的函数,允许我们动态指定年龄范围的上限和下限,而不是在代码中写死。

以下是创建函数 TDR_age 的步骤:

- 定义函数参数:函数需要三个参数:数据框
df、年龄下限lower_age和年龄上限upper_age。 - 在函数内部处理数据:使用
mutate和case_when逻辑,根据传入的年龄界限创建新的“依赖人口”分类变量。 - 计算比率:对分类后的数据进行汇总,并计算总抚养比。
- 返回结果:函数最终返回计算出的比率值。
TDR_age <- function(df, lower_age, upper_age) {
df <- df %>%
mutate(dependent = case_when(
age <= lower_age ~ TRUE,
age >= upper_age ~ TRUE,
TRUE ~ FALSE
))
summary_df <- df %>%
summarise(
total_pop = n(),
dependent_pop = sum(dependent)
)
ratio <- summary_df$dependent_pop / (summary_df$total_pop - summary_df$dependent_pop)
return(ratio)
}
我们使用之前课程中的参数(14岁和65岁)测试这个函数,结果与之前的手动计算一致,验证了函数的正确性。

扩展函数功能

Filin Kainsky 的研究建议,除了总抚养比,还应分别计算老年抚养比和儿童抚养比。这可以看作是我们通用函数的特例:老年抚养比只关注上限年龄(如65岁以上),儿童抚养比只关注下限年龄(如18岁以下)。

我们可以修改 TDR_age 函数,使其能够处理这些特例。核心思路是检查传入的 lower_age 和 upper_age 参数:
- 如果两者都是数字,则计算标准的总抚养比。
- 如果只有
lower_age是数字而upper_age是NULL,则计算儿童抚养比。 - 如果只有
upper_age是数字而lower_age是NULL,则计算老年抚养比。 - 如果两者都是
NULL或传入非法值,则通过stop()函数抛出错误。

以下是更新后的函数逻辑代码块:


TDR_age <- function(df, lower_age, upper_age) {
if (is.numeric(lower_age) && is.numeric(upper_age)) {
# 标准总抚养比计算
df <- df %>% mutate(dependent = age <= lower_age | age >= upper_age)
} else if (is.numeric(lower_age) && is.null(upper_age)) {
# 儿童抚养比计算
df <- df %>% mutate(dependent = ifelse(age <= lower_age, TRUE, FALSE))
} else if (is.null(lower_age) && is.numeric(upper_age)) {
# 老年抚养比计算
df <- df %>% mutate(dependent = ifelse(age >= upper_age, TRUE, FALSE))
} else {
# 处理非法输入
stop("参数 lower_age 和 upper_age 必须至少有一个为数字,另一个可为 NULL,但不能两者都为 NULL 或非数字。")
}
# 后续汇总和计算比率的代码保持不变
# ...
}
我们通过多种参数组合测试了这个函数,包括标准双参数、单参数特例以及非法输入,函数均能按预期工作。

创建专用函数
为了让代码更清晰、更易于使用,我们可以基于通用函数 TDR_age 创建几个专用的“影子函数”。这些函数内部固定了年龄参数,直接对应特定的抚养比计算。
以下是四个专用函数的定义:
# 1. 标准总抚养比 (TDR)
TDR <- function(df) {
TDR_age(df, lower_age = 14, upper_age = 65)
}


# 2. Filin-Kainsky 年龄调整总抚养比
FNK_age_adjusted <- function(df) {
TDR_age(df, lower_age = 18, upper_age = 65)
}
# 3. 老年抚养比
FNK_elderly <- function(df) {
TDR_age(df, lower_age = NULL, upper_age = 65)
}

# 4. 儿童抚养比
FNK_child <- function(df) {
TDR_age(df, lower_age = 18, upper_age = NULL)
}
现在,我们拥有了一个简单易用的分析工具集。


应用于州级数据分析

有了这些函数,我们可以轻松地分析各州数据。我们使用 group_by 和 summarize 函数,一次性为每个州计算所有四种抚养比。
这里有一个关键点:在 summarize 中使用自定义函数时,需要使用 cur_data() 来引用当前分组的数据。


state_ratios <- data %>%
group_by(state) %>%
summarise(
TDR = TDR(cur_data()),
FNK_adj = FNK_age_adjusted(cur_data()),
FNK_eld = FNK_elderly(cur_data()),
FNK_child = FNK_child(cur_data())
) %>%
arrange(desc(TDR))
查看结果表格,我们可以获得丰富的信息:
- 总抚养比 (TDR) 排名前三的州是缅因州、佛罗里达州和蒙大拿州。
- 年龄调整抚养比 (FNK_adj) 由于将15-17岁人群纳入被抚养人口,数值普遍高于标准TDR。
- 深入分析:例如,缅因州的高TDR主要源于其极高的老年抚养比,而非儿童抚养比。这对于公共政策制定(如税收、养老金、教育资源分配)具有重要启示。
- 底部观察:总抚养比最低的地区是华盛顿特区(DC)和阿拉斯加州,这反映了其人口结构以劳动年龄人口为主。


总结

本节课中我们一起学习了R语言中函数的核心应用。我们从编写一个简单的计算函数开始,逐步将其扩展为一个健壮、通用的工具,并最终创建了一套便于数据分析的专用函数。
通过将这些函数与 dplyr 的 group_by 和 summarize 操作结合,我们能够高效地对复杂数据集(如美国各州人口数据)进行多维度分析,从而提取出有意义的洞察,例如不同州老龄化或儿童比例的差异。


这标志着我们在掌握 tidyverse 数据操作方面迈出了坚实的一步。在接下来的课程中,我们将进入另一个强大的领域:信息可视化,使用 ggplot2 包将我们的数据发现转化为直观的图表。
40:公共卫生数据日常应用:Joneigh Khaldun访谈



在本节课中,我们将通过密歇根大学公共卫生学院Paula Lantz教授与Joneigh Khaldun博士的访谈,了解数据在公共卫生管理与决策中的实际应用。Khaldun博士将分享她在巴尔的摩市、底特律市和密歇根州担任公共卫生领导职务时的经验,重点阐述数据如何驱动政策制定、质量改进和健康公平。
引言与嘉宾介绍
欢迎,我是Paula Lantz教授。今天,我很高兴能与Joneigh Khaldun博士进行对话。她是我在公共卫生和公共服务领域的榜样之一。非常感谢您今天与我们在一起。
Khaldun博士是一名执业急诊科医生,目前也是CVS Health的副总裁兼首席健康公平官。她在公共卫生行政管理和领导方面担任过许多不同的重要职务。
为了让我们开始,Khaldun博士,再次感谢您今天与我们在一起,您能介绍一下您曾担任过的一些重要职位吗?

Khaldun博士的公共卫生领导经历


能够来到这里是我的荣幸。我认识您很多年了,包括在我职业生涯早期,很高兴能再次与您交流。
是的,我很荣幸在行政管理领域,特别是在政府部门担任过多个职务。我曾是巴尔的摩市卫生局的首席医疗官,负责监督七个独立诊所和实验室的工作。我还曾担任底特律市卫生局的医疗主任和局长,负责在那里建立项目、进行大量重组并应对接踵而至的甲型肝炎危机。
最近,在我担任现职之前,我是密歇根州的首席医疗执行官,同时也是密歇根州卫生与公众服务部的卫生事务副主任。因此,公共卫生、医疗补助、行为健康以及我们的州立精神健康医院都在我的职责范围内。
公共卫生行政的核心职责


这些都是重大的职责。您能总结一下在巴尔的摩市、底特律市和密歇根州工作时的一些主要行政责任吗?
当然。在政府公共服务中,核心是关于人,是关于如何为人民服务,以及如何利用政府通常有限的预算。作为这些资金的管家,如何利用资金来推进巴尔的摩、底特律或密歇根州人民的健康。
我的大量工作涉及规划,很多是关于质量,查看数据。例如,在我们的巴尔的摩诊所,我们如何服务人群?我们的指标是什么?在巴尔的摩和底特律,我还特别致力于思考我们的计费方式、基础设施和人员配置。
因此,很多工作是规划、评估、查看数据和进行质量改进。


数据在公共卫生管理中的重要性
这很棒,这些都是我们在本专项课程中讨论的公共行政核心职能。此外,您知道本专项课程的学习者非常关注数据和数据分析在公共部门中的作用。您能谈谈信息和数据对于履行您非常庞大的行政职责的重要性吗?
当然。数据非常重要。除非你拥有数据,否则你无法了解自己服务得有多好,或者坦白说,你是否在服务人群。
数据对于理解你所服务的人群、不同的质量指标至关重要。例如,有多少人获得了医疗服务?他们是否得到了应得的治疗?他们获得治疗的时间点是什么?
特别是在政府公共卫生领域,我们经常关注死亡和死亡率。我举一个密歇根州的例子,实际上我负责监督我们的阿片类药物应对策略。我们发布了关于该州死亡人数和死亡趋势的数据。但我要求团队做的一件事是回过头来分析,我们发现(这是在2019年之前)死亡率的总体趋势在下降,但当我们按种族和民族细分数据时,我们发现某些人群的死亡率实际上在上升。



这些数据很重要,因为它帮助我们指导我们实施的计划,并思考我们服务的地理区域和人群。因此,不仅仅是拥有数据,真正重要的是知道如何按亚人群、地理和社会因素进行分析,理解数据要讲述什么故事,要回答什么问题,数据正在告诉你什么故事,这真的非常重要。
与数据团队的合作

那么,您能谈谈在这项重要工作中,您是如何与数据系统设计师和分析师合作的吗?您如何与他们合作以确保从一开始就拥有正确的数据,然后将其整合到用于沟通的报告中?
当然。我必须说,这很复杂。通常在政府公共卫生部门,你往往没有庞大的团队或充足的资金。坦率地说,我认为政府公共卫生部门往往资金不足。
然而,在我的三个政府公共卫生核心角色中,我的数据团队一直是我所做一切工作的支柱。我考虑数据的及时性,确保数据是干净的,没有重复项(例如,我们以正确的方式统计人数),数据是如何收集的,是否与我们需要向其他方报告的方式匹配。
从州的角度来看,我们必须向国家报告。因此,数据是否从一开始就以正确的方式收集?我们是否以可以发送给联邦政府的方式查看和打包数据?
同样非常重要的是如何向公众传达数据。对于普通公众来说,电子表格和Excel文件毫无意义。关键在于你如何以视觉方式分享数据,以及你如何谈论数据。数据实际上是一个故事,它讲述了一个特定的健康问题如何发展,同时也告诉我们为了促进社区健康需要做什么。
数据的背景与局限性
这很棒。我们在本课程中一直在讨论,这不仅关乎数据,更关乎故事。同时,分析师也需要知道领导者和行政人员将如何使用数据,背景绝对重要。您在这方面有什么故事可以分享吗?
我想说的是,在我所做的任何演讲之前(在我的角色中,特别是在底特律和密歇根州,我做过很多演讲),任何数据集都有其局限性。关于你能从数据中得出什么明确结论,总是存在局限。数据往往有遗漏,总是存在特定数据的局限性。
因此,在公开讲述那个故事甚至设计你的项目时,分享或理解这一点非常重要。以COVID-19应对为例,思考我们的数据说了什么,没说什么,以及我们如何始终努力获取更多数据,这真的非常重要。

关于COVID-19有太多可以讨论的内容。所以,我们现在稍作休息,然后回来与Khaldun博士进行另一场关于COVID-19数据以及在危机时刻建立新数据系统这一巨大议题的对话。非常感谢。


在本节课中,我们一起学习了数据在公共卫生实践中的核心作用。通过Khaldun博士的分享,我们了解到数据不仅是衡量服务质量和健康结果的工具,更是指导资源分配、揭示健康不平等和讲述社区健康故事的关键。有效的公共卫生管理依赖于准确、及时且按相关维度(如种族、地理)细分的数据,并需要与数据团队紧密合作,将原始数据转化为可操作的见解和公众能够理解的沟通材料。同时,认识到数据的局限性并在决策中加以考虑,是负责任的领导力的重要组成部分。
41:贾维德·阿里访谈(第一部分):国家安全与政府官僚体系 🏛️🔒



在本节课中,我们将通过贾维德·阿里教授的访谈,探讨国家安全这一公共产品的复杂性,以及政府官僚体系在应对国家安全挑战时的运作与协作。
欢迎。今天我很高兴能与我的同事兼朋友贾维德·阿里教授在此交谈。阿里教授是密歇根大学福特公共政策学院的实践副教授,他教授网络安全、国家安全和反恐方面的课程。阿里教授曾担任过一系列非常有趣的工作和领导职务。他稍后会详细介绍,但这确实包括了在美国国防情报局、国土安全部以及联邦调查局担任的非常高级别的职位。他拥有底特律大学的法学博士学位,并且再次拥有丰富的经验和知识。贾维德,我非常感谢你今天抽出宝贵时间与我讨论你在公共部门这一重要领域的工作经验,特别是谈谈数据及数据分析在这项工作中的角色。保罗,很高兴和你在一起,我也很高兴来到这里,并期待我们的对话。


那么,首先,请花点时间告诉我们你在职业生涯中做过的所有很酷的事情。我会尽量简洁地概括。正如你所提到的,我在华盛顿特区期间担任过许多不同的角色。我在华盛顿待了26年,那是一段很长的时间。在这26年中,有16年在政府任职。你已经描述过其中的一些部门和机构。但在所有这些不同的职位中,甚至包括在特朗普政府时期在白宫工作的一年,我绝大部分时间都专注于反恐。但由于这些职位的多样性,我得以审视几乎所有方面:分析、行动、战略、政策、资源。因此,与大多数通常在同一组织内度过大部分政府服务生涯的同事不同,我恰恰相反。在16年的服务中,我担任过六个不同的工作,级别、责任和管理职责不断提高。这真是一段独特的职业生涯。但现在,我非常激动、荣幸且光荣地能与你一起在我的母校密歇根大学工作。正如我开玩笑地对我的学生说的那样,我可能是最不可能成为教授的人。所以,我需要一些时间来适应被这样称呼。但我真的很高兴来到这里。

很好,谢谢。到目前为止,在我们的课程中,学习者和我们一直在讨论公共产品。国家安全无疑是一个非常重要的公共产品,但它也非常庞大。你能花点时间解释一下“国家安全”这个大概念吗?是的,国家安全是一个极其广阔和复杂的领域。在这个广泛的国家安全主题下,有不同的议题和学科,它们可以是区域性的,也可以是功能性的。我的整个职业生涯,至少在政府方面,都专注于一个功能性问题:反恐。但反恐并不是美国唯一的国家安全优先事项。尽管我认为,在9/11事件之后,反恐成为了主导性的优先事项。回顾历史,也许这是一个错误。我的意思是,我们过于专注于应对国内外的恐怖主义威胁,以至于可能失去了理解其他一系列国家安全优先事项的能力。快进到我们现在所处的2022年,我认为是的,反恐作为一个国家安全优先事项仍然重要,但也许还有其他同等重要或更重要的优先事项。这涉及到大国竞争,而俄乌冲突只是其表现之一。网络安全,正如你提到的,我在密歇根大学教一门关于网络安全的课程,它也跨越了所有这些不同的学科。气候变化已成为国家安全的巨大问题,拜登政府可能比过去20年任何一届政府都更认识到这一点。显然还有公共卫生,我们仍处于这场新冠疫情之中。我尽量保持乐观,我知道你有不同的看法,但这同样是一个非常重大的国家安全问题。看看经济发生了什么,以及它对人们日常生活的影响,这也对我们开展国家安全事务的能力产生了影响。所以我想说的是,在这个广泛的国家安全旗帜下有很多不同的问题。而我的职业生涯中反恐占主导地位的辉煌日子已经过去了。我认为反恐现在正与一系列其他议题竞争。

很好。正如你所知,我们正在与之交谈的许多学习者来自许多不同的国家。那么根据你的经验,在思考国家安全问题并围绕这些重要的国家安全问题组织政府方面,不同国家和民族之间有哪些相似之处,又有哪些不同之处?没有单一的国家安全模式,没有放之四海而皆准的方法。至少在我的政府生涯中,我很幸运能够周游世界,与我们的外国伙伴会面,了解他们是如何处理即使是反恐这一个问题的,反恐是更广泛国家安全框架内的一个议题,或者了解他们从国家安全角度是如何设置的,与我们相比如何。通过所有这些旅行,我发现没有哪个国家能与美国的体系相提并论,因为我们如此庞大,如此……我们有许多不同的部门和机构参与国家安全的不同方面。这本身就是美国与其他国家在组织方式上的一个主要区别。但同时,一些共同的主题包括国防和情报方面的强力手段,以及这些不同国家如何看待这两个领域的任务优先事项。我认为必须分别看待每个国家。我认为那些在关注点上与我们最接近的国家,可能不是规模上,而是关注点上,是英国、澳大利亚、加拿大和新西兰。美国在这些共同优先事项的国家安全领域运作的一种方式,是通过一个叫做“五眼联盟”的关系。这种关系可以追溯到几十年前。因此,包括美国在内的这五个国家,由于这个“五眼”架构,我们在国家安全上几乎有着相同的哲学方法。但一旦脱离这个“五眼”方法,情况就变得更加个性化和定制化。因此,即使是像德国和法国这样美国的强大伙伴,我们也不是在同样的“五眼”方法下进行国家安全合作的。我们在这门课程中一直在讨论政府官僚体系,我认为这是各国共有的问题。政府是一个庞大的官僚机构,公共行政和公共政策面临着挑战,因为大多数大型政府官僚机构都难以驾驭。你能谈谈你的经验吗?在国家安全领域,为了防止筒仓效应,并积极促进所有表面上处理相同问题的官僚体系不同部分之间的协作与沟通,采取了哪些措施?是的,这确实是我们美国国家安全机构的一个持久特征,即这些根深蒂固的官僚优先事项和文化。同样,无论好坏,我都亲眼目睹了,因为我在许多不同的部门和机构任职。我服务过的这六个机构,每一个都有其自身的组织文化、自身的语言、自身的官僚流程。我需要自己去弄清楚如何在这些之间穿行。因此,即使在我自己的职业生涯中,我也看到了这些挑战,并有很多有趣的经历。但美国一直努力尝试做的一件事,至少在反恐领域——这是我比大多数人了解得一样多或更多的领域——就是打破这些筒仓,突破那些阻碍信息共享、协作与整合的官僚障碍。因为我们从9/11之前学到的是,如果你不做这些事情,像9/11这样的事件就会发生。我教一门关于这个的课,梳理导致9/11事件的失误、错失的机会和组织失败。在那次可怕的袭击之后,必须做出一些戏剧性的改变。我们不能只是维持现状。因此,美国反恐必须做的一件事是提出一套新的范式、新的结构和新的体系。由此产生的一件事是2004年成立了国家情报总监办公室,这是9/11委员会的建议。因此,该组织一旦启动运行,其任务就是至少在情报界推动反恐方面的整合、协作和信息共享,以防止类似9/11的事件再次发生。我的职业生涯也顺应了这一浪潮,包括在这个新组织中担任两个不同的职务。我愿意认为,至少从美国方面来看,这使我们在反恐方面做得更好,因为我们试图改变9/11之后的所有事情。这并不意味着我们是完美的,也不意味着我们不会再受到攻击。我们在国内和海外都曾受到攻击。但至少你不必与文化作斗争,也不必与官僚体系作斗争来达到这些最终状态。对手和敌人总是有发言权。当官僚机构缓慢地移动到某个新位置时,他们可以移动得更快,这就是我们在反恐领域看到的情况。





本节课中,我们一起学习了国家安全概念的广泛性与多维度,了解了不同国家在组织国家安全体系上的异同,并探讨了美国政府为打破官僚壁垒、促进跨部门协作以应对国家安全挑战(特别是反恐)所采取的措施,例如成立国家情报总监办公室。这为我们理解公共部门中复杂政策领域的运作提供了重要背景。
42:数据在国家安全中的战略作用(第二部分)

在本节课中,我们将继续探讨数据与信息在国家安全领域,特别是反恐、国防和网络安全中的核心作用。我们将了解不同类型数据的优先级、整合公开与机密信息的挑战,以及该领域对数据分析人才的迫切需求。
上一节我们介绍了数据在国家安全中的重要性,本节中我们来看看具体面临的数据挑战与机遇。
数据优先级与挑战
国家安全领域的数据问题至关重要,但必须针对每个具体功能或区域问题来理解哪些数据最相关,因为并非所有数据都具有同等价值。如果针对某个主题或问题从错误的数据集入手,可能无法发现真正寻找的威胁。这一点在9/11事件后,反恐领域不得不进行调整。9/11之后,数据获取的范围极大地扩展了。
社交媒体数据的增长,无论在机密还是公开层面,都加剧了这一挑战。仅就反恐而言,这已是持续存在的难题,更不用说其他国家安全优先事项了。在一些政府职位上工作时,我目睹了这股数据浪潮开始冲击我们。我当时认为,如果我们情报界不开始尝试领先应对这些数据挑战——无论是在机密侧还是公开可获取信息侧——那么更多的威胁将会发生,我们将失去阻止它们的能力。

机密数据问题是一个传统挑战。情报界过去存在一种文化倾向,即仅通过所掌握的机密信息来理解世界,无论是来自卫星的技术信息、图像,还是来自人力来源的信息。这些都是需要筛选的不同类型的机密数据。

但现在,我们拥有了一个庞大得多的公开可用信息池,其中大量信息存在于社交媒体世界。如何将这两个世界结合起来?如何将这两种完全不同的数据类型融合到一个共同的方法中,让像我职业生涯初期那样的分析师能够在袭击发生前识别威胁?这是保护国内外美国公众、预防袭击的最终目标。
整合数据与应对挑战
我认为挑战在于:现在数据更多,但理解数据含义、以及如何及时、可操作且合理地摄取数据的能力却更弱。这些都是我们目前仍在持续面临的挑战。
以下是一个关于社交媒体挑战的例子,至少对美国和其他国家的国家安全领域是如此:
情报界的传统重点是收集机密情报,但社交媒体世界中存在大量与国家安全相关的信息。挑战之一在于:其中有多少是相关的?在法律上可以获取多少?在美国,我们有宪法保护,执法和情报界可以收集哪些公开可用的信息?即使你拥有了这些信息,又该如何处理?
一个外国对手如何利用社交媒体领域对抗美国的很好例子,是2016年俄罗斯的虚假信息宣传活动。他们基本上利用其政府的不同部门以及像互联网研究机构这样的掩护组织,在2016年特朗普总统和当时总统候选人希拉里·克林顿的选举前夕,领导了一场非常强大的虚假和错误信息宣传活动。
当这些社交媒体驱动的活动发生时,美国政府并不知道哪些账户与俄罗斯代理人或互联网研究机构有关联。我们至今仍未完全解答的一个问题是:这些社交媒体活动在多大程度上影响了人们对特朗普或希拉里·克林顿的看法,并最终影响了投票?但事实是,这种活动是实时发生的,当时没有人知道其俄罗斯背景部分正在实时发生,并且可能对选举产生了重大影响。这是一个关于外国对手如何在众目睽睽之下利用社交媒体,而我们却无法理解真实情况的惊人案例研究。这种情况很可能在未来的选举中继续发生。
职业建议与人才需求
我们在这里的谈话非常发人深省。不幸的是,我带来的并非全是好消息,但这是公共部门工作中如此重要的一个方面。正如我们一直讨论的,这是一项非常重要的公共利益。只有政府才会承担起理解国家安全威胁和挑战的这一角色。
对于那些考虑并感兴趣在政府及其国家内部(以及国家内部的 subdivisions)从事数据分析和政策分析职业的人,特别是在国家安全、国防和反恐领域,我的建议是:是的,如果存在这些机会,请积极投身于这些职位。你可以通过学术或专业途径积累技能。
至少在美国,我们需要更多这类人才,无论是年轻人还是处于职业生涯中期的人。鉴于我们在信息和数据分析方面讨论的这些挑战,这部分人才在我们的国家安全劳动力中仍然严重不足。我认为可以安全地说,这种情况普遍存在,但在国家安全界尤其如此。当我2018年离开政府开始在这里教学时,我的一些前部门和机构正试图招聘一系列此类职位,但即使只是招聘少数人也变得非常困难。

困难的原因要么是我们找不到具备合适技能和经验的人,要么是我们找到了这样的人,但他们从私营公司获得了好得多的 offer,薪水可能是政府的三四倍,而且不需要获得政府安全许可、接受测谎仪测试和药物测试。如果你打算进入这个世界,至少在美国这边,你也必须做出一些生活方式上的选择。因此,我认为存在许多准入门槛,使得这变得困难。这是政府方面必须做出的权衡之一:人们可能不得不承担更多风险;你可能无法找到一个能通过所有安全审查的候选人,但他们拥有硬技能。什么更重要?是确保某人首先拥有硬技能,还是优先考虑一些较低级别的安全问题?因为如果我们一直默认某人必须先通过所有这些安全检查,我们将永远无法用真正重要的人才填补这些职位。技能绝对重要。

我知道我们可以花更多时间讨论所有这些重要问题,但非常感谢你今天抽出时间与我们分享,更多地谈谈数据和信息在极其重要的国家安全领域的重要作用。非常感谢。
43:本周特别祝贺 🎉

在本节课中,我们将回顾并总结您在“公共部门R数据分析”系列课程中完成的第一门课程。我们将概述您已掌握的核心概念与技能,并预览后续课程的学习方向。
恭喜您,您已经完成了“使用R进行公共部门数据分析”证书系列的第一门课程。
这门课程向您介绍了信息在民主政体国家公共部门数据分析中的重要作用,包括其在各级政府行政运作以及公共政策制定与评估中的关键职能。
同时,课程向您介绍了使用R进行基本数据操作的技能,重点在于运用tidyverse工具集。完成本课程后,您应该为进一步探索公共部门数据分析打下了坚实的基础。
如果您觉得尚未完全掌握使用R进行数据清洗的技巧,请不要担心。在接下来的三门课程中,我们将在学习数据可视化和基础推断统计的同时,不断练习这些技能。
我,以及一些额外的嘉宾,将继续为您提供与公共部门这一独特背景下的数据分析相关的术语、概念和现实世界案例。
我们知道您来这里是为了学习R语言中的新数据分析技能,但这项工作的背景至关重要。因为基于数据制定公共政策决策是一个细致且极其重要的过程。因此,我们将您的技能培养置于公共行政核心职能、公共政策分析方法以及政治与伦理在数据分析中的独特作用的背景之下。
我们希望您能感受到技术内容与公共部门背景信息得到了良好的融合,并且觉得它们很有趣。
本系列的下一门课程将专注于公共行政的探索性数据分析,在那门课程中您将更多地听到我的讲解。我们将重点讨论如何使用R中的GGplot库,学习如何进行分布、总体和趋势的可视化分析。我们还将探讨一些信息可视化理论,理解如何将良好的可视化提升为优秀的可视化。
我将在第二门课程中加入Chris的讲解,探讨数据探索和可视化对于公共行政中公平这一核心原则的重要性。我还将分享一些公共行政领域数据可视化的最佳实践与禁忌案例,以及数据可视化有时如何被以误导性和政治化的方式呈现。
我们期待与您继续深入探索公共部门及其数据,以及我们可以用来更好地理解它们的R技术,助您朝着获得“使用R进行公共部门数据分析”证书的目标稳步前进。
本节课总结
在本节课中,我们一起回顾了第一门课程的核心内容:公共部门数据分析的重要性、R语言(特别是tidyverse)的基础数据操作技能。我们明确了这些技能在公共行政与政策制定背景下的应用价值,并预览了后续课程将重点学习的探索性数据分析和数据可视化技能。
0:ggplot2探索性数据分析导论


欢迎来到专项课程的第二课。在本课程中,我们将聚焦于构建信息可视化,以更好地理解数据中的趋势和关系。我们将重点学习流行的 ggplot2 库,用于创建美观且信息丰富的图形。
上一节我们介绍了数据分析的基础技能,本节中我们来看看如何通过可视化进行探索性数据分析。
我将与您一同学习,提供一些关于公共行政核心职能的探索性数据分析和数据可视化示例。这包括将公平作为公共行政的核心支柱,以及数据分析对于政府理解和试图解决不平等与不公正问题的重要性。
我们还将讨论数据有时如何被误用,以及数据可视化在公共部门内如何有时会出于政治目的而产生误导。
我们希望您已准备好与我们一同开始这门新课程。我们将涵盖大量内容,但会通过练习您已有的技能来巩固学习。
在本课程中,您将有机会与其他学习者交流,查看他们的创作。本课程的最后一个作业是一个开放式的公共数据探索任务,您可以根据需要将其用作作品集的一部分。
那么,让我们开始吧。
在本节课中,我们将要学习使用 ggplot2 进行探索性数据分析的基础。我们将从了解 ggplot2 的核心语法开始,然后逐步构建不同类型的图形。
ggplot2 的核心思想是图形语法,它通过叠加图层来构建图形。基本结构如下:
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))
以下是构建图形的基本步骤:
- 指定数据:使用
ggplot()函数并传入您的数据框。 - 定义美学映射:在
aes()函数内,将数据变量映射到图形属性,如 x 轴、y 轴、颜色、形状等。 - 添加几何对象:使用
geom_开头的函数(如geom_point(),geom_bar())来指定您想要的图形类型。
接下来,我们通过一个简单的散点图示例来理解这个过程。
假设我们有一个名为 my_data 的数据框,包含 x_var 和 y_var 两列。要创建散点图,代码如下:
ggplot(data = my_data) +
geom_point(mapping = aes(x = x_var, y = y_var))
这个代码首先初始化了一个基于 my_data 的图形,然后添加了一个点图层,将 x_var 映射到 x 轴,y_var 映射到 y 轴。
除了散点图,ggplot2 可以创建多种图形。以下是几种常见的图形类型及其对应的几何对象函数:
- 条形图:用于显示分类数据的分布。使用
geom_bar()。 - 折线图:用于显示数据随时间或其他连续变量的趋势。使用
geom_line()。 - 直方图:用于显示连续变量的分布。使用
geom_histogram()。 - 箱线图:用于显示数据的分布和异常值。使用
geom_boxplot()。
在探索数据时,我们经常需要比较不同分组的情况。ggplot2 可以通过美学映射轻松实现分组可视化。例如,在散点图中,我们可以通过 color 参数按第三个变量进行着色:
ggplot(data = my_data) +
geom_point(mapping = aes(x = x_var, y = y_var, color = group_var))
这会将数据点按 group_var 变量的不同值以不同颜色显示,便于直观比较。
为了使图形更清晰、更专业,我们经常需要添加或修改标签、标题和主题。以下是相关的函数:
labs():用于添加标题、副标题、坐标轴标签和图例标题。- 例如:
labs(title = “我的图表”, x = “X轴变量”, y = “Y轴变量”)
- 例如:
theme_函数族:用于控制图形的非数据元素外观,如背景、网格线、字体等。- 例如:
theme_minimal()应用一个简洁的主题。
- 例如:
一个完整的图形代码可能如下所示:
ggplot(data = my_data, aes(x = x_var, y = y_var, color = group_var)) +
geom_point() +
labs(title = “不同组别的X与Y关系”, x = “X变量”, y = “Y变量”, color = “组别”) +
theme_minimal()
本节课中我们一起学习了使用 ggplot2 进行探索性数据分析的基础。我们了解了图形语法的核心结构,练习了创建散点图、条形图等常见图形,并学会了如何通过颜色进行分组以及如何添加标签和主题来完善图表。这些技能是理解和展示公共部门数据趋势与关系的关键工具。
1:分层图形语法体系 📊

在本节课中,我们将要学习R语言中用于数据可视化的核心框架——分层图形语法体系。我们将了解其构成部分、工作原理以及如何利用它来创建结构化的、可重复的图表。
概述
在R生态系统中,有多种制作图表的方法。其中,来自Tidyverse的ggplot2包是目前最流行的方法,由Hadley Wickham创建。它基于一种称为“图形语法”的理论,这是一种通过定义明确且可重复的规则来结构化定义可视化的方式。
Hadley Wickham并非独自构建了这个系统,而是建立在其他人的工作之上,包括首次将其定义为“语法”的Wilkinson等人,以及制图师Jacques Bertin。Bertin在80年代初提出的“图形符号学”理论,至今仍是我们本课程将要讨论主题的绝佳灵感来源。



实际上,关于信息可视化的理论思考之深远令我感到惊讶。其根源很大程度上可以追溯到现代计算机时代之前,当时可视化图表必须手工精心制作,而图表的印刷和再版是一个极其昂贵的过程。因此,有许多优秀的著作从人类视觉感知系统以及眼睛和大脑能够快速、直观地解码信息的方式等角度来探讨这个问题。我们将在本课程的最后一周触及其中一些内容。
但我想首先聚焦于在ggplot2中创建图表的具体机制。让我们从Wickham描述的分层图形语法开始。
分层图形语法

分层的思想有点像老式的透明胶片。你可以绘制一个图表,比如说一个带有X轴、Y轴和一堆数据点的散点图。然后你可以在上面添加另一个图层,比如一个显示数据趋势的线图,甚至可能添加第三个图层来突出显示图表中需要关注的特定区域。

在ggplot2中,一个图层负责渲染每个视觉元素。图层由五个部分组成,这些部分构成了一套语法或规则,R将根据这些规则创建可视化图形。

图层的组成部分
以下是构成ggplot2图层的五个核心部分。


- 数据
图层的第一要素是我们已经相当熟悉的数据,即我们想要在图表中展示的数据。这通常是一个数据框或Tidyverse中的tibble。这些数据不必是我们所有的数据,可以使用我们之前见过的一些工具进行过滤和转换。遵循Tidyverse的“固执己见”理念,数据应该是整洁的,这意味着每一行应代表一个观测值,每一列应代表一个变量。

-
美学映射
图层的下一个组成部分是美学映射,它们通过aes()函数定义。这会将数据中的各个变量映射到将在视觉上表示的元素。可视化数据的方式有很多种。我们通常从数据的X和Y维度开始。这里需要指出,ggplot2的目标是擅长二维可视化,而这是目前最常见的。因此,aes()函数的这两个方面总是作为前两个参数传入。在此之后,则取决于你想要制作的图表类型以及可用的不同美学映射。例如,你可以将颜色绑定到数据中的另一列。 -
几何对象
图层的第三个组成部分是几何对象。你使用的几何对象类型取决于你想要可视化的变量数量以及这些变量是离散的还是连续的。连续变量通常是数值型的,可以有一个范围,比如某人的年龄、体重或考试百分比分数。离散变量是分类变量,可能有顺序也可能没有顺序。例如,国籍可能是无序分类变量的例子,而马拉松比赛的名次则是有序分类变量的例子。有时这些离散变量被称为因子,我们将在下一讲深入探讨。几何对象的函数名都以geom_开头。例如,我们有geom_bar()来创建条形图,或者geom_point()来创建散点图。我们还有一些几何对象,它们与变量没有直接关系,但被认为是图形基元,例如用geom_rect()绘制矩形或用geom_text()添加文本。这些在ggplot2中都是简写形式,使用它们会产生一些重要的副作用,这些副作用可能会模糊我们对分层图形语法工作原理的初步理解。因此我们将在本课程的第二周深入探讨这些内容。

- 统计变换
数据、美学映射和几何对象构成了每个图层语法的核心元素。然而,我们还有两个可选的图层构造:统计变换,它对数据进行统计转换。

- 位置调整
位置调整,它对我们的几何对象进行参数化。
了解这些很有用,但很多时候它们有自己的函数,我们只需将参数传递给几何对象,甚至使用已硬编码到几何对象中的统计变换。本周,我们将主要关注图形语法的前三个方面,但下周我们会加入最后两个。


语法的连接与组织
以上构成了基于图层的语法的核心。现在,就像英语等语言有句子的语法规则一样,我们也有覆盖句子之间连接的规则(如标点符号),以及覆盖多个句子组合在一起的规则(如段落和章节)。在我们的图形语法中也有这些元素,用于连接、框定和跨越不同的图层。
总结



本节课中,我们一起学习了ggplot2包所依赖的分层图形语法体系。我们了解到一个完整的图表由多个图层叠加构成,而每个图层又包含数据、美学映射、几何对象、统计变换和位置调整这五个核心部分。我们重点探讨了前三者:数据是可视化的基础,美学映射(通过aes(x=, y=, color=)等)定义了数据如何转换为视觉属性,而几何对象(如geom_point(), geom_bar())则决定了图表的最终呈现形式。理解这个语法框架是使用ggplot2进行高效、灵活数据可视化的关键第一步。在接下来的课程中,我们将通过实际编码来应用这些概念。
2:R语言因子变量处理 🐕






在本节课中,我们将学习R语言中一个重要的数据类型——因子。因子是处理分类数据的关键,尤其在数据可视化中扮演着核心角色。我们将通过分析美国西雅图市的宠物许可证数据,来理解因子的概念、创建方法以及在ggplot2绘图中的应用。
课程概述

首先,我们引入一个有趣的数据集——西雅图市的宠物许可证数据。这类市政数据的公开化是全球趋势,为数据分析师提供了丰富的研究材料。我们的目标是探索这些数据,并利用因子变量来更好地理解和展示它。


数据导入与初步观察
我们首先加载tidyverse包并读入数据。

library(tidyverse)
data <- read_csv("pet_licenses.csv")
data


执行上述代码后,我们得到一个包含7个变量的数据框。在RStudio的笔记本环境中,直接输出数据框可以方便地交互式浏览数据,包括行数、列数据类型和前几行数据。
理解频率与分类数据
在数据分析中,频率是指观测值属于某个特定类别的相对比率。我们的第一个目标是创建一个条形图,以邮政编码为X轴,以每个邮政编码的宠物注册数量为Y轴。
我们当前的数据没有直接计算频率,但可以使用dplyr轻松完成。
freq_data <- data %>%
group_by(zip_code) %>%
summarise(total = n()) %>%
arrange(desc(total))
freq_data
结果显示有198个邮政编码,有些邮政编码有数千个宠物注册。数据中还存在用NA表示的缺失值,在本次分析中,我们将其保留为一个单独的类别。

引入因子数据类型
现在我们需要面对一个核心问题:邮政编码本质上是分类数据,但在数据中被读成了整数。在R中,处理分类数据的专门类型叫做因子。

在统计学中,变量通常分为离散型和连续型。我们将离散型变量更直观地称为分类变量。分类变量就像贴有标签的桶,桶内的所有项目在标签意义上是相同的。
有些分类变量存在自然的顺序或等级,例如动物对主人的平均忠诚度排名(狗 > 马 > 猫)。这类变量称为有序分类变量。在R中,因子可以是有序的,也可以是无序的,这对于ggplot2和tidyverse至关重要。

让我们查看原始数据中的species(物种)列,它是一个完美的因子候选,但目前是字符向量。


unique(data$species)
# 输出可能是: "Cat", "Dog", "Goat", "Pig"

我们可以使用as.factor()函数将其转换为因子。
data$species <- as.factor(data$species)
data

转换后,数据框会显示该列的类型已变为factor。


因子的内部机制与操作

将字符向量转换为因子时,R在幕后将其转换为整数向量,并创建数字与不同类别(在R中称为水平)之间的映射关系。我们可以使用attributes()函数查看。
attributes(data$species)

tidyverse为因子操作提供了更强大的工具集,主要集中在forcats包中。

以下是forcats包的一些常用函数:
fct_recode(): 重新编码因子水平(例如,合并类别)。fct_relevel(): 手动改变因子水平的顺序。fct_reorder(): 根据另一个变量的值(如频率)来重新排序因子水平。fct_infreq(): 按频率从高到低排序因子水平。

例如,我们可以按物种出现的频率来排序:


# 方法1:使用dplyr计算频率后,用fct_reorder排序
data <- data %>%
group_by(species) %>%
mutate(frequency = n()) %>%
ungroup()

data$species <- fct_reorder(data$species, data$frequency)
# 注意:fct_reorder默认是升序(从小到大)
# 方法2:直接使用fct_infreq按频率从高到低排序
data$species <- fct_infreq(data$species)

因子在数据可视化中的重要性

ggplot2绘图库严重依赖因子来显示数据。它通过查看因子的levels属性来决定绘图时类别的显示顺序。因此,在绘图前正确设置因子的顺序至关重要。

ggplot2主要假定因子水平的顺序就是你希望显示的顺序,而不会过多考虑你是否将其标记为有序因子。这是一个需要注意的设计特点。

课程总结
本节课我们一起学习了R语言中的因子变量处理。我们了解到:
- 因子的本质:因子是用于处理分类数据(有序或无序)的R数据类型。
- 因子的创建与转换:可以使用
as.factor()或factor()函数创建因子。 - 因子的操作:借助
forcats包,我们可以轻松地重新编码、重新排序因子水平,特别是按频率排序,这对于数据准备和可视化至关重要。 - 因子的应用:在
ggplot2中,因子的水平顺序直接决定了图表中类别的显示顺序。




现在,我们已经掌握了图形语法的五层结构以及R中因子的处理方法,接下来就可以开始进行丰富的数据可视化了。
3:ggplot基础绘图入门 🎨

在本节课中,我们将学习如何使用 ggplot2 包创建基础可视化图表。我们将从加载和准备数据开始,逐步构建一个条形图,并在此过程中探索数据转换和可视化的核心概念。
上一节我们介绍了图形语法的分层理论,并进行了初步实践。本节中,我们来看看如何创建美观的可视化图表。
首先加载西雅图宠物许可证数据并查看。请注意,这里我们将从一开始就运用关于因子的新知识。
首先,导入 tidyverse 包。
library(tidyverse)
现在,我们将读取数据并在一行代码中适当地设置列类型。在之前的讲座中,我使用了基础R的 read.csv 函数,但本次讲座将使用 tidyverse 的 read_csv 函数。这是一个细微但重要的区别,因为它会更改一些列名并自动创建一个 tibble。
pet_data <- read_csv("path/to/your/data.csv", col_types = "cccFFF")
我在 col_types 参数上做了一些“魔法”。之前我展示了如何指示特定列应具有特定类型,但 read_csv 实际上有一个方便的功能,可以让你按列出现的顺序列出所有想要的列类型。因此,字符串 "cccFFF" 告诉 read_csv 我希望前三列是字符向量,后四列是因子。你可以查阅文档以获取有关此处可输入值的更多信息。
你可能还会注意到列名被清理了,它们包含空格但没有句点。这将改变我们后续的一些代码,现在你应该知道如何查阅文档以获取更多细节。
几节课前,我们设定了本周的目标:展示一个条形图,底部是邮政编码,条形的高度是每个邮政编码的注册数量。我们开始尝试使用 dplyr 清理和汇总数据,我们知道有198个不同的邮政编码,其中一些有数千个注册。
因此,让我们创建第一个单层可视化。回顾分层图形语法,我们的数据是这个包含198个观测值的 tibble,我们的美学映射是X轴上的邮政编码变量和Y轴上的值,即图表上每个条形的高度。

我们语法中的下一个元素——几何对象——起初有点反直觉。实际上,我们制作的不是条形图,而是柱状图。我们稍后会讨论这两者之间的区别。最后,我们的统计和位置元素在这里并没有真正使用,我们将使用数据中的任何统计信息,并且不应用任何转换。
现在,R将通过使用单词 identity 来完成此操作,这意味着这两个项目不会以任何方式改变图层的渲染。
我们要做的第一件事是计算每个邮政编码因子的频率并将其添加到数据中。稍后我会展示我们实际上不需要这一步,但我认为现在有它会更清晰。
以下是计算频率的步骤:
freq <- pet_data %>%
group_by(`Zip Code`) %>%
summarise(total = n())
我们将在这里使用反引号包裹列名,因为它们包含空格。这是从 read.csv 切换到 read_csv 的副作用之一,我希望你了解如何处理名称中包含空格的变量。这个变量名中确实有一个空格,因此我们必须用反引号将其包围。请注意,这些不是单引号,而是反引号,在大多数键盘上是波浪号键。然后,我们将其通过管道传递到 summarise 函数,并创建一个名为 total 的新列,即计数 n()。

要开始绘图,我们将使用 ggplot 函数。这个函数是我们的基础图层,我们将从空图层开始。然后,我们将使用加号运算符向图表添加图层。这看起来有点像管道操作,但它实际上是构建一个 ggplot 将要渲染的图层堆栈。
在基础图层之后,我们只需使用这个 layer 函数创建新图层。我们将传入数据、映射、几何对象等。让我们运行一下。
ggplot() +
layer(
data = freq,
mapping = aes(x = `Zip Code`, y = total),
geom = "col",
stat = "identity",
position = "identity"
)

很好,我们的第一个可视化图表。邮政编码被映射到X轴,而条形的高度是总数。回顾那个 layer 函数,我们可以稍微分解一下。我们知道每个图层有五个元素:数据(在我们的例子中是 freq)、美学映射(我们映射X和Y轴)、几何对象(本例中是 "col" 表示柱状图),以及统计和位置参数。
我们一眼就能看出,有许多邮政编码条目只有很少的宠物注册,而少数几个邮政编码有很多注册。
我认为我们可以处理一下邮政编码因子并进行一些合并,以使这个图表更具信息性。例如,我们为什么不将注册数少于1000的邮政编码合并为一个因子,然后看看我们得到了什么。

有很多不同的方法可以做到这一点,我将在这里展示一种可能不是最高效但易于阅读的方法,它使用了我们的 dplyr 技能,当然也会向你介绍一些新东西。
以下是合并低频邮政编码的步骤:
# 1. 识别需要重编码的邮政编码
to_recode <- freq %>%
filter(total < 1000) %>%
select(`Zip Code`) %>%
unlist()
# 2. 使用 mutate 和 case_when 进行重编码
freq <- freq %>%
mutate(
`Zip Code` = case_when(
`Zip Code` %in% to_recode ~ "small",
TRUE ~ as.character(`Zip Code`)
)
) %>%
mutate(`Zip Code` = factor(`Zip Code`))
# 3. 按新的邮政编码分组并重新计算总数
freq_summary <- freq %>%
group_by(`Zip Code`) %>%
summarise(total = sum(total))
请注意末尾的 unlist,这实际上会将 select 返回的表格转换为向量,这很重要,因为下一步我要进行比较。所以这里的 to_recode 数据结构将包含我们想要合并的所有邮政编码,只是作为一个巨大的字符向量列出。
现在我想做一个 mutate 和一个 case_when 并用字符串覆盖。这里我将获取我们的 freq,通过管道传入 mutate,获取我们的邮政编码,使用这个 case_when,然后我会说如果邮政编码在 to_recode 中,我想要字符串 "small"。然后有这个捕获所有情况的 TRUE,对于不匹配第一条规则的所有其他情况,我希望邮政编码作为字符返回。这里使用的 %in% 运算符看起来有点吓人,但其实不然,它所做的就是检查左侧的项目是否存在于右侧的向量中,这称为集合成员检查,实际上你会经常使用它。在这种情况下,我想在向量中搜索邮政编码列的值,这就是为什么我使用 unlist 函数。

你会注意到,在捕获所有情况的语句中,我将邮政编码的值作为字符返回。请记住,case_when 的所有情况必须返回相同的数据类型,所以这里我将所有内容都转换为字符向量,因为我想要这个名为 "small" 的新字符串值。
好的,现在如果我们愿意,可以将此列转换回因子。这里我说 freq$Zip Code,然后实际上只是将其转换为因子。
然后我们只想合并所有具有这个新值 "small" 的因子,以计算它们的合并频率。所以我将在这里使用 dplyr 来完成这项工作,尽管我们可以使用 forcats 包完成其中的一部分。请记住,当我们在分组内时,如果想访问该组,可以使用 cur_data() 函数,这允许我获取该组的数据框或表格,然后我将创建一个总和,通过管道传入 summarise 并创建这个新的 total。
然后我们只需绘图,这里的绘图实际上非常简单。我们只需说我们的数据是 freq_summary,我们的映射是这个邮政编码和总数,我们想使用柱状几何对象。让我们看一下。
ggplot(freq_summary, aes(x = `Zip Code`, y = total)) +
geom_col()


本节课中我们一起学习了如何使用 ggplot2 创建基础柱状图。我们从加载数据、计算汇总统计数据开始,然后应用数据转换(如合并低频类别)以使可视化更具可读性。我们介绍了 ggplot() 函数、layer() 函数以及美学映射 aes() 的基本用法。我们还实践了使用 dplyr 进行数据操作,为绘图准备数据。这是使用 R 进行数据可视化的第一步,后续课程将在此基础上构建更复杂的图表。
4:ggplot美学增强实践

在本节课中,我们将学习如何使用ggplot2包来增强数据可视化的美学效果。我们将通过一个具体的例子,探索如何重新排序因子、添加新的数据维度(如分类着色),并理解ggplot2的图层语法。课程将涵盖数据整理、美学映射以及如何通过简单的代码调整来优化图表可读性。
数据初步探索与排序

上一节我们介绍了ggplot的基础知识,本节中我们来看看如何通过调整因子顺序来优化柱状图的展示。
图像的可读性有所提升,但仍不理想。我们可以从按因子各水平的总动物数量排序开始。
这里我希望按总数重新排序。我将对邮政编码和频率数据进行操作,并按该列重新排序。

我经常需要执行此类操作:选取某一列(本例中是“总数”),并希望根据该列来改变因子的顺序,然后重新绘图。

现在我们可以看到,数据已按从小到大的顺序进行了良好的排序。
添加数据分类与颜色映射
在优化了排序之后,我们可以进一步为数据添加分类信息,例如创建一个“小型”汇总类别。
我们可能希望标识出这个汇总性的“小型”特殊类别,它并非另一个邮政编码。为了避免读者混淆,我们可能还想将其他邮政编码分成两个不同的类别:动物数量大于2000的和小于2000的。我们可以通过数据框的几次mutate操作来创建一个新列,然后通过分配填充颜色美学来呈现它。

我将创建一个新列,其值为“小型”、“中型”或“大型”。由于我们已经将小型数据归为一组,我将先检查现有的邮政编码值,然后检查总数以确定中型组,最后将其他所有数据设为大型。
以下是使用mutate配合case_when的示例。我认为多展示一些case_when的例子很有用,因此我尝试以不同方式演示它们,因为其中涉及很多操作。我将这个新列命名为“范围”,对频率数据使用mutate,并将“范围”设置为邮政编码的字符值。当它等于“小型”时,实际上类似于保持原样。如果其中有名为“小型”的项,则仍将其输出为“小型”。
然后,我想查看“总数”列。如果没有匹配到“小型”,则检查总数是否小于2000。如果总数小于2000,则将其设为“中型”。最后一条规则总是为真,因此所有其他情况都将归入“大型”组。接着,我将通过管道将其传递给select,以便只获取“范围”列。然后,我实际上会使用unlist将其转换为向量,以便随后将其转换为因子。最终,我们将得到一个“范围”列,它是一个基于mutate和case_when操作转换而来的因子。
现在我们来绘图。绘图代码的唯一变化是在映射美学中:不仅指定了x和y,还使用了fill值,并将其设置为“范围”列内的值。重要的是,所有这些都必须是因子。fill不仅仅是一个字符向量,它实际上指向一个因子列。你可以在geom_col的文档中了解更多关于fill的信息。让我们运行这段代码。


现在这个图表看起来非常有趣了。我们可以看到数据的三个不同维度:底部是所有邮政编码的分类列表(包括作为小型邮政编码集合的“小型”组),条形的高度表示每个组中注册的动物数量,而颜色则向图表读者直观地展示了哪些是大型组、小型组和中型组。
调整因子顺序以优化布局
尽管我们的条形已按大小排序,并且正确标识了“小型”这个汇总类别,但看到它位于图表的最右侧可能会让人感到不适。我知道这让我感到困扰。我们只需要改变因子的顺序,即邮政编码因子的水平。ggplot使用这些水平来沿X轴排序数据。让我们先检查当前的排序顺序。


如果我们想查看因子的顺序,可以执行几个操作:打印该列,这会在底部显示信息;或者直接使用levels函数。这里我将使用levels函数来查看该数据列。
它返回的是一系列字符串,都是邮政编码,最后是我们命名为“小型”的邮政编码。
我们已经知道有多种方法可以使用factor来改变水平,但还有另一种便捷的方法:relevel函数。relevel允许你获取特定的水平并将其放置在水平列表中的指定位置,本质上允许你将其移动到任意位置。
为此,我们将after参数的值设置为0,这会将“小型”因子移到列表的前面。这里我将对这个邮政编码因子使用relevel,然后指定我感兴趣的因子“小型”,并设置after = 0,这意味着将其放在列表的第一个位置。然后我们用同样的方式绘图。
我们应该对这个第一个图表感到满意。我们映射了三种不同的数据美学,让ggplot几乎为我们完成了所有的数据渲染工作,并且看到了如何组织数据以传达简单的信息。


理解ggplot的图层语法与便捷函数
今天我进行了很多复制粘贴,编写了很多代码。如果你阅读过关于ggplot的资料,可能见过关于layer命令的内容,这可能看起来有点陌生。如果你阅读一些博客或Medium文章,可能不会立即理解,但它实际上是ggplot及其理论基础的核心。
在实践中,我们通常不直接使用layer命令,而是使用以geom_开头的辅助函数。这些函数的问题在于它们有时包含一些“魔法”,这可能对初学者来说难以解释,至少仅靠复制粘贴无法真正理解这种分层图形语法的工作原理。
你的每个图层都有五个要素,即我们讨论过的五个:数据、美学、几何对象、统计变换和位置调整。但我们不必总是使用layer函数来指定所有这些进行渲染。例如,在这种情况下,我们可以使用geom_col来简化为柱状图的创建。


默认情况下,geom_col会为我们设置几何对象、统计变换和位置调整。它使用恒等变换作为统计和位置。因此,我们可以像这样编写整个图层部分:ggplot() + geom_col(),然后设置数据和美学映射。就这样,我们得到了完全相同的图表。


尽管这样写起来简单得多,但它向你隐藏了底层发生的一些事情。了解layer函数的工作原理很重要,因为有些你想使用的几何对象并没有对应的辅助函数。
课程总结
本节课中我们一起学习了如何创建我们的第一个图表——柱状图。我展示了如何排序因子、如何改变ggplot渲染柱状列表的方式,以及如何将三种不同的美学值映射到图表中有意义的转换上:本例中的X轴、Y轴和条形的颜色。
我们没有过多讨论坐标轴或图例的标签。ggplot自动从我们的因子水平中推断出了这些信息。
我们还进一步了解了R的内部工作原理:首先,read_csv允许我们在加载数据时以相当直接的方式设置列数据类型。在实践中,你可能会发现不会一开始就加载因子,这没关系。还有其他数据类型,如日期和时间,我们将在未来的课程中探讨这些。
此外,我们讨论了当需要处理数据时,将tibble转换为向量的重要性。起初这可能看起来不直观,但你会逐渐掌握它。只需密切关注右上角的环境面板,以了解你正在使用的数据结构。
最后,我特意向你展示了使用反引号处理包含特殊字符(如空格)的列名的繁琐语法。我从不使用这种格式处理数据,加载数据后会立即清理列名。但我希望你能意识到这一点。我将在未来的课程中向你介绍一个有助于数据清理这一环节的包。
😊




5:ggplot功能深度探索 🎨


在本节课中,我们将深入学习 ggplot2 包的一些核心功能,特别是图层系统的运作方式。我们将通过一个宠物许可数据集,探索如何创建散点图,并理解数据清理与可视化之间的衔接。
数据准备与清理

上一节我们介绍了 ggplot2 的基础语法,本节中我们来看看如何为绘图准备数据。
首先,我们需要加载必要的包并导入数据。
library(tidyverse)
library(janitor)
library(lubridate)
pets_data <- read_csv("pets_data.csv", col_types = cols(`License Issue Date` = col_date())) %>%
clean_names()
janitor 包的 clean_names() 函数将列名转换为“蛇形命名法”(snake_case),即所有字母小写并用下划线分隔单词。另一种常见的命名法是“驼峰命名法”(camelCase),即每个单词首字母大写且无空格。

接下来,我们处理日期列。日期数据在编程中处理起来可能很复杂,因为格式多样。lubridate 包提供了便捷的解析函数。
pets_data$license_issue_date <- mdy(pets_data$license_issue_date)

这里,mdy() 函数根据“月-日-年”的顺序解析日期。数据清理,尤其是处理日期和缺失值,是数据分析的关键步骤。
创建散点图
一个常见的探索性数据分析技术是使用散点图比较两个变量。这需要连续型或有序数据,因为X轴和Y轴的值是顺序排列的视觉元素。

我们的数据集只有一个连续变量(日期)。为了演示,我们将使用许可证号(license_number)作为另一个连续变量,并过滤掉无法转换为数字的行。
以下是准备绘图数据的步骤:
- 选择相关列:提取日期和许可证号。
- 转换数据类型:将许可证号从字符串转换为数字,无法转换的将变为
NA。 - 移除缺失值:过滤掉任何一列中存在
NA的行。

license_data <- pets_data %>%
select(license_issue_date, license_number) %>%
mutate(license_number = as.numeric(license_number)) %>%
na.omit()
na.omit() 是一个基础R函数,它会移除数据框中任何包含 NA 值的整行。这比手动检查每一列更高效。但请注意,删除数据会影响分析结果,必须向利益相关者说明。

理解ggplot的图层系统
现在,让我们用清理好的数据绘制散点图。在 ggplot2 中,散点图使用 geom_point() 几何对象创建。

ggplot2 的图表是分层构建的:
- 基础层:由
ggplot()函数创建,通常用于指定数据和全局的美学映射(aesthetic mappings)。 - 几何对象层:由
geom_*()函数(如geom_point())添加,用于指定具体的图形类型。
基础层中的参数(如数据和美学映射)对其上方的图层是可见的,除非在更高层被显式覆盖。

ggplot(data = license_data, aes(x = license_issue_date, y = license_number)) +
geom_point()
在这段代码中,我们将数据和X、Y轴的美学映射放在了 ggplot() 基础层中。geom_point() 层会自动继承这些设置,因此我们无需重复指定。
从生成的散点图可以看出,许可证号与颁发日期之间没有明显的顺序关系,小号和大号许可证在整个时间范围内都有颁发。

知识巩固与实践

更重要的是,这是我们第一次深入讨论 ggplot2 中图层的交互。通常的做法是在基础层提供数据和美学映射,然后在上面叠加具体的图形图层。
以下是几个供你实践的问题,建议暂停课程,在RStudio中尝试:
- 如果将美学映射放在
ggplot()调用中,而geom_point()调用为空,会发生什么? - 如果完全省略
geom_point()函数,会发生什么? - 你能用之前提到的
layer()函数重现我们刚刚制作的图表吗?
总结


本节课中我们一起学习了 ggplot2 的更多功能。我们实践了使用 janitor 和 lubridate 包进行数据清理,理解了 na.omit() 等函数在处理缺失值时的作用。最关键的是,我们深入探讨了 ggplot2 的图层系统,明白了如何通过 ggplot() 基础层设置全局参数,并由上层的几何对象继承,这使得代码更加简洁和模块化。掌握这些概念将帮助你构建更复杂、更精美的数据可视化图形。
6:折线图绘制方法 📈

在本节课中,我们将要学习如何使用R语言中的ggplot2包来创建折线图。折线图是连接散点图中各个点的线段,它能帮助我们直观地观察数据随时间或其他连续变量变化的趋势。我们将使用宠物注册数据作为示例,并学习如何在图表中动态计算频率、调整坐标轴范围以及按类别区分数据。

概述
折线图是一种基础但强大的数据可视化工具,特别适用于展示时间序列数据或连续变量上的趋势变化。在公共部门数据分析中,识别数据趋势对于分析、评估和预测至关重要。本节我们将从基础折线图开始,逐步学习如何通过ggplot2的图层语法来定制和增强图表。
绘制基础折线图

上一节我们介绍了散点图,本节中我们来看看如何创建折线图。我们将使用清理后的宠物注册数据,其中X轴为日期,Y轴为每日的注册数量。
以下是创建基础折线图的步骤:

- 首先,我们使用
ggplot()函数建立基础图层,并指定数据和X轴的美学映射(aes)。 - 然后,我们添加
geom_line()几何对象层来绘制线条。为了直接计算每日注册频率,我们可以在geom_line()中使用stat = "count"参数,这样ggplot2会自动统计每个日期的数据点数量。
对应的R代码如下:
ggplot(data = clean_data, aes(x = license_date)) +
geom_line(stat = "count")
这段代码会生成一个显示宠物注册数量随时间变化的折线图。从图中可以观察到,2020年之前的注册数量很少,而之后则出现了有趣的峰值。
按类别区分并调整坐标轴
为了更深入地分析,我们可能需要比较不同宠物类别(如猫、狗)的注册趋势。同时,为了更清晰地观察近期趋势,我们可以将X轴的范围限制在2020年之后。
以下是实现这两个目标的步骤:

- 在
geom_line()的美学映射中,通过color = species参数,用不同颜色线条区分不同物种。 - 使用
scale_x_date()函数来调整X轴的比例尺,通过limits参数设置起始日期为“2020-01-01”,结束日期为NA(表示使用数据的自然终点)。

对应的R代码如下:
ggplot(data = clean_data, aes(x = license_date)) +
geom_line(aes(color = species), stat = "count") +
scale_x_date(limits = as.Date(c("2020-01-01", NA)))
现在,我们得到了一张按宠物类型区分颜色的折线图,并且X轴从2020年开始,清晰地展示了不同物种注册频率随时间的变化趋势。
聚焦特定数据段进行分析

在公共部门数据分析中,经常需要放大数据的特定部分以进行更细致的趋势分析。例如,我们可能想观察2021年夏季几个月中狗的注册情况。
以下是实现数据筛选和视图聚焦的方法:
- 使用
dplyr包的filter()函数,从数据中筛选出物种为“狗”的记录。 - 通过管道操作符
%>%将筛选后的数据直接传递给ggplot()。 - 在
scale_x_date()中同时设置起始和结束日期,以“放大”观察特定时间段。
对应的R代码如下:
clean_data %>%
filter(species == "dog") %>%
ggplot(aes(x = license_date)) +
geom_line(stat = "count") +
scale_x_date(limits = as.Date(c("2021-06-01", "2021-09-01")))
通过这张放大的图表,我们可以更清楚地看到狗类注册在2021年夏季呈现出一种有规律的、月初出现峰值的趋势。这可能与人们的支付周期、机构处理表格的时间等因素有关。
总结
本节课中我们一起学习了折线图的绘制方法。我们从创建基础折线图开始,逐步掌握了如何利用ggplot2的统计变换功能动态计算频率、如何通过颜色美学映射来区分不同类别的数据,以及如何使用比例尺函数来调整坐标轴范围以聚焦于特定的数据区间。


通过这一周的学习,我们已经掌握了使用ggplot2创建柱状图、散点图和折线图的能力,并理解了图层语法图形的核心思想。这为我们探索更复杂的数据可视化技术奠定了坚实的基础。虽然内容密集,但图形语法为我们提供了一种结构化、非魔法的描述信息可视化方式,这将帮助我们在后续课程和实践中不断巩固和深化这些技能。
7:数据可视化在公共管理中的战略价值 📊


我是Paula Lance教授,很高兴能参与你在这门课程中的学习。
众所周知,R语言在探索性数据分析和创建数据可视化方面非常强大。然而,让我们暂时从编程中退一步,首先提醒自己为什么这项工作如此重要。数据和信息对公共行政的所有核心职能都至关重要。正如我希望你记得的,我们之前讨论过政府行政或执行部门需要履行的关键职能,包括规划、组织、人员配备、指挥、协调、报告以及预算编制。这些职能既独立执行,也以重要的组合形式进行。数据和信息对所有职能都至关重要,在政府内部和向公众沟通数据时也同样关键。
让我们快速浏览几个简单的例子,以便更清楚地理解这一点。


报告职能 📈
公共行政的报告职能涵盖范围很广,包括政府被要求分享或报告信息的各种方式,无论是内部还是向公众。
报告职能对于理解趋势、进展、公共产品或重要社会问题的持续状况也至关重要。
以下是报告职能的两个例子:
- 教育成就趋势图:这张图表显示了从1968年到2018年,美国全国以及黑人人口的高中辍学率和大学入学率的长期趋势。图表涵盖了很长一段时间内的许多信息,包括与种族教育平等趋势相关的数据。
- 印度孕产妇死亡率信息图:这张信息图分享了许多有趣的信息,包括易于阅读的饼图,并显示了孕产妇死亡率的下降趋势。然而,这个比率仍未达到203年的既定目标,这也是信息的一部分。




因此,设计精美的信息图可以非常高效有效地传达或报告大量信息。
指挥与规划职能 🗺️
上一节我们看到了数据可视化如何服务于报告职能。本节中,我们来看看它在指挥和规划职能中的应用。
这张地图通过一个五点量表,显示了整个南美大陆各国的道路安全水平。然而,图表还特别突出了巴西,显示虽然巴西作为一个整体道路安全水平处于平均,但国内不同地区实际上存在巨大差异。理解这些差异,以及那些道路状况被评为“差”或“最差”的大片地理区域,应有助于巴西行政管理人员将资源引导到最需要的地方。
来自选民和公民的调查数据,包括公众舆论数据,对政府的行政规划职能非常重要。这张图包含了许多信息,它展示了28个国家的条形图信息。但这实际上是一种视觉上比较调查数据(在本例中是公众舆论数据)在不同人群(在本例中是不同国家)中响应分布的好方法。通过这种视觉呈现,我们的眼睛可以比仅有一堆数字或百分比的表格更容易地理解不同国家间调查响应的范围和分布。





人员配备与预算职能 📊
在规划职能之外,数据可视化同样对人员配备和预算编制至关重要。
这张图显示了加利福尼亚州需要更新驾驶执照的客户在上一个财政年度如何获得该服务:他们要么亲自到现场办公室办理,要么通过互联网或邮寄办理。这种对不同驾照更新方法相对使用情况的可视化,有助于管理人员确定如何最好地分配资源以优化用户服务及其体验。



最后一张条形图是预算和报告职能的一个例子,其中澳大利亚政府正在沟通五个财政年度不同类别的公共支出水平。这种格式使我们能够看到哪些是较大的支出类别,以及它们如何随时间波动。我们还可以从图中看到,当新冠疫情经济响应支出冲击预算时发生了什么。同时请注意,该图显示了每年的绝对支出金额,而不仅仅是像饼图那样显示百分比。虽然饼图是政府报告支出的常用方式,但它们只显示相对百分比或每个类别中“饼块”的大小,而不是整个“饼”的大小可能增加或减少的方式。



总结
我可以展示更多例子,但这里只给出几个非常简单的。主要观点是,探索性数据分析和数据可视化对公共行政的所有核心职能都很重要。





在本节课中,我们一起学习了数据可视化在公共管理中的战略价值。我们回顾了公共行政的核心职能,并通过具体案例看到,清晰有效的数据可视化如何服务于报告、指挥、规划、人员配备和预算编制等关键环节。无论是追踪长期社会趋势、分配有限资源、理解公众意见,还是透明化财政支出,良好的数据呈现都是支持公共决策和沟通不可或缺的工具。
8:本周补充:异常趋势EDA案例研究 📈

在本节课中,我们将通过一个来自美国密歇根州的真实案例,学习探索性数据分析在公共部门中的重要性。这个案例展示了即使是最简单的数据分析,也能揭示出行政系统中的重大问题,并对成千上万人的生活产生深远影响。
案例背景:密歇根州失业救济金系统
上一节我们介绍了探索性数据分析的基本概念,本节中我们来看看一个具体的应用案例。故事发生在密歇根州的失业救济保险机构。该机构的主要职责是为非因自身过错(如裁员或规模缩减)而失业的个人提供临时经济援助。公共管理的核心原则,特别是经济性和效率性,对该机构至关重要。因为失业救济金来源于向雇主征收的税款,并且管理该计划也需要公共资源,所以机构致力于尽可能避免欺诈、浪费和滥用。
新系统上线与问题初现

2013年,密歇根州像许多其他政府一样,实施了一套新的、升级的自动化政府信息和行政系统,名为MiDAS。MiDAS系统整合了失业救济保险机构的各项工作,包括向雇主征税、评估申请人的资格以及向受益人支付索赔。MiDAS使用多种不同的程序和算法来处理诸多事务,其中就包括标记潜在的欺诈案件。
2014年,就在新的MiDAS系统上线后不久,全州各公共援助法律诊所的律师们开始注意到,声称被州政府指控或判定犯有失业救济保险欺诈的人数有所增加。MiDAS系统向正在领取失业救济金的人们发出了大量信件,指控他们存在欺诈行为。这些信件还给出了非常短的期限,要求他们要么对指控提出上诉,要么偿还所谓的“欺诈”款项,否则将被处以四倍于被指控金额的罚款。当时出现了许多传闻和担忧。
数据探索揭示惊人趋势
直到密歇根大学的一些同事听说了此事,并决定查看数据以了解实际情况。他们与州政府的工作人员合作,获取了一些数据,并进行了非常简单的探索性数据分析。
以下是分析的核心结果,通过一个极其简单的图表展示:
# 伪代码:绘制年度欺诈指控数量趋势图
plot(fraud_accusations ~ year, data = michigan_data, type = "l", main = "失业救济保险欺诈指控数量年度趋势")
图表清晰地显示,从2013年到2015年,欺诈指控的数量急剧上升,而这恰好与切换到新的MiDAS行政信息系统的时间点完全吻合。
深入分析:排除其他可能性



我们首先需要考虑导致这种趋势的可能原因。例如,是否同时期失业案件数量本身也在激增?然而,另一张简单的图表显示,自2010年以来,包括2013年至2015年在内,全州的失业率一直在稳步下降。因此,失业救济金申请数量的增加并不是驱动欺诈指控激增的原因。
更广泛的探索性数据分析揭示,在新的MiDAS系统投入使用后,欺诈指控数量增加了500%。在2013年至2015年间,这导致该州有40,000人被错误地指控犯有失业救济保险欺诈,这个数字占到了指控总数的90%。
问题根源:算法缺陷

显然,用于识别欺诈的算法存在问题。由于该算法未公开,我们无法确切知道其中具体出了什么问题。但一种普遍的看法是,过去仅作为需要进一步调查的“警示信号”(例如某人是否是主动辞职而非被裁员),在新算法中被直接当作了欺诈的证据。

目前,州政府无人对此事发表评论,因为一场由众多受害者提起的集体诉讼正在进行中,尚未解决。
案例启示与经验教训
尽管如此,这个事件已经为我们提供了一些关键的经验教训:
首先,这是对政府自动化行政数据系统的一个深刻警示。算法及其协议需要经过非常谨慎的设计和测试。

其次,数据分析应用于寻找新系统测试和实施时发生的任何变化或异常。这种探索性数据分析应该是持续进行的,例如每周、每两周或每月一次,以便在新系统上线时及时发现问题,而不是等待年度数据来发现系统故障。
第三,正如本案例所表明的,数据系统的问题会对个人及其家庭产生深远影响。在本案中,许多人因害怕复合罚款,向州政府偿还了他们本不欠的数千美元;同时,应得福利的人却没有收到。这些问题不仅影响了真实的人和家庭,造成了严重的困难,也使政府面临极高的诉讼风险。
最后,持续性的探索性数据分析及其可视化对于所有行政职能都至关重要。而草率的设计和误用可能会对这些职能产生严重的负面影响。
总结



本节课中,我们一起学习了探索性数据分析在公共部门中的一个关键应用案例。通过分析密歇根州失业救济系统在引入新自动化系统后的数据,我们看到了一个简单的趋势图如何揭示出严重的系统缺陷和算法问题,这些问题导致了大规模的错误指控,并对民众生活造成了实质伤害。这个案例强有力地证明了,持续、简单的数据探索是保障公共行政系统公平、高效运行不可或缺的工具。
9:公平性作为公共管理核心原则 👁️


在本节课中,我们将探讨探索性数据分析和数据可视化在公共管理四大核心原则之一——公平性——中的重要性。我们将学习公平性视角的定义,并区分几个关键但易混淆的概念:差异、差距、不平等与不公平。
上一节我们介绍了探索性数据分析在公共管理核心职能中的重要性,本节中我们来看看它在公平性原则中的应用。
公平性视角的定义

公平性作为公共管理的四大支柱之一,要求我们使用“公平性视角”来审视问题。其定义如下:

公平性视角意味着,在审视社会问题的定义与框架、公共政策议程、潜在政策解决方案以及政府机构、项目和公共物品的管理时,需要采用一种深刻考虑偏见、歧视和压迫影响的视角。这些影响与性别、民族或文化、种族、宗教、年龄、地理区域或任何其他导致资源、机会和权利保护获取上产生不公平差异的社会因素相关。
核心概念辨析
以下是几个与公平性相关且常被混用的核心概念,它们虽有重叠,但也存在重要区别。



- 差异:指不同子群体、人群或社区之间相互区别的方式。这些差异通常通过描述性数据以非规范性的方式理解,意味着仅描述差异本身,而不对其做出任何价值判断。
- 差距:指不同子群体之间的差异,但这些差异被理解为是由个体自身偏好之外的因素驱动的,例如资源、机会、歧视等方面的不同,而非个人选择。
- 不平等:指被认为不公平、不公正的结果差异,因为它们不相等或不同。
- 不公平:指在投入和结果两方面存在的差异,这些差异之所以被认为不公平或不公正,是因为在获取实现平等所需的资源、机会、环境和待遇上存在差别。
平等与公平的对比
这些概念可能有些令人困惑,让我们通过对比“平等”与“公平”来进一步理解。

平等是指每个个体、群体或社区拥有相同的资源、机会、待遇和结果。在公共部门,我们关心的许多重要事物是平等或相同的。


公平则认识到个体、群体和社区所处的环境不同,并据此分配或维护每个人为实现平等结果所需的资源、机会和体验。
正如美国民权活动家德雷·麦凯森所解释的:“平等是每个人都得到相同的东西,而公平是每个人都得到他们需要和应得的东西。”
数据分析的角色
公共部门的数据分析师经常被要求探索数据中的差异和差距。这类探索性数据分析和数据可视化应尽可能客观、详细和清晰地进行。数据应揭示差异和差距的幅度、方向甚至随时间的变化。
数据经过探索和呈现后,才进入解释阶段。将差异解释为不平等或不公平,涉及价值观以及关于应得性和公平性的观念。

此外,若要从权利角度解释差异,需要理解公民权利与人权的区别。公民权利是由政府宪法和法律体系所维护的权利;而人权则是基于普遍的道德伦理准则赋予全人类的、更具交叉性的权利观念。
哲学中有一个基本观念:权利与责任相伴而生。如果有人拥有一项权利,那么其他实体就有责任维护这项权利。就政府和公共部门而言,政府有责任维护的唯一权利是公民权利,即通过正式政策和法律编纂的权利。
因此,在公共部门数据分析中,从显示差异和差距的数据过渡到关于不平等和不公平的论断,会变得更加棘手。但关键在于,大多数政府(虽非全部)的设计初衷是关注公平性,而数据有助于它们做到这一点。正是数据分析和数据可视化,清晰地揭示了社会公平与不公平问题。
一个经典图示:平等、公平与正义

让我们以一个试图说明平等、公平以及正义之间区别的图示来结束本节。正义包含了政府为应对不公平所能采取的行动。
该图示的第一块面板描绘了三个人试图在栅栏后观看棒球比赛的情景,它展示了平等,但也揭示了一个有缺陷的假设:即当每个人获得相同或平等的资源、支持或待遇时,每个人都能受益。在此案例中,待遇是尺寸完全相同的箱子,用于垫脚以看到栅栏另一边。这种平等的支持或待遇并未产生平等的结果,因为右边最矮的人仍然无法越过栅栏看到比赛。这里存在支持上的平等,但结果却不平等。
中间的面板展示了每个人获得观看比赛所需的东西。第一个人什么也没得到,因为他已经能看到比赛;第二个人获得了一个能帮助他看到栅栏另一边所需高度的箱子;第三个人则获得了一个更高的箱子以帮助他观看。这种待遇上的不同或不平等,正是实现公平的途径。
然而,最后还有重要的一点。最后一块面板显示,三个人在观看比赛时,木栅栏已被移除。那个对不同人造成不同程度问题或障碍的屏障被主动拆除了。现在取而代之的是一个链式围栏,它既能保护人群,又能让每个人看到比赛。在这个类比中,移除结构性障碍被称为正义。所有人现在无需额外的支持或便利就能实现观看比赛的目标,因为不公平的根源得到了解决。
这只是一个类比,用以阐释平等、公平以及解决不公平根源、移除结构性障碍这些概念。
总结



本节课中,我们一起学习了公共管理中的公平性原则。我们定义了“公平性视角”,并区分了差异、差距、不平等与不公平这几个核心概念。通过对比平等与公平,我们理解了公平要求根据个体不同情况分配资源以实现平等结果。最后,我们通过一个经典图示,形象地理解了平等、公平与正义(即移除结构性障碍)之间的区别,并认识到数据分析和可视化在揭示和解决社会公平问题中的关键作用。
10:典型案例:数字公平性分析 📊


在本节课中,我们将要学习数字公平性这一公共部门的重要议题,并探讨如何通过探索性数据分析和数据可视化来理解其中的差异与不平等。
上一节我们讨论了公平与平等在公共部门中的重要性。本节中,我们将聚焦于一个具体问题:数字公平性。
什么是数字公平性? 🌐


数字公平性被定义为所有个人和社区都拥有充分参与教育、经济、民主及社会各方面所需的信息、技术和能力的条件。互联网接入通常被视为一种公共品。
希望您还记得第一门课程中对公共品的定义:公共品是指对社会和人群具有社会效益的事物。公共品还具有非竞争性,即一部分人的使用不会减少供应或剥夺他人的使用机会。同时,公共品应广泛普及,具有非排他性,即不会排除特定人群或亚群体。
然而,在数字资源方面,目前的情况并非如此。这正是人们致力于采取必要措施以实现数字公平的主要原因。
数字公平性的构成要素 📱
以下是数字公平性或数字包容性的几个关键要素:
- 可负担且稳定的宽带互联网接入。
- 接入互联网连接设备,如智能手机、电脑和平板电脑。
- 获取应用程序和其他资源,以增强工作、教育以及各种协作与联系。
- 支持,包括技术支持、用户体验支持和广泛的公共教育。
数据可视化对于理解数字公平性的水平和趋势至关重要。接下来,我们快速浏览一些示例。
数据可视化案例解析 🗺️
以下是几个用于揭示数字公平性问题的数据可视化示例。
- 全球互联网接入地图:这张2019年的地图显示了世界各国人口接入互联网的百分比。它清晰地展示了在疫情爆发前,数字不平等问题最严重的地区,其中整个非洲大陆和东南亚部分地区最为突出。
- 多国数字接入条形图:这张由皮尤基金会制作的图表,针对选定国家展示了三个不同的数字接入指标:声称使用互联网且家中有接入的成年人百分比、声称使用互联网但家中无接入的百分比,以及声称不使用互联网的成年人百分比。
- 印度各州宽带订阅率地图:这张地图通过颜色显示了印度各州每百人宽带订阅率的不平等状况,绿色调的州订阅率最低。
- 芝加哥社区互联网接入率地图:芝加哥市制作的地图显示了每个社区拥有互联网接入的家庭百分比。颜色越深表示接入水平越低,图例从深蓝色到黄色,代表了55%到近100%的社区覆盖率。这张图清晰地展示了芝加哥各社区间存在的数字鸿沟。
- 巴西宽带增长与类型条形图:这张条形图不仅显示了巴西宽带订阅量随时间已实现和预计的增长,还展示了所使用的宽带平台类型的百分比分布。请注意,该图包含了截至2019年的已收集数据和未来的预测。
- 美国智能手机、平板电脑拥有率及社交媒体使用趋势图:展示了这些指标在美国随时间的变化。
- 美国县收入与互联网接入散点图:显示了美国各县收入与互联网接入之间的相关性,并通过颜色高亮了城市、郊区和农村地区在此关系上的差异。



公共数据与互动探索 🔍
最后,请注意一个关于数字公平性数据日益公开化的例子。在美国,有一个互动网站为每个州提供数字公平性记分卡。这些记分卡包含多种指标,如数字技能需求、州人口相关培训问题、劳动力问题,以及州政府是否制定并实施了解决数字不平等问题的战略计划。这是一个有趣且互动的数据集,鼓励您花时间探索。
总结与核心要点 📝


本节课中,我们一起学习了数字公平性分析。
- 如果基础信息技术和互联网接入是一种公共品,那么政府应努力实现接入和使用上的平等。每个人都应有机会接入,并能利用互联网的力量。
- 显示接入和使用方面存在不平等的数据,对这些努力至关重要。
- 最后,数字公平性涉及为社区和个人提供的,并非完全一模一样的东西,而是在特定时刻为实现这一公共品成果平等目标所需的支持。




通过本课的学习,我们了解到数据可视化是揭示和理解数字鸿沟、推动制定有效干预措施的强大工具。
11:公共卫生公平性重要性:Joneigh Khaldun博士访谈 🩺


在本节课中,我们将通过Joneigh Khaldun博士的访谈,探讨公共卫生领域的公平性概念、挑战以及数据在推动公平性工作中的核心作用。
概述:公平性的核心原则
在公共服务中,效率、经济、效果和公平是核心原则。本次对话将聚焦于公平这一原则,探讨其在公共政策、服务和项目中的含义与实践。
公平性的定义与重要性

上一节我们介绍了课程的核心原则,本节中我们来看看Joneigh Khaldun博士如何定义公平性。
公平性意味着确保每个人都有平等的机会,尽可能获得健康。这承认了一个现实:由于机会和资源的不同,以及社会将人群分类并区别对待,导致了健康不平等和差异。因此,公平性关乎于无论个人身份、居住地或信仰如何,都应拥有平等的健康机会。

从政策角度看,这意味着理解并非所有人都拥有同等资源,并思考如何分配资源、支持社区,以及如何真诚地让社区参与决策,承认社区自身就是专家。
公共部门在解决公平性问题时面临的挑战
理解了公平性的定义后,我们来看看公共部门在识别和解决不平等问题上面临哪些主要挑战。
健康不平等往往由社会不平等驱动,这在环境、教育和食品等其他政府服务领域也是如此。最大的挑战在于追溯根本原因,理解差异化的待遇和资源获取途径。
解决不平等问题需要将健康公平性有意识地嵌入到所有工作中。这意味着在审视任何质量指标或提案时,都应自问:历史上被边缘化的社区(如种族/族裔少数群体、残障人士、老年人、农村居民)受到了何种影响?我们如何将他们纳入解决方案的制定过程?
这种工作方式的转变是具有挑战性的,因为它要求改变各部门(包括公共和私营部门)惯常的工作模式。公平性不能只是一个独立项目,它必须成为一个核心支柱和原则,整合到所有事务中。
数据在推动公平性工作中的强大作用
认识到挑战后,我们来看看数据如何在这一工作中扮演关键角色。
数据常常不完整或缺失,例如关于少数族裔、残障人士或城乡差异群体的健康洞察。因此,任何组织工作的基础是努力标准化和增加数据收集,并创建仪表板来理解数据。
然而,拥有不完全的数据不应成为不采取行动的借口。数据本身不会带来改变,关键在于如何利用数据、讲述故事,并让其指导项目和政策的制定。
以下是利用数据推动公平性工作的核心步骤:
- 收集与标准化数据:努力获取关于不同社区群体的数据。
- 分析与可视化:创建仪表板,从公平性视角理解数据。
- 指导行动:让数据引导具体的项目和政策开发,而不仅仅是为了拥有数据。
向决策者有效传达数据
拥有了数据,下一步是如何有效地将其传达给掌控资源或政策的决策者。
向决策者传达数据时,需理解他们的宏观目标及其选民关心的问题。大多数决策者并非数据科学家或医生,因此沟通需要简洁明了。

有效的沟通策略包括:
- 使用图表:一图胜千言。
- 提炼要点:任何图表都应能提炼为三句话以内的核心信息。
- 关联行动:阐述数据展示了什么、数据的局限性、这意味着什么,以及可采取的一到三个具体行动方案。
- 使用通俗语言:避免使用数据分析术语,使用听众能理解的语言。
案例研究:利用邮政编码数据解决婴儿死亡率问题
让我们通过一个具体案例,看看数据如何指导有针对性的行动。

在底特律市解决婴儿死亡率问题时,我们分析了邮政编码层级的数据。数据显示,不同邮政编码区域的婴儿死亡率不同,且根本原因也不同。
例如,在某个邮政编码区域,主要问题是婴儿安全睡眠;而在另一个区域,主要问题是早产。这些数据帮助我们确定了策略的针对性投放地点,使我们能够基于不同区域的根本问题来定制解决方案,而不仅仅是笼统地应对“婴儿死亡率”问题。
给未来公共部门数据分析师的建议


最后,对于有志于进入公共部门数据分析领域,并同样关注公平性这一核心支柱的学习者,Joneigh Khaldun博士给出了建议。


无论身处何地,重要的是理解你所服务的人群以及所在部门的核心工作。数据始终关乎于人,以及你用它来做什么。
不要仅仅提交一份文件或图表。要始终能够阐述:“这是数据讲述的故事,这是它告诉我们的信息,这是因此需要采取的行动。” 记住,数据分析工作始终关乎于人和实际影响,这一点至关重要。
总结



本节课中,我们一起学习了公共卫生领域的公平性概念。我们探讨了公平性的定义、公共部门在实现公平性时面临的挑战,以及数据在识别和解决不平等问题中的关键作用。我们学习了如何向决策者有效传达数据,并通过婴儿死亡率的案例看到了数据如何驱动有针对性的行动。最后,我们牢记,所有数据分析工作的核心都应服务于人,并导向有意义的行动。
12:趋势线基础绘制方法 📈
在本节课中,我们将学习如何扩展探索性数据分析技术,重点聚焦于趋势分析。我们将回顾趋势这一主题,并学习如何使用R和ggplot2来可视化数据中的趋势,特别是时间序列数据中的趋势。课程将涵盖数据清理、基础绘图、美化图表以及添加统计模型趋势线等核心步骤。
概述
在公共部门,计算和比较趋势是一项非常常见的任务。我们经常需要创建图表来展示随时间变化的趋势,例如在第一次作业中或使用宠物数据所做的那样,并用它来比较几个不同的群体。一个独立但高度相关的需求是根据趋势进行预测,以便制定政策。这需要为我们的数据建立一个统计模型,然后将其投射到未来的某个时间点,以预测可能发生的情况。本节课,我们将使用上周作业中的预期寿命数据,探索如何用ggplot2可视化数据并添加趋势线。
数据准备与基础绘图
首先,我们需要导入必要的库并清理数据。我们将使用tidyverse和janitor包,并按照作业中的参数过滤数据,以获取印度的预期寿命数据。
# 加载必要的库
library(tidyverse)
library(janitor)
# 导入并清理数据
data <- read_csv("your_data_file.csv") %>%
clean_names()

# 过滤数据:所有地区、所有种族、所有居住类型、出生时预期寿命、国家为印度
filtered_data <- data %>%
filter(region == 0, ethnicity == 0, age == 0, type_lt_foreign_residents == 0, country == "India")
接下来,我们使用ggplot2创建一个基础折线图,将年份放在X轴,预期寿命放在Y轴,并根据性别用不同颜色区分线条。
# 创建基础折线图
base_plot <- ggplot(data = filtered_data, aes(x = year_one, y = e_x, color = sex)) +
geom_line()
# 显示图形
print(base_plot)

生成的图表功能上正确,但直接展示给决策者还不够美观。标签直接来自数据列名,不够人性化。
美化图表标签

为了使图表更易于理解,我们需要改进坐标轴和图例的标签。有两种主要方法:直接修改数据,或者使用ggplot2的函数修改标签。这里我们将演示后者。
首先,我们可以创建一个函数来重命名“性别”因子水平的标签,使其显示为“男性”和“女性”,而不是数字代码。
# 创建一个函数来重命名性别因子水平
relabel_sex <- function(factor_levels) {
new_levels <- c()
for (level in factor_levels) {
if (level == 1) {
new_levels <- c(new_levels, "男性")
} else {
new_levels <- c(new_levels, "女性")
}
}
return(new_levels)
}
# 应用函数并更新绘图对象
ggi_india <- base_plot +
scale_color_discrete(labels = relabel_sex(levels(as.factor(filtered_data$sex))))
# 显示更新后的图形
print(ggi_india)
虽然上述方法展示了R的基础编程功能,但使用forcats包中的函数通常更快捷。不过,了解如何编写自定义函数有助于深入理解R的工作原理。
现在,让我们使用labs()函数来设置更清晰的标题和坐标轴标签。
# 添加标题和坐标轴标签
ggi_india <- ggi_india +
labs(
title = "印度出生时预期寿命",
caption = "数据来源:马克斯·普朗克人口研究所",
x = "年份",
y = "出生时预期寿命(年)"
)
# 显示图形
print(ggi_india)
图表现在看起来专业多了。接下来,我们处理图例。图例值自动从数据中提取,我们可以通过labs()函数直接为颜色美学(color aesthetic)设置标签。
# 为颜色美学(即性别图例)设置标签
ggi_india <- ggi_india +
labs(color = "性别")
# 显示最终图形
print(ggi_india)

现在,我们得到了一个清晰、美观的图表,适合展示给决策者。
添加统计趋势线
上一节我们介绍了如何创建和美化基础的趋势图表。本节中,我们来看看如何在图表上添加统计趋势线,以更直观地展示数据的整体变化方向。

统计模型是数据中不同变量之间关系的一组集合,我们可以用数学公式来表达。虽然本课程不深入探讨不同模型背后的数学细节,但我们将探索如何使用ggplot2及其图形语法在我们的绘图数据之上可视化一个模型。

在ggplot2中,我们可以使用geom_smooth()函数轻松添加趋势线。该函数默认使用局部加权回归(LOESS)方法为数据拟合一条平滑曲线。对于时间序列数据,我们也可以使用线性模型(method = "lm")来拟合一条直线趋势线。
以下是添加线性趋势线的方法:
# 在现有图表上添加线性趋势线
ggi_india_with_trend <- ggi_india +
geom_smooth(method = "lm", se = FALSE, aes(group = 1)) # se=FALSE 表示不显示置信区间
# 显示带趋势线的图形
print(ggi_india_with_trend)

method = "lm":指定使用线性模型。se = FALSE:不绘制置信区间带,使图表更简洁。aes(group = 1):这是一个重要的参数,它告诉ggplot2将所有数据点视为一个组来拟合一条整体的趋势线,而不是为每个性别分别拟合一条线。如果你想为每个性别分别拟合趋势线,可以省略这个参数。
添加趋势线后,图表能够更清晰地显示出预期寿命随时间变化的总体上升趋势。

总结



本节课我们一起学习了趋势线的基础绘制方法。我们从数据导入和清理开始,创建了展示印度分性别预期寿命随时间变化的基础折线图。接着,我们通过重命名因子水平和使用labs()函数,显著改善了图表的可读性和专业性。最后,我们使用geom_smooth()函数为图表添加了统计趋势线,这有助于揭示数据背后的整体模式,为决策提供更直观的支持。掌握这些技能,你将能更好地在公共部门的数据分析工作中进行有效沟通和数据可视化。
13:趋势线深度解析与高级应用 📈

在本节课中,我们将学习如何对已绘制的图表进行深度分析,并应用高级技巧,如缩放坐标轴、格式化日期以及添加基于线性模型的预测趋势线。我们将使用印度男女人口预期寿命的数据作为示例。

图表解读与缩放
上一节我们完成了图表的绘制和标注。现在,我们可以开始解读数据的含义。
从图表中可以看出,从1900年到1975年,男性的预期寿命更高,并且两性的预期寿命总体呈上升趋势。大约在1985年之后,情况发生了变化,女性的出生时预期寿命变得更高。
为了更清晰地观察这一变化,我们可以放大图表的特定区域。这可以通过设置绘图的比例尺来实现。请记住,比例尺的设置会应用于图层的所有元素。如果我们有多个图层,它们都会被统一缩放。这一点稍后会很重要。
目前,我们的X轴数据是整数格式的年份,而非日期格式。我们可以将其转换为日期格式,也可以保持为整数。这里我们选择前者,这似乎是 lubridate 包的工作。因此,我需要加载这个包。
我们当前的数据值只是作为字符串的年份,例如“1901”代表1901年。但在R中,日期的表示至少需要包含月和日。我将手动为所有年份添加“-01-01”,使它们都对齐在每年的第一天。这意味着我需要通过拼接字符串“-01-01”来修改数据中的日期变量,然后 lubridate 可以轻松地转换它。
首先,如何获取数据?我们的绘图对象 ggi_india 将数据存储在名为 data 的变量中,而数据中的年份存储在名为 year_one 的变量里。我们可以通过 ggi_india$data$year_one 来提取年份。你可以使用环境面板来探索这个对象,查看 ggi_india 包含的其他可访问内容。这是一个非常方便的功能,我强烈建议你使用环境面板来探索创建的不同对象。
现在,old_dates 是一个包含我们字符串值的向量。接下来的问题是,如何连接字符串?在R中,我们可以使用 str_c 函数,它会将所有输入连接在一起。如果我们把日期列作为第一个参数传递给 str_c,然后传入一个我们想要添加的字符串向量,str_c 会循环使用这个字符串向量,并将其应用到数据列的每个元素上。
这里,我将调用 str_c 函数,传入所有的 old_dates(即年份向量,如1901, 1902, 1903),然后传入一个单元素向量“-01-01”。str_c 会将其与第一个元素连接,然后移动到 old_dates 的第二个元素,并循环使用这个较短的向量。我们也可以为每个日期创建一个包含所有“-01-01”的向量,但这没有必要。我们将结果赋值给 new_dates。

现在,我们可以使用 lubridate 来转换它,并将其赋值回我们的数据。我们将使用 ymd 函数,并将其直接赋值给 ggi_india 绘图对象中 data 里的 year_one 列。
如果我们现在绘图,看起来不会有任何不同,但现在我们可以将X轴限制设置为日期格式。因此,我们将使用 scale_x_date,并在此过程中全程使用日期。

这是我们的图表,我们已按日期缩放,并从1985年开始显示,一直到数据的末尾。
这里需要注意一点,两条趋势线被挤到了图表的顶部。我们没有更改Y轴比例来修正这一点。我们还需要设置Y轴的下限。此外,目前底部坐标轴只显示了三个年份,但显示更多年份可能信息量更大。我们可以告诉 ggplot2 更明确地控制这一点。但当我们添加一个新的 scale_x_date 时,它实际上会删除旧的。因此,我们也必须确保适当设置限制。
请记住,当你缩放一个坐标轴时,它会缩放你的 ggplot 内部所有图层的坐标轴。对于给定的坐标轴,你只能有一个比例尺。所以,如果你想替换或更改它,就必须替换它。

我们将Y轴的下限值设置为55,然后使用 scale_x_date 的 date_breaks 参数设置为每5年一个刻度。请记住,我们的Y轴是连续值,而不是日期,所以我们将使用 scale_y_continuous。在开始缩放坐标轴时,这一点可能会让你有点困惑。对于X轴,我们将使用 scale_x_date。我们必须始终考虑坐标轴上的数据类型。
因此,我将对 ggi_india 使用 scale_y_continuous,设置从55开始到自然上限。然后我将添加 scale_x_date,这会覆盖我们已有的那个。所以我们必须确保按照我们的意愿适当设置限制。对于 date_breaks,我们使用一个有趣的格式,尝试用英语给出格式,例如“5 years”。然后我们可以打印它。
现在,我可以比较有信心地将这个图表展示给决策者,向他们展示不仅预期寿命在增加,而且男性和女性之间的预期寿命差距正在扩大。到2013年,女性平均比男性多活约5年,平均寿命达到70岁,尽管在20世纪80年代末,两性的预期寿命大致相等,约为57或58岁。随后可以调查各种社会、经济、政策和就业问题,以试图理解造成这些差异的原因。
添加预测趋势线
决策者的主要兴趣之一是进行预测。我之前谈到了预测的技术挑战性,但我想用这些数据向你展示,如果你有一个模型,如何可视化和进行预测。
最常见的方法是为每个感兴趣的人群创建一个线性模型。在线性模型中,一个变量的输出与另一个变量直接相关。我们这里的数据非常适合线性模型,因为线条的斜率在整个长度上似乎大致恒定。

一旦确定了模型,我们就必须考虑如何将其可视化。
在 ggplot2 的图层图形语法中,这自然应该是一个新图层。因此,我们可以获取一个模型,然后将其作为一个新的 geom_line 图层绘制在这个图表之上。
但 ggplot2 实际上有一个特殊的几何对象叫做 geom_smooth,它旨在为我们创建模型并进行绘图。它有很多选项,可以节省大量时间。它还允许你指定一个已有的模型,这非常强大。
让我们看看如何在这个数据上使用 geom_smooth。
由于我逐步构建了 ggplot 对象,我想在这里重写部分代码,以便你看到一个更完整的解决方案。
首先,我必须决定在我的数据中包含哪一组日期。这很重要,因为所有那些日期的数据都将用于计算预测线,而不仅仅是渲染的数据。在这种情况下,我将从1920年开始取数据,并在我的数据集中将其设置为日期值。

我将使用与作业相同的参数集进行筛选,并再次专门查看印度的数据。你会注意到,这里我将直接使用 fct_recode 来更改因子水平。我之前展示了如何编写自定义函数来执行此操作,当然你不必编写自定义函数。因为只有几个类别,我们可以在这里直接指定它们。我还将在这里通过 mutate 操作来更改年月日格式。
在处理像这样相对较小的数据时,我喜欢将所有数据清洗和 dplyr 命令放在一个代码块中。这使我在调试 ggplot 或调整视觉呈现时,能够快速回顾并检查我对数据框的假设。
现在我们可以绘制数据了。我也会在这里进行压缩,并将性别美学映射到颜色的设置提升到基础图层,以便我们所有其他图层都可以继承它,因为我们希望颜色匹配。
因此,这里我将把所有美学映射传递到 ggplot 中:将年份作为x,预期寿命作为y,颜色映射到性别。然后,对 geom_line 的第一个调用实际上只是一个空调用,意思是“绘制那些数据”,它将继承上面的一切。


我将在 labs 中设置所有标签,包括标题、说明文字以及X、Y和颜色美学的映射。这里我完全不使用 xlab 或 ylab。然后,我将设置 scale_y_continuous 和 scale_x_date。
现在让我们渲染这个图表。
我在这里做了一些调整。首先,我将Y轴上限硬编码为90岁,因为我们要进行一些预测。当然,我也可以使用 dplyr 访问实际数据并将其保存在变量中,但为了简洁起见,我决定以这种方式更改Y轴限制。
接下来,我想更改X轴的标签。由于我想预测到2030年,我希望将日期截断为仅显示年份。我将用来更改标签的函数实际上是基础R函数 strtrim,它接受两个参数:要修剪的字符串和要保留的字符数。由于我只想显示年份,我将其修剪为前四个字符。然而,要应用这个函数,我们需要将其包装在一个只接受一个参数的函数中。这是因为 scale_x_date 计划使用的是一个只接受日期作为参数的函数。因此,我定义了一个新函数,但没有给它命名并绑定到一个变量,也没有分多行写,而是直接在这里内联定义了它。
对于趋势线,我们将使用 geom_smooth 函数。它既是一个几何对象,也是一个统计函数。它将继承基础图层的美学和数据,并且比例尺适用于所有图层,所以我们不必重复设置。相反,我们只需要考虑要显示什么。对于像这样的小数据,geom_smooth 函数将构建一个线性模型,将所有值的y映射到x。
我想告诉 geom_smooth 跨越坐标轴的整个范围,以便它绘制超出我们实际拥有的数据。在这里,我将关闭默认绘制的标准误差(通常你会需要它,我这样做只是为了清晰),然后将线条改为虚线,以便我们可以将其与实际数据的线条区分开。你看,这看似简单,但如果你打算使用预测模型或线性模型进行预测,你真的应该更详细地了解它们在做什么。这里我说的是,我想绘制一个线性模型,希望它跨越我们数据的整个范围,没有标准误差,并且我想将其更改为虚线。这很有趣,因为 method 参数可以以多种方式提供给你,作为预测模型。在未来的课程中,当我们实际演示一种更高级的、由统计学家提供的预测模型时,你会看到这一点。
现在,我们有两个图层,它们具有相同的美学映射集,因为它们继承自它们所基于的基础图层。第一个图层是 geom_line,第二个是 geom_smooth。我们这里还有一些比例尺转换,但放置它们的顺序无关紧要,因为它们影响所有图层。让我们看一下。
这是一个相当不错的基础图表,包含两个组(男性和女性)的实际数据线,以及基于线性模型的每个性别的简单预测。这很容易解释,并且给人一种感觉:到2030年,印度女性有很高的可能性拥有80岁的预期寿命,而男性的预期寿命较低,为75岁。请记住,我们看的是零岁时的预期寿命,所以这是针对2030年出生的人。此外,图表看起来不错,可读性强,你可以相对快速地为数据集中的其他国家构建类似的图表。
我希望你反思一下我们最后写的两个代码块。它们不是很漂亮吗?我们有一个管道,它读入数据,将其操作成我们可以用来回答问题的格式,并且易于维护。然后,它输入到一个 ggplot 中,该图建立在基础之上的两个图层。这些图层共享相同的数据集和美学映射,因此线图的渲染是一致的,我们不需要做任何特殊的事情来实现这一点。我们用一些全图范围的比例尺函数和标签增强了这些图层,将一个基本图表变成了一个预测工具。理解分层的图形语法使我们能够编写简洁而清晰的代码。
关于人口数据的讨论还没有结束,但我想为本周设定一个目标。你认为我们可以构建Lance博士在第一门课程中讨论的人口金字塔吗?我认为我们可以。但首先,我们必须更深入地研究如何用直方图绘制人口样本。


在本节课中,我们一起学习了如何深入解读图表、缩放坐标轴、格式化日期数据,并利用 geom_smooth 为数据添加基于线性模型的预测趋势线。这些技能对于数据分析和向决策者清晰传达信息至关重要。
14:分布分析与直方图入门 📊

在本节课中,我们将学习如何探索和理解数据的分布。数据分布是数据分析的核心概念,对于公共政策领域尤为重要。我们将从基本概念入手,并使用R语言中的实际数据进行操作。
什么是数据分布?


从高层次来看,分布就是一组频率观测值的集合。我们之前查看人口和宠物数据时,实际上已经接触过分布。在公共政策中,分布非常常见。例如,人口年龄分布可用于了解可能继续工作的劳动力比例,而财富分布则有助于理解社会公平问题以及税收或其他政策举措的效果。

为了理解分布,有几个核心概念需要掌握。如果您对这些概念感到陌生,建议您探索Coursera平台上的一些统计学入门课程。


核心概念:总体与样本
上一节我们介绍了分布的基本概念,本节中我们来看看构成分布分析基础的两个关键术语。
总体是我们感兴趣的所有可能观测值的集合。在政策领域,总体通常是所有人,但也可以是鱼类、树木或其他多样化的群体。从统计学意义上讲,总体不一定是有生命的事物。例如,我们可能对世界上的汽车总体感兴趣。然而,在公共政策中,总体通常是人。例如,美国公民的总体可能略高于3亿人。
样本是从总体中选取的一部分,我们将对其进行分析。样本通常比整个总体小得多。在上一个课程中我们看到,年度人口普查抽样调查了1%的美国人口,即每年约350万人。样本是我们将要观察和量化的群体。然后,我们将对样本进行可视化和数值分析,目的是将我们的发现推广到我们感兴趣的整个总体。
样本是否具有代表性至关重要,这是实现公平和制定良好公共政策的主要关切点。有多种技术可以处理缺乏代表性的问题。例如,分层抽样过程旨在改变数据收集方式以提高代表性,而像我们之前查看的BRFSS数据中所做的变量重新加权,则旨在数据收集后提高代表性。在本系列关于数据伦理和政治的最后一门课程中,您将看到关于此问题的更多讨论,包括我自己的研究。目前,我们假设我们的抽样方法能反映总体,因此我们的样本只是总体的一个微型版本。
样本是有限的。有时它们有限但很大,因此我们可以将其视为连续的;但通常它们有限且很小,我们会痛苦地意识到它们是多么离散。
从样本到数学模型
在统计学中,我们通常希望用数学函数来表示样本。就像我们在上一讲中看到的,这个函数可能是线性的,但通常具有更复杂或更细微的形状。函数的形状由参数控制或描述,我们通常希望尝试分析样本数据以生成这些参数,从而估计数学函数。
那么,我们为什么要费心去估计这个数学函数呢?首先,只有对分布施加一些限制,我们才能使用许多不同的统计方法。其次,我们经常希望预测总体中可能发生的变化,为此我们需要一些语言来描述这些变化可能如何发生,为此我们将使用统计建模。在下一门课程中讨论实验分析时,您将听到不同统计建模师关于他们所做工作的更多介绍。

在现代学习统计学的优势在于,我们可以模拟数据和函数,甚至可以查看真实数据,而不必经历数学定理和证明。R语言是进行此类操作的绝佳场所。在本讲中,我们将通过查看上一门课程中使用的一些行为风险因素监测系统数据来实现这一点。

加载并准备BRFSS数据


现在,让我们加载BRFSS数据并开始分析。首先,我们需要加载必要的包并导入数据。

# 加载必要的包
library(foreign) # 用于读取SAS格式数据
library(janitor) # 用于清理列名
library(dplyr) # 用于数据操作
library(tidylog) # 用于记录数据操作过程
# 导入并清理数据
brfss_data <- read.xport("path/to/your/BRFSS_data.XPT") %>%
clean_names() # 清理列名


接下来,我们需要对数据进行一些清理。这是一个庞大的数据集,但我感兴趣的一些特征包括个体的年龄(age5yr,在此数据中表示为年龄范围,因此是顺序值)、个体的种族或民族(race列)、个体的性别(sex,在此为二元值)、个体的身高(htm4,单位:米)和体重(wtkg3,单位:千克)。这两个值都是范围。请注意,此数据集也包含英寸和磅,但考虑到这是一个全球课堂,我将坚持使用米和千克,因为以10为基数的数字对大多数分析来说更清晰。我们将从这个决定中看到数据中一个有趣的现象。


此外,还有受访者的家庭收入(income2,单位:美元),这里我们也有响应带。请注意,在此数据集中,这些带的宽度也不完全相同。
我将通过筛选这些列值来清理数据,然后根据需要将内容转换为因子。
# 使用tidylog记录数据清理过程,并筛选有效数据范围
brfss_clean <- brfss_data %>%
filter(
between(x_race, 1, 8), # 种族编码在1到8之间(含)
between(income2, 1, 8), # 收入编码在1到8之间(含)
between(wtkg3, 2268, 68038) # 体重编码在代码簿提供的最小和最大值之间
# ... 对其他变量(如身高、年龄)应用类似的筛选
) %>%
mutate(
age5yr = as.factor(age5yr),
x_race = as.factor(x_race),
sex = as.factor(sex),
income2 = as.factor(income2)
)
这里展示了一个方便的dplyr函数between。它接受一个变量和两个数值,并创建一个布尔掩码,如果元素在这两个值之间(包含两端),则为TRUE。这对于此类清理工作非常方便。我还引入了名为tidylog的包。它会告诉我们数据集中哪些数据被删除了以及原因。这对于审计数据和确保清理操作达到预期效果非常方便。

从控制台输出中,我们可以看到,根据种族筛选只损失了2%的数据集,但考虑到收入因素,我们损失了近20%的数据集。这在可能偏差结果方面非常重要。例如,如果人们选择不报告收入是因为收入非常高,他们担心被视为炫耀者,那么我们就会失去高收入人群的代表性。像收入这样的变量也很有可能与其他变量高度相关,例如年龄,因为年龄较大的个体在劳动力市场工作的时间可能更长。能够报告这些清理方法的效果对于制定良好政策至关重要。
总结



本节课中我们一起学习了数据分布的基本概念,包括总体与样本的区别,以及样本代表性在公共政策分析中的重要性。我们介绍了如何将样本数据与数学模型联系起来,并开始了使用R语言处理真实世界数据(BRFSS数据集)的实践。通过数据清理步骤,我们看到了处理缺失值或无效值时可能引入的偏差,这是进行负责任数据分析的关键一步。在接下来的课程中,我们将更深入地探索如何可视化和分析这些分布。
15:直方图深度解析 📊

在本节课中,我们将学习如何使用直方图和核密度估计来可视化数据的分布。我们将从数据清理开始,逐步探索如何创建和解读这些图表,并理解不同参数(如箱宽)对图表呈现效果的影响。
数据准备与清理
上一节我们介绍了数据导入,本节中我们来看看如何将数据中的数值型分类变量转换为因子。原始数据集中,种族、收入、性别和年龄等变量以代码形式存储。为了在分析中正确使用它们,我们需要参考代码簿,将这些代码转换为有意义的字符串标签,并最终转换为R中的因子类型。
以下是转换步骤:
# 使用dplyr的mutate函数将列转换为因子,并重命名其水平
data <- data %>%
mutate(
race = factor(race, levels = c(1, 2, 3), labels = c("White", "Black", "Other")),
income = factor(income, levels = c(1, 2, 3, 4), labels = c("Low", "Medium", "High", "Very High")),
sex = factor(sex, levels = c(1, 2), labels = c("Male", "Female")),
age_group = factor(age_group, levels = c(1, 2, 3, 4, 5), labels = c("18-24", "25-34", "35-44", "45-54", "55+"))
)
这个过程存在挑战:需要人工查阅代码簿并手动输入标签,容易出错。这些错误如果进入最终分析,可能会误导决策者。这凸显了使用CSV或SAS等未将因子编码为字符串值的数据集时面临的问题。

理解直方图
现在我们的数据已经加载并清理完毕,我们可以尝试可视化其分布。用于可视化样本分布的主要技术是直方图。

直方图将连续变量映射到X轴,将频率映射到Y轴。其视觉表现形式是条形图。直方图通过分箱将连续变量转换为一组有序类别。
我们之所以这样做,是因为像体重这样的连续变量可能变化很大。对于一个给定的样本,我们可能无法看出任何普遍趋势。例如,数据中可能恰好有一个人的体重是100.02公斤,另一个是100.00公斤,还有一个是100.03公斤。直方图本质上将这些数字四舍五入到不同的“桶”中,并允许我们更灵活地控制这些桶(我们称之为箱)。这让我们能够感知总体特征的密度。
让我们开始创建第一个直方图,查看样本的身高(厘米)分布。

library(ggplot2)
ggplot(data, aes(x = height_cm)) +
geom_histogram() +
labs(title = "身高分布直方图", x = "身高 (厘米)", y = "频数")
运行上述代码后,我们得到了第一个直方图。控制台输出显示,ggplot2默认使用了30个箱。图中显示,我们数据中的绝大多数人身高在150到180厘米之间(大约5到6英尺),这看起来是合理的。



在180厘米标记附近有一个很小的条带,显示那里的人数要少得多。这揭示了直方图最大的挑战之一:箱宽的选择会改变图表的外观,有时会产生误导。
有时我们称之为“梳子效应”,因为图表中的间隙看起来像梳子的齿。让我们尝试几种不同的箱宽来观察效果。
以下是尝试四种不同箱宽的代码:
# 创建包含不同箱宽直方图的图形
p1 <- ggplot(data, aes(x = height_cm)) + geom_histogram(binwidth = 1) + labs(title = "箱宽 = 1 厘米")
p2 <- ggplot(data, aes(x = height_cm)) + geom_histogram(binwidth = 5) + labs(title = "箱宽 = 5 厘米 (~2英寸)")
p3 <- ggplot(data, aes(x = height_cm)) + geom_histogram(binwidth = 10) + labs(title = "箱宽 = 10 厘米 (~4英寸)")
p4 <- ggplot(data, aes(x = height_cm)) + geom_histogram(binwidth = 30) + labs(title = "箱宽 = 30 厘米 (~1英尺)")
# 使用cowplot库并排显示
library(cowplot)
plot_grid(p1, p2, p3, p4, nrow = 2)

第一个图(箱宽1厘米)清晰地显示了“梳子效应”。实际上,如果我们查看数据,会发现身高160厘米的观测值有近20000个,而161厘米的只有19个。这是为什么?部分原因取决于受访者如何回答问题,这里涉及很多有趣的行为心理学。例如,如果有人回答他们身高5英尺2英寸,那就是160厘米。但如果他们说5英尺3英寸,则四舍五入到163厘米。样本中只有很少的人会报告像5英尺2又1/3英寸这样的身高,或者直接以厘米报告身高。
随着我们增大箱宽,会看到不同的模式,并对数据的样子有更整体的把握。但当箱变得太大时(如最后一个图中用一英尺作为单位),我们就开始失去粒度。总之,要使用直方图估计数据分布,你必须非常清楚箱宽的大小,并仔细实验和考量。
核密度估计

一个常见的需求是尝试通过估计数据的函数来平滑直方图。通常的做法是创建核密度估计并将其可视化为一条线。

与直方图不同,核密度估计是平滑且连续的,可以为样本量相对较小的数据提供一些洞见。ggplot2有一些内置函数可以将核密度估计创建为一个新图层,我们可以使用geom_density()几何函数来调用它,其底层实际上会调用stat_density机制来创建函数。
以下是创建核密度估计图的代码:
ggplot(data, aes(x = height_cm)) +
geom_density() +
labs(title = "身高核密度估计", x = "身高 (厘米)", y = "密度")

我们可以看到在那些常见的报告数字(如160厘米)周围有明显的尖峰。你会注意到X轴与直方图相同(单位是厘米),但Y轴非常不同。
密度估计函数表示的是,在X轴上任意给定点处,数据在整个数据集中的比例或数量。因此,直方图的Y轴是每个箱中的观测值数量(人数),而密度值表示的是在任意给定X点处数据的比例,其数值在0到1之间。
如果将密度估计曲线下的所有数据相加,其总和等于1,因此可以将其视为一个概率函数。从密度估计中可以得出的推断是关于总体比例的,而从直方图中可以得出的推断是关于观测值的确切数量的。
结合直方图与密度图
将密度估计函数和直方图绘制在一起是很常见的。但在ggplot2中,所有图层必须具有相同的尺度。因此,我们必须将两者之一(以观测值计数的直方图,或以0到1之间比例表示的密度图)转换为另一个的尺度。

但这并不简单,因为直方图的条形有宽度,而密度函数提供的是点估计。创建这种图形意味着我们必须编写一个函数来将直方图转换为密度尺度,或者反之,因为所有图层必须具有相同的尺度。
另一种方法是尝试并排显示两个图表。虽然ggplot2本身不直接支持,但我们可以使用由Claus O. Wilke开发的cowplot库来扩展ggplot2的功能。Claus写了一本名为《数据可视化基础》的书,其中更详细地解释了cowplot库。这本书很有趣,因为它不仅关注像ggplot2这样的信息可视化库的机制,还深入探讨了本课程最后一周的主题:是什么构成了清晰且信息丰富的可视化。
让我们使用一点cowplot来更新这个可视化,使其对决策者也更具吸引力。
以下是使用cowplot创建组合图的示例代码:
# 确保已安装并加载cowplot库
# install.packages("cowplot")
library(cowplot)
# 创建三个不同箱宽的直方图
plot1 <- ggplot(data, aes(x = height_cm)) + geom_histogram(bins = 30) + labs(title = "30个箱")
plot2 <- ggplot(data, aes(x = height_cm)) + geom_histogram(bins = 50) + labs(title = "50个箱")
plot3 <- ggplot(data, aes(x = height_cm)) + geom_histogram(bins = 15) + labs(title = "15个箱")
# 创建核密度估计图
plot4 <- ggplot(data, aes(x = height_cm)) + geom_density() + labs(title = "核密度估计 (KDE)")
# 使用plot_grid排列图形:左侧三个直方图堆叠,右侧一个大密度图
left_column <- plot_grid(plot1, plot2, plot3, nrow = 3)
combined_plot <- plot_grid(left_column, plot4, ncol = 2, rel_widths = c(1, 2))
print(combined_plot)


效果不错。我们还可以通过为直方图设置共同的Y轴标签或更改一些文本样式来改进它。但总体而言,它既能让人一眼看清直方图以了解人口密度,又能显示带有尖峰的KDE,表明该变量实际上并不像直方图可能暗示的那样连续和平滑。
总结
本节课中我们一起学习了直方图和核密度估计的概念。使用直方图来理解总体特征具有重要意义。你可能已经注意到,我们在这里清理了大量数据,但只查看了人们的身高。我认为本周一个好的作业是让你探索为其他一些特征制作直方图,并尝试构建一个比我在这里构建的简单图表更具吸引力的可视化。




16:人口金字塔基础构建 📊

在本节课中,我们将学习如何使用R语言的ggplot2包来创建一个基础的人口金字塔图表。我们将回顾直方图的知识,并探索如何通过翻转坐标轴和自定义数据来构建一个展示人口年龄、性别及心理健康状况分布的图表。

概述

上一节我们介绍了ggplot2的基本绘图功能,并讨论了如何将数据分布可视化为直方图。本节中,我们将尝试创建一个人口金字塔图表。人口金字塔本质上可以看作是两个共享同一坐标轴的直方图,只不过它们被水平放置,一个在左侧,一个在右侧。在大多数人口金字塔中,数据按性别划分,X轴代表人口数量,Y轴代表年龄。

数据准备与清理

为了快速开始,我们将使用之前课程中熟悉的BRFSS数据,并引入一个新变量:“你是否曾被诊断患有抑郁症?”。我们认为心理健康是社会面临的关键问题,并希望了解这一指标在美国人口中如何随年龄和性别分布。
以下是数据清理的步骤,我们将使用一系列常用的R包。
library(tidyverse)
library(janitor)
library(foreign)
library(tidylog)
首先,我们从代码本中获取人类可读的标签,为收入、种族、性别、年龄和我们的心理健康问题设置清晰的变量名。
# 设置变量标签
income_labels <- c("Less than $10,000", "$10,000 to $14,999", ...) # 示例
race_labels <- c("White", "Black", "Hispanic", ...)
sex_labels <- c("Male", "Female")
age_labels <- c("18-24", "25-34", "35-44", ...)
mental_health_labels <- c("Yes", "No")
接下来,我们读取数据并进行清理。我们使用foreign包导入数据,立即清理列名,并选择我们感兴趣的变量。
# 读取并清理数据
brfss_data <- read.spss("path/to/your/data.sav", to.data.frame = TRUE) %>%
clean_names() %>%
select(income, race, sex, age, mental_health) %>%
# 过滤掉缺失值
filter(!is.na(income),
!is.na(race),
!is.na(sex),
!is.na(age),
!is.na(mental_health)) %>%
# 将变量转换为因子并设置标签
mutate(income = factor(income, labels = income_labels),
race = factor(race, labels = race_labels),
sex = factor(sex, labels = sex_labels),
age = factor(age, labels = age_labels),
mental_health = factor(mental_health, labels = mental_health_labels))
我们使用levels_revalue函数(来自forcats包)来方便地在tidyverse流程中重命名因子水平。
# 查看数据前几行
head(brfss_data)

计算分组频率
虽然ggplot2的直方图可以自动计算频率,但为了自定义绘图,我们需要手动计算分组频率。我们希望了解按年龄组和性别分组后,对心理健康问题的回答(是/否)的频率。

这意味着我们需要对age、sex和mental_health这三个变量进行分组,然后计算每组的样本数(n())。

# 分组并计算频率
grouped_data <- brfss_data %>%
group_by(age, sex, mental_health) %>%
summarise(population = n(), .groups = 'drop')
为金字塔图调整数据

为了创建金字塔效果,我们希望数据围绕零值中心化。具体来说,我们希望将女性组的数据值变为负数,这样在图表中它们就会显示在零轴的左侧。
由于我们已经将sex转换为因子,直接与字符串比较会失败。我们需要提取因子水平来进行比较。
# 提取“女性”因子水平用于比较
women_level <- levels(grouped_data$sex)[2] # 假设第二个水平是“Female”
# 调整人口数:女性组取负值
grouped_data <- grouped_data %>%
mutate(population = ifelse(sex == women_level, -population, population))
现在查看数据,可以看到男性组的人口数为正,女性组为负。
head(grouped_data)
构建基础图表

现在我们有了基础数据,可以开始可视化。我们将使用geom_bar图层来绘制条形图。我们希望根据四个类别(男性/是、男性/否、女性/是、女性/否)为条形着色。
我们可以在ggplot内部使用interaction()函数动态创建一个新的因子,它是mental_health和sex的交互作用(即笛卡尔积)。
# 创建基础图表
base_plot <- ggplot(data = grouped_data,
aes(x = age,
y = population,
fill = interaction(mental_health, sex))) +
geom_bar(stat = "identity") # 使用数据中已有的y值,不进行统计变换
此时,我们得到一个堆叠的条形图,女性人口在底部,男性人口在顶部,并通过颜色区分了心理健康回答。如果将头向右倾斜,这已经初具人口金字塔的形态。

翻转坐标轴
为了让图表成为标准的人口金字塔(水平条形图),我们需要翻转X轴和Y轴。ggplot2提供了coord_flip()函数来实现这一功能。坐标变换会影响图表的所有图层。
# 翻转坐标轴
pyramid_plot <- base_plot + coord_flip()
print(pyramid_plot)


总结

本节课中,我们一起学习了如何从清理和准备数据开始,逐步构建一个自定义的人口金字塔图表。关键步骤包括:
- 数据分组与汇总:使用
dplyr计算按年龄、性别和心理健康状况分组的频率。 - 数据调整:通过将女性组数据转换为负值,为金字塔图的左右分布做准备。
- 交互因子创建:使用
interaction()函数在绘图时动态创建分类着色变量。 - 条形图绘制:使用
geom_bar(stat = "identity")根据计算好的频率绘制条形。 - 坐标轴翻转:使用
coord_flip()将垂直条形图转换为水平方向,形成最终的金字塔结构。



通过结合这些技术,我们不仅创建了一个基本的人口金字塔,还通过堆叠条形图额外展示了心理健康状况的分布,使图表能传达更丰富的信息。
17:人口金字塔可视化优化 🏛️📊



在本节课中,我们将学习如何优化一个基础的人口金字塔图表,使其从“功能可用”提升到“适合呈现给决策者”的水平。我们将通过添加标签、调整颜色、优化坐标轴和自定义图例等步骤,来创建一个更清晰、更专业的可视化图表。
上一节我们创建了一个基础的人口金字塔。本节中,我们来看看如何通过一系列优化步骤来提升它的视觉效果和信息传达能力。

添加图表标签 📝
首先,我们需要为图表添加有意义的标签,包括标题、副标题和说明文字。
以下是添加标签的代码示例:
labs(
title = "人口金字塔示例",
subtitle = "这是一个很长的副标题,用于描述图表的主要内容",
caption = "数据来源:示例数据集"
)
我们使用 labs() 函数来添加标签。标题会显示在图表顶部,副标题紧接在标题下方,而说明文字通常放在图表最底部,用于注明数据来源。
优化坐标轴刻度 🔢
当前图表的X轴(由于图表翻转,实际上是视觉上的Y轴)刻度标签为负值,这不够直观。我们需要将其转换为绝对值,并调整刻度密度。
以下是优化坐标轴的代码:
scale_y_continuous(
labels = abs, # 使用绝对值函数处理标签
n.breaks = 10 # 提示ggplot尝试生成大约10个主刻度
)
scale_y_continuous() 函数用于调整连续型Y轴的属性。labels = abs 会将所有负值标签转换为正值。n.breaks = 10 是一个提示,建议ggplot生成大约10个刻度,但最终结果仍由ggplot的算法决定。
自定义填充颜色 🎨
初始的默认颜色对比强烈但不够美观。我们可以将其替换为更符合特定场景(例如机构品牌)的颜色。

以下是自定义颜色的代码:
scale_fill_manual(
values = c("maize" = "#FFCB05", "blue" = "#00274C")
)
我们使用 scale_fill_manual() 函数手动设置填充颜色。这里使用了密歇根大学的官方颜色:玉米黄(maize)和蓝色(blue)。你需要根据你的品牌或审美选择相应的十六进制颜色码。

应用主题与调整背景 🖼️
当数据渲染的宏观细节完成后,我们可以通过调整主题来改变图表的视觉外观,例如背景和网格线。
以下是调整主题的代码示例:
theme(
panel.background = element_rect(fill = NA), # 将面板背景设为透明
panel.grid.major = element_line(color = "white"), # 将主网格线设为白色
panel.grid.minor.y = element_blank() # 移除Y轴的次要网格线
)
theme() 函数影响图表的所有图层。通过将背景设为透明、网格线设为白色,我们可以让数据条更加突出。注意,面板(panel)是承载网格线和数据的主要区域。

精确控制刻度线与添加零线 📏
为了更清晰地标示中心点,我们可以手动设置刻度线位置,并在零值处添加一条明显的参考线。
以下是相关代码:
# 1. 手动设置主次刻度线位置
scale_y_continuous(
breaks = c(-2000, -1000, 1000, 2000), # 主刻度
minor_breaks = c(-1500, -500, 500, 1500) # 次刻度
)
# 2. 添加一条垂直的零值参考线(由于图表翻转,使用geom_hline)
geom_hline(yintercept = 0, linetype = "dashed")
通过 breaks 和 minor_breaks 参数可以精确控制刻度线的位置。由于图表是翻转的,我们使用 geom_hline() 添加一条水平的几何线,它在最终图表中会显示为垂直的零值参考线,并使用虚线以作区分。

在图表内添加标注并简化图例 🏷️

我们可以直接在图表内部标注“男性”和“女性”,从而将图例简化为只显示“是”和“否”(例如,是否抑郁)。
以下是添加文本标注的代码:
annotate("text",
x = c(12.5, 12.5), # 在因子坐标上的位置(X轴,即视觉Y轴)
y = c(1500, -1500), # 在频数坐标上的位置(Y轴,即视觉X轴)
label = c("Females", "Males"),
color = "black",
size = 4)
annotate() 函数用于添加几何对象。这里添加的是文本。由于我们的坐标系是翻转的,x 参数对应年龄组分(因子),y 参数对应人口数量(连续值)。这需要一些调试来确定最佳位置。
解决图层覆盖问题与最终调整 ⚙️
在优化过程中,可能会遇到白色网格线覆盖在文字上的问题。一个解决方案是调整图层顺序:将面板背景置于数据之后,并手动绘制参考线。

以下是调整图层和手动绘制线的思路:
# 1. 使用新主题,移除Y轴网格线,并确保面板在底层
theme(panel.grid.major.y = element_blank(),
panel.ontop = FALSE)
# 2. 使用循环手动在每个刻度位置绘制白色竖线
for(pos in my_break_positions) {
plot <- plot + geom_vline(xintercept = pos, color = "white", size = 0.5)
}
通过设置 panel.ontop = FALSE 并将面板背景设为透明,然后手动用 geom_vline() 绘制白色线条,可以避免文字被遮盖。

手动创建内置图例 🔲
为了节省空间并使图表更简洁,我们可以完全移除默认图例,并在图表内部手动绘制一个简化的图例。

以下是手动创建图例的代码示例:
# 1. 移除所有图例
theme(legend.position = "none")

# 2. 添加“是/否”文本
annotate("text", x = 4.5, y = -2500, label = "Yes", color = "black")
annotate("text", x = 3.5, y = -2500, label = "No", color = "black")
# 3. 添加颜色方块
annotate("rect", xmin = 4.3, xmax = 4.7, ymin = -2600, ymax = -2400,
fill = "#FFCB05") # maize
annotate("rect", xmin = 3.3, xmax = 3.7, ymin = -2600, ymax = -2400,
fill = "#00274C") # blue
我们首先用 theme(legend.position = "none") 关闭图例。然后,使用 annotate() 分别添加说明文字和代表颜色的矩形。这需要反复调整坐标和尺寸以达到最佳效果。

最终代码整合与换行处理 📄
最后,我们将所有优化步骤整合到一段代码中。注意,ggplot的标题和副标题不会自动换行,需要手动插入换行符 \n。
以下是最终代码的核心结构:
# 定义颜色和参数
my_colors <- c("#FFCB05", "#00274C")
tick_positions <- c(...) # 刻度线位置

# 构建基础图表
base_plot <- ggplot(data, aes(x = age_group, y = count, fill = interaction(gender, response))) +
geom_col()

# 添加手动绘制的刻度线
for(pos in tick_positions) {
base_plot <- base_plot + geom_vline(xintercept = pos, color = "white")
}
# 添加其他图层:标签、颜色、坐标轴、参考线、标注、主题
final_plot <- base_plot +
labs(title = "优化后的人口金字塔",
subtitle = "第一行描述\n第二行描述", # 使用 \n 换行
caption = "数据来源: XXX") +
scale_fill_manual(values = my_colors) +
scale_y_continuous(labels = abs, breaks = major_breaks, minor_breaks = minor_breaks) +
geom_hline(yintercept = 0, linetype = "dashed") +
coord_flip() +
# ... 添加所有annotate标注 ...
theme_minimal() # 或自定义主题


本节课中我们一起学习了如何将一个基础的人口金字塔进行深度优化。我们为图表添加了完整的标签,美化了颜色方案,精确控制了坐标轴刻度,并添加了清晰的参考线。通过将标注整合进图表并手动创建简约图例,我们提升了信息的可读性和图表的专业性。最重要的是,我展示了一个真实的、包含调试和问题解决的工作流程。最终,这个图表清晰地显示出样本中老年女性更多,且在各个年龄段,女性对抑郁问题回答“是”的频率都高于男性。请记住,最终采用何种视觉风格,取决于你的沟通对象是统计学家、决策者还是普通公众。
18:数据探索实战演练 🎣
在本节课中,我们将学习如何使用更高级的可视化方法来探索数据的分布。我们将引入一个新的数据集——密歇根州自然资源部关于五大湖的垂钓数据(Creel数据),并重点学习如何通过数据整理(特别是pivot_wider函数)来重塑数据,使其更适合分析和可视化。


上一节我们介绍了基础图表类型,本节中我们来看看如何处理一个现实世界中稍显“混乱”的数据集,并将其整理为整洁的格式。

导入与初步查看数据
首先,我们照例加载必要的R包并导入数据。我们将使用tidyverse、janitor和tidyr。
library(tidyverse)
library(janitor)
library(tidyr)

fish_data <- read_csv("your_data.csv") %>%
clean_names()
查看数据后,我们发现数据集包含以下变量:唯一标识符、时间(月、年)、位置信息(湖、县、港口、站点)、垂钓方式(mode)以及两个估计值(estimate和estimate_value)。数据目前是“长”格式,即每个观测日期对应两行数据:一行记录垂钓次数(Angler trips),另一行记录垂钓时长(Effort)。
使用Pivot_Wider重塑数据
为了使数据更易于分析,我们需要将其转换为“宽”格式,将“垂钓次数”和“垂钓时长”作为两个独立的列。这可以通过pivot_wider函数实现。

以下是pivot_wider函数的核心语法:
data_wide <- data_long %>%
pivot_wider(
names_from = estimate, # 新列的名称来自此列
values_from = estimate_value # 新列的值来自此列
)


在应用此函数前,我们需要删除不必要的列(如唯一标识符),并处理数据中的重复项问题。
识别与处理重复数据
直接应用pivot_wider后,我们发现angler_trips和effort列的值变成了向量,而非单个数值。这通常意味着存在重复的行,导致函数无法确定如何分配值。
我们可以使用janitor包中的get_dupes函数来识别重复项。该函数能统计指定列组合的重复次数。

# 检查除estimate和estimate_value外的列组合的重复情况
duplicates <- fish_data %>%
get_dupes(-c(estimate, estimate_value)) %>%
arrange(desc(dupe_count))

检查发现,有少量观测存在两个以上的重复(例如,一个“垂钓次数”对应多个不同的“垂钓时长”值)。对于这个数据集,此类“坏数据”仅占极少数(18行)。我们可以选择在整理流程中过滤掉这些重复数大于2的行。
即使没有get_dupes函数,我们也可以使用dplyr的组合功能(如group_by、summarise和filter)来识别重复项。

完成数据整理流程

现在,我们将数据清洗步骤整合到一个流程中:过滤掉重复项,然后进行数据透视。

clean_fish_data <- fish_data %>%
get_dupes(-c(estimate, estimate_value)) %>%
filter(dupe_count == 2) %>% # 只保留恰好重复两次的行(即一次trips,一次effort)
select(-dupe_count) %>% # 删除重复计数列
pivot_wider(
names_from = estimate,
values_from = estimate_value
) %>%
clean_names() # 再次清理列名
现在,我们得到了一个整洁的tibble,其中每个观测对应唯一的日期、位置和垂钓方式,并拥有独立的angler_trips和effort列。

关于“整洁数据”的思考
什么是“整洁”的数据框?这取决于你的分析目标。在本例中,我们认为一个观测是特定日期、地点和垂钓方式的组合。但也有人认为,观测应只是日期和地点,而垂钓方式应与angler_trips和effort一起作为变量。
你甚至可以使用pivot_wider进一步扩展,为每种垂钓方式都创建独立的“垂钓次数”和“垂钓时长”列。这展示了数据重塑的灵活性,最终形态应由你的分析需求决定。

保存整理后的数据
为了在本周后续分析中使用,我们将整理好的数据保存为CSV文件。

write_csv(clean_fish_data, "clean_fishing_data.csv")
write_csv函数功能丰富,你可以选择是否追加数据、是否包含列名或更改分隔符等。R也支持写入其他多种文件格式。
总结

本节课中我们一起学习了数据探索中关键的数据整理步骤。我们引入了密歇根州的垂钓数据集,并重点掌握了如何使用pivot_wider函数将数据从长格式转换为宽格式,从而改变数据集中“观测”的定义。这是数据操作中的一项核心技能。

我们还介绍了一个实用工具——janitor包中的get_dupes函数,用于快速识别数据中的重复项。最后,我们学习了如何将整理好的tibble保存到文件中,为后续的可视化与分析做好准备。



现在,我们手头已经有了整洁的数据,接下来就可以正式开始我们的数据探索之旅了。
19:箱线图绘制与应用 📊

在本节课中,我们将学习一种经典的汇总统计与探索性数据分析技术——箱线图。我们将了解其构成、如何在R中绘制,以及如何解读其结果,为公共部门的决策提供支持。
上一节我们完成了数据格式化,本节中我们来看看如何使用箱线图来可视化数据的分布。
箱线图简介
箱线图的目标是通过可视化所谓的“五数概括”来总结数据的分布。这五个数包括:
- 极值:通常是数据的最小值和最大值。
- 中心:通常是数据的中位数。
- 四分位数:数据的第一和第三四分位数。

四分位数将数据大致分为四个大小相似的区间。第一和第三四分位数的标记(有时称为“铰链”)通过箱体部分,展示了数据的中间50%。通过箱线图,我们可以在一个相当紧凑的视觉呈现中了解数据的权重分布。
绘制基础箱线图
我们将像上次一样导入钓鱼数据。首先,我们选取单一模式(shanty,即冰钓小屋)和单一湖泊(密歇根湖),并限定在2005和2006年。我们将同时打印五数概括并展示箱线图的可视化结果。
以下是实现此操作的代码:
# 过滤数据
lake_michigan_shanty <- data %>%
filter(lake == "Michigan", mode == "shanty", year %in% c(2005, 2006))
# 计算并打印五数概括
five_num_summary <- fivenum(lake_michigan_shanty$effort)
print(five_num_summary)

# 绘制箱线图
ggplot(lake_michigan_shanty, aes(x = lake, y = effort)) +
geom_boxplot() +
scale_y_continuous(breaks = pretty_breaks(n = 10)) # 设置Y轴刻度以便更好地查看数值
fivenum函数以单个向量的形式返回结果,顺序为:最小值、下铰链(第一四分位数)、中位数、上铰链(第三四分位数)、最大值。绘图时,我们将lake映射到X轴,将钓鱼者投入的effort(努力小时数)映射到Y轴,并使用geom_boxplot()进行绘制。
解读箱线图结果
从fivenum函数的结果和生成的箱线图中,我们可以看到:
- 最小值为24小时。
- 下四分位数(箱体底部)约为1200小时。
- 中位数约为1300小时。
- 上四分位数(箱体顶部)约为42000小时。
- 最大值略低于60000小时。
这对于制定政策的自然资源部人员意味着什么?这意味着,在该湖泊某一年份的某个月份,从一个冰钓小屋记录的钓鱼努力小时数最低仅为24小时。但更重要的是,有50%的时间(即箱体覆盖的范围),努力小时数的区间实际上非常大,在13000到近60000小时之间。
箱线图的每个部分(有时称为“须”的线段和箱体本身)大致包含了25%的观测值。因此,箱线图让我们对观测值的分布和数据点的权重有了直观感受。

结合数据背景进行思考
然而,我们必须始终记住数据的性质。让我们看看数据中实际包含什么。
我们发现这些数据实际上相当稀疏,重要的是,只有使用了冰钓小屋的月份才有记录。如果我们使用数据透视表(pivot wider),会得到一个包含大量NA值的表格。原因在于,当湖面冰层不够厚时,无法进行冰钓。因此,夏季月份的出行次数、努力小时数和冰钓小屋使用数实际为0。
所以,我们从这个箱线图中得出的结论,实际上仅限于使用了冰钓小屋的月份。如果这与你的研究问题相符,那没有问题。我们还注意到,在2005年,只有一个县有冰钓小屋钓鱼记录。另一个县记录次数很少,这可能为利益相关者提供一些重要线索。
绘制分组箱线图
你可能已经猜到,我们不必一次只看一个箱线图。我们可以通过更改筛选条件和设置更多的美学映射来增加变量数量,从而进行更深入的探索。
接下来,我将通过包含所有模式和所有湖泊来扩展分析。我将X轴美学映射仍设置为lake,但将填充颜色fill美学映射设置为mode。在运行代码之前,请暂停视频,根据你目前对ggplot的了解,思考一下你期望看到什么样的图形。
# 绘制分组箱线图:按湖泊分组,并按模式填充颜色
ggplot(data, aes(x = lake, y = effort, fill = mode)) +
geom_boxplot()

解读分组箱线图
结果接近你的预期吗?有几点需要我们讨论:
- 通过将X轴设置为
lake变量,我们得到了按湖泊分组的箱线图,顺序为伊利湖(Erie)、休伦湖(Huron)、密歇根湖(Michigan)和苏必利尔湖(Superior)。 - 在每个湖泊内部,我们有针对不同钓鱼模式(boat, open ice, pier and dock, shanty, shore)的独立箱线图。
- 对于伊利湖,我们看到只有船钓(boat)模式。此外,熟悉五大湖区域的人会注意到缺少安大略湖(Ontario)。为什么?
再次强调,请记住数据的来源:密歇根州自然资源部。数据范围可能受管辖权或数据收集范围的限制。


本节课中我们一起学习了箱线图的原理与绘制方法。我们了解到箱线图通过五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)直观展示了数据的分布、中心趋势和离散程度。我们使用ggplot2的geom_boxplot()函数绘制了基础箱线图和分组箱线图,并强调了结合具体数据背景(如数据稀疏性、收集范围)进行解读的重要性。箱线图是探索数据分布、发现潜在模式并为公共政策讨论提供信息支持的强大工具。
20:多变量箱线图拓展

概述
在本节课中,我们将学习如何创建和解读多变量箱线图,并探索如何通过叠加点图来增强箱线图的可视化效果,从而更深入地理解数据的分布情况。
地理背景与数据来源
上一节我们介绍了箱线图的基础知识,本节中我们来看看如何将其应用于更复杂的多变量场景。首先,了解数据的地理背景至关重要。
密歇根州有时被称为“手套州”,因为它看起来像一只连指手套。该州包括被称为“上半岛”的北部地区。我们的数据集包含了除安大略湖以外的所有五大湖数据。这是因为密歇根州与加拿大的边境线穿过了这些湖泊,因此安大略湖不在数据集中。
伊利湖在数据集中的观测值很少,因为密歇根州与其接壤的部分非常小。上半岛与苏必利尔湖有很长的边境线,但由于该地区人口稀少,观测数量可能看起来不多。我们的数据主要来自密歇根州沿湖的县。
创建多变量箱线图
理解了数据背景后,我们开始创建可视化图表。假设我们只关注休伦湖的数据,并使用三个不同的年份。

以下是创建基础箱线图的代码:

# 假设数据框为 `fishing_data`,包含变量 `year` 和 `hours`
ggplot(fishing_data, aes(x = year, y = hours)) +
geom_boxplot()

运行此代码可能会产生一个沿连续年份范围显示的单组箱线图,而不是按年份分组的箱线图。这是因为year变量在代码中被视为整数,而非分类变量。
将数值变量转换为因子
为了按年份分组显示箱线图,我们需要将年份变量转换为因子。修改后的代码如下:
ggplot(fishing_data, aes(x = as.factor(year), y = hours)) +
geom_boxplot()

现在,图表将显示三个独立的箱线图组,每组对应一个年份。这允许我们比较不同年份间钓鱼小时数的分布。
解读多变量箱线图
通过这个图表,我们可以进行多种比较:
- 比较同一钓鱼模式(如“小棚屋”)在不同年份间的差异。
- 比较同一年份内不同钓鱼模式(如“小棚屋”与“船只”)的中位数和四分位距。
- 观察异常值,即远离数据主体分布的个别数据点。
在ggplot2中,异常值的判定基于公式:Q1 - 1.5 * IQR 和 Q3 + 1.5 * IQR。其中,IQR(四分位距)是 Q3 - Q1。箱须线延伸至此范围,之外的点被视为异常值并单独绘制。

叠加点图以增强可视化
当数据量较小时,箱线图可能无法充分展示数据点的实际分布。一种有效的改进方法是叠加点图。
点图将每个观测值显示为一个点。以下是创建叠加点图的代码示例:
library(cowplot)
# 创建基础箱线图
p_box <- ggplot(fishing_data, aes(x = as.factor(year), y = hours)) +
geom_boxplot()
# 创建叠加了点图的版本
p_dot <- p_box +
geom_dotplot(binaxis = "y", stackdir = "center", dotsize = 0.5)

# 并排显示两个图表
plot_grid(p_box, p_dot, labels = c("A", "B"))
通过叠加点图,我们可以清晰地看到:
- 在某个四分位区间内,数据点是密集聚集还是分散分布。
- 有多少个数据点恰好位于边界值(如0值附近)。
- 异常值周围的数据分布情况。
这种方法能有效防止因数据量少而导致的视觉误导,让数据分布更加透明。
总结



本节课中我们一起学习了多变量箱线图的创建与解读。关键步骤包括将连续变量转换为因子以进行分组,以及通过叠加点图来丰富箱线图的信息,尤其是在处理小规模数据集时。这帮助我们更准确、更细致地理解变量在不同类别间的分布差异。
21:小提琴图绘制技术 🎻


在本节课中,我们将学习如何使用R语言中的ggplot2包来绘制小提琴图,这是一种用于比较多个数据分布的可视化技术。我们将从回顾箱线图开始,然后介绍如何创建和解读小提琴图,并探讨如何结合点图来增强可视化效果。
概述与数据准备


上一节我们介绍了如何使用箱线图来展示分布的摘要统计量。本节中,我们将学习一种更直观展示数据分布本身的方法——小提琴图。
首先,我们需要导入并准备数据。我们将使用一个关于钓鱼活动的数据集,目标是按年份和钓鱼模式查看总努力量和钓鱼者出行次数的分布情况。
# 导入数据并分组
library(tidyverse)
# 假设数据已加载为 `fishing_data`
grouped_data <- fishing_data %>%
group_by(year, mode) %>%
summarise(total_effort = sum(effort),
total_trips = sum(trips), .groups = 'drop')

在初步绘制箱线图时,我们发现“mode”列的数据格式不一致(例如全大写和首字母大写混用),这会影响分组和可视化。因此,我们需要先进行数据清洗。

数据清洗:字符串处理
以下是R中处理字符串的一些常用函数:
nchar():计算字符串中的字符数。strsplit():根据特定值分割字符串。paste()/str_c():连接字符串。tolower()/toupper():将字符串转换为全小写或全大写。

对于本例,我们将“mode”列统一转换为小写:

cleaned_data <- grouped_data %>%
mutate(mode = tolower(mode))
清洗后,我们可以绘制箱线图。为了更清晰地比较非“boat”模式,我们将其过滤掉,并调整Y轴刻度标签的格式,使其更易读。
filtered_data <- cleaned_data %>%
filter(mode != "boat")
# 绘制箱线图
ggplot(filtered_data, aes(x = mode, y = total_effort)) +
geom_boxplot() +
scale_y_continuous(labels = scales::label_comma())
R函数调用与命名空间

在调整Y轴标签时,我们使用了scales::label_comma()的语法。这引出了R中一个重要的概念:函数命名空间。
当使用library()加载包时,该包的函数会被放入一个独立的环境中。R在查找函数时,会从当前环境开始,按加载顺序搜索这些环境。如果多个包包含同名函数,先加载的包中的函数会“屏蔽”后加载的。



双冒号::运算符允许我们直接指定从哪个包中调用函数,这被称为命名空间解析或消歧义。例如:
dplyr::filter()直接调用dplyr包中的filter函数,即使它被其他包(如tidylog)屏蔽了。- 即使没有用
library(scales)加载scales包,我们也可以使用scales::label_comma()来调用其函数。
了解这一点有助于你更精确地控制代码行为,并理解他人代码示例。

scales包是ggplot2的一个辅助包,专门用于以对人类友好的方式格式化坐标轴标签(如添加千分位逗号、显示百分比、调整日期格式等)。
创建与比较小提琴图
现在,让我们回到可视化本身,将箱线图与小提琴图进行比较。小提琴图旨在展示相同的信息——数据的分布和密度,但它不使用五数摘要,而是直接展示核密度估计。

以下是创建并排比较图的步骤:
# 存储分组数据
plot_data <- filtered_data
# 创建箱线图
p1 <- ggplot(plot_data, aes(x = mode, y = total_effort)) +
geom_boxplot() +
scale_y_continuous(labels = label_comma()) + # 此时scales包已加载,可直接调用
theme(legend.position = "bottom")

# 创建小提琴图
p2 <- ggplot(plot_data, aes(x = mode, y = total_effort)) +
geom_violin() +
scale_y_continuous(labels = label_comma()) +
theme(legend.position = "bottom")

# 使用cowplot包并排显示
library(cowplot)
plot_grid(p1, p2, labels = c("Box Plot", "Violin Plot"))


通过对比可以立即看出,小提琴图能更细致地展示数据分布的形态。我们还可以轻松地在这些图形上叠加点图,以显示每个实际的数据点。
# 创建带点图的小提琴图
ggplot(plot_data, aes(x = mode, y = total_effort)) +
geom_violin() +
geom_jitter(width = 0.2, alpha = 0.5) + # 添加点图,并设置轻微抖动和透明度
scale_y_continuous(labels = label_comma())
总结
本节课中我们一起学习了小提琴图的绘制技术。我们首先回顾了箱线图,然后通过数据清洗实践了R的字符串处理函数。接着,我们深入了解了R的函数命名空间和::运算符的用途。最后,我们创建并比较了箱线图与小提琴图,并演示了如何叠加点图。


小提琴图是一种强大的可视化技术,用于比较一系列数据的分布。虽然箱线图仍被频繁使用,但小提琴图因其能捕捉数据分布的细微差别而日益流行。得益于ggplot2的分层图形语法,在其上叠加点图变得非常简单。当数据量较大时,点图的效用会降低,但在数据量较小的情况下,它能有效揭示箱线图或小提琴图可能掩盖的细节(例如,在某个具体值上是否真的存在观测点)。
22:山脊图可视化方法 📊

在本节课中,我们将要学习一种名为山脊图(Ridge Plot)的数据分布可视化方法。这是一种比箱线图和小提琴图更紧凑的表示方式,特别适用于比较多个分布。
概述
上一节我们介绍了箱线图和小提琴图,它们都能帮助我们比较数据分布。本节中我们来看看一种更紧凑的表示方法——山脊图。它本质上是一系列垂直切割、挤压并翻转90度的小提琴图,结果形成类似山脊的系列,便于快速比较不同分布的差异。
山脊图简介

山脊图可以想象为一组被垂直切成两半、挤压在一起然后翻转90度的小提琴图。结果形成一系列“山脊”,每个山脊代表一个我们正在比较的项目,它们显示了重叠的分布函数。这使你能够快速了解哪些分布不同以及差异程度。

事实上,这种图表类型并不新鲜。最早的例子之一可以追溯到1805年,出现在威廉·普莱费尔(William Playfair)的著作《强大富裕国家衰落的永久原因探究》中。该书包含许多精心绘制的图表,包括堆叠折线图和各国财富随时间变化的图像。每个国家在视觉上占据单独一行,很容易在任何时间点与其他国家进行比较。
虽然这个视觉图没有显示重叠的山脊,更接近于我们下周将讨论的“小倍数”技术,但它非常接近现代山脊图的外观。
在R中创建山脊图


现在,让我们看看如何在R中实现山脊图。
首先,我们需要加载必要的库并准备数据。以下是操作步骤:
-
加载库与数据:我们将导入
tidyverse和tidylog,并获取五大湖的非船只观测数据组。需要记住修正mode列的大小写问题。library(tidyverse) library(tidylog) # 假设 fishing_data 是您的数据集 group_data <- fishing_data %>% filter(location == "Great Lakes", mode != "boat") %>% mutate(mode = str_to_title(mode)) # 修正大小写 -
加载山脊图专用库:山脊图不是
ggplot2默认的几何图形,因此需要导入ggridges库。我们通常还会导入scales库来辅助调整。library(ggridges) library(scales) -
设置透明度:在山脊图中,我们经常设置alpha通道(即透明度)的美学属性,以便更好地观察分布的重叠部分。
alpha = 0.5表示50%透明度,alpha = 1表示100%不透明。这个参数可以用于多种可视化图形。# 基础山脊图代码框架 ggplot(group_data, aes(x = effort, y = mode, fill = mode)) + geom_density_ridges(alpha = 0.6) # 设置填充透明度
运行上述代码后,我们可以立即观察到,除了船只(boat)分布外,其他所有分布看起来都相似。海岸线(shoreline)分布在一侧尾部有一个小凸起,但除此之外,这些分布都围绕峰值相对对称。寻找分布特征进行分类,然后应用适当的统计检验,是统计学家的常见活动,你可以看到如何辅助这些工作。
正如我们之前所见,船只的分布确实不同,在200万和500万小时标记附近有一些质量块。
综合比较:山脊图、小提琴图与箱线图
现在是将我们刚看到的三种技术(箱线图、小提琴图、山脊图)用cowplot库组合起来进行比较的好时机。在尝试之前,我们先介绍一些代码块(chunk)参数。

代码块的第一行告诉R Markdown我们正在使用R,然后可以传入各种参数。参数本身来自knitr包。例如,我们可以关闭警告、错误和信息消息(通常不建议,但在为他人创建文档且已理解所有警告时可以这样做),并设置图形尺寸。
以下是创建组合图的步骤概述:
-
设置代码块参数:例如,设置图形宽度为12英寸,高度为5英寸,并关闭消息。
```{r fig.width=12, fig.height=5, message=FALSE, warning=FALSE} # 你的R代码在这里 ``` -
创建三个图形对象:
- 山脊图:使用
geom_density_ridges。 - 小提琴图:使用
geom_violin。注意,山脊图和小提琴图的x轴和y轴映射是互换的。 - 箱线图:使用
geom_boxplot。
- 山脊图:使用

- 使用cowplot组合:使用
plot_grid()函数将三个图并排排列。
关于这三种方法,我们可以做一些观察:
- 山脊图:允许我们看到数据的密度函数。它比箱线图信息量更大,因为我们可以看到平均值(约400万小时)附近的值实际上很少。
- 小提琴图:当绘图区域变小时,水平空间非常有限,可能变得不太有用。
- 箱线图:当图形尺寸变小时,由于所有硬线条的存在,变得极难阅读。除了知道均值与“chore”或“shanty”不同之外,我们很难说出更多信息。
小提琴图和山脊图都能清楚地显示两者之间的分布差异,但方式略有不同。山脊图由于重叠特性提供的额外垂直空间,使我们能比小提琴图更清楚地看到分布形状。
总结
本节课中我们一起学习了如何使用ggplot2探索数据分布的旅程。您看到了许多不同且互有重叠的技术:
- 用于分箱连续值的直方图。
- 用于基于直方图估计函数的核密度估计。
- 用于可视化变量五数概括的箱线图。
- 允许我们查看多个变量分布函数的小提琴图和查看个体观测值的点图。
- 以及本节课重点介绍的山脊图,它在紧凑的可视化中比较分布时特别有用。


通过掌握这些工具,您可以更有效地探索和理解数据,为公共部门的决策提供更深入的支持。
23:警惕误导性数据可视化 📊

在本节课中,我们将探讨数据可视化在公共部门中的重要性,以及如何识别和避免常见的误导性图表。数据是强大的工具,但若使用不当,也可能传递错误信息,甚至被用于支持有问题的政策或观点。
上一节我们介绍了数据可视化在决策支持中的作用,本节中我们来看看数据可视化如何被误用,以及我们应如何保持警惕。
概述
数据在公共部门中扮演着至关重要的角色,被用于支持关键职能和决策。然而,这也意味着数据可能被以强有力的方式误用。公共部门中常常存在压力,促使人们以误导性的方式使用和呈现数据,有时是细微的,有时则是蓄意且显著的。本节课将通过几个具体案例,展示误导性数据可视化的常见形式及其潜在危害。
案例分析
以下是几个被公认为具有误导性的数据可视化案例。我们无法仅从图表本身判断其设计是否蓄意误导,但可以清楚地看到其结果所产生的问题。
案例一:佛罗里达州枪支谋杀案趋势图
第一张是臭名昭著的图表,显示了佛罗里达州涉及枪支的谋杀案数量随时间的变化,涵盖了2005年一项名为“不退让法”的新法律颁布前后的时期。


该法律允许佛罗里达州公民在感到生命或身体受到严重威胁时,可以使用枪支进行反击而免于起诉。一些团体担心这项政策实际上会增加枪支造成的伤亡。
如果你快速浏览这张图表,看起来佛罗里达州的枪支死亡人数在2005年新法律生效后有所下降——趋势线在1990年上升后,在此时开始下降并趋于平稳。

然而,如果你仔细观察Y轴,会发现Y轴上的数字是向下递减的。这很奇怪,对吗?坐标轴底部起点是1000,数值随着向上移动而变小。
因此,对这张图的正确解读实际上与你第一眼看到的相反:佛罗里达州的枪支死亡人数在“不退让法”生效后确实增加了。
这张图表的设计者是否试图混淆或误导我们?这一点并不明确。有一种说法是,他们并非试图误导:如果你注意到,他们选择用红色作为图表中趋势线上方的背景色,或许是为了表明政策变化后流了更多的血。你怎么看?
由此得出的一个要点是:如果你试图在可视化中做一些非典型或非标准的创意设计,最好先与你的目标受众一起研讨和测试草稿。无论这张图表设计者的意图如何,公众的强烈抗议是合理的,大多数人认为它是有意误导,并是在支持一项有问题的政策时对数据可视化的滥用。
案例二:阿根廷政府新冠疫情检测率对比图


下一张图表也受到了公众的严厉评判。左侧图表显示了疫情早期,少数几个国家每百万人口中进行的COVID-19检测数量。


图表显示阿根廷在某个时间点略微落后于其他一些国家。你应该知道,这张图表是由阿根廷政府制作的。
如果你仔细观察,图表上每个条形的高度与实际检测数量关系不大。实际上,这张图上没有带数字的Y轴。因此,虽然图表显示了各国检测率的一些差异,但并未显示检测率的绝对差异。

当像右侧图表那样呈现数据时,你会注意到阿根廷当时的检测率远低于对比国家。

因此,这属于试图淡化问题严重性的可视化类别。这张数据可视化似乎在说:是的,阿根廷落后于其他国家,但差距并不大。而实际上,问题要严重得多。
案例三:数据科学工作岗位增长图
下一张图表显示了2010年至2020年间不同类型数据科学工作岗位的增长情况。


乍一看,图表似乎表明数据科学工作及其多个子类别的数量在时间序列末期(即2020年)趋于平稳或下降。然而,这张图表也存在一些问题。
首先,这个恼人的Y轴经常带来很多问题,而在这里它没有标签。那么这张图到底显示的是什么?结果发现,这里绘制的是工作岗位增长的百分比增长率,而不是实际的工作岗位数量、面试数量或此类劳动力分析中使用的其他指标。
因此,是某些类型的数据分析和数据科学工作岗位的增长率放缓了,而不是实际的工作岗位数量。此外,这张图表没有告诉我们数据来源,或者衡量工作岗位增长的主要指标是如何测量的。


遗憾的是,我们很难解读这张图表并得出任何结论。我们从其他信息中得知,该图表的数据实际上来自某种网络调查。但媒体获取了这张图表并广泛传播,讲述了一个关于新冠疫情在2020年减少了数据科学和数据分析领域工作岗位的故事。
你会很高兴知道,更好的数据表明,虽然该领域的增长率确实有所放缓,但这仍然是一个在全球范围内(包括公共和私营部门)不断增长的领域。
案例四:美国独立日购物清单通胀图
最后是2022年夏天在美国发生的一件事。妮基·黑利是南卡罗来纳州前州长兼美国前驻联合国大使。她在7月4日(美国独立日)前发布了这张名为“乔·拜登的不便商店”的收据图片。

这张收据显示了一系列美国人通常在独立日庆祝野餐中购买的产品的价格以及过去一年的通胀百分比。根据这张收据,热狗的价格自去年夏天以来上涨了15.6%,苏打水上涨了13.2%,冰淇淋上涨了9.6%,等等。收据暗示,对于列出的6件商品,总通胀率为67.25%,意味着今年的独立日庆祝活动由于通胀,成本比去年高出67%以上。推文写道:“谢谢你,拜登总统。”
当然,这里有一个非常基本的数学错误。他们没有计算收据上列出的六种产品的平均通胀率,而是将通胀百分比简单相加。这当然是一个非常基本的数学错误,看起来像是故意的。一位受过教育的政治家怎么会犯如此基本且具有误导性的错误?

这张图片在社交媒体上发布后,立即遭到了强烈反对,人们称其有意误导、不道德等等。在公众压力下,妮基·黑利的公关团队让她的工作人员背了黑锅。他们的声明是:“这是一个工作人员的错误,本不应发布。我们意识到了计算错误,并立即删除了图片。”
因此,这里的最后一个教训是:如果你曾经被迫创建误导性图表,首先,尽量不要这样做(我们将在第4课中更多地讨论如何抵制并拒绝制作你认为具有误导性或不道德的作品)。其次,如果你最终按照他人的命令或授权制作了误导性数据可视化,请准备好最终承担指责,如果面临公众审查或被指控歪曲事实的话。
总结


本节课中我们一起学习了几个误导性数据可视化的典型案例。我们看到了Y轴刻度误导、缺少关键坐标轴标签、错误的数据呈现方式(如用增长率代替实际数量)以及基本的计算错误如何扭曲事实、误导公众。这些案例提醒我们,在创建和解读数据可视化时,必须保持批判性思维,仔细检查图表的设计和数据的呈现方式,确保信息的准确性和完整性。在公共部门,秉持诚信和透明地进行数据沟通至关重要。
24:数据分析师沟通准则 📊

在本节课中,我们将学习数据分析师在沟通工作成果时应遵循的最佳实践准则,特别是关于数据可视化的创建与呈现。我们将探讨如何确保可视化清晰有效,以及如何为不同受众准备和记录你的工作。
你已经学习了许多关于探索性数据分析的最佳实践,以及在公共部门背景下多种不同类型的数据可视化方法。

上一节我们介绍了数据分析的基础,本节中我们来看看如何有效地沟通你的分析成果。首先,让我们回顾一些数据可视化的核心最佳实践。
以下是创建有效数据可视化的关键步骤:


- 确保数据质量与分析方法的恰当性:在开始可视化之前,必须保证数据是高质量且干净的。同时,所选择的分析方法必须适合数据所要回答的问题。公式可以表示为:
有效可视化 = 高质量数据 + 恰当的分析方法。 - 选择最清晰、最简单的可视化形式:选择最能清晰、简洁地传达结果的可视化类型。虽然创建复杂花哨的图表更有趣,但“少即是多”通常是公共部门工作的最佳方法。图表越不复杂,其影响力往往越大。
- 确保所有标签清晰易懂:确保图表的标题、坐标轴标签以及其他所有标签都清晰且易于理解。
- 确保可视化能够独立传达信息:你的图表应该能够独立存在,目标受众无需他人额外解释或提供补充信息就能理解和解读。
- 通过草稿与反馈进行迭代:为了确保可视化达到所有目标,应创建草稿并与他人分享以获取反馈。重要的是,要倾听这些反馈并进行必要的调整。数据可视化的根本目的是向受众传达信息。
了解了创建可视化的基本原则后,我们接下来看看如何将数据可视化作为一种沟通工具和策略来使用。


以下是将数据可视化作为沟通策略的实践要点:
- 明确可视化的目的:在制作图表前,你需要知道它的目的。你要讲述什么故事?这里引入一个新的缩写:SOCO,即 单一首要沟通目标。对于你创建的每个图表,你都应该能回答这个问题:它的SOCO是什么?重点是什么?沟通目标是什么?
- 能用通俗语言阐述故事:作为设计者,你必须能够用通俗的语言(而不仅仅是数字)来阐述故事或沟通目标,谈论你所展示的结果。
- 深入了解你的受众:要成为良好的沟通者,必须了解你的受众。在创建可视化之前,你需要知道受众是谁。是行政人员、内部文件,还是媒体和公众?是立法者吗?受众对该主题以及数字(如百分比、比率、增长趋势等)的理解程度如何?代码层面可以体现为在规划时考虑
audience_knowledge_level这个变量。 - 考虑多受众的理解能力:如果一个可视化面向多个受众(这很常见),他们是否都能理解同一个图表?

我的最后一条建议是:始终为你制作的任何数据可视化做好背后的工作记录。
尽管如前所述,你的可视化应该能够在没有额外信息的情况下,独立面向不同受众。但你仍然需要为你创建的每个可视化准备笔记和完整的文档。
试想,如果你的老板或其他人需要解释或为你制作的数据可视化辩护,他们是否了解创建过程中的所有细节?他们能回答问题吗?

你的文档应包括以下内容:
- 数据来源与时间范围:记录使用的数据源及数据覆盖的时间段。
- 数据质量与问题说明:注明你对数据质量、覆盖范围乃至数据缺失问题的任何担忧。
- 重要测量问题:记录图表中变量或项目的测量方式。这包括任何比率的计算方式(比率总是有分子和分母,例如
rate = numerator / denominator)。如果你使用了复合指标(如基尼指数、社会脆弱性指数、政府信任度全球指标等),必须记录其构成要素和最终计算方法。 - 重申沟通目标:用技术和通俗两种语言,再次总结主要的沟通目标(即你的SOCO)。
- 预警可能的误读:在你的笔记中,提醒他人注意你对数据可视化可能存在的过度解读或误解的担忧。



本节课中我们一起学习了数据分析师在沟通,特别是通过数据可视化进行沟通时应遵循的核心准则。我们回顾了创建清晰有效图表的最佳实践,探讨了以SOCO为核心的沟通策略,并强调了深入了解受众和进行详尽文档记录的重要性。遵循这些原则将帮助你在公共部门的工作中更专业、更有效地传达数据洞察。
25:信息可视化设计导论 🎨

在本节课中,我们将学习信息可视化设计的核心概念。这些概念将帮助你创建更有效、更清晰的数据图表,以便更好地传达信息,尤其是在公共部门进行决策支持时。
本周的课程与前几周有所不同。首先,你将见到一个更年轻、七年前的我。在2015年,我在密歇根大学获得了首次教学机会,并与同事们共同开设了一门关于“使用Python的应用数据科学”的系列课程。在那门课程中,我讲授了与数据可视化相关的系列讲座,其内容至今仍然适用。因此,我们将其作为福利内容引入本课程。
实际上,本课程与信息可视化领域还有另一层联系。该领域最杰出的人物之一,爱德华·塔夫特,早在70年代中期就在耶鲁大学开始了他的工作,当时他还是一名政治学家。他的第一本书名为《政治与政策的数据分析》,这与本系列课程的主题惊人地相似。虽然那本书主要关注因果关系和回归建模,但他使用的许多技术与我们在本课程中涵盖的内容相同。后来在普林斯顿大学,他开始认真关注通过视觉方式解释和探索数据的问题。他最具开创性的著作《量化信息的视觉展示》至今仍是大多数人机交互学位项目的必读材料。
正是基于这本书,我想向你介绍三种视觉设计模式:数据墨水比、图表垃圾和谎言因子。你的工作可能涉及大量叙事,不仅要展示真实准确的可视化图表,还要将其传达给广泛的受众。《真实艺术》一书的作者阿尔贝托·开罗是一位记者和设计师,他为我们提供了更多在设计可视化图表(尤其是面向广大受众时)需要考虑的工具。他的项目组合广泛且引人注目,曾就信息可视化设计主题为政府和公司提供建议。
接下来,我将花一些时间讨论他在书中谈到的一些概念,以及他用来帮助组织思考其视觉设计的工具。
核心设计概念
上一节我们介绍了课程的背景和三位设计大师的贡献。本节中,我们来看看信息可视化设计的三个核心概念。理解这些概念是创建高效图表的基础。
以下是三个关键的设计原则:
-
数据墨水比
- 这个概念由爱德华·塔夫特提出,指的是图表中用于呈现核心数据的墨水量与图表总墨水量之比。
- 其核心思想是:最大化数据墨水比。公式可以表示为:
数据墨水比 = (用于数据的墨水) / (图表总墨水)。 - 应尽可能去除对理解数据没有帮助的装饰性元素,让数据本身成为焦点。
-
图表垃圾
- 这是“数据墨水比”的反面,指图表中所有不必要的、分散注意力的视觉元素。
- 例如过度使用3D效果、阴影、华丽的背景图片或与数据无关的图标。这些元素会干扰观众对数据的理解。
-
谎言因子
- 这个概念用于衡量图表的视觉表现是否歪曲了实际数据。
- 其计算方法是图表中图形尺寸代表的数值与实际数据数值的比率。理想情况下,这个比值应等于1。
谎言因子 = (图形显示的尺寸) / (数据实际数值)。 - 如果比值显著大于或小于1,则图表可能在视觉上夸大或缩小了数据差异,从而误导观众。
面向广大受众的设计工具
在掌握了塔夫特的核心原则后,我们转向阿尔贝托·开罗的见解。他的工作特别强调为广泛且多样的受众设计可视化图表。本节将探讨他提出的一些实用工具和考虑因素。
阿尔贝托·开罗在《真实艺术》中强调,优秀的数据可视化不仅是准确的,还是有效的和有道德的。他提供了一套工具来帮助实现这一目标。
以下是设计时需要重点考虑的方面:
- 清晰度与可读性:确保图表在任何尺寸下都易于阅读,标签明确,颜色对比度足够。
- 叙事性:将图表置于一个故事或上下文中,引导观众理解数据背后的含义和影响。
- 受众认知:了解你的观众是谁,他们已有的知识水平,以及他们如何使用这些信息。避免使用专业术语或过于复杂的图表类型。
- 诚实与完整性:永远不要为了支持某个论点而扭曲数据。提供完整的背景信息,避免断章取义。
总结

本节课中,我们一起学习了信息可视化设计的基础。我们回顾了爱德华·塔夫特提出的三个核心设计模式:数据墨水比、图表垃圾和谎言因子,它们指导我们创建更简洁、更真实的可视化图表。随后,我们借鉴了阿尔贝托·开罗的观点,学习了如何为广泛受众设计有效且负责任的图表,强调了清晰度、叙事性和道德考量。


掌握这些原则和工具,将帮助你在公共部门的数据分析工作中,创建出不仅能准确反映数据,还能有效沟通、支持决策的可视化成果。希望你能将这些知识应用到实践中,并在接下来的课程中继续探索更多分析和理解数据的方法。
26:图形启发式:数据墨水比(Edward Tufte理论)📊


在本节课中,我们将学习Edward Tufte提出的一个重要图形设计启发式——数据墨水比。我们将了解其定义、核心思想,并通过一个具体示例来掌握如何应用这一原则来优化图表,使其更清晰、更有效地传达信息。

Edward Tufte是定量信息可视化设计领域的开创性人物。他撰写了一本名为《定量信息的视觉展示》的著作,这本书非常值得推荐。

在这本书中,他介绍了两个有趣的图形启发式:数据墨水比和图表垃圾。
首先,什么是启发式?启发式是一种旨在指导决策的过程或规则。它本质上并非最优或完美,但非常实用。在你有理由偏离它们之前,启发式是值得遵循的。
Tufte提出的第一个图形启发式是数据墨水比。Tufte将数据墨水定义为一个图形的不可擦除的核心,即那些为响应所代表数字的变化而排列的、非冗余的墨水。换句话说,数据墨水是理解给定变量所必需的部分。
Tufte将数据墨水比定义为数据墨水量除以打印该图形所需的总墨水量。他并非建议我们实际测量页面上的墨水量,而是建议我们移除那些没有为图表增添新信息的元素。
展示如何提高数据墨水比最著名的例子之一,来自加拿大阿尔伯塔省埃德蒙顿市的信息可视化与设计公司Darkhorse Analytics。
他们整理了四个示例来展示如何提升数据墨水比。我们将在下一个阅读任务中提供链接,但这里我们先详细讲解第一个示例。

以下是优化图表、提升数据墨水比的具体步骤:
我们从一个关于食品及其卡路里含量的数据表格开始。
第一步是移除无用的背景图像,因为它对理解图表毫无价值。
我们同时移除了条形图后面的灰色背景,因为它没有提供任何概念上的价值。
接着,我们消除整个图表中的冗余信息。这包括移除图例,因为每个条形图都可以直接在坐标轴上标注。
标题和Y轴标签也被精简,因为整个图像中有足够的线索表明这是关于食品卡路里的图表。

这样我们就得到了一个更简洁的图像。但还有一些构成边框的粗线,它们同样没有价值,因此也可以移除。
在图表中使用颜色是一个需要谨慎处理的问题。我们将在本课程中深入探讨色彩理论。但对于色觉缺陷或色盲人士来说,颜色可能带来挑战。有一些应对策略,例如,过去的最佳实践是用图案(在图形中有时称为“影线”)来替代颜色。但这本身也会带来新的挑战,我们稍后会看到。

因此,解决方案几乎总是移除所有颜色,只保留一种用于强调,并在文本中明确引用这种颜色。这样,即使有人脱离上下文查看图表,也能感受到重点,而不会被数据的“彩虹”所淹没。
所以,让我们移除除培根(假设文本中明确引用了此数据)之外的所有颜色。
三维条形图和投影也可以去掉,因为它们没有增加额外价值。我们还可以去掉整个图表的描边。
图像中仍然保留了很多网格线,但不太清楚这些网格线的价值是什么,所以我们决定移除它们。网格线有时是有价值的,但它们常常只是一种干扰。
现在,请研究一下图像:我们感兴趣的数据点培根,与薯片或辣热狗之间的卡路里数量差异是多少?

仅仅移除线条并没有让图表更容易阅读。

但由于这里的数据值相当简单,让我们直接在图形中为每个条形图添加标签。
现在,培根和薯片,或者培根和辣热狗之间的差异有多大?你当然需要做一些计算,但通过直接比较数字,你仍然可以快速估算出精确值。
就这样,通过提高数据墨水比,我们不仅使图形更简洁、更易读,还增加了观众看到的信息量。

我们鼓励你查看下一个阅读材料中链接的Darkhorse Analytics的其他示例,因为他们为包括地图在内的各种不同视觉图形进行了这种清理工作。
在下一讲中,我们将通过探讨图表垃圾来继续学习Tufte的启发式原则。



本节课中,我们一起学习了Edward Tufte的数据墨水比原则。我们理解了其核心是最大化图表中用于传达核心数据的“墨水”比例,并移除所有冗余和非信息性元素。通过一个从复杂条形图逐步简化为清晰直接标签图的示例,我们掌握了应用这一原则的具体步骤,从而创造出信息更密集、更易于理解的视觉展示。
27:图形启发式:冗余图表元素(Edward Tufte理论)📊


在本节课中,我们将要学习Edward Tufte提出的一个重要概念——“图表垃圾”。我们将了解它的定义、三种主要类型,并通过一个用户研究案例,探讨装饰性图表元素的实际效果。
概述

Edward Tufte引入的另一个启发式概念被称为“图表垃圾”。Tufte对图表垃圾的批评远甚于其他形式的非数据墨水。他认为,统计图表上的艺术装饰就像数据图形中的杂草。
图表垃圾的三种类型

Tufte指出,图表垃圾主要有三种类型。
以下是第一种类型:无意的视觉艺术。
- 例如,对图表特征进行过度的阴影或图案填充。
- 正如Tufte在其著作《量化信息的视觉展示》中分享的经济学图表所示,这些图案会导致人眼跳动并引起视觉疲劳。
- 这种现象被称为“莫尔条纹”,这也是为什么在拍摄像本慕课这样的视频内容时,通常不会看到人们穿条纹衬衫的原因,因为视频的低分辨率会加剧莫尔条纹问题。
- Tufte建议,与其用图案填充内容,不如直接在图表图形上添加标签。我们在Dark Horse Analytics的“数据与图形”示例中看到了这种做法的应用。
上一节我们介绍了无意的视觉艺术,本节中我们来看看第二种类型:网格线。
- Tufte认为,网格线作为数据墨水是不必要的,并且会与所分享的实际数据形成竞争。
- 淡化、移除或降低网格线的饱和度,可以让人更容易看清数据,而不会被页面上的大量线条所淹没。
- 直接标注数据是减少这种图表垃圾的另一个好方法。
在了解了前两种类型后,第三种图表垃圾是我们讨论的重点,它通常也是人们提到“图表垃圾”时首先想到的。Tufte称之为“鸭子”。

- 广义上,他指的是非创造性的图形,无论是线条艺术还是照片,以及它们在图表中的包含。
- 报纸和杂志是经常使用这类图像的地方。
- 一位知名的图形艺术家Nigel Holmes,曾用“鸭子”以一种令人难忘且具有美学趣味的方式展示数据。
- 他创作的最令人难忘的图像之一名为《钻石是女孩最好的朋友》,于1982年出现在《时代》杂志上。
- 该图表显示了1978年至1982年钻石价格的趋势。虽然具体的美元金额很容易被遗忘,但由于女性腿部线条的形状,人们很容易记住趋势曾出现过一个峰值。
关于“鸭子”的用户研究

那么,“鸭子”真的是一种有用的启发式方法吗?还是说只是“鸭子”本身令人难忘?
我曾是Scott Bateman领导的一个团队的一员,我们希望更详细地理解这个问题,因此我们进行了一些用户测试。本周的阅读材料中链接了完整的学术论文。
简而言之,我们向参与者提供了各种Holmes的图像(包括刚才展示的那张,可被视为图表垃圾),以及一系列具有高数据墨水比例、没有装饰性修饰的普通图表。
我们将24名受试者带入实验室,并分配他们查看Holmes的图表或高数据墨水比例的图表。
我们要求受试者通过一系列引导性问题来描述和总结这些图表。
随后进行了回忆测试,包括立即进行的测试,以及两到三周后的第二次测试。最后,我们使用眼动追踪来确定受试者在查看这些图表时的注意力所在。
我们的发现很有趣:虽然在立即测试时没有回忆差异,但在两到三周后,对于展示“鸭子”类图表垃圾的Holmes图表的回忆明显更好。
此外,受试者主观上表示Holmes图表更令人愉快、更有吸引力、更容易记住且更容易记住细节。他们认为描述和记忆Holmes图表的速度更快。非装饰性设计在任何方面都没有比Holmes的设计表现得更好。
总结与思考
本节课中我们一起学习了Edward Tufte的“图表垃圾”理论。我们探讨了它的三种类型:无意的视觉艺术、冗余的网格线以及装饰性的“鸭子”图形。通过一个用户研究案例,我们发现装饰性图表在长期记忆和主观体验上可能具有优势。
这是否意味着你应该在图表中使用装饰性元素呢?也许吧。我不知道是否有人在更大、更多样化的人群中复制了我们的发现。当然,还有其他类型的图表垃圾,比如无意的视觉艺术和网格线,这些似乎是非常好的启发式原则。但我认为这个故事还有更多内容有待讲述,更多细微差别有待厘清。
至此,你应该至少对来自设计师的观点,以及针对特定类型图表的用户研究有了一些思考。在你创建数据科学图形时,值得反思的不仅是你所使用的原则和你所分享的结果,还包括你构思和创建图形的过程。
如今,借助Crowdflower和Amazon Mechanical Turk等众包服务,设置用户研究要简单得多。对于普通的数据科学家来说,测试更具装饰性的视觉设计是否可能更有效(无论是在时间、记忆性还是准确性方面),已经变得非常可行。


在下一讲中,我们将继续探讨Tufte提出的另外两个概念:数据墨水比率和火花图。
28:图形启发式:失真系数与迷你折线(Edward Tufte理论)📊


在本节课中,我们将学习爱德华·塔夫特提出的两个重要图形设计概念:迷你折线图和失真系数。这些概念旨在帮助我们更清晰、更诚实地呈现数据。
爱德华·塔夫特对简洁和极简主义的强调赢得了大量追随者。他被广泛认为是图表和图形可视化领域最具影响力的作家之一。
在他的著作《美丽的证据》中,他提出了一个将图表极简主义提升到新高度的想法。他建议,不应将图表作为一个独立的、需要单独研究的对象,而应将其简化并嵌入到讨论的上下文中。他认为,一个小的图形,例如一个时间序列折线图,可以快速传达更多信息,这对读者来说是无价的。他将这些元素称为“迷你折线图”,并称之为“数据词汇”,这是一种弥合文本与图形之间差距的有趣方式。
他提出,迷你折线图不仅可以直接呈现在文本中,还可以与它们所描述的数据一起嵌入到表格里。这个想法变得如此自然,以至于它甚至被最常用的电子表格分析软件之一——微软Excel所采纳。
迷你折线图的应用实例 📈
以下是迷你折线图在数据呈现中的具体应用。
上一节我们介绍了迷你折线图的概念,本节中我们来看看它的实际应用。以下是一个来自纳斯达克股票交易所的表格数据图片,显示了四只科技股在一个月内的开盘价。

花点时间思考一下这些数据。哪只股票本月表现不佳,呈下降趋势?哪只股票表现良好,呈上升趋势?


如果我在下面的单元格中添加迷你折线图呢?



现在,这些迷你折线图并不能帮助我们回答谁的股价最高,或者谁获得了最大的收益或损失,但它们确实让我们对数据背后的趋势有了一个总体的感觉。实际上,迷你折线图用于那些趋势或分布特征很重要的数据。
以下是迷你折线图在谷歌财经网站上的另一个例子。


请注意,你实际上可以快速放大这些迷你折线图的某些部分,因此它们不仅仅是数据的表示,也是一种与之交互的方法。

迷你折线图有许多不同的用途,定制化界面(如电子游戏)就是一个很好的例子。我认为一个现代版的、很酷的迷你折线图变体叫做“Spark T”,它使用Unicode块字符在Twitter分配的1到40个字符内显示条形图。

例如,这里一位用户将她四月份的睡眠时间以条形图的形式发布在推特上。


失真系数:识别图形误导 🔍
了解了如何用迷你折线图高效展示趋势后,我们还需要警惕图形可能带来的误导。接下来要分享的最后一个塔夫特原则叫做“失真系数”。

失真系数是图形中显示的效果大小除以数据中实际效果的大小。其公式可以表示为:

失真系数 = 图形效果大小 / 数据效果大小
这通常是无意识地为了帮助讲述一个故事而做的。然而,这对观察者来说是具有误导性的。失真系数有很多不同的例子。我认为1979年《时代》杂志的这个例子提供了一个很好的例证。

在这张图中,显示了不同油桶,展示了六年间的石油价格,但观察者不清楚一个油桶的大小与其他油桶的关系。部分原因是这里存在透视元素。这些油桶是大小不同,还是仅仅因为有些在前、有些在后而显得不同?是油桶的体积代表了成本的增长,还是油桶的高度?


总结 📝
本节课中我们一起学习了爱德华·塔夫特提出的两个核心图形设计工具。迷你折线图和失真系数是爱德华·塔夫特为我们提供的另外两个工具,用于理解和传达数据。

迷你折线图鼓励我们将简洁的图形嵌入上下文,快速传达趋势。而失真系数则是一个重要的检查工具,提醒我们确保图形表示与底层数据真实匹配,避免无意或有意地误导观众。掌握这两个概念,能帮助我们在公共部门的数据分析中制作出既高效又诚信的可视化图表。




29:Alberto Cairo的《真实艺术》设计理念 🎨


在本节课中,我们将学习Alberto Cairo在其著作《真实艺术》中提出的核心设计理念。Cairo为评估信息图表的质量构建了一个五维框架,这对于任何数据科学家而言都至关重要。我们将逐一探讨这五个相互关联的品质,并通过实例理解如何将它们应用于实践。
真理性的重要性 📊
上一节我们介绍了评估信息图表的整体框架,本节中我们首先来看看第一个,也是最重要的品质:真理性。
Cairo承认“真理”可能具有主观性,且存在于一个连续谱系中,要确立绝对真理或许是不可能的。但他认为,作为数据科学家,我们在维护真理方面有两项义务。
以下是数据科学家在维护真理性时的两项核心义务:

- 对自身诚实:在清洗和汇总数据时,我们必须审视自己的行为。我们所做的修改是否会因为施加的限制而模糊了信息?我们应该明确考虑对数据的每一次修改,确保自己没有陷入所谓的“自我欺骗”。怀疑精神是数据科学家的重要技能,我们常常过于专注于寻找模式,以至于以不符合所描述现象本质的方式来简化或呈现数据。
- 对受众负责:数据科学和信息可视化领域存在一些技术,可以用来突出特定的数据片段。这通常是这些领域的目的。但如果我们剥夺了读者更全面探索现象的能力,就会引发怀疑和不信任。
Cairo提供了一个由美国有线电视和电信协会发布的图表作为反面案例。该图表试图暗示放松监管后,有线电视公司的行业投资增加了四倍。
该原始图表存在几个明显问题:

- 货币数值是否经过通货膨胀调整不明确。
- 两个柱状图所代表的时间跨度不同(一个三年,一个四年),但宽度相同,这在设计上是不可原谅的。
- 图表缺失了1997和1998年的数据,且止于2003年,而该信息发布于2014年。

Cairo追踪数据后提供了一个更诚实的折线图。该图显示,监管后确实有持续的投资年份,放松监管后支出有短暂下降和巨大峰值,随后从2002年后显著下降——而原始图表排除了这部分数据。
这里的教训是:虽然可能没有绝对真理,但存在比其他方式更真实的数据呈现方法。
功能性的考量 ⚙️
在理解了真理性的核心地位后,我们接下来探讨第二个品质:功能性。这同样是一个连续谱系。
我们之前见过一个例子,即Datawrapper提供的“数据墨水比”幻灯片。如果你预期受众需要比较两个数据序列,直接为它们添加标签是提高理解度的一种方法。

虽然有许多提高功能性的启发式方法,但希望你记住我们使用“图表垃圾”进行的用户测试。我认为,现在是理解特定情境下人类行为的激动人心的时刻。网络极大地提高了我们在不同人群中大规模测试社会和行为假设的能力,CrowdFlower和Amazon Mechanical Turk就是其中的两个例子。

理解某种可视化方法的功能性如何,不一定需要昂贵的人种学研究。现在通过众包直接测试假设要容易得多。

美观性的作用 🖼️
一个图表仅仅功能完备还不够,它是否赏心悦目也同样重要。这就是Cairo提出的第三个品质:美观性。

我认为这需要非常了解你的受众。基于人们的生活经历以及性别、文化等自身因素,会有不同的感知。构建一个美观的信息可视化体验涉及很多方面,这也取决于情境和背景因素。

例如,如果你在为一份报告制作图表,你所选择的颜色、样式乃至字体,可能更多地与美观性而非功能性相关。但这些元素的相互作用是难以忽视的。我在想,美观性这个广泛的主题,是否是导致“图表垃圾”与“记忆性”问题研究结论相冲突的混淆因素之一?
虽然Tufte认为图表垃圾会分散注意力并产生误导,但Bateman等人的研究表明它可以使可视化更令人难忘。这种脱节是否源于信息图表中的美观性问题?
关于美观性和信息,这里有一个发人深省的思考,或许能阐明这一品质。最受欢迎的科技杂志之一《连线》,以其整版的信息图表而闻名。在《连线》的网站上,他们将这些文章标记为“信息色情”,意指他们希望读者在阅读文章时能产生一种发自内心的反应。
洞察力的价值 💡
一个美观的图表能吸引眼球,但真正优秀的图表能引发思考。这就是Cairo提出的第四个品质:洞察力。

信息图表不应仅仅复制数据和表格,而应吸引观看者,使其产生“啊哈!”或“我发现了!”的顿悟时刻。我主要在学术论文的背景下思考这一点。

该领域的新手作者常犯的一个错误是,为他们拥有的每一份数据都配上一张图。这完全没有必要,会增加冗余并导致读者疲劳。但恰当的图表能迅速阐明研究结果。在我的领域,同行评审很常见,但评审者在翻阅投稿论文时并没有大量时间进行完整评审。当一个图像跃然纸上并立即给予他们洞察时,这便为他们理解论文其余部分所要讲述的更细致入微的故事做好了准备。
启迪性的社会责任 🌍

最后,Cairo提出的第五个品质是:信息图表应具有启迪性。
这与洞察力不同。事实上,Cairo认为这一品质由前四个品质(真实、功能、美观、洞察)构成,但它是独立的,因为它增加了一个社会责任维度。

我认为这个问题没有明确的答案。但毫无疑问,Cairo提出的优秀可视化的五个品质——真实、功能、美观、洞察、启迪——非常值得考虑。Cairo有更多杰出的工作。在本讲座之后,我布置了一篇他的阅读材料以及一个讨论问题,鼓励你们就信息可视化与数据科学相关的非道德性发表看法。
总结 📝


本节课中我们一起学习了Alberto Cairo在《真实艺术》中提出的信息图表五维评估框架。我们探讨了真理性的核心地位,功能性的实用考量,美观性对受众体验的影响,洞察力在传达信息时的关键作用,以及最终启迪性所承载的社会责任。这五个品质相互关联,共同构成了优秀数据可视化的基石。掌握这些理念,将为我们在后续课程中专注于应用数据科学技能打下坚实的基础。
30:设计思维工具集 📊


在本节课中,我们将学习阿尔贝托·开罗在其著作《The Functional Art》中提出的一个用于思考信息图表设计权衡的工具——可视化轮。我们将探讨该工具的核心概念及其多个设计维度,并通过具体案例理解如何应用这些维度来分析和比较不同的可视化设计。

阿尔贝托·开罗在其著作《The Functional Art》中,提供了一个思考信息图表设计权衡的工具。他称这个工具为“可视化轮”。
在这个概念模型中,一个圆环有两个极点。顶部的极点代表高度复杂的数据,能提供深层次的信息。底部的极点则提供更易获取数据的方式,但信息深度较浅。圆环内包含多个维度,这些维度描述了两种不同设计方法之间的权衡。虽然开罗提供了许多有趣的维度,但需要强调的是,这是一个供设计者思考其可视化作品的工具,其本身并非严格意义上的分析工具。



针对任何特定问题的需求,都可能改变哪些维度是重要的,或者可能引入需要考虑的新维度。开罗认为,我们在组织中的角色或专业背景也可能影响我们想要制作的图表类型。因此,我想问正在学习数据科学的你:你试图通过你的可视化作品触达谁?


让我们深入探讨开罗所考虑的几组设计权衡。

以下是第一组权衡:抽象与具象。高度具象的视觉作品使用现象本身的物理表现形式来描述现象,例如照片或绘画。当表现形式变得不那么真实、更具概念性时,重点就从具象转向了抽象。

他讨论的第二个维度是功能与装饰。一个完全功能性的图表没有任何修饰,更接近于数据的直接呈现。而一个装饰性很强的图表则具有更多的艺术修饰。


与所有这些维度一样,这里没有绝对的好坏之分。装饰可能会增加观看者思考视觉作品的时间,探索其细微差别并形成心理联想,这可能会增加熟悉度和记忆性。
第三个维度是密度与轻量,这与所展示的信息量有关。科学视觉作品中有很多很好的例子,其中一些图表旨在深入研究,而另一些则旨在快速补充叙述。

在比较杂志中的信息图表时,可以看到这个维度在起作用,因为读者可能更深入地参与内容。而在同一本杂志中比较广告时,读者可能只会快速浏览广告。
以下是我研究领域的一个例子,由哈佛大学和麻省理工学院发布,描述了edX大规模开放在线课程平台用户的访问模式。
花点时间研究这张图片。你能从这张图片中理解到什么?
如果我们考虑开罗的第三个维度,很难不说这是一张相当密集的图表。图表的主要部分是一个散点图,有两个带标签的轴。左侧和底部的两个子图是直方图,同样有轴。直方图的轴可能有点令人困惑,因为它们与散点图的轴重叠,但改变了度量单位和测量方向。例如,散点图顶部的X轴使用“访问章节百分比”作为度量单位,并随着向图形右侧移动而增加。然而,图表左侧直方图的同一个X轴的单位是“千人”,并随着向图形左侧移动而增加。图表上叠加了一些红线,将散点图大致划分为四个象限。但由于标签极少,这些象限最终代表什么并不十分清楚。

无论这是否是一个好图表,它肯定可以被视为一个密集图表的例子。

开罗提出的第四个方面是图表的维度性。一个多维度的图表将现象作为一个整体来描述,并邀请观看者探索现象的许多不同方面。而一个单一维度的图表则专注于一个或少数几个项目,并以一种或多种方式探索它们。

第五个维度是原创性与熟悉性。在现代世界,我们习惯于看到各种各样的信息图表,比如条形图和折线图。以这些表现形式进行思考在很小的时候就被教授。例如,我快五岁的女儿前几天从学前班带回一页纸,上面展示了她和其他同学在课堂上制作的条形图。为了庆祝了解美国大选,全班同学一起投票决定吃什么零食:巧克力冰淇淋还是薄荷巧克力片冰淇淋。当然,薄荷巧克力片冰淇淋赢了,正如人们所料。但我想说的是,这些是以图形形式思考数据的基本方式,现在很早就开始教授了。这使得它们为广泛人群所熟悉。
然而,情况并非总是如此。可以说,条形图对大多数人来说是相当熟悉的,但一个更具原创性的图表包含需要用户解释或研究的元素。
以下是查尔斯·米纳德绘制的一张非常著名的图表。它描述了拿破仑1812年进军俄罗斯的情况。花点时间研究这张图表。
广义上讲,这张图表中可视化了五种不同类型的信息。你看到了这五种信息中的多少种?
以下是我看到的。首先,是地理元素,表现为沿途的各种河流和城镇。顶部浅色条带的宽度代表拿破仑军队的规模,你可以看到它在战役开始时从42.2万人减少到法军抵达莫斯科时的仅10万人。底部的黑色条带显示了拿破仑从俄罗斯的撤退,沿途有多个点,这些点与日期和摄氏温度相对应。我们看到随着军队规模急剧缩小,条带也急剧变细。

因此,米纳德可视化中的五种数据包括:位置、方向、温度、军队规模和日期。
开罗分享的最后一个维度是新颖性与冗余性维度。冗余性是指图表倾向于以多种不同方式讲述同一个故事。例如,你可能会在条形图中使用条形的高度(配合坐标轴)以及颜色来强调最大的条形。

这个维度有点棘手。你不想让读者感到无聊,也不想让你的图表过于复杂,但你确实希望以支持读者理解你所描述现象的方式来编码信息。在这个维度上,新颖性是指以唯一一种方式描述图表中的每个现象。
在可视化轮中没有绝对的对错,该轮的目的是帮助你理解和比较你可能采取的可视化方法。


作为一项反思活动,开罗建议你可以沿着这些维度绘制你的有序思考,然后将这些点连接起来创建一个雷达图。
这里,开罗提供了两个可视化轮的实际应用示例。在左侧,你可以看到更侧重于复杂视觉,即那些密集、多维且功能性高的图表。在右侧的可视化轮中,则包含了更多装饰、轻量和具象的元素。
开罗认为,左侧的轮更倾向于科学家和工程师所做的工作,而右侧的轮则更倾向于艺术家、平面设计师和记者所做的工作。科学家和工程师看待数据可视化的方式与艺术家和记者看待的方式之间的这种张力非常有趣,我们将在下周结束时再次讨论。
在下一讲中,我们将更深入地探讨爱德华·塔夫特关于什么构成良好可视化的一些启发式方法。可视化轮是我们用来更好地比较两种不同信息可视化方式的工具之一。在下一讲中,我们将深入探讨,看看你如何使用可视化轮来评估自己的图表。
本节课总结


本节课我们一起学习了阿尔贝托·开罗提出的“可视化轮”设计思维工具。我们了解了该工具用于权衡可视化设计的六个核心维度:抽象与具象、功能与装饰、密度与轻量、维度性、原创性与熟悉性以及新颖性与冗余性。通过具体案例的分析,我们认识到没有绝对“正确”的设计,关键在于根据目标受众和沟通目的,在这些维度之间做出有意识的权衡。可视化轮是一个强大的反思工具,能帮助我们分析和改进自己的可视化作品。
31:小型多图展示技术 📊

在本节课中,我们将要学习一种名为“小型多图”的数据可视化技术。这种技术由爱德华·塔夫特在其著作中提出,能够高效地展示高密度信息,并帮助我们快速识别数据中的趋势。我们将重点学习如何在R语言的ggplot2包中,通过“分面”功能来实现小型多图。
小型多图的概念
爱德华·塔夫特在其著作《量化信息的视觉展示》中介绍了小型多图技术。他将小型多图描述为类似于电影帧的序列,即一系列展示相同变量组合的图形,这些图形通过其他变量的变化进行索引。
虽然这个概念在应用上可能有一些灵活性,但其核心贡献在于,它允许我们一眼看到高密度的图形,并从中识别出感兴趣的趋势。在ggplot2中,实现小型多图的功能根植于其分层的图形语法。
ggplot2的图形语法回顾
从本课程的第一讲我们就知道,ggplot2中每个图层内部有五个核心语法概念:数据、美学映射、几何对象、统计变换和位置调整。
除了这些核心概念,还有三个跨图层工作的语法元素:标度、坐标系和分面。我们已经见过如何使用标度来更改坐标轴标签,以及如何使用坐标系来翻转坐标轴。坐标系的功能还有很多,例如从笛卡尔坐标系转换为极坐标系,但这相对少见,本课程不做深入探讨。本节课,我们将重点介绍最后一个语法元素——分面。
分面是指根据一个或多个变量将数据分割成子集,然后在网格中独立绘制每个子集。这正是塔夫特所描述的小型多图。
实践:创建小型多图

接下来,我们通过一个实际的数据集来演示如何创建小型多图。我们将使用渔业数据,并首先关注非船只观测数据。
以下是数据准备步骤:
- 导入渔业数据。
- 筛选出非船只的观测数据。
- 修正“模式”变量的字母大小写。

# 假设数据已加载为 `fishing_data`
non_boat_data <- fishing_data %>%
filter(mode != "boat") %>%
mutate(mode = str_to_title(mode)) # 修正大小写

单变量分面示例
我们想探究不同年份间“努力量”的分布是否发生变化。首先,我们仅查看“船只”这一模式,并观察九个不同年份的数据。
以下是具体步骤:
- 筛选出“船只”模式的数据。
- 选择2011年至2019年(包含首尾)的数据。
- 绘制图形,x轴为月份,条形高度为总努力量。
- 使用
facet_wrap()函数按年份进行分面。
boat_data_years <- non_boat_data %>%
filter(mode == "Boat", year %in% 2011:2019)
ggplot(boat_data_years, aes(x = factor(month, levels = 1:12), y = total_effort)) +
geom_col() +
facet_wrap(vars(year)) +
labs(x = "Month", y = "Total Effort")
运行上述代码后,我们将得到一组按年份排列的小型多图。每个子图共享相同的坐标轴标签,但通过年份标签进行区分。我们可以清楚地看到,船只活动的分布在2011年达到峰值,到2019年已大幅下降。
分面与复合图的区别
上一节我们介绍了facet_wrap的基本用法。这里需要注意,分面图看起来可能与我们之前用cowplot包拼接的复合图类似,但两者有本质区别。

使用plot_grid拼接时,是将多个独立的ggplot对象组合在一起,它们不共享底层图层。而从图形语法的角度来看,分面图中的所有子图共享同一套图层设置。facet_wrap只是选择了一个额外的变量来分割数据,这本质上是一个单一的图形。
添加更多变量
我们当然可以在分面图中添加更多变量。例如,我们可以根据不同的“模式”为条形图设置不同的填充颜色。
以下是具体步骤:
- 保留数据集中的“模式”变量。
- 将“模式”映射到填充颜色。
- 同样使用
facet_wrap()按年份分面。
ggplot(non_boat_data, aes(x = factor(month, levels = 1:12), y = total_effort, fill = mode)) +
geom_col() +
facet_wrap(vars(year)) +
labs(x = "Month", y = "Total Effort", fill = "Mode")

使用facet_grid创建网格分面

分面的乐趣不止于此。facet_grid函数允许我们在一个网格中,从行和列两个维度来比较两个不同的变量。
例如,如果我们想比较少数几个年份的数据,并以不同的模式值作为行和列,我们可以通过指定行变量和列变量来实现。
以下是具体步骤:
- 减少选取的年份数量,以便于在网格中展示。
- 将
facet_wrap改为facet_grid。 - 指定行方向为年份,列方向为模式。
selected_years_data <- non_boat_data %>%
filter(year %in% c(2015, 2017, 2019))

ggplot(selected_years_data, aes(x = factor(month, levels = 1:12), y = total_effort)) +
geom_col() +
facet_grid(rows = vars(year), cols = vars(mode)) +
labs(x = "Month", y = "Total Effort")
你可以想象,通过添加更多变量(例如湖泊),我们可以构建出相当复杂且有趣的小型多图来深入探索数据。

总结

本节课中,我们一起学习了“小型多图”这一强大的数据可视化技术。我们了解了它的概念,并重点掌握了在ggplot2中通过facet_wrap()和facet_grid()函数实现分面的方法。分面允许我们基于一个或多个变量分割数据,并在同一框架下并排比较多个子图,这有助于高效揭示数据中的模式和趋势。
32:散点图矩阵应用 📊
在本节课中,我们将要学习一种常用于分析大型数据集的特殊小倍数图——散点图矩阵。我们将了解它的概念、与分面图的区别,并通过一个实际案例演示如何使用R语言创建和解读散点图矩阵。
散点图矩阵是一种强大的数据探索工具,它通过可视化数据集中所有变量之间的两两比较,帮助分析师快速发现变量间可能存在的相关性或趋势模式。
散点图矩阵与分面图的区别
上一节我们介绍了小倍数图的概念,本节中我们来看看散点图矩阵这一具体应用。散点图矩阵和分面图都是小倍数图的例子,但它们在概念上并不相同。
分面图会根据你变量中的值,将其展开为行或列,从而创建更多的图表。然而,这些图表中的每一个都可以任意复杂,并且可以包含许多不同的变量。

另一方面,散点图矩阵一次只创建两个变量的散点图,但它会为数据集中的所有变量都这样做。因此,分面图和散点图矩阵虽然都属于小倍数图,但概念上并非同一事物。
数据准备
我们的钓鱼数据(phishing data)缺乏许多连续变量或有序值,而散点图需要这类数据才能有意义。然而,我们从BRFSS获取的人口数据则具备这些条件。因此,我将引入我们在人口金字塔讲座中使用过的数据集,进行一个快速的演示。

以下是来自人口金字塔讲座的代码,我做了一些更新,以便只查看有序或连续的数据。

# 代码示例:导入并筛选数据
# 这里导入了各种不同的变量:收入水平、种族水平、性别水平、年龄,以及关于心理健康问题的答案。
# 然后进行过滤,关键点在于我只保留了“性别”作为因子变量,其他变量不作为因子使用。
运行这段代码可以完成快速的数据清理工作。
创建散点图矩阵
要创建散点图矩阵,我们可以使用GGally包,它引入了多种新的绘图方法,包括ggpairs方法。
# 代码示例:使用GGally包创建散点图矩阵
library(GGally)
R语言的一个令人困扰之处是缺乏统一的命名规范。与其他大多数库不同,这个包名以两个大写字母“GG”开头,请注意这一点。
我们不需要为这个图使用ggplot基础图层,可以直接调用ggpairs函数。我们需要提供数据,但提供美学映射是可选的。X和Y轴的美学实际上将由其他参数选择。
我们没有“列”参数(指绘图布局的列),但我们有一个columns参数,重要的是,它指的是我们数据表中的列或变量,而不是图表的列。
以下是创建散点图矩阵的代码步骤:
- 调用
ggpairs函数并传入数据。 - 设置美学映射,例如按性别着色。
- 通过
columns参数指定要包含的变量列表,例如收入、体重、身高和年龄分组。 - 可以添加其他参数进行自定义。
# 代码示例:创建散点图矩阵
ggpairs(data = my_data,
mapping = aes(color = sex),
columns = c("income", "weight", "height", "age_band"))
我将把这个图保存到一个文件中,以便打开并进行解读。
解读散点图矩阵
现在,我们可以从散点图矩阵中观察到哪些模式呢?目前,唯一立即引起我注意的是身高和体重之间的关系。
我们可以看到身高变量在这里,体重变量在这里,它们的交互作用图就在这个位置。图中似乎有一条对角屏障。我们的两种性别用颜色区分,这是男性,这是女性。
我们可以观察到身高和体重之间的关系:一个人很难同时非常高又非常轻(像右下角这个点),这种情况几乎不存在。相反的情况则不必然成立,你可以又高又重,也可以又高又轻,这些都分布在这个区域。
从着色中我们还能看出,男性往往比女性更高。这通过颜色分布得以体现,男性(桃色)集中在更高的身高区域,而女性(深色)则分布在较矮的身高区域。
我们可以在多个图表中看到这一点,任何与身高有交互的变量都是如此。例如,观察身高和收入这个图,我们也能看到一个明显的区分:总体上男性更高,女性更矮。但这并不能告诉我们太多关于收入的信息,因为收入是横轴(请注意这些是因子,我们没有标记它们,所以显示的是数值)。
同样,在身高和年龄的图中,沿着散点图矩阵看下来,这里再次有一条明显的区分线,男性倾向于更高,女性倾向于更矮,但这对于了解年龄信息本身并不十分具有启发性。
矩阵中的相关性分析
ggpairs的一个优点是它会自动计算并显示一些相关性统计检验结果。我们尚未深入讨论这些检验,但它们会自动呈现在此图表中。
以下是我们可以从矩阵中解读的一些相关性:

- 身高与体重:计算出的相关性显示它们呈正相关。随着人们身高增加,体重也倾向于增加,反之亦然。我们可以看到,这种相关性在男性中比在女性中更强。
- 年龄与收入:如果观察年龄和收入,会发现存在轻微的负相关,这对男性和女性都成立。随着年龄增长,收入在此数据集中呈现下降趋势。
- 身高与收入:最后,这里还存在一个正相关关系,同样对男性和女性都适用:随着身高增加,收入也增加。
需要强调的是,相关性不等于因果性。我们并不知道是身高导致一个人赚更多钱。事实上,如果我们要因果性地联系这两个变量(很可能它们之间根本不存在任何因果联系,而是都与第三个变量相关),另一种可能的因果解释是:随着人们赚更多钱,他们变得更高——当然,这听起来不太可能,也许只是他们觉得自己更高了。请记住,这些都是自我报告的数据。
总结



本节课中我们一起学习了散点图矩阵的应用。我们了解了散点图矩阵作为小倍数图的一种,用于可视化数据集中所有变量对之间的关系,帮助快速识别趋势和相关性。我们区分了它与分面图的不同,并通过实际数据演示了如何使用GGally包的ggpairs函数创建散点图矩阵。最后,我们学习了如何解读矩阵中的散点图模式以及自动计算的相关性统计,并再次强调了相关性与因果性的区别。散点图矩阵是探索性数据分析中的一个强大工具,能够为后续的深入分析提供初步的洞察和方向。
33:2019世界数据可视化大奖解析 🏆
在本节课中,我们将一起解析2019年世界数据可视化大赛静态图像类别的获奖作品。我们将了解其传达的核心信息、设计构成,并探讨其成功的原因,同时也会关注其背后使用的R语言代码。
课程即将结束,我们有一个简短的内容与大家分享。
布鲁克斯教授和我希望提请各位注意一幅数据可视化作品,它在2019年世界数据可视化大赛的静态图像类别中荣获一等奖。
获奖设计师是迪米特·托什科夫,他是荷兰的一位公共管理学教授。
他的获奖作品探讨了一个国家的人类发展水平或个人繁荣程度,与该国或该州基于政府效能水平的自由度之间的关系,并试图揭示这种关系是否因国家规模的不同而有所变化。
这幅可视化作品试图传达大量信息,并且成功地完成了这个任务。
托什科夫教授的可视化作品包含三个组成部分,正如您所看到的。
首先,是一个散点图。
其次,是右上角的一张小地图。
最后,是一系列密度山脊图,这些图显示小国往往比中等规模和大规模国家更政治稳定、更少腐败、更自由。
然而,该可视化也向我们展示,最近一段时间,小国在这些重要领域取得的改进或成就较少。
这幅静态可视化作品中的所有图表都是使用R语言,借助ggplot2和worldmap库完成的。
托什科夫教授已公开分享了他的R代码,我们也为您提供了链接,请务必查看。
现在,我们希望您思考并考虑两件事。
第一,花点时间研究这幅可视化作品本身,理解它试图传达的所有信息。当您观察它时,请思考为何这项作品能赢得世界级奖项。是什么使其在沟通目标上如此成功。
第二,查看该可视化作品的R代码,并请务必记住,越来越多的人正在公开分享他们的代码供他人(包括您)使用和在其基础上构建。这确实是一个代码共享的广阔世界,无论您处于数据分析职业生涯的哪个阶段,这都将是一个极好的资源。


在本节课中,我们一起学习了2019年世界数据可视化大赛的获奖作品。我们分析了其通过散点图、地图和密度山脊图等多组件设计传达复杂信息的方法,并强调了公开共享代码在数据分析领域的重要价值。希望这次解析能启发您对数据可视化深度与美学的思考。
34:恭喜完成本课程学习 🎉

在本节中,我们将回顾您刚刚完成的课程内容,并展望下一阶段的学习旅程。
恭喜您完成了我们“公共部门数据分析”系列中的第二个课程。至此,您已经完成了证书要求的一半进度。我们希望此刻您已感觉到自己正在熟练地掌握在R中处理和可视化数据的技能。
同时,我们也希望您对公共部门以及数据分析在公共行政和公共政策制定所有职能与支柱中的重要作用,有了更深入的理解。
课程回顾与核心要点
上一节我们完成了具体技能的学习,现在我们来总结本课程的核心内容。
在本课程中,您花费了大量时间与我一同学习。我们涵盖了许多内容,从ggplot2的理论基础与图形语法,到如爱德华·塔夫特和阿尔贝托·开罗等作者提出的优秀信息可视化原则。
以下是本课程涉及的核心概念与工具:
- ggplot2:这是一个基于图形语法的R包,用于创建复杂的多图层图形。其基本语法结构为
ggplot(data = <DATA>) + <GEOM_FUNCTION>(mapping = aes(<MAPPINGS>))。 - 图形语法:这是ggplot2的底层哲学,它将图表视为由数据、几何对象、美学映射、统计变换等多个组件组合而成。
- 优秀可视化原则:这包括强调数据的完整性、避免图表垃圾、确保视觉元素能够清晰有效地传达信息。
下一课程前瞻
本节我们回顾了已学知识,接下来我们将了解后续课程的重点。
在接下来的课程中,您将继续听到我的讲解。这门新课是关于利用数据与政策分析来辅助公共部门决策。我们将重点关注数据分析在政府决策中的重要作用。
您将获得关于此项工作中使用的两种主要政策分析类型的详细指导:
- 前瞻性政策分析:实际使用数据来尝试预测或预报未来。
- 回顾性政策分析:涉及使用数据来评估已实施的项目或政策。
在下一门课程中,您将继续练习专业课程前两门课中学到的数据处理和可视化技能。但在此基础上,我们将向您介绍如何使用R进行基本的推断统计,并详细带您完成两个真实的公共部门数据分析案例。
我们将为您提供来自多个不同国家的许多真实案例,说明不同类型的政策分析对于政府行政和立法部门决策的重要性。此外,我们还将邀请几位出色的客座专家加入课程。
系列核心主题深化
虽然您肯定会在本课程中提升R技能,但我们还将进一步强调本系列的两个关键主题。
首先,公共部门的数据分析师主要是在团队中并与决策者协同工作。因此,理解这项工作的背景及其开展原因至关重要。数据被询问了哪些问题?需要向不同的受众传达什么信息?以及为什么?
其次,本系列的第二个主题是:尽管高质量和客观的数据分析对公共部门决策者确实非常重要,但数据本身从不告诉他们该做什么。公共政策、公共行政及其对稀缺公共资源的分配总是涉及价值观,且常常是相互竞争的价值观。这项工作将始终涉及政治。因此,我们将继续在公共部门这一独特背景下,强调数据分析工作的这一重要背景。
本节课中我们一起学习了:对课程二的完成表示祝贺,总结了本课程在R数据可视化与公共部门背景知识方面的核心收获,并前瞻了下一课程关于政策分析与决策支持的重点内容,同时重申了公共部门数据分析工作中团队协作、政治与价值观背景的核心主题。您已为下一阶段更具挑战性的学习做好了准备。
0:运用数据辅助公共部门决策者 🎯

在本课程中,我们将学习数据分析在公共部门决策中的核心作用,并掌握使用R语言进行政策分析的基础方法。我们将探讨数据分析如何支撑公共部门工作的四大支柱,并通过实际案例学习推断统计分析。
课程概述
欢迎来到我们关于R语言与公共部门数据分析系列的第三门课程。在本课程中,我将引导您了解数据分析与政策分析在辅助公共部门决策方面的重要作用。
我们将涵盖广泛的内容。您将基本掌握一门入门级政策分析方法课程的核心内容。课程会涉及一些新概念、术语和行话,但也包含大量真实世界的应用和案例。
课程内容与技能
您将培养一些关于推断统计分析的新R技能。我的同事奥尔顿将向您介绍一些入门级的统计检验。
以下是您将学习的主要统计方法:
- T检验
- 方差分析(ANOVA) 等
奥尔顿还将讨论这些方法如何用于评估公共政策实验的结果。之后,我将与协助创建本课程的研究生丹妮拉·迪亚兹一起,引导您完成两个基于真实世界公共数据的实验分析。
数据分析与公共部门四大支柱
本课程重点关注数据分析的重要性及其与公共部门工作四大支柱的关系。
上一节我们介绍了课程的整体安排,本节中我们来看看数据分析具体支撑的公共部门核心关切:
- 经济:政府向民众提供商品与服务。
- 效益:一个项目或政策是否真正有效。
- 效率:分配资源、最大化公共部门投资回报的最佳方式是什么。
- 公平:是否所有个人和社区都获得了实现公共部门目标所需的商品与服务。
课程目标与收获
除了提升您的R数据分析能力和公共政策研究技能,您还将加深对公共部门所关注的广泛背景以及我们需要考虑的数据细微差别的理解。
我们再次强调,本课程涵盖的内容非常广泛,但我们相信您会学到很多。我们确信您会乐在其中,并对从事公共部门数据分析工作感到更加兴奋。
总结
本节课中,我们一起学习了第三门课程的总体框架和目标。我们了解到,本课程将聚焦于数据分析如何通过效益、效率、公平、经济这四大支柱来支持公共决策,并将通过实际案例教授T检验、方差分析等基础推断统计方法。接下来,我们将逐步深入这些核心内容。
1:政策定义及其重要性 📚


在本节课中,我们将要学习公共政策的基本概念,包括其定义、不同类型以及为何它在公共部门工作中至关重要。理解政策是进行有效政策分析的第一步。
什么是政策?🤔



在最普遍的层面上,政策是政府、政党、商业组织甚至个人所采纳或提议的行动方针或行动原则。个人也可以有自己的个人政策。为了我们的目的,我们专注于公共政策。公共政策包括政府及其下属部门的宪法、法律、法规、行政规则、法院判决以及政府实体采取的其他行动方针。这同样包括资金分配的优先事项。
公共政策可以是正式的,也可以是非正式的,我们稍后会详细讨论。公共政策由政府的各个分支——立法、行政和司法——共同创建。公共政策的影响范围非常广泛,不仅对公共部门本身,也对私营部门、非营利部门和普通公众产生深远影响。公共政策以积极和消极的方式塑造着我们社会中的所有系统、机构、组织和社区。
政策类型:正式与非正式 📋

公共政策领域中最简单的政策类型学是区分正式政策(大P政策)和非正式政策(小P政策)。
正式政策(大P政策)

正式政策或大P政策包括法律、法规、行政命令、法院裁决、行政规则、预算规则、福利计划等等。正式政策最重要的特点是,不遵守政策会产生后果。这些后果可能包括罚款、吊销执照或其他特权,甚至刑事处罚。正式政策往往会影响大量人群,但其最重要的特征仍然是不遵守政策会带来后果。

以下是正式政策的一些例子:
- 国家健康保险和养老金计划。
- 税法。
- 反歧视法律。
- 环境法规。
- 所有与驾驶相关的法律。
- 关于许多活动(如饮酒、吸烟、结婚、购买枪支、上学)法定年龄的法律。
- 关于销售假冒或仿冒商品的法律。
- 疫情期间政府要求在公共交通上佩戴口罩的强制令。

非正式政策(小P政策)
另一方面,我们还有非正式政策或小P政策。非正式政策包括专业协会或政府发布的指南、专家小组的建议、机构内部的规则、针对青少年的各类地方性项目、政府用于能力建设的拨款等。非正式政策比正式的大P政策更不正式或更灵活。它的范围往往更小,使用的资源也通常更少。但同样,非正式政策最重要的部分是,不遵守政策通常没有后果。
以下是非正式政策的一些例子:
- 公共信息或教育活动。例如,葡萄牙有一个针对儿童的反仇恨运动,名为“无仇恨忍者”运动。巴西有一个关于如何保护个人数据的公共信息宣传活动。
- 政府和专家组织发布的关于佩戴口罩的所有指南和建议。政府的口罩强制令是正式的大P政策,如果不遵守(例如不戴口罩被禁止进入某些场所,有时甚至会被罚款),会有后果。但关于佩戴口罩以防止新冠病毒传播的指南和建议是非正式政策的例子。
- 许多国际机构发布的各种建议、最佳实践、报告和指南。这包括联合国政府间气候变化专门委员会发布的报告和指南。该小组为正式和非正式的政策变革提出了许多建议。
让我们再举几个简单的例子。虽然我们都被要求纳税,这是一种非常正式的公共政策,但也存在一些税收激励措施,这些是非正式政策,旨在“助推”而非要求或强制某些类型的行为。例如,欧盟17个国家为购买电动汽车的消费者提供税收减免。这不是强制要求,如果你不这样做也没有后果,但如果你做了,就可以在税收上获得优惠。此外,用于社区发展、健康及其他类型科学研究、艺术等的政府拨款计划,也可以被视为非正式政策。
总结 📝



本节课中,我们一起学习了公共政策的基本定义,并区分了正式政策(大P政策)和非正式政策(小P政策)。正式政策具有强制力,不遵守会带来明确后果;而非正式政策则更具引导性,通常以建议、指南或激励措施的形式出现。理解这一区别对于后续深入探讨政策分析至关重要。在接下来的课程中,我们将应用这些概念,并学习如何利用数据分析来支持政策制定和评估。
2:政策类型学框架 🏛️



在本节课中,我们将学习一个详细的政策类型学框架。该框架指出,政府通常拥有八种不同类型的政策或政策杠杆可供使用。我们还将探讨每种政策类型的具体含义和实例。
上一节我们介绍了正式与非正式政策的区别,本节中我们将更详细地探讨政策的具体类型。

政策类型学概述


首先需要记住,政府实际上有第九种政策选择,即维持现状或无所作为。因此,在讨论各类政策选项时,必须意识到保持政策环境不变本身也是一种政策选择。现在,让我们深入探讨这个类型学框架。
八种政策杠杆类型


以下是政府可用的八种主要政策类型,分为几个大类。

1. 劝说与道德劝诫 🗣️

这类属于非正式政策,旨在通过劝说影响个人或组织的行为,而不强制要求。主要包括两种方式:
- 告知:政府向公众提供信息、数据和推荐,以期影响行为,但不作强制要求。例如,政府发布数据称:“去年本地区有75人死于酒驾,酒驾的处罚是...”,并列出具体处罚。
- 劝诫:在提供信息的同时,诉诸价值观或情感,甚至使用警示策略。例如,宣传运动称:“酒驾去年夺走了75条无辜的生命,其中包括30名儿童,摧毁了无数家庭。请交出车钥匙,指定一名代驾。”劝诫与告知的区别在于,告知提供事实,而劝诫则诉诸价值观并建议具体行动。
2. 经济激励 💰


这类政策通过经济手段影响行为,主要包括两种:

- 补贴:通过降低商品或服务的价格来鼓励消费或行为。例如,儿童储蓄账户、公共住房补贴、保险公司对非吸烟者提供更低费率。
- 税收:通过提高商品或服务的价格来抑制需求。这包括常见的“罪恶税”(如对香烟、酒精、赌博收入的税收),以及对游艇、皮草等奢侈品的更高税率。此外,使成本增加的费用或罚款也属于此类,例如,城市地区更高的车辆注册费,就是为了减少该区域的汽车数量。

3. 采购与生产 📦
这是政府的一项重大活动,涉及在公共部门经济中提供商品和服务。政府需要做出“制造或购买”的决策。

- 采购:政府通过赠款和合同从外部供应商(私营企业)购买商品或服务。例如,政府合同聘请私营媒体公司设计公益广告;政府付费请私营公司进一步研发和生产疫苗。
- 生产:政府利用自身部门和雇员来制造产品或提供服务。例如,政府运营公立学校系统并制定标准课程;政府提供邮政服务、修建和维护道路;政府负责国家安全相关的军事、网络安全和情报事务。

4. 法律与监管 ⚖️
这是最重要的正式政策行动,通过法律和法规要求或禁止某些行为,否则将面临后果。

- 禁止:禁止某些行为。例如,禁止在电视上播放烟草广告;制定有毒废物处理法规。
- 强制:要求必须采取某些行为。例如,车速限制和其他交通法规;对投票、纹身等行为的年龄限制。
总结



本节课中,我们一起学习了公共政策的八种主要类型:告知、劝诫、补贴、税收、采购、生产、禁止与强制。理解这个框架有助于我们系统地分析政府可能采取的政策工具,并认识到“维持现状”本身也是一个重要的政策选项。每种类型都有其独特的应用场景和影响方式,是公共部门决策与分析的基础。
3:公共政策的基本事实 🏛️

在本节课中,我们将学习公共政策的一些基本事实。这些事实跨越了不同国家和政府类型,有助于我们理解公共政策的普遍性和复杂性。
公共政策的复杂性
公共政策在国家内部实际上相当复杂,并且在国家之间确实存在差异,且非常复杂。公共政策在制定方式以及政策本身方面都大不相同。
然而,这里有一些关于不同类型公共政策的基本事实,这些事实确实跨越了不同国家和不同类型的政府。
政策的复合性
首先,许多政策不止一种类型,或者同时运用了不止一种政策杠杆。
以下是几个例子:

- 例子一: 如果政府设计自己的教育媒体宣传活动,这是一种非正式政策,既制定了信息,也影响了公众。
- 例子二: 工人知情权法律,即要求企业以书面形式告知其员工在工作中可能面临的风险、危险和潜在伤害的法律。这是一个正式政策的例子,它禁止企业不提供此信息,否则将面临罚款,同时也告知了工人。
- 例子三: 当政府对污染企业处以罚款时,这是一项正式政策,它做了两件事:禁止企业污染(通常有非常明确和详尽的规定),并且如果企业违反该政策,还会通过罚款对其进行征税。
应对复杂社会问题
接下来,我们思考公共政策在不同国家之间的另一个共同点。
社会上的每一个复杂问题都需要来自许多不同政策杠杆的多种不同类型的政策关注,以应对问题、缓解问题并尝试解决它。

因此,如果你在政府中从事特定领域的工作,例如教育、交通、环境保护、住房、公共卫生等任何领域,你需要了解与你的议题相关的所有不同类型的政策活动。

总结


本节课中,我们一起学习了公共政策的一些基本事实。我们了解到政策常常具有复合性,可以同时运用多种杠杆(如告知、禁止、征税)。同时,我们也认识到,解决复杂的社会问题需要综合运用多种不同类型的政策工具。理解这些基本事实,是进行有效公共政策分析的第一步。
4:政策类型学实例解析 📚


在本节课中,我们将学习如何运用公共政策类型学框架来分析具体的社会问题。我们将通过两个实例——烟草使用控制和气候变化缓解——来演示如何为每个政策杠杆找到对应的政策实例。
当我们思考社会问题和公共政策应对时,我们知道这些问题总是以某种方式受到现有公共政策的影响。同时,这些问题需要通过额外的政策来应对、补救甚至解决。我们还知道,解决复杂的社会问题需要运用多种不同的政策杠杆。
我们已经讨论过公共政策的类型学框架。这个框架可以用来帮助从政策角度思考和理解政府关注的社会问题或议题。在接下来的作业中,我们将要求你运用这个框架。
作业任务 📝
以下是作业要求:你需要选择一个你感兴趣的社会问题或公共议题。选择一个你关心、或许已经在工作中或志愿工作中着手处理、或希望处理的问题。为了从政策角度理解这个议题,本次练习旨在考察你能否为问题的某些方面,找出所有不同政策杠杆下已实施或正在讨论的公共政策实例。
我将通过几个例子来展示具体做法。我将使用的例子是旨在减少烟草使用的公共政策,以及与缓解气候变化影响相关的公共政策。
实例一:烟草使用控制政策 🚭
让我们进入第一个政策议题:烟草使用控制政策。
信息提供类政策


以下是针对此社会问题的“信息提供”政策杠杆的一些实例。
- 在印度,实施了一项关于无烟或咀嚼烟草风险的大众媒体宣传活动。
- “信息提供”的另一个例子是烟草产品包装上关于使用风险的文字警告标签,例如香烟包装侧面印有“吸烟增加心脏病风险”的微小字体。
劝诫敦促类政策
现在从“信息提供”转向“劝诫敦促”。
- 一个例子是全世界许多国家使用的非常形象的警告图片和信息。这从仅仅提供事实信息,升级为发布戏剧性的、带有价值判断的、实际上非常形象的关于吸烟带来的重要且深远的健康影响的警告。
- 另一个超越单纯告知的例子是美国曾广泛使用的DARE项目。DARE代表“抵制药物滥用教育”。这是一项干预措施,美国75%的小学都曾实施,涉及穿制服的警察进入小学,开展为期18周的项目,提供有关毒品、烟草和酒精使用风险的信息,同时也旨在吓阻孩子们。
- 还有一个例子是在中国,曾有一项大众媒体宣传活动,旨在羞辱在公共场所吸烟的人并对其进行罚款。

激励诱导类政策



好的,让我们继续思考“激励”类别下的政策实例。我们有许多与烟草使用政策相关的补贴例子。
以下是补贴实例。
- 为非吸烟者降低保险费率。
- 为旨在预防青少年开始吸烟的社区干预措施提供公共资金。
- 另一个例子是公共卫生保险计划,其福利涵盖戒烟药物和其他类型干预措施的费用。
对于“税收”政策杠杆,我们显然有实际的税收。
- 提高价格的烟草产品税是最有效的烟草控制政策之一。
- 然而,另一个例子是提高租住公共住房公寓的吸烟者的租金。

关于“采购”,大多数政府通过赠款和合同购买研究和示范项目,以帮助开发和评估预防吸烟或帮助人们戒烟的干预措施。这方面有很多很多例子。
法律规制类政策
关于“法律和监管”,也有很多政策禁止的例子。
- 包括烟草销售和购买的年龄限制法律。
- 关于公共场所无烟区的法律。
- 另一个例子是平装法。这些是关于香烟包装上可以出现什么内容的严格规则和法规。在许多国家,答案是“不多”。平装法禁止公司在包装上实际展示其品牌标识,对烟草香烟包装上必须有多大比例是图形图像、多大比例必须是警告等有非常严格的规定。
- 这里的另一个例子是法律不仅规定了烟草税的税率,还规定了从烟草税产生的收入用于何处。
实例二:气候变化政策 🌍

好的,让我们转到另一个例子,这是一个重大的社会世界性问题:气候变化。我们如何再次从政策角度思考气候变化?我们可以采用八种不同政策杠杆的类型学,并为每一种思考与气候变化相关的例子。
信息提供与劝诫敦促类政策
对于“信息提供”政策杠杆,一个例子是公共教育活动,它们向人们提供关于臭氧层空洞大小、气温上升、海平面上升、极地冰盖融化速度、火灾发生率增加等信息,真正提供将地球变化与气候变化相关联的科学信息。
但是,超越信息提供,大多数气候变化运动更属于“劝诫敦促”的阵营,因为它们不仅提供信息,而且以提高警惕和呼吁采取非常强烈的行动改变的方式进行。
- 一个例子是“承诺”活动,要求人们估算自己的碳足迹,然后尝试减少它。



激励诱导类政策
关于“激励”或“助推”,全球有很多很多补贴的例子。
- 这包括为抵消企业或个人绿色能源投资成本而提供的税收补贴。


关于“税收”,也有很多例子。
- 这包括对碳排放征税。
- 然后,与此相关的还有所谓的“碳限额与交易”政策。
采购与政府行动类政策
对于政府通过赠款和合同“购买”东西的政策杠杆。
- 许多城市正在为其公共交通系统购买更节能的公交车。
- 政府也通过开展或投资自身的可再生能源研究来采取政策行动。这由政府机构及其员工进行,但也与政府外部的大学、智库和其他研究人员及其他地方合作。但当政府自己进行时,这就是“政府行动”的一个例子。
- 政府还在其公共交通系统中提供更多的服务和线路给更多的人,以激励人们放下汽车,乘坐公共交通。
法律规制类政策
对于“法律和监管”,同样有很多很多例子。
- 仅举几例:禁止低效能源使用的法规和法律,以及限制个人汽车使用的法律。
- 例如,在哥伦比亚波哥大,2014年实施了一项政策,限制车牌以偶数(如0、2、4、6或8)结尾的汽车在月份为偶数的日子的高峰时段行驶。然后,车牌以奇数结尾的车辆在月份为奇数的日子的高峰时段被限制行驶。

当然,对于我们讨论的两个议题——烟草控制政策和气候变化政策——的每一个政策杠杆,都有很多很多其他例子。而且,有些例子不止一种政策类型。这里的重点只是让你开始从政策角度思考你关心的问题。
总结 ✨


本节课中,我们一起学习了如何运用公共政策类型学框架分析具体社会问题。我们以烟草使用控制和气候变化为例,详细拆解了“信息提供”、“劝诫敦促”、“激励诱导”、“法律规制”等不同政策杠杆下的具体政策实例。希望你在选择一个你关心的问题,然后思考正在使用或正在辩论的不同类型的公共政策时,能有所收获并感到有趣。
5:政策制定流程解析 📊

在本节课中,我们将要学习公共政策是如何制定的。我们将探讨政策制定的场所、一般流程,并重点了解数据分析在政策周期的每一步中所扮演的关键角色。

政策制定的场所 🏛️
上一节我们介绍了数据分析的背景,本节中我们来看看政策制定的具体场所。公共政策在政府的多个部门中制定。


政策当然在立法机构中制定。这是立法机构的主要工作。
政策也在政府的行政或管理部门中制定。
此外,政策也在法院中制定。

政策制定流程:政策周期 🔄
公共政策的制定方式多种多样,过程相当复杂,绝非线性,且非常混乱。世界各地的政策制定方式也大不相同。


尽管如此,我们可以通过思考所谓的“政策周期”来理解政策及其制定方式的一般规律。这虽然比较概括,但反映了公共政策制定中普遍存在的主要步骤。
以下是政策周期的主要阶段:
首先,在政策周期中,必须对现状进行评估。情况进展如何?是否存在需要解决的问题?是否存在一个日益严重、让更多人担忧的问题?在此,我们还需思考哪些议题能进入政策制定者的议程。
其次,需要对潜在的干预措施进行评估。我们定义了一个问题,现在有哪些可能的干预措施范围?我们可以采取哪些应对行动?
在评估了潜在的政策选项后,需要做出选择。选择可能包括维持现状、不作为,但有时也会进行政策改革,决定实施新政策。
然后,这些政策需要得到执行。因此,政策周期的另一个阶段是政策执行。
政策执行后,我们希望进行评估:所做出并执行的政策选择,是否对那些被定义为有问题或需要政策关注和资源投入的状况产生了影响?显然,之后整个周期会重新开始。这个过程复杂且混乱。


数据分析在政策周期中的重要性 📈
接下来我想讨论的是,数据分析对政策周期的每一步都至关重要。
第一步,现状评估:数据分析对于理解和可视化正在发生的事情极为重要。人们担忧的问题是什么?原因是什么?有哪些后果?趋势如何?以及我们在这个问题上可能看到哪些不平等现象?
第二步,政策选项评估:数据在这里非常重要。我们需要使用数据来比较和对比不同的潜在政策改革和新选项。
第三步,做出政策选择:我们希望数据和信息是有用的,能帮助决策者理解其决定可能带来的积极影响,也可能理解一些负面后果。因此,数据分析有助于决策者做出政策选择。

第四步,政策执行:这非常重要。我们需要了解政策是如何执行的。它们是否按设计者的意图执行?执行是否存在问题?是否覆盖了正确的人群?某些政策的用户体验如何?因此,政策执行需要大量的数据分析。
第五步,政策评估:评估政策影响和实现政策目标的程度,完全依赖于数据。收集数据,然后将其传达给政策制定者和公众,以便我们再次评估现状,判断是否需要重新开始整个周期。
实例分析 🔍
让我们看一些例子。
现状评估:绘制与枪支相关的死亡人数随时间变化的趋势图,就是当前美国正在进行的此类活动的一个很好的例子。这是利用数据来理解社会问题现状的典范。



政策选项评估:我们可以考虑一个政策模拟模型,用于预测不同烟草税水平对吸烟行为的影响。
做出政策选择:比较一组政策选项的成本效益,并据此做出决策,就是一个例子。我们将在后续课程中更详细地讨论所有这些内容。
政策执行:使用数据分析用户对新上线的驾照续期系统的体验,是说明数据分析如何提供帮助的例子。
政策评估:评估新政策实施后趋势线的变化。数据分析在这类评估中极其重要。


总结 📝



本节课中我们一起学习了政策制定的流程。政策制定过程的每一步都需要信息、数据以及对信息和数据的良好分析。数据分析有助于公共政策制定,并代表了不同类型的政策分析。数据分析可以在公共政策制定中被使用,但也可能被误用。我们将在本系列的第四门课程中更详细地探讨这一点。
6:政策分析:定义与典型案例 📊



在本节课中,我们将学习政策分析的定义、其独特性,并了解前瞻性与回顾性政策分析这两种主要类型及其典型案例。
政策分析的定义


继续讨论政策制定过程,现在我们来谈谈政策分析。政策分析是为利益相关者或客户提供的、与公共决策相关且受社会价值观影响的建议。

那么,政策分析有何独特之处?它与公共政策研究或学术研究有何不同?首先,政策分析是为公共部门服务的,但通常不公开进行。这与大学或智库的研究人员不同,他们进行研究后,会试图在报告和同行评审期刊上发表。政策分析试图全面审视结果、后果、价值观以及政治因素。它具有技术性,应保持科学客观,但也充满了政治和伦理挑战,我们后续将详细讨论。
政策分析的类型
政策分析主要有两种类型:前瞻性分析和回顾性分析。


前瞻性政策分析
前瞻性政策分析也称为事前分析或预期性政策分析。它是预测性和规定性的。在前瞻性政策分析中,我们试图预测采纳不同政策方案后可能出现的未来状态。它旨在回答“我们应该做什么?”这个问题。分析完成后,目标是推荐行动方案,因为预测这些行动会带来特定结果。
以下是前瞻性政策分析的一些例子:


- 宏观经济模型:大多数国家以及联合国、经合组织等国际组织都使用宏观经济模型进行货币和财政政策预测。这些模型试图预测,如果实施不同类型的货币和财政政策,未来会是什么样子,不仅对特定国家,也对全球经济产生什么影响。例如,利率变化对通货膨胀或私营市场表现的影响,或者不同税收变化对消费者行为的影响。
- 社会预测模型:在拉丁美洲和加勒比地区,使用一种名为“社会动荡预测模型”的模型。该模型利用社会中发生的不同类型事件以及政策变化,来创建模型,试图预测可能导致多少公众抗议和动荡事件,例如暗杀企图、骚乱等。
回顾性政策分析
回顾性政策分析有时也称为事后分析。与试图预测不同政策情景下未来的前瞻性分析不同,回顾性分析旨在回答“已实施的政策是否有效?所做之事产生了什么影响?”这个问题。它是对过去政策的评估,以非常技术性的方式进行描述,但重点是评估已实施政策的影响,看其是否达到了目标。
以下是回顾性政策分析的一些例子:
- 墨西哥PROGRESA计划评估:墨西哥有一个大型社会福利计划(实际上是一系列计划),称为PROGRESA(教育、健康和营养计划)。已对PROGRESA进行了非常严格的评估,以了解其对所针对的不同社会福利领域的影响。我们将在本课程后面更多地讨论PROGRESA。
- 有条件现金转移支付的影响研究:在南非和许多其他国家,进行了大量关于“有条件现金转移支付”干预措施对家庭和住户一系列结果影响的研究,包括儿童入学率、医疗资源使用、贫困状况、财富增长以及就业等。这些项目和政策评估试图告诉我们,当这些政策和项目实施时发生了什么。
- 其他案例:在巴西,对国家及地方各级不同类型的COVID-19政策对儿童入学率及其教育成果的影响进行了多项评估。另一个例子是,欧盟投入大量资金和资源,用于制定和实施对许多不同欧盟政策的评估。

总结



本节课中,我们一起学习了政策分析的核心定义,它旨在为公共决策提供基于社会价值观的建议。我们重点区分了两种主要类型:前瞻性政策分析(预测未来,回答“应做什么”)和回顾性政策分析(评估过去,回答“效果如何”),并通过全球范围内的具体案例加深了对这两类分析应用场景的理解。
7:数据分析在政策分析中的核心作用 📊

在本节课中,我们将要学习数据分析如何成为政策分析各个阶段的核心,以及政策分析师在运用数据技能时需要考虑的更大背景。
上一节我们介绍了政策周期的步骤,本节中我们来看看数据分析如何具体应用于这些步骤,并映射到不同类型的政策分析中。

首先,在政策周期的第一步——现状评估中,数据分析有助于公共行政的核心职能,包括报告、规划、指导。其作用是使用数据来理解一组现状问题的当前状态、成因、是否需要更多关注以及相关方的关切等。
接下来,政策周期的第二步是政策选项评估。

这属于前瞻性政策分析。它利用数据和分析来思考我们的政策选项有哪些,以及如果这些选项得以实施,未来可能会是什么样子。这涉及到预测,是前瞻性的。在评估选项并做出选择时,我们使用一种特定的前瞻性分析,称为政策选项分析。我们很快将详细讨论政策选项分析和政策预测模型。
然后,在政策实施后,我们需要对其进行评估,这属于回溯性政策分析。这包括所谓的过程评估或实施科学,即评估政策实施的过程。政策周期的第五步是评估政策的影响,这也属于回溯性政策分析,我们可以称之为结果评估或总结性评估。


我们将花大量时间更详细地讨论前瞻性和回溯性政策分析。但此处的要点是,数据分析是政策周期各步骤的核心,因为数据分析是这些不同类型政策分析的核心。


现在,如果你要成为一名政策分析师,而不仅仅是数据分析师,那么除了精明敏锐的数据分析技能外,你还需要什么?
以下是政策分析师所需的关键能力:
- 快速理解政策问题及潜在解决方案范围的能力:这有助于迅速把握工作背景。
- 以特定方式收集、组织和分析数据的能力:这种方式旨在回答客户、利益相关者或决策者提出的具体问题。在这里,你通常需要团队合作,你的职责不是决定人们需要什么数据,而是与他们协作,帮助他们收集、组织和分析数据。
- 沟通数据的能力:尤其是在处理不完整信息时,清晰传达数据含义至关重要。
- 在紧迫时限内工作的能力:有时政策分析师需要在数小时或数天内完成数据整理、分析和汇报,这类工作节奏可能非常快。




在进行这项工作时,你还需要理解政策分析伴随的政治和伦理挑战。利益相关者通常对数据“应该”说什么有自己的想法,如果数据与他们的认知不符,就会引发政治挑战。此外,虽然令人遗憾,但政策分析师确实常被要求去寻找符合某些人对问题定义或他们想推行的政策的数据,而不希望看到与其观点相悖的数据。我们后续会详细讨论这些内容。
此处的要点是,政策分析师需要有更广阔的视野。

这也是我们花大量时间探讨的原因。你需要理解数据分析所处的背景,这不仅仅是技能问题,更关乎这些技能为何被使用,以及你作为分析师在此过程中将扮演什么角色。

因此,政策制定必然涉及政治。这里的“政治”不一定是贬义词,它通常指代政府内部与权力动态相关的行为,但也存在于所有人类群体互动中,包括企业、学术环境、宗教机构,甚至在家庭中也有所体现。其本质是一系列与制定规则、资源分配、策略和行为决策相关的活动、方法和策略。

简单来说,政治就是当一群人聚在一起试图做决定时发生的事。当存在不同的权威、权力和地位关系时,政治会变得尤其具有挑战性。阿尔伯特·爱因斯坦有一句我很喜欢的名言:“政治比物理更难。”我倾向于同意这一点。这并不意味着我们必须害怕政治,但我们必须意识到,即使你作为一名分析师身处公共政策领域, ostensibly 以尽可能客观、中立的方式处理数据,其中也必然涉及政治因素。



在本课程的第一个模块中,我们目前已经涵盖了以下内容:
以下是本模块的核心要点总结:
- 政策有不同的一般类型(正式与非正式),每个复杂的公共问题都需要多种不同类型的政策干预来解决。
- 政策制定过程包含五个主要步骤,每个步骤都涉及数据分析,并对应不同类型的政策分析。
- 虽然客观的数据分析至关重要,但政策的形成和分析也涉及政治因素。








本节课中我们一起学习了数据分析在政策周期各步骤(现状评估、选项评估、实施后评估)中的核心应用,区分了前瞻性分析与回溯性分析,并探讨了政策分析师所需的综合能力及其工作的政治背景。理解这些背景是有效运用数据分析技能支持决策的关键。
8:政策选项分析框架(第一部分)🎯


在本节课中,我们将要学习前瞻性政策分析的一种核心方法——政策选项分析。我们将了解其定义、在政策周期中的位置,并详细拆解其标准实施步骤。
欢迎回来。我们继续讨论不同类型的政策分析。
本节课我们将聚焦于前瞻性政策分析,即帮助决策者决定“我们应该做什么”的分析。

首先,我们来看看学习路线图。
学习路线图🗺️
首先,我将解释什么是政策选项分析。
接着,我们将讨论另一种前瞻性政策分析——政策微观模拟模型。

之后,我的同事兼朋友大卫·门德斯教授将作为客座讲师,介绍他设计并已被广泛用于辅助决策的烟草政策模型。
什么是政策选项分析?🤔
政策选项分析是一种前瞻性政策分析。它也被称为预期性分析。
顾名思义,这种分析是预测性或规定性的。我们试图预测未来,即预测采纳不同政策方案后可能产生的未来状态。
基于这些预测,我们尝试为决策者提供行动建议。其核心目的是回答决策者的问题:针对某个需要解决的社会问题或政策议题,我们应该做什么?
在政策周期中的位置🔄
我们之前讨论过政策周期,它包括:评估现状、评估潜在干预措施、做出政策选择、实施一项或多项政策,然后进行评估,循环往复。
今天,我们正处于第二步——评估潜在干预措施。这正是前瞻性、规定性的政策分析。
政策选项分析的标准步骤📝
以下是经典政策选项分析的步骤。

第一步:核实、定义、细化问题

首先,必须核实、定义并细化问题。决策者认为需要解决的具体问题是什么?正如我们之前讨论的,数据对于定义问题至关重要。
第二步:识别备选政策
第二步,需要识别有哪些备选政策。需要记住,有一个政策总是被包含在内:现状。即我们可以选择维持现状。除了现状,还有哪些可以考虑和实施的政策变更?
第三步:建立评估标准
第三步,需要使用可衡量的标准来评估我们在第二步中识别出的不同政策方案。
第四步:分析比较备选方案
第四步,使用这些标准来分析和比较我们的一系列政策备选方案。
第五步:清晰传达信息
第五步,需要将这些信息清晰地传达给决策者。
总结来说,我们需要识别一小部分备选政策,确定一些用于比较它们的标准,然后进行分析,最后将结果传达给决策者。
总结📚


本节课中,我们一起学习了政策选项分析的基础框架。我们明确了它是一种前瞻性分析,旨在预测不同政策选择的未来结果以辅助决策。我们回顾了它在政策周期中的位置,并详细拆解了其五个核心步骤:定义问题、识别备选方案、建立评估标准、分析比较方案以及传达结果。

下一节,我们将继续探讨另一种强大的前瞻性分析工具——政策微观模拟模型。
9:政策选项分析框架(第二部分)🏠



在本节课中,我们将继续探讨政策选项分析,并以城市租赁住房问题为例,学习如何构建一个具体的分析框架。
上一节我们介绍了政策选项分析的基本概念,本节中我们来看看如何将其应用于一个实际的社会问题。
租赁住房问题概述
租赁住房负担能力不足是一个全球性的问题。我们可以通过多个数据指标来了解这一问题的严重性。

以下是衡量租赁住房问题的几个关键指标:
- 住房可负担性:通常定义为家庭收入中用于住房支出的百分比。
- 住房不安全性:指被驱逐或失去住所的风险。
- 住房不稳定性:通常以个人或家庭在一定时间内被迫搬家的次数来衡量。
- 无家可归者:通常定义为没有固定住所(包括庇护所)的人口比例或比率。
- 住房供应量:特定社区的租赁住房存量。
- 通勤时间与距离:人们为了找到负担得起的安全住房,需要居住在离工作地点多远的地方,以及由此产生的通勤时间。

潜在的政策选项
面对城市的租赁住房问题,政府可以考虑多种政策选项。许多城市都已认识到住房可负担性和安全性方面的问题。
以下是政府可以实施的一些潜在政策选项:
- 租金管制:对房东在一定时间内的租金上涨次数和涨幅百分比进行限制。
- 政府租金补贴:政府为租客提供租金补贴,并直接支付给房东。例如,美国的“第8条款住房券”计划。
- 调整分区法规:例如,规定大型公寓楼必须有X%的单元用于政府补贴的租赁计划。
- 公共部门建设补贴:为公共部门建造更多经济适用房提供补贴和激励。
- 激励私人开发商:通过提供低息贷款等方式,激励私人建筑商建造更多低收入住房。
- 防止居民被迫搬迁:在租金上涨或社区高档化的地区,通过协助房东承担法规合规成本,防止他们将成本转嫁给租客,从而避免居民被迫搬离。
在住房政策选项分析中,我们首先要考虑决策者真正愿意讨论的一组可行选项。这个选项集不宜过大,需要精简、合理。通常,“维持现状”总是一个备选方案,然后我们将其他政策选项(政策A、B等)与现状进行比较。
分析与比较标准
确定了精简的政策选项集后,下一步是在一组可衡量的标准上对每个政策选项进行比较和对比。
在住房问题上,我们可以使用以下标准来比较不同的政策选项:
- 住房稳定率
- 驱逐率
- 住房可负担性比率
- 可用的低收入租赁单元数量
- 无家可归者人数
- 通勤距离和时间
- 对居住隔离的影响:这些政策是会加剧还是会减少种族居住隔离?我们可以使用基尼指数或相异指数等指标来衡量。
公式示例:基尼系数是衡量不平等程度的常用指标,其值介于0(完全平等)和1(完全不平等)之间。
重要总结
本节课中我们一起学习了如何针对具体问题(如租赁住房)构建政策选项分析框架。
最后,总结一些重要观点:
首先,政策选项分析是高度数据驱动和技术性的,数据分析师在其中扮演重要角色。


然而,数据本身永远无法告诉政策制定者应该做什么。这是因为政策选择总是涉及权衡取舍,以及对那些取舍的价值判断。所有政策都同时带来收益和负担,而且这些影响往往分配不均。
因此,虽然政策选项分析在政策制定过程中是必要的,因为它为决策者提供了重要的信息和数据,但其本身永远是不充分的。我们将在未来更深入地探讨所有这些内容。



本节课中我们一起学习了:如何以城市租赁住房问题为例,具体应用政策选项分析框架,包括识别问题指标、列举潜在政策选项、以及确定用于比较这些选项的可衡量标准。我们认识到,数据分析为决策提供了关键依据,但最终的 policy 选择仍需结合价值判断和权衡取舍。
10:R语言推断性统计分析导论 🎯

在本节课中,我们将学习如何在R环境中进行推断性统计分析。我们将从基础的工作流程开始,介绍如何使用脚本和项目来组织分析,为后续深入学习R语言打下基础。
大家好,我是Alton Worthington。我是一名政治学家,也是福特公共政策学院的公共政策讲师。我在公共部门、私营部门和学术界都有数据分析的经验,并且喜欢教授人们新的方法,以帮助他们更好地理解世界。
今天,我将教大家如何使用R语言中的方法进行统计分析。我们将只探讨R语言功能的一小部分,但这是进入R环境进一步学习的大门。
工作环境与方式 🖥️
我们将采用一种与之前略有不同的方式工作。之前大家使用的是笔记本(notebooks),而今天我们将更直接地使用代码。
我们将学习如何在控制台(console)和脚本(script)中与代码交互。我们会编辑脚本,将代码传递到控制台运行,并查看结果。其中一些部分大家会感到熟悉,另一些部分则会有些不同。但无论如何,我们都是在大家已经熟悉的同一环境中工作。
以下是我们的工作环境布局示意图:

- 在右上方,我们将看到熟悉的代码脚本区域。它看起来不会像笔记本,而更像一个分析脚本。
- 在右下方,是我们的数据环境区域,我们创建的对象会在这里显示。
- 控制台位于左下方,我们运行代码的结果会在这里呈现。
- 在截图中的左下方是文件区域,但当我们创建图表时,图表会在这里弹出显示。
使用项目组织分析 📁
我们将尝试使用项目(projects)来组织我们的数据和代码,这是一种略有不同的方式。
本系列视频的所有分析都将以项目的形式分享。因此,你会看到一个 .Rproj 文件,并在一个文件夹中看到其他文件。
我们所有的分析内容都将集中在一个文件夹中,包括:
- 数据文件
- 用于进行分析的脚本
- 我们创建的任何输出文件(例如图表或其他图像)
所有这些都与一个单一的项目相关联。
不过,你并非必须使用项目。只要你将脚本和所有文件放在同一个工作目录下,也可以顺利进行。本系列视频中所有要执行的操作都包含在脚本中。
课程内容预告 📋
在接下来的视频中,我们将:
- 引入分析场景:设定具体的数据分析问题。
- 方法概述:简要介绍我们将要使用的方法是如何工作的。
- R语言实现:具体介绍相关的函数及其参数。
- 结果检验与探索:查看分析结果,并在必要时调整选项,观察变化。
我期待与大家一起学习,我们很快再见。😊


本节课总结


在本节课中,我们一起学习了R语言推断性统计分析的入门知识。我们了解了新的工作环境布局,包括脚本、控制台和数据环境的交互。我们还介绍了使用R项目来组织分析文件的好处,确保数据、代码和输出结果井然有序。最后,我们预览了后续课程的结构,为学习具体的统计分析方法做好了准备。
11:卡方关联性检验 📊


在本节课中,我们将学习如何处理分类数据,并检验两个分类变量之间是否存在关联。我们将重点介绍列联表的创建、比例表的计算以及执行卡方独立性检验的方法。
创建列联表
上一节我们介绍了分析分类数据关联性的需求,本节中我们来看看如何创建列联表。列联表(也称为交叉表)是分析两个分类变量关系的基础工具。在R中,我们可以使用 table() 函数来创建它。
以下是如何在R中创建列联表的步骤:
- 导入数据:首先,我们需要导入包含分类变量的数据集。本例使用的是1985年5月《当前人口调查》中关于个人就业特征的数据。
- 使用
table()函数:该函数接受一个或多个分类变量作为参数,并生成一个显示各组合频数的表格。 - 使用
with()函数简化:为了避免重复输入数据框名称,可以使用with()函数来指定数据环境。 - 计算比例表:使用
prop.table()函数可以基于已创建的列联表计算行比例或列比例,这有助于更直观地理解数据分布。
卡方检验原理
在创建了列联表并观察了数据分布后,我们可能需要从统计上判断这种关联是否显著。这时就需要用到卡方独立性检验。
卡方关联性检验用于检验一个分类结果的比例是否与另一个分类因素相关联。其核心思想是比较观测频数与期望频数之间的差异。
- 零假设 (H₀):行变量和列变量之间没有关联(相互独立)。
- 检验统计量:卡方值 (χ²)。其计算公式基于观测频数 (O) 和期望频数 (E) 的差异:
χ² = Σ[(Oᵢⱼ - Eᵢⱼ)² / Eᵢⱼ] - 决策:如果计算出的卡方值足够大,导致其对应的P值小于显著性水平(通常为0.05),我们就有理由拒绝零假设,认为两个变量之间存在关联。
在R中执行卡方检验
了解了检验原理后,我们来看看如何在R中实际操作。R中的 stats 包提供了 chisq.test() 函数来执行卡方检验。
以下是执行卡方检验的几种方法:
- 对已创建的列联表进行检验:将
table()函数生成的矩阵直接传递给chisq.test()函数。 - 对两个向量进行检验:直接将来自同一数据框的两个分类变量(向量)传递给
chisq.test()函数。 - 使用
xtabs()函数:xtabs()函数使用公式语法创建列联表。其优势在于,可以方便地对生成的表格使用summary()函数来直接获得卡方检验结果,并且能处理两个以上的因素。
检验结果会提供卡方值 (X-squared)、自由度 (df) 和P值 (p-value) 等关键信息。我们可以将检验结果保存为一个对象,该对象包含观测频数、期望频数等元素,便于后续分析或报告。


本节课中我们一起学习了如何利用R分析分类变量间的关联。我们掌握了创建和解读列联表与比例表的方法,理解了卡方独立性检验的原理,并实践了使用 chisq.test() 和 xtabs() 函数进行统计检验的多种途径。这些技能是探索公共政策干预效果、群体行为差异等分类数据问题的有力工具。
12:均值差异t检验 📊


在本节课中,我们将学习如何使用R语言进行均值差异的t检验。这是一种用于比较两个独立组或配对样本之间连续型变量均值是否存在显著差异的统计方法。我们将介绍t检验的基本概念、在R中的实现方式,以及如何解读结果。
概述
当我们有一个连续型的结果变量,并希望比较它在两个不同组别(例如,干预前与干预后、实验组与对照组)之间的差异时,t检验是一个常用的工具。本节将介绍两种主要的t检验:独立样本t检验和配对样本t检验。
t检验的基本原理
上一节我们介绍了数据分析的背景,本节中我们来看看t检验背后的统计思想。
t检验的核心是评估从两个组别中观察到的样本均值差异,是否大到足以让我们相信这两个组别所代表的总体均值也存在真实差异。其通用检验统计量公式为:
t = (样本均值1 - 样本均值2) / 缩放因子
缩放因子用于考虑数据的离散程度(即标准差)和样本量。如果计算出的t统计量绝对值足够大(即远离0),并且对应的p值小于预设的显著性水平(通常为0.05),我们就有理由拒绝“两组总体均值无差异”的零假设。
在R中进行独立样本t检验
理解了基本原理后,我们来看看如何在R中执行最常见的独立样本t检验。R中的t.test()函数(来自stats包)可以完成此任务。
以下是使用t.test()函数进行独立样本t检验的两种主要方式:
- 使用公式语法:当数据框中的一个变量是连续型结果变量,另一个是仅有两个水平的分组变量时,这种方法非常方便。
- 使用向量语法:直接提供两个分别代表不同组别的数值向量。
我们将主要关注公式语法,因为它更清晰且与数据框结构结合紧密。公式的基本形式为:结果变量 ~ 分组变量。
让我们切换到R环境,通过一个示例来具体操作。首先,我们加载并查看数据。
# 加载数据
load("data_workspace.RData") # 假设数据已保存
# 或者从CSV导入
# data3 <- read.csv("your_data.csv")
# 快速查看数据结构
str(data3)
# 绘制直方图初步观察数据分布
hist(data3$outcome)
现在,我们使用公式语法进行独立样本t检验。以下是关键参数的说明:
# 执行独立样本t检验
t_test_result <- t.test(outcome ~ group, # 公式:结果变量 ~ 分组变量
data = data3, # 指定数据来源
alternative = "two.sided", # 双侧检验(默认)
mu = 0, # 零假设的均值差为0(默认)
paired = FALSE, # 非配对样本(默认)
var.equal = FALSE, # 假设方差不相等(Welch检验,推荐默认)
conf.level = 0.95) # 95%置信区间(默认)
# 打印检验结果
print(t_test_result)
执行上述代码后,控制台会输出检验结果。让我们解读一下关键部分:
t:计算出的t统计量值(例如,-5.555)。df:自由度,与样本量相关(例如,167.51)。p-value:p值(例如,1.069e-07)。如果p值小于0.05,通常拒绝零假设,认为两组均值存在显著差异。95 percent confidence interval:总体均值差异的95%置信区间(例如,[-10.5, -4.5])。如果该区间不包含0,也支持存在显著差异的结论。sample estimates:分别显示两组的样本均值。
我们可以将检验结果保存为一个对象(如t_test_result),它是一个列表,包含了所有上述信息,便于后续提取和使用。
# 查看结果对象的结构
str(t_test_result)
# 提取特定结果,例如p值
t_test_result$p.value
在R中进行配对样本t检验
上一节我们介绍了独立样本的比较,本节中我们来看看另一种常见场景:配对样本t检验。它适用于比较同一组对象在干预前后(或两种相关条件下)的测量值。
对于配对数据,我们通常有两列数值变量,分别代表“前测”和“后测”。以下是进行配对t检验的方法:
# 查看配对数据
str(paired_df)
# 执行配对样本t检验
paired_test_result <- t.test(paired_df$pre, # 前测向量
paired_df$post, # 后测向量
paired = TRUE, # 关键:指定为配对检验
alternative = "two.sided",
mu = 0,
conf.level = 0.95)
# 打印结果
print(paired_test_result)
配对检验的结果解读与独立样本检验类似,关注t值、自由度和p值。其零假设是“配对差值的总体均值为0”。
重要参数与注意事项
以下是关于t.test()函数的一些关键参数和选择建议:
paired:TRUE为配对t检验,FALSE(默认)为独立样本t检验。var.equal:TRUE假设两组方差相等(执行Student‘s t检验),FALSE(默认)不假设方差相等(执行Welch’s t检验)。通常建议保持默认的FALSE,除非有充分理由相信方差齐性。alternative:指定备择假设方向。"two.sided"(默认)检验均值是否不相等;"greater"检验第一组均值是否大于第二组;"less"检验第一组均值是否小于第二组。应根据研究问题事先确定。- 数据组织:数据可以组织为两个独立的向量,也可以组织为包含一个结果变量和一个二分组的单一数据框。选择对应的函数调用方式即可。
总结
本节课中我们一起学习了如何使用R进行均值差异的t检验。我们介绍了:
- t检验用于比较两个组别连续型变量均值的差异。
- 独立样本t检验适用于比较两个独立组的均值。
- 配对样本t检验适用于比较同一组对象在两种相关条件下的均值。
- 在R中使用
t.test()函数执行检验,并重点讲解了公式语法(outcome ~ group)和关键参数(如paired,var.equal)。 - 学会了如何解读输出结果,特别是t统计量、自由度、p值和置信区间,并依据p值做出统计推断。


掌握t检验能帮助你在公共政策分析中,科学地评估项目效果、比较群体差异,从而为决策提供数据支持。
13:方差分析模型 📊

在本节课中,我们将学习一种用于比较两个或更多组之间连续型结果变量是否存在显著差异的统计方法:方差分析。我们将了解其核心思想、如何在R中实现,以及如何解读结果。
概述
当您有一个感兴趣的连续型结果变量,并希望比较其在两个或更多组之间的测量值,以查看是否存在可辨别的差异时,可能会遇到此类数据分析任务。例如,比较四组家庭的储蓄情况,或比较干预前后的测试分数。虽然T检验适用于两组比较,但对于多组情况,我们需要使用方差分析。
方差分析的核心思想
上一节我们介绍了多组比较的需求,本节中我们来看看方差分析如何解决这个问题。我们观察到的数据差异可能来自多种来源。当我们查看结果的分布时,可以认为变异既来自解释性或组间差异,也来自特质性或个体差异。
我们的任务可以这样思考:组间差异是否比个体差异更大或更重要?这是一种思维方式,即我们认为数据中的变异更多地来自组间差异,而非个体差异。如果数据变异更多地来自组间差异,我们可能认为这些组在某些关键方面存在不同。
您可以通过可视化核密度估计来思考。例如,不同组的结果分布可能显示组内相似而组间不同。或者,在某些情况下,组内差异甚至可能大于组间差异。
我们可以利用关于变异来源的思想来思考组间差异。方差分析的核心是比较某个结果中不同来源的方差。对于简单的一元方差分析,我们比较的比率是组间方差与组内方差的比值。
正式地,这产生了一个F统计量:组间均方 / 组内均方。
F统计量必须足够大,这取决于我们的样本量和组数。如果F统计量足够大,我们可能拒绝我们的基线假设,即所有组实际上是相同的。我们的零假设是组间没有差异。
需要知道的重要一点是,F分布随着观测数量和组数的变化而变化。它有两个自由度:一个在分子,一个在分母。
为了给您一个直观印象,让我们看看一些不同的F分布。在左侧,我们只改变分母的自由度。您会注意到曲线的形状发生变化,但随着我们接近0,它会渐近地趋向无穷大。在右侧,我们只改变分母的自由度。在这里,曲线的形状也在一定程度上发生变化。如果我们同时增加分子和分母的自由度,您会注意到分布的形状和中心位置都发生了变化。
F分布的形状随着分子自由度、分母自由度以及两者比率的变化而变化。因此,对于任何自由度的组合,思考F分布的形状都稍微困难一些,但幸运的是,我们不必想得太复杂,我们可以计算它。
在R中执行一元方差分析
在R中执行一元方差分析相当简单。我们将使用一个适用于R中所有方差分析方法的命令,称为 aov。
aov 接受一个公式:左边是我们的兴趣变量(结果变量),右边是分组因子。在本例中,我们将指定一个单一的分组因子。我们还需要告诉R我们的观测来自哪个数据框。
对于一元方差分析,您可以将公式指定为 outcome ~ group,数据参数指定为 data = data_df。
执行方差分析方法的一般工作流程是:拟合模型,为其分配一个名称,然后总结或查看分析摘要。
我们将查看类似这样的代码,所以让我们跳转到R Studio会话中。
以下是当前视频的脚本。首先,让我们加载一些数据。我们将加载两个包含方差分析信息的数据集,您稍后可以尝试使用。我们还将加载一个来自上一会话的数据集 data2。
如果您尝试过视频2数据中的代码,您会注意到最后一部分包含对三组数据执行T检验的选项,但它没有成功。如果您想在这里进行比较,我们将重新引入该数据。
方差分析由 aov 命令执行。我们的结果是测试分数,分组变量是组。如果我们查看 anova1_df 数据框,可以看到分组变量和测试分数,我们可以忽略X列。
当我们执行此操作时,会得到一个摘要表。它告诉我们函数调用是什么以及结果的项是什么,但这并不是特别有帮助。更好的方法是,如果我们对相同的调用分配一个名称,例如 anova1,然后查看摘要。
现在我们有一个摘要表,它更多地告诉我们数据中变异的来源。单独的模型调用对我们帮助不大。在这种情况下,我们得到的是模型拟合的摘要,但我们想知道的是具体的变异来源。
现在,如果我们查看结果中的变异来源,我们会看到,在本例中,“group”标识了结果总体变异中来自组间差异的部分。我们会看到一个F值,即方差的F统计量比率。我们还会看到一个P值,在本例中写为 Pr(>F)。这又是我们的P值。
通常,如果 Pr(>F) 小于0.05,我们可以拒绝组间无差异的零假设。
您的结果可能看起来像这样。让我们跳转回R Studio中的结果并查看一下。
在本例中,我们的组级结果的概率约为0.217。这高于0.05的阈值,因此我们可能不拒绝组间无差异的零假设。
但让我们一起来看一个不同的数据框,并一起编写代码。
让我们尝试对 anova2_df 进行相同的测试。如果我们在这里查看,我们现在有组和测试分数。如果我们一起编写这段代码,我们将其称为 anova2。
模型名称是 anova2。公式是 test_score ~ group。数据源是 anova2_df。现在,我们可以总结该模型:summary(anova2)。
我们看到,在这种情况下,组的P值约为0.91,高于0.05的水平。
如果您想重新查看视频2代码中的数据集 data2,可以在这里尝试。思考您将在该数据集中放置每个变量的位置,然后查看摘要。
需要知道的一点是,方差分析本身并不能告诉我们哪个组不同。所有方差分析方法只能告诉我们存在差异,但不能告诉我们哪个组不同。为此,我们执行事后分析。一种分析方法称为Tukey的显著性差异检验。
现在,一旦方差分析表明存在一个不同的组,您可以在组之间进行许多成对的T检验。问题是,如果您进行大量成对的T检验,就会遇到多重比较的问题。多重比较问题意味着您可能会在零假设实际上为真时意外地拒绝它。
因此,我们可以执行这些比较,但调整我们的发现以纠正多重测试。这就是Tukey的诚实显著性差异检验的用武之地。它类似于T检验,但对我们的P值进行了调整,以适应我们比较许多不同组对的事实。
在R中,我们使用 TukeyHSD 来实现。这需要一个方差分析模型(一个 aov 对象)作为输入,因此我们必须在拟合方差分析模型之后进行。让我们看看在R中如何操作。
在R中,我们首先拟合方差分析模型,然后将其传递给 TukeyHSD。如果您希望所有差异都为正值,即希望组间所有差异非负,可以选择 ordered = TRUE。您还可以像以前一样,使用 conf.level 更改均值差异周围的置信区间。
让我们一起来尝试。这里我们有第一个方差分析模型 anova1。如果我们将其传递给 TukeyHSD,我们会看到组之间的差异。例如,组1和组4、组2和组4、组3和组4之间的差异都是正的,但置信区间包含0,我们实际上不会确信拒绝无差异的零假设。这与我们的结果一致,因此这些P值都不小于0.05。
如果我们跳转到第二个测试 anova2,您会看到,尽管我们的整体拟合表明没有显著差异,但有些组似乎比其他组更不同。然而,在任何情况下,任何组对比较的P值都没有低于我们认为具有显著差异的0.05水平。
但如果其中任何一个低于0.05,我们会说这两组在我们感兴趣的结果上可能存在差异。
您可以在自己的时间重新尝试对变量2和变量3进行方差分析模型。
当您解释Tukey的显著性差异时,请查看每一列。第一列显示被比较的因子水平,第二列显示均值差异,第三和第四列显示该置信区间的下限和上限,最后一列显示均值差异的P值。这是我们关心的东西。通常,如果P值小于0.05,您可以拒绝无差异的零假设。
总结

在本节课中,我们一起学习了方差分析模型。我们了解到,方差分析是一种用于比较多个组间均值差异的统计方法,其核心是比较组间方差与组内方差的比率。我们学习了如何在R中使用 aov 函数拟合一元方差分析模型,并使用 summary 函数查看结果。重要的是,方差分析只能告诉我们是否存在显著差异,但不能指出具体哪些组不同。为此,我们引入了Tukey HSD事后检验,用于在控制多重比较误差的情况下进行两两比较。许多涉及模型的R方法都遵循类似的流程:指定公式、拟合模型、总结结果,然后进行额外的事后估计。因此,方差分析是通往R中更复杂统计模型分析的一个良好入门。
14:P值模拟分析 📊

在本节课中,我们将深入探讨统计学中一个核心但常被误解的概念:P值。我们将通过模拟数据的方式,直观地理解P值的含义、计算方法以及如何解读它。
在之前的视频中,我们讨论卡方检验、T检验和方差分析时,都提到了P值的概念。我们曾多次提到,当P值小于0.05时,可以拒绝原假设。为了理解这背后的含义,思考这些检验在做什么至关重要。这种表述源于一种名为“原假设显著性检验”的范式。

什么是P值?🤔

P值是一个介于0和1之间的概率。它表示在原假设为真的前提下,获得与观测到的检验统计量一样大(或一样极端、一样不同)的结果的概率。换句话说,P值衡量了我们观察到的差异仅由随机因素(偶然性)导致的可能性有多大。
一个0.05的P值意味着,如果原假设(例如,组间无差异)实际上为真,我们大约有5%(即20次中有1次)的概率会错误地拒绝它,转而支持备择假设。
理解这一点需要再次思考概率分布。
P值从何而来?📈
对于每一种检验,我们都会将计算出的检验统计量与特定的概率分布进行比较:
- 对于卡方检验,是卡方分布。
- 对于T检验,是学生t分布。
- 对于方差分析,是F分布。
我们想知道的是:对于一个形状与我们的检验和样本相匹配的分布(这会影响自由度),在原假设为真的前提下,观察到比我们得到的统计量更极端的统计量的累积概率是多少?这能告诉我们,观测到的结果仅由偶然性导致的概率。
- 对于卡方分布,可以想象一条垂直的蓝色虚线代表卡方统计量(例如7)。该线右侧曲线下的阴影面积,就是观察到大于7的卡方值的累积概率。在本例中,自由度为3,卡方统计量为7对应的P值约为0.072。
- 对于t分布,虚线代表t统计量(例如2)。该线右侧的阴影面积(约3.4%)就是P值,即0.034。
- 对于F分布,原理相同。一个F统计量(例如3.25)对应的垂直线右侧的面积,就是更极端值的累积概率。
通过模拟我们了解其分布的数据,并观察误差或差异模式可能出现的位置,可以更直观地理解这一点。我们可以在实践中看到这种“错误拒绝”的发生,并借此机会学习R中的几个新技能。
在R中模拟数据与可视化 🖥️
我们将创建模拟数据,编写一些表达式,并遇到一个名为 replicate 的函数,它允许我们多次迭代执行某个函数。我们将通过两种方式来看待这个问题。
首先,我们将模拟一些样本,并通过可视化其分布和均值来观察密度估计如何暗示组间是否存在差异。
其次,我们将在假设原假设为真的前提下,模拟大量样本,并寻找组间出现的极端差异。
为此,我们需要从一个分布中抽取随机数。R的 stats 包有许多与概率分布相关的函数,通常以 d、p、q、r 开头:
d代表密度函数。p代表概率函数。q代表分位数函数。r代表随机抽样,这正是我们需要的。
例如,rnorm 用于从正态分布中随机抽样。类似地,rf、rchisq、rt 分别用于从F分布、卡方分布、t分布中抽样。我们需要提供分布的形状参数以及要抽取的样本数量。
需要注意的是,计算机本身并不产生真正的随机数,这是一件好事。为了获得可重复的随机样本,我们需要设置一个随机种子。种子是一个用于启动随机数生成过程的数字。设置相同的种子并按相同顺序执行步骤,将得到完全相同的结果。
可视化单个样本
让我们跳转到R Studio会话中,看看如何操作。
首先加载必要的包并设置随机种子。
# 加载包
library(ggplot2)
library(dplyr)
# 设置随机种子以确保结果可重复
set.seed(12345)
接下来,我们创建一个包含100个观测值的数据框,这些值来自均值为0、标准差为1的正态分布。
# 创建第一个样本数据框
sample1 <- data.frame(randovar = rnorm(n = 100, mean = 0, sd = 1))
我们可以查看其直方图,并计算样本均值。
# 绘制直方图
hist(sample1$randovar)
# 计算样本均值
sample_mean1 <- sample1 %>% summarise(mean_val = mean(randovar))
print(sample_mean1)
现在,我们创建一个包含1000个观测值的更大样本。
# 创建第二个样本数据框(更大样本)
sample2 <- data.frame(randovar = rnorm(n = 1000, mean = 0, sd = 1))
同样绘制直方图并计算均值。你会发现,更大样本的分布中心更紧密地围绕在0附近。
可视化多个组
接着,我们创建一个包含5个组的数据框,每组有100个观测值,均来自相同的正态分布。
# 创建包含5个组的样本数据框
sample_groups <- data.frame(
randovar = rnorm(n = 500, mean = 0, sd = 1),
group = rep(1:5, each = 100) # 重复1到5,每个数字重复100次
)
我们可以计算每个组的均值。
group_means <- sample_groups %>%
group_by(group) %>%
summarise(mean_val = mean(randovar))
print(group_means)
尽管我们知道所有数据都来自同一个分布(总体均值相同),但每个样本组的均值会略有不同。这就是随机性带来的变异。
绘制核密度图与均值线
为了更清晰地展示,我们使用ggplot2绘制核密度图,并添加均值垂直线。
以下是绘制第一个样本(100个观测值)密度图的代码:
# 绘制样本1的密度图与均值线
ggplot(sample1, aes(x = randovar)) +
geom_density(fill = "blue", alpha = 0.5) + # 密度曲线
geom_vline(aes(xintercept = mean(randovar)), # 均值垂直线
color = "red", linetype = "dashed", size = 1) +
labs(title = "样本1的分布 (n=100)",
x = "随机变量值",
y = "密度") +
theme_minimal()
对于包含5个组的样本,我们可以按组绘制并比较:
# 绘制5个组的密度图与各自的均值线
ggplot(sample_groups, aes(x = randovar, fill = as.factor(group))) +
geom_density(alpha = 0.4) +
geom_vline(data = group_means, aes(xintercept = mean_val, color = as.factor(group)),
linetype = "dashed", size = 0.8, show.legend = FALSE) +
labs(title = "五个模拟组的分布",
x = "随机变量值",
y = "密度",
fill = "组别") +
theme_minimal() +
facet_wrap(~group, nrow = 1) # 分面显示
从图中可以看到,即使数据生成过程完全相同,不同样本组的分布形状和均值位置也存在自然波动。这初步揭示了P值存在的背景:即使总体无差异,样本间也会因随机抽样而产生差异。
模拟P值:观察“错误拒绝” 🔄
上一节我们看到了随机抽样带来的自然变异。本节中,我们通过一个更结构化的模拟来直接观察P值的本质。
我们将设计一个实验:在已知两个群体均值真实差异为0(即原假设为真)的情况下,反复抽取多对样本,然后计算每对样本的均值差。我们想知道,纯粹由于偶然性,我们观察到大于某个特定阈值(例如0.3)的均值差的频率是多少?这个频率就类似于一个“经验P值”。
我们将改变两个因素来观察P值如何变化:
- 样本量:从30增加到100。
- 数据离散度(标准差):从1增加到2。
以下是模拟的核心步骤和代码。
首先,我们设定基础参数并进行第一次模拟(小样本,低离散度)。
# 设定模拟参数
num_sims <- 1000 # 模拟次数
n_obs <- 30 # 每组样本量
mean1 <- 0 # 第一组总体均值
mean2 <- 0 # 第二组总体均值(差异为0)
sd1 <- 1 # 第一组总体标准差
sd2 <- 1 # 第二组总体标准差
threshold <- 0.3 # 我们关注的差异阈值
# 使用replicate函数进行模拟
# 每次模拟:从两个分布中各抽一个样本,计算均值差
mean_diffs <- replicate(num_sims, {
sample_a <- rnorm(n = n_obs, mean = mean1, sd = sd1)
sample_b <- rnorm(n = n_obs, mean = mean2, sd = sd2)
mean(sample_a) - mean(sample_b)
})
# 计算“经验P值”:均值差大于阈值的比例
p_val_empirical <- mean(abs(mean_diffs) > threshold) # 这里用绝对值模拟双尾检验
cat(sprintf("模拟次数: %d, 样本量: %d, 标准差: %.1f\n", num_sims, n_obs, sd1))
cat(sprintf("均值差绝对值 > %.1f 的比例 (经验P值): %.3f\n", threshold, p_val_empirical))
运行这段代码,你可能会得到大约0.2到0.3之间的值。这意味着,即使真实差异为0,在样本量为30的情况下,仍有约20%-30%的概率会观察到绝对值大于0.3的均值差。
现在,我们增加样本量到100。
# 改变参数:增加样本量
n_obs <- 100
# 重新运行模拟(使用相同的随机种子起点可以保证比较的公平性,但这里我们关注趋势)
set.seed(123) # 重置种子,开始新的可比序列
mean_diffs_large_n <- replicate(num_sims, {
sample_a <- rnorm(n = n_obs, mean = mean1, sd = sd1)
sample_b <- rnorm(n = n_obs, mean = mean2, sd = sd2)
mean(sample_a) - mean(sample_b)
})
p_val_empirical_large_n <- mean(abs(mean_diffs_large_n) > threshold)
cat(sprintf("\n模拟次数: %d, 样本量: %d, 标准差: %.1f\n", num_sims, n_obs, sd1))
cat(sprintf("均值差绝对值 > %.1f 的比例 (经验P值): %.3f\n", threshold, p_val_empirical_large_n))
你会发现,这个比例(经验P值)显著下降,可能低于0.05。样本量越大,我们对总体均值的估计越精确,随机波动导致大差异的可能性就越小。
最后,我们增加数据的离散度(标准差从1变为2),同时保持大样本量。
# 改变参数:增加离散度
sd1 <- 2
sd2 <- 2
n_obs <- 100 # 保持大样本量
set.seed(123)
mean_diffs_high_sd <- replicate(num_sims, {
sample_a <- rnorm(n = n_obs, mean = mean1, sd = sd1)
sample_b <- rnorm(n = n_obs, mean = mean2, sd = sd2)
mean(sample_a) - mean(sample_b)
})
p_val_empirical_high_sd <- mean(abs(mean_diffs_high_sd) > threshold)
cat(sprintf("\n模拟次数: %d, 样本量: %d, 标准差: %.1f\n", num_sims, n_obs, sd1))
cat(sprintf("均值差绝对值 > %.1f 的比例 (经验P值): %.3f\n", threshold, p_val_empirical_high_sd))
此时,经验P值又会上升。因为数据越离散(噪声越大),随机抽样的结果波动就越大,即使在大样本下,也更容易偶然抽到均值差异较大的样本对。
你可以尝试修改代码中的 num_sims(模拟次数)、n_obs(样本量)、mean1/mean2(设置真实的差异)、sd1/sd2(离散度)以及 threshold(阈值),来获得对P值工作原理更深刻的直觉。
总结与要点 🎯
本节课中,我们一起学习了P值的模拟分析。
- P值的本质:P值是在原假设为真的条件下,观察到当前数据(或更极端数据)的概率。它量化了偶然性所能解释结果的可能性。
- P值的计算:通过将检验统计量(如t值、卡方值)与相应的理论概率分布进行比较,找出获得该统计量或更极端值的尾部概率。
- 模拟的启示:通过R数据模拟,我们直观地看到:
- 即使总体无差异,样本间也存在随机变异。
- 样本量增大会减少抽样误差,使得观察到大偶然差异的概率(P值)降低。
- 数据离散度增大会增加抽样波动,使得P值升高。
- 对“P < 0.05”的审慎看待:0.05阈值是一个被广泛采用但并非神圣不可侵犯的惯例。它意味着接受约5%的“假阳性”错误风险。解读结果时,必须将P值与效应大小(差异的实际幅度)结合考虑。一个具有极小P值但效应量微乎其微的发现,其实际意义可能有限。
- 科学推断的累积性:没有任何单一检验能提供确凿的证据。科学知识是通过多次实验、多个样本、重复检验的结果累积而成的。P值只是这个持续评估过程中的一个工具。

希望这次模拟练习能帮助你超越对P值“是否小于0.05”的机械判断,更深入地理解其背后的统计逻辑与不确定性原理。
15:政策仿真建模导论 🧮

在本节课中,我们将要学习政策仿真建模的基础知识,这是一种用于预测未来政策效果的前瞻性分析方法。我们将了解什么是微观仿真模型,以及数据分析师在其中扮演的关键角色。
上一节我们介绍了政策仿真模型属于前瞻性政策分析,本节中我们来看看其具体类型和定义。



什么是政策微观仿真模型?
政策微观仿真模型是一种计算机生成的预测工具。它试图模仿或模拟政府项目或政策在不同假设和不同政策干预下,对人口中个体或微观单位的影响。
- 微观单位:主要指个人,但也可用于分析政策变化对家庭、企业或其他小型组织的影响。
- 核心目的:主要设计用于观察政策变化可能带来的效果,并且几乎总是将人口过程(如出生、死亡、迁移)考虑在内。


数据分析师的角色
政策仿真建模是一项技术性很强的工作,数据分析师通常是团队中的关键成员。以下是数据分析师可能承担的主要职责:
- 识别数据源:寻找并确定用于模型输入的数据来源。
- 数据清洗与管理:对数据进行清理、重新编码和管理,这是项目的重要组成部分。
- 结果可视化:当模型产生结果后,创建数据可视化图表来展示结果至关重要。
- 沟通数据问题:最重要的职责之一是向团队沟通数据的已知问题或局限性。数据分析师通常最了解数据的优缺点,这有助于确保模型使用最优数据并产生高质量结果。


为了胜任这些工作,数据分析师需要了解模型的目标和试图回答的问题。
模型的目标与假设
我们需要了解仿真的目标,这通常涉及预测在现状(无进一步政策变化)或不同干预措施下,未来的情况会如何。本质上,我们是在设计一个帮助决策者预测未来的“水晶球”。




作为团队成员,还需要了解模型将基于哪些假设。这些假设不仅包括政策变化的可能效果,还包括:
- 差异化的有效性:在创造新不平等或加剧现有不平等方面的差异。
- 成本问题:政策实施的成本考量。
- 社会影响:其他类型的社会影响。
此外,微观仿真模型也常用于观察非政策变化的“冲击”带来的潜在影响,例如经济冲击(如衰退、通胀)、环境冲击(如自然灾害)或其他社会冲击。
本节课中我们一起学习了政策微观仿真模型的基本概念,明确了它是一种模拟政策对微观个体影响的计算机预测工具。我们重点探讨了数据分析师在模型开发团队中的核心职责,包括数据准备、结果呈现和至关重要的数据质量沟通。最后,我们了解了这类模型的目标在于预测未来,并依赖于一系列关于政策效果、成本和公平性等方面的关键假设。



接下来,我们将有幸向David Mendez教授学习他开发的一个具体微观仿真模型实例。
16:政策仿真模型典型案例 🧪

在本节课中,我们将学习政府机构常用的几种政策仿真模型。这些模型帮助决策者预测政策变化可能带来的影响,例如对养老金、医疗系统、税收和家庭的影响。我们将通过具体案例来了解这些模型的应用和构建方式。
政府政策仿真模型概述
上一节我们介绍了政策分析的基本概念,本节中我们来看看政策仿真模型的实际应用。许多政府,尤其是联邦政府,都拥有多种政策微观仿真模型。这些模型旨在帮助政府思考未来,例如养老金系统和公共医疗系统的前景。它们也被设计用来评估所得税政策变化可能产生的影响,以及这些变化对家庭、住户和企业的影响。

典型案例分析
以下是两个由政府使用的著名政策微观仿真模型案例。
- 澳大利亚的CAPITA模型:全称为“个人所得税比较分析”。这是澳大利亚财政部使用的一个微观仿真模型,用于分析个人所得税结构以及收入转移政策变化的单一及综合效应。该模型评估这些变化对不同收入水平、不同生活安排和家庭结构的家庭所产生的影响。
- 加拿大的社会政策仿真数据库与模型:这同样是用于分析政策变化的微观仿真模型。它旨在评估个人所得税和现金转移支付政策变化对加拿大公民可能产生的成本影响和再分配效应。
模型的开发方式


现在,我想提醒大家回顾我们之前讨论过的不同政策杠杆。政府总是在“自制”与“购买”之间做出决策。政策仿真模型也不例外。
- 许多政府选择内部开发并维护自己的政策仿真模型。政府内部的工作人员会全程参与此类模型的创建。
- 同时,许多政府也会通过政府合同和研究资助,借助外部专业知识来开发政策仿真模型供其使用。政府有时会与外部专家(包括学术界、智库和私营企业)签订合同,委托他们设计和执行政策仿真模型。
- 此外,正如我提到的,政府也会资助研究人员。这些研究人员对不同类型的政策仿真模型有自己的想法,政府为他们提供资源来设计、执行并公开发布这些模型的结果,供公众参考。
COVID-19疫情中的模型应用

在COVID-19疫情期间,我们看到了多种政策微观仿真模型的出现。

许多政府,连同许多私营组织和学术研究人员,都开发了自己的COVID-19模型。这些模型旨在预测未来的发病率、住院率、死亡率、疫苗接种覆盖率等所有在大流行病中重要的结果指标。因此,这些模型侧重于预测这些指标,同时也基于不同政策变化可能产生的影响的假设进行推演。
你可以仔细思考一下构建这类政策仿真模型所需的各种数据。你可以访问“健康指标与评估研究所”和“伦敦帝国理工学院”的网站,详细了解他们的模型是如何设计的,以及输入了哪些信息。你甚至可以自己稍微操作一下数据,进行一些自己的预测。
模型的数据基础

对于这些COVID-19微观仿真模型或许多其他现有模型,你可以深入查看。我希望你能花点时间看看输入这些模型的各种不同类型的数据。
对于COVID-19模型,输入数据包括关于人口年龄结构、当前除COVID-19外其他原因导致的死亡率、医疗设施位置、实验室检测能力等方方面面的信息。构建这些模型需要非常多的数据。当你开始详细查看它们时,你会看到来自众多不同来源的数据,在创建和执行这些模型过程中扮演着多么重要的角色。
课程总结


本节课中,我们一起学习了政策仿真模型在公共部门决策中的实际应用。我们了解了政府如何使用微观仿真模型(如澳大利亚的CAPITA模型和加拿大的SPSD模型)来预测税收、福利等政策变化的影响。我们还探讨了这些模型的三种主要开发方式:政府内部开发、委托外部专家开发以及资助学术研究。最后,我们以COVID-19疫情为例,看到了仿真模型在预测公共卫生事件和评估干预措施效果中的关键作用,并认识到多源数据是构建这些复杂模型的基石。
17:仿真建模中的经济分析:成本效益评估 💰


在本节课中,我们将学习如何在政策仿真建模中融入经济分析,特别是成本效益评估。许多政策仿真模型会考虑各种结果,其中也包括与金钱或成本相关的问题。我们将重点介绍两种最常用的方法:成本效益分析和成本效果分析。
公共管理的核心原则与经济分析
上一节我们介绍了仿真建模的基础,本节中我们来看看如何将经济分析融入其中。请记住公共管理的四个核心原则:经济、效率、效果和公平。成本指标实际上同时涉及所有这四个原则,而不仅仅是经济和效率。

在不同类型的分析中考虑成本,既适用于我们正在讨论的前瞻性政策分析(如微观仿真建模),也适用于回顾性政策评估(如项目评估)。在决策科学中,有一系列方法用于考虑不同干预措施的成本。
以下是决策科学中常用的成本分析方法:
- 成本效益分析
- 成本效果分析
- 分布性成本效果分析
- 成本效用分析
今天我们将重点讨论成本效益分析和成本效果分析,因为这两种方法在微观仿真建模中使用最为频繁。这些方法的目的是帮助决策者找到实现预期政策或干预目标的最经济有效的手段。总体目标是最高效地使用经济资源,以便为其他有价值的用途节省资源。
更直白地说,在公共部门,资金永远是不够的。我们总是在资源受限和稀缺的条件下工作。因此,我们始终希望帮助决策者思考如何让有限的资金发挥最大效用,并从用于不同目的的资金中获得最大回报。


成本效益分析
好的,让我们从成本效益分析开始。这种分析(CBA)的目的是确定一组旨在实现相同(甚至可能不同)目标的替代干预措施中,哪一个能产生最大的货币净效益。
在成本效益分析中,成本和效益都以货币单位衡量。在CBA中,一切都归结为金钱。进行成本效益分析的最终结果是为了找出不同干预措施或政策的净效益,它同样以货币单位衡量,并定义为总货币效益减去干预措施的总成本。
这也可以表示为效益成本比。让我们看一些假设的例子,这里你只需要关注其中简单的数学计算。


假设我们有一组可以实施以解决特定社会问题的政策:
- 政策A:成本为50万欧元。其所有成本效益在社会层面被确定能带来75万欧元的效益。因此,在这个案例中,以欧元为货币单位的效益被认为大于特定时间范围内的干预成本(该时间范围需在分析中确定)。其效益成本比为1.50,这意味着每支出1欧元,我们预计能获得1.50欧元的回报。
- 政策B:实施成本稍高,为75万欧元。经过技术分析(效益和成本的确定方法非常技术性),确定其效益总计为100万欧元。该政策的效益成本比为1.33,即每支出1欧元,预计可获得1.33欧元的回报。
- 政策C:实施成本为50万欧元。在这种情况下,该政策的效益估计累积到35万欧元。这意味着实施该政策的成本将高于我们从中看到的效益。其效益成本比小于1,这并不理想,表明其成本将高于我们预期的回报。

成本效果分析
了解了以货币衡量一切的成本效益分析后,我们接下来看看成本效果分析。成本效果分析(CEA)用于比较具有相同或类似目标的替代干预措施。
在CEA中,成本以货币单位衡量,但效果以自然单位衡量(例如,避免的疾病病例数、获得的工作岗位数、提高的考试分数)。CEA的结果通常表示为成本效果比,即每单位效果的成本。
例如,假设我们正在评估两种旨在减少青少年吸烟的学校干预计划:
- 计划X:每年成本为10万美元,预计能使吸烟率降低5个百分点。其成本效果比为:$100,000 / 5% = $20,000 每降低1%的吸烟率。
- 计划Y:每年成本为15万美元,预计能使吸烟率降低10个百分点。其成本效果比为:$150,000 / 10% = $15,000 每降低1%的吸烟率。
在这个例子中,虽然计划Y的绝对成本更高,但它在“每降低1%吸烟率的成本”这个指标上更有效率。
总结

本节课中我们一起学习了在政策仿真建模中融入经济分析的核心方法。我们首先回顾了经济分析如何呼应公共管理的四大原则。接着,我们深入探讨了成本效益分析,该方法将成本和效益均转换为货币价值,并通过计算净效益或效益成本比来比较不同政策。然后,我们介绍了成本效果分析,它用于比较目标相似的干预措施,其中成本用货币衡量,而效果则用自然单位(如避免的病例数)衡量,最终结果体现为成本效果比。




掌握这些经济评估方法,能帮助我们在资源有限的公共部门环境中,为决策者提供数据支持,识别出最具经济效率的政策方案,从而让公共资金发挥最大价值。
18:仿真建模中的经济分析:成本效果评估 💰


在本节课中,我们将要学习成本效果分析。这是一种用于评估不同政策或干预措施效率的经济分析方法,尤其适用于公共部门的决策支持。



上一节我们介绍了成本效益分析,本节中我们来看看成本效果分析。成本效果分析的目的与成本效益分析相似,但略有不同。其目的是确定,在实现相同目标的不同干预方案中,哪一套方案能在给定支出水平下产生最多的期望成果,或者以最低的成本达到给定的成果水平。这两种视角都归属于成本效果分析。
成本效果分析的一个重要特点是,成本以货币单位衡量,而效果则以非货币单位衡量。这与成本效益分析不同,后者将所有结果都转化为货币价值。


在这种情况下,成本效果被衡量为一个比率,即每获得一个单位的期望成果所需花费的货币单位。有时可以将其理解为“每一分钱能带来多少效果”。
以下是成本效果分析的一个应用实例。让我们回到撒哈拉以南非洲,特别是乍得,那里存在非常高的艾滋病毒感染率问题。在本研究进行时,乍得成年人的艾滋病毒流行率为9%。一个微观模拟政策模型被设计出来,用于评估多种不同干预措施的成本效果。这些干预措施使用了不同的政策杠杆,但目标都是减少乍得人口中的艾滋病毒新发感染和流行率。
模型计算了每避免一例艾滋病毒感染所需的成本。以下是不同干预措施的成本效果估算结果:
- 筛查献血者:每避免一例感染的成本低于100美元。
- 对性工作者进行同伴教育:每避免一例感染的成本低于100美元。
- 针对高风险男性或青少年的大众媒体宣传:每避免一例感染的成本约为500美元。
- 对高风险男性进行同伴教育:每避免一例感染的成本约为500美元。
- 为孕妇实施抗逆转录病毒治疗:每避免一例感染的成本约为1000美元。
- 自愿艾滋病毒咨询和检测:每避免一例感染的成本约为1000美元。
所有这些结果都表明,这些干预措施具有很高的成本效果。以预防艾滋病毒感染这一宝贵成果来衡量,它们的成本并不高。决策者通常不会只从列表中挑选一项,而是可能认为所有这些措施都值得考虑。解决复杂问题往往需要在多个层面、运用多种杠杆进行政策干预。

接下来,我们来区分“成本效果”与“成本节约”。在政策领域,这两个术语经常被混淆,理解它们的区别至关重要。
成本效果并不意味着节省了资金。当我们说一项干预措施具有成本效果时,实际上是指决策者认为所实现的成果值得投入相应的成本。这涉及到价值判断。

成本节约则更为直接。它意味着一项干预措施所节省的资金超过了其实施成本。要声称某措施是成本节约的,必须确保其在资金支出方面产生的影响,确实大于实施该措施本身的成本。



本节课中我们一起学习了成本效果分析。我们了解了其核心目的是比较实现相同目标的不同方案效率,其特点是以货币单位衡量成本,以非货币单位衡量效果。我们还通过一个预防艾滋病的实例,看到了如何计算和解释成本效果比率。最后,我们明确了“成本效果”与“成本节约”是两个不同的概念,前者关乎成果与成本的比值是否“值得”,后者则直接关乎总支出是否减少。
19:不确定性处理:敏感性分析方法 🔍

在本节课中,我们将要学习政策微观模拟建模中一个至关重要的环节:如何处理模型中的不确定性。我们将重点介绍一种名为“敏感性分析”的核心方法,它帮助分析师理解数据或参数的不确定性如何影响模型的结论。
上一节我们介绍了政策微观模拟模型的基本概念,本节中我们来看看如何应对模型构建中不可避免的不确定性。



不确定性的来源
政策微观模拟模型需要多种类型的数据,我们称之为模型的参数或变量。然而,这些数据可能存在以下问题:
- 数据可能完全未知。
- 数据可能在你所在的国家无法获得,但其他国家有。
- 数据可能过于陈旧。
- 数据质量可能较差。
所有这些问题都会给我们的模型引入不确定性。政策模拟师处理这种不确定性的主要方法就是敏感性分析。


什么是敏感性分析?

敏感性分析是一种测试方法,用于检验单个变量或一组变量的值存在不确定性时,是否会显著影响分析的结论。
其核心操作很简单:分析人员会多次运行模型,每次为不确定的变量插入不同的值,然后观察结果是否因此产生差异,或者说结果是否对该变量值的变化“敏感”。
以下是进行敏感性分析时可能发现的几种情况:


首先,敏感性分析可能证明,你的模型结论严重依赖于某个特定的假设或变量的假定值。例如,我们对某项干预措施在不同亚群体中的有效性水平不确定。通过使用不同的值进行测试,我们可能会发现结果对这种不确定性非常敏感。不幸的是,这也意味着我们无法从模型中得出明确的结论,因为不确定性太大,模型结果会随之波动。
其次,敏感性分析也可能证明,某个假设并不会显著影响研究的结论。这反过来意味着,我们的分析对这种不确定性不敏感。尽管存在数据质量问题、参数缺失,我们不得不做出假设,但如果敏感性分析显示结果没有实质性变化,那么我们的结论即使在不确定性存在的情况下仍然可以成立。模型对我们不确定并赋予了一系列可能值的变量不敏感。
敏感性分析的另一种用途是,分析师可以确定一个变量必须达到的最小值或最大值,才能使一项干预措施显得有价值。我们可以测试变量的最低可能值和最高可能值,然后找出介于两者之间的、能使干预产生积极效果的临界值。这一切都是为了向决策者提供与其手头任务相关的信息。我们的模型并非完美无缺的水晶球,数据存在局限,但在不同的假设集(如此处的最小值或最大值)下,决策者可以了解政策路径得以实施所需满足的条件。


实例:COVID-19微观模拟模型
让我们回顾一下在全球广泛使用的COVID-19微观模拟模型。这些基于群体的政策微观模拟模型的结果,对模型中的许多参数或变量都非常敏感。
随着时间推移,我们对某些信息的掌握越来越准确,但病毒本身也在变化,仍存在许多未知。因此,这些微观模拟模型被大量用于进行敏感性分析,以评估这些因素对我们试图预测的结果(如感染率、住院人数)的影响。



例如,人群中疫苗接种率和加强针接种率对模型结果影响巨大。围绕这些比率进行的敏感性分析,可以让决策者和公众了解,如果接种率达到非常高的水平,病毒的控制情况会比当前观察到的好多少。
COVID-19模型的另一个重要特征是病毒的基本再生数(R0),即其传播能力。随着病毒的不同变异,这个数值在变化。模型结果对COVID-19病毒基本再生数的假设非常敏感。了解这一点很重要,同时也有助于我们理解,如果新的变异株传播力更强,对未来疫情可能意味着什么。
COVID-19微观模拟模型中还有许多其他重要变量,这里的重点是:所有这些因素都影响着我们预测未来的准确性,包括在不同政策下以及人们对这些政策的遵守率情况下的预测。



总结


本节课中我们一起学习了如何处理政策微观模拟模型中的不确定性。我们了解到,由于数据缺失、质量不佳或参数未知,模型会存在不确定性。敏感性分析是应对这种不确定性的核心工具,它通过为不确定的变量输入不同的值并重新运行模型,来检验模型结论的稳健性。分析结果可能显示结论对不确定性敏感(需谨慎解读),也可能显示不敏感(结论更可靠)。此外,敏感性分析还能帮助确定关键变量的阈值,为决策者提供更丰富的信息背景,正如在COVID-19模型中的应用所示。
20:不确定性敏感性分析实例演示 🧪

在本节课中,我们将通过一个具体的政策微观模拟模型案例,学习不确定性敏感性分析的实际应用。我们将探讨一项关于肺癌筛查的成本效益研究,并理解如何通过敏感性分析来评估模型假设对结论的影响。


上一节我们介绍了敏感性分析的基本概念,本节中我们来看看它在真实研究中的具体应用。这里有一个关于使用低剂量CT扫描进行肺癌筛查的成本效益研究案例。癌症筛查有多种类型,其共同目的是在癌症早期阶段发现它,以提高治疗成功的可能性。其他癌症筛查的例子包括结直肠癌筛查、女性乳腺X光摄影和巴氏涂片检查。对于肺癌高风险人群——吸烟者,有人提出:如果他们接受低剂量肺部CT扫描以早期发现肺癌,这将对早期诊断和烟草所致肺癌患者的生存率产生何种影响?
这项微观模拟模型研究针对的是高风险个体,即年龄在60岁及以上、平均吸烟史超过10包年(这意味着他们平均每天吸一包烟,至少持续10年)的吸烟者。研究发现,对于单次基线CT扫描,其成本效益(以每挽救一个生命年所需的CT扫描成本表示)为2500美元/生命年。这算具有成本效益吗?考虑到其他医疗技术,这非常具有成本效益。正如我之前提到的,医疗干预措施的成本通常高达10万美元/生命年,但仍被视为具有成本效益。我们认为花钱延长人们的生命是合理的。


因此,这个微观模拟模型的总体结果相当积极。然而,该模型在许多方面做出了大量假设,其中包括关于CT扫描假阳性率的假设。这意味着,如果一次CT扫描结果为阳性,那么该人需要进行非常昂贵的额外检查以确认是否真的患有癌症。因此,假阳性率会增加总成本。如果许多阳性CT扫描结果最终被证明是假阳性,这可能会改变成本效益的衡量标准。因此,该微观模拟模型的设计者围绕假阳性率进行了一些敏感性分析。
以下是他们的发现:
他们发现,即使假阳性测试结果的比例高达50%,在这种极端情况下,成本效益比(每挽救一个生命年的成本)也未超过5万美元,而这仍然被认为是具有成本效益的。

这是一个使用成本效益分析来检验模型参数不确定性的例子。即使在一个我们认为现实中远不可能达到的高假阳性率假设下,我们仍然可以得出结论:对肺癌高风险人群进行CT扫描是一种具有成本效益的干预措施。

关于敏感性分析和微观模拟模型,我想最后强调两点:
首先,始终记住人口动态对长期预测至关重要。因此,你的微观模拟模型必须始终包含所有相关的人口动态因素,特别是在预测中的死亡率以及人口的迁入和迁出。
其次,关于敏感性分析,从理论上讲,任何微观模拟模型都可以进行无限次敏感性分析,因为模型中输入的所有数据、变量和参数都存在某种不确定性。因此,建议是:你应该在参数不确定性最大、同时对决策者最有帮助的领域进行敏感性分析。毕竟,这些工具最终是用来帮助分配资源和思考政策改革与变化的。




本节课中我们一起学习了如何在一个具体的肺癌筛查成本效益微观模拟模型中应用敏感性分析。我们看到了即使对关键参数(如假阳性率)进行极端假设测试,核心结论(CT扫描具有成本效益)依然稳健,这增强了决策者对模型结果的信心。同时,我们总结了进行敏感性分析时应关注参数不确定性最高且对决策最有价值的领域。
21:政策微观仿真:区室模型解析 🧮


在本节课中,我们将学习一种在健康政策分析中常用的模拟模型——区室模型(或称宏观模拟模型)。我们将以预测未来吸烟率为例,详细解析区室模型的核心概念、工作原理和计算方法。
上一节我们介绍了模拟模型在政策分析中的重要性,本节中我们来看看一种具体的模型类型:区室模型。

区室模型概述

区室模型的核心是追踪特定群体在不同类别(区室)中的数量变化。它主要关注两个关键特征:存量和流量。

- 存量:指在特定时间点,处于某个特定类别中的个体数量。这代表了我们所关注的“现状”。
- 流量:指导致个体在不同类别间移动的规则和条件。这决定了“未来”的存量将如何变化。
核心动态方程
区室模型的基本思想可以用一个简单的公式来描述:
未来某一时刻的吸烟者数量 = 当前时刻的吸烟者数量 + 期间发生的变化量


用数学公式表示为:
Smokers(t+1) = Smokers(t) + Δ
其中,Smokers(t) 代表时间 t 时的吸烟者存量,Δ 代表从时间 t 到 t+1 期间吸烟者数量的净变化。
变化量的构成
那么,变化量 Δ 具体包含哪些部分呢?它由进入和离开“吸烟者”这个区室的个体流构成。
以下是构成变化量的主要流量:

- 流入量(增加吸烟者存量):
- 开始吸烟者:从未吸烟者转变为吸烟者。
- 复吸者:已戒烟者重新开始吸烟。
- 流出量(减少吸烟者存量):
- 戒烟者:吸烟者成功戒烟。
- 死亡者:吸烟者因各种原因死亡。


因此,变化量 Δ 的计算公式为:
Δ = (开始吸烟者数量 + 复吸者数量) - (戒烟者数量 + 死亡者数量)

参数估计与计算
为了计算上述流量,我们需要借助一系列从数据或文献中估计得到的参数。这些参数通常表示为特定事件发生的概率或比率。
以下是计算各流量所需的关键参数及其应用:
- 开始吸烟率:一个从未吸烟者在特定时期开始吸烟的概率。计算公式为:
开始吸烟者数量 = 从未吸烟者存量 × 开始吸烟率 - 戒烟率:一个吸烟者在特定时期戒烟的概率。计算公式为:
戒烟者数量 = 吸烟者存量 × 戒烟率 - 复吸率:一个已戒烟者在特定时期重新开始吸烟的概率。
- 死亡率:一个吸烟者在特定时期死亡的概率。

这些参数可以根据年龄、性别、社会经济状况等进行细分,从而使模型能更精确地反映现实情况。当我们掌握了这些参数(通常以红色高亮显示在模型图中),并将其与相应的存量相乘,就能预测出未来每个流量的大小,进而推算出未来的吸烟者存量。
总结


本节课中我们一起学习了区室模型的基本原理。我们了解到,区室模型通过追踪存量和模拟流量来预测群体行为的变化。其核心是使用一个动态方程 Smokers(t+1) = Smokers(t) + Δ,并通过估计开始吸烟率、戒烟率、复吸率和死亡率等关键参数来计算变化量 Δ。这种模型结构清晰,是进行健康政策微观仿真和预测的有力工具。
22:烟草控制基础区室模型构建 🚬


在本节课中,我们将学习烟草控制领域的基础区室模型。区室模型是一种用于追踪人群在不同状态(如吸烟者、戒烟者、从不吸烟者)之间流动的数学工具。我们将了解其核心概念、参数设置、政策应用以及如何利用它来回答重要的公共卫生问题。
大家好,我是大卫·门德斯,密歇根大学公共卫生学院健康管理与政策系的副教授。
在这些模块中,我将讨论烟草控制的基础区室模型。
我们希望通过这个模型来追踪吸烟或处于不同吸烟阶段的人数。

实际上,我们会按年龄、性别和不同类别来追踪他们。
但我们关注的主要特征是吸烟状态。
他们现在是吸烟者,还是曾经吸烟的戒烟者,或是从未开始吸烟的从不吸烟者。

正如我们在上一个模块中讨论过的。
我们有一定数量的参数,这些参数是通过模型内或模型外的数据估计得出的,它们定义了从一个区室到另一个区室的转变率。
我们特别关注这个方框中的开始吸烟率和戒烟率。
开始吸烟率,如果你还记得,是指单个个体在特定年龄开始吸烟的概率。戒烟率是指特定个体在特定年龄停止吸烟的概率。

这些参数很重要,因为通过它们,我们可以施加政策干预。
政策会影响这些参数。例如,如果我们实施一项提高香烟税的政策,这将同时影响开始吸烟率和戒烟率。
随后,你会看到各个区室(即存量)将发生变化。
特别是,吸烟者区室的人数会下降,吸烟流行率会以一定的幅度下降。

除了这些用于控制的参数,我们还追踪人口的其他特征。
这些特征由模型中嵌入的其他参数来调节。

例如,按年龄、性别和吸烟状态划分的死亡率就嵌入在我们的模型中。
一旦模型设置完成,我们就可以预测未来会发生什么。
我们可以追踪随时间推移,从一个类别转移到下一个类别的人数。
然后,我们可以将这个区室模型用于不同的问题,并回答不同类型的疑问。
以下是一些可以用区室模型回答的问题示例。

我将从政策效果评估开始介绍。

这是一篇使用名为Simmoke的区室模型的论文,由乔治城大学的大卫·利维教授在2011年提出。
利用这个模型,他预测了薄荷醇香烟禁令的影响。
其结果最近被食品和药物管理局引用,用于支持他们在2022年推动市场禁售薄荷醇香烟的努力。
另一个例子是可行性分析。
在这篇论文中,密歇根大学的肯·沃纳教授和我进行了一项研究。
我们证明,美国疾病控制与预防中心或政府为2010年设定的全国吸烟率目标是无法实现的。
1999年设定的目标是到2010年将吸烟流行率降至12%。
利用我们估计的参数和一个区室模型,我和我的合著者能够证明,在10年内实现这一目标几乎是不可能的。
这提醒了政府注意这个问题,我们为此提出了一个新的目标。

我们的预测非常准确。2010年,我们距离12%的目标还非常遥远。
区室模型的另一个应用例子是“假设”情景分析。
在这篇论文中,肯·沃纳教授和我使用一个模型来探究,如果我们以可行的方式管理开始吸烟率和戒烟率,发展中国家可能实现的最佳情景是什么。
我们期望随着时间的推移,吸烟率会发生怎样的变化。

当然,还有许多其他应用,但我希望这三个例子能作为区室模型在卫生政策中作用的入门介绍。
谢谢。




本节课中,我们一起学习了烟草控制的基础区室模型。我们了解了模型如何通过追踪人群在“吸烟者”、“戒烟者”和“从不吸烟者”等状态间的流动来工作。核心参数开始吸烟率和戒烟率是政策干预的关键杠杆。通过嵌入人口特征参数(如死亡率),模型可以用于政策效果评估、目标可行性分析和“假设”情景模拟,为公共卫生决策提供有力的数据支持。
23:烟草控制区室模型:薄荷醇香烟案例研究 🚬


在本节课中,我们将学习一个具体的区室模型应用案例,该模型用于追踪薄荷醇香烟吸烟者。我们将了解如何扩展基础模型以区分不同吸烟者群体,并利用模型估算特定烟草产品在历史上造成的公共卫生危害。

大家好,我是大卫·门德斯,密歇根大学公共卫生学院健康管理与政策系的副教授。在本模块中,我将讨论一个用于追踪薄荷醇吸烟者的特定区室模型。
模型概述与目标 📊
上一节我们介绍了基础的区室模型。本节中,我们将看看一个扩展模型,它专门设置了薄荷醇吸烟者和非薄荷醇吸烟者区室。
该模型的目标是追踪随时间推移,个体在这两个区室之间流动的数量。在完成模型构建后,我们使用它来估算薄荷醇香烟在1980年至2018年间对美国人口造成的危害。
模型估算的危害结果 📉
以下是模型估算出的关键数据。这些数字清晰地展示了薄荷醇香烟的影响。
-
第一行(总人口影响):
- 额外吸烟者:由于薄荷醇香烟,增加了10,137,808名吸烟者。
- 额外死亡:在此期间,美国人口中约有378,000例死亡归因于薄荷醇香烟。
- 生命年损失:这些因吸烟而过早死亡的个体,总共损失了约300万生命年。
-
第二行(非裔美国人影响):
- 额外吸烟者:在非裔美国人口中,有150万额外吸烟者是由于薄荷醇香烟。
- 额外死亡:非裔美国人中归因于薄荷醇吸烟的额外死亡约为156,471例。
- 生命年损失:因薄荷醇吸烟损失了约150万生命年。
-
第三行(对比分析):
- 这一行列出了如果非裔美国人口未被作为薄荷醇香烟的营销目标,其参数与总人口一致时的预期危害。通过比较第二行和第三行,我们可以量化针对性营销策略造成的额外负担。
模型结果揭示了一个严峻的事实:在1980-2018年间,非裔美国人约占美国总人口的12%,但却承受了因薄荷醇吸烟导致的全部额外死亡的41%,以及全部生命年损失的50%。这种差异正是通过区室模型分析得出的。
下图直观地展示了表格中的数据,分别是累积的额外吸烟者、过早死亡和生命年损失。

区室模型的优势与局限 ⚖️
区室模型在预测、估算未来或假设情景下的损害或收益方面非常有用,正如我们在薄荷醇案例中所做的那样。
然而,我们需要谨慎解释和使用区室模型。在模型开始时我们提到,区室代表的是个体集合,我们将这些个体视为同质的。但现实中人口存在大量异质性,我们在区室模型中忽略了这一点,因为我们通常认为这对特定问题不相关。
但有时,这种异质性非常重要,而使用区室模型我们可能会错过它。此外,区室模型也无法完全体现个体之间的互动。在区室中,我们忽略了那些可能引发人口状态变化的互动。
从区室模型到个体模型 🔄
当我们认为个体间的互动很重要,或者需要更深入地考察人口异质性时,这种基于总体的方法可能就不是最佳选择了。
这时,我们会转向基于个体的模型。我们不再像区室模型那样追踪群体,而是追踪具体的、具有不同特征的个体。这类模型被称为微观模拟模型或智能体模型。
- 智能体模型:更为灵活,允许个体间互动,并观察这些互动在宏观层面产生的效应。
- 微观模拟模型:更侧重于考察具有丰富异质性的个体,但通常不模拟个体间的互动。我们可以为个体设定各种条件,并逐一追踪他们。
例如,如果想研究“一个人有许多吸烟朋友并通过互动说服此人吸烟”这类效应,就需要在智能体模型中进行追踪。

总结 📝
本节课中,我们一起学习了:
- 如何构建和应用一个追踪薄荷醇吸烟者的扩展区室模型。
- 利用该模型量化了薄荷醇香烟在历史上造成的公共卫生危害,特别是其对非裔美国人社区的不成比例影响。
- 认识了区室模型的优势(如宏观趋势预测)和局限性(如忽略异质性与个体互动)。
- 了解了当问题需要考察个体差异和互动时,可以转向基于个体的模型,如微观模拟模型或智能体模型。


感谢大家的学习。
24:项目评估定义及其现实意义 📊



在本节课中,我们将学习项目评估的基本概念、它在公共政策与行政中的重要性,以及数据分析在其中扮演的关键角色。我们将通过一个清晰的框架来理解不同类型的评估,并探讨数据分析如何支持这一过程。
课程概述

我是Paula Lance教授。在我们的系列课程中,现在我们将聚焦于项目评估,探讨它为何对公共政策与公共管理至关重要,以及数据分析在此过程中的重要作用。
课程路线图
在接下来的几周,我们的学习路线如下:
- 首先,我将介绍不同类型的项目与政策评估。
- 为此,我们将使用一个项目评估框架。需要说明的是,这个过程涉及大量专业术语,我们必须先进行定义,之后会频繁使用它们。
- 同时,我们将详细讨论数据分析在项目与政策评估中的重要作用。
- 我们将探讨一些常用的评估设计,以及相关的数据分析与数据可视化技术。
- 此外,课程将包含大量真实世界的案例,并有一位特邀嘉宾分享经验。
什么是项目评估?
我们之前已经简单讨论过。项目评估是一种描述性或回顾性的政策分析。这意味着,与我们之前讨论的前瞻性政策分析(试图预测政策实施后的未来状况)不同,在项目评估中,我们提出的问题是:已实施的公共项目、政策或干预措施是否有效?
它可能涉及对项目执行层面、用户体验的分析,但更常见的是聚焦于政策、项目和干预措施的影响与有效性、成本,以及审视可能出现的各类伦理、价值观和不公平问题。
项目评估为何重要?
首先,让我们回顾公共管理的四大支柱。项目评估与对这四大支柱的问责制息息相关:
- 有效性:政府需要了解正在实施和改革的政策、正在运行的项目是否运作良好,是否达到了目标,并确保它们没有对民众造成伤害。
- 经济与效率:在政府工作中,资源稀缺是常态,因此我们必须确保资源得到高效利用和分配,即以一定的资源投入实现特定目标,并获得相应价值。
- 公平性:这始终是一个重要支柱。我们需要了解正在实施的项目或政策是否引发了公平性问题,或者它们是否真正实现了减少不公平的目标。
项目评估对政府工作至关重要的原因还包括:
- 它可以通过媒体或其他渠道,为特定的政策和项目带来积极的关注,是政府与公众沟通其工作的绝佳方式。
- 从研究的角度看,项目评估也很重要,它有助于多个不同学科的理论发展、实证研究,并推动真正高水平的循证政策设计与传播。

数据分析在政策过程中的作用
您之前见过这个图表,但我要再次提醒您数据分析在政策过程中的重要作用,以及政策分析如何融入其中。

正如您可能回忆起的,政策制定过程的第一步是评估现状。当我们使用数据来做这件事时,它回溯到公共管理的所有七项核心职能,尤其是报告、规划和指导职能。
政策周期的第二步是评估政策选项。我们已经讨论过前瞻性政策分析和政策模拟建模在预测特定政策实施后世界可能面貌方面的重要作用。
接着,政策制定者必须做出政策选择。同样,在政策选项分析中,数据在比较和对比不同政策选项以及做出选择方面至关重要。
然后是政策实施,这正是我们本节要关注的重点,以及政策评估(这再次属于回顾性政策分析)。因此,对于政策实施,我们可以进行所谓的过程评估、实施评估或实施科学;而对于评估部分,我们将进行所谓的结果评估或总结性评估。

不必担心,我将定义所有这些术语,并为所有这些不同类型的评估提供大量示例。现在,让我们快速通过一个例子,来真正强调这类政策分析和政策评估对政府通过政策所进行的工作是多么重要。

实例分析:烟草消费税
我们之前讨论过,这是一个使用税收政策杠杆的正式政策示例。它基于经济学理论,即价格与烟草消费之间存在负的价格需求弹性。在这种情况下,这意味着价格的单位变化会对烟草产品的消费产生相应的负面影响或导致消费下降。
因此,一个重要的政策问题是:需要多高的税率才能使烟草产品的价格具有实际产生公共卫生效益的价格弹性?
一包香烟的价格在世界各地差异很大,这是因为不同的国家、州或省对香烟价格征收了不同水平的税。
已经进行了数十项烟草税收政策评估,其中大多数使用所谓的时间序列分析来估计通过征税提高不同价格水平后需求的变化。
总体研究结果确实表明,通过征税提高价格会降低需求,正如经济理论所预测的那样。然而,价格水平至关重要,价格弹性确实因税收水平而异。
一些研究表明,全球只有38个国家(仅覆盖全球人口的14%)的烟草税高到足以产生公共卫生影响(其定义是:对香烟征税至少能覆盖烟草相关医疗保健、劳动力损失及其他公共成本的75%)。这是世界卫生组织进行的研究。
因此,世界卫生组织也建议各国或次国家单位(州、省等)将其烟草税提高到能够实现公共卫生影响目标的水平,并将其作为更广泛战略的一部分。这里的要点是,这不仅仅是简单的征税问题,他们还基于证据提出了如何实施该税收的政策建议。世界卫生组织建议使其简单化,例如,不要对不同烟草产品(如雪茄、无烟烟草或电子烟产品——它们是尼古丁产品,而非烟草产品或香烟)进行差异化定价;采用简单的税收结构;通过考虑通货膨胀和经济增长的影响,确保税收降低其可负担性。

总结



综上所述,这类政策评估研究对于提出建议和真正理解政策如何能对其目标产生最大价值和最佳影响至关重要。在本节课中,我们一起学习了项目评估的定义、其在公共部门中的核心重要性,以及数据分析如何作为关键工具支撑整个评估过程。我们通过烟草税的例子,看到了评估如何将理论、实证研究与具体的政策建议连接起来。
25:项目评估主要类型 📊



在本节课中,我们将学习项目评估的两种主要类型:总结性评估和过程性评估。我们将通过一个具体的公共卫生案例来理解它们之间的区别与联系。
概述
项目评估是衡量政策或项目效果的关键环节。评估主要分为两大类:总结性评估和过程性评估。总结性评估关注项目带来的“结果”,而过程性评估则关注项目“如何”被执行。理解这两种评估类型,有助于我们更全面地判断一个项目是成功还是失败,以及原因何在。
总结性评估:关注结果
总结性评估旨在衡量干预措施或政策的最终效果。它内部又细分为两种:影响评估和成果评估。

上一节我们介绍了评估的基本分类,本节中我们来看看总结性评估的具体内容。
影响评估
影响评估的关注点不一定是干预措施的最终目标,而是那些通向最终成果的中介因素或路径步骤。有时,一个政策的最终效果需要很多年才能显现,我们无法等待那么久。因此,影响评估旨在检验那些通向最终结果的中间步骤是否按预期实现。
成果评估
与影响评估不同,成果评估直接聚焦于研究或评估的最终目标成果。它衡量的是干预措施旨在改变的终极状态。
为了更清晰地说明这两种评估的区别,我们来看一个具体的例子。
案例:艾滋病防治媒体宣传运动
我们将使用“干预逻辑模型”来阐述这个例子。逻辑模型描述了干预措施预期的工作路径:从实施开始,如何一步步达到最终目标。
过去,一些非洲国家实施了大规模的媒体宣传运动,旨在通过公共教育减少艾滋病病毒(HIV)的暴露、感染和死亡。其逻辑模型如下:
- 实施宣传运动。
- 目标人群接触到宣传信息。
- 宣传信息提升人们的知识或意识,并改变人们的态度。
- 知识和态度的改变导致风险行为减少,安全行为增加。
- 行为的改变最终导致HIV暴露、感染和死亡减少。

以下是两种评估在此案例中的侧重点:
- 影响评估:会侧重于测量逻辑模型中更接近前端的步骤。例如,测量人们在艾滋病预防方面的知识、态度和自我报告行为是否发生了改变。
- 成果评估:则会侧重于测量最终的指标,例如HIV感染率和死亡率的变化。
需要注意的是,一些评估会同时包含影响和成果两部分,二者并非互斥。

过程性评估:关注执行
过程性评估则完全不同,它关注的是干预措施本身及其执行过程。
上一节我们讨论了项目“产生了什么结果”,本节中我们来看看项目是“如何被执行”的。
过程性评估收集并分析有关干预措施实施、管理、持续运作的数据,以及目标人群对干预措施的接受度。其核心是评估干预措施是否按照设计初衷被忠实执行。
这一点至关重要,因为项目失败可能有两个原因:
- 执行故障:干预措施本身可能很好,但在执行过程中出了问题。
- 设计故障:干预措施可能被完美执行了,但设计本身无效。


因此,同时进行过程评估和总结性评估,才能帮助我们准确判断:如果没看到预期结果,问题究竟出在执行过程还是干预方案本身。
让我们回到艾滋病媒体宣传运动的例子,看看过程评估会关注什么。
以下是过程评估可能关注的几个方面:
- 执行保真度:宣传运动的所有组成部分(如印刷媒体、电子媒体、社交媒体)是否都按设计意图得到了实施?
- 覆盖范围:宣传是否触达了人群?是否覆盖了预期的目标群体(如特定年龄、地理位置)?
- 公众认知:通过调查,评估公众对宣传运动的名称识别度、信息理解度以及信息与自身的相关性。

总结
本节课中我们一起学习了项目评估的两种主要类型。
首先,总结性评估包含影响评估和成果评估。影响评估关注干预措施的近期效应和通向长期成果的中间步骤;成果评估则直接关注干预措施旨在改变的最终目标。
其次,过程性评估关注干预措施是否以及如何按照设计的内容、质量和覆盖范围得以实施。



许多项目和政策评估会同时包含过程性目标和总结性目标,以便对项目效果做出全面、准确的判断。
26:项目评估方法论框架 📊


在本节课中,我们将学习项目评估的核心方法论框架。这个框架对于本模块后续的政策分析至关重要。我们将介绍一个包含六个步骤的通用流程,并探讨数据分析师在每个步骤中的关键角色。

概述

项目或政策评估需要遵循一个系统性的框架。本节将详细介绍一个包含六个步骤的循环框架,并阐述数据分析师在评估团队中的重要作用。

六步评估框架

每个项目或政策评估都需要采取一系列步骤。以下是所有评估都应遵循的六步框架。
第一步:让利益相关者参与
利益相关者是指任何对项目、政策或评估结果有利益关系的人。关键的利益相关者通常是那些要求进行评估的人,他们想知道项目是否有效。必须让他们参与进来,以明确他们希望了解的问题。任何干预措施都可能涉及数十个潜在问题,因此从一开始就需要与利益相关者沟通,确定他们想了解什么。
第二步:理解干预措施
确保包括利益相关者在内的所有人对干预措施有共同的理解。通常使用逻辑模型来描述干预措施,例如之前展示的关于非洲国家艾滋病大众媒体宣传活动的模型。每个人都需要理解干预措施的设计、逻辑模型中的步骤,以及它预期如何运作并实现目标。在许多项目评估中,并非所有人都对干预措施的工作原理或最终目标达成一致,因此统一认识至关重要。
第三步:设计评估
在完成前两步后,评估设计可以更加聚焦。需要明确评估的目标:这是要评估影响和/或结果(总结性评估),还是仅仅评估过程,或者兼而有之?必须确定希望实现什么。
第四步:收集与分析证据
此步骤涉及收集和分析支持评估的数据与证据。
第五步:得出结论
基于证据得出结论,但必须确保结论是合理且有依据的。
第六步:确保结果的使用与传播
确保评估结果将被使用、传播,并且从中获得的经验教训将得到应用。之后,整个循环将重新开始。

框架的可视化与标准
刚刚介绍的框架步骤并非线性过程,而是一个循环过程。此外,对于每个项目评估,都需要考虑一套统一的标准。
- 效用性:评估必须有用。我们收集、分析和产生的数据,必须有人关心其结果并希望使用它们。
- 可行性:评估必须能够完成。必须存在能够回答利益相关者所提问题的数据。
- 合规性:我们需要遵循研究和项目评估的法律及伦理准则。项目评估是一种研究,在涉及政策和政府项目服务评估时,几乎总是涉及人类,因此必须遵守伦理和法律标准。
- 准确性:我们需要确保产生准确、高质量的研究结果,能够回答所提出的问题。

数据分析师的角色
数据分析师在项目评估研究团队中的角色非常重要。请记住,作为数据分析师,你不仅仅是后续步骤中分析数据的人。
在设计研究方法和聚焦评估方面
你需要确保理解所有步骤中发生的事情。如果你没有直接参与,请花时间了解利益相关者是谁、他们是否已参与、对干预措施的理解如何,以及评估的优先问题是什么。如果不了解评估的背景,你就不能仅仅被要求提供数据。
你需要能够区分过程、影响和结果评估问题。通常,你会发现需要推动一些利益相关者,以可衡量的方式构建评估问题。很多时候,利益相关者会说“告诉我们它是否有效”,但“有效”的定义是什么?我们必须非常具体地将其构建为可衡量的方式。
你还需要能够就拟议数据源的任何局限性进行沟通。作为数据专家,你需要告诉人们拟议使用的数据源有哪些优缺点。
在收集和分析数据与证据方面
这更为明显。作为数据分析师,你可能会协助数据收集和准备分析数据,参与执行分析,并可能建议团队其他成员未曾考虑的其他分析方法。
在总结结果时
当到了总结结果、说明评估发现的阶段,你需要成为理性的声音,确保结论有数据支持。你比团队中大多数人都更了解数据的优势和局限性,因此需要扮演沟通数据和分
析局限性的角色,以确保人们不会过度解读结果。
在沟通结论方面
这是一个非常重要的角色。你可能会负责数据可视化工作,向各类受众传达结果,包括那些没有技术培训、不理解研究和数据问题的受众。因此,你需要确保结果被清晰且真实地传达。
评估基础要点
我们刚刚回顾了项目评估的一般步骤,现在来谈谈一些基础要点。
项目和政策评估是一种非常重要的政策分析类型,旨在回答一个重要问题:政府实施的干预措施、项目、政策改革或新政策是否产生了任何效果?它是否有效?
然而,任何评估都可能涉及比“它是否有效”更具体的多个不同问题,因为“是否有效”本身不是一个好的研究问题。因此,评估需要聚焦于利益相关者的优先问题,而不是数据分析师、团队中的统计学家或研究人员的优先问题。
所有评估都经历多个步骤,正如这个通用的六步循环框架所概述的那样。
数据分析师是评估研究团队在所有六个步骤中的重要成员,而不仅仅是在人们真正开始处理数据的后期阶段才介入。
总结


在本节课中,我们一起学习了项目评估的核心方法论框架。我们介绍了一个包含六个步骤(让利益相关者参与、理解干预措施、设计评估、收集与分析证据、得出结论、确保结果使用与传播)的循环流程,并强调了数据分析师在每个步骤中的关键作用,包括确保评估问题可衡量、沟通数据局限性、执行分析以及清晰传达结果。理解评估的背景、干预措施的逻辑以及利益相关者的优先问题,对于进行有效且可靠的政策分析至关重要。
27:设计聚焦与可信证据采集 🎯



在本节课中,我们将学习项目评估研究流程的第三步:聚焦研究设计并收集可信证据。我们将介绍研究设计中的核心概念,包括自变量与因变量,以及评估研究中至关重要的“反事实”概念。

研究设计概述
上一节我们讨论了评估流程的早期步骤,本节中我们来看看如何具体规划一项科学探究。研究设计是科学探究的规划过程。
以下是研究设计的标准组成部分:
- 目的:研究是为了探索、描述现象,还是解释事物间的因果关系?在项目评估中,我们的核心目的是解释,即建立因果关系。
- 分析单位:研究关注的对象是什么?在公共政策评估中,分析单位通常是个人,但也可能是社区、企业、学校或非营利组织。
- 主题:我们关注分析单位的哪些方面?是行为、取向(如知识、态度),还是环境条件?
- 时间维度:研究在何时进行观察?这对于详细设计至关重要。
因果关系与反事实
项目评估试图做科学中最困难的事:解释新政策或项目实施后会发生什么。这意味着我们需要在项目/政策的实施(及个体对其的接触)与后续结果之间建立因果关系。
建立因果关系需要一个特定的研究设计,它能比较“接触干预后发生的情况”与“不接触干预会发生的情况”。后者就是反事实。
反事实是指:如果没有这项新政策、项目或干预,世界或我们所处的情境会是什么样子?我们将“有干预”的世界与“无干预”(反事实)的世界进行比较,以观察差异。
在实验室研究中,反事实通常被称为控制条件。在现实世界混乱的政策评估中,建立因果关系要困难得多,但目标相同:在某种干预与后续结果之间建立因果联系。
自变量与因变量


现在我们来谈谈自变量和因变量。这些术语在所有科学领域通用。在项目评估研究设计中,我们常用一系列 X 和 O 来图示化研究设计。
X代表干预,即对项目、服务或政策的接触。它是我们试图建立因果关系的起点。O代表对观察结果的记录,即干预试图影响的变量。我们试图在干预X和观察结果O之间建立因果关系。

让我们看一个例子:前测-后测研究设计。
其图示为:O1 X O2
O1是干预前的第一个数据点(前测)。X是新政策或项目的实施。O2是干预后的第二个数据点(后测)。
在这个设计中,我们比较前测 (O1) 与后测 (O2) 以观察变化,并可能将此变化归因于干预X。

变量是观察单位所具有的、能发生变化且我们感兴趣的特征或属性。
- 因变量:其值依赖于另一个变量(自变量)的变量。在项目评估中,它是结果变量,即我们试图解释或预测的事物,也就是那些
O(我们关心并认为干预会影响的结果)。 - 自变量:解释性变量,即我们认为会导致因变量发生变化的变量。在评估中,核心自变量通常是干预 (
X)。此外,分析中可能还需要控制其他与因变量相关的自变量(即控制变量)。
让我们再次可视化前测-后测设计:O1 X O2
O(O1和O2)是因变量或结果变量。X是自变量(干预)。
我们在两个时间点观察因变量,并知道在这两点之间,分析单位接触了自变量(项目或政策变化),然后我们观察结果变量是否发生了变化。

研究设计与反事实评估

一个强大的研究设计能对反事实(即若无干预会发生什么)提供有效的评估。
在前测-后测设计 (O1 X O2) 中,反事实是什么?在这个设计中,第一个观察点 (O1) 被假定为反事实。我们假设如果没有干预,世界在时间点2会与时间点1 (O1) 看起来一样。然后认为 O2 的变化可能是干预 X 的结果。但这个假设可能过于强,存在很多值得担忧的地方。


因此,这里有另一个更强的研究设计,它包含一个控制组:
- 实验组:
O1XO2 - 控制组:
O3O4
控制组在同一时间段内被观察两次,但不接触干预X。
在这个设计中,我们的反事实就是控制组在时间点2发生的情况 (O4)。我们假设这两组在时间点1 (O1 和 O3) 是相似的(或足够接近),因此他们在时间点2 (O2 和 O4) 也应该相似。如果两组在第二个观察点出现差异,我们可以认为这部分差异(或全部)是对干预效果的一个估计。
总结



本节课中我们一起学习了项目评估研究设计的核心要素。我们明确了研究设计需要包含目的、分析单位、主题和时间维度。我们深入探讨了建立因果关系的必要性,并引入了反事实这一关键概念,即“若无干预会发生什么”。我们还用 X(干预/自变量)和 O(观察结果/因变量)的框架图示了研究设计,比较了简单的前测-后测设计与包含控制组的更强设计。理解这些概念是评估政策或项目效果的基础。在接下来的课程中,我们将更详细地探讨不同研究设计的优缺点及其反事实的构建。
28:研究设计方案实例解析 🔍



在本节课中,我们将通过一个具体的实例,来解析研究设计方案的核心概念。我们将探讨如何评估一项政策干预的效果,并理解“内部效度”这一关键术语。通过这个例子,你将学会如何批判性地审视一个研究设计,识别其潜在缺陷,并思考如何构建更严谨的因果推断。
实例背景:城市年票降价政策
假设一个大型城市政府实施了一项新政策,将城市公共博物馆和动物园的家庭年票价格降低了10%。这背后的经济学原理是价格弹性,即希望通过降低价格来刺激需求,使更多家庭购买年票,从而享受这些公共文化产品。
现在,利益相关者希望知道:降低年票价格是导致了收入损失,还是确实增加了需求?这项政策改变的实际影响是什么?
研究设计方案:简单的前后测试设计
为了评估政策影响,我们可以采用一个简单的前后测试设计。在这个设计中:
- X 代表政策干预,即新的年票价格。
- 时间点一(前测) 和 时间点二(后测) 的观测指标包括:
- 一年内售出的家庭年票数量。
- 通过市民调查收集的“过程评估”数据,用于了解市民是否知晓年票的存在及其降价信息。

假设我们实施了这一设计,并得到了以下结果:
- 作为出色的数据分析师,你向利益相关者展示了结果:
- 第一年售出 11,250 张家庭年票。
- 第二年售出 14,500 张家庭年票。
- 统计检验显示,从观测1到观测2的差异具有统计学显著性(P值 < 0.05)。
- 在分析市民调查数据时,你发现了解年票可用性及价格的受访者比例从第一年的 33% 上升到了第二年的 47%,该差异同样具有统计学显著性。
评估设计的内部效度
上一节我们介绍了评估设计及其结果,本节中我们来看看这个设计是否足够严谨。我们是否相信降价直接导致了销量和知晓度的提升?我们是否有强有力的证据证明降价与观察到的增长之间存在因果关系?

这就引出了一个关键概念:内部效度。它指的是一个研究设计能够确立因果关系的强度。那么,这个简单的前后测试设计是否具有强大的内部效度呢?这本质上是在问:第一年的数据(前测)是否是一个良好的“反事实”参照组?
我们总是需要思考:有哪些理由可能让我们不相信这个设计确立了新政策与年票销量增长之间的因果关系?除了政策变化,还有哪些“竞争性假设”可以解释从第一年到第二年的变化?
以下是可能存在的几种担忧:
- 趋势影响:也许在政策干预前,家庭年票的购买量本身就处于上升趋势。我们只拥有一年的干预前数据,可能只是捕捉到了这个固有趋势,而非价格变化的效果。
- 人口变化:我们只关注了售出的年票数量。如果城市人口在第一年到第二年之间增长了,这本身就能解释销量的增加,而非价格差异。
- 测量方式变化:家庭年票购买的测量方式或数据系统是否发生了变化?数据收集和管理系统的改进,可能导致第二年更准确地捕捉到了购买行为,从而显示出“增长”,但这并非价格变化所致。
- 社会期望偏差:如果两年调查的是同一批人,他们在第二次调查中可能不会完全真实地报告自己的知晓情况。当被多次调查时,人们报告的知识、态度或行为的变化,可能反映了真实变化,也可能源于他们觉得“我应该知道这个”而做出不准确的回答。

我们应始终保持批判性和深思熟虑,审视研究设计是否足够强大,是否具备确立因果关系的内部效度。

总结与核心要点
本节课中我们一起学习了研究设计方案的实际应用与评估。总结一些关键要点:
- 用于政策和项目评估的研究设计,需要具备强大的内部效度,才能确立干预措施(自变量)与感兴趣的结果(因变量)之间的因果关系。
- 拥有强大的内部效度,要求我们能够将接受干预的分析单元(如人群)的结果,与一个反事实(即假设未接受干预会发生的情况)进行比较。
- 当我们思考反事实的强度及其可能存在的担忧时,需要了解,研究设计内部效度可能面临的各种问题都有其特定的技术术语(我们将在后续课程中深入探讨)。


一个严谨的研究设计是进行可靠政策评估的基石。通过不断质疑和审视竞争性假设,我们可以更好地理解干预的真实效果。
29:内部效度与外部效度基础




概述
在本节课中,我们将继续学习项目与政策分析和评估领域的重要术语。我们将详细探讨内部效度的概念,并介绍外部效度。理解这些概念对于设计严谨的研究和准确解读评估结果至关重要。


什么是内部效度?

上一节我们介绍了研究设计的基本类型,本节中我们来看看如何评估一个研究设计的质量。当我们讨论研究设计的内部效度时,我们是在评估该设计在理解干预效果方面的强度,确保其不受竞争性假设或替代性解释的威胁。

更简单的说法是:我们是否有信心,我们测量到的是干预的真实效果,而不是研究设计中可能存在的其他因素?我们是否认为能够真正评估政策变化或项目干预的实施与结果之间的因果关系?
内部效度威胁示例:家庭通行证政策
为了更好地理解,让我们回顾之前讨论过的家庭通行证政策案例。该评估采用了简单的前测-后测设计,旨在研究城市公园和动物园的家庭通行证降价对销售量的影响。
结果显示,家庭通行证的总销售量显著增加,同时市民对通行证可用性和降价信息的知晓度也有所变化。

当我们思考这个研究设计在确立“是家庭通行证的价格变化导致了销量增加”这一结论时的强度时,我们可能会产生一些担忧。这些担忧都有其专业术语。


以下是可能威胁该研究内部效度的一些因素:
- 历史效应:如果家庭购买通行证、享受城市公园和动物园的趋势本身就在上升呢?我们的评估可能只是捕捉到了这一历史趋势,是这种上升的历史趋势导致了我们观察到的变化,而不一定是降价。
- 成熟效应:如果人口规模发生了变化呢?如果城市中的家庭数量或总人口数增长了,这就可以解释家庭通行证购买量的增加,而非降价。人口变化是一种趋势,它不同于历史事件,但同样可以解释结果。
- 测量工具效应:从时间点1到时间点2,测量变量的方式可能发生了变化。例如,更好地捕捉了通行证购买数据,或者数据收集转为在线方式等。这种测量或工具的变化可以解释时间点间的差异,而不一定是价格变化。
- 测试效应:如果同一批人在两个时间点都接受了调查,他们可能在第二次回答时不够诚实。这就是我们所说的测试效应。仅仅是多次调查人们这一事实,就可能导致他们改变答案。我们捕捉到的可能是这种测试效应,而非价格干预的效果。


以上是针对家庭通行证价格示例的一些主要内部效度威胁。
内部效度威胁的普遍类型
让我们更概括地回顾这些威胁:
- 历史:如果干预之外发生了其他事情(外部历史事件),那可能是导致变化的原因,而非干预本身。
- 成熟:即使没有干预,人们也可能自行发生变化。在我们之前的例子中,我们讨论的是人口规模增长,但人们随时间变化的方式还有很多。干预可能恰好发生在成熟变化的时间点,而观察到的变化只是正常的成熟过程,并非干预效果。在针对青少年和青年的项目评估中,这一点尤其需要注意,因为他们正在许多方面快速变化。
- 测试效应:从人类那里获取信息是一件复杂的事情,我们必须始终意识到这一点。
- 失访/退出:当我们试图比较时间点1和时间点2,并跟踪同一批人时,参与者可能会退出研究,或者我们丢失了他们的数据。如果我们观察的不是时间点1和时间点2的同一群人,那么这被称为失访或研究退出。如果我们观察的不是同一群人,那么这可能是我们看到的随时间变化的原因,而非干预。
- 向均值回归:这一点非常重要,稍后我会给出一个很好的例子。如果我们关注的是评估中某个我们关心的分布(如收入、成本)处于边缘或尾端的人群,那么在时间点1,他们处于该分布的尾端。仅仅由于人口数据收集的正常波动,在时间点2再次观察时,数据点会有一个向均值回归的趋势,即向分布的平均值或中心移动。例如,收入最低的人群、极端贫困人口、医疗成本最高的人、过去一年被捕次数最多的人。如果我们关注的是处于分布边缘或尾端的人群,即使没有干预,下次观察时,他们也可能会向更积极的平均值方向移动。我们需要意识到这一点。
总结



本节课中,我们一起学习了内部效度的核心概念及其对研究设计的重要性。内部效度关乎我们能否确信观察到的变化是由干预引起的,而非其他因素。我们探讨了多种可能威胁内部效度的因素,包括历史、成熟、测量工具变化、测试效应、失访和向均值回归。理解这些威胁有助于我们设计更严谨的评估,并对结果做出更准确的解释。在接下来的课程中,我们将继续探讨外部效度的概念。
30:内外效度典型案例分析 🏠📊


在本节课中,我们将通过一个关于“支持性住房”干预项目的具体案例,深入探讨研究设计中的内部效度与外部效度。我们将分析如何识别和应对可能威胁研究结论有效性的各种因素。
案例背景:针对长期无家可归者的干预
在任何大城市,长期无家可归者都是一个普遍问题。在某些城市,这一群体的比例尤其高。我们知道,在许多地方,长期无家可归者有着更高的被捕率和急诊/住院等医疗服务使用率。
为此,设计了一项干预措施,旨在为长期无家可归者提供住房,并辅以“支持性住房”服务。这种支持性住房通常通过个案管理的方式,提供额外的社会福利服务。
干预内容:提供支持性住房,并由个案管理员协助参与者连接社会福利和医疗服务。
在干预前的基线测量中,目标人群在12个月内的被捕率为 65%,有至少一次急诊或住院经历的比例为 75%。

干预实施了12个月。数据显示,在干预后的测试期,参与者的被捕率下降至 25%,急诊和住院使用率下降至 40%。
这看起来像是一次非常有效的干预。它不仅旨在提供住房,还旨在观察是否能减少对刑事司法系统和医疗系统等城市资源的消耗。
从内部效度角度审视设计 🧐
现在,让我们从内部效度的角度来思考这个研究设计。对于“是干预导致了被捕率和医疗使用率显著下降”这一结论,有哪些竞争性假设(即其他可能的解释)?
以下是需要考虑的几个内部效度威胁:
- 成熟效应:即使没有干预,这个群体是否也会自然改善?我们观察了他们12个月,他们当时有高被捕率和高医疗使用率。如果一年后再观察他们,是否会仅仅因为时间推移和自身变化(例如,被捕或经历健康危机后的自然波动)而看起来更好?我们无法确定。
- 测量工具变化:从前测到后测期间,测量方法或工具是否发生了变化?这需要仔细核查。
- 向均值回归:这个群体处于分布的两个极端——高被捕率和高急诊使用率。即使没有干预,仅仅由于统计上的“向均值回归”现象,他们在第二年是否也可能表现得更好?数据显示,这种情况确实可能发生。

那么,我们如何控制这些威胁研究设计内部效度的重要因素呢?简单的“前测-后测”设计可能显示干预有重要且显著的影响,但我们确实需要担心这些威胁。



控制内部效度威胁:引入对照组 ⚖️
通常,我们通过设置对照组或比较组来控制这些威胁。
我们会有一个接受干预的实验组,同时会有一个相似的、但未接受干预的对照组。通过比较两组,我们希望对照组能作为“反事实”参照,而两组之间的任何差异则可归因于干预效果。
然而,引入对照组后,我们必须担心另一个内部效度威胁:选择偏倚。
仅仅拥有对照组并不意味着内部效度就高。我们必须担心:这个对照组真的是一个好的反事实参照吗?实验组和对照组之间是否存在可观测的、或更令人担忧的不可观测的差异?也许正是这些组间差异导致了随时间发生的变化,而非干预本身。选择偏倚可能导致我们在没有干预效果时,错误地将其解释为有效。

内部效度 vs. 外部效度 🌍
我们一直在重点讨论研究设计的内部效度,即干预在所研究的特定情境下是否真的造成了差异,以及我们测量的结果效应是否不受那些有专业术语的威胁的影响。
与内部效度相对的是外部效度。我们也需要考虑这一点。
外部效度关注的是:我们的项目或政策评估结果,能否推广到评估情境之外?
- 推广到不同地区:例如,如果我们在罗马进行了这项针对长期无家可归者的支持性住房干预研究并得到了结果,这些结果能否推广或转移到非洲、东南亚或美国的城市?有时可以,有时则不行。
- 研究情境本身的影响:我们进行研究的方式(例如,参与者知道被研究、研究人员的特殊关注等)是否会影响干预效应的水平,或以其他方式影响我们所观察到的结果?我们稍后会详细讨论这一点。

总而言之,对于所有这些专业术语,我希望你真正思考的是:内部效度(研究设计确立因果关系的强度)及其各种威胁(及其专业名称),以及外部效度(研究结果的普遍适用性)。
总结 📝


本节课中,我们一起学习了一个关于支持性住房干预的案例,并借此深入分析了研究设计的效度问题。
我们首先回顾了案例背景和看似显著的干预效果。接着,我们从内部效度出发,探讨了可能挑战该结论的竞争性假设,如成熟效应、测量工具变化和向均值回归。为了控制这些威胁,我们引入了对照组的概念,但同时指出了可能随之而来的选择偏倚风险。



最后,我们对比了内部效度与外部效度。内部效度关乎“研究本身是否可靠”,而外部效度则关乎“研究结论能否推广”。理解并妥善处理这两类效度威胁,对于做出严谨、可信的政策评估至关重要。
31:公共部门评估常用研究设计 📊




在本节课中,我们将回顾项目与政策评估中涉及的一些术语和技术概念,并通过介绍公共部门评估中常用的几种研究设计来加深理解。
概述


研究设计是评估项目或政策干预的整体规划。其核心在于内部效度,即研究设计衡量干预效果、建立因果关系的强度。一个强大的研究设计应没有内部效度威胁,并需要一个良好的反事实作为对比。此外,外部效度指的是将评估结果推广到研究设定和设计之外的能力。
单组前后测设计

上一节我们介绍了研究设计的基本概念,本节中我们来看看第一种常用设计:单组前后测设计。这种设计在项目与政策评估中应用广泛,但正如我们讨论过的,从内部效度的角度来看,它并非特别强大。

以下是该设计的优缺点分析:
优点:
- 易于实施,通常不需要大量数据。
- 可以回顾性实施。常见情况是政策变更后,利益相关者要求分析师获取政策实施前一年的数据,并与实施后的数据进行对比。
- 如果不涉及讨论内部效度威胁等技术细节,该设计及其结果易于沟通。例如,可以轻松创建数据可视化来展示政策干预前后的变化。
缺点:
- 存在许多内部效度威胁,如历史事件、成熟效应、测量工具变化、测试效应等。因此,很容易高估干预效果,因为从时间一到时间二的许多变化可能源于其他因素。
- 该设计常被有意误用于政治目的。例如,有人可能用它来显示“自本届政府上任或政策变更以来,情况有所改善”,但这可能完全无关。有时使用者明知自己在高估干预效果,但出于政治目的仍会这样做。

两组后测设计
接下来,我们看看公共部门项目与政策评估中另一种非常常用的设计:两组后测设计。在这种设计中,一组接受干预,之后进行观测;另一组未接受干预,作为对照组。我们在干预后的同一时间点比较这两组,且没有关于任何一组的干预前信息。

那么,这个设计的反事实是什么?是对照组在观测点的状态。这是一个好的反事实吗?该设计存在哪些内部效度威胁?

以下是该设计的优缺点分析:
优点:
- 易于实施,通常不需要大量数据。
- 常用于数据已可用的场景,例如一个地方实施了政策而另一个地方没有,可以直接进行比较。
- 可以回顾性实施,无需从一开始就规划评估设计。
缺点:
- 此处的反事实问题极大,主要威胁是选择偏差。我们无法断言这两组除了是否接受干预外其他方面都相似。两组很可能在许多其他方面存在差异。
- 因此,这不是一个建立因果关系的良好研究设计,内部效度威胁过多。这也意味着该设计常被误用于为项目或政策进行带有政治动机的论证。
非等效对照组设计

那么,这个设计如何呢?它被称为非等效对照组设计。我们同时拥有一个接受干预的组和一个未接受干预的对照组的前后测信息,并在相同的时间点(干预前、干预后)对它们进行比较。这里没有随机分组,我们只是寻找另一个城市、社区或学校组作为对照。
这个设计的对照组是一个好的反事实吗?该设计有时也被称为双重差分设计。
以下是该设计的优缺点分析:

优点:
- 如果对照组除了未接受干预外,与干预组非常相似,那么它可以作为一个较好的反事实。这比之前讨论的设计提供了更强的反事实。
- 如果前测观测数据已存在,有时可以回顾性实施。
- 随机对照试验存在伦理问题(尤其是在公共部门),而非随机设计则避免了随机分配资源或政策可能带来的伦理争议。
缺点:
- 仍然存在内部效度威胁,最主要的是选择偏差。我们无法确保两组在成熟过程、历史事件暴露、测量工具等方面完全一致。
- 如果数据不存在,收集两组人群的前后测数据成本非常高昂。
- 结果可能更复杂,向利益相关者或公众沟通的难度增加。
随机对照试验
我们指出了上述所有研究设计都存在内部效度威胁,除非我们进行真正的实验,即随机对照试验。

在RCT中,参与者被随机分配到接受干预组或不接受干预组(对照组)。我们拥有两组的前后测信息,并进行比较。随机化在理论上意味着,除了是否接受干预外,这两组在所有其他方面都应相同。

我们并非说没有测试效应或成熟效应,而是假设由于消除了选择偏差,两组经历着相同的成熟和测试效应。因此,如果我们观察到两组之间存在差异,那就可以归因于干预。

随机对照试验具有极强的内部效度,使我们能够有把握地说,两组间从时间一到时间二的不同变化是干预的结果。理论上,它能控制所有内部效度威胁,是我们用于建立因果关系的最强研究设计。
我们将在后续课程中结合具体案例更详细地讨论RCT。
总结




本节课我们一起学习了公共部门评估中四种常见的研究设计:单组前后测设计、两组后测设计、非等效对照组设计(双重差分设计)以及随机对照试验。我们分析了每种设计的优缺点,重点探讨了其内部效度强弱及主要威胁(尤其是选择偏差)。理解这些设计有助于我们更严谨地评估项目与政策效果,并识别可能被误用的论证。
32:实验设计方法论 🧪



在本节课中,我们将要学习实验设计,特别是随机对照试验(RCT)的各种形式、其核心原理、优缺点以及适用场景。我们将通过具体的图示和例子来理解如何设计一个有效的实验,以评估公共政策或项目干预的效果。
随机对照试验的基本形式
上一节我们介绍了随机对照试验的概念。本节中我们来看看它的几种常见设计形式。
经典的随机对照试验包含两个组。参与者被随机分配到干预组或对照组。干预组接受某项新项目或政策改变,而对照组不接受。研究会在干预前和干预后两个时间点对两组进行比较。



包含多次后测的随机对照试验
随机对照试验的设计可以有多种主题和变体。以下是另一种设计形式。
在这个设计中,同样有两个被随机分配的组。但两组在干预前被观测,干预组接受干预后,会在三个不同的时间点被再次观测。


在公共部门,我们不仅想知道干预的短期效果,还想了解其长期影响。因此,干预效果可能在干预后立即测量,然后在六个月后、十二个月后,甚至一、三、五年后再次测量。这些研究设计具有时间维度,我们需要非常具体地规划。
测试多种干预的随机对照试验
随机对照试验也可用于同时测试多种干预的效果。
当你看到这个设计时,应该能轻松识别出它包含三个组。参与者被随机分配到接受干预一、干预二,或作为第三组不接受任何干预(维持现状)。所有组在干预前都被观测。然后,第一组和第二组分别接受两种略有不同的干预。很多时候,我们会比较这些细微的差异,因为我们不确定它们是否重要。之后,各组在干预后会被追踪观测两次。

随机对照试验的核心与优缺点
随机对照试验的关键在于将参与者随机分配到干预组或对照组。这是控制内部效度威胁的核心方法。通过随机分配,我们在研究设计中创造了一种情境,可以合理地假设这些组在除干预暴露外其他方面都是相同的。这就是我们的反事实。
那么,使用随机分配的研究设计(即随机对照试验)有哪些优缺点呢?
以下是其主要优点:
- 黄金标准:它是研究设计的黄金标准,广泛应用于实验室研究及几乎所有的临床和医学研究。
- 控制内部效度:它通过强大的反事实(即对照组)来控制内部效度威胁,让我们能很好地了解没有干预会发生什么。
- 确定效果:使用这种设计,我们不仅能回答“干预是否有效”这个模糊的问题,还能相当确定干预效果的方向(正向或负向)和大小。我们可以说干预使某事物增加了X%,或使负面事物减少了X%,或者我们相当确定干预没有产生任何差异。

以下是其主要弱点:
- 成本高昂:实施随机对照试验非常昂贵。
- 伦理问题:尤其在公共部门应用时,存在伦理问题。人们不喜欢感觉政府在他们身上做实验,社区也不喜欢被用作对照组,认为其数据被使用却未从中受益。
- 外部效度局限:从随机对照试验的结果进行推广有时很困难。研究环境中的一切都被高度控制,干预实施质量通常很高。如果推广到研究环境之外的真实世界,效果可能不同。因此,在内部效度和外部效度之间存在权衡。



何时应考虑使用随机对照试验
鉴于随机对照试验成本高昂且存在伦理问题,政府应在何时考虑进行随机对照试验呢?

以下是几种适合的情况:
- 需要确定效果方向和大小:当你真的想确定干预效果的方向和幅度时,非常适合考虑使用实验设计(随机对照试验)。
- 干预可能造成伤害:如果担心干预除了达成目标外,还可能以 unintended 的方式对人们造成伤害,或产生潜在的负面副作用,那么进行随机对照试验来非常确定地了解所有干预效果(包括正面和负面)是非常好的做法。
- 试点项目或示范项目:如果有一个包含评估资源的试点项目或示范项目,这是使用尽可能强健的研究设计的好时机。你不希望在一个内部效度不强的试点项目中使用弱的研究设计,从而对干预效果做出错误假设,然后将其推广和扩大,而实际上它并不奏效。
- 学术发表:对于希望将结果发表在学术期刊上的研究者来说,期刊通常要求强健的研究设计。从科学标准来看,使用尽可能强健的设计是好的,而随机对照试验正是那个黄金标准。

无前测的随机对照试验设计
现在,让我们看几种不同的设计,并思考它们的优缺点。再次强调,设计可以有主题和变体。这里有一个不同的设计,它有什么不同?


花点时间看看。这个设计没有前测。它仍然是一个随机对照试验,有两个组,一组接受干预,另一组不接受,但只在干预后进行观测。

我们如何看待这个设计?它实际上是一个强健的设计,但只在特定情况下如此。当你能绝对肯定干预组和对照组在基线观测点的主要结果或因变量上是等效的时,这才是强健的设计。

让我们举几个例子。有一个在公共卫生诊所对吸烟者进行的干预就使用了这种设计。这是一个戒烟干预,在时间点2观测的是戒烟率。只有已经在吸烟的人才会接受这个干预,因此我们知道在基线时我们处理的是吸烟者。然后他们被随机分配接受戒烟干预或不接受。所以我们并不真的需要基线数据,因为要进入研究,他们必须已经是吸烟者。
另一个例子,有许多针对青少年怀孕的干预措施,目标是帮助已生育的青少年实现一些人生目标,包括完成高中学业。在这种情况下,研究设计中的每个人都是孕妇且正在读高中,目标是看干预是否帮助人们完成高中学业。因此,我们并不真的需要前测观测,因为后测观测(完成高中学业)在前测时并不相关。
所以,随机对照试验的设计确实存在多种主题和变体的机会。

总结

本节课中我们一起学习了随机对照试验的实验设计方法论。我们了解到,随机分配是RCT的核心,它通过建立强健的反事实对照组来最大程度地控制内部效度威胁。我们探讨了RCT的多种形式,包括经典的双组前后测设计、包含多次后测以评估长期效果的设计,以及同时测试多种干预的设计。我们也分析了RCT作为研究“黄金标准”的优点(如高内部效度、能确定效果方向和大小)和缺点(如成本高、存在伦理问题、外部效度可能受限)。最后,我们讨论了政府或研究者应考虑使用RCT的几种情况,例如当需要高度确定干预效果、担心干预有潜在危害、或进行资源充足的试点项目时。理解这些设计原则对于在公共部门进行严谨的数据分析和政策评估至关重要。



33:公共项目随机对照试验(RCT)案例 🧪


在本节课中,我们将学习两个由政府实施的著名随机对照试验案例。我们将了解这些试验的设计、实施过程以及主要发现,从而理解RCT在公共项目评估中的实际应用。

概述
随机对照试验是评估公共项目有效性的黄金标准。你可能想知道,政府在评估公共项目时,究竟有多频繁地使用RCT?答案可能比你想象的更频繁。本节将介绍两个广为人知的公共项目RCT案例:墨西哥的“进步计划”和美国的“向机会迁移”干预研究。
墨西哥“进步计划”的RCT评估 🇲🇽
上一节我们介绍了随机对照试验的基本原理,本节中我们来看看它在实际公共项目中的第一个应用案例。
“进步计划”是墨西哥一项大型社会福利项目,其RCT评估非常著名。该干预措施的核心目标是改善墨西哥农村地区家庭、儿童及其父母的健康状况、营养状况和贫困状况。
该干预措施被称为有条件现金转移支付。这意味着向家庭提供现金,但并非无条件给予。现金转移支付的前提是家庭必须满足某些特定行为条件。
- 现金支付给家庭的女性户主。
- 支付金额取决于满足的条件,最高可达其月收入的三分之一。
- 这笔额外的月度现金对家庭生活可能产生重大影响。



以下是“进步计划”干预措施的具体条件:
- 家庭成员必须接受预防性医疗保健,包括对儿童至关重要的免疫接种,以及在当地社区卫生中心进行的健康检查(含牙科检查)。
- 对于有5岁以下儿童和哺乳期母亲的家庭,母亲必须参加营养监测诊所,接受营养教育干预。
- 对于孕妇,条件是其必须前往诊所接受产前护理,获取营养补充剂和额外的孕产妇健康教育。
“进步计划”的评估巧妙地利用了项目本身的特点:该计划于1997年至2000年间,在墨西哥农村地区以随机、交错的方式逐步推广。这种情况在政府项目中很常见,原因可能是资源有限(尤其是在大国),无法同时在所有地区推行新项目,或者没有足够的人手来良好地执行。当项目以交错方式推出时,研究人员可以借此机会,实际上随机地确定推广顺序,这有助于实验的设置。


这正是该研究采用的方法。研究人员利用了这种随机交错的实施方式,比较了先接受干预的地区和尚未接受(但未来将接受)干预的地区。这是一项规模庞大的研究,涵盖了墨西哥506个不同社区中近14,500个家庭的约90,000人。
那么,研究发现了什么?他们发现,接受有条件现金转移支付的家庭,其儿童的健康、营养和人力资本成果在短期和长期内都产生了积极影响。这包括:
- 儿童的教育程度
- 他们的劳动力市场参与度和所获工资
研究人员对这些家庭进行了长期跟踪。此外,研究还发现了对国际移民的影响,移民数量有所增加。这可能是因为干预提高了教育程度,增强了在墨西哥境外寻找工作机会的能力。

因此,“进步计划”被认为是一项有效的社会福利项目。其结论之所以具有说服力,正是基于它是以随机对照试验的方式设计和实施的。
美国的“向机会迁移”干预研究 🏙️
接下来,我们转向另一个不同但同样属于社会福利领域的问题。

许多国家和地区都关注这样一个问题:将儿童从高贫困率的公共住房项目迁移到同一城市内贫困率较低的社区,会对他们产生哪些短期和长期的益处?大量公共住房聚集了高密度的贫困家庭,一个核心问题是:这种居住环境对儿童有何影响?如果儿童迁出这些高贫困率住房,搬到同一城市内贫困水平较低的不同社区,又会怎样?

在美国的城市背景下,这是一个重要问题。为此,一项旨在回答此问题的研究被设计出来,即“向机会迁移”研究。这同样是一个历史案例,但其结果至今仍被广泛引用,并且该研究也被视为政府参与随机对照试验的一个典范。
美国住房与城市发展部在五个城市(巴尔的摩、波士顿、芝加哥、洛杉矶和纽约)招募家庭参与了这项实验研究。参与资格如下:
- 在这五个城市中,家中有18岁以下儿童的家庭。
- 居住在公共住房或政府补贴/援助住房中。
- 根据人口普查数据,所在社区有超过40%的人口生活在贫困线以下。
那么,“向机会迁移”干预的研究设计是怎样的呢?
在这个案例中,实际上设置了两个不同的干预组和一个控制组。
- 干预组1(X1):向家庭提供住房券,且搬迁不受限制。基本思路是:政府提供补贴住房券,家庭可以搬到城市里任何他们想去的地方,目的只是让他们搬离高贫困、高密度的低收入住房区。
- 干预组2(X2):同样提供住房券,但搬迁受到限制,只能迁往贫困率较低的社区。
- 控制组:随机分配,不提供搬迁用的住房券。他们会获得一些资源,用于解决家庭可能面临的一些问题,但不提供任何搬迁援助。

因此,我们共有三组,包含两种不同的干预措施。虽然图中只显示了一个后续观察点,但实际上,这些家庭和儿童被跟踪随访了多年,这些儿童的未来状况也得到了长期追踪。
该研究的主要发现有哪些?“向机会迁移”研究产生了大量学术出版物,其中一些亮点包括:
- 在任一干预组中,均未发现对儿童的学业表现或其与刑事司法系统的关联有显著影响。干预组与对照组在这些方面没有表现出差异。
- 然而,研究观察到参与家庭的父母在身心健康结果上有所改善,并且这些改善持续了相当长的时间。
- 此外,研究确实发现,对于搬迁时年龄较小的儿童(13岁以下),虽然对其学业表现没有影响,但长期跟踪显示,他们在成年后的年收入有所增加。但这仅适用于搬迁时年龄较小的儿童。
其他RCT案例与应用领域
除了上述两个案例,政府还使用了大量其他随机对照试验的例子。以下是一些其他领域的RCT应用:
- 印度的一项大型项目:旨在应对贫血这一重要的公共卫生问题,其研究设计非常出色。
- 大量有条件现金转移支付项目:以及一些无条件现金转移支付项目,形成了非常有趣的研究文献,其中几乎都使用了随机对照试验。如果你对此类干预感兴趣,有很多资料可供查阅。
- 众多教育干预措施:例如学校课程方法,以及在美国比较公立学校、私立学校和特许学校学生教育成果的研究,其中许多都使用了随机对照试验。
由此可见,在公共部门中,随机对照试验的应用案例非常广泛。
总结


本节课中,我们一起学习了两个经典的公共项目随机对照试验案例:墨西哥的“进步计划”和美国的“向机会迁移”研究。通过这两个案例,我们看到了RCT如何被用于评估有条件现金转移支付和住房政策等复杂社会干预的效果。这些研究不仅展示了RCT方法的严谨性,也揭示了其在揭示项目真实影响(无论是积极、消极还是中性)方面的强大能力。它们证明,通过精心设计的随机实验,政府能够更科学、更有效地评估公共项目的价值,从而为政策决策提供坚实证据。
34:华盛顿特区垃圾桶干预案例研究预告


在本节课中,我们将介绍一个由华盛顿特区政府实验室进行的随机对照试验案例。我们将了解该研究的背景、设计思路以及评估方法,为后续的数据分析和代码实践做好准备。
研究背景与机构介绍
上一节我们介绍了评估研究设计的基本语言,本节中我们来看看一个具体的应用案例。
这项研究由华盛顿特区的“实验室”机构进行。这是一个非常酷的倡议,于2020年在市行政长官办公室下成立。该实验室是一个由研究人员和分析师组成的团队,致力于开展那些“对特区居民至关重要”且“跨越政府机构”的项目。



该实验室采用四种关键方法进行政策和项目分析:
- 随机评估
- 预测建模
- 以居民为中心的设计
- 行政数据分析
实验室已经开展了多项不同的项目评估,今天我们只讨论其中一项:一项关于减少垃圾干预措施的效果评估。
问题定义与干预设计
首先,华盛顿特区居民认为需要解决的问题是什么?街道上的垃圾或废弃物是哥伦比亚特区乃至全球许多城市普遍存在的问题。


除了有碍观瞻,清理垃圾需要花费资金。用于垃圾清理的税款就无法用于其他重要事项。垃圾还可能对区域的房产价值产生负面影响。最后,特区的一些垃圾会流入穿城而过的主要河流,加剧水污染问题。
因此,实验室与特区公共工程部合作设计了一项干预措施。这项干预措施非常简单,它使用了我们之前讨论过的“信息”政策杠杆,或者说是一种通过在垃圾桶上使用标识牌对人们进行的简单“助推”。
这些标识牌使用了实验室所称的“非强制性指令”,即告知而非恳求。希望你还记得我们之前讨论过的区别。垃圾桶上的标识还使用了特区的颜色。
这项干预设计基于研究表明,简单的助推有时可以改变行为,特别是当它们同时能引起人们对解决方案(在本例中是垃圾桶)的注意,并且试图激发社区归属感时——后者希望通过在标识中使用特区的颜色和形状来实现。
以下是一张放置在垃圾桶上的标识牌照片:“爱护特区,请勿乱扔垃圾,将垃圾放入桶中。”

研究设计与评估方法
现在,评估研究的设计如下:在特区七个繁忙区域,190个街道区块(街道的北侧或南侧)被随机分配接受其垃圾桶上的标识牌,或不接受(即维持现状)。
在某些街道,一侧被随机分配接受干预,而特区的其他街道则作为反事实或现状对照组。所有垃圾桶上都安装了监测传感器。此外,还培训了志愿者来测量垃圾桶周围的垃圾。
让我们看一下研究设计的图形表示。共有196条街道,其中约一半被随机分配在街道一侧的垃圾桶上放置标识,其余的则保持原状作为对照组。

两周后,对所有垃圾桶进行了测量,包括传感器测量的垃圾桶内新增填充物,以及志愿者观察到的垃圾情况。



总结



本节课中,我们一起学习了华盛顿特区垃圾桶干预案例的背景和研究设计。我们了解到,该研究旨在通过简单的标识牌“助推”来减少乱扔垃圾的行为,并采用了严格的随机对照试验设计进行评估。在接下来的课程中,我们将深入分析这项试验的数据和代码。
35:华盛顿特区垃圾桶干预数据分析 🗑️

在本节课中,我们将学习如何分析一项来自华盛顿特区实验室的行为干预实验数据。该实验旨在探究在公共垃圾桶上张贴积极信息(行为助推)是否能有效减少街道垃圾。我们将使用R语言进行数据导入、清理、转换与分析,并最终评估干预效果。
华盛顿特区实验室是华盛顿特区市行政办公室的一项卓越倡议。兰斯博士已经介绍了该实验室的工作以及我们今天将要探讨的具体案例。这个小组的卓越之处在于,他们不仅像越来越多的政府机构一样公开数据,更进一步公开了他们使用的整个科学过程。这是更高层次的问责制和透明度。这为每个人提供了学习有效和无效方法的机会,并允许任何人以极低的门槛提升技能、质疑假设并做出贡献。我能够利用他们已完成的工作,在本讲座中进行部分复制分析,而无需与实验室的任何人员实际交谈,这既不可思议又十分罕见。
现在,让我们关注他们感兴趣的案例。垃圾会产生异味,市政当局可以尝试采用不同策略来减少市中心等高密度区域的垃圾。公共垃圾桶很常见,这项研究提出的问题是:垃圾桶上以积极信息形式呈现的行为助推,能否减少街道上的垃圾量?如果可以,这将是一种成本极低的干预措施,可以以最小的成本推广到所有公共垃圾桶。为了在2017年测试这一点,该市选择了繁忙区域的若干街道,并随机分配一些垃圾桶张贴标识,另一些则不贴。兰斯博士介绍的随机化方法非常重要,因为我们预期某些垃圾桶的垃圾量可能仅基于城市交通模式就会发生变化。
接下来,我将重点分析收集到的数据。我们感兴趣的结果变量是每个垃圾桶每天最大满溢度的平均值,传感器安装在垃圾桶上以按体积测量这个满溢度。让我们查看数据。
加载与查看数据
首先,我将加载 tidyverse 包,并导入名为 litter_can_fills.csv 的数据文件。
library(tidyverse)
df_fills <- read_csv("litter_can_fills.csv")
glimpse(df_fills)
数据显示了垃圾桶、传感器、满溢度、位置和日期等信息。但是,数据中没有关于垃圾桶被分配到的条件(即是否贴有助推标识)的信息。因此,我们需要在另一个数据文件中查找该信息。
导入实验分配信息
接下来,我将加载包含实验分配信息的文件 litter_cans_randomized.csv。
df_cans <- read_csv("litter_cans_randomized.csv")
glimpse(df_cans)
在第二个数据文件中,我们可以看到垃圾桶级别的信息:地址、街道、街区标识符和街道侧。重要的是,我们看到了条件分配变量 Z,如果垃圾桶没有标识,则 Z 为 0;如果有标识,则 Z 为 1。
这种数据排列方式很常见:一个文件包含所有实验观测值(df_fills),另一个文件包含分配条件详情和样本总体信息(df_cans)。我们需要将这两个数据框合并起来,这意味着我们将进一步学习R的操作。数据集中有一个唯一的垃圾桶标识符 meID,这将是我们成功合并的关键。

数据准备与合并
但在合并之前,需要注意的是,我们获得的基础数据实际上并不包含研究团队感兴趣的结果度量。回顾一下,该度量是每个垃圾桶每天最大满溢度的平均值。让我们回到 df_fills 查看几个变量:recorded_datetime、meID 和 calculated_percent_full。
看起来我们有一个垃圾桶标识符、测量值的时间戳以及满溢百分比。但仔细观察,你会发现满溢度在一天内被测量了多次。因此,让我们对单个垃圾桶进行一些探索性数据分析。
探索性数据分析与指标计算
我将随机选取第一个垃圾桶,筛选出11月27日的数据,并用 ggplot 绘图。
library(lubridate)
# 示例:查看特定垃圾桶某一天的满溢度变化
sample_can <- df_fills %>%
filter(meID == "某个ID", date(recorded_datetime) == ymd("2017-11-27"))

ggplot(sample_can, aes(x = recorded_datetime, y = calculated_percent_full)) +
geom_line() +
labs(title = "单日垃圾桶满溢度变化", x = "时间", y = "满溢度 (%)")
图表显示了该垃圾桶在一天内随时间变化的满溢度水平。我们需要计算的是“每个垃圾桶每天最大满溢度的平均值”。这意味着我们需要找出给定日期下垃圾桶的最大满溢度,然后计算每个垃圾桶在所有天数中该最大值的平均值。

现在是你暂停视频并自己尝试的好时机。对于我的解决方案,我将使用 lubridate 包。我将把 recorded_datetime 转换为实际的日期对象,这将自动去掉时间成分。当然,你也可以用其他方法处理,比如将其视为字符串并提取感兴趣的部分。
# 创建日期变量并计算每日最大满溢度
df_daily_max <- df_fills %>%
mutate(recorded_date = date(recorded_datetime)) %>% # 提取日期
group_by(meID, recorded_date) %>% # 按垃圾桶和日期分组
summarise(max_fill_raw = max(calculated_percent_full, na.rm = TRUE), .groups = 'drop') %>%
mutate(max_fill = max_fill_raw / 100) # 转换为0-1之间的比例
有时你必须查看数据并思考它是否是“垃圾”,这是数据操作和清理过程的重要部分。例如,这里我们有一个大于1的 max_fill 值。这实际上意味着什么?让我们深入调查一下。
数据质量检查与清理
我将用这个新垃圾桶更新折线图,并添加一些分面以便查看。
# 调查异常值
problem_can <- df_daily_max %>% filter(max_fill > 1) %>% slice(1) %>% pull(meID)
df_fills %>%
filter(meID == problem_can) %>%
ggplot(aes(x = recorded_datetime, y = calculated_percent_full)) +
geom_line() +
labs(title = "异常垃圾桶满溢度时间序列", x = "时间", y = "满溢度 (%)")
图表显示,在整个观测期内,该垃圾桶的满溢度确实有时超过了100%,也有几次降到了0。在这种情况下,我们的数据确实超过了100%。这合理吗?正确吗?这需要与实验设计团队沟通,以了解传感器的工作原理。可能有一个100%的最大满溢线,而传感器读取的是堆积在该线以上的数据。或者,这可能是一个数据收集错误,数据需要进一步清理。
无论如何,作为分析师,与更大的团队合作并探索数据以理解它,这一点很重要。在这个具体案例中,DC实验室的团队选择将数值上限设为100%,我们也将这样做。
# 将最大满溢度限制在100%(即比例1.0)
df_daily_max <- df_daily_max %>%
mutate(max_fill_capped = pmin(max_fill, 1.0))

现在,我们已经计算出了每个垃圾桶-日期组合的最大满溢度(并进行了封顶处理)。下一步是计算每个垃圾桶在整个实验期间该最大值的平均值,这将是我们最终的分析指标。

# 计算每个垃圾桶的平均每日最大满溢度
df_can_outcome <- df_daily_max %>%
group_by(meID) %>%
summarise(avg_max_fill = mean(max_fill_capped, na.rm = TRUE), .groups = 'drop')
合并数据与初步分析

现在,我们有了包含结果指标 avg_max_fill 的数据框 df_can_outcome。我们需要将其与包含实验条件 Z 的 df_cans 数据框合并。使用共同的键 meID 进行连接。
# 合并实验条件与结果数据
df_analysis <- df_cans %>%
inner_join(df_can_outcome, by = "meID")
# 查看合并后的数据
glimpse(df_analysis)
现在数据已经准备就绪。我们可以进行初步的组间比较,例如计算有标识组(Z == 1)和无标识组(Z == 0)的平均 avg_max_fill。
# 按实验条件分组汇总
summary_stats <- df_analysis %>%
group_by(Z) %>%
summarise(
mean_avg_max_fill = mean(avg_max_fill, na.rm = TRUE),
sd_avg_max_fill = sd(avg_max_fill, na.rm = TRUE),
n = n(),
.groups = 'drop'
)
print(summary_stats)

为了更直观地比较,我们可以绘制箱线图。

ggplot(df_analysis, aes(x = factor(Z), y = avg_max_fill, fill = factor(Z))) +
geom_boxplot() +
labs(title = "行为助推标识对垃圾桶平均满溢度的影响",
x = "实验条件 (0=无标识, 1=有标识)",
y = "平均每日最大满溢度 (比例)") +
theme_minimal()
总结



本节课中,我们一起学习了如何分析华盛顿特区实验室的一项行为干预实验。我们从导入原始传感器数据和实验设计数据开始,经历了数据探索、关键指标(每日最大满溢度的平均值)的计算、数据质量检查与清理(处理超过100%的数值),以及最终的数据合并。通过初步的描述性统计和可视化,我们可以开始评估在公共垃圾桶上张贴积极标识这一简单干预措施的效果。这为后续可能进行的统计显著性检验(如t检验)奠定了基础。整个过程展示了在公共部门数据分析中,从原始数据到可解释结果的完整工作流程。
36:数据整合 🧩

在本节课中,我们将学习如何将两个数据集合并在一起。数据整合是数据分析中的关键步骤,它允许我们基于某些共享变量,将不同来源的信息关联起来。
数据连接概述
上一节我们介绍了数据清洗,本节中我们来看看如何将两个数据集连接起来。
当我们谈论数据连接时,指的是基于行中的某些值,将两个数据集的行(观测值)进行匹配。虽然 dplyr 包的惯例是将数据集称为 X 和 Y,但更传统的理解方式是将它们视为左侧数据框和右侧数据框。然后,我们根据每个数据框中共享的变量来选择连接策略。
R中的连接功能类似于关系型数据库。如果你熟悉数据库操作,那么这些概念对你来说会很熟悉。连接数据框时的关键考虑是,当连接列中的某些值在一个数据集中不存在或存在多次时,该如何处理。因此,我们实际上有四种不同的连接函数可供使用。
四种连接类型

以下是四种主要的连接类型及其工作原理。
1. 内连接
内连接会保留左侧和右侧数据框中都存在的所有行,并将它们连接在一起。如果数据缺失,则用 NA 值填充。如果一个键在一侧出现两次或更多次,那么它也会被连接相应次数。
让我们通过一个例子来理解。假设我们有两个关于课程团队的数据框。
左侧数据框 (left_df) 包含讲师信息:
left_df <- data.frame(
first_name = c("Chris", "Paula", "Alton"),
last_name = c("Brooks", "Lance", "Worthington"),
school = c("Information", "Public Policy", "Public Policy")
)

右侧数据框 (right_df) 包含核心开发团队信息:
right_df <- data.frame(
first_name = c("Chris", "Paula", "Abby", "Emily", "Matt", "Ahmed", "Daniela"),
last_name = c("Brooks", "Lance", "M.", "S.", "B.", "R.", "G."),
role = c("Instructor", "Instructor", "Media", "Learning", "Coordination", "Media", "Learning")
)
如果我们基于 first_name 和 last_name 进行内连接,只会保留两个数据框中都存在的键(即 Chris Brooks 和 Paula Lance)。

inner_joined <- inner_join(left_df, right_df, by = c("first_name", "last_name"))
结果将是一个包含两行的数据框。如果两个数据框中有同名的列(如 last_name),dplyr 会自动添加后缀(如 .x 和 .y)来区分它们。
2. 左连接
左连接会保留左侧参数中的所有行,并且只保留右侧参数中与之匹配的行。对于仅存在于左侧的值,右侧的列将用 NA 填充。

left_joined <- left_join(left_df, right_df, by = c("first_name", "last_name"))

在这个例子中,结果将包含 Chris、Paula 和 Alton。Alton 的 role 列将是 NA,因为右侧数据框中没有他的信息。
3. 右连接

右连接与左连接相反,它会保留右侧参数中的所有行,并且只保留左侧参数中与之匹配的行。
right_joined <- right_join(left_df, right_df, by = c("first_name", "last_name"))
在这个例子中,Alton 将不会出现在结果中,但右侧数据框的所有人(包括 Abby、Emily 等)都会出现,Chris 和 Paula 的信息也会被保留。在实践中,右连接很少使用,因为通过交换参数顺序使用左连接可以达到同样效果。但在 tidyverse 的管道操作中,右连接有时会更方便。

4. 全连接
全连接会保留左侧和右侧数据框中的所有行,并在适当的位置用 NA 值填充缺失的数据。

full_joined <- full_join(left_df, right_df, by = c("first_name", "last_name"))

这将得到一个包含所有参与者的列表。Alton 的 role 是 NA,而 Emily、Matt 等人的 school 变量是 NA。
总结



本节课中我们一起学习了数据整合的四种基本连接操作:内连接、左连接、右连接和全连接。理解这些连接类型的区别对于合并来自不同来源的数据至关重要。在实际操作中,最常用的是左连接和内连接。选择哪种连接方式取决于你的分析目标:是想保留所有观测(全连接),只想保留匹配的观测(内连接),还是想以一个数据集为基准合并另一个数据集的信息(左/右连接)。掌握这些技能将使你能够更有效地进行复杂的数据分析。
37:华盛顿特区垃圾桶干预总结 🗑️📊


在本节课中,我们将学习如何整合多个数据集,对实验数据进行可视化探索,并运用统计检验(T检验)来评估干预措施(在垃圾桶上贴标签)的效果。我们将使用R语言中的dplyr和ggplot2等工具来完成这些任务。
上一节我们介绍了数据操作的基本工具,本节中我们来看看如何将多个数据集合并,以便进行更全面的分析。
我们已有DF_fills和DF_Maxs数据集,但还需要引入condition参数,即垃圾桶是否贴有标签的信息。我们将基于包含此信息的daily_Max数据集创建一个新的数据框。

具体操作是,将daily_Max数据框与DF_canNs数据框进行左连接。这会排除那些没有日均最大填充值记录的垃圾桶。同时,我们还需要剔除那些没有被分配为实验组或对照组的垃圾桶(即没有处理分配信息的记录)。
以下是合并与清理数据的步骤:
- 使用
left_join合并daily_Max和DF_canNs。 - 使用
filter过滤掉Z列(条件分配)为NA的记录。 - 分组操作后,使用
ungroup移除分组结构,以避免影响后续计算。 - 将
Z列中的数值(0和1)转换为更具可读性的标签“control”和“treatment”。

df_can <- daily_Max %>%
left_join(DF_canNs) %>%
filter(!is.na(Z)) %>%
ungroup() %>%
mutate(Z = ifelse(Z == 0, "control", "treatment"))
完成这些步骤后,我们得到了一个按日期和垃圾桶编号组织的新数据框df_can,其中max_fill是我们的结果变量,Z是我们的条件分配变量。

在开始推断性检验之前,我们应该先尝试将数据可视化,以便直观地检查数据并形成初步假设。

我的兴趣在于做一个合理性检查,并直观感受两组数据(贴标签与未贴标签)是否真的存在差异。如果绘制两组max_fill的平均值随时间变化的曲线,我应该能得到可以直观比较的图形。
由于这是按条件和日期分组的数据,我将按Z(条件)和date_reading(日期)进行分组,然后计算两组的平均值。计算完成后,同样需要取消分组。接着,将数据传递给ggplot,同时绘制每日平均数据点和连线。这里,我将使用linetype美学映射来区分处理组和对照组的线条类型。
df_can %>%
group_by(Z, date_reading) %>%
summarise(avg_fill = mean(max_fill)) %>%
ungroup() %>%
ggplot(aes(x = date_reading, y = avg_fill, linetype = Z)) +
geom_point() +
geom_line() +
labs(x = "Date", y = "Average Max Fill (%)", linetype = "Condition")
那么,你认为这两条曲线是相同的还是不同的?花点时间回顾一下上面的数据表。我们还可以如何可视化这些数据,以更深入地理解其含义?
作为第二个例子,我认为按城市区域来查看数据会很有趣。由于我们只有七个区域,将其放入一张图中是合理的。
我的问题是:对于这个任务,我们应该使用cowplot还是分面(facets)?由于我们希望所有子图都是同一种类型(点线图),并且我们有一个变量(area)来指示不同的兴趣组,因此分面方法正是我们所需要的。
以下是创建分面图的步骤:
- 按
area、Z和date_reading进行分组。 - 计算每个组的平均
max_fill。 - 在
ggplot中添加facet_wrap,按area变量进行分面展示。
df_can %>%
group_by(area, Z, date_reading) %>%
summarise(avg_fill = mean(max_fill)) %>%
ungroup() %>%
ggplot(aes(x = date_reading, y = avg_fill, linetype = Z)) +
geom_point() +
geom_line() +
facet_wrap(vars(area)) +
labs(x = "Date", y = "Average Max Fill (%)", linetype = "Condition")
从视觉上看,这些区域间的趋势看起来非常相似。因此,我认为现在应该基于所有垃圾桶的每日最大填充值进行T检验。

在R中进行T检验相当简单。调用t.test函数并传入两个样本,即对照组和处理组的垃圾桶最大填充值。
那么,应该使用配对T检验还是非配对T检验呢?只有当两个条件下的样本主体(此处指单个垃圾桶)是相同时,才使用配对T检验。这里的情况并非如此,因此我们将使用默认的非配对T检验。
请注意,我们现在暂时离开了tidyverse环境,回到了基础的R语法。
t_test_result <- t.test(
df_can$max_fill[df_can$Z == "control"],
df_can$max_fill[df_can$Z == "treatment"]
)
print(t_test_result)
这个结果告诉我们什么?我们可以看到,对照组的平均最大填充率为61.14%,而处理组的平均值为61.43%,实际上略高一些。然而,P值为0.62,相当高。
P值的范围是0到1,它为我们提供了两组数据是否真正存在差异的信心程度,还是仅仅是偶然发生的结果。数值越接近1,表明这很可能是偶然发生的;数值越接近0,则表明很可能是系统性差异。
通常,会事先设定一个称为α(alpha)的参数,以确定你愿意接受的置信水平。在社会科学中,常将α阈值设为0.05,这意味着接受一个只有5%可能性是随机产生的结果。
但需要注意的是,随着观测数量的增加,P值会缩小。因此,一个有12个垃圾桶、P值为0.05的实验,其信号强度实际上远高于一个有100个垃圾桶、P值为0.005的实验。P值的含义没有改变,但我们如何解释它以及如何处理它却需要深思。
此外,还必须考虑效应大小(如果观察到差异,差异实际有多大)以及作为决策者时某项干预的成本。本次干预成本低廉,可以轻松在华盛顿特区的所有垃圾桶上推广,但我们的效应方向实际上是错误的(处理组填充率更高,与期望减少填充的假设相反)。因此,即使我们确信存在差异,我们也不会想张贴这些标签。


本节课中我们一起学习了如何合并与清理实验数据,使用ggplot2进行多角度的数据可视化以探索模式,并执行了非配对T检验来评估干预效果的统计显著性。我们发现,尽管处理组的平均填充率略高,但较高的P值(0.62)表明这种差异很可能是偶然产生的,不具有统计显著性。结合效应方向错误(期望降低但实际略增)的考量,可以得出结论:张贴标签的干预措施在减少垃圾桶填充率方面可能没有显著效果。这展示了数据分析在公共政策评估中的实际应用:即使结果不显著或与预期相反,严谨的分析也能为决策提供关键依据,避免无效或反效果的资源投入。
38:随机分配与随机抽样的区别 🎲


在本节课中,我们将要学习随机分配与随机抽样这两个核心概念的区别。这两个术语都包含“随机”一词,在研究设计中都非常重要,但理解它们之间的差异至关重要。
随机抽样 📊
上一节我们介绍了这两个概念的基本定义,本节中我们来看看随机抽样。
随机抽样,也称为概率抽样或随机选择,是一种从总体中选择成员参与研究的方法。这种方法常用于调查、焦点小组或用户体验反馈等研究。
以下是随机抽样的关键点:
- 它是一种选择研究参与者的方法。
- 其目标是确保样本能够代表总体。
- 常用于基于人群的调查等各类研究。
随机分配 🧪
了解了如何选择参与者后,我们来看看如何将他们分组进行研究。
随机分配是一种将样本参与者(通常是人员,但也可能是学校、社区或社区健康中心等其他研究单位)分入对照组和实验组的方法。在研究设计中,参与者被随机分配以决定是否接受某种干预。我们在讨论随机对照试验时一直在谈论这个概念。
以下是随机分配的关键点:
- 它是一种将已选定的参与者分入不同组别的方法。
- 其目标是创建在干预前完全相同的组别。
- 仅用于评估某种干预或处理效果的研究中。
随机分配的实施方法 ⚙️
那么,随机分配是如何进行的呢?研究人员有多种方法来随机决定参与者或单位属于处理组还是对照组。
以下是常见的随机分配方法:
- 使用简单的随机方法,例如掷骰子或抛硬币。
- 更常见的是使用随机数生成器。
真正的随机分配只有在每个个体或单位进入干预组或对照组的机会完全相同时才有效。在随机决定研究组分配的方法中不能存在任何偏见或缺陷。这正是随机对照试验有效的原因。通过这种方式,我们可以构建反事实:对照组与处理组完全相同,唯一的区别在于是否接受了干预。
总结 📝


本节课中我们一起学习了随机分配与随机抽样的核心区别。随机抽样关乎如何从总体中选择研究参与者,而随机分配关乎如何将已选定的参与者分配到不同的研究组别(如处理组和对照组)。理解这一区别对于设计和解读公共政策评估及其他领域的研究至关重要。
39:准实验设计方法 🧪



在本节课中,我们将要学习准实验设计方法。这是一种在无法进行随机分组时,用于评估项目或政策效果的重要研究设计。我们将回顾随机对照试验的优缺点,并介绍两种在公共部门评估中常用的准实验设计。

上一节我们介绍了随机对照试验作为评估的“黄金标准”。本节中我们来看看当随机分配不可行时,我们可以采用哪些替代方案。
随机对照试验回顾 📊
随机对照试验是项目和政策评估的黄金标准,有时也应用于公共部门项目的评估。然而,它存在许多缺点。
随机对照试验的优点在于其出色的内部效度。它确实是建立项目、政策、服务等干预措施与我们希望影响的结果之间因果关系的黄金标准。
然而,其缺点也很明显。随机对照试验实施起来成本高昂、复杂且耗时。在数据收集方面存在严峻挑战,需要为处理组和对照组收集完全相同的数据。此外,还存在一些伦理问题,我们将在后续课程中讨论。

什么是准实验设计? 🤔
准实验设计是一大类研究设计的统称。这些设计试图通过构建良好的反事实组来控制所有对内部效度的威胁,但它们实际上没有对干预暴露进行随机分配。

以下是两种在公共部门项目与政策评估研究中经常使用的准实验设计。
非等效对照组设计
第一种设计称为非等效对照组设计。从幻灯片上可以看到,它看起来像随机对照试验,但关键区别在于两组参与者并非通过随机方式决定谁接受干预。没有对处理组进行随机分配。


我曾在一项社区研究中实际应用过这种设计。我们让四个县接受了一项针对女性癌症筛查(乳腺X光检查和巴氏涂片检查)的大众媒体干预。在该州另一片区域,我们选取了四个县作为对照组。我们通过调查获得了关于知识、态度、认知和癌症筛查行为的基线信息。
然后,干预组的四个县接受了干预。12个月后,我们进行了第二次调查,以观察干预县在知识、态度和行为方面的改善是否比对照组更显著。结果发现确实如此。再次强调,这里没有随机分配,在进行基于地理区域的干预时,随机分配确实很难实现。但这种研究设计在公共部门评估中应用广泛,且效果良好。
这种设计也被称为双重差分设计。如果你听到这个术语,要知道它指的就是这种非等效对照组设计。

时间序列设计

另一种在公共部门政策研究中常用的设计是时间序列设计。在这种设计中,你在一段时间内进行多次观测(可以是年、季度等)。图中的“O”代表最合适的时间单位。你先建立一条趋势线,然后在某个政策、变革或干预实施后,观察趋势线之后的变化。这是一种非常适合政策评估工作的优秀设计。
敬请期待,因为我们接下来将更深入地探讨时间序列设计。

总结 📝


本节课中我们一起学习了准实验设计方法。我们回顾了随机对照试验作为“黄金标准”的优缺点,并介绍了两种重要的准实验设计:非等效对照组设计(或称双重差分设计)和时间序列设计。这些方法在无法进行随机分配时,为评估公共部门项目和政策的因果效应提供了可行的替代方案。
40:时间序列设计基础原理 📈



在本节课中,我们将要学习时间序列设计的基础原理。这是一种通过分析数据在时间上的趋势变化,来评估政策或项目干预效果的研究方法。
概述

时间序列设计,也被称为自然实验、中断时间序列或趋势分析。这种研究设计的核心是,寻找在某个项目或政策变化发生的同时,趋势线中出现的“中断”或变化。
趋势与噪声
上一节我们介绍了时间序列设计的基本概念。本节中我们来看看趋势线的特点。


事物随时间变化,并且经常上下波动。我们有时称这种波动为趋势线中的“噪声”。没有一条趋势线是绝对平坦或完全呈直线上升/下降的。但我们可以在趋势线中识别出模式。
回想高中几何,我们处理线条时喜欢计算其斜率。斜率告诉我们这条线是上升、下降还是保持平坦。同时,我们也关注这条线的截距。时间序列分析正是利用了我们确定趋势线斜率和截距的能力,来观察它们是否在项目、政策变化或新干预措施实施时发生了改变。
与前后测设计的对比
现在,回想一下我们的前后测设计。如果只观察干预前的一个时间点和干预后的一个时间点,我们并不真正理解干预前的趋势,甚至干预后的趋势。我们可能会误解数据,误以为变化是由干预引起的,但实际上可能只是捕捉到了趋势线波动(噪声)的一部分。
因此,在政策、项目或干预实施前追溯更长时间的数据,能为我们提供更多信息。实际上,拥有的时间点越多,我们就越能准确地确定政策变化前那条线的斜率和截距,然后与之后的情况进行比较。
时间序列分析原理
这里涉及很多内容。但再次观察那条笔直的黑线。那是一条通过政策变化标记“X”之前的数据点拟合出来的线,并延伸至未来。我们在这里的意思是,存在一条具有特定斜率和截距的趋势线。如果一切保持不变,我们可以预测这条趋势线将以相同的斜率持续到未来。
然而,那条波动的黄线代表了现实世界的情况。从“X”点开始,我们拟合出了一条新的趋势线。我们看到这条线平坦得多。
在趋势分析中,我们做的事情非常简单:将干预后观察到的实际趋势线,与假设干预后无变化时我们预测会发生的趋势线进行比较。在这个案例中,我们看到某个原本上升的趋势在干预实施后停止了增长。
内部效度
那么,时间序列分析是否具有良好的内部效度?实际上,是的。
我们的反事实在这里是:假设没有干预,趋势线在干预后的延续情况。我们可以相当确定,那就是没有干预时世界可能的样子。这即是我们的反事实。
但我们也需要关注一些对内部效度的威胁,稍后会再讨论。
总结



本节课中我们一起学习了时间序列设计的基础原理。我们了解到,这种方法通过比较干预前后数据趋势线的斜率和截距变化,来评估干预效果。它利用更长时间跨度的数据来构建反事实,相比简单的前后测设计,能更有效地控制历史等因素的影响,从而提供更强的因果推断证据。
41:时间序列设计应用实例 🕰️


在本节课中,我们将学习时间序列设计在公共政策评估中的一个具体应用实例。我们将通过分析美国康涅狄格州一项关于未成年人HIV检测法律变更的影响,来理解时间序列设计如何用于评估干预措施的效果。

案例背景与设计
上一节我们介绍了时间序列设计的基本概念,本节中我们来看看一个具体的应用实例。
1992年10月,美国康涅狄格州实施了一项法律变更。在此之前,未成年人进行HIV检测必须获得父母同意。在此之后,18岁以下的未成年人无需父母同意即可进行HIV检测。
研究者希望评估这项法律变更是否对州内青少年的HIV检测率产生了影响。他们期望这项变更能减少障碍,让更多担心暴露于HIV风险的青少年愿意接受检测。
评估采用的时间序列设计如下:
- 观测期:法律变更前后各12个月。
- 观测对象:在政府资助的诊所发生的就诊次数和HIV检测次数。
- 设计表示:使用
O代表每月在诊所的观测值(就诊和检测次数)。设计可表示为:O1 O2 ... O12 X O13 O14 ... O24,其中X代表1992年10月的法律变更点。
研究结果与数据可视化
以下是研究者发现的结果可视化呈现。
图表显示,代表每月接受检测的未成年人数量(红线)在法律生效后显著上升。代表每月就诊但未接受检测的未成年人数量(蓝线)则相应下降。数据表明,检测数量在法律变更的时点(1992年10月)立即出现了显著增加。
以下是具体的统计结果:
- 政策实施前后的诊所访问量增加了44%,该差异具有统计学显著性。
- 未成年人中进行的HIV检测数量翻了一倍。
- 被认定为高风险(涉及吸毒或高风险性行为)的未成年人的就诊和检测数量增长了两倍,而这正是法律希望重点覆盖的群体。
研究的效度评估

现在,我们需要评估这项研究结果的可信度,这涉及到研究的内部效度和外部效度。


内部效度
内部效度关注研究设计本身能否证明是法律变更导致了观测到的变化。对于任何时间序列分析,有两个主要的内部效度威胁。
首先是测量工具效应。这意味着我们追踪测量事物的方法可能随时间发生了变化,并且这种变化恰好发生在政策变更时点。在本案例中,诊所前后收集数据的方式没有改变,因此测量工具效应不太可能解释观测到的变化。

其次是历史效应。我们需要考虑是否在干预实施的同一时间发生了其他事件,导致趋势线发生变化,而非干预本身。对于康涅狄格州的HIV法律变更,没有发现明显的竞争性假设,如没有名人被诊断出HIV,没有其他政策变更或大规模媒体宣传活动。变化在法律生效时点非常突兀,因此历史效应在这里不构成主要威胁。
然而,我们必须始终牢记相关性不等于因果性。在审视时间序列分析结果时,必须仔细考虑这些内部效度威胁。

为了同时控制这两种内部效度威胁,可以采用多重时间序列设计。这种设计在政策和项目评估中应用广泛。
多重时间序列设计

以康涅狄格州的案例为例,我们可以引入一个或多个未实施该法律变更的州作为对照组,比较康涅狄格州与这些州随时间变化的趋势。这种设计有时也用于跨国比较。

多重时间序列设计能更有力地排除竞争性假设(尤其是历史效应),因此从内部效度角度看,这是一种非常强大的设计。研究者常利用不同州或地区在不同时间点实施(或取消)政策的特点,来精确推断干预X是否是导致趋势线变化的真正原因。
外部效度
外部效度关注研究结果能否推广到其他情境。假设我们相信康涅狄格州的研究结果,那么这些发现能否推广到其他州、其他国家,或其他类型的诊所?这是项目评估中始终需要思考的重要问题。
总结



本节课中,我们一起学习了时间序列设计在公共政策评估中的实际应用。我们通过康涅狄格州未成年人HIV检测法律变更的案例,了解了如何设计时间序列研究、解读可视化结果,并评估研究的内部效度(如测量工具效应和历史效应)与外部效度。我们还介绍了更严谨的多重时间序列设计,它通过引入对照组能更有效地确立因果关系。这个案例展示了如何利用观测数据来评估政策干预的实际效果。
42:西西里岛禁烟令案例研究背景与设计 🚬


在本节课中,我们将学习一个真实政策评估案例的背景与研究设计。我们将以意大利西西里岛的禁烟令为例,探讨如何使用中断时间序列设计来评估一项公共卫生政策的效果。
案例背景
上一节我们介绍了政策评估的基本概念,本节中我们来看看一个具体的应用案例。西西里岛是意大利的20个大区之一,也是该国最大的岛屿。我本人虽未到访过,但听闻其风景秀丽。
2005年1月1日,西西里地方政府实施了一项新的烟草控制政策,禁止在公共建筑和场所吸烟。此类禁烟令已在许多司法管辖区推行,多项评估表明,其对心脏病发作和其他类型的急性冠状动脉事件(ACE)几乎能产生立竿见影的效果。



这里实际上存在一个生物学机制:暴露于二手烟可能引发患有严重心脏病的人的急性冠状动脉事件。因此,西西里希望以多种方式评估其新禁烟令,同时也想观察政策变更后,岛上是否出现了此类即时健康结果。
研究设计
为了进行评估,研究采用了中断时间序列评估设计。研究人员分析了从2002年1月到2006年11月期间,西西里所有医院的月度ACE数据。
需要记住的是,当一个干预措施实施前后都有多次观测时,研究设计才被称为时间序列。这样我们才能观察在干预引入的同时,趋势线的截距或斜率是否发生了变化。


研究人员利用了59个月的数据。我不确定他们为何没有使用2006年12月的数据来凑足60个月或整整五年的数据,但我们手头有59个月的数据。数据的分析单位是月份,而非整年甚至季度。他们使用月份作为时间序列的时间单位,这一点很重要。
因为吸烟与几乎所有其他人类行为一样,具有季节性。事实上,人们在夏季或较热的月份往往比寒冷时吸烟更少。因此,使用月度数据能提供更多观测点,也有助于控制因季节变化引起的波动。
反事实与比较
在此研究设计中,反事实是2005年新政策引入后的预期趋势线。利用2002年至2005年政策变更前的数据,可以预测出一条未来的预期趋势线。


然后,将2005年和2006年实际数据得出的实际或观测到的趋势线,与预期或预测的趋势线进行比较。在这类研究中,我们通常比较的是:如果趋势线在没有干预的情况下继续发展,我们可能会预期什么;与干预或政策变更后实际观测到的情况。

正是这种预期(或反事实) 与实际观测结果的比较,使我们能够衡量吸烟政策变更的影响。
研究设计的示意图大致如下所示。我没有写出全部59个观测点,因为那对于一张幻灯片或任何人来说都太多,难以阅读和消化。但我希望你能看到,在这个研究设计中,在政策变更(用X表示)之前,有三年(36个月)的月度观测数据;之后,还有23个月(近两年)的月度观测数据。
在此设计中,O(即月度观测值)代表西西里岛因急性冠状动脉事件导致的住院率。以上就是本次案例研究的设计框架。
总结




本节课中,我们一起学习了西西里岛禁烟令案例研究的背景与评估设计。我们了解到,该研究采用了中断时间序列设计,通过比较政策实施前后的月度急性冠状动脉事件住院率数据,并构建反事实的预期趋势线,来评估禁烟政策的实际效果。理解这个设计框架是后续进行数据分析和解读结果的基础。
43:西西里岛禁烟令:流行病学实证研究 🚬📊


在本节课中,我们将学习如何运用中断时间序列分析来评估一项公共卫生干预措施的效果。我们将以意大利西西里岛禁烟令对急性冠状动脉事件发生率的影响为例,重现伦敦卫生与热带医学院教程中的分析结果。课程将涵盖典型的数据分析流程,并探讨政策分析师在其中的切入点。
数据准备与探索性分析
上一节我们介绍了课程目标,本节中我们来看看如何准备数据并进行初步探索。
首先,我们需要加载必要的R包并导入数据集。数据集包含了西西里岛在实施人群层面健康干预措施前后,每月急性冠状动脉事件的数量。
# 使用pacman包便捷地加载所需包
if (!require("pacman")) install.packages("pacman")
pacman::p_load(tidyverse, gt, gtsummary)

# 读取CSV格式的数据集
data <- read.csv("your_data_file.csv")
加载数据后,我们可以通过点击RStudio环境面板中的数据对象来查看其结构。该数据集包含59个观测值和7个变量,关键变量包括:
year_month: 年月aces: 急性冠状动脉事件数量time: 时间序列变量(1到59)smoke_ban: 干预变量(干预前为0,干预后为1)population: 人口数std_population: 标准化人口
为了评估干预效果,我们首先需要创建一个标准化发病率变量。

# 创建标准化发病率变量(每10万人)
data <- data %>%
mutate(std_rate = (aces / std_population) * 100000)

数据可视化
在进行了基本的数据准备后,接下来我们通过可视化来直观地观察干预前后的趋势变化。


由于我们拥有随时间推移的多次观测数据,可以创建一个标准化发病率随时间变化的散点图,以视觉评估干预前后趋势是否存在差异。

以下是创建该图的步骤代码:
# 创建散点图与趋势线
plot_basic <- data %>%
ggplot(aes(x = time, y = std_rate)) +
geom_point() + # 添加数据点
geom_smooth(method = "lm", se = FALSE, color = "blue") + # 添加未调整的线性趋势线
geom_rect(aes(xmin = intervention_time, xmax = max(time),
ymin = -Inf, ymax = Inf),
fill = "gray", alpha = 0.01) + # 用灰色矩形标出干预后时期
theme_bw() + # 使用黑白主题
labs(title = "急性冠状动脉事件标准化发病率随时间变化",
x = "时间序列",
y = "标准化发病率(每10万人)") +
theme(plot.title = element_text(hjust = 0.5)) # 标题居中
print(plot_basic)

在这张图中,蓝线代表了基于未调整线性回归模型的预测趋势。白色背景代表干预前时期,灰色背景代表干预后时期。图中显示,干预后时期的大部分数据点都位于趋势线下方,而非随机分布在趋势线两侧,这暗示了干预后急性冠状动脉事件可能有所减少。
描述性统计与初步检验
通过可视化我们看到了可能的趋势,本节我们将使用统计量进行初步的组间比较。
在进行适用于中断时间序列设计的统计建模之前,我们先检验干预前后急性冠状动脉事件的平均值是否存在显著差异。我们将使用gtsummary包来创建一个描述性统计汇总表。
以下是生成汇总表的代码:

# 创建描述性统计表,按干预状态分组
summary_table <- data %>%
select(aces, std_rate, smoke_ban) %>%
tbl_summary(by = smoke_ban, # 按干预变量分组
statistic = list(all_continuous() ~ "{mean} ({sd})"),
digits = all_continuous() ~ 2) %>%
add_p() # 添加组间比较的p值
summary_table
该表格类似于学术论文中的表1,它展示了每个变量的总体均值(标准差),以及干预前和干预后分组的均值(标准差),最后提供了组间比较的p值。初步分析可能显示,在5%的显著性水平下,急性冠状动脉事件的原始数量在干预前后有显著差异,但经人口标准化后的发病率可能未见统计显著差异。
中断时间序列模型分析

上一节我们进行了初步比较,但中断时间序列分析能更准确地评估干预的即时效应和趋势变化。
鉴于该干预有明确的起始时间点,且结局是短期效应,我们将采用泊松回归进行中断时间序列分析。模型结构如下:
模型公式:
glm(aces ~ time + smoke_ban, data = data, family = poisson(link = "log"))
其中:
aces是每个时间点的结局事件数。time是研究开始以来的时间。smoke_ban是指示干预前(0)与干预后(1)的变量。
以下是运行模型并解读结果的代码:
# 拟合中断时间序列泊松回归模型
its_model <- glm(aces ~ time + smoke_ban,
data = data,
family = poisson(link = "log"))
# 查看模型摘要
summary(its_model)


查看控制台输出的模型摘要。对于smoke_ban(干预)变量,我们关注其估计值和p值。如果p值小于0.05,则表明该变量显著。一个负的估计值意味着在干预后时期,事件数量有所下降。例如,结果可能显示在禁烟令实施后,急性冠状动脉事件数量平均显著下降了约11%。
模型预测与结果可视化
最后,我们将模型的预测结果可视化,以更直观地展示分析结论。

我们将保存模型的预测值,并绘制一个新的图形,用模型预测的趋势线替代之前的简单线性趋势线。

以下是使用模型预测值进行可视化的代码:
# 将模型预测值添加到数据集
data$predicted <- predict(its_model, type = "response")
# 绘制包含观测值与模型预测值的图形
plot_final <- data %>%
ggplot() +
geom_point(aes(x = time, y = std_rate), alpha = 0.6) + # 观测值
geom_line(aes(x = time, y = (predicted / std_population) * 100000),
color = "red", size = 1) + # 模型预测趋势线
geom_vline(xintercept = intervention_time, linetype = "dashed") + # 干预时间线
theme_bw() +
labs(title = "中断时间序列分析:模型预测趋势",
x = "时间序列",
y = "标准化发病率(每10万人)") +
theme(plot.title = element_text(hjust = 0.5))
print(plot_final)

在这张最终的图中,红色线条代表了中断时间序列模型的预测趋势。可以清晰地观察到,在干预时间点(虚线标示)之后,预测的发病率水平出现了一个向下的“中断”或偏移,这量化地支持了干预措施有效的结论。
总结


本节课中,我们一起学习了如何评估一项人群层面干预措施的有效性。我们以西西里岛禁烟令为例,完整演练了从数据加载、探索性可视化、描述性统计,到构建中断时间序列泊松回归模型并解读结果的全过程。我们使用了令人信服的可视化图表来呈现现象,并运用统计模型量化了干预效果(例如,观察到约11%的下降)。虽然这些模型有时理解起来颇具挑战,但这正是跨学科团队合作的魅力所在。作为政策分析师,与统计学家及其他背景的专家互动协作,将是你们工作中至关重要的一部分。
44:课程总结与展望

在本节中,我们将对已完成的课程内容进行总结,并简要介绍后续课程的核心方向。
恭喜你完成了本系列课程的第三部分。这部分内容涵盖了如何运用不同类型的政策与数据分析来辅助决策者的大量知识。
我们学习了政策选项分析、政策微观模拟建模以及项目评估研究,其中包括随机对照试验和时间序列分析。
你学会了如何运用R语言进行基础的统计分析,特别是那些对公共政策至关重要的分析类型。同时,你也了解到,越来越多的公共政策研究者与分析人员正在线上分享他们的工作成果,包括代码。这一趋势与开放科学和开源软件开发运动相呼应,意味着你有大量机会去更深入地钻研公共政策分析实践中所使用的方法与技术。
因此,我们确信,通过本系列课程的学习至此,你已经掌握了一套出色的技能和必要的知识内容,能够成为公共部门数据分析项目团队中有价值的一员。这正是我们系列课程的两大主题之一。
数据分析师在团队中工作,协助公共管理者、立法者及其他公共部门的领导者做出决策。这些决策可能影响大量人群,有时甚至关乎一个社区或全体人口中的每一个人。因此,理解这些数据驱动决策的背景与目的,对团队中的每一位成员都至关重要。
本系列课程的另一个主题是,虽然高质量且客观的数据分析对公共部门的决策者极为重要,但数据本身并不会直接产生决策。公共政策总是涉及相互竞争的价值观,并且必须考虑资源的稀缺性。因此,决策者需要理解数据,但仅此还不够。
我们的学习旅程尚未完全结束。虽然你已完成本专项课程80%的内容,但仍有一些领域需要探索。在接下来的第四部分课程中,我们将聚焦于数据的力量与政治,包括数据系统设计的一些关键伦理原则。
我们还将讨论数据分析师和政策分析师在工作中有时会遇到的伦理困境,并为你提供一些应对和解决此类情况的方法选项。你很可能在未来遇到这些情况。
接下来的这门课程是我个人非常喜爱的一部分。你将有机会了解我和我的博士生们所进行的一些研究类型,同时思考一些与你自身相关的伦理问题。这部分内容将我们已学过的许多知识紧密联系起来,并在我们结束整个专项课程之际,帮助你进一步深化理解。
本节课总结
本节课中,我们一起回顾了第三部分课程的核心内容:政策选项分析、微观模拟建模及项目评估研究。我们明确了数据分析师在公共决策团队中的角色,并认识到数据需与价值观、资源考量相结合才能有效支持决策。最后,我们展望了下一部分课程,即将深入探讨数据伦理、政治力量以及分析师可能面临的现实困境。
0:公共部门数据政治学 🏛️📊

在本课程中,我们将探讨数据在公共部门中的力量,以及权力、政治和伦理如何相互交织。我们将重点关注两个方面的伦理考量:一是数据系统设计及数据使用本身的伦理,二是数据分析师与政策分析师可能面临的职业伦理困境及其应对策略。
课程概述
欢迎来到我们“使用R进行公共部门数据分析”专项课程的第四门,也是最后一门课程。
这门系列最终课程聚焦于数据在公共部门中的力量,以及权力、政治和伦理如何密不可分。
课程核心内容
我们将通过两种方式聚焦于一些重要的伦理考量。
首先是数据系统如何设计以及数据如何使用的伦理。
其次是职业伦理,聚焦于数据分析师和政策分析师有时会面临的伦理困境,以及一些应对策略。
在本课程中,您将听到我和Paula的讲解,以及一些特邀专家的分享,包括两位与我密切合作的博士生。
我们将探讨当今社会面临的一些非常及时且重要的问题。
重点议题:偏见与算法
我们将审视人群和算法中的偏见。这是一个日益受到关注的领域。
我们将从政策层面和技术层面来讨论这些问题。
您将通过一个应用性的顶点项目来完成本课程,该项目旨在让您在一个真实世界的案例研究中,全面整合您的数据分析和公共政策知识。
顶点项目实践
在最终的顶点作业中,您将协助完成一项政策选项分析。这项分析实际上由墨西哥政府执行,并构成了一个针对农村贫困、规模庞大且持续进行的社会福利项目的基础。
我保证这会很有趣,它不仅能让您展示数据可视化技能,还能让您有机会权衡三种不同政策选项的利弊,其中一些选项涉及伦理影响。
随后,您将运用自己的数据可视化成果,向墨西哥总统和国会提出建议。
课程总结与展望
我期待这门课程。在课程结束时,您将获得证书,并且我希望您对自己的知识和新掌握的数据分析技能充满信心。
1:政治与伦理回顾 🧭


在本节课中,我们将回顾本系列课程中已讨论过的政治与伦理核心概念,并概述第四门课程的新学习内容。我们将重点理解数据、价值观、政治和伦理在公共部门决策中的相互作用。
课程回顾
上一节我们介绍了公共部门数据分析的整体框架。本节中,我们来回顾一下贯穿整个系列课程的政治与伦理主题。
我们一直强调数据分析与数据可视化在公共行政所有核心职能以及各类政策分析(包括前瞻性政策分析和回顾性分析或政策评估)中的重要作用。
然而,布鲁克斯教授和我始终强调,仅凭数据不足以做出基于证据的明智行政和政策决策。公共部门的决策和资源分配从来不是仅基于数据分析,因为价值观和政治总是参与其中。



公共部门的四大支柱

以下是我们在所有课程中讨论的、基于价值观的四大支柱,这些价值观有时会相互竞争:
- 经济性:涉及公共部门应向市场提供哪些商品和服务、向公众提供哪些服务的决策。
- 效率:指公共部门资源应以最优化的方式使用,使投资获得最大回报。
- 有效性:指公共部门的工作应产生改变和积极影响,应实现特定的目标和目的。
- 公平性:涉及理解所有公共政策都伴随着负担和收益,而这些负担和收益的分配需要公平,这是一种价值观。
此外,公平性还包含一种视角,即所有人和社区都应获得(在许多情况下有权获得)实现平等结果所需的机遇和资源。
政治与伦理的挑战
公共部门对社会经济、政治机遇、资源以及人们的生活方式拥有巨大权力。伴随这种广泛决策权而来的是政治。政治包括利用和误用数据与信息来定义问题、分析潜在解决方案以及评估政策、项目和其他类型干预措施的压力。

正因如此,各种伦理挑战随之出现,因为政治和相互竞争的价值观在很大程度上驱动着公共部门的工作。
本节新内容概述
基于我们已经讨论过的内容,我们将在本系列第四门课程的第一周涵盖以下新内容:
首先,我们将更深入地探讨一些术语,包括政治、价值观和伦理。
其次,我的同事、密歇根大学福特公共政策学院的乔·罗迪教授将加入课程,为大家概述数据系统和数据分析中作为基本组成部分的伦理问题。罗迪教授是一位历史学家,在科学技术史以及价值观和伦理在公共政策工作中的角色方面拥有深厚的专业知识。
第三,我将回来与大家讨论一个由美国近期制定和实施的数据伦理框架。


第四,我还将向大家介绍开放政府数据的概念。

让我们开始吧。

总结



本节课中我们一起回顾了政治与伦理在公共部门数据分析中的基础性作用,明确了数据决策必然受到价值观和政治因素的影响,并预览了本课程即将深入探讨的新主题,包括核心术语、数据伦理框架以及开放政府数据。
2:核心术语:政治、价值观与伦理 🎯


在本节课中,我们将深入探讨公共部门数据分析工作中至关重要的三个核心概念:政治、价值观与伦理。理解这些术语是理解公共决策背景和数据分析在其中所扮演角色的基础。
政治与权力

上一节我们介绍了数据分析的宏观背景,本节中我们来看看“政治”在公共部门语境下的具体含义。
在最简单的定义中,政治指的是一群人(通常持有不同观点、价值观,并拥有不同程度的权力和影响力)试图做出决策的过程。这个词通常与公民政府内的行为相关联,并且常常带有负面含义。人们认为政治涉及残酷的策略、权力运用、博弈、谎言等。
然而,政治实际上存在于所有人类群体互动中,包括企业环境、学术界、宗教组织和家庭。任何需要群体做出决策的地方都存在政治。由于群体动态和涉及权威与权力的社会关系,政治指的是用于影响、制定和执行群体内决策的策略、方法与手段。



接下来,让我们更具体地谈谈权力。政治学家确定了四种主要的权力类型。


以下是四种主要的权力类型:
- 合法权力:这是正式的或成文的权力,来源于拥有权威职位,如市长、州长、法官、总理、总统、政府机构部长、项目主任等。某人因其角色而拥有权力。
- 奖赏权力:指有能力奖励那些遵守规则或尊重他人偏好的人。例如,美国的游说者可以通过提供竞选捐款来奖励投票符合其偏好的国会议员。另一个例子是监管机构,他们有权通过不处以罚款或刑事指控来奖励遵守规则的企业。奖赏权力容易以贿赂、贪污或不正当影响的形式被滥用。一个重要的例子是政府合同:当政府通过合同购买商品和服务时,有权授予这些合同的人拥有巨大的奖赏权力,因此可能容易滥用这种权力。
- 专家权力:这种权力来自于拥有与行政和政策决策相关的特定专业知识。例如,科学或法律专业知识可以带来影响决策结果的能力。数据科学和数据分析是专家权力的另一个重要例子。将数据带入决策过程应该并且经常会对结果产生影响。
- 参照权力:这种权力源于他人希望效仿或忠于某个个人、团体或事业。人们通常可以因为具有魅力或其他特质而拥有影响他人及决策过程及其结果的权力。世界领导人通常拥有这种权力,当然也拥有合法权力和奖赏权力。一个人可以拥有多种类型的权力。


价值观
理解了权力如何运作后,我们转向驱动决策的另一个核心要素:价值观。
价值观简单来说,是关于什么是好的、什么应该被促进和实现的广泛信念。我们可以长时间讨论价值观,但在公共部门工作中,我们需要考虑两种主要类型。



以下是两种主要的价值观类型:
- 工具性价值观:指关于实现期望目标的手段或过程的偏好。
- 终极性价值观:指关于期望的最终状态或结果的偏好。

公共行政和公共政策都涉及这两大类价值观。例如,一个终极性价值观可能是每个人都能够长寿健康地生活,而实现这一目标的一些工具性价值观则包括获得营养食品、清洁环境、高质量医疗保健的价值观。再举一个例子,一个终极性价值观是法官需要在裁决中公平公正,而实现这一终极目标价值观的一些工具性价值观包括职业伦理行为准则。
许多不同的价值观影响着公共部门的工作。当然,你已经知道经济、效率、效能和公平这四大核心支柱价值观。其他通常与公共部门相关的价值观包括客观性、问责制、透明度、开放性、信任、尊重、社区参与、平等代表权、可持续性等等。还有一些价值观通常与公务员(即在公共部门工作的人员)的工作和行为相关,包括专业性、响应性、专业知识、正直、公正、问责制、领导力等许多其他价值观。
伦理

最后,让我们转向伦理。首先需要理解的是,伦理是由价值观驱动的。
伦理是关于行为、举止和行动的一套道德或价值观驱动的标准,用以区分什么是好的或对的,与什么是坏的或错的。显然,什么是好的、对的、坏的、错的,是一套价值观。伦理行为是指在总体或主导的道德规范背景下被认为是好的或对的行为。
这里再介绍一个术语:道德推理。这是道德规范的应用,是运用逻辑和决策规则进行批判性分析,以确定在特定情况下什么是对、什么是错,以及应该做什么或不应该做什么。道德推理体系的例子包括功利主义、义务论、美德伦理学等。请放心,我们现在不会深入哲学课程。



然而,让我们再花一分钟思考一下政府背景下的伦理,以及政府本身如何反映不同文化和历史背景(包括宗教背景)。当我们谈论伦理和道德推理时,我们能否将其视为某种普世的东西,超越国家和不同政府形式?关于这个深刻问题的一个观点被称为伦理普遍主义,它声称对与错的标准确实是普世的,因此超越或高于文化、社会、宗教和时代(或当前历史背景)。这就是伦理普遍主义。
有一个与之竞争的思想流派叫做伦理相对主义。它提出,什么被认为是道德的或不道德的,必须根据当地和当时的道德标准来判断。这意味着伦理是相对的,因此可以也确实会因地点、文化和时间而异。
最后一个思想流派将前两者结合在一起,称为综合社会背景理论,但它实际上相当简单。这个观点认为两者兼有:存在一些一阶的、普世的伦理规范,这些规范应该优先于二阶的、更具时代性的伦理规范。例如,“谋杀是坏的”是一个一阶伦理规范,大多数人同意。而饮酒消费则是一个相对的伦理规范,因文化、宗教和时代而异。
总结


本节课中我们一起学习了政治、价值观与伦理这三个核心概念。
那么,为什么我们要涵盖这些有趣的哲学内容?更重要的是,为什么它对公共部门(包括数据分析)的工作如此关键?价值观和伦理在五个关键领域扮演着重要且必不可少的角色:
- 社会问题最初是如何被定义或构建为“问题”的。
- 在识别和优先考虑哪些社会状况或问题需要并值得公共干预时。
- 在设计公共部门的行政和政策应对措施时。
- 在政策分析的重要工作中。
- 在公务员的行为中。




我们将在后续课程中更多地讨论所有这些内容。
3:数据分析伦理的重要性 📊


在本节课中,我们将探讨数据分析在公共政策领域所拥有的特殊力量,并理解这种力量为何会带来重要的伦理挑战。我们将看到,数据远非中立,它们承载着社会价值与历史偏见,因此需要我们在收集、分析和使用时保持伦理上的审慎。
数据的力量与责任 💪
上一节我们介绍了数据分析作为治理工具的强大能力。本节中,我们来看看这种能力背后的责任。
数据是强大的。数据分析能为改善治理提供强大的工具。但正如古老的格言所说:能力越大,责任越大。当你处理数据,为政策分析或决策制定而收集、分析和使用数据时,你就在运用权力。因此,每当处理数据时,你总是置身于引发重要伦理问题的领域。

数据分析伦理为何重要?为何这是你需要关注的问题?因为违反伦理规范,即使是无意的,也会侵蚀良好政策实践所依赖的公众信任。了解并关注数据分析的伦理将帮助你维持甚至建立公众信任。伦理将帮助你为了公共利益而使用数据。

数据在公共政策中的力量来源 🤔
为了理解数据为何在公共政策中拥有如此大的力量,我们需要进行一些哲学层面的探讨。
在现代社会中,只要数据被恰当地创建和使用,我们通常将其视为对周围世界准确而透明的描述。我们认为数据是客观的,与创建和使用者的个人观点或解释相分离、相绝缘。我们将数据与世界中的事物本身联系起来,视其为硬事实,是既定的。我们认为客观的事物是主观事物的对立面。主观性包括个人感受、品味、意见和偏见,也包括政治意识形态。
数据与客观性的关联,是赋予其在公共政策中特殊力量的重要原因。政策官员不应基于主观性做决策,不应让个人利益、所属政党的利益或特定政府部门的利益单独影响其行动和选择。他们理应超越那些主观因素,做出有利于其所服务和代表的公众利益的决策。因此,通过使用数据,政策分析者和官员表明,他们的结论和决策是基于非个人的、客观的基础得出的。他们向公众传递了“应该信任他们及其决策”的信号。
数据的“小写p”政治性 ⚖️

上一节我们探讨了数据因被视为客观而拥有的力量。本节中,我们来看看这种力量如何使其具有政治性。

那段哲学探讨的结论是:数据或许是客观的,但在人类社会关系中始终存在的权力关系方面,数据并非中立。数据是我喜欢称之为“小写p政治性”的事物。当我说“小写p政治性”时,我指的不是政党或保守/自由价值观(我认为那些是“大写P政治性”)。我指的是数据拥有一种特殊能力,能够影响政治和社会关系中的权力与权威安排。我们相信数据是客观的,这赋予了数据一种特殊力量,是其他形式的知识和论证所不具备的。
你可以想象这一见解带来的一些重要影响。以下是其中之一:
数据的潜在危害与历史教训 ⚠️
数据收集、共享和分析既能带来帮助,也可能造成伤害。这些伤害常常是数据收集和分析过程中无意或未预料到的后果。

例如,对政府了解其人口至关重要的人口普查数据,也可能被用于作恶。在第二次世界大战期间,占领荷兰和挪威的纳粹政府利用人口普查数据来定位、监禁和谋杀犹太公民。美国政府也曾利用人口普查数据,在二战期间定位并拘留日裔美国人,将他们关进拘留营,并贴上“潜在国家敌人”的标签。他们被拘禁多年,失去了家园和生计。

这并不意味着我们不应收集和共享人口普查数据,但它意味着政府数据可能对人们的生活产生严重的实质性影响。我们需要谨慎行事,确保我们的数据制作、分析、共享和使用既关注潜在利益,也关注潜在危害。
数据中的社会偏见与算法歧视 🔍
通常,数据的政治力量比上述例子更为微妙,因为我们视数据为客观。我们有时会错误地认为数据凭空而来,只是存在于世界中等待我们去收集。但数据是由人和机构创造的,它们反映了创造和使用数据的社会中人们的价值观和思维方式。数据反映了我们用来理解和思考社会世界的分类和划分,这些分类我们经常使用甚至未曾察觉。因此,数据能够反映其来源社会的偏见。
以审前风险评估为例。这是美国数据科学家创建的数据库算法工具,用于给被指控犯罪并等待审判的人分配一个风险分数。该分数旨在帮助法官判断此人在候审期间是否会犯罪(若是,则应继续关押),或者很可能不会犯罪(若是,则可释放候审)。我们希望将如此重要的决策建立在最佳数据之上,这是合理的。这对公共安全和被指控者都至关重要。那些被保释的人更有可能保住工作、支付房贷或租金,并维持与子女和家庭的持续联系。
但对风险评估系统的审计发现,该系统存在歧视性。与白人相比,该系统将非裔美国人标记为因有较高再犯罪风险而需要继续关押的可能性是前者的两倍。然而,对实际人口行为(即来自现实世界的真实情况)的研究并未显示这一点。该系统错误且具有歧视性的原因在于,用于设计它的数据无意但不可磨灭地烙印着美国种族歧视的历史。这些数据反映了数十年来对非裔美国人社区的过度监管和过度起诉。

正如专家所写:“当官方数据编码了歧视性实践的历史,即使是最复杂的算法,也可能将过去的不公正深深拖入我们的未来。”

总结与核心要义 📝

如果你仔细观察,可能已经注意到数据并不总是像我们想象的那样客观。数据并非我们政治和社会体系之外世界的透明反映。数据,尤其是与政策相关的数据,反映了我们的历史、社会和价值观。因此,我们需要深思熟虑并谨慎地使用它们。

正如普林斯顿大学专家Ruha Benjamin所说:“如果我们不注意社会规范和结构如何塑造数据系统,它们就能复制甚至放大现有的社会等级。”
总而言之,“数据自己会说话”这句老话很少成立。数据并非中立。它们拥有特殊力量,因为我们视其为客观的,将其与充满价值观和利益的混乱世界分离开来,从而认为它们比其他类型的知识和决策输入更可靠。但数据,尤其是关于人和社会的数据,能够体现和反映人与社会的价值观、世界观甚至偏见。这意味着,在创建、管理、共享和使用数据时,需要持续关注伦理问题。


本节课中,我们一起学习了数据在公共政策中的力量来源、其“小写p政治性”、潜在的历史危害,以及数据如何反映和固化社会偏见。理解这些是成为负责任的数据分析实践者的第一步。
4:数据分析伦理情境案例 📊



在本节课中,我们将探讨数据分析中的伦理问题。通过理解数据的政治力量,我们希望你能认识到数据分析需要伦理方面的专业知识。
什么是数据伦理?🤔

数据伦理的总体目标是促进负责任和可持续地使用数据,以造福社会大众,并确保通过数据获得的知识不被用于损害个人或群体的合法权益。
数据伦理并不仅限于分析实践本身。伦理问题贯穿于数据价值周期的各个阶段,包括数据创建、管理与清理、存储、共享、使用和处置。这是一个广阔的领域,数据伦理的理论与实践正处于快速发展阶段。
这个领域也因司法管辖区而异,并且存在许多空白。目前没有单一公认的数据分析法律体系。一些司法管辖区有相关法律,如果你在这些地区工作,你和你的组织了解这些法律非常重要。但伦理不仅仅是法律,它还涉及在更广泛的道德、政治和文化背景下,什么是正确或错误的。
这意味着数据伦理必须关注人们对政府和其他组织如何收集和使用其数据的担忧。例如,英国、加拿大、澳大利亚以及经济合作与发展组织(OECD)等司法管辖区和组织,已经提出了可以指导你的伦理框架,但这些框架仍在不断完善中。
随着新的数据源、数据集和分析方法的出现,数据伦理也在不断发展。同时,随着数据分析扩展到公共政策的新领域,从经济学到社会福利服务再到国家安全,数据伦理也在持续演进。
所有这些都表明,数据伦理教育不是一蹴而就的,而是一个持续的过程,我鼓励你将其融入你的专业发展和实践中。请记住,数据是强大的,它们的使用和政策不仅可能导致更好或更差的决策,如果不谨慎使用,还可能复制和加深不平等。如果不以符合伦理的方式进行,数据分析可能会侵蚀人们对政府的信任。

指导数据伦理的良好实践与理念 💡

鉴于指导数据伦理的复杂局面,有哪些良好的实践和理念可以指导你呢?
首先,因为数据伦理关乎维护和建立公众信任,良好的数据伦理实践是以人为本的。它关注并回应公众如何看待数据,例如,他们认为什么是公共数据,什么是私人数据。它也回应公众认为哪些政府行为和决策是合适的,以及公众对某些政府甚至特定政府机构的信任程度。
例如,作为美国公民,我可能可以接受政府使用我申请州身份证时提供的信息来向我提供选举信息,但我不能接受情报机构挖掘我的Twitter动态来了解我对最新政治新闻的看法。

其次,数据伦理具有高度情境性。它们不是“一刀切”的。必须在特定数据分析项目的背景和功能中评估其伦理性,并且它们的伦理与它们旨在支持或告知的更广泛政策项目的伦理密切相关。


现实世界潜在数据项目案例分析 🔍

让我们通过观察一些现实世界中潜在的数据项目来探讨这一点。

以下是第一个例子。一个国家统计局从超市网站上抓取价格信息以监测经济问题。

这看起来相当无害:它不识别个人,数据可能不会复制对某些人群的污名或偏见。在许多国家的背景下,公民期望并希望政府跟踪影响他们作为消费者的经济问题。
让我们看另一个例子。一个国家统计局使用Twitter上的数据来追踪人口群体的流动,以便规划提供地方服务。
预测地方服务不断变化的需求可能对人口非常有益。但在我们确定之前,我们至少需要问两个问题。第一,我们谈论的是什么服务?我们是在谈论在发展的社区中建立新的学校和卫生诊所吗?还是指针对控制难民等弱势或边缘化人群而增加的安保力量?用途很重要,数据伦理不能脱离应用背景来考虑。
我们需要问的第二个问题是,那些数据被分析的Twitter用户如何看待政府挖掘他们的社交媒体。在大数据时代,数据通常确实是由成千上万甚至数百万个人创造的。这些人通常不认为他们通过社交媒体帖子和其他数字痕迹创造了公共数据。研究表明,人们对社交媒体是个人还是公共的持有不同看法。因此,这个例子提出了关于公众对其数据的来源和使用的期望问题。这些问题需要在你特定社会的规范和期望背景下得到解答。

这是最后一个例子。一个公共卫生办公室使用数据分析来了解接受某些公共卫生相关福利的人们的更广泛需求。他们在研究中发现,不同群体有不同的需求。我们如何评估这一点?
首先,健康数据非常敏感。因此,这里的伦理实践需要仔细地进行匿名化处理。其次,与前面的案例类似,用途在这里确实很重要。这可能非常有益,但也可能具有潜在的歧视性。例如,如果结论所基于的数据本身已经隐藏了不平等。

例如,在美国,分析人员发现一些健康数据集反映了医疗保健提供中种族差异的历史。基于此类数据的研究可能显示白人患者比非裔美国患者需要更多的公共支持,这反映的是历史差异,而非真实情况。因此,在这种情况下,伦理实践必须努力确保研究不会无意中重复有偏见的规范和社会结构。
关键伦理考量总结 📝

这些例子得出的结论是,你需要考虑的伦理问题包括:
- 数据的安全性:个人是否被去标识化并受到保护?
- 相关数据的来源:人们认为它是公共的还是私人的?它是否模糊不清,因此仍然敏感?
- 数据本身:它是否重复了历史或现存的不平等?你能否以一种避免将这些不平等延伸到未来的方式分析它?
- 政策背景:数据的用途是什么?公众对使用这些数据的机构的信任度如何?潜在的益处和危害是什么?
对这些问题的答案往往是复杂的,需要仔细权衡利弊。
结语:数据伦理是一个持续的过程 🔄

这些只是让你入门的一些考量。我想强调的是,数据伦理不是在项目开始或结束时勾选的复选框,而是一个持续的、迭代的、整体的和情境化的过程。作为一名数据分析师,你并非独自承担责任。良好的伦理实践应该分布在你所在的机构或组织中。



本节课中,我们一起学习了数据伦理的核心概念、其情境性特点,并通过案例分析探讨了在现实项目中需要考虑的关键伦理问题。记住,负责任的数据分析是建立和维护公众信任的基石。
5:美国数据伦理框架基本原则 📜

在本节课中,我们将学习美国联邦政府制定的数据伦理框架。这个框架旨在为公共部门的数据工作者提供一套核心原则,以指导他们在数据获取、管理和使用过程中做出符合伦理的决策。

上一节我们探讨了数据科学带来的变革与挑战,本节中我们来看看如何通过一套原则性的框架来应对这些挑战。
引言:数据伦理的必要性
伦敦帝国理工学院的David Hand教授曾这样评价数据和数据科学:

尽管数据有时因其像化石燃料一样革命性地改变社会而被描述为“新石油”,但数据具有独特的属性,这导致了相应独特的伦理挑战。这些考量不允许简单的公式化答案,因为它们必须依赖于具体情境且是动态的。相反,解决方案必须基于原则,由更高层次的考量来指导特定情境下的决策。
Hand教授的核心观点是,在数据科学、数据技术和数据分析这个爆炸性发展的新世界中,我们需要一套原则或路标作为路线图,以识别和应对其中无数的伦理挑战。
作为世界上最大的数据生产者和使用者之一,美国联邦政府近期迎接了这一挑战。众多不同的利益相关者共同协作,制定了《联邦数据战略》及相关的行动计划。在该计划中,联邦政府总务管理局被委以重任,负责开发一个数据伦理框架。
该框架旨在协助联邦雇员、管理者和领导者在获取、管理和使用数据时做出伦理决策。
数据伦理框架的七大原则 🧱

这个数据伦理框架包含七项原则(或称信条),它们共同促进了一系列价值观和相应的伦理行为。框架将这些原则呈现为层层递进的步骤,较低层级的步骤为后续步骤奠定了坚实的基础。
以下是这七大原则的总结:

-
遵守适用的法规、条例、专业实践和伦理标准。
这意味着不违反法律和法规,并遵循覆盖你工作的现有职业道德准则。 -
尊重公众、个人和社区。
尊重他们的处境、利益、优先事项和观点。 -
尊重隐私和保密性。
正如你所知,这是数据系统和数据分析的核心价值。 -
在工作中保持诚实、正直和谦逊。
-
对自己和他人负责。
这与上一条原则密切相关。 -
促进工作的透明度。


- 随时了解数据管理和数据科学领域的发展。
这不仅包括技术发展,也包括伦理考量的演变。
我强烈建议你阅读这份报告,深入了解每一项原则。
框架的价值与益处 💡
拥有这样一套伦理指导框架,为公共部门的数据分析领域带来了诸多益处:
- 提供决策指南:它为每个人提供了一套重要的原则,用于应对伦理困境和考量。
- 改善决策质量:它有助于改进并促成更好的数据驱动型决策。
- 降低风险:政府因不道德行为(包括数据滥用)而面临诉讼和其他负面后果的风险很高。遵循这些原则有助于降低此类风险。
- 增加政府透明度:遵循这些原则可以增加政府的透明度。
- 纳入多元视角:它有助于引入并考虑更广泛的利益相关者观点。
所有这些都至关重要,并将共同助力提升公众信任,而公众信任对于公共部门的工作至关重要。



总结


本节课中,我们一起学习了美国联邦政府数据伦理框架的七大基本原则。从遵守法律、尊重个人,到保持透明和持续学习,这些原则为公共部门的数据实践构建了一个坚实的伦理基础。理解和应用这个框架,不仅能帮助我们在工作中避免伦理陷阱,更能提升决策质量、增强公众信任,最终更好地服务于公共利益。
6:本周补充:开放政府数据八项原则 📚

在本节课中,我们将学习开放政府数据的概念及其背后的八项核心原则。这些原则旨在指导政府如何公开数据,以促进透明度、问责制和社会价值的创造。




开放数据,广义而言,是指任何人均可在互联网上免费下载、修改、分析和分发,且不受重大法律或财务限制的数据。开放政府数据是一种理念,伴随一系列政策,通过向所有人开放政府数据来促进透明度、问责制和社会价值。
上一节我们介绍了开放政府数据的基本概念,本节中我们来看看支撑这一理念的八项具体价值原则。


以下是开放政府数据的八项核心原则:
- 完整性:这并不意味着所有政府数据都必须公开。与医疗、公共医疗保健计划、养老金系统缴款与支付、个人普查答案等相关的个人数据需要受到保护并保持私密。然而,在法律允许的情况下,数据应尽可能以完整的方式公开。众所周知,将经过去标识化处理(即移除所有识别信息)的数据提供给公众使用也是可行的。
- 原始性:数据应以其最原始或最高粒度的级别提供。这意味着应提供去标识化的个体级别数据,而不仅仅是按城市、社区、县或更高级别汇总的数据。
- 及时性:从事这项工作的人都知道,清理数据、去除标识符、处理缺失变量和缺失数据等需要时间。数据在公开发布前需要做大量工作。然而,这项工作应尽可能快速高效地完成,以确保数据在发布时仍然及时、重要且相关。
- 可获取性:数据应为最广泛的用户群体提供,并可用于多种目的。
- 机器可读性:公开发布的数据应能被计算机处理。
- 非歧视性:任何人都应能访问和使用数据。您不应为使用数据而提交提案,不应需要特定资质或地位,也不应满足任何访问标准。
- 非专有性:这意味着政府或任何其他实体都不应对数据或其任何子集拥有独占控制权。
- 免许可性:数据应没有重大的访问和使用监管障碍。开放政府数据不应受专利、版权、商标或其他规则和条例的约束。

了解这些原则后,让我们花点时间探索一个由美国政府运营的开放数据仓库。
这个网站名为 Data.gov,您可以在 data.gov 找到它。该网站提供了许多州、县及其他国家开放数据站点的链接。它包含来自多个国家和国际地区的数据,是一个丰富的全球开放数据站点库或仓库。Data.gov 网站有一个 Excel 电子表格形式的目录,您可以在其中看到开放数据站点的完整列表以及每个站点的链接。这里有大量内容可供探索,涵盖了 53 个国家和 165 个世界地区的开放政府数据站点。请花点时间看看有哪些数据可供您或任何其他人通过开放政府数据运动使用。





本节课中我们一起学习了开放政府数据的八项核心原则:完整性、原始性、及时性、可获取性、机器可读性、非歧视性、非专有性和免许可性。这些原则共同构成了开放、透明和负责任的政府数据实践的基石。我们还简要介绍了 Data.gov 这一全球开放数据资源门户,鼓励大家积极利用这些公共数据资源进行探索和分析。
7:人口偏差测量方法 📊

在本节课中,我们将学习学习分析中的人口偏差测量方法。我们将探讨学生同意分享数据倾向的差异,以及这种差异如何影响预测模型的公平性与有效性。

概述
今天,我们很高兴向您介绍沃伦·李,他是密歇根大学信息学院与我合作的博士研究生。沃伦目前是博士五年级,他的研究专注于学习过程,以及学习者如何与数据系统、人工智能和数据收集系统互动。他今天展示的研究是与我的合作者弗洛伦斯·施瓦巴以及我指导的另一位博士生孙凯文共同完成的。我的研究重点是学习分析,我致力于利用数据科学来理解学习现象并帮助学习者,这通常涉及构建学习者的预测模型。
确保这些数据有意义至关重要。我们在本课程中已经简要讨论过偏差和人口偏差,这正是沃伦今天工作的主题。非常感谢沃伦的加入,我期待听到他的分享。


谢谢邀请,我很高兴来到这里,也感谢精彩的介绍。正如克里斯提到的,今天我们将讨论学生在同意参与学习分析方面的倾向差异。这听起来有点复杂,“倾向”指的是他们分享数据的可能性,而“学习分析”指的是利用数据来更好地理解学习者并帮助改善他们的学习。
学习分析的应用与数据收集
为了给您一个例子,在课堂上使用数据的一个领域是预测模型。例如,假设学生正在上课,他们正在参与课程材料的学习。



我们可能有不同的公司开发软件,以帮助识别可能面临风险的学生。这里有一个例子:一名学生课程成绩为D,我们担心他可能无法通过。这项工作的希望在于能够进行干预,也许我们可以为他们提供一些支持,从而扭转局面。

事实上,在本课程的Coursera学习管理系统中,他们也使用了预测模型。虽然我自己不常使用它们,但学生们可能已经注意到,在整个课程中他们会收到一些小提示,比如“如果你完成这项作业,你通过这门课程的机会会更大”。我很想听听他们对这些提示的看法。我认为非常有趣的是,许多供应商正在投入大量工作来构建这些系统,而不管机构是否需要。同时,像密歇根大学这样的机构,也对构建我们自己的预测分析工具和仪表盘非常感兴趣。
确实,当我们讨论与其他公司共享数据时,我们实际上会谈到其中一些担忧。例如,这当然会引发一些隐私和伦理问题。
数据隐私、伦理与机构问题
正如您所暗示的,许多这类系统会导致数据收集的增加。它们基于人工智能和机器学习算法,为了构建这些模型,我们需要大量数据。这自然引出了一个问题:数据是什么?为谁服务?不幸的是,很多时候这些是敏感数据,可能是您的学业记录、人口统计信息等,有些人可能并不总是愿意分享这些信息。情况变得复杂,因为与第三方、外部公司等的共享安排并不明确。



即使是像我们这样的校内研究人员,为了获取学生数据,也必须经过一系列不同的程序。这里涉及很多方面,包括相关立法、本地政策,当然还有学生的最大利益,这是我们所有人都致力于维护的。
这正好是一个完美的过渡,因为许多研究人员以及学生本人都希望拥有自主权,并指出我们应该赋予学生自主权。因为这有助于体现对他们决定的尊重,我们应该将他们视为合作者,而不仅仅是数据生产者。我们不仅仅是生成数据,我们是这个过程的一部分。
自主权与样本偏差的后果


但有时也会产生一些意想不到的后果。例如,我们知道样本偏差——当模型不能代表全部人口时,这会对不同的亚群体产生不同的影响。因此,如果我们允许所有人选择退出,并且所有人都选择退出,这可能会对一些模型产生负面影响,对某些特定群体尤其如此。这一点尤其令人担忧,因为我们知道教育成就本身就存在差异。
确实,在美国,我们经常根据种族或民族来思考这些群体。我们在本课程中已经通过BRFSS和其他行为系统看过一些相关数据。但这实际上是一个全球性问题,不仅限于种族和民族,它还可以沿着任何可以划分群体的界限分解,例如性别界限,但也包括学科领域和教育准备程度,例如家庭中第一代大学生。


我很高兴您提到这一点,因为在这项特定研究中,我们关注的是性别和种族。但正如您所说,存在许多不同的群体,甚至不同国家和文化中的群体构成也可能有所不同。
预测模型中的公平性问题示例

为了给出预测模型中不公平现象的具体例子,近年来,如右侧漫画所示,人们对机器学习公平性的兴趣日益增长。我这里举一个例子:Ocompal等人在2014年训练了一个模型,一个“情感检测器”——这只是试图模拟学生情绪的一种花哨说法。例如,也许有人在课堂上感到沮丧或无聊,我们试图检测这些行为。他们的做法是收集了大量来自城市、郊区和农村学生的数据。
他们发现,该模型对城市学生和郊区学生的表现相当好,但对农村地区的学生则不然。部分原因在于农村地区的学生数量要少得多。这就是我们所说的模型对不同群体的不同影响。例如,您可能需要将它们分开,并分别训练这些模型。
我认为这确实说明了问题。这是宾夕法尼亚大学出色的研究,我认为它确实强调了从您希望支持的人群中收集数据的必要性。实际上,在教育领域和学习科学领域,我们面临着巨大的可重复性危机。正如您所知,进行这些调查或进行全面的实验非常昂贵,而且需要大量时间。因此,即使我们有1000名学生,如果这些学生都来自同一个群体,我们能真正推广的结论是有限的。我认为这项出色的工作确实将这个问题推到了教育数据挖掘领域的前沿。
预测错误的后果

正如您提到的,这极其重要。那么,让我们也谈谈预测错误可能带来的一些后果。例如,如果某人被标记为“有风险”,这会带来负面刻板印象。我们不想只是简单地给每个人贴上“有风险”的标签,因为这会产生一些负面后果。同样,如果我们错误地分类学生,我们最终会错过一些本可以更早为学生提供支持的干预机会。
我认为我们在研究中面临的一个挑战是,预测和干预之间存在差异,但它们确实需要齐头并进。我们需要识别需要帮助的学生,然后我们需要能够进行干预以实际帮助这些学生。当然,有些干预措施我们可以用来帮助每个人,比如在作业前一晚发送一封电子邮件提示,或者提前一周发送提醒。这些是轻量级且容易实施的。
但对于像密歇根大学这样的大型机构来说,提供个性化的辅导建议或打电话联系某人则比较困难。不过,我们确实会为那些被识别为最高风险的学生提供此类帮助。因此,干预和预测这两个部分确实需要紧密结合。

确实,正如您提到的,这是一个复杂的难题。存在那些简单的干预措施,比如给每个人发邮件,但也有一些成本更高的干预,例如建议某人完全换一门课,这将产生巨大的影响。
总结


本节课中,我们一起探讨了学习分析中人口偏差的测量及其重要性。我们了解了预测模型在教育中的应用、数据收集带来的隐私与伦理问题、赋予学生数据自主权的必要性,以及样本偏差如何导致预测模型对不同群体产生不公平的影响。通过具体的研究案例,我们看到了确保数据代表性和模型公平性的挑战。最后,我们讨论了预测与干预必须相结合,才能有效支持学生,并认识到不同干预措施的成本与复杂性。理解这些概念对于在公共部门负责任地开展数据分析至关重要。
8:人口偏差测量实证研究 📊



在本节课中,我们将学习一项关于学生数据使用同意意愿的实证研究。这项研究旨在探讨影响学生同意意愿的关键因素,并分析这些因素如何与人口统计学特征相关联。我们将了解研究设计、数据收集过程、观察到的响应偏差以及由此引发的关于数据代表性、同意机制和干预措施的思考。


上一节我们介绍了研究背景与核心问题,本节中我们来看看研究的具体设计与数据收集方法。
为了回答研究问题,我们向密歇根大学的4000名大一新生发送了一封仅包含一个问题的电子邮件。该问题询问学生是否同意将其数据用于学习分析。
以下是邮件发送的群体分层策略:

- 性别:男性和女性各2000封邮件。
- 种族:我们力求在各群体间尽可能平衡。但实际操作中,白人学生样本略多,黑人学生样本略少。这是因为在密歇根大学这样规模的机构中,黑人学生属于少数群体。为了确保他们的观点得到代表,我们几乎联系了所有符合条件的黑人新生。
这种群体规模不均等的情况,是数据分析中常见的挑战。在本专业的其他课程中,我们讨论过加权变量是处理此类问题的一种方法。例如,在BRFSS数据中,我们可以根据人口规模和响应率对结果进行加权。然而,本研究的兴趣点不在于事后的加权处理,而在于首先理解不同群体对我们的调查是否从一开始就存在不同的响应倾向。

上一节我们了解了数据收集的框架,本节中我们来看看实际观察到的响应情况与预期之间的差异。

我们计算了预期的链接点击数和实际的链接点击数。预期值基于一个总体假设:所有群体的响应率相同,均为观察到的总响应率(约7%)。
以下是预期点击与实际点击的对比观察结果:
- 白人学生:实际点击量显著高于预期值。此处的比较是将白人学生与所有其他种族分类(亚裔、西班牙裔、黑人)的学生合并后的群体进行对比。
- 黑人学生:实际点击量远低于预期值。
- 女性学生:与男性相比,女性的响应率也高于预期。

这些结果清晰地揭示了两点:第一,你调查的各个子群体规模本身就不相等;第二,你从各子群体获得的响应率也各不相同,并非均匀分布。因此,在解读结果时,必须考虑这些偏差。如果你认为所测量的变量(本例中是同意倾向)受人口统计学特征影响,那么这种响应率的差异就尤其值得关注。

上一节我们看到了响应中存在的偏差,本节中我们来探讨这种低响应率现象及其深层含义。
这项研究中一个非常有趣的现象是,只有约7%收到邮件的学生做出了响应。我们最初的假设是学生希望拥有自主权,但绝大多数学生甚至不愿意参与这封关于数据使用的邮件互动。


一些其他机构已将回答此类问题设为强制要求,而另一些机构则认为无需询问。事实上,我们论文的一位评审就提出:“你们何必问他们?我们不需要问他们。”这也是一种合理的立场。这引出了关于同意、自主权和代表性的复杂议题。
尽管在法律上我们可能无需征得同意,但本研究关注的是“如果我们询问,会发生什么”的假设情况。我们认为征得同意是重要的,并希望观察其效果。目前,在加州、欧洲、加拿大等许多司法管辖区,从数据被收集者那里获取同意正变得越来越重要,尽管要求不尽相同。



上一节我们讨论了低响应率现象,本节中我们基于这些发现来思考可能的解决方案及其潜在影响。
那么,面对这些信息,我们可以做些什么?以下是一些可能的干预措施:


- 助推:通过设计选择架构,温和地影响人们的决策。
- 社会框架:解释分享数据为何可能有益。
- 补偿:为学生分享数据提供某种形式的补偿。
然而,这些干预措施也伴随着后果。根据行为者的意图,我们可能希望鼓励人们分享或做出同意决定,但不应对其施加必须同意的压力。这个领域涉及大量行为心理学研究。有时网站上存在被称为“黑暗模式”的负面设计,有时则是非常积极的引导。
当我们为了获取数据而“助推”人们时,会产生许多有趣的问题:例如,助推是否会改变他们将要提供的数据?是否会将他们置于不同的思维框架中?在本例中,如果我们通过告知机构做出良好决策的重要性来助推,猜测不仅会有更多人响应,而且会更积极地同意分享数据。但我们想了解的是真实的意愿。


这些旨在改善偏差和响应率的干预措施,实际上也可能改变你的数据,从而给数据增加更多维度的偏差。这是一个值得未来研究探讨的非常有趣的问题。
上一节我们探讨了可能的干预措施,本节中我们最后来看看学生们实际的选择及其背后的关键影响因素。

一个关键问题是:在不同群体中,学生们实际的选择是什么?他们是否同意分享数据?我们发现了什么?


情况有些复杂,但我们发现有三个主要因素对学生是否同意产生显著影响:

- 对数据收集的普遍担忧:如果学生对数据收集的总体担忧程度更高,他们同意的可能性自然更低。
- 对机构的信任。
- 对教师的信任:这一点甚至比信任机构更为重要。



本节课中我们一起学习了一项关于学生数据同意意愿的实证研究。我们回顾了研究如何通过分层抽样设计调查,并发现了显著的响应率偏差,特别是不同种族和性别群体之间的差异。我们探讨了低响应率现象背后的含义,以及为改善偏差可能采取的干预措施(如助推)及其潜在风险。最后,我们了解到影响学生同意决策的三个关键因素:对数据收集的担忧、对机构的信任,以及对教师的信任。这项研究凸显了在公共部门进行数据分析时,理解并解决数据收集阶段的人口偏差对于确保决策公平性与代表性的至关重要。
9:人口偏差测量结果分析 📊

在本节课中,我们将学习如何分析一项研究中的人口偏差。我们将使用R语言,通过卡方检验来评估数据收集过程中是否存在基于性别和种族的系统性偏差。课程将涵盖数据读取、预期值计算、实际值统计以及统计检验的完整流程。

上一节我们介绍了研究背景和定性分析的重要性,本节中我们来看看具体的R代码实现和数据分析过程。
数据准备与常量定义
首先,我们需要读取数据并定义一些已知的常量。数据文件是一个CSV格式的文件,包含三列:consent(是否同意使用数据)、gender(性别)和ethnicity(种族)。
以下是读取数据和定义常量的R代码:
# 读取数据
data <- read.csv("your_data_file.csv")
# 定义已知常量
sent_emails <- 4000 # 发送的邮件总数
gender_population <- 2000 # 性别分组的人口基数
ethnicity_population <- 1104 # 特定种族分组的人口基数(例如黑人学生)
计算汇总统计量
在进行分析之前,我们先计算一些基本的汇总统计量,例如总体同意率。

以下是计算同意率的代码:

# 计算总体同意率
consent_rate <- sum(data$consent) / nrow(data)
print(paste("总体同意率:", round(consent_rate * 100, 2), "%"))
计算预期值与实际值
接下来,我们需要计算在假设无偏差的情况下,各人口分组预期的点击(同意)数量,并与实际观察到的数量进行比较。
预期点击率的计算公式为:
预期点击率 = 总点击次数 / 发送邮件总数
然后,用各分组的人口基数乘以这个预期点击率,得到该分组的预期点击数。




以下是计算预期值和实际值的代码:
# 计算总体点击率(同意即视为点击)
population_click_rate <- sum(data$consent) / sent_emails
# 计算性别分组的预期点击数
expected_clicks_gender <- gender_population * population_click_rate
# 计算种族分组的预期点击数(示例为黑人学生分组)
expected_clicks_ethnicity <- ethnicity_population * population_click_rate
# 从数据中统计各分组的实际点击数
# 注意:数据文件只包含点击了的学生
actual_clicks_gender <- table(data$gender)
actual_clicks_ethnicity <- table(data$ethnicity)

执行卡方检验
为了判断观察到的差异是否具有统计显著性,而非随机波动,我们使用卡方检验。卡方检验用于检验两个分类变量之间是否独立。


在R中,我们使用 chisq.test() 函数。我们可以直接传入观察频数和预期频数。
以下是执行卡方检验的代码:


# 对性别进行卡方检验
# 使用预期比例,例如男女各占一半,则传入 c(0.5, 0.5)
# 也可以直接传入预期频数,函数会自动归一化
chi_gender <- chisq.test(actual_clicks_gender, p = c(0.5, 0.5))
print(chi_gender)
# 对种族进行卡方检验(以两个主要类别为例)
# 假设预期分布为均匀分布
chi_ethnicity <- chisq.test(actual_clicks_ethnicity)
print(chi_ethnicity)
结果解读与注意事项
运行上述代码后,我们将得到卡方检验的P值。在社会科学中,通常将显著性水平(alpha)设定为0.05。
以下是结果解读的关键点:
- P值 < 0.05:拒绝原假设,认为点击率与性别/种族存在显著关联,即存在统计上的偏差。
- P值 >= 0.05:没有足够证据拒绝原假设,不能认为存在显著关联。


需要强调的是,统计显著性(P值小)并不等同于实际意义的显著性(效应量大)。当样本量很大时,即使很小的差异也可能产生极小的P值。因此,必须结合我们在之前幻灯片中看到的实际差异大小来综合判断。
此外,数据本身也存在局限性:
- 数据来源于学生信息系统,其中的分类(如“性别”实为生理性别)可能与社会定义不完全吻合。
- 种族分类基于联邦报告要求,某些类别(如“两个或更多种族”、“美国印第安人”)样本量过小,可能被排除在分析之外。
- 分析样本本身可能存在偏差(例如,愿意回答“为什么”的学生群体不能代表全体)。

本节课中我们一起学习了如何使用R进行人口偏差分析。我们完成了从数据读取、常量定义、计算预期与实际值,到执行和解读卡方检验的全过程。重要的是,我们认识到统计分析是理解偏差的工具之一,但必须结合数据收集的背景、分类的定义限制以及定性分析的洞察,才能对研究结果形成全面、审慎的理解。在应对政策制定或数据分析中的偏差问题时,需要从统计、数据收集、清洗到整体设计进行多维度考量。
10:随机对照试验中的伦理问题 🧪

在本节课中,我们将回顾随机对照试验这一强大的研究设计,并重点探讨其伴随的伦理问题。正如我们在课程三中讨论过的,随机对照试验因其能有效隔离和理解项目、政策或其他干预措施的效果,而具有最强的内部效度。
上一节我们介绍了随机对照试验的基本设计,本节中我们来看看其设计的一些变体,并深入探讨三个主要的伦理关切。
随机对照试验的设计变体 🔄
随机对照试验的设计存在一些变化。以下是其经典设计,其中两组被随机分配接受或不接受干预,并在干预前后都进行观察(用O表示)。
Group 1 (干预组): O1 -> [干预] -> O2
Group 2 (对照组): O1 -> [无干预] -> O2

在另一种版本中,研究可以包含三组,这些组被随机分配接受两种不同干预中的一种,或作为不接受任何干预的对照组。
Group A: [干预 A]
Group B: [干预 B]
Group C (对照组): [无干预]
在第三个例子中,可以设计一个实验,其中两组被随机分配接受或不接受干预,然后在干预后对两组进行多次观察。在这个特定例子中,干预后有四个观察点。
Group 1 (干预组): O1 -> [干预] -> O2 -> O3 -> O4 -> O5
Group 2 (对照组): O1 -> [无干预] -> O2 -> O3 -> O4 -> O5


实验设计有许多主题和变体,其共同因素是随机分配是否接受干预。正是由于这种随机分配以及实验的性质,使用这类研究设计会带来一系列伦理问题。
随机对照试验的主要伦理关切 ⚖️
我们将讨论随机对照试验的三个主要伦理关切:
- 为了科学而扣留可能有效的干预措施。
- 提供安慰剂或影子干预。
- 在未获得知情同意的情况下对人群进行实验。
伦理关切一:扣留干预措施
许多人认为,为了研究、科学或政策分析,而将一项干预、服务或政策福利从一群人那里扣留,是不道德的。人们不应该被当作实验品,尤其是因为扣留资源或有益服务可能会伤害他们。一些人认为,如果一项干预措施好到足以在研究中进行试验,就不应该使用一个实际上会将其从某些人那里扣留的研究设计。

然而,另一些人则认为,在评估之前,我们永远无法真正知道一项干预是否有效,而且许多干预措施会产生意想不到的后果或伤害。最坏的情况不是干预无效或效果中性,有时干预措施确实会以设计时未预料到的方式伤害人们。因此,除非我们使用具有良好内部效度的强大研究设计,否则我们将无法知道干预是否真正有效,或者是否带来了意想不到的有害后果。因此,这里存在两种相互竞争的观点。
应对策略:替代性研究设计
为了应对实验中扣留可能有效干预措施的伦理关切,实际上可以使用一些替代性的研究设计。
以下是其中一种设计的图示。让我用文字解释:这里有两组人,被随机分配接受两种完全无关的干预措施之一。这些组互为比较组或对照组,但每组都接受一项可能有效的服务或项目。在干预前后都对两种干预的潜在效果进行观察。
Group A: O1 -> [干预 A] -> O2
Group B: O1 -> [干预 B] -> O2


要使这种设计有效,两组都必须接受干预,但干预措施必须完全无关,不能存在一种干预的暴露会影响另一种干预效果的可能性。我熟悉的一个例子是针对孤寡老人的上门护理干预,其中一组被随机分配在家中接种流感疫苗,而另一组被随机分配接受预防跌倒(尤其是在浴缸中)的干预。
第二种用于解决扣留干预措施伦理关切的设计称为延迟干预设计,其中对照组或比较组实际上在实验完成、研究人员知道干预是否有效后的某个未来时间点接受干预。如果干预有积极效果,那么对照组可以在延迟或稍后的时间接受它。
第三种可以考虑的设计实际上是前两种的结合,它同时提供了无关干预和延迟干预。两组被随机分配接受两种无关干预中的一种,然后在效果评估后,将干预措施给予另一组。这种设计的技术术语是延迟干预交叉法。
第一阶段:
Group A: O1 -> [干预 A] -> O2
Group B: O1 -> [干预 B] -> O2

第二阶段(交叉后):
Group A: O3 -> [干预 B] -> O4
Group B: O3 -> [干预 A] -> O4



总结 📝


本节课中我们一起学习了随机对照试验的设计变体及其伴随的核心伦理问题。我们探讨了扣留可能有效干预措施这一主要伦理关切,并介绍了三种替代性研究设计——使用无关干预的对照组、延迟干预设计以及延迟干预交叉法——来应对这些关切,从而在追求科学严谨性与保障研究参与者权益之间寻求平衡。理解这些伦理考量和替代方案,对于在公共部门负责任地设计和实施基于证据的政策评估至关重要。
11:影子干预的伦理考量 🧭

在本节课中,我们将继续探讨与实验设计相关的伦理问题,重点关注“影子干预”或“安慰剂”的使用。我们将分析在公共部门研究中,向参与者提供明知无效的干预措施是否合乎伦理,并讨论知情同意原则在政策评估中的适用性。


上一节我们讨论了实验设计的一般伦理问题,本节中我们来看看一个具体且颇具争议的实践:使用安慰剂或影子干预。
安慰剂是一种我们明知对研究结果零效应的干预措施,但仍会提供给参与者。这样做的目的是观察参与者是否仅仅因为“接受了某种干预或关注”而产生反应。在药物试验中,这用于区分药物本身的疗效和安慰剂效应。其核心设计公式可表示为:

干预净效应 = 真实干预组结果 - 安慰剂组结果
在公共部门工作中,我们无法使用“糖丸”,但可以设计类似的无效干预,例如,将提供实质性服务的项目与仅仅发放宣传册这种已知效果甚微的做法进行比较。

然而,我们的核心问题是:在非医学领域的研究中使用安慰剂是否合乎伦理?

医学试验中使用安慰剂被视为是伦理的,因为我们需要理解药物效果中超出已知安慰剂效应的部分。但这一做法在其他背景下引发了争议。
例如,历史上存在一些有争议的医学实验,参与者接受了虚假的膝盖或背部手术(即被切开但未进行实际治疗)。结果发现,接受虚假手术的参与者在疼痛缓解方面,与接受真实手术的人取得了相似且持久的效果。这虽然有助于医学进步,但其伦理性受到质疑。

那么,在教育课程改革、社区服务或社会福利项目等研究中,是否存在我们需要理解的“安慰剂效应”?为了更好理解真实干预的效果,是否值得随机分配参与者接受无害或虚假的干预?这些都是棘手的问题,没有简单的答案。

除了安慰剂问题,另一个关键的伦理考量是知情同意。

在之前讨论的所有医学干预(包括虚假手术)案例中,参与者都签署了知情同意书,同意参与研究项目(尽管他们可能在数月后才被告知自己接受的是真实还是虚假手术)。知情同意是医学领域人体研究伦理的基石。
但在某些情况下,知情同意可以被豁免,研究仍可被视为符合伦理。通常需要满足以下条件:
- 研究对象必须是成年人。
- 如果参与者知晓自己正在参与研究,其行为会因此改变,从而影响研究现象。
- 干预措施被视为无风险或最低风险。
那么,在针对组织(如学校、教堂、工作场所)或整个社区乃至人口的政策变化评估中,知情同意扮演什么角色?



回想我们讨论过的墨西哥“繁荣计划”评估案例:农村地区被随机分配是否参与该计划的推广。对于这类大规模政策干预,几乎不可能获得每个人的知情同意。
此外,试想一下,如果询问社区:“您是否愿意参与一个随机决定您是否获得政策改变的实验?”人们很可能会拒绝。谁愿意成为政府实验的对象呢?

因此,要求对社会福利、环境、劳动力市场等政策干预获取知情同意,实际上会使使用实验设计来评估它们变得不可能。
所有这些伦理问题无疑都提出了严峻的挑战。它们需要研究团队进行大量的讨论和关注。
以下是如果你参与此类讨论时需要牢记的一些要点:
- 挑战是困难的,没有简单的答案。
- 在最严谨的研究方法与保护研究对象(无论是否在药物研究中)之间,确实存在张力。
- 即使在高度重视研究伦理的人士中,也可能存在分歧。
重要的是,在你所参与的政策或项目评估工作启动前,作为研究团队,必须深入思考所有伦理影响。在最终确定研究方法前,有许多关于伦理标准的实用指南和良好范例可供参考。




本节课中我们一起学习了在公共部门实验设计中使用安慰剂(影子干预)所引发的伦理困境,以及知情同意原则在政策评估中的复杂应用。我们认识到,在追求科学严谨性与保障研究对象权益之间需要审慎权衡,这要求研究者在设计阶段进行深入、集体的伦理反思。
12:模型偏差评估方法 🧠

在本节课中,我们将学习机器学习模型偏差评估的核心概念与方法。我们将从理解什么是机器学习模型开始,探讨如何评估模型性能,并重点介绍一种名为“切片分析”的技术,用于审计模型中的算法偏差。课程将通过一个真实的信用风险建模案例来演示这些概念。


什么是机器学习模型? 🤖
上一节我们介绍了课程概述,本节中我们来看看什么是机器学习模型。
为了便于讨论,你可以将机器学习模型视为一个将输入映射到输出的数学函数。其形式可表示为:

Y_hat = F_θ(X)

其中:
- Y_hat 是模型产生的预测。
- F_θ 是我们的模型函数。
- θ 是模型参数,在训练过程中学习得到。
- X 是输入观测值,可以代表一个人、一张图片或一段音频等。
具体到今天的案例,我们将研究一个信用风险模型。模型的任务是:看到一个贷款申请人及其相关特征(X),预测该个体属于高风险(可能违约)还是低风险(可能还款)。我们将使用一个历史贷款申请数据集来训练模型。
输入特征(X)可能包括申请人的支票账户状态、年龄、职业等信息。我们试图预测的目标(Y)是该个体在历史数据中实际表现出的风险等级(高或低)。训练机器学习模型,本质上就是估计那组参数 θ,使模型能根据特征做出风险判断。
模型评估方法 📊
我们已经了解了机器学习模型的基本构成,接下来我们探讨如何评估一个模型的性能。
通常,我们会将数据分为两部分:一部分用于训练模型(估计参数 θ),另一部分作为测试集,用于评估模型在未见过的数据上的表现。我们在测试集上使用训练好的模型进行预测,并将预测结果与真实的标签进行比较,从而计算各种预测准确性和模型偏差的指标。
以下是评估模型有效性的一些常见指标:
- 准确率:正确预测的样本比例。
- 交叉熵:衡量模型分配给正确类别的概率质量。
- 混淆矩阵衍生指标:如假正率(FPR)和真正率(TPR)。
让我们更详细地了解混淆矩阵及其用途。
混淆矩阵本质上是模型预测结果与真实标签的交叉表。当预测与真实标签一致时(矩阵对角线),模型预测正确;不一致时(非对角线),模型预测错误。


- 真正例:真实标签为正面(如“高风险”),且模型也预测为正面。
- 假正例:真实标签为负面(如“低风险”),但模型预测为正面。
我们可以直接从混淆矩阵中计算出真正率(TPR)和假正率(FPR),以及准确率(对角线元素占总数的比例)。用于计算这些指标的R代码将在课程资料中提供。
通过切片分析审计算法偏差 ⚖️
在掌握了模型性能评估的基础后,本节我们将重点转向如何检测模型可能存在的偏差,即“切片分析”。
仅仅知道模型的整体性能(如准确率或AUC)是不够的。一个在整体上表现良好的模型,可能对某些特定人群(如不同性别、年龄组)的表现显著更差,这就构成了算法偏差。切片分析通过将测试数据划分为不同的子组(“切片”),并分别评估模型在每个子组上的性能,来揭示这种偏差。
以下是进行切片分析的关键步骤:
- 定义切片:根据你关心的敏感属性(如性别、种族、年龄区间)将数据分成多个子集。
- 分别评估:在每个数据切片上,独立计算模型评估指标(如准确率、TPR、FPR、AUC)。
- 比较结果:对比模型在不同切片上的性能指标。如果存在显著差异,则表明模型可能存在对该属性的偏差。
在我们的信用风险案例中,我们可以按“性别”对测试数据进行切片,然后分别计算男性和女性申请人群体上的模型性能。如果模型对女性的假正率(即错误地将低风险女性判为高风险的比例)显著高于男性,那么该模型在性别维度上就存在不公平的偏差,可能导致女性申请人更不公平地被拒绝贷款。

案例研究:信用风险模型审计 💳
现在,让我们将前面所学的概念应用到一个具体的案例中——审计一个信用风险模型。
我们使用一个公开的贷款申请数据集。首先,我们按常规流程训练一个信用风险预测模型。然后,我们不仅仅查看它在整个测试集上的AUC(假设为0.8),而是进行深入的切片分析。
例如,我们可以编写R代码来执行以下分析:
# 假设 `test_data` 包含测试数据和预测结果,`gender` 是性别列
# 计算整体性能
overall_auc <- calculate_auc(test_data$label, test_data$prediction_score)

# 按性别切片分析
male_data <- subset(test_data, gender == "male")
female_data <- subset(test_data, gender == "female")
auc_male <- calculate_auc(male_data$label, male_data$prediction_score)
auc_female <- calculate_auc(female_data$label, female_data$prediction_score)
# 比较差异
print(paste("整体 AUC:", overall_auc))
print(paste("男性 AUC:", auc_male))
print(paste("女性 AUC:", auc_female))
# 可以进一步计算和比较TPR、FPR等指标
通过这样的分析,我们可能会发现模型在不同性别、年龄或贷款用途的群体间存在性能差异。识别这些偏差是确保机器学习模型在公共政策等领域公平、负责任地使用的第一步。
总结与核心要点 🎯

本节课中,我们一起学习了机器学习模型偏差评估的完整流程。
我们从定义机器学习模型开始,将其理解为一个带有参数θ的函数 F_θ(X)。接着,我们探讨了如何使用训练集/测试集划分、混淆矩阵、真正率(TPR)、假正率(FPR)以及ROC曲线和AUC等指标来评估模型性能。最后,我们深入学习了切片分析这一核心技术,它通过将数据按敏感属性分组并比较组间性能差异,来审计模型中的算法偏差。

核心要点在于:一个模型的整体性能优秀,并不代表它对所有人群都公平。在公共部门或任何具有社会影响的领域应用机器学习时,进行系统的偏差评估是至关重要的伦理和实践要求。切片分析为我们提供了一套实用的工具来揭示和度量这种偏差。
13:偏差检测与缓解方法 🧐

在本节课中,我们将学习如何检测机器学习算法中的偏差。算法偏差是现实世界和政策问题中一个关键议题,它可能导致不公平的结果。我们将探讨两种主要的偏差检测技术:切片分析和相关性能指标,并简要了解缓解偏差的常见方法。

什么是算法偏差?⚖️
算法偏差有时被定义为计算机系统中系统性且可重复的错误,这些错误会产生不公平的结果。例如,算法可能以不同于其设计初衷的方式,优先对待某一类别。
在我们的模型中,这可能意味着它会以非预期的方式,系统性地优待或歧视特定年龄、性别或其他特征的申请者群体。这显然是不可取的。机器学习领域正在积极开发技术来审计模型的这种偏差,并在检测到后尝试缓解它。
切片分析:检测偏差的核心技术 🔍
上一节我们介绍了算法偏差的概念,本节中我们来看看如何检测它。一种核心方法称为切片分析。其思想很简单:我们本质上沿着人口统计学的界线切分我们的测试数据集,以观察不同的人群切片。
我们会评估模型在这些切片上的性能,并进行比较,以查看模型的性能在这些不同的群体或数据切片之间是否存在系统性差异。接下来我们将具体操作。
以下是进行切片分析的两个关键步骤:
- 根据敏感属性(如年龄、性别)将数据分成不同的子组。
- 分别计算并比较模型在各子组上的性能指标。
偏差检测指标(全):准确率差异
我们可以使用多种指标来比较模型在不同群体间的预测性能差异。其中一个指标是准确率差异。顾名思义,它就是比较不同群体间准确率的差异。
例如,我创建了一个变量来衡量申请者年龄是否大于等于30岁,并比较了这两个群体的准确率。
对于年龄大于30岁的个体,模型的准确率比年龄小于30岁的个体高出10%。因此,我们的模型显示出明显的准确率差异证据,这里的准确率差异正好是10%。
根据该模型的用途以及对不同群体性能可能存在的限制,这在模型部署中可能是一个潜在问题。
偏差检测指标(二):ROC曲线间面积(ABROCA)

上一节我们看到了在特定阈值下的性能差异,本节中我们来看看一个更全面的指标。另一种测量算法偏差的方法是切分数据,分别绘制每个群体的ROC曲线,并测量它们之间的差异。
我们可以使用一个名为绝对ROC曲线间面积的指标来实现,简称ABROCA。ABROCA的绘制方法是:为数据中的两个或多个群体分别绘制ROC曲线,并测量这些曲线之间的面积(如下图中阴影部分所示)。
随着该面积变大,我们的模型显示出群体间越来越大的性能差异,我们可能将此视为算法偏差或群体间性能差异更大的证据。
同样,我们的模型似乎显示出性能差异的证据:对于主要群体(年龄大于等于30岁的个体),他们的曲线(此处为红色曲线)更高且更靠左;而对于年轻的贷款申请者(蓝色曲线),曲线更低,表明模型在测试数据上的预测性能稍差。
如何选择偏差检测指标?📊
以上只是我们可能用于切片分析的两个指标示例。
我们可能选择使用准确率差异,特别是当我们的模型希望在特定阈值下具有低算法偏差时。在我们的案例中,用于决定个体预测属于高风险还是低风险的阈值是预测分数是否高于0.5。
相比之下,我们可能使用ABROCA,当我们希望拥有一个在所有分类阈值上都具有低算法偏差的分类器时。也就是说,不仅是在预测高风险概率大于或小于50%时,而且在我们希望模型对于非常高风险和非常低风险的预测都能良好校准时。
当我们希望模型即使在不平衡数据集上也能有良好表现时,也可能选择使用ABROCA。
核心要点总结 ✨
除了准确率差异或ABROCA,我想强调正确的评估指标始终取决于上下文。因此,从数据收集到部署,参与模型开发的你和其他每个人都有责任确保使用适当的指标来评估模型的偏差,而上述只是众多可考虑选项中的两个。
本节课中我们一起学习了以下关键要点:
- 机器学习模型是我们为了根据过去观察数据进行预测而估计的数学工具。在这个过程中,算法偏差可能出现,我们将其定义为群体以非预期的方式受到系统性不同对待。
- 检查我们的模型是否存在这种偏差非常重要,特别是要使用能反映我们特定任务以及构成该任务公平模型标准的适当偏差指标来进行检查。
- 我们讨论了几种在特定情况下可能选择使用的指标,包括准确率差异和ABROCA。但我希望你能更深入地探索机器学习和这个新兴领域的文献,以确保为你问题选择的方法能反映该任务的偏差考量。
关于偏差的深度讨论与缓解方法 💡
Josh,感谢你对机器学习中偏差问题的精彩介绍。当想到偏差时,尤其是身处一所公立大学的信息学院,我们对此思考很多,关于算法偏差的讨论也很多。我脑海中常浮现的一个问题是:程度——多少偏差算过多? 你在讲座中多次提到一个非常重要的观点:这取决于你的问题和具体情境。
这是一个非常具有挑战性的问题。就了解“可接受的偏差程度”而言,我非常不愿意给出任何建议,因为这确实很大程度上取决于我们正在解决什么问题、它可能如何影响将与模型交互或被其预测的个体,并且它也可能反映模型所用政策背景下的法律环境等因素。我认为这是每个人现在都在努力解决的问题,并且随着机器学习模型被部署到越来越多的任务中,这个问题变得越来越紧迫。
这关联到你的第二个问题:当我们观察到这些类型的偏差时,如何缓解它们? 实际上,有一个相当长时间的完整文献,特别是在教育领域,可以追溯到几十年前,研究如何测量教育测试中的偏差等。即使在过去的十年里,机器学习领域也真正聚焦于这个问题。
关于如何消除模型中的偏差,有几种技术可以做到这一点。它们通常分为以下三类:
- 预处理:通常试图通过消除敏感属性与数据其余部分之间的关联来使数据公平。它会在你训练模型之前实际更改你的数据,以尝试从中消除偏差。
- 处理中:尝试改变机器学习模型的学习过程,以确保模型以更公平的方式进行参数估计,从而做出的预测与你想要消除偏差的敏感属性关联更小。
- 后处理:可能采用一个训练好的模型,并以随机(如随机化)或确定性的方式改变其预测,使这些预测的偏差更小。
这只是用于此目的的三种主要技术家族,每个类别下都有许多具体方法。我认为这是机器学习研究中一个重要且新兴的领域,也是另一个需要谨慎选择所用工具并了解其可能影响的领域。
另一个我认为非常有趣的问题,尤其是在观察ABROCA曲线时会出现,那就是:当你测量偏差并且只使用这些单个指标之一时,它不一定告诉你哪个群体正在受到歧视,或者你的准确率在哪里变化、如何变化。然后,你总是必须将其转化为实际问题:我们实际预测的是什么?我们看到一些工作表明,在某些阈值下,两个群体之间可能存在相当大的差距,而在其他阈值下,这种差距实际上可能扭转甚至翻转。这两者都是偏差的证据,但其中一些可能更多地与历史上对某一群体的偏见有关,而另一些则可能无关。这给试图理解这一点并试图从中制定公共政策的决策者和领导者带来了很多问题。我认为我们才刚刚开始弄清楚如何做到这一点。
这些都是具有挑战性的问题,确实需要多元化的视角来解决——从我所在的计算机科学和工程领域,到我希望许多学生将继续成长的政策领域。我认为,这就是为什么通过R和本课程向新朋友介绍这一点如此令人兴奋的部分原因。我真的很鼓励学习本课程的朋友参与对话,并在他们处理的任务和我们的工作中开启这些对话。



本节课中,我们一起探讨了机器学习算法偏差的定义、两种重要的检测技术(切片分析、准确率差异与ABROCA),并简要了解了缓解偏差的预处理、处理中和后处理三类方法。理解并应对算法偏差对于构建公平、可信的机器学习系统至关重要。
14:切片法测量模型偏差 📊


在本节课中,我们将学习如何使用切片分析法来检测和评估预测模型中的偏差。我们将通过一个真实的研究案例,探讨如何通过比较不同人口统计群体(如性别)的模型性能曲线,来识别模型可能存在的系统性偏差。

今天,华盛顿大学的博士候选人乔希·加德纳再次加入我们。乔希和我曾合作进行研究。正如我可能在课程中提到的,我的研究领域是学习分析。我关注人们如何学习,我们如何预测他们是否会学习或可能存在哪些不足,以及我们如何对此进行干预。
这项研究在2019年的学习分析会议上获得了最佳论文奖。乔希是主要作者,我和宾夕法尼亚大学的同事瑞安·贝克是合作者。乔希,再次感谢你的加入。很高兴来到这里,也很高兴讨论我们的工作。这项工作的特别之处在于,它分析了密歇根大学慕课的数据,这正是现在学习本课程的学生类型。事实上,已有数百万学生在Coursera等平台上在线学习我们的课程。这为我们提供了一个巨大的机会,以前所未有的规模尝试理解全球学习情况。在慕课领域,我们感兴趣的一个预测目标是所谓的“辍学率”或“完成率”。因此,在这项工作中,我们实际上查看了许多不同的课程,以了解是否能建立一个好的慕课辍学预测模型,以及该模型在不同人口统计特征上是否存在偏差。


理解ROC曲线与切片分析 📈
上一节我们介绍了研究背景,本节中我们来看看具体的分析结果。论文中有一张很好的图表,该论文是开放获取的,链接在课程资料中。这张图表展示了我们的度量指标——AUC(ROC曲线下面积),并比较了两个不同“切片”的结果。需要提醒的是,这是一种切片分析。我们选取感兴趣的类别(在本例中是人口统计特征,具体是性别,分为男性和女性),并绘制这两条曲线。乔希,也许你可以为我们解读一下这里的图表结果。

对于好奇的学生,我们在课程中关于机器学习的公平性与偏差的讲座里,对这些绘制的曲线背景有更详细的介绍。我们看到的图表是每组一条线,但每条线显示的是相同的信息。具体来说,它展示了当我们改变预测的阈值时,模型在该组个体数据上的真正率和假正率。
模型会预测一个介于0到1之间的分数,可以将其视为模型估计个体不会完成课程的概率。当我们改变用于判定“完成者”或“未完成者”的阈值时,随着我们在0到1之间应用不同的预测截断点,就形成了这条曲线。
这条曲线被称为受试者工作特征曲线。我们通常使用其下方的面积(AUC)作为衡量模型质量的指标。


但如图所示,我们还可以为每个组单独创建曲线,并观察它们之间的差距。这告诉我们模型对这两个组的预测质量是否存在差异,即模型有多大可能正确分配一个反映个体真实完成状态的分数。当这两条组间曲线相距越远,就表明我们的模型可能在两个组之间的预测质量上表现出系统性的差异,我们可能将其解释为算法偏差的证据。
乔希,在这个例子中,实际上所有ROC曲线的例子都是,曲线越贴近左上角(即假正率为0,真正率为1),就代表模型拟合得越好。我们在这里看到了一个非常有趣的差异,因为有一条红线明显更接近(或至少在一定程度上更接近)那个理想的左上角位置,这表明它是一个更好的模型。而蓝线相比之下则表现不足。所以在这个例子中,针对男性的模型比针对女性的模型更好,对吗?
是的。同样重要的是要记住,我们这里只有一个模型,我们正在观察它在两个独立子群体或人口“切片”上的表现,这就是为什么我们称之为切片分析。我认为这是一个现实世界中发生的例子,许多预测模型都存在这种情况:模型对某一群体的效果明显优于另一群体,或者对两个不同群体的预测存在系统性差异,并且恰好对某一群体更有利。如果我们从未选择以这种方式分解模型的性能并分别查看这些曲线,我们可能完全意识不到这些预测中的系统性差异。因此,我认为这说明了为什么在机器学习模型生命周期的每个阶段(从探索、调优到可能部署用于实际任务时)进行审计或检查都很重要。

跨课程与模型类型的偏差分析 🔍
上一节我们通过一个具体课程的例子看到了偏差的存在,本节中我们来看看如何将这种分析扩展到更广泛的场景。我认为这个模型很有趣。我们专门针对一门商业课程运行了这个分析。但密歇根大学慕课组合的一个有趣之处在于,我们实际上提供了大量不同的课程,再次面向数百万学习者。因此,我们也开始将这种曲线分析应用于许多不同的课程。你能为我们讲解一下如何理解这些结果吗?如果我们必须查看数百条这样的曲线,可能会有点让人不知所措。我知道在撰写这篇论文时,我也在深入研究。那么,我们可以做些什么来审视一个更大的课程组合,看看我们的模型是否存在任何偏差趋势?
我认为这指出了为什么这些度量指标通常很有用。当然,将模型的偏差或预测准确性提炼成一个数字有点简化主义。但它也有好处,因为它允许我们可能跨许多不同的课程、子群体或模型来比较这个指标。这正是我们接下来所做的分析:研究课程人口的不同特征如何与这种算法偏差度量(AUC差异)相关联。我们发现,偏差度量与课程人口特征(特别是课程中自认为男性的学生百分比)之间存在一些明确的系统性关系证据。
总的来说,我们发现,随着课程向男性学生倾斜变得更加不平衡,差异趋于增加。同样,当课程向男性学生比例低得多的方向变得不平衡时,偏差也趋于增加。换句话说,当课程在两个群体之间更加平衡时,偏差往往最低;但当更多人来自某一个子群体时,模型可能自然地倾向于对这些群体效果更好。我认为这是我们在现实世界机器学习模型中常见的现象:数据中谁被代表会影响模型对这些群体的质量。

AUC统计量的另一个我非常喜欢的地方是,你可以比较不同类型的预测模型。在过去的10到15年里,构建预测模型的机会和方法呈爆炸式增长,出现了许多不同的技术,包括深度学习技术、经典贝叶斯技术、决策树等等。我们在这项工作中所做的一件事是,实际上研究了不同的建模技术如何与偏差相关联,以及它们可能产生不同的ROC曲线。也许我们可以看一下那张图并讨论一下。

我认为这触及了一个非常有趣的问题,克里斯,当你的学生更深入地探索机器学习领域时,他们会遇到这个问题。这在机器学习文献中有时被称为偏差-方差权衡。
具体来说,我想在这里指出的是,随着我们的模型对数据中的个体特征及其相互关系变得更加敏感,它们可能捕捉到更微妙的关系,并能够产生更准确的预测。但同时,这些更敏感的算法也可能更容易受到更大的算法偏差的影响,并捕捉到我们实际上不希望它们敏感的那些关联。

很难理清其中一些效应。但在我们的工作中,我们发现这些更复杂、更灵活的基于深度学习的模型(例如一种称为长短期记忆网络或LSTM的模型)确实倾向于获得更好的预测性能,但组间差距(以AUC差异衡量)也更大。相比之下,一些更简单的方法(如你提到的称为朴素贝叶斯的经典贝叶斯技术)往往预测质量较低,但组间差距也较小。这指示了我们在现实世界中选择用于特定问题的模型时,经常需要考虑的一些权衡。
我认为很多工作(过去15年教育领域、教育数据挖掘和学习分析领域的工作确实如此)倾向于寻找一个准确的模型,并进行一些模型比较,关注准确性或其他预测性能指标。但正如你在这里展示的,还有一个公平性因素需要我们讨论和审视。因此,我认为这种AUC差异度量,以及描述它的这些曲线,对于理解我们应该使用哪种模型非常强大——不一定哪个是“最好”的,因为“最好”有不同的维度,而是我们可能希望在这样一个平台上实际部署哪一个。
我同意。克里斯,我还想强调,如果学生好奇想看看这篇论文,他们会发现关于这些模型使用方式的一些具体细节,这些细节让我们相信AUC差异是评估慕课模型偏差的好方法。但是,外面也有很多不同类型的问题和许多不同的方法来衡量算法偏差。这取决于建模者和参与机器学习建模过程的每个人,以确保他们选择的度量标准适合他们正在处理的问题。因此,我也鼓励学生思考,对于他们正在分析的问题,这是否是一个合适的偏差度量标准,并探索其他可能更合适的度量方法,这取决于他们处理的问题。
乔希,再次感谢你加入我,分享更多关于机器学习偏差主题的信息,并分享这项获奖工作。对于学生们,如果你们感兴趣,这篇论文的链接在课程资料中,请随时查看并讨论。这是一个很棒的讨论。谢谢你邀请我,克里斯。
总结 📝



本节课中我们一起学习了如何使用切片分析法来检测预测模型中的偏差。我们通过一个慕课辍学预测的实际案例,理解了如何通过绘制和比较不同人口统计群体(如性别)的ROC曲线来识别模型性能的系统性差异。我们还探讨了课程人口构成如何影响模型偏差,以及不同复杂度的模型(如LSTM与朴素贝叶斯)在预测准确性和公平性之间存在的权衡关系。最后,我们强调了根据具体问题选择合适的偏差度量标准的重要性。
15:政策分析常见伦理问题 🧭


在本节课中,我们将要学习公共部门政策与数据分析中常见的伦理挑战。这些挑战通常源于分析师在平衡伦理实践与政治压力时所面临的困境。我们将探讨分析师角色的不同视角,以及这些视角如何影响其忠诚度和处理价值权衡的方式。
分析师角色的三种视角 🔍



正如我们之前所讨论的,政治是公共部门决策中一个正常但充满挑战的部分。对于数据和政策分析师而言,许多挑战源于对分析师角色及分析过程的不同看法。以下是分析师在决策过程中的三种普遍但不同的角色视角。
1. 客观技术专家
这种观点认为,数据分析师的主要关注点在于分析的完整性、对良好分析实践的遵守以及客观性。最终,数据和结果应能自我说明。高质量、客观且技术可靠的分析工作是最重要的。


- 核心公式:
高质量分析 = 完整性 + 遵守规范 + 客观性 - 对客户/上司的态度:上司或客户是必要的,但在实际工作中应保持距离,以防止他们影响过程或结果。
2. 上司/客户倡导者
在这种观点下,数据分析师是其直接上司或特定客户(如部门领导、立法者、民选官员等)的倡导者。最佳的分析结果是对上司或客户最有利的结果。


- 核心动机:分析师对上司或客户负有责任甚至忠诚,这不仅关乎工作安全,也关乎获取政治权力和影响力。
- 潜在影响:这并不意味着分析师会捏造结果或使用糟糕的分析方法,但确实意味着存在利用分析模糊性的压力,也可能涉及不发布结果、声称结果不确定或仅呈现部分结果。
3. 议题倡导者
这种观点认为,分析师更像是当前社会或政策议题的倡导者。分析师的工作动机是利用数据分析来推动特定关切领域(如公共卫生、教育、国家安全、气候变化等)的改进。


- 核心动机:分析工作为分析师强烈关注的议题提供了推动进展和倡导的机会。分析师有动力去产出能服务于倡导和积极政策变革等最终目标的结果。
- 潜在影响:由于焦点更在于最终结果而非分析工作本身,这种视角也增加了利用模糊性的动机,并可能涉及不发布或压制结果。
不同视角下的价值权衡 ⚖️
上一节我们介绍了分析师角色的三种不同视角,本节中我们来看看这些视角如何影响对“良好分析工作”的价值判断。这三种视角对价值构成和权衡的看法有所不同。
对于客观技术专家而言,这类分析师能够且应该根据核心价值,识别不同政策选项中的重要价值及其权衡。然而,他们不提出建议,事实上对此感到不适,他们只希望数据和结果自己说话。


对于上司/客户倡导者,分析师与上司或团队成员之间通常对工作的最优影响存在一套共享的价值观。这使得团队能够识别价值权衡,并在考虑更大政治环境的情况下提出建议。
对于议题倡导者,最强烈的价值观是那些与议题领域内被视为“良好”的、基于价值的进展相一致的价值观。分析被视为一种工具,有助于推动实现针对特定议题或社会问题的、基于价值的未来愿景。

从事政策和数据分析工作的个人,在其职业生涯中可能会发现自己扮演过所有这些角色。无论在哪种角色中,都绝对应该尽力完成高质量、客观的工作。这些不同观点都不意味着目标应该是使用草率的技术、误导性的分析或数据可视化。
客观性与中立性的重要区别 🎯
这里需要强调一个重要区别:保持客观与保持中立不是一回事。
- 保持客观意味着诚实、使用最佳的分析和科学实践、尽可能避免偏见、揭示有问题的数据问题、强调注意事项并解释结果。作为数据分析师,我们应始终努力做到客观。
- 保持中立则是另一回事,它意味着对结果揭示的内容不持观点,不基于结果参与提出建议或推动某些决策。


关键在于,参与提出建议并不意味着你在分析中不客观。你可以是客观的,但对一个客观分析的结果并不保持中立。

常见的伦理冲突与价值困境 ⚠️
政策分析领域的权威学者韦默和维宁指出,政策与数据分析师最常见的伦理冲突,是对客户或议题的责任与其他价值观之间的冲突。在面临此类冲突时,可能使分析师伦理判断复杂化的因素包括:当前及未来的就业状况、持续接触某个政策议题或感兴趣环境的机会、对上司或客户的忠诚度,以及个人声誉。
以下是分析师面临的最常见的价值冲突:
- 对预设结果的要求:客户或上司要求在进行分析之前就得出某个特定结果(例如,“能否运行一些数据来证明X?”)。
- 对结果的故意曲解:在数据可视化、新闻稿、仪表板或网站上故意错误呈现或解释结果。
- 压制或隐藏结果:压制或隐藏不支持某种叙事或期望建议的全部或部分结果。
- 建议与分析结果不符:提出的建议与数据分析的实际结果不匹配。

总结 📝




本节课中我们一起学习了公共部门政策分析中常见的伦理问题。我们探讨了数据分析师的三种不同角色视角(客观技术专家、上司/客户倡导者、议题倡导者),理解了它们如何影响分析工作的价值取向和潜在伦理困境。我们明确了客观性与中立性的关键区别,并列举了实践中常见的价值冲突,如要求预设结果、曲解或压制结果等。认识到这些挑战是应对它们的第一步。在下一节中,我们将讨论当面临此类伦理困境时可以且应该采取的措施。
16:职业伦理:应对挑战的策略 🛡️


在本节课中,我们将学习当数据分析师在公共部门工作中面临无法控制的伦理挑战时,可以采取哪些通用应对策略。我们将探讨从表达关切到最终采取行动的多种选择。
概述
上一节我们讨论了公共部门数据分析中常见的伦理挑战。本节中,我们来看看当您发现自己面临此类挑战时,可以采取哪些具体的应对策略。
声誉的重要性
首先,请记住,作为一名遵循最佳实践、工作值得信赖的优秀数据分析师,您的声誉至关重要。只需一次参与产出误导性或欺骗性结果、隐瞒特定发现或在解读上误导他人的团队工作,就足以毁掉您的声誉。因此,您需要非常谨慎。
核心应对策略
您确实拥有一些选择。其中一个选项是违背您的伦理标准,继续完成工作。当然,我建议您不要这样做,但这确实是一个选项。
让我们聚焦于您的其他选项,这些选项展示在下面的维恩图中。该图略显复杂,我将为您逐步讲解。


总的来说,您有三个初始选项,由图中的三个大圆圈表示。您的三个选项是:发声、退出或不忠。
- 发声:意味着向您的上司或指示您进行不道德行为的人表达或沟通您的关切。您可以提出异议并解释原因,就此进行对话。因此,首先要做的是表达关切。
- 退出:意味着离开或退出项目,或者完全辞去工作,而不是应对这些伦理挑战带来的压力。
- 不忠:意味着按照您的伦理指引行事,而不是按照要求去做。不制作糟糕的可视化图表,不产出误导性结果,做与给您带来伦理挑战的要求相反的事。
首选策略:发声
再次强烈建议您从某种形式的“发声”开始。您应该能够自如地阐述您的关切及其背后的原因。您可能会说服团队中的其他人,他们可能未曾考虑过这一点,并可能转而理解您的立场。

以下是关于如何有效“发声”的建议:

- 亲自表达关切,而非书面形式。但如果您要与上司会面,可以准备一些笔记。
- 更多地以对团队和组织的风险与不利影响来表达关切,而非针对您个人。不要将其表述为“您的伦理原则受到挑战”,而应表述为“这些是指导我们工作的伦理原则”。
策略的组合与升级

在表达关切时,您可以持续坚持您的关切。如果表达关切后没有回应,您的下一步可以是以退出或辞职相威胁来表达关切,这被称为发出最后通牒。您可以在“发声”和“退出”圆圈重叠的区域看到这一点。
如果您担心表达关切会导致您被解雇,而您宁愿辞职也不愿被解雇,那么您可以不发声直接退出。
然而,在退出时您可能也有选择。您可以安静地辞职,不公开表态或做任何其他事情。
现在,让我们引入“不忠”这个圆圈。您可以首先发出最后通牒,表示如果某项工作以不道德的方式进行,您将辞职,然后在辞职时披露此事。向记者或您政府组织内的更高权威披露所发生的情况。这样,您既在退出,也在进行不忠行为。这里的“不忠”意味着您再次违背了被要求做的事,并且是以一种公开的方式。


您还可以进行破坏,这意味着成为告密者。在这种情况下,您不会向任何人表达关切,也不会辞职,而是秘密地、匿名地将您的关切报告给某种监督机构、人力资源部门或比您直属上司更高权威的人。
您也可以在内部表达关切,同时匿名地将有关问题的信息泄露给媒体或团队外部的某个机构或个人。
当然,正如您所看到的,这些不同的圆圈以各种方式和组合重叠,对于“发声”、“退出”和“破坏”这些基本行动,存在许多可能的排列组合。
如果您同时做三件事:表达关切、退出组织、并以一种让您的组织蒙羞(即不忠)的方式公开此事,那么您将处于那个勇敢的区域,即所有三个圆圈重叠的区域,被标记为“公开揭露”。
决策考量


当然,无论您选择做什么都取决于您自己,并且将取决于许多因素,每种情况都会有所不同。显然,如果辞职对您来说并非一个真正的选择(对大多数人来说可能都不是),您就不能以辞职相威胁。
我可以告诉您,在我的一生中,我曾三次处于极具挑战性的伦理困境中,以至于我首先表达了关切。当那似乎无济于事后,我发出了退出项目的最后通牒。我还曾有一次威胁要退出并公开此事。我碰巧认识一些大报社的记者,我分享了这对我来说是一个如此成问题的伦理困境,我认为我不能参与其中,并且公众也应该知道。
我不会分享细节,但建议是,这些是我一生中压力最大的经历之一。因此,我希望您永远不会面临需要您做更多事情而不仅仅是表达关切的伦理挑战。
总结


本节课中,我们一起学习了当面对公共部门数据分析工作中的伦理挑战时,数据分析师可以采取的多种应对策略。我们介绍了以“发声”作为首选步骤的重要性,探讨了“发声”、“退出”和“不忠”这三种核心策略,并分析了它们之间可能组合形成的更复杂行动,如发出最后通牒或成为告密者。最终的选择取决于个人处境,但维护职业声誉和伦理底线至关重要。
17:职业伦理应对挑战实例 🧭


在本节课中,我们将通过一个具体案例,探讨数据分析师在职业生涯中可能遇到的伦理挑战,并思考如何应对。我们将以智慧城市中的人脸识别技术应用为背景,分析其中涉及的伦理问题,并讨论当你的专业意见与上级要求冲突时,可以采取的行动方案。
智慧城市与人脸识别技术背景
上一节我们介绍了职业伦理挑战的普遍性,本节中我们来看看一个具体的应用场景:智慧城市中的人脸识别技术。

首先,什么是智慧城市?智慧城市通常指那些有意利用现代信息和通信技术来推进公共部门目标和公共利益的市政区域。其活动范围广泛,具有一些共同特征。
以下是智慧城市的一些常见特征:
- 基础设施发展:包括物理、制度、社会和经济发展。
- 新的数据收集活动:特别是通过传感器、摄像头、社交媒体和众包。
- 信息系统整合与先进的数据分析技术。
智慧城市倡议的一些常见重点领域包括通信、交通系统、环境质量与可持续性、电子政务以及更安全的社区(尤其侧重于减少犯罪)。其主要目标围绕经济、效率和有效性三大支柱。
然而,智慧城市活动也带来了一系列与公平性相关的担忧,包括隐私、数字不平等,以及这些新活动可能如何加剧与系统性种族主义或制度性歧视相关的现有问题。人脸识别技术就是其中一项引发诸多争议的流行元素。


人脸识别技术的应用与伦理关切
了解了智慧城市的框架后,我们聚焦于其中一项具体技术。人脸识别技术在智慧城市中有多种应用方式。
以下是其主要应用场景:
- 帮助寻找失踪人员,包括失踪儿童、走失的痴呆症患者或自然灾害中的失踪者。
- 识别、抓捕并威慑犯罪行为和罪犯。
- 协助残障人士,提升购物体验等。

与此同时,关于人脸识别技术的伦理关切也相当突出,许多城市已通过法律禁止其使用。

以下是导致这些禁令的主要关切点:
- 算法偏见:几乎所有人脸识别算法都显示出严重的种族准确性偏差,尤其对有色人种,特别是黑人女性。
- 歧视风险:技术中的偏见和不准确可能导致种族及其他形式的歧视。
- 缺乏知情同意:使用该技术时常缺乏知情同意。
- 缺乏透明度:关于其使用及背后目的常缺乏透明度。
- 大规模监控担忧:存在对大规模监控的合理公共担忧,引发隐私侵犯问题。
- 数据泄露风险:存在潜在的数据泄露担忧。

伦理挑战场景模拟
在明确了技术背景和伦理问题后,现在让我们进入一个模拟的职业场景。
假设你是一名数据分析师,就职于一个大城市的规划部门,该部门正在制定智慧城市战略计划。该计划包括增加摄像头监控,通过协助执法部门寻找罪犯来提高安全性。你被要求参与规划过程,负责撰写报告中讨论数据基础设施投资的部分,这些投资用于分析遍布全市的摄像头所捕获的数据。


你撰写了该部分,但指出了用于人脸识别的潜在算法存在的种族和性别公平性问题,以及普遍的隐私担忧。你的上司阅读了你为报告撰写的草案文本,然后告诉你:“请从战略计划中删除所有关于缺点和担忧的内容”,因为该计划将提交给市议会审查和投票。你的上司要求你不要谈论人脸识别算法的偏见或此类技术的其他问题。

那么,你会怎么做?
应对策略与可选方案

面对上司的要求,你需要考虑如何回应。正如之前所讨论的,你有一些选择。通常,你应该从表达你的关切开始,尝试说服你的上司,你认为指出使用人脸识别技术所引发的一些伦理问题很重要。你的上司可能也应该知道许多城市已禁止其使用及原因。希望这就足够了。
但如果这还不够,你需要思考还能做什么。你能自行告知市议会你的担忧吗?你应该与记者交谈吗?你应该与组织中人力资源部门的其他人沟通吗?同样,你有一些选择。在一般情况下,你的可选方案如下。
以下是面对此类伦理指令冲突时,你可以考虑的几个选项:
- 执行指令:按照上司的指示完成分析。
- 表达关切并尝试改变指令:向上司说明伦理担忧,争取修改报告内容。
- 表达关切并以辞职相威胁:如果你对此事感受强烈,这可能是你设定的底线。
- 表达关切并威胁公开或匿名泄露担忧。
- 直接辞职。

提前思考在特定情况下可能采取的行动是有益的。建议你与朋友甚至家人讨论,这可能会揭示你在思考特定伦理情境及如何应对时的一些细微考量。这些情况很棘手,没有绝对正确或错误的答案,但如果你在身临其境之前思考过一些场景,就能准备得更充分一些。
总结



本节课中,我们一起学习了如何在一个具体的智慧城市人脸识别技术应用场景中识别伦理挑战。我们分析了该技术带来的公平性、隐私和歧视风险,并通过一个模拟的职业困境,探讨了数据分析师在面对上级不当指令时可以采取的一系列应对策略,从沟通说服到更坚决的行动。提前思考并准备应对方案,能帮助我们在实际工作中更好地坚守职业伦理。
18:威斯康星癌症分期系统案例研究 📊

在本节课中,我们将通过一个真实的案例研究,探讨公共部门数据分析中可能遇到的典型挑战。这个案例发生在我职业生涯早期,当时我在威斯康星州担任流行病学家。我们将看到,即使意图良好,数据问题、沟通障碍和组织结构也可能导致公共资源的错误配置。

案例背景 🏛️
上一节我们介绍了案例的背景,本节中我们来看看具体的事件经过。

当时,我主要从事关于乳腺癌的数据分析工作,为州立法机构提供大量信息。一天早上,我在报纸上读到,威斯康星州的立法者刚刚投票通过了一项新法律。这项法律旨在创建一个由行政部门实施的新管理项目。
这个项目将为农村地区提供移动乳腺X光摄影服务。乳腺X光摄影是一种放射成像技术,用于检测其他方式难以发现的早期乳腺癌。

这项新立法特别点名了该州晚期乳腺癌诊断率最高的12个县,计划为这些地区提供移动服务。因为在这些地区,癌症的治疗预后通常较差。
发现问题 🔍

立法机构希望实施一项新的公共卫生项目来解决一个严重问题,这本身是好消息。然而,坏消息是,当我看到被点名的县名单时,我立刻意识到出了一个错误。
在此之前,我已经收集和分析有关乳腺X光摄影使用和癌症诊断分期的数据超过一年。我知道,名单上的大多数县实际上拥有最高的乳腺X光筛查率和最低的晚期诊断率。
我重新运行了一些分析以确认我的怀疑。结果证实,新法律确实点错了县。在这个项目中,12个被点名的县里有10个是错误的。
问题根源:数据与沟通 🗣️
总的来说,发生的是一个数据问题。让我来解释一下。
在立法部门,许多律师负责为立法者起草法案。在起草这项立法时,一位律师要求提供关于乳腺癌诊断分期的县级具体数据,但他没有告诉分析师他为何需要这些信息。

因此,分析完成了,结果也共享了,但没有任何关于结果解读的帮助,也没有与我或其他可能提供帮助的专家进行任何讨论。
在许多州,法律规定行政部门的人员未经邀请不得主动联系立法部门,当然也不能对可能的新法律或新政策发表意见。因此,政府不同分支之间有时存在所谓的“防火墙”,这很常见。
但由于这种沟通的缺乏,立法部门的人员并不理解数据背后发生了什么。

数据系统的具体问题 💻

以下是导致数据问题的具体技术细节。
威斯康星州中部有一个优秀的医疗系统,它为其服务的农村县(主要是州中部往北以及州北部东西向的广大农村地区)的女性进行了大量的乳腺X光筛查教育和推广。我知道来自其他数据,该系统的乳腺X光筛查率是全州最高的之一。
此外,这个优秀的医疗系统在其数据系统中使用了一种复杂的方法来记录诊断时的癌症分期,即 TNM系统(肿瘤、淋巴结、转移系统)。

然而,州癌症登记系统对于“诊断分期”这个变量使用了一种简单得多的格式。不幸的是,当这个医疗系统依法向州里报告数据时,这两种分期系统未能正确合并。

这两种数据系统对于晚期诊断的癌症病例沟通良好。然而,对于早期阶段,这个表示诊断分期的变量在两种格式下未能很好地对接。这导致州系统错误地将这个大型农村医疗系统的大部分早期诊断病例标记为数据缺失。
案例中的挑战总结 ⚠️

让我们回顾一下这个案例中的挑战。
以下是本案例中遇到的主要挑战类型:

- 组织挑战:包括政府分支之间有效沟通的障碍。这很常见。
- 数据系统挑战:包括链接或协调来自私人和公共来源的数据。这也很常见。在这个特定案例中,数据链接问题产生了大量缺失数据,进而导致了有偏见和不准确的结果。在解读分析结果时,理解缺失数据始终很重要。
- 政治挑战:在公共部门进行数据分析时,这些挑战同样常见。在这个案例中,一个挑战是最了解数据的人(包括我自己)处于不同的“孤岛”中,没有被纳入起草新立法的机密过程。另一个挑战是,当我将错误提请我的上司和其他领导注意时,他们决定保持沉默并保密。因为纠正错误会让起草并推动该法案快速通过立法程序的立法者感到尴尬(这种快速通过并不典型),也可能让行政部门中进行了有缺陷分析却未被发现的员工感到尴尬。
因此,这个案例非常不幸的最终结果是:公共资源被使用了三年,直到后来该项目重新授权时才正确点名了县。这些资源被用于启动一个无法满足我们之前讨论过的公共利益的四大支柱(经济、效率、效能、公平)的项目。
经验教训与总结 📝


本节课中我们一起学习了这个案例的始末。那么,这个案例研究对你作为一名成长中的分析师有哪些启示呢?
以下是你可以汲取的一些关键经验:
- 明确分析需求:当被要求进行分析时,务必弄清楚是谁需要、为什么需要、试图回答什么问题以及用于什么目的。
- 协助解读结果:确保尽你所能帮助解读结果,特别是关于任何可能由缺失数据、数据链接或其他数据问题引起的偏见或问题。
我必须说,这是我职业生涯早期一次令人难过但大开眼界的经历。我再次与你分享这个故事,不是因为它非常不寻常,当然也不是为了批评我当年共事过的任何人,而是因为它揭示了在公共部门进行重要数据分析工作时一些非常常见的挑战。



通过这个案例,我们看到了清晰沟通、理解数据局限性和跨部门协作对于确保数据分析真正服务于公共利益是多么重要。
19:墨西哥贫困人口养老金案例(第一部分)📊


概述
在本节课中,我们将学习一个关于墨西哥农村老年人养老金政策的真实案例研究。我们将了解政策分析的背景、步骤,以及如何运用数据分析来支持决策。这个案例将综合运用我们之前学到的关于数据在公共部门中的作用、政策分析和数据可视化的知识。
案例背景介绍

我是Paula Lance教授。今天,我很高兴向大家介绍一个案例研究。Brooks教授和我认为,这个案例能将本系列课程的所有内容融会贯通。在本系列中,我们一直在讨论数据及数据分析在公共部门的重要作用,包括它如何帮助决策者、各类政策分析的重要角色、数据可视化及其他数据分析方法的关键作用,以及它如何切实影响政府的重要工作。
因此,我们为您准备了一个案例研究。我将解释其背景,然后我们会讨论相关的作业。稍后您也会收到书面的作业说明。
这个案例研究涉及一项重要的社会福利政策议题。同时,您将置身于一个需要在时间压力下进行政策方案分析的场景,这无疑是现实世界的写照。
场景设定



场景设定是:您作为一名数据分析师,在一个团队中工作,该团队服务于墨西哥总规划部副部长。我们将时间倒回2006年。需要说明的是,这是一个真实世界的场景,本案例中讨论的事情确实发生过。
在2006年的墨西哥,一项针对墨西哥农村老年人的新扶贫计划被提交给国会,并且国会批准了该计划。然而,在该计划通过立法程序的过程中,并没有确定谁有资格参与该计划的具体标准。
问题背景
以下是更多背景信息。此前,总统及其政党曾因墨西哥的另一项扶贫计划而受到批评。那是一项在墨西哥城实施的全民养老金计划。在该计划中,所有被定义为70岁及以上的老年人都开始领取养老金。但人们担心,一些并不贫困的人也在用公共资金领取这份养老金,而他们并不需要。这似乎效率不高,尤其是在目标是解决贫困问题时。
因此,一项新的计划被提出,旨在更侧重于农村老年人,并再次致力于减少贫困。总统Calderón要求您所服务的规划部长提交资格标准,以确保养老金发放给有需要的老年人。


您的团队被指派进行一项政策方案分析。这里的政策议题是:确定这项新计划的资格标准。分析工作还包括提出建议,并且截止日期是明天。朋友们,这在现实中并不少见,这种情况经常发生。
正如我提到的,总统的预算案即将通过,但相关人士表示,只要知道标准是什么,就会为此拨款。
政策分析步骤
请记住经典政策方案分析的步骤。


第一步,明确要解决的问题。我们必须定义问题并获取一些细节。
第二步,确定一些备选政策。在本案例中,即确定谁有资格获得这项新养老金的不同标准设定方式。
第三步,确定用于评估政策变化或方案的标准。
第四步,使用一套明确的标准,分析和比较不同的政策方案。
第五步,将信息清晰地传达给决策者。
第一步:问题定义与背景
那么,第一步,2006年墨西哥的背景是什么?这里有一些关于贫困率的数据。很多时候,我们得到的数据并不完全符合我们的期望,但这里我们有一些关于65岁及以上人群贫困率的数据(尽管新政策是针对70岁及以上人群设计的)。我们知道,在墨西哥的城市地区,当时65岁及以上人群的贫困率为35.6%,大约10%的人有可以依赖的养老金。而在农村地区,贫困率更高,2006年时为54.7%,生活在农村地区的老年人中,只有不到1%的人拥有养老金。


因此,我们确实看到墨西哥农村地区的贫困问题更为严重。
现有计划与新计划的关联
这项新提出的计划建立在墨西哥若干现有社会福利计划的基础之上。我希望您还记得我们在讨论项目评估和随机对照试验时提到的墨西哥“机会计划”。对该计划进行了一项随机对照试验,以评估通过向家庭提供有条件现金转移支付(条件是孩子定期上学、家庭成员特别是母亲进行健康诊所访问并获得营养和教育支持)来减少贫困的效果。
这项新计划在一定程度上建立在“机会计划”的基础上,因为“机会计划”关注的是农村社区。对该计划的一个担忧是,它没有针对老年人,也没有降低老年人的贫困率。
预算与时间压力
另一条信息,正如我提到的,这里有一些更详细的细节。2006年12月23日,墨西哥国会批准了2007年预算案。他们决定拨款85亿比索,用于向70岁及以上的老年人提供养老金,目标是解决农村贫困问题。这相当于每月支付约500比索,按美元计算大约是45美元。


然而,预算案并未明确资格标准。该预算案的最终批准,要等到能够明确说明究竟谁将获得这项新养老金之后才能进行。
这就是第一步,有很多背景信息。但这对您理解我们接下来要进行的政策方案分析的更多细节非常重要。
第二步:确定备选政策方案

我们时间紧迫。在本案例中,已经为我们提供了三种关于资格标准的政策方案。
方案一:这正是为什么提到了“机会计划”。第一个方案的标准是,让我们直接将这项新养老金计划的目标人群定为:年龄在70岁及以上,且所在家庭已被确定为有资格参与“机会计划”的个人。这个现金转移支付计划并未真正惠及家庭中的老年人。
方案二:人们说,既然我们的目标是农村地区,那就直接针对墨西哥最小的城镇和村庄。因此,第二个标准是:这项新计划将针对人口少于2500人的农村地区中,年龄在70岁及以上的老年人。

方案三:第三个政策方案,即新养老金计划的资格标准,是使用墨西哥已经建立的一个指标,称为“社会边缘化指数”。墨西哥在当时已经开始使用这个社会边缘化指数,该指数根据医疗保健可及性、教育、住房、供水和卫生设施等方面的数据,将墨西哥每个地区标记为1到5级,范围从低到非常高程度的边缘化。
同样,墨西哥所有地区都已被标记在这个社会边缘化指数量表上。该提案是:利用该量表,针对那些边缘化程度为高或非常高的地区,然后将这些地区的老年人作为新养老金计划的目标人群。
第三步:确定评估标准
好了,我们有了三个政策方案。政策方案分析的下一步是确定我们的分析标准。在本案例中,这也已经提供给我们了。我们不需要花时间去思考我们的标准将是什么,总统已经下达给我们了。
用于比较和对比我们三个政策方案的标准如下:


- 效率:在本案例中,这意味着有需要的人是否将获得养老金?同时,没有需要的人不应获得养老金。因此,目标定位是否精准?
- 财务可行性:您可能记得我提到过预算约束。国会准备批准一项预算,为该计划拨款85亿比索。但我们需要知道,如果使用不同的资格标准,按照该标准,是否有足够的资金满足需求?
- 行政可行性:该标准在后勤和行政上是否易于实施?
- 政治因素:我不指望您了解2006年墨西哥的政治情况,但我们确实需要考虑这一点。这些方案在政治可行性方面是否存在差异?不同的政治派别是否会对此有不同的反对意见,或者他们可能就某种方法达成一致?因此,我们确实需要考虑一些政治因素,特别是因为这是一项需要通过立法机构的事项。
- 伦理影响:不同的政策标准方案会带来什么伦理影响?某个方案对所有受影响者是否公平?您是否认为它可能造成或加剧已经存在的不平等?
总结



本节课中,我们一起学习了墨西哥农村老年人养老金政策案例的第一部分。我们了解了案例的背景、紧迫的时间压力,以及政策分析的前三个关键步骤:明确问题、确定备选方案和设定评估标准。我们看到了三个具体的资格标准方案,以及从效率、财务、行政、政治和伦理五个维度进行评估的框架。在接下来的部分,我们将运用数据分析来比较这些方案,并最终为决策者提供清晰的建议。
20:墨西哥贫困人口养老金案例(第二部分)📊

在本节课中,我们将继续墨西哥贫困人口养老金政策的案例分析,重点进入政策选项分析的第四步:具体分析。我们将学习如何使用“效率”这一核心标准,通过“漏出率”和“覆盖率不足”两个关键指标来量化评估不同的政策选项。
上一节我们介绍了政策分析的前三个步骤,并确定了以“效率”作为核心评估标准。本节中,我们来看看如何对效率进行具体的量化分析。
效率的量化指标
为了评估政策选项的效率,我们引入了两个技术性指标:漏出率和覆盖率不足。以下是这两个指标的具体定义和计算公式。
漏出率
漏出率是衡量公共项目资源是否被非目标群体获取的指标。具体来说,它指的是由于资格要求设置不当,导致不符合条件的非贫困老年人也获得了养老金的情况。

漏出率的计算公式如下:

漏出率 = (项目中非贫困的注册人数) / (项目总注册人数)

覆盖率不足
覆盖率不足则衡量了政策是否遗漏了本应覆盖的目标群体。在本案例中,即指资格要求是否将我们真正希望帮助的贫困农村老年居民排除在外。
覆盖率不足的计算公式如下:
覆盖率不足 = (未注册项目的贫困个体数) / (项目总注册人数)



本节课中我们一起学习了政策分析中效率评估的两个核心量化指标:漏出率和覆盖率不足。通过这两个公式,我们可以将抽象的“效率”概念转化为具体的数据,从而对不同政策选项进行客观比较和评估。
21:墨西哥贫困人口养老金案例(第三部分)📊


在本节课中,我们将学习如何基于政策选项分析的结果,创建数据可视化图表并撰写政策建议。我们将使用墨西哥养老金案例中关于效率和财政可行性的分析数据,来比较三种不同的政策选项。

上一节我们介绍了政策选项分析的初步步骤,本节中我们来看看如何解读分析结果并完成最终的任务。
概述
本节课的任务分为两部分:
- 为政策选项分析的结果创建一个数据可视化图表。
- 撰写一段文字,陈述你推荐的政策选项及其理由。

以下是任务的具体要求:
- 可视化需涵盖效率(漏出率和覆盖率不足率)和财政可行性两个维度的分析结果。
- 推荐段落需基于分析结果,并考虑行政可行性、政治和伦理影响等其他标准。
- 你的成果将分享给团队、上级及其他潜在利益相关者。
政策选项分析结果
我们已为你完成了大部分的数据分析工作。以下是用于比较三种政策选项的关键数据。

效率指标
效率通过两个指标衡量:
- 漏出率:指符合条件但并非贫困的人口比例。公式为:
漏出率 = (非贫困的合格人数 / 总合格人数) * 100% - 覆盖率不足率:指贫困但不符合条件的人口比例。公式为:
覆盖率不足率 = (贫困但未覆盖的人数 / 总贫困人数) * 100%
以下是三种政策选项的效率数据:
| 政策选项 | 漏出率 | 覆盖率不足率 |
|---|---|---|
| 选项1:机会匮乏家庭 | 25.76% | 66.00% |
| 选项2:小规模社区 | 60.53% | 50.00% |
| 选项3:高社会边缘化指数 | 65.00% | 44.00% |
财政可行性指标
该项目的预算设定为85亿比索,年度养老金为600比索。因此,该项目最多可服务的人数为:
最大服务人数 = 总预算 / 年度养老金 = 8,500,000,000 / 600 ≈ 1,416,667人
以下是各选项的预计合格人数与财政可行性的对比:


| 政策选项 | 预计合格人数 | 是否财政可行 |
|---|---|---|
| 选项1:机会匮乏家庭 | 1,200,000人 | 是 |
| 选项2:小规模社区 | 1,100,000人 | 是 |
| 选项3:高社会边缘化指数 | 3,000,000人 | 否 |
由于选项3的预计合格人数远超预算上限,必须设置名额限制。这导致其覆盖率不足率从44%上升至近74%(在分析表中标记为选项3B)。
任务指南
现在,我们来看看如何完成你的最终作业。

第一部分:创建数据可视化



你的第一个任务是利用上述数据创建可视化图表。以下是可供参考的思路:
- 可以使用条形图对比三种选项的漏出率和覆盖率不足率。
- 可以使用散点图或气泡图,将漏出率和覆盖率不足率作为两个坐标轴,用点的大小表示财政可行性。
- 目标是让图表清晰、直观地展示不同选项在效率和财政约束下的权衡关系。
请参阅书面作业说明以获取更详细的指导。
第二部分:撰写政策建议



在创建好可视化图表后,你需要撰写一段文字来提出建议。以下是撰写建议时需要考虑的要点:
- 陈述你的选择:明确推荐选项1、2还是3(或3B)。
- 引用数据支持:使用效率(漏出率、覆盖率不足率)和财政可行性的数据来论证你的选择。
- 考虑其他标准:除了作业要求的两个标准,还需简要提及行政可行性、政治接受度和伦理影响等因素。
- 保持简洁有力:这段文字将用于向决策者汇报,因此需要逻辑清晰、论据充分。
总结
本节课中,我们一起学习了如何基于政策选项分析的结果进行决策支持。你掌握了如何解读效率(漏出率、覆盖率不足率)和财政可行性的数据,并了解了创建数据可视化和撰写政策建议的基本方法。请综合运用在本系列课程中学到的所有技能,在这个模拟的真实政策场景中完成最终任务。




请务必阅读详细的作业说明。最重要的是,享受这个应用所学知识解决实际问题的过程。
22:恭喜获得公共部门数据分析认证 🎉

在本课程中,我们共同完成了公共部门R数据分析认证的学习。现在,让我们一起回顾这段旅程的收获与意义。
课程完成与回顾
恭喜你完成了公共部门R数据分析认证课程。此刻,你或许感到轻松,也可能有些疲惫。但希望你同样感到快乐与自豪,因为你已经掌握了大量关于公共部门、数据分析常见用途以及政府工作的知识。
你学习了许多新术语,了解了不同类型政策分析的方法,也认识到了公共部门数据系统及其工作人员所拥有的力量与伦理责任。
回想一下你在这门课程或专项课程开始时的起点。也许你过去接触过R语言,学习过一些编程知识。但现在,你已经能够处理真实世界的数据集,对它们进行转换和清理。
核心技能掌握
以下是你在本课程中获得的核心技术能力:
- 数据处理:你学会了使用
dplyr及相关库来清理和转换数据。 - 数据可视化:你掌握了使用
ggplot2快速、美观地可视化数据。 - 统计分析:你能够进行基础的推断性统计分析,以判断实验组间是否存在差异。
这些技能的掌握意义重大。请为你所取得的成就感到自豪。😊
课程意义与展望
我们真诚地希望这一系列课程为你打开了公共部门数据分析这一激动人心领域的大门,并向你展示了如何公正地进行从简单到复杂的分析与可视化。所有这些对于政府职能的质量及其目标的实现都至关重要。
我们有意将你的技术技能发展置于公共行政与公共政策的背景之中。这不仅因为背景很重要,也是为了让你在可能参与的项目或团队中,成为知识更渊博、更有价值的成员。正如我们在本专项课程中多次提到的,公共部门的数据分析是一项团队工作。
无论你参与的是国家级分析,还是在市政或公民角色中进行分析,与决策者、统计学家、程序员及公众合作都是这项工作的重要组成部分。
此外,更好地理解某些政治现实和伦理复杂性——这些是政府工作中固有的部分——也将帮助你在工作中表现出色,并成为更受重视的团队成员。
总结与致谢
在本节课中,我们一起回顾了整个认证课程的学习成果,总结了在数据处理、可视化及统计分析方面获得的核心技能,并探讨了这些技能在公共部门团队工作中的重要意义。
感谢你让我们成为你学习旅程的一部分。我们也祝愿你在接下来的努力中一切顺利。请随时告诉我们你的工作进展,以及本系列课程在哪些方面帮助了你。我们感激你能提供的任何反馈。
最后,依照密歇根大学庆祝成就的传统,让我们说一声:加油,蓝色!(Go Blue!)

浙公网安备 33010602011771号