在当今这个数据驱动的世界里,数据是我们前沿团队的生命线,而从数据中提取见解的能力已成为一项至关重要的生存技能。随着我们步入 2026 年,探索性数据分析(EDA) 的定义和执行方式正在经历一场深刻的变革。它不再仅仅是绘制直方图和检查缺失值那么简单,而是演变成了一种结合了领域知识、统计直觉以及 AI 辅助编程的混合艺术形式。
探索性数据分析(EDA)是一种强大的方法,它允许分析师、科学家和研究人员在进行正式建模或假设检验之前,全面地了解他们的数据。这是一个迭代的过程,涉及汇总、可视化和探索数据,以发现那些并非显而易见的模式、异常和关系。在这篇全面的文章中,我们将深入理解并融合 2026 年最新的开发理念,探讨执行 EDA 的关键步骤。以下是帮助我们掌握现代 EDA 的步骤:
- 步骤 1: 理解问题和数据
- 步骤 2: 导入并检查数据(现代化工作流)
- 步骤 3: 处理缺失值
- 步骤 4: 探索数据特征
- 步骤 5: 执行数据转换
- 步骤 6: 可视化数据关系
- 步骤 7: 处理异常值
- 步骤 8: 沟通发现与见解
目录
步骤 1:理解问题和数据
任何数据分析项目的第一步,都是要清楚地理解我们要解决的问题以及我们手头拥有的数据。但在 2026 年,这一步引入了“Agentic AI”(代理式 AI)的概念。我们不再仅仅是独自面对文档,而是与 AI 结对编程,共同梳理业务逻辑。
这包括提出以下问题:
- 我们要解决的业务目标或研究问题是什么?
- 数据中有哪些变量,它们的含义是什么?
- 数据类型是什么(数值型、分类型、文本型等)?
- 是否存在已知的数据质量问题或局限性?
- 是否存在相关的领域特定问题或约束条件?
2026 年实战建议: 在这个阶段,我们建议使用类似 Cursor 或 Windsurf 这样的 AI 原生 IDE。我们可以直接向 AI 询问数据字典的上下文,甚至让 AI 帮助我们生成初步的假设检验清单。通过彻底了解问题和数据,我们可以更好地制定分析策略,避免做出错误的假设或得出有缺陷的结论。
步骤 2:导入并检查数据 (现代化工作流)
一旦我们对问题和数据有了清晰的理解,下一步就是将数据导入到我们的分析环境。在本文中,我们将继续使用经典的员工数据集(包含 8 列:First Name, Gender, Start Date, Last Login Time, Salary, Bonus%, Senior Management, Team),但我们将采用更严谨、更具工程化的方式来处理。
在 2026 年的生产环境中,仅仅使用 pd.read_csv 是不够的。我们需要考虑类型推断的性能优化以及潜在的编码错误。让我们来看看如何在生产级代码中优雅地完成这一步。
以下是我们可以在这一阶段执行的一些任务:
- 使用类型提示 :明确指定 DataFrame 的结构,这在大型项目中至关重要。
- 利用 Polars 加速:对于大数据集,我们可能会切换到 Polars 而不是 Pandas。
- 异常处理机制:捕获文件读取时的权限或编码错误。
让我们使用 Pandas 的 INLINECODE920696d0 函数读取数据集,并打印前 5 行。为了打印前五行,我们将使用 INLINECODEe4b7f693 函数。
Python3
import pandas as pd
import numpy as np
from typing import TypedDict
class EmployeeSchema(TypedDict):
First Name: str
Gender: str
Salary: int
# ... 其他字段定义
# 生产环境读取实践:指定类型和日期格式,避免自动推断的开销
df = pd.read_csv(
‘employees.csv‘,
parse_dates=[‘Start Date‘, ‘Last Login Time‘], # 自动解析日期
dtype={
‘Senior Management‘: ‘boolean‘, # 优化内存占用
‘Gender‘: ‘category‘
},
encoding_errors=‘replace‘ # 防止非法字符导致崩溃
)
# 快速概览
df.head()
输出:
First Name Gender Start Date Last Login Time Salary Bonus % Senior Management Team
0 Douglas Male 8/6/1993 12:42 PM 97308 6.945 True Marketing
1 Thomas Male 3/31/1996 6:53 AM 61933 4.170 True NaN
2 Maria Female 4/23/1993 11:17 AM 130590 11.858 False Finance
3 Jerry Male 3/4/2005 1:00 PM 138705 9.340 True Finance
4 Larry Male 1/24/1998 4:47 PM 101004 1.389 True Client Services
获取关于数据集的见解
让我们使用 shape 来看看数据的形状。
Python3
df.shape
输出:
(1000, 8)
这意味着该数据集有 1000 行和 8 列。
现在,让我们也看看这些列及其数据类型。为此,我们将使用 info() 方法。注意,我们在读取时已经指定了类型,所以这里的显示应该更加精准。
Python3
# information about the dataframe
df.info()
输出:
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 First Name 933 non-null object
1 Gender 996 non-null category
2 Start Date 1000 non-null datetime64[ns]
3 Last Login Time 1000 non-null object
4 Salary 1000 non-null int64
5 Bonus % 1000 non-null float64
6 Senior Management 1000 non-null boolean
7 Team 957 non-null object
dtypes: boolean(1), category(1), datetime64[ns](1), float64(1), int64(1), object(3)
memory usage: 51.4+ KB
步骤 3:智能处理缺失值
在 2026 年,处理缺失值不再仅仅是简单的“删除”或“填充均值”。我们需要利用 LLM(大语言模型)辅助的上下文理解,来判断缺失值的性质(MCAR, MAR, MNAR)。
我们可能会遇到这样的情况: INLINECODE6600e548 和 INLINECODEb82e7e00 列中有缺失值。盲目删除可能会导致重要信息的丢失。
让我们来看看如何编写鲁棒的代码来处理这些情况:
Python3
# 检查缺失值模式
missing_counts = df.isnull().sum()
missing_percentage = (missing_counts / len(df)) * 100
print("缺失值统计:")
print(pd.DataFrame({‘Count‘: missing_counts, ‘Percentage‘: missing_percentage}))
# 决策逻辑示例:
# 1. 如果 ‘Gender‘ 缺失且比例小于 5%,我们可以尝试推断或删除(取决于模型要求)
# 2. 如果 ‘Team‘ 缺失,可能意味着该员工未分配,应填充为 "Unassigned" 而非删除
# 执行填充(生产级代码应记录修改日志)
df[‘Team‘] = df[‘Team‘].fillna(‘Unassigned‘)
# 对于 First Name,如果是分析无关紧要的列,可以考虑保留
# 但如果用于关联,则必须处理。这里我们假设对 Salary 分析不重要,暂时保留。
在我们的经验中,利用 AI 辅助工具(如 ChatGPT 或 Cursor)可以帮助我们快速生成针对特定列的缺失值处理策略建议,只需简单地选中数据列并询问:“这一列的缺失模式是什么?最佳处理策略是什么?”
步骤 4:深入探索数据特征
理解每个变量的分布和特征是 EDA 的核心。在传统的 INLINECODE16fa7479 方法之外,我们建议引入更高级的自动化分析库,如 INLINECODE2ce5bb1b(原 pandas-profiling),它能一键生成包含相关性、交互式可视化的 HTML 报告。
让我们思考一下这个场景:你刚刚拿到了数据,你需要在一小时内向利益相关者展示数据的全貌。手动绘图太慢了。
Python3
# 传统统计摘要
print("数值型数据统计摘要:")
print(df.describe())
print("
分类型数据统计摘要:")
print(df.describe(include=[‘category‘, ‘object‘, ‘boolean‘]))
补充见解: 对于 2026 年的开发者来说,不要忽视数据的“时序”特征。如果我们发现 Last Login Time 是 object 类型,我们需要将其转换为 datetime 以便进行时间序列分析。
步骤 5:执行数据转换
数据往往不是“开箱即用”的。我们需要执行一系列转换操作:
- 特征工程:从
Start Date提取工龄。 - 标准化/归一化:特别是当我们准备将数据输入到基于梯度的模型中时。
Python3
from datetime import datetime
# 1. 计算工龄(特征工程示例)
current_date = pd.to_datetime(‘2026-01-01‘) # 假设当前年份为 2026
df[‘Start Date‘] = pd.to_datetime(df[‘Start Date‘])
df[‘Years_at_Company‘] = (current_date - df[‘Start Date‘]).dt.days / 365.25
# 2. 薪资标准化(针对后续建模的准备)
df[‘Salary_Normalized‘] = (df[‘Salary‘] - df[‘Salary‘].mean()) / df[‘Salary‘].std()
print(df[[‘First Name‘, ‘Salary‘, ‘Years_at_Company‘, ‘Salary_Normalized‘]].head())
步骤 6:可视化数据关系
“一图胜千言”。在 2026 年,我们不仅关注静态图表,更关注可解释性。
让我们使用 Seaborn 来探索不同团队间的薪资分布情况。这是一个典型的业务问题:是否存在薪资歧视?
Python3
import seaborn as sns
import matplotlib.pyplot as plt
# 设置绘图风格
plt.style.use(‘seaborn-v0_8-whitegrid‘)
# 可视化:不同团队的平均薪资
plt.figure(figsize=(12, 6))
sns.barplot(x=‘Team‘, y=‘Salary‘, data=df, estimator=np.mean, errorbar=None, palette="viridis")
plt.title(‘2026 年各团队平均薪资分布‘, fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
陷阱提示: 你可能会遇到这样的情况——图表中的标签重叠严重。这就是为什么 INLINECODE5c150a0f 和 INLINECODEf12eef89 在生产级代码中是必不可少的。
步骤 7:处理异常值
异常值可能是噪声,也可能是革命性的发现。在现代数据工程中,我们不建议盲目删除异常值,而是要建立“监控机制”。
假设我们发现 Bonus % 中有一个超过 100% 的值。
Python3
# 使用 IQR 方法检测异常值
Q1 = df[‘Bonus %‘].quantile(0.25)
Q3 = df[‘Bonus %‘].quantile(0.75)
IQR = Q3 - Q1
filter = (df[‘Bonus %‘] >= Q1 - 1.5 * IQR) & (df[‘Bonus %‘] <= Q3 + 1.5 * IQR)
print(f"检测到的异常值数量: {df.shape[0] - filter.sum()}")
outliers = df[~filter]
print("异常值样本:")
print(outliers[['First Name', 'Bonus %']])
# 2026年最佳实践:将异常值记录到日志系统,而不是直接丢弃,以便后续审计
步骤 8:沟通发现与见解
最后,也是最重要的一步。我们需要将技术发现转化为业务语言。在 2026 年,我们可以利用 AI 生成摘要报告,或者使用 Streamlit 快速构建一个演示 App 供非技术团队探索数据。
总结:
通过上述步骤,我们不仅清洗了数据,还通过“Vibe Coding”(氛围编程)的方式——即与 AI 结对,快速验证了假设。掌握 EDA 不仅仅是会写代码,更是要具备从数据中发现故事、并利用现代工具(如 AI IDE、自动化报告工具)讲好这些故事的能力。希望这篇融合了 2026 年最新理念的文章能帮助你更好地掌握 EDA!