💡 Key Takeaways
- Step 1: Document Your Raw Data Before Touching Anything
- Step 2: Understand the Data Generation Process
- Step 3: Profile Your Data Systematically
- Step 4: Handle Missing Data with Strategy, Not Assumptions
我仍然记得那天我让公司损失了47,000美元,因为一个小数点错误。那是2016年,我在一家中型零售连锁店做数据分析师已经三年,我刚刚完成我认为是我们库存周转率的出色分析。高管团队很喜欢我的演示。他们立即根据我的建议批准了一笔巨额的重新订购。两周后,我们发现了真相:我没有清理一个数据集,其中价格记录不一致——有些是用美元,有些是用美分。我的“深入分析”是建立在垃圾数据上的,而导致的库存过剩我们花了六个月才清理完。
💡 关键要点
- 步骤 1:在触摸任何内容之前记录您的原始数据
- 步骤 2:了解数据生成过程
- 步骤 3:系统地描述您的数据
- 步骤 4:有策略地处理缺失数据,而不是假设
那次昂贵的错误教会了我一些东西,而十五年的经验只进一步加强了这一点:数据清理不是分析的无聊前提——它是决定您的见解是构建职业生涯还是摧毁它们的基础。今天,作为一名高级数据分析顾问,我处理过从500行到5000万条记录的各种数据集,涵盖医疗、金融、零售和制造业,我已经开发了一种系统的方法,在错误成为灾难之前就能发现它们。
统计数据令人震惊。根据IBM的统计,劣质数据的成本每年给美国经济造成约3.1万亿美元的损失。Gartner的研究显示,组织认为劣质数据每年造成平均1500万美元的损失。尽管有这些惊人的数字,我目睹了无数分析师——甚至是经验丰富的分析师——匆忙进行数据清理或完全跳过步骤,急于进入分析的“有趣”部分。
这份清单代表了清理数千个数据集的提炼智慧,犯下大量错误,并学习到真正重要的东西。这些不是理论最佳实践——而是那些给我的客户节省了数百万并让我的分析保持准确的具体步骤。
步骤 1:在触摸任何内容之前记录您的原始数据
数据清理的第一条规则是反直觉的:现在还不要清理任何内容。在你进行任何更改之前,你需要准确记录你收到的内容。我是通过一次客户的指责才吸取了这个教训,客户称我在他们的数据集中引入了错误。没有原始状态的文档,我没有办法证明在我接触数据之前就存在这些问题。
首先,创建一个数据接收记录。记录来源、接收日期、文件格式、行和列的数量、文件大小,以及提供者。截取前20行和最后20行的屏幕截图。计算基本统计数据:总单元格数、有多少为空、存在的数值类型。这大约需要十分钟,但为我节省了无数小时的回溯。
我使用一个简单的模板,每个数据集都填写。它包括预期行数(如果已知)、预期列及其用途、提供者提到的任何已知数据质量问题,以及我的初步观察。当后续出现问题时,这份文档变得无价——而且总会有问题出现。
接下来,备份原始数据并存储在一个你不会意外修改的位置。我将我的数据保存在一个名为“00_RAW_DO_NOT_TOUCH”的文件夹中,并设置为只读权限。你会惊奇于有多少次你需要回头查看原始数据,以验证某个异常是从一开始就存在的,还是在清理过程中引入的。
最后,创建一个数据清理日志。这是一个单独的文档,你将记录对数据集所做的每一个更改,为什么做这个更改,以及何时做的。听起来很繁琐,但这个日志已为我挽回了数不清的声誉。当利益相关者在六个月后质疑你的分析时,你将拥有一条完整的审计追踪,显示你是如何将原始数据转化为最终分析数据集的。
步骤 2:了解数据生成过程
你无法有效地清理你不理解的数据。这似乎显而易见,但我看到分析师在清理时不询问数据来源和生成方式的基本问题。这就像试图修理一个汽车发动机却不知道它是用汽油还是柴油运行。
数据清理不仅仅是修复错误——它是要充分了解你的数据,以便知道看起来像错误的东西实际上可能是一个重要的见解,而看起来正常的东西实际上可能是一个等待发生的灾难。
安排与提供数据的人员进行对话,或者更好的是,与你生成或录入数据的人员进行沟通。问这样的问题:这些数据是如何收集的?是手动录入还是自动生成的?哪个系统生成了这些数据?在收集期间是否存在已知问题?每列实际代表什么?有没有我应该了解的代码或缩写?
我之前花了两天时间试图弄清楚为什么一个“客户满意度”列中包含如“NPS_9”和“CSAT_7”的值。与数据录入团队的五分钟对话揭示他们在年中切换了调查系统,并使用了一种混合记数法。理解生成过程立即解释了看似损坏的数据。
特别注意理解你数据中预期的范围和关系。如果你正在处理销售数据,典型的订单价值是多少?从小到大的范围是多少?如果你在分析患者数据,应该预期到什么年龄范围?这些预期在清理过程中成为你的理智检查。
还要询问数据已经经历的任何转换。这是原始数据直接来自来源,还是有人已经清理、汇总或修改过?我遇到过的数据集已经经过三种不同的清理过程,由不同的人处理,每个人都引入了自己的假设和变化。了解这种历史帮助你理解异常情况并避免过度清理。
步骤 3:系统地描述您的数据
数据描述是你深入了解数据集的过程。这一步包括生成全面的统计数据和可视化,揭示你数据的实际结构和内容。我会花至少30分钟在小数据集上,而在大数据集上可能需要几个小时——这段时间在整个分析过程中是值得的。
| 数据质量问题 | 检测难度 | 潜在影响 | 常见来源 |
|---|---|---|---|
| 缺失值 | 容易 | 中等到高 | 系统错误、不完整表单、数据整合缺口 |
| 不一致的单位 | 困难 | 重大 | 多个数据源、国际系统、遗留迁移 |
| 重复记录 | 中等 | 中等 | 数据录入错误、系统故障、合并操作 |
| 异常值(无效) | 中等 | 高 | 输入错误、传感器故障、数据损坏 |
| 格式不一致 | 容易到中等 | 低到中等 | 手动输入、不同系统、日期/时间转换 |
对每一列,计算基础信息:非空值的数量、空值的数量、唯一值的数量、数据类型、最小值、最大值、均值、中位数和众数(如适用)。这些统计数据立即揭示问题。如果你的“年龄”列的最大值是847,那你就有问题。如果你的“州”列有73个唯一值,而美国只有50个州,那就是有问题。
为分类变量创建频率分布。每个唯一值出现多少次?我通过这种方式发现了无数的数据录入错误。例如,在一个美国州的数据集中,我发现“CA”出现了5,000次,“California”出现了200次,“ca”出现了50次,而“Calif”出现了30次。都是同一个州,四种不同的表示——每种都分裂了我的分析。
对于数值列,创建直方图和箱形图。这些可视化可以揭示分布、异常值和原始统计数据可能错过的意外模式。我曾发现一个“交易金额”列在999.99美元时有个可疑的峰值——结果发现支付系统有个错误记录了失败的交易为该金额,而不是空值。
检查看似随机数据中的意外模式。如果你有交易ID或客户ID应该是唯一的,验证它们是否确实是唯一的。我在“唯一标识符”列中发现重复ID的频率超过我所能承认的次数。此外,还要查看不应该存在的顺序模式—有时出现的数据与实际预期相悖。