Data Science For Beginners 实战:用 Pandas 完成探索性数据分析(EDA)——数据科学生命周期中的"分析"阶段
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
本篇文章围绕 Data Science For Beginners 课程第 15 课展开,系统讲解数据科学生命周期(Data Science Lifecycle)中"分析(Analyzing)"阶段的核心方法论——探索性数据分析(EDA)。你将基于仓库内真实的 emails.csv 邮件词频数据集与配套 notebook.ipynb,逐一掌握 Pandas 的describe()、sample()、query()、isna()等关键函数,并学会用可视化与缺失值检查为后续建模与数据清洗铺路;文章最后还给出纽约出租车小费季节分析的实战作业,帮助你立刻上手完整的 EDA 流程。
图片说明:Data Science Lifecycle: Analyzing 一课的手绘草图笔记,概括了本章"分析"阶段在生命周期中的位置与核心动作。
一、分析阶段在生命周期中的定位:我们如何确认数据能回答问题?
在数据科学生命周期中,捕获(Capturing)阶段负责获取数据并定义待解决的问题,但随之而来的疑问是:我们怎么知道这些数据足以支撑最终结果?"分析"阶段正是用来回答这一问题的——它确认数据能够回答既定问题或解决特定问题,同时关注模型是否正确回应了这些问题与难题。
一个数据科学家在拿到数据时,通常会问自己三个问题:
- 我有足够的数据来解决这个问题吗?
- 这些数据对该问题而言质量可接受吗?
- 如果通过数据发现了额外信息,我们是否应该考虑更改或重新定义目标?
探索性数据分析(EDA,Exploratory Data Analysis)就是"认识数据"的过程:它通过一系列技术手段定义数据内部的特性与关系,用来回答上述问题,同时识别使用该数据集时可能遇到的挑战,并可作为数据建模前的准备步骤。本章聚焦的正是 EDA 的几种核心技巧。
二、数据剖析(Data Profiling)与描述性统计:describe()
如何评估"我是否有足够的数据"?答案是数据剖析(Data Profiling)——借助**描述性统计(Descriptive Statistics)**技术,对数据集做整体汇总与归纳。二者的分工是:
- 数据剖析帮助我们理解**"有什么"**是可用可得的;
- 描述性统计帮助我们理解**"有多少"**是可用的。
在本课程之前的章节中,我们已经多次使用 Pandas 提供描述性统计。DataFrame.describe()就是最常用的入口,它针对数值型数据返回:
- count:非空值的数量,用于判断样本量与缺失情况;
- mean / std:均值与标准差,反映数据的集中趋势与离散程度;
- min / max:最小值与最大值,快速锚定数值范围;
- 25% / 50% / 75%:四分位数,勾勒数据分布轮廓。
以仓库中的 notebook.ipynb 为例,它从 data/emails.csv 加载邮件数据集(该数据集统计了若干常见单词在邮件中的出现次数,邮件来源匿名):
import pandas as pd # 加载数据集 path = '../../data/emails.csv' email_df = pd.read_csv(path) # 对邮件数据集应用 describe print(email_df.describe())上述代码的真实输出(节选)如下,每一列代表一个常见单词,每一行描述该词频统计量:
the to ect and for of count 406.000000 406.000000 406.000000 406.000000 406.000000 406.000000 mean 7.022167 6.519704 4.948276 3.059113 3.502463 2.662562 std 10.945522 9.801907 9.293820 6.267806 4.901372 5.443939 min 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 25% 1.000000 1.000000 1.000000 0.000000 1.000000 0.000000 50% 3.000000 3.000000 2.000000 1.000000 2.000000 1.000000 75% 9.000000 7.750000 4.000000 3.000000 4.750000 3.000000 max 99.000000 88.000000 79.000000 69.000000 39.000000 57.000000可以看到,406 封邮件样本中"the"的平均出现次数约 7 次、最大值 99 次;而"a"的平均值高达 57、最大值 843(输出后半部分),列间差异悬殊,提示数据分布极不均衡。通过describe()这样的描述性统计,你可以快速评估自己手头有多少数据、以及是否还需要更多数据。
从 data/emails.csv 的文件结构看,该表共 17 列:首列为
Email No.(邮件编号),其余 16 列(the、to、ect、and、for、of、a、you、in、on、is、this、i、be、that、will)均为单词词频计数,因此describe()天然适用于除编号列外的全部数值列。
三、采样(Sampling):用sample()快速窥探大数据集
在大数据集上探索全部数据通常非常耗时,这类"重体力活"一般交给计算机完成。但**采样(Sampling)**是理解数据的得力工具:它让我们对数据集里"有什么、代表什么"有更直观的感受。基于样本,你可以运用概率与统计知识,对整体数据得出一般性结论。
关于采样量并无固定规则,但需要记住一个关键原则:采样的数据越多,你对整体数据的推断就越精确。
Pandas 提供了DataFrame.sample()函数,只需传入希望获得的随机样本数量即可:
# 从邮件数据集中随机采样 10 封邮件 print(email_df.sample(10))notebook 中的真实输出(节选)展示了抽样结果:Email 151中"the"出现 0 次、"a"出现 15 次;而Email 321中"a"出现高达 187 次。这种随机抽样能快速让你感受到词频的稀疏性与极端值分布,为后续判断特征是否有用提供直觉依据。
四、查询(Querying):用query()精确聚焦感兴趣的数据
与"随机采样"不同,**查询(Querying)**赋予你完全的控制权:你可以针对自己感兴趣的数据子集提出具体问题。Pandas 的DataFrame.query()允许通过类布尔表达式直接筛选行,从而获得关于数据的简单而精确的回答。
notebook 中的示例是:返回所有"to"出现次数多于"the"的邮件:
# 返回所有 "to" 出现次数多于 "the" 的邮件行 print(email_df.query('the < to'))该查询返回了169 行 × 17 列的结果,例如Email 2(the=8、to=13)、Email 5157(the=4、to=13)等。通过这类条件查询,你可以快速验证"某些单词是否存在共现倾向"之类的假设,为特征工程与建模选型提供线索。
五、用可视化探索:不必等到清洗完成
你不必等到数据彻底清洗和分析完毕才开始画图。事实上,在探索阶段就建立可视化,往往能更早地发现数据中的模式(patterns)、关系(relationships)和问题(problems)。
可视化还有另一层价值:它是一种与不直接参与数据管理的人沟通的手段,可以用来分享发现、澄清捕获阶段未覆盖的疑问。关于直方图、箱线图、散点图、饼图等主流探索型图表的用法,可深入学习仓库中的 3-Data-Visualization 章节(第 09~13 课分别覆盖数量、分布、比例、关系与有意义可视化的绘制方法)。
六、识别不一致与缺失值:isna()/isnull()
本章介绍的所有技巧(描述性统计、采样、查询、可视化)都能帮助你发现缺失值或不一致值,而 Pandas 还提供了专门的函数来主动检查它们:
isna()或isnull():逐元素判断是否为缺失值(两者功能等价),返回布尔掩码;配合sum()可统计每列的缺失数量。
检查出缺失值只是第一步,更重要的是探究这些值最初为什么缺失——是采集环节遗漏、合并导致的错位,还是数据本身天然不含该字段?理解缺失成因,才能决定后续应该删除、填充还是保留。关于缺失值处理的具体动作(清洗、填充、聚合、压缩等),可参考仓库中 数据准备(Data Preparation)课程的 notebook 继续深入。
七、实战作业:纽约出租车小费季节分析
为巩固 EDA 技能,第 15 课配套了实战作业 Udforskning for svar(Exploring for answers),它是上一课 评估数据集作业 的延续。业务问题为:
纽约市的黄色出租车乘客在冬季还是夏季给司机的小费更多?
你的团队正处于数据科学生命周期的分析(Analyzing)阶段,负责对数据集进行探索性数据分析。仓库提供了:
- 作业 notebook:assignment.ipynb;
- 数据集:data/taxi.csv,包含 2019 年1 月(冬季)与 7 月(夏季)的约 200 笔出租车交易记录。
从 notebook 的加载输出可以看到,taxi.csv共18 列,包括VendorID(供应商)、tpep_pickup_datetime/tpep_dropoff_datetime(上下车时间)、passenger_count(乘客数)、trip_distance(行程距离)、PULocationID/DOLocationID(上下车区域)、payment_type(支付方式)、fare_amount(车费)、tip_amount(小费)、total_amount(总额)、congestion_surcharge(拥堵附加费)等字段。
作业要求你运用本章学到的 EDA 技巧(建议在 notebook 中自行添加分析单元),回答以下三个问题:
- 数据中还有哪些因素可能影响小费金额?(例如:行程距离、乘车人数、支付方式、时段、拥堵附加费等)
- 哪些列很可能不是回答客户问题所必需的?
- 基于现有数据,是否存在季节性小费行为的证据?
作业评价标准(Rubric)
| 优秀(Exemplary) | 达标(Adequate) | 需改进(Needs Improvement) |
|---|---|---|
| 充分运用多项 EDA 技术,对三个问题给出有数据支撑的完整分析与结论 | 应用了部分 EDA 技术,能回答部分问题但论证不充分 | 未完成分析或仅给出无依据的主观判断 |
作业的典型开展路径可以是:先用describe()查看tip_amount等关键列的分布与极端值 → 用sample()抽查原始记录确认数据形态 → 用query()分别筛出 1 月与 7 月的记录对比小费均值 → 用isna()检查缺失 → 最后用箱线图/直方图可视化两季小费分布差异。
八、小结
"分析"阶段是数据科学生命周期中承上启下的关键一环:它承接捕获阶段的原始数据,验证其是否足以支撑既定问题,又为处理与建模阶段输送经过理解的数据。本章介绍的 EDA 工具箱——describe()描述性统计、sample()采样、query()查询、可视化探索与isna()缺失值检查——共同构成了数据科学家认识数据、发现问题、验证假设的完整方法论。配合仓库中的 notebook.ipynb 逐单元运行,再完成出租车小费分析作业,你就能建立一套可复用的 EDA 实战流程。
说明:本文基于 Data Science For Beginners 仓库 translations/da/4-Data-Science-Lifecycle/15-analyzing/README.md 课程文档整理,代码输出均取自仓库内 notebook.ipynb 与 assignment.ipynb 的真实运行结果。
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考