用数据准备技术评估表单采集质量:Data-Science-For-Beginners 第 08 课实战演练
用数据准备技术评估表单采集质量Data-Science-For-Beginners 第 08 课实战演练【免费下载链接】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 仓库第 2 部分「Working with Data」第 08 课Data Preparation的课后实战任务展开以该任务中客户提交的「表单 CSV 数据」为真实素材完整演示如何运用本课讲解的 pandas 数据准备技术诊断并清洗采集数据中的格式不一致、缺失值与枚举错乱问题最终给出让表单「采集准确、一致信息」的改进建议。读完本文你将掌握从数据源头表单设计到数据落地DataFrame 清洗的一整套质量评估与修复方法并能直接复现仓库中 assignment.ipynb 的分析流程。任务背景来自客户的表单数据本课作业对应英文原版任务 Evaluating Data from a Form本仓库另存有 希腊语译文描述了一个非常典型的真实业务场景一位客户正在用一个小型表单收集客户群的基础数据。他把收集到的结果带来请你帮他验证这些数据的有效性。客户还指出部分可视化图表看起来是错的但他不知道如何解决。任务共涉及仓库中的三个关键产物构成了完整的「采集 → 存储 → 分析」闭环角色文件说明数据采集源头index.html客户使用的 HTML 表单页面可在浏览器中直接打开查看采集结果数据data/form.csv表单录入的 CSV 记录共 10 行 3 列分析工作台assignment.ipynb含数据加载代码与两张基础可视化图表的 Jupyter Notebook任务指令只有一句话「使用本课第 08 课 Data Preparation的技术就表单应如何改进以采集准确、一致的信息提出建议。」也就是说这不只是一个「清洗数据」的练习而是一次围绕数据质量的反向溯源从脏数据的症状出发找到表单设计上的病灶。第一步审视数据源头——表单本身打开 index.html其完整源码如下!DOCTYPE html html langen head meta charsetUTF-8 meta http-equivX-UA-Compatible contentIEedge meta nameviewport contentwidthdevice-width, initial-scale1.0 titleEntry Form/title /head body h1Please Fill out the Form (* required)/h1 *labelBirth Month/label input typetext br labelState/label input typetext br label forpetsDogs or Cats?/label select namepets idpets option valuedogsDog/option option valuecatsCats/option /select br buttonSubmit/button /body /html虽然页面只有寥寥 20 余行但作为数据质量的源头它已经埋下了多处隐患而这些隐患会原封不动地传导到下游的 CSV 数据里Birth Month 是自由文本输入框input typetext没有任何格式约束也没有 placeholder 提示。用户既可以输入January也可以输入JAN、Sept、january甚至可以输入日期、数字或其他语言。State 同样是自由文本输入框用户既可能填缩写CA也可能填全称California还可能留空——因为表单标题虽标注* required但该星号只标记在 Birth Month 标签前State 并未真正约束为必填。下拉选项的 value 与 label 不一致option valuedogsDog/option显示文本是单数Dog而提交值却是复数dogs同一标签内Dogs or Cats?是复数选项又是单数。这会造成「用户看到什么」与「数据里存了什么」之间的语义漂移。从数据准备的角度看表单的**字段类型设计type、约束required、选项枚举option 的 value/label 一致性**决定了数据质量的起点。这也是任务要求「对表单提出建议」的根本原因——很多脏数据靠清洗是治标改表单才是治本。第二步加载并概览数据集assignment.ipynb 是官方提供的分析工作台。它首先安装了依赖并加载数据!pip install pandas !pip install matplotlibimport pandas as pd import matplotlib.pyplot as plt # Loading the dataset path ../../data/form.csv form_df pd.read_csv(path) print(form_df)运行后得到的数据与仓库中 data/form.csv 内容完全一致为birth_month state pet 0 January NaN Cats 1 JAN CA Cats 2 Sept Hawaii Dog 3 january AK Dog 4 July RI Cats 5 September California Cats 6 April CA Dog 7 January California Cats 8 November FL Dog 9 December Florida Cats这是一个 10 行 3 列的小数据集看似简单实则把本课要讲的所有典型脏数据问题都浓缩进去了。逐列观察birth_monthJanuary出现了两次但同一个月份还存在JAN全大写缩写、january全小写、Sept缩写等变体state同一含义存在两种表达层级——缩写CA、AK、RI、FL与全称Hawaii、California、Florida且第 0 行存在缺失值读取后成为NaNpet表面看只有Cats和Dog两个值但它对应表单中 value 为dogs/cats的选项数据值与选项值并未完全对齐。在深入清洗之前建议先用本课 notebook.ipynb 中介绍的 DataFrame 概览手段shape、columns、info()、head()、tail()快速建立对数据的整体感知例如form_df.info()可以立即看到 state 列的非空计数为 9、存在 1 个缺失值从而确认「缺失数据」问题的存在。第三步为什么可视化看起来不对任务描述中客户提到「有些可视化看起来是错的」。Notebook 中给出的两张图表正是问题所在form_df[state].value_counts().plot(kindbar) plt.show()form_df[birth_month].value_counts().plot(kindbar) plt.show()value_counts()的计数逻辑是基于字符串的精确匹配CA与California是两个完全不同的字符串会被视为两个独立的类别分别计数。于是state 柱状图上会出现CA(2)、California(2) 两根高度相同的柱子它们本应合并为同一个类别的 4 条记录Hawaii、Florida、AK、RI、FL各自孤零零占一根柱子缺失的NaN甚至根本不会出现在类别统计里。birth_month 柱状图上会出现January(2)、JAN(1)、january(1) 三根「分家」的柱子视觉上就像三个月各有数据而实际上它们指向同一个月份。客户看到的「错误图表」并非绘图代码写错了而是数据未经规范化导致类别碎片化。这正是本课反复强调的观点数据源中的格式不一致会在可视化与查询结果中造成错误呈现——数据明明在数据集里却无法被正确统计和展示。核心技术第 08 课数据准备方法回顾任务要求使用本课技术因此需要先掌握 README.md 与 notebook.ipynb 中沉淀的核心方法。课程开篇就点明了清洗数据的三大价值易用与可复用数据被恰当组织与规范化后更容易被搜索、使用和共享一致性数据科学常需合并多个来源的数据集只有每个数据集内部做到统一标准化合并后才仍然有用模型准确率干净的数据能提升依赖它的模型的准确性。课程给出的常见清洗目标与策略包括探索数据集通过基础查询、可视化和抽样发现待清洗点、格式化解决空白字符、日期、数据类型等呈现不一致、去重合并数据集时常见但需甄别是否包含额外信息、缺失数据处理重载、代码补全或直接删除具体做法取决于缺失的原因。概览 DataFrameinfo / head / tail本课用经典的 Iris 数据集演示了快速把握数据结构的手段import pandas as pd from sklearn.datasets import load_iris iris load_iris() iris_df pd.DataFrame(datairis[data], columnsiris[feature_names])iris_df.info()打印列名、每列非空计数与数据类型dtype一眼看出缺失情况iris_df.head()/iris_df.tail()查看数据的前几行 / 后几行快速建立对内容形态的直觉。对于本任务form_df.info()与form_df.head()即可确认「state 有缺失、其余两列类型为 object 字符串」。缺失值isnull / notnull / dropna / fillnapandas 用两种哨兵值表示缺失浮点缺失用NaNIEEE 浮点规范的保留值非浮点缺失用 Python 的None。检测方法是一对布尔掩码import numpy as np example1 pd.Series([0, np.nan, , None]) example1.isnull()输出0 False / 1 True / 2 False / 3 True——注意0是合法的整数不被视为缺失是字符串对象也不算缺失这提醒我们空字符串与 NaN 是两回事。删除缺失值用dropna()Series直接丢弃DataFrame则按行或列删除可通过axis、howany默认 /all和thresh保留所需的最少非空值个数精细控制。若希望保留记录则用fillna()填充example3 pd.Series([1, np.nan, 2, None, 3], indexlist(abcde)) example3.fillna(0) # 统一填充为 0 example3.fillna(methodffill) # 前向填充用上一个有效值 example3.fillna(methodbfill) # 后向填充用下一个有效值对 DataFrame 还可以指定axis方向填充。本课 takeaway 明确指出缺失值用哪种策略删除、替换、如何替换应由数据本身的特性决定。重复数据duplicated / drop_duplicatesexample4 pd.DataFrame({letters: [A,B] * 2 [B], numbers: [1, 2, 1, 3, 3]}) example4.duplicated() # 返回布尔掩码标记与更早行重复的记录 example4.drop_duplicates() # 返回删除重复项后的副本 example4.drop_duplicates([letters]) # 仅按指定列子集判断重复duplicated/drop_duplicates默认考虑所有列也可指定列子集。课程特别警示重复数据会改变分析结果、导致结论失准几乎是每个数据科学项目都必经的一步。下图为该课官方手绘笔记Sketchnote概括了数据准备的完整心智模型第四步逐字段诊断与清洗实操掌握了核心技术后回到表单数据本身。下面按列逐字段做「诊断 → 清洗 → 表单建议」三步走。birth_month大小写与缩写的归一化诊断对birth_month做唯一值检查form_df[birth_month].unique() # array([January, JAN, Sept, january, July, September, # April, November, December], dtypeobject)同一个语义单位月份存在全称、缩写、全大写、全小写四种形态。按本课「格式化」策略第一步先统一大小写form_df[birth_month] form_df[birth_month].str.capitalize()JAN→Jan、january→January但Sept仍是缩写。第二步建立缩写到全称的映射把Sept、Jan、Feb、Apr、Aug、Dec等统一为规范全称month_map {Jan: January, Feb: February, Mar: March, Apr: April, May: May, Jun: June, Jul: July, Aug: August, Sep: September, Sept: September, Oct: October, Nov: November, Dec: December} form_df[birth_month] form_df[birth_month].replace(month_map) form_df[birth_month].value_counts()归一化后January的三个变体合并为一类图表立即恢复正确。根本建议在 index.html 中把 Birth Month 从自由文本改为select下拉12 个月份枚举或带格式校验的日期控件从源头杜绝自由输入。state全称/缩写映射与缺失值处理诊断form_df[state].unique() # array([nan, CA, Hawaii, AK, RI, California, FL, Florida], dtypeobject)问题有两类一是层级混乱缩写 vs 全称混用二是第 0 行缺失NaN。对应本课两个清洗目标格式化和缺失数据。清洗 1——统一到全称建立状态映射表可按需覆盖全美 50 州这里列出数据中出现过的state_map {AL: Alabama, AK: Alaska, AZ: Arizona, CA: California, FL: Florida, GA: Georgia, HI: Hawaii, RI: Rhode Island, WA: Washington, TX: Texas} # 可按需补全其余州 form_df[state] form_df[state].replace(state_map)清洗 2——处理缺失值。依据本课原则策略取决于缺失原因与业务语义若记录数多、缺失占比低可直接删除该行form_df.dropna(subset[state])若希望保留样本可结合其他字段推断填充form_df[state].fillna(Unknown)用占位值标记或按业务规则填充众数无论哪种方式都应避免在可视化时让NaN静默消失从而误导客户对样本量的判断。根本建议在表单中将 State 改为受控下拉列表50 州枚举并统一改为必填required属性 后端校验兜底即可同时消灭「层级混乱」与「缺失」两大问题。pet枚举一致性检查诊断form_df[pet].unique() # array([Cats, Dog], dtypeobject) form_df[pet].value_counts()数据层面pet只有Cats/Dog两个值本身是干净的。但对照表单源码可以发现不一致select的选项 value 是dogs复数和cats复数而采集结果里存的是Dog单数/Cats复数。若未来客户更换采集工具或直接读取表单的 value数据可能变成dogs/cats另一套枚举。建议统一表单中 label、value 与数据存储层的枚举字符串例如全部统一为单数Dog/Cat并在读取 CSV 时显式指定 dtype 为 category让枚举彻底受控。去重检查数据集中暂未发现完全重复的行但作为数据准备的例行步骤仍应执行本课的去重检查form_df.duplicated().any() # 快速确认是否存在重复行 form_df.drop_duplicates() # 若有重复则删除未来数据量增长、或当表单接入多个渠道后duplicated/drop_duplicates可配合subset指定判重列将是从合并数据中剔除噪声的常用手段。第五步表单设计改进建议交付物综合以上诊断对 index.html 的改进建议可归纳为五条前四条与字段一一对应最后一条是兜底策略Birth Month 改为下拉/日期控件固定 12 个月份枚举或使用typemonth输入替代自由文本杜绝缩写、大小写、拼写变体State 改为下拉列表枚举 50 州建议同时统一存储为全称或 ISO 两字母码并设为必填消灭「缩写/全称混用」与「缺失」统一 pet 选项语义使label、option value与数据层枚举完全一致避免单复数漂移补齐输入提示与格式说明为文本字段提供placeholder如YYYY-MM并展示合法输入示例降低用户自由发挥的空间后端校验兜底前端约束只能防君子服务端/导入端应使用本课的数据准备技术格式化、去重、缺失值处理、枚举校验作为最后一道防线并定期用value_counts() 可视化审计数据分布是否异常。这组建议与任务要求「让表单采集准确且一致的信息」完全对齐准确靠必填约束与枚举受控一致靠字段类型设计消灭自由输入。评分标准Rubric本任务在 assignment.md 中给出了三档评分框架优秀Exemplary合格Adequate需改进Needs Improvement对表单提出全面、可落地的改进建议并结合数据验证了每类问题的成因识别出主要的数据问题并给出基本建议仅指出问题但缺少具体方案或未与数据证据对应评分关注的核心不是「代码写得多漂亮」而是建议是否源自对数据的准确诊断例如是否解释了CA与California为什么会在图表中分裂、缺失值如何处理、以及对应到表单的哪个控件应如何修改。提交时可在 assignment.ipynb 中补充清洗前后的对比图使结论可验证。总结本课作业是一个以小见大的数据质量案例form.csv只有 10 行 3 列却同时覆盖了第 08 课讲解的格式化不一致、缺失数据、枚举错乱、可视化失真等全部核心主题。完整的解决路径是看源头审查 index.html自由文本控件是一切脏数据的起点看数据用 assignment.ipynb 加载 data/form.csv用info()、unique()、value_counts()定位问题用本课技术清洗以 README.md 和 notebook.ipynb 中的大小写归一化、映射表、fillna/dropna、drop_duplicates等方法修复数据反向优化表单把「清洗时遇到的每一种变体」翻译成一条表单改进建议形成采集与清洗的正向循环。这也是本课想传达的核心方法论数据准备不只是事后擦屁股更是数据链路设计的起点。当你下一次遇到图表看起来不对的反馈时不妨先问一句数据从哪个表单、哪个控件、哪种自由输入里来【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考