Data-Science-For-Beginners 数据分析实战:用 Pandas 对纽约出租车数据进行探索性数据分析(EDA)
2026/9/10 15:02:20 网站建设 项目流程

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 课(Analyzing,分析阶段)的实战作业,围绕一个真实业务问题展开:纽约市黄色出租车乘客在冬季还是夏季给司机的小费更多?你将学会在 Pandas 中运用数据画像、描述性统计、抽样、查询、可视化与缺失值检查等 EDA 核心技术,独立对一份 200 条真实出租车交易记录完成探索性分析,并给出基于数据的结论。

作业背景:从"采集"到"分析"的生命周期推进

这是上一课 数据评估作业(Capturing 阶段)的延续。在上一课中,团队已经初步接触了数据集,并评估了它能否回答客户的问题;现在课程进入数据科学生命周期的Analyzing(分析)阶段,团队需要对数据集执行探索性数据分析(Exploratory Data Analysis,EDA)。

分析阶段的目标是确认数据能够回答所提出的问题或解决特定问题,同时也可以验证模型是否正确地应对这些提问。EDA 是一套用于定义数据内部特征与关系的技术,并能为后续建模准备数据。正如本课 README 所述,当数据科学家获取数据时,通常会追问三个问题:

  • 我有足够的数据来解决这个问题吗?
  • 这些数据对这个问题而言质量可接受吗?
  • 如果通过数据发现了额外的信息,我们是否应该考虑改变或重新定义目标?

EDA 正是回答这些问题的过程,同时也能暴露出处理数据集时面临的挑战。

待回答的客户问题

客户希望团队调查纽约市出租车乘客的季节性消费习惯,核心问题是:

纽约市黄色出租车乘客在冬季还是夏季给司机的小费更多?

团队已获得一份笔记本(notebook)和数据集,其中包含2019 年 1 月与 7 月的 200 条出租车交易记录(每个月份各 100 条)。数据来源为 Taxi & Limousine Commission(纽约市出租车与轿车委员会) 的开放数据集,可通过官方数据字典与用户指南进一步了解字段含义。

数据集结构:从加载到字段语义

在 作业笔记本 中,数据通过 Pandas 从仓库根目录的 data/taxi.csv 加载:

import pandas as pd path = '../../data/taxi.csv' # 仓库根目录下 data 目录中的文件 # 将 csv 文件加载为 dataframe df = pd.read_csv(path) # 打印 dataframe print(df)

运行后得到200 rows x 18 columns的结构,即 200 条记录、18 个字段。加载时可以先检查数据形状与字段类型:

print(df.shape) # (200, 18) print(df.dtypes)

从仓库实际数据文件(data/taxi.csv首行表头)可以确认 18 个字段如下:

字段含义备注
VendorID出租车供应商编号(1 或 2)分类变量
tpep_pickup_datetime上车时间本作业按字符串读入,用于区分 1 月/7 月
tpep_dropoff_datetime下车时间可用于计算行程时长
passenger_count乘客人数本数据集范围为 0~6
trip_distance行程距离(英里)本数据集范围为 0.16~22.0
RatecodeID费率代码(标准、机场等)本数据集出现 1、2、5 三种值
store_and_fwd_flag是否存储转发标志本数据集中全部为 'N'(无区分度)
PULocationID/DOLocationID上车/下车位置 ID可用于区域分析
payment_type付款方式(1=信用卡,2=现金)与小费强相关
fare_amount基础车费数值连续变量
extra附加费(如高峰附加费)数值
mta_taxMTA 税通常为固定 0.5
tip_amount小费金额本作业的目标变量
tolls_amount过路费多为 0
improvement_surcharge改善附加费固定 0.3
total_amount总金额(含各项费用与小费)tip_amount存在线性包含关系
congestion_surcharge拥堵附加费本数据集中仅 7 月记录非 0

注意:作业数据直接从tpep_pickup_datetime的前 7 个字符即可区分月份,仓库真实数据的统计为2019-072019-01各 100 条,且整个数据集没有缺失值。

EDA 核心技术:本课的四类方法

本课 README 围绕四类 EDA 技术展开,配套的 notebook.ipynb 使用邮件分类数据集(emails.csv)演示了全部方法的实际用法,可对照练习。

1. 数据画像与描述性统计:describe()

数据画像(Data Profiling)通过描述性统计(Descriptive Statistics)来汇总数据集整体信息:画像回答"数据里有什么",描述性统计回答"有多少"。Pandas 的describe()对数值列输出count(计数)、min/max(最小/最大值)、mean(均值)、std(标准差)以及 25%/50%/75% 分位数

print(df.describe())

describe()可以快速评估手头数据量是否足够、数值分布是否合理。例如对出租车数据,可以立刻看到tip_amount的均值、中位数、最小值 0(现金支付通常无小费)以及最大值。

2. 抽样:sample()

在大数据集中逐一查看全部内容非常耗时,抽样(Sampling)可以让我们从概率与统计角度对整体得出一般性结论。没有固定的抽样数量规则,但抽样越多,可做出的概括越精确。Pandas 的sample(n)可以随机取出 n 条记录:

# 随机抽取 10 条记录 print(df.sample(10))

3. 查询:query()

与抽样相反,查询(Querying)让你控制并聚焦于数据中你有疑问的特定部分query()通过条件表达式筛选行,返回满足条件的记录:

# 筛选出车费高于 20 美元的记录 print(df.query('fare_amount > 20'))

在作业中,可以先用查询快速提取"1 月记录"或"信用卡支付且小费大于 0"等子集,再做分组统计。

4. 通过可视化探索

不必等到数据完全清洗与分析完成再作图。探索阶段的图表能帮助识别模式、关系与问题,也是与不参与数据管理的人员沟通的手段,还能引出采集阶段未覆盖的新问题。可参考 3-Data-Visualization 章节了解常用的可视化方式(如柱状图、直方图、箱线图、散点图)。

5. 检查缺失与不一致:isna()/isnull()

以上所有技术都能帮助发现缺失或不一致的值,Pandas 还提供了专门的检查函数:

print(df.isna().sum()) # 每列缺失值数量 print(df.isnull().sum().sum()) # 全局缺失值总数

探索时更重要的是思考这些值为何出现,这决定了后续 数据准备阶段 中应采取何种处理动作(删除、填充或保留)。

作业实操指南:回答三个核心问题

在 作业笔记本 中,数据加载与打印之后预留了空白单元格("Use the cells below to do your own Exploratory Data Analysis"),要求使用本课学到的技术完成自己的 EDA(可以按需添加单元格),并回答以下三个问题。

问题一:数据中还有哪些因素可能影响小费金额?

围绕目标变量tip_amount,从字段语义出发做多角度探索。基于仓库真实数据可以验证以下线索:

  • 付款方式:现金支付(payment_type == 2)的记录小费往往为 0。真实数据中 57 条现金记录几乎没有小费,143 条信用卡记录的小费均值明显更高——这是影响小费的最强因素;
  • 车费高低:小费通常是车费的百分比,fare_amount越高小费绝对值越高。可构造小费率tip_rate = tip_amount / fare_amount观察;
  • 乘客人数、行程距离、行程时长:更远、更久的行程可能带来更慷慨的小费;
  • 费率代码与区域:机场行程(RatecodeID 为 2 等)可能产生固定金额或更高比例的小费;
  • 拥堵附加费:真实数据中 1 月全部为 0、7 月均值约 2.25,说明该项只在下半年生效,可作为月份差异的旁证。

推荐的分析代码片段:

# 添加月份与小费率列 df['month'] = df['tpep_pickup_datetime'].str[:7] df['tip_rate'] = df['tip_amount'] / df['fare_amount'] # 按付款方式查看小费差异 print(df.groupby('payment_type')['tip_amount'].agg(['count', 'mean', 'median'])) # 按乘客人数查看小费差异 print(df.groupby('passenger_count')['tip_amount'].agg(['count', 'mean']))

问题二:哪些列很可能在回答客户问题时用不到?

逐列评估其与"冬夏小费对比"的相关性,可以从源码数据中确认以下判断:

  • store_and_fwd_flag:全部记录均为 'N',零信息量,应剔除;
  • improvement_surchargemta_tax:固定金额(0.3 / 0.5),无区分度;
  • tolls_amount:绝大多数为 0,对回答小费问题几乎无贡献;
  • congestion_surcharge:虽然能辅助区分季节,但它属于系统性差异(只在下半年征收),不能直接解释小费行为;
  • VendorIDPULocationIDDOLocationID:与季节性问题相关性弱,除非进一步做区域交叉分析;
  • 注意total_amount已包含tip_amount,两者高度线性相关,分析时应避免同时使用造成重复计算。

问题三:基于现有信息,数据是否提供了季节性小费行为的证据?

对 1 月与 7 月做分组汇总(使用groupby+ 聚合),仓库真实数据可以得到如下结果:

print(df.groupby('month')['tip_amount'].agg(['count', 'mean', 'median', 'sum']))
月份记录数小费均值小费中位数小费总和
2019-01(冬季)1001.94941.48194.94
2019-07(夏季)1002.07842.00207.84

再看小费率与零小费占比:

print(df.groupby('month')['tip_rate'].mean()) # 2019-01: 约 0.149,2019-07: 约 0.168 print(df.groupby('month')['tip_amount'].apply(lambda s: (s == 0).mean())) # 2019-01: 29% 为零小费,2019-07: 33% 为零小费

从描述性统计看,夏季的小费均值、中位数、总和与小费率均略高于冬季,表面证据倾向于夏季小费略多。但必须谨慎给出结论:

  • 差异幅度较小(均值差约 0.13 美元,中位数差 0.52 美元),且仅 200 条样本、每月仅 100 条,按照本课"抽样越多概括越精确"的原则,此样本量不足以支撑强结论;
  • 付款方式构成差异(1 月与 7 月信用卡/现金比例不同)会混淆季节效应——这是典型的混杂变量,需要通过查询或分组进一步控制后再比较;
  • 更严谨的做法是:仅比较信用卡支付且小费大于 0 的记录,并补充可视化(如按月分组的箱线图或直方图)观察分布形态,而不是只看均值。

因此,合理的作业结论是:数据提供了"夏季小费略高"的初步迹象,但受样本量与混杂因素限制,尚不能构成确定性证据,需要更多月份、更大样本或补充数据集来验证。

评分标准与提交要点

作业按三维度评估(表格见 作业文件 原文,孟加拉语翻译版同样保留了该表结构):

示范级(Exemplary)达标(Adequate)需改进(Needs Improvement)

达到"示范级"的作业通常具备:在笔记本中完整执行并记录了多类 EDA 技术(describe、sample、query、可视化、缺失值检查)、对三个问题给出有数据支撑的分析结论、能识别混杂变量并解释其影响。建议提交前检查笔记本已按顺序运行、图表与结论一致、每个结论都能指向具体的统计量或图表证据。

延伸学习路径

  • 本作业是 数据科学生命周期:分析阶段 课程的一部分,课程讲义中还介绍了 EDA 与建模准备的关系;
  • 上一阶段作业:评估数据集(Capturing 阶段,负责评估数据能否回答问题);
  • 数据准备与清洗技术:08-data-preparation 笔记本;
  • 可视化方法参考:3-Data-Visualization 章节;
  • 完整示例代码:15-analyzing/notebook.ipynb 与 examples 目录 中的基础数据分析示例。

通过完成本作业,你将完整走过"提出问题 → 数据画像 → 抽样查询 → 可视化探索 → 检验假设"的 EDA 闭环,并学会用统计证据(而非直觉)来回答业务问题——这正是数据科学分析阶段的核心能力。

【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询