1. 数据科学工作流的核心三板斧
数据收集、清洗与探索性分析(EDA)构成了数据科学项目的基础工作流,就像厨师做菜前的食材采购、处理和试味环节。我在金融、电商和物联网领域处理过上百个数据集,发现80%的项目时间都消耗在这三个阶段,而模型构建往往只占剩余20%。
这三个环节看似简单,实则暗藏玄机。上周刚处理过一个电商用户行为数据集,原始500万条记录经过清洗后只剩320万条有效数据——近36%的垃圾数据如果不处理就直接建模,得出的推荐算法准确率会直接腰斩。下面我就结合具体案例,拆解每个环节的实战要点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据收集:多渠道原料采购的艺术
2.1 数据源类型与采集策略
数据收集就像建造房屋打地基,常见的数据源主要有三类:
- 结构化数据:数据库表格(MySQL、PostgreSQL)、CSV/Excel文件
- 半结构化数据:JSON、XML、网页数据(需BeautifulSoup解析)
- 非结构化数据:文本、图像、音频视频(需特殊处理)
最近处理的一个智能家居项目,需要同时从SQL数据库(设备状态日志)、API接口(天气数据)和PDF报告(维护记录)三种渠道采集数据。这里有个实用技巧:用Python的sqlalchemy+requests+pdfplumber组合可以统一处理这三种格式:
python复制# 多源数据采集示例
from sqlalchemy import create_engine
import requests
import pdfplumber
# 数据库采集
engine = create_engine('mysql://user:pass@localhost/db')
df_sql = pd.read_sql('SELECT * FROM device_logs', engine)
# API采集
weather_data = requests.get('https://api.weather.com/v1/forecast').json()
# PDF采集
with pdfplumber.open("maintenance.pdf") as pdf:
pdf_text = "\n".join([page.extract_text() for page in pdf.pages])
2.2 数据采集的常见陷阱
采集环节最容易踩的三个坑:
- 采样偏差:比如只采集工作日数据会遗漏周末模式
- API限流:免费API常有请求次数限制(用
time.sleep()控制频率) - 编码问题:特别是中文网页的GBK/UTF-8混用(建议统一转UTF-8)
重要提示:采集金融数据时务必注意合规性,个人隐私数据需脱敏处理
3. 数据清洗:从脏数据到干净数据的炼金术
3.1 结构化数据清洗四步法
清洗流程我总结为"删补转分"四步:
- 删除无效数据:缺失值、重复值、异常值
python复制# 删除缺失率超过50%的列 df = df.loc[:, df.isnull().mean() < 0.5] - 补全缺失值:均值/中位数填充、前后值填充、模型预测填充
- 格式转换:日期标准化、文本向量化、分类编码
- 分箱处理:连续变量离散化(比如年龄分段)
最近清洗某电商数据集时,发现"购买金额"列有5%的负值——经查是退货订单。这里不能简单删除,而应该新建"退货标志"列,将金额取绝对值:
python复制df['is_return'] = df['amount'] < 0
df['amount'] = df['amount'].abs()
3.2 非结构化数据清洗技巧
处理文本数据时,我的清洗流水线通常包括:
- 去除HTML标签(用
BeautifulSoup.get_text()) - 统一全角/半角字符(用
unicodedata.normalize) - 提取关键实体(用
spacy或jieba分词)
图像数据则需要注意:
- 统一尺寸和格式(OpenCV的
resize) - 颜色通道标准化(RGB转灰度)
- 异常图像过滤(模糊/破损检测)
4. 探索性分析(EDA):数据侦探的破案工具包
4.1 单变量分析三板斧
- 分布可视化:直方图+密度图看数据形态
python复制import seaborn as sns sns.displot(data=df, x='age', kde=True, bins=30) - 描述统计:五数概括(最小值、Q1、中位数、Q3、最大值)
- 异常检测:3σ原则或IQR方法找离群点
4.2 多变量关系挖掘
- 相关分析:热力图看变量间相关性
python复制corr_matrix = df.corr() sns.heatmap(corr_matrix, annot=True) - 交叉分析:透视表看分类变量关系
python复制pd.pivot_table(df, values='sales', index=['region'], columns=['product_type'])
4.3 高级EDA技巧
- 地理空间分析:用
geopandas绘制热力地图 - 时间序列分解:用
statsmodels做趋势/周期分析 - 交互式探索:
plotly动态可视化
最近分析城市交通数据时,用folium绘制了交通事故热力图,意外发现学校周边事故率在工作日早高峰显著升高——这个洞察直接影响了交警的执勤安排。
5. 常见问题排查手册
5.1 数据收集问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| API返回空数据 | 参数错误/权限不足 | 检查API文档,添加API Key |
| 数据库连接超时 | 网络问题/配置错误 | 测试telnet端口,检查连接字符串 |
| PDF解析乱码 | 字体编码问题 | 尝试pdfminer或调整编码参数 |
5.2 数据清洗问题
- 问题:日期解析失败(如"2023年5月1日")
- 解决:用
dateparser库处理多语言日期:python复制import dateparser df['date'] = df['date_str'].apply(dateparser.parse)
5.3 EDA问题
- 问题:图表显示不全(Jupyter Notebook中)
- 解决:调整matplotlib参数:
python复制import matplotlib.pyplot as plt plt.rcParams['figure.figsize'] = [12, 6] plt.rcParams['font.size'] = 14
6. 工具链推荐与性能优化
6.1 小型数据集工具组合
- Python套餐:pandas + seaborn + jupyter
- R套餐:dplyr + ggplot2 + RMarkdown
6.2 大数据集处理方案
- Dask:类似pandas但支持分布式
python复制import dask.dataframe as dd ddf = dd.read_csv('large_file_*.csv') - Spark SQL:处理TB级数据
python复制df_spark = spark.read.parquet("hdfs://path/to/data")
6.3 自动化EDA工具
- Pandas Profiling:一键生成EDA报告
python复制from pandas_profiling import ProfileReport profile = ProfileReport(df) profile.to_file("report.html") - Sweetviz:对比两个数据集差异
在实际项目中,我通常会先用Pandas Profiling快速扫描数据全貌,再针对关键变量深入分析。最近分析一个包含200+列的医疗数据集时,这个工具帮我快速定位到12个关键特征,节省了数小时手动分析时间。
7. 实战案例:电商用户行为分析
7.1 数据准备
使用公开的Taobao用户行为数据集:
- 原始数据:1GB CSV文件
- 字段:user_id, item_id, category_id, behavior_type, timestamp
7.2 清洗重点
- 处理异常时间戳(未来时间记录)
- 过滤爬虫流量(同一user_id高频请求)
- 行为类型编码(pv→1, cart→2等)
7.3 EDA发现
- 用户活跃度呈双峰分布(早晚高峰)
- 加入购物车到购买的转化率仅8.3%
- 周末的收藏行为比工作日高40%
通过这个分析,我们建议客户优化购物车提醒策略,最终将转化率提升到了12.1%。
8. 经验总结与进阶建议
数据清洗时一定要保留原始数据的备份,所有转换步骤都应该记录在代码中形成pipeline。我习惯用sklearn的FunctionTransformer构建可复用的清洗流程:
python复制from sklearn.pipeline import Pipeline
from sklearn.preprocessing import FunctionTransformer
clean_pipe = Pipeline([
('drop_na', FunctionTransformer(lambda df: df.dropna(subset=['key_col']))),
('fix_dates', FunctionTransformer(parse_dates)),
('encode_cats', FunctionTransformer(encode_categories))
])
clean_df = clean_pipe.fit_transform(raw_df)
对于想深入EDA的学习者,我推荐从Tukey的《探索性数据分析》经典著作开始,再过渡到现代的交互式分析工具。真正的EDA高手不仅会使用工具,更懂得如何从数据中提出正确的问题——这需要业务理解与统计思维的结合。
