我直接开始写吧。这篇EDA实战文章,我尽量把实操中真正会用到的东西讲透——不是教科书式地罗列函数,而是告诉你拿到一堆杂乱数据后,第一步该看什么、哪些坑必须避开、怎么从图表里读出业务信号。内容会覆盖从数据清洗到可视化分析的完整流程,也会分享一些我平时处理真实数据时积累的小习惯。
开场:为什么说EDA是数据科学里最像“侦探工作”的环节
做数据分析这几年,我越来越觉得EDA(探索性数据分析)是整个项目里最考验功力的环节。模型调参、特征工程这些固然重要,但真正决定项目成败的,往往是你对数据本身的理解深不深。拿到一份数据,先别急着建模,而是通过各种手段“盘问”它——分布什么样、有没有异常值、字段之间什么关系、缺失值背后有没有隐藏规律——这个过程就是EDA。
很多人把EDA简单理解成“画几张图看看”,这其实低估了它的价值。EDA的核心目标有三个:第一,摸清数据质量,决定后续清洗策略;第二,发现变量之间的关系模式,为特征工程和模型选型提供依据;第三,验证假设、产生新假设,帮业务方找到真正的洞察点。换句话说,EDA做得扎实,后面建模阶段踩坑的概率就会大大降低。
这篇内容是我在实战中总结的一套EDA操作流程,适合刚入门想系统掌握数据分析方法的朋友,也适合有一定经验但想规范自己分析流程的从业者。我会结合实际案例讲解每一步怎么做、为什么这么做,以及我在踩坑之后总结的一些经验。
1. 拿到数据后的第一件事:先别急着分析,先做全局体检
1.1 用info和describe快速建立数据全貌
每次拿到一份新数据集,我习惯先跑两行代码:df.info()和df.describe()。看起来简单,但这俩函数能在几十秒内帮你建立对数据的全局认知。
df.info()告诉你的是数据结构层面的信息:有多少行多少列、每列的类型是什么、非空值有多少。这里面信息量很大。比如你发现一个“年龄”字段被识别成了object类型,那基本可以断定数据里混入了脏值;再比如某列非空值数量明显少于总行数,说明缺失率不低,需要重点关注。
df.describe()则直接输出数值列的统计描述:均值、标准差、最小值、四分位数、最大值。通过这些统计量能快速发现异常。举个例子,假设订单金额字段的最小值是-9999,最大值为1亿,而中位数只有200元,这明显是有问题的。实际业务中我经常遇到这类情况——要么是默认值污染,要么是极端异常值。如果不做EDA直接建模,模型会被这些脏数据带偏。
1.2 字段类型和缺失值是最容易被忽略的“隐形炸弹”
我发现很多新手做数据分析时有个毛病:只管数值列,不管类别列和缺失值。实际上,字段类型看走眼、缺失值处理不当,往往是后续报错的根源。
先说说字段类型。比如时间列,Excel里看着是日期,用pandas读进来可能变成字符串。如果不转成datetime类型,后续做时间序列分析、按月份聚合时就会出问题。再比如ID列,如果数值很大,有时候会被读成int64,但它在业务上根本没有数值意义,参与计算反而可能溢出或产生无意义的结果。
缺失值更是EDA的重头戏。这里的关键不只是“有多少缺失”,而是“为什么缺失”。我用一个真实案例来说:之前分析某电商平台的用户留存数据,发现“用户等级”字段缺失了大约30%。如果直接按缺失值删除,或者统一填充成“普通用户”,结果就会失真——后来排查发现,这个字段是从另一个系统同步过来的,只有老用户才有数值,新用户还没来得及同步。缺失在这里代表的是“业务状态差异”,而不是“随机丢失”。这种判断,只能靠你结合业务背景去做,纯技术手段是得不出结论的。
2. 分布洞察:看懂单变量的“长相”才能判断该用什么模型
2.1 直方图和箱线图:数值分布的两个黄金搭档
数值型的单变量分析,我必看两个图:直方图和箱线图。这两个图组合使用,基本能把单变量分布的全貌呈现出来。
直方图用来观察分布的shape——是正态分布、偏态分布还是双峰分布。这直接决定后续建模的很多选择。比如收入、房价这类字段通常右偏严重,在回归模型里如果不做对数变换,模型很难学出好的效果;再比如双峰分布往往暗示数据里存在两个异质群体,可能需要分层分析或者聚类。
箱线图则对极端值特别敏感。箱线图的箱体范围是四分位距,上下须延伸到1.5倍IQR,超出这个范围的点会被标记为异常值。但这里我特别想提醒一句:箱线图标记的只是“统计意义上的离群点”,它跟“业务上的异常值”不是一回事。比如某些高端产品的销售额就是比普通产品高几个量级,这不是脏数据,而是业务常态。所以看到离群点别急着删,先问问业务方这是不是合理情况。
2.2 分类型变量的频次分析:类别变量的价值在于对比
类别变量的EDA思路跟数值变量完全不同。数值变量看分布,类别变量看频次和占比。一条value_counts()就能输出每个类别出现的次数和比例,这基本是类别变量分析的起点。
但光看频次还不够,我通常会画一张条形图,按照频次降序排列,这样能直观地看出类别集中度。有些场景下我会额外算一个“类别数量占比”——比如分析用户来源渠道,发现A渠道占总用户的70%,那其他所有渠道加起来才30%。这个信息对后续渠道策略很有价值:优化A渠道的转化效率,比在其它渠道上均摊精力来得更划算。
处理类别变量还有个容易踩的坑:类别值的不统一。比如“性别”这一列里,既有“男”“女”,又有“M”“F”,还有空字符串和“未知”。如果直接让机器学习模型去处理,它会把这些都当成不同的类别,产生一堆垃圾特征。所以EDA时一定要检查类别列的取值集合,把同义值合并、把无效值标为缺失。虽然这个操作听起来很基础,但我几乎在每一个实际项目里都会遇到类似问题。
2.3 偏度和峰度的数值判断:什么时候该做数据变换
光看图有时是不够的,因为“看起来差不多正态”和“真正近似正态”之间差距很大。这时候偏度(skewness)和峰度(kurtosis)这两个统计量就派上用场了。
偏度衡量分布的不对称性。偏度大于0表示右偏(长尾在右边),小于0表示左偏。绝对值超过1一般就认为是显著偏态,建议做变换处理。峰度衡量分布尾部的厚度,高峰度意味着数据有大量极端值。
常见的数据变换方案里,对数变换(log)是最常用的,能有效缓解右偏。平方根变换适合计数类数据,比如用户访问次数。Box-Cox变换则更灵活,它能自动寻找最优的变换参数,但要求数据全部为正。有一套经验法则分享给你:当偏度在0.5到1之间时,可以试一下对数变换;超过1则基本可以确定需要变换。变换之后你可以再算一次偏度,确认一下效果,这个反馈循环很重要。
这里用比较通俗的话解释一下为什么要关心偏度:很多统计模型(比如线性回归、方差分析)都假设误差近似正态分布。如果数据本身严重偏态,这个假设就被破坏了,模型效果会大打折扣。虽然现在很多树模型不care分布形态,但在特征层面做变换仍然有帮助,尤其是配合线性模型使用时。
3. 多变量关系探秘:从相关系数到交叉分析的进阶路径
3.1 散点图矩阵和热力图:让变量间关系“原形毕露”
单变量分析做完,下一步就是探索变量之间的关系。这里我常用的工具是散点图矩阵(scatter matrix)和相关性热力图(heatmap)。
散点图矩阵适合变量数量较少的时候(比如不超过10个),它能一次性展示所有两两组合的散点图。一眼扫过去,你能发现哪些变量之间有明显的线性趋势、哪些呈现非线性关系、哪些完全没关联。变量的组合比较多的时候,散点图矩阵会变得密集,我一般会图省事直接看相关性矩阵。
相关性热力图的核心是皮尔逊相关系数,取值范围从-1到1,衡量线性相关程度和方向。这是一个非常有用的工具,特别是在发现高度相关的特征对时,你可以考虑去重或者做特征选择,因为两个强相关特征同时放进模型,往往会引入共线性问题。
需要特别留心的是:皮尔逊相关系数只捕捉线性关系。如果两个变量之间是U型曲线关系,相关系数可能接近0,但它们其实有很强的非线性关联。所以光看相关系数有局限性,我只把它当作初步探测的手段,真正下结论前最好配合可视化检查。
3.2 分组对比分析:用groupby揭示类别间的差异
多变量分析里,有一类问题是“类别变量和数值变量的关系”。最典型的操作是按类别分组,计算数值变量的统计量,再对比差异。比如分析不同地区的客单价差异、不同营销渠道的转化率差异,这些都是这类问题。
我习惯用groupby加agg一步到位,同时算出均值、中位数、数量等指标。这里有个细节:均值容易受极端值影响,而中位数更稳健。当均值和中位数差异很大时,说明分组内部存在明显的极端值或分布不均,单看均值得出的结论可能会误导人。
比数值对比更进一步的是可视化对比——箱线图是这类场景的标配。同一个图里,X轴是类别,Y轴是数值,每个类别一个箱体,分布形状、中位数、离群点一目了然。如果两个类别的箱体几乎没有重叠,可以初步判断它们差异显著;如果重叠严重,即使均值差了一点点,也可能只是抽样波动。
这里也顺带提醒一下:这类对比分析只是描述性的,并不能替代严格的假设检验。判断差异是否“统计显著”,通常还需要配合t检验或方差分析来验证。但EDA阶段真正重要的,是生成“这两个群体可能存在差异”的假设,为后续深入分析指明方向。
3.3 时间序列数据的EDA:趋势、周期和异常一个都不能少
如果你的数据带有时间戳,那时间序列的EDA又是另一套玩法。按时间聚合、画趋势线,这是起步操作。但除此之外,还要关注三件事:趋势、周期和异常点。
趋势就是长期方向——是上升、下降,还是持平。周期则是规律性的波动,比如电商数据通常有“周末高、工作日低”的模式,或者“年末大促明显拉升”的年度周期。画一张按天聚合的折线图,再叠加一个滚动均值(比如7日滚动平均),趋势和周期会非常直观。滚动均值的窗口选择也有讲究,窗口太短压不住噪声,太长又会滞后于真实变化。我一般先试3天、7天、30天这几个档位,观察哪条曲线最有信号意义。
异常点在时间序列里通常表现为“突然的尖峰”或“断崖式的下跌”。之前做个零售数据分析,某SKU在某天的销量突然暴涨到平时的20倍,初看以为是活动促销,查证后发现是数据源重复上传导致。时间序列的EDA能帮你快速定位这种数据异常,避免它污染后续建模。
4. 数据清洗实战:一份可以直接抄作业的标准化流程
4.1 缺失值处理的三个关键决策点
EDA做完了,数据里有哪些问题基本心里有数了。这时候进入清洗阶段,第一个要面对的就是缺失值。怎么处理缺失值,行业里有整套方法论,但概括起来就是三个决策:这个字段重要吗?缺失比例多大?缺失机制是什么?
关于字段重要性和缺失比例,可以先画个表格来梳理,我简单举个例子:
| 字段 | 缺失比例 | 重要程度 | 处理建议 |
|---|---|---|---|
| 用户ID | 0% | 极高 | 无需处理 |
| 年龄 | 15% | 较高 | 结合业务中位数填充 |
| 收入 | 30% | 高 | 缺失本身就是信息,单独标记 |
| 备注 | 60% | 低 | 不参与建模,直接保留原样 |
缺失机制这块,我在前面提过要区分“随机缺失”和“非随机缺失”。如果是随机缺失,填充是合理的;如果是非随机缺失,比如高收入人群更倾向于不填收入,那缺失本身就是一个有价值的信息。这种情况下,我倾向于保留一个“是否缺失”的二值特征,让模型自己学这个信息。
填充方法上,均值/中位数填充适合数值列,众数填充适合类别列,前向填充适合时间序列。如果数据量充足且字段间关系紧密,也可以考虑用KNN或回归模型来预测缺失值。但我要说句实话:现实中大部分场景,简单填充就够了。模型对缺失值的敏感程度不一,树模型(比如XGBoost、LightGBM)本身就能处理缺失,这种情况下你甚至在建模时都不用刻意填充。
4.2 异常值识别:IQR法和Z-score法的适用边界
异常值处理,最常用的两种定量方法是IQR法和Z-score法。我在前文提过箱线图,它的底层逻辑就是IQR法。IQR是第三四分位数减第一四分位数,超出上下界(Q3+1.5*IQR / Q1-1.5*IQR)的点被视为异常。这个方法的优点是稳健,不受极端值影响;缺点是对于本来就偏态的数据,会把大量正常值误判为异常。
Z-score法则是基于均值和标准差。它假设数据近似正态分布,超过3倍标准差的点被看作异常。它的计算很快,但缺陷也很明显:均值和标准差本身会受异常值影响,异常越多,Z-score法的判断就越不稳定。所以实际应用中我很少单独用Z-score,更多是用它做初筛,再用可视化进一步确认。
这里分享一个经验:异常值不一定都要删除。如果异常值代表真实业务场景(比如大客户订单、头部玩家的极高消费),删除反而会损失重要信息。更好的做法是先把异常值单独拆出来看,了解它们对整体统计量的影响,再和业务方商量怎么处理。有时候“异常值”恰恰是最值得分析的信号。
4.3 重复值和格式统一:清洗里的“细节魔鬼”
重复值是数据清洗里最直白但也最容易被类型错判搞砸的问题。df.duplicated().sum()能返回完全重复的行数,但现实中更多是“业务主键重复”——同一订单出现多次、同一用户多条记录。这种重复不能简单地删掉一行了事,需要结合业务逻辑去判断保留哪一条。比如一个订单状态从“待支付”变成“已支付”,原始库可能存了两条记录,删哪条取决于你想分析的是支付前的转化行为还是支付后的完成状态。
格式统一是另一个细节坑。日期格式有“2024-01-01”和“2024/01/01”之分;手机号可能带国家码也可能不带;地址字段里混杂着全角半角字符。格式统一的核心思路是建立一套标准化的清洗函数,比如把所有日期转成datetime类型、把所有字符串strip掉空白、统一大小写。这个函数写好后,每次新数据进来都先过一遍,能省下大量后续排查的精力。
5. 用Python把EDA流程固化下来:推荐一套顺手的工作流
5.1 必备工具库:pandas、matplotlib、seaborn和plotly的分工
做EDA,我的主力工具是pandas加matplotlib,再加seaborn和plotly。pandas负责数据处理和基础统计量的计算,matplotlib负责底层绘图控制,seaborn在matplotlib基础上封装了一些高级统计图表,plotly则用来做交互式探索,尤其是数据量不大但维度较多时,交互式图表能更灵活地缩放、筛选和排查。
以下是这些工具的侧重点对比:
| 工具 | 核心用途 | 使用场景 |
|---|---|---|
| pandas | 数据清洗、聚合、统计量计算 | 所有环节的地基 |
| matplotlib | 基础图表绘制与细节控制 | 最终图表调整、出版级图表 |
| seaborn | 统计图表绘制 | 分布图、热力图、多变量探索 |
| plotly | 交互式可视化 | 数据量大、需要缩放检查时 |
对初学者,我的建议是先练透pandas加seaborn组合。seaborn的API对统计图表的覆盖度很高,一行代码就能画出像样的直方图、箱线图、热力图,非常适合EDA阶段的快速迭代。
5.2 我的EDA实操模板:一套代码走天下
下面是我平时做EDA最常用的一套模板代码,比较简单,但覆盖了前面讲的大部分内容。你可以直接复制下来,根据自己项目的数据去调整字段名。
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 加载数据 df = pd.read_csv('your_data.csv') # 全局设置 pd.set_option('display.max_columns', None) pd.set_option('display.width', 200) sns.set_style('whitegrid') # 第一步:结构概览 print(df.shape) print(df.info()) print(df.describe()) # 第二步:缺失值概览 missing = df.isnull().sum() missing_pct = (missing / len(df)) * 100 print(pd.DataFrame({'缺失数量': missing, '缺失比例': missing_pct})) # 第三步:数值变量分布探索 num_cols = df.select_dtypes(include=[np.number]).columns n_cols = len(num_cols) fig, axes = plt.subplots(nrows=(n_cols+1)//2, ncols=2, figsize=(14, (n_cols+1)//2*4)) for col, ax in zip(num_cols, axes.flatten()): sns.histplot(df[col], kde=True, ax=ax) ax.set_title(f'{col} 分布') plt.tight_layout() plt.show() # 第四步:类别变量探索 cat_cols = df.select_dtypes(include=['object']).columns for col in cat_cols: print(f'--- {col} ---') print(df[col].value_counts(dropna=False)) # 第五步:相关性热力图 if len(num_cols) > 1: plt.figure(figsize=(12, 10)) sns.heatmap(df[num_cols].corr(), annot=True, cmap='RdBu_r', center=0, fmt='.2f') plt.title('数值变量相关性热力图') plt.show()这套代码的流程是:先看数据结构,再看缺失,然后逐个看数值变量的分布,接着统计类别变量频次,最后看变量间的相关性。实际使用时,我会在这个基础模板之上,针对业务需求再增加比较分析、时间趋势分析等部分。模板的意义在于提供一个固定的起点,避免每次从零开始写代码,分析时也更不容易漏掉环节。
5.3 实战心得:EDA是“业务问题到数据问题”的翻译器
做EDA这段时间,我最大的感受是:EDA的价值不在操作本身,而在于把业务问题翻译成数据分析问题的能力。同样的数据,不同人分析出来的结论可能是截然不同的,差距就在这一步“翻译”上。
比如业务方给你一个目标:“分析用户流失原因”。数据到手后,你首先要做的是定义“流失”——是7天没登录算流失,还是30天没下单算流失?定义不同,分析对象就不同,结论可能也会反过来。EDA看起来是在分析数据,实际上是在帮你理清业务定义和假设。
另外,不要忽略和业务方沟通这个过程。EDA阶段产生的假设,最好都能去跟业务方快速验证一下。比如你发现某渠道用户的次日留存率显著低于其他渠道,业务方可能马上告诉你“该渠道本来就是拉新渠道,不能看留存,要看首单转化”。这种信息,任何技术手段都替代不了。把EDA技术功底和业务理解结合起来,分析结论才能站得住脚。
6. 数据可视化进阶:图表如何准确而高效地传递业务信号
6.1 图表的准确性:坐标轴、排序和比例尺不是为了好看
可视化是EDA的输出通道,图表的“准确”比“好看”更重要。这个“准确”主要体现在几个容易被忽略的细节上。
坐标轴的处理很关键。柱状图最好从0开始,否则会夸大组间差异;但折线图从0开始又可能让波动细节看不清,这时候可以适当裁剪范围,但要在图表上清楚标注。分类轴要不要排序也很有讲究——按频次降序排列能够让你一眼看到长尾结构,按字母排序基本等于不排序。比例尺的选择同样重要,比如对数值跨度很大的数据用对数坐标,能让分布结构清晰呈现出来,但一定要在轴标签上写清楚“对数坐标”,否则读者会被误导。
对比一下两种处理方式的差异:
| 场景 | 普通线性坐标 | 对数坐标 |
|---|---|---|
| 用户访问量分布 | 长尾严重,头部细节丢失 | 分布结构更加清晰 |
| 价格区间分析 | 高价区间被压缩成一团 | 中高低价格均可见分布 |
| 时间序列多序列对比 | 量级大的序列压制其他序列 | 不同序列的起伏节奏可公平对比 |
6.2 面向业务的图表设计:让结论自己“跳出来”
好的EDA图表,是让结论自己“跳出来”的,而不是让人盯着半天也找不到重点。这里有几个经验法则。
先想清楚这张图要回答什么问题,再决定画什么图。不是所有问题都需要复杂的图表。想对比大小,用柱状图;想看占比,用饼图(类别少于6个时比较好用)或堆积柱状图;想看趋势,用折线图;想看分布,用直方图或箱线图;想看关系,用散点图。图表类型选对了,信息传达就成功了大半。
颜色和标注方面,我的习惯是尽量减少背景噪音,让核心信息用亮色或不同标记突出。比如要比较A、B两个渠道的表现,其他渠道一律用灰色,只有这两个渠道用鲜艳的颜色,读者一眼就能聚焦在对比对象上。给关键点加简单标注(比如“峰值”“异常点”),也能大大降低阅读成本。这些细节看似微不足道,在实际汇报场景里,它们决定了你的分析能不能被快速理解和采纳。
6.3 常见可视化误区和排查技巧
可视化探索中有一个常见的误区,就是看到“图形样子怪异”就直接判定数据有问题。图形怪异有时确实是数据问题,但也有可能只是采样量不够,或者图形参数设置不恰当导致视觉误导。
比如直方图的bin宽度不同,画出来的分布形态可能完全不同。bin太窄,噪声很大,看不出整体趋势;bin太宽,又可能把重要的峰值细节抹掉。我通常会尝试几个bin宽度,选一个最能展现数据结构的。样本量过少的时候,直方图和箱线图都不太可靠,这时画成散点图或者用核密度估计(kde)会更合适。
画图之前先检查数据清洗结果也非常重要。如果分布图里出现一个明显的孤立值,先回去确认下这条数据有没有被错误赋值或重复计算,往往比在可视化层面反复调参更高效。一句话总结就是:可视化是EDA的窗口,但窗口擦得再亮,里面还得是真的数据才行。
7. 从EDA到建模:输出分析结论,形成数据报告
7.1 把EDA发现整理成可执行的结论
EDA的最终产出不只是一堆图表,而是一份能让别人看懂并且可执行的结论。我习惯把结论整理成“发现—影响—建议”三段式结构。举一个我在某电商项目里的真实案例:通过EDA发现,某渠道用户的次日留存率显著低于其他渠道,但7日留存率却持平。经过进一步分析发现,这个渠道的用户更多是冲动消费型——他们第一天下单后就不再活跃,但后续有需求时还是会回来。这个发现直接改变了渠道运营策略:对这个渠道不再追求“次日打开率”,而是把精力放在“首单体验”和“复购周期提醒”上。
整理EDA结论时,我建议区分事实和推测。事实是有数据支撑的观察,比如“A组用户的平均客单价是B组的1.8倍”;推测是基于现象产生的假设,比如“这可能是因为A组用户更多使用高端产品线”。在交流中明确区分这两者,能有效避免分析结论被过度解读。
7.2 构建EDA报告的模板与注意事项
一个规范的EDA报告值得沉淀成模板,方便之后每个项目复用。我常用的报告结构大致是这样的:
| 章节 | 核心内容 |
|---|---|
| 1. 数据概览 | 数据量、字段类型、样本时间跨度、数据来源说明 |
| 2. 数据质量评估 | 缺失值、重复值、异常值,以及对业务的潜在影响 |
| 3. 单变量分析 | 关键字段的分布、统计特征、分组对比结果 |
| 4. 多变量分析 | 相关性矩阵、交叉分析、时间趋势,提炼与目标相关的信号 |
| 5. 结论与建议 | 核心发现、对建模策略或业务动作的建议,保留的未尽事项 |
报告里有个我个人的习惯:对重要图表,统一图注风格,标记数据单位、时间范围和样本口径。比如“图3:不同渠道的次日留存率对比(样本:2024年6月,n=12万,仅包含已注册用户)”。口径标注清楚了,能避免很多人问“你这个数据哪来的、包含哪些用户”这类问题。
7.3 为什么EDA迭代本身就是一个持续学习的过程
我观察到一个现象:很多人在EDA阶段花的时间越少,后面建模调参花的时间越多。两个原因:一是数据没摸清,问题会延迟到模型阶段才暴露;二是EDA阶段形成的判断和假设,能帮你在建模阶段更高效地进行特征设计和模型选择。
这个关系可以用一个通俗的例子来理解:建楼的时候地质勘探做得扎实,地基就不用来回返工;勘探做得草率,等楼盖到一半才发现地基结构不对,重新返工的成本要高得多。EDA就像是分析项目的地质勘探环节。前期多花半天把数据问题摸透,后面省下的时间可能是一天甚至一周。
最后:分享几个我踩过的坑和小建议
做EDA这几年踩过不少坑,最后挑几个典型的分享下。
第一个坑是盲目相信统计指标,不做可视化确认。有一次我对某个字段的缺失值按比例做了“合理填充”,一条线性回归跑下来R²异常高,把我高兴坏了。后来画了张图才发现,高R²完全是被一个极端大值带出来的,跟模型本身没关系。可视化在这里救了我一回。
第二个坑是数据清洗做得太“干净”。有次做用户分析,为了“提升数据质量”,我把所有缺失值都删掉了,结果把最有价值的“高客单用户”群体删了个精光。后来才意识到,缺失值的分布本身往往就携带着业务信息。删除缺失值之前,先看看缺失值对应的样本在关键指标上是否有差异,这一步有时候比填充本身还重要。
第三个建议是EDA脚本一定要保存好,并注释清晰。你的分析结论是基于某些数据切片和清洗逻辑的,如果脚本乱糟糟的,三个月后需要复现或者更新数据时,你可能会忘掉自己当时为什么这么做。我现在都会在notebook的顶部写清楚:数据来源、时间范围、关键的清洗逻辑、以及目前遗留的问题。等数据更新了再跑一遍,检查结论是否依然成立。
EDA不是一个一次性的流程,而是跟数据和业务持续对话的过程。数据更新了、业务策略调整了,之前成立的结论也可能需要重新验证。保持这个迭代的心态,你的分析能力会随着每一次EDA的深入慢慢积累起来。希望这篇内容对正在学习数据分析的朋友有所帮助,实际操作时遇到问题也欢迎一起交流。