背景
这次的数据挖掘竞赛入门学习选取了阿里天池的二手车价格预测作为赛题,从数据竞赛的流程入手,为竞赛新人提供指导。那么,第二章主要是对数据探索性分析的介绍。
小插曲
翻开Datawhale提供的入门手册,打开Jupyter准备开敲,不料出现了报错,具体看:我如何发现打不开Jupyter的原因
数据探索性分析
数据探索性分析(Exploratory Data Analysis)目的在于熟悉与了解数据集,来满足以下目的:
- 确保数据集可以用于后续的机器学习或深度学习
- 了解自变量间以及自变量与因变量间的相互关系
- 通过数据处理与特征工程使得预测更加可靠
- 对数据进行一些图表或文字性描述
主要内容
-
载入库与数据
常用的库有:numpy, pandas, matplotlib, seaborn, (missingno缺失值可视化库)
常用的载入数据:pd.read_csv('data.csv')
- 数据总览
主要运用DataFrame的 describe(个数、平均值、方差、分位数等) 与 info (数据类型type,观察是否有Null值)来查看总体介绍。
运用 df.head(). append( df.tail( ) ) 可以查看前5行与后5行的具体数据(局部)。
- 判断数据缺失和异常
null值: df.isnull().sum()
可视化:可以尝试missingno库的可视化函数,如msno.matrix(), msno.bar()等
相应处理:null值过多可以考虑删掉该特征,少的可以选择填充。出现object类型可能是因为“-”的填充,需要多加留意,可以替换为nan。
倾斜:某些特征可能严重倾斜于某个值,方差较小,如全是1。这样的特征可以删除。
- 了解预测值的分布
许多模型要求变量独立且符合正态分布,因此有必要了解一下预测值的分布情况。可以运用可视化工具观察样本值的分布,如sns.distplot(), 其中的fit 参数可以拟合各种分布。尽量通过变换使变量近似服从正态分布。
此外还可以峰度与偏度,观察是否有异常值。可以用df.skew()(偏度), df.kurt()(峰度)结合distplot来查看。
- 类别特征与数字特征
特征一般可以分为类别特征与数字特征。
对于类别特征,使用df.value_count()可以查看类别有多少个。可以使用sns.boxplot()画出箱型图,观察异常值;如果用sns.violinplot()画出小提琴图,可以在箱型图的基础上观察概率密度,一举两得。sns.barplot()画出条形图也能帮你观察大致分布。
对于数字特征,可以进行相关性分析,剔除相关度高的,避免多重共线性或其他问题,可视化可用sns.heatmap()或sns.pairplot();还有之前提到的峰度与偏度,以及用distplot了解数据分布情况。也可以尝试用sns.regplot()来将不同特征与预测值强行拟合,当然regplot也能显示特征与预测值间的分布关系,也许会有一些规律给你启示。
画图可以参考这一篇:Pairplot多变量图
- 生成数据报告
使用pandas_profiling.ProfileReport(), 可以生成一个较为全面的可视化和数据报告(html文件)。
import pandas_profiling as pdpf
pf = pdpf.ProfileReport(df)
pf.to_file("./report.html")
总结
EDA是建模训练的第一步,主要是熟悉数据,挖掘潜在的信息,为后面的特征工程做好准备。其中涉及观察数字特征、了解数据类型、缺失处理、异常处理、可视化处理、相关性独立性分析等等,这都值得进一步研究,这篇文章目前只做了简略的介绍,可能以后还会进一步更新,尤其是可视化的图,还没来得及加上去。
参考资料
感谢Datawhale团队提供的教材,感兴趣的朋友可以参考Datawhale的github开源库。
如果想要加入学习,不妨关注一下Datawhale官方公众号。