Data-Science-For-Beginners 实战作业解析:利用 EDA 回答纽约出租车冬季与夏季小费差异问题
2026/9/14 17:38:11 网站建设 项目流程

Data-Science-For-Beginners 实战作业解析:利用 EDA 回答纽约出租车冬季与夏季小费差异问题

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

本指南以 15-analyzing 课时作业为骨架,系统讲解数据科学生命周期"分析(Analyzing)"阶段的核心任务——探索性数据分析(EDA)。你将学会在 assignment.ipynb 提供的纽约黄色出租车交易数据集上,使用 Pandas 的describe()sample()query()与可视化手段回答"冬季还是夏季乘客给司机的小费更多",并掌握判断数据能否支撑客户问题的完整方法。

作业背景:从"捕获"到"分析"的业务问题

本作业是上一课 14-Introduction 作业的延续。上一课团队处于数据科学生命周期的**捕获(Capturing)阶段,负责评估数据能否回答客户问题;本作业则进入分析(Analyzing)**阶段,承担对数据集的探索性数据分析(EDA)职责。

贯穿两课的核心业务问题是:

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

团队被提供了一份包含200 笔出租车交易(来自 2019 年 1 月与 7 月)的笔记本与数据集。这一设计刻意用"1 月代表冬季、7 月代表夏季"两个极端月份,制造了可直接对比的季节变量。正如 15-analyzing 课程 README 所述,分析阶段要确认数据能够回答既定问题,而 EDA 正是"定义数据内部特征与关系"的技法集合,可为后续建模做准备。

数据集全景:18 列、200 行的出租车交易样本

作业指定使用 assignment.ipynb 与仓库中的 data/taxi.csv。数据来自纽约市出租车与豪华轿车委员会(TLC)的黄色出租车行程记录公开数据集。

对仓库内实际文件核对后发现:data/taxi.csv包含18 个数据列,数据记录共199 行(其中 2019-01 有 100 条、2019-07 有 99 条),与作业描述的"约 200 笔交易"一致。笔记本加载数据的方式如下:

import pandas as pd path = '../../data/taxi.csv' # 将 csv 文件加载为 DataFrame df = pd.read_csv(path) # 打印 DataFrame print(df)

从列名与样例值可以看出数据覆盖了行程的时间、距离、位置、费用与支付方式等维度,具体如下:

列名类型/样例值含义推断
VendorID1.0 / 2.0供应商编号(TLC 授权供应商标识)
tpep_pickup_datetime2019-07-15 16:27:53上车时间戳
tpep_dropoff_datetime2019-07-15 16:44:21下车时间戳
passenger_count1.0 ~ 6.0乘客人数
trip_distance0.90 ~ 4.79行程里程(英里)
RatecodeID1.0费率代码(1 通常为标准费率)
store_and_fwd_flagN是否存储转发记录(Y/N)
PULocationID186 / 141上车地点编号
DOLocationID233 / 161下车地点编号
payment_type1.0 / 2.0支付方式编码
fare_amount4.5 ~ 19.5基本车费(美元)
extra0.0 / 1.0 / 3.0附加费(如高峰时段费)
mta_tax0.5MTA 税
tip_amount0.00 ~ 5.70小费金额(美元),即本次分析的目标变量
tolls_amount0.0过路费
improvement_surcharge0.3改善附加费
total_amount6.96 ~ 28.50总金额
congestion_surcharge0.0 / 2.5拥堵附加费

核心分析变量tip_amount(小费金额),季节由tpep_pickup_datetime中的月份决定。值得注意的是,从样例数据看,congestion_surcharge在 7 月记录中为 2.5、在 1 月记录中为 0.0——这类"按时间段征收的附加费"本身就是影响乘客最终支付意愿的潜在因素。

EDA 方法回顾:本课传授的五种探索技法

15-analyzing 课程 README 围绕"如何知道数据能支撑最终结果"这个问题展开,回顾了数据科学家获取数据时常问的三个问题:

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

EDA 正是回答这些问题的过程。课程给出了五种可落地的技法,且每种都在 notebook.ipynb 中有真实代码示例。

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

数据画像(Data Profiling)通过描述性统计汇总数据集整体信息:画像回答"有什么",描述性统计回答"有多少"。Pandas 的describe()函数对数值列输出count、max、min、mean、标准差与四分位数

# 对邮件数据集使用 describe print(email_df.describe())

输出示例(节选自notebook.ipynb的真实运行结果):

the to ect ... count 406.000000 406.000000 406.000000 ... mean 7.022167 6.519704 4.948276 ... std 10.945522 9.801907 9.293820 ... min 0.000000 0.000000 1.000000 ... 25% 1.000000 1.000000 1.000000 ... 50% 3.000000 3.000000 2.000000 ... 75% 9.000000 7.750000 4.000000 ... max 99.000000 88.000000 79.000000 ...

在出租车数据上,对tip_amountfare_amounttrip_distance等列执行df.describe(),可以立刻发现:count 是否等于总行数(缺失值信号)、tip_amount的最小值是否为 0(现金支付通常无小费)、均值与中位数是否存在明显偏斜。

采样:sample()

在大数据集上逐一查看不现实,采样能让你用较少的数据理解整体,并结合概率与统计做一般性结论。采样的数据越多,泛化越精确(虽然没有固定规则)。Pandas 通过sample(n)指定随机抽取行数:

# 采样 10 封邮件 print(email_df.sample(10))

在出租车数据中,df.sample(10)可快速"目检"各列的实际取值形态,例如发现tip_amount中大量为 0 的记录是否集中在payment_type=2(推测为现金支付的记录)。

查询:query()

与采样的"随机"不同,查询让你主动聚焦数据的特定部分。Pandas 的query()通过类 SQL 的字符串表达式筛选行:

# 返回 "to" 出现次数多于 "the" 的行 print(email_df.query('the < to'))

该示例在notebook.ipynb中返回了 169 行(共 406 封邮件中满足条件者)。在出租车数据上,可写出df.query("payment_type == 1")df.query("tip_amount > 0")等条件,精确分离"有刷卡小费"与"无小费"子集进行对比。

可视化探索

课程强调:不必等到数据彻底清洗与分析完毕才开始可视化。探索阶段的可视化能帮助识别模式、关系与问题,也是与不接触数据管理的干系人沟通的手段。若想系统学习常用可视化方法,可参考仓库的 3-Data-Visualization 章节(该章节覆盖数量、分布、比例、关系等主题,并配有完整的 notebook 与 R 语言版本)。

缺失值与不一致识别:isna()/isnull()

所有上述技法都能侧面暴露缺失或不一致值,而 Pandas 直接提供isna()isnull()检查缺失值。课程强调:探索缺失值的关键不只是"发现",更是探究它们为何以那种方式出现——这决定了后续应采取何种处理动作,具体清理方案可参考 08-data-preparation 的数据准备笔记本。

实战:用作业数据回答三个问题

作业要求在笔记本中自行开展 EDA(可自行添加单元格),并回答三个问题。下面给出每个问题的分析思路与可直接套用的代码骨架。

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

围绕tip_amount做相关性拆解,重点检查几类候选变量:

# 1) 行程距离与车费:长距离/高车费是否对应高小费? df.groupby('payment_type')[['fare_amount', 'tip_amount']].mean() # 2) 时间因素:小时、星期几、高峰时段是否影响小费? df['hour'] = pd.to_datetime(df['tpep_pickup_datetime']).dt.hour df.groupby('hour')['tip_amount'].mean() # 3) 乘客人数:多人同行是否倾向更高小费? df.groupby('passenger_count')['tip_amount'].mean() # 4) 支付方式:payment_type 是否为小费记录的根本决定因素? df.groupby('payment_type')['tip_amount'].agg(['count', 'mean', 'sum'])

可以从数据推断的要点payment_type极可能是最强的结构性因素——样例中payment_type=2的行tip_amount恒为 0.00,这与"现金支付无法在记录中留下小费金额"的事实一致(具体编码含义需对照 TLC 数据字典确认,作业中已给出数据字典与用户指南的参考链接)。此外,congestion_surchargeextra(高峰附加费)等费用列可能反映时段特征,从而与季节/时间因素纠缠,需在分析时留意混淆。

问题二:哪些列很可能不是回答客户问题所必需的?

客户问题只关心"季节 × 小费",因此可按"是否与季节或小费直接相关"来筛选:

# 观察哪些列存在大量常量值或与目标无关 df.nunique()
  • store_and_fwd_flag:样例中几乎全部为常量N,对季节-小费关系无区分度;
  • VendorIDRatecodeID:在样例中取值单一(2.0/1.0),若不准备做供应商或费率对比,可暂不关注;
  • mta_tax(恒为 0.5)、improvement_surcharge(恒为 0.3):属于固定附加费,不随季节或小费行为变化;
  • PULocationID/DOLocationID:若不做区域维度分析,仅回答季节问题时可不作为核心列(但它们可能是"哪些区域乘客小费更高"这类后续问题的入口)。

删除列应使用df.drop(columns=[...]),且删除前建议用df.nunique()df.describe()先确认各列的取值多样性,避免误删有价值信息。

问题三:数据是否显示出季节性小费行为的证据?

这是最核心的业务问题。分析路径如下:

# 1) 提取月份列 df['month'] = pd.to_datetime(df['tpep_pickup_datetime']).dt.month # 2) 按月份(1 月=冬季,7 月=夏季)对比小费均值 df.groupby('month')['tip_amount'].agg(['count', 'mean', 'median', 'sum']) # 3) 剔除无小费记录后再次对比(排除 payment_type 干扰) card = df[df['payment_type'] == 1] card.groupby('month')['tip_amount'].mean() # 4) 计算小费占车费比例,消除金额差异影响 card['tip_rate'] = card['tip_amount'] / card['fare_amount'] card.groupby('month')['tip_rate'].mean()

回答时的证据边界:仓库数据只有 199 条记录、且仅有 1 月和 7 月两个月份,样本量极小。即使groupby结果显示出均值差异,也应谨慎表述为"在本样本中观察到某种趋势",而非得出统计显著的季节性结论。规范的 EDA 输出应包含:各月份小费分布的describe()汇总、可视化对比(箱线图/直方图,可参考 3-Data-Visualization 章节技法)、以及"数据量是否足以支撑结论"的评估——这正是课程强调的"评估数据够不够"环节。从数据看,样例中 1 月与 7 月的tip_amount均值差异确实存在,但需在作业报告中明确样本规模限制。

评估标准:什么是"卓越"的作业

作业末尾给出了三档评估框架(原文为标题行,无具体细则文字),可作为自查清单:

档次表现特征
卓越(Exemplary)三类问题均有数据支撑的回答:给出了多个潜在影响变量及其分析证据;明确列出冗余列并说明理由;对季节差异给出带可视化与统计描述的结论,同时坦诚说明样本量局限
合格(Adequate)使用describe()sample()query()中至少一种方法完成基础探索,三个问题均给出合理但论证不够深入的回答
需要改进(Needs Improvement)仅加载数据而未展开分析,或回答停留在猜测层面、缺少代码与输出佐证

小结:从作业到方法论的沉淀

完成本作业后,你应能将"分析(Analyzing)"阶段的方法论内化:先画像(describe())评估数据量与质量 → 采样(sample())快速感知 → 查询(query())聚焦子集 → 可视化发现模式 →isna()/isnull()排查不一致,最终形成"数据能否回答客户问题"以及"还缺什么数据"的结论。这种流程不仅适用于本仓库的出租车数据集,也适用于 data 目录 下其它示例数据(如emails.csvbirds.csv),是数据科学实战中可复用的标准起手式。

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

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

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

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

立即咨询