1、 EDA目标
- EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用。
- 当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。
- 引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。
2、 内容介绍
- 载入各种数据科学以及可视化库:
- 数据科学库 pandas、numpy、scipy;
- 可视化库 matplotlib、seabon;
- 载入数据:
- 载入训练集和测试集;
- 简略观察数据(head()+shape);
- 数据总览:
- 通过describe()来熟悉数据的相关统计量
- 通过info()来熟悉数据类型
- 判断数据缺失和异常
- 查看每列的存在nan情况
- 异常值检测
- 了解预测值的分布
- 总体分布概况
- 查看skewness and kurtosis
- 查看预测值的具体频数
3、代码实践
3.1 载入各种库
#coding:utf-8
#导入warnings包,利用过滤器来实现忽略警告语句。
import warnings
warnings.filterwarnings('ignore')
import missingno as msno #缺失值可视化
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
3.2 加载训练集和测试集
path='./data/'
train_data=pd.read_csv(path+'train.csv')
test_data=pd.read_csv(path+'testA.csv')
3.3 初看数据
观察行列信息
print('Train_data shape:',train_data.shape)
print('Test_data shape:',test_data.shape)
Train_data shape: (100000, 3)
Test_data shape: (20000, 2)
查看首尾数据
train_data.head().append(train_data.tail())
- id - 心跳信号分配的唯一标识
- heartbeat_signals - 心跳信号序列
- label - 心跳信号类别(0、1、2、3)
3.5 数据总览
train_data.describe()
-
data.describe()
——获取数据的相关统计量 -
describe种有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值 看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下
train_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000 entries, 0 to 99999
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 100000 non-null int64
1 heartbeat_signals 100000 non-null object
2 label 100000 non-null float64
dtypes: float64(1), int64(1), object(1)
memory usage: 2.3+ MB
-
data.info()
——获取数据类型 -
info 通过info来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常
3.6 判断数据缺失和异常
train_data.isnull().sum()
id 0
heartbeat_signals 0
label 0
dtype: int64
test_data.isnull().sum()
id 0
heartbeat_signals 0
dtype: int64
- 得知训练集和测试集均无缺失值
3.7 预测值分布
1> 预测值频数分析
- 频数统计
train_data['label'].value_counts()
0.0 64327
3.0 17912
2.0 14199
1.0 3562
Name: label, dtype: int64
- 直方图、饼图可视化统计
# 目标变量分布可视化
fig,axs=plt.subplots(1,2,figsize=(14,7))
# 柱状图
sns.countplot(x='label',data=train_data,ax=axs[0])
axs[0].set_title('Frequency of each Class')
# 饼图
train_data['label'].value_counts().plot(x=None,y=None,kind='pie',ax=axs[1],autopct='%1.2f%%')
axs[1].set_title('Percentage of each Class')
2> 预测值分布
- 为什么要分析预测值分布?
- 查看数据是否服从正态分布
- 为什么要转化为正态分布?
- 数据整体服从正态分布,那样本均值和方差则相互独立,正态分布具有很多好的性质,很多模型假设数据服从正态分布。例如线性回归(linear regression),它假设误差服从正态分布,从而每个样本点出现的概率就可以表示为正态分布形式,将多个样本点连乘再取对数,就是所有训练集样本出现的条件概率,最大化该条件概率就是LR最终求解的问题。这里这个条件概率的最终表达式的形式就是我们熟悉的误差平方和。总之, ML中很多model都假设数据或参数服从正态分布。
- 转化方法
- 线性变化z-scores
使用Boxcox 变换
使用 yeo-johnson 变换
注:盲目假设变量服从正态分布可能导致不准确的结果,要结合分析。例如:不能假设股票价格服从正态分布,因为价格不能为负,故我们可以将股票价格假设为服从对数正态分布,以确保其值≥0;而股票收益可能是负数,因此收益可以假设服从正态分布 - 无界约翰逊分布?
当样本数据表明质量特征的分布为非正态时,应用基于正态分布的方法会作出不正确的判决。约翰逊分布族即为经约翰变换后服从正态分布的随机变量的概率分布,约翰逊分布体系建立了三族分布,分别为有界SB 、对数正态SL和无界SU。
import scipy.stats as st
y=train_data['label']
plt.figure(1); plt.title('Default')
sns.distplot(y, rug=True, bins=20)
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)
3)查看skewness and kurtosis
skewness偏度:
- 是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。定义上偏度是样本的三阶标准化矩。
- 偏度定义中包括正态分布(偏度=0),右偏分布(也叫正偏分布,其偏度>0),左偏分布(也叫负偏分布,其偏度<0)。
kurtosis峰度
- 峰度(peakedness;kurtosis)又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度。随机变量的峰度计算方法为:随机变量的四阶中心矩与方差平方的比值。
- 峰度包括正态分布(峰度值=3),厚尾(峰度值>3),瘦尾(峰度值<3)
print('Skewness: %f' % train_data['label'].skew())
print('Kurtosis: %f' % train_data['label'].kurt())
Skewness: 0.871005
Kurtosis: -1.009573
4> 用pandas_profiling生成数据报告
import pandas_profiling
pfr = pandas_profiling.ProfileReport(train)
pfr.to_file('./example.html')