EDA-探索性数据分析

一、EDA目标

引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。
值得注意的是, EDA过程中是对原始数据的特征(统计特征、分布特征、相关性等)进行挖掘, 但是没有删除或构造任何特征(花式查询, 不包括增、删、改)

二、EDA主要内容

1、载入各种数据科学以及可视化库:
数据科学库 pandas、numpy、scipy;(数据分析三剑客)
可视化库 matplotlib、seabon;
其他;
2、载入数据:
载入训练集和测试集;
简略观察数据(head()+shape);
3、数据总览:
通过describe()来熟悉数据的相关统计量
通过info()来熟悉数据类型
4、判断数据缺失和异常
查看每列的存在nan情况
异常值检测
5、了解预测值的分布
总体分布概况(无界约翰逊分布等)
查看skewness and kurtosis
查看预测值的具体频数
6、特征分为类别特征和数字特征,并对类别特征查看unique分布
7、 数字特征分析
相关性分析
查看几个特征的偏度和峰值
每个数字特征的分布可视化
数字特征相互之间的关系可视化
多变量互相回归关系可视化
8、类型特征分析
unique分布
类别特征箱形图可视化
类别特征的小提琴图可视化
类别特征的柱形图可视化类别
特征的每个类别频数可视化(count_plot)
9、用pandas_profiling生成数据报告

log变换之后的分布较均匀,可以进行log变换进行预测,这也是预测问题常用的trick

三、EDA + jupyter notebook的tricks

1、对某一列的内容进行字符替换(涉及到对某一列元素的任何地柜操作,都可以使用apply(lambda)模式)

Train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

因此上面的语句也可以写成:

Train_data['notRepairedDamage'].apply( lambda x: np.nan if x == '-' else x)

2、在进行特征分析过程中可以先把每一列的含义(包括赛题介绍的关键内容)在notebook中先列出来,就不用反复查看官方介绍了.
3、dataframe头尾一起查看

data.head().append(data.tail())

4、==describe() ==查看每列的统计量, 掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下
5、==info() == 通过info来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常(注意object类型)
6、使用missingno模块可视化缺失值

import missingno as msno
missing = data.isnull().sum()
missing = missing[missing>0]
missing.sort_values(inplace=True)
missing.plot.bar()

# 可视化看下缺省值
msno.matrix(Train_data.sample(250))

msno.bar(Train_data.sample(1000))

7、类别特征严重倾斜,一般不会对预测有什么帮助(类别分布严重偏斜), 删除特征
8、预测值分布(适用于分类和回归问题), 如果预测值不服从正态分布, 一般取对数.

import scipy.stats as st
y = Train_data['price']
plt.figure(1); plt.title('Johnson SU')
sns.distplot(y, kde=False, fit=st.johnsonsu)  # 界约翰逊分布
plt.figure(2); plt.title('Normal')
sns.distplot(y, kde=False, fit=st.norm)
plt.figure(3); plt.title('Log Normal')
sns.distplot(y, kde=False, fit=st.lognorm)

对正态分布的观察包括两个指标: 偏度和峰度

skewness(偏态/偏峰)

正偏态分布(positive skewness distribution)是指频数分布的高峰偏于左侧,偏态系数为正值的频数分布形态。偏态分布分为正偏态和负偏态。**当均值大于众数时称为正偏态;当均值小于众数时称为负偏态。**偏态衡量的是数据的不对称程度。

kurtosis(峰度)

峰度(peakedness;kurtosis)又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度。样本的峰度是和正态分布相比较而言统计量,如果峰度大于三,峰的形状比较尖,比正态分布峰要陡峭。反之亦然. 峰度衡量的是数据的尖锐程度
一般地:正态分布的峰度(系数)为常数3,均匀分布的峰度(系数)为常数1.8(也有说法kurtosis>0 表示与正态分布相比的尖峰, 经验证标准正态分布(0,1)峰度接近0)

# 标准正态分布峰值验证
a = np.random.normal(0, 1, 1000)
ans = pd.Series(a)
ans.kurt()

9、查看预测值的具体频数

plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()

10、类别特征和数字特征的筛选方法

numerical_features = Train_data.select_dtypes(include=[np.number])
categorical_features = Train_data.select_dtypes(include=[np.object])

11、每个类别特征都需要查看nunique()的分布情况, 可以直接遍历
12、分析每个数值类型特征与预测值之间的相关性

predict_corr = Train_data[numerical_features]
correlation = predict_corr.corr()
print(correlation['label'].sort_values(ascending=False), '\n')

13、数值特征和类别特征在分析特征间关系(数值特征)、特征分布(类别特征)的时候, 会需要大量可视化工作.
14、pandas_profiling包可以生成数据分析报告, 但是本人运行失败了,待查!!!

参考文章:
https://tianchi.aliyun.com/notebook-ai/detail?postId=95457

发布了48 篇原创文章 · 获赞 29 · 访问量 3017

猜你喜欢

转载自blog.csdn.net/weixin_35894210/article/details/105057041