Exploratory Data Analysis
在弄清数据之前弄清楚手中的数据.
探索性数据分析是指对数据进行初步调查,以发现模式,发现异常情况,检验假设并在汇总统计信息和图形表示的帮助下检查假设的关键过程。
价值主要在于熟悉数据集,了解数据集,
确定所获得数据集可以用于接下来的机器学习或者深度学习使用。
了解变量间的相互关系以及变量与预测值之间的存在关系。
各种数据科学以及可视化库
数据科学库 pandas、numpy、scipy;
可视化库 matplotlib、seabon;
import warnings
#导入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
载入数据集
Train_data = pd.read_csv('./train.csv') # ...('./train.csv'; sep = ';') sep指数据之间的分隔符。
Test_data = pd.read_csv('./testA.csv')
观察数据初始信息
data.head().append(data.tail())——观察首尾数据
data.shape——观察数据集的行列信息
Train_data.head().append(Train_data.tail()) #默认值是5,也就是0-4行
Train_data.shape
## >> (100000, 3)
## 也就是说数据集包含100000个观测值和3个特征(一个是数据本身)。
Test_data.shape
## >> (20000, 2)
## 也就是说数据集包含20000个观测值和2个特征。
养成看数据集的head()以及shape的习惯
如果对自己的pandas等操作不放心,建议执行一步看一下,这样会有效的方便你进行理解函数并进行操作
总览数据概况
data.describe()——获取数据的相关统计量
data.info()——获取数据类型
describe 有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值。
主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下
%50就是中位数
通过info来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常
知道列及其对应的数据类型以及查找它们是否包含空值
判断数据缺失和异常
data.isnull().sum()——查看每列的存在nan情况
Train_data.isnull().sum()
Test_data.isnull().sum()
了解预测值的分布
Train_data['label']
Train_data['label'].value_counts()
> 0.0 64327
> 3.0 17912
> 2.0 14199
> 1.0 3562
> Name: label, dtype: int64
## 大部分都集中在类别0, 类别2,3数据差不多,少部分在类别1。
Train_data.label.unique() >> array([0., 2., 3., 1.]) ##展现label的所有不同取值
总体分布概况(无界约翰逊分布等)
在seaborn中最简便查看单元分布的函数是distplot().该函数默认绘制直方图并拟合内核密度估计。通过调整参数可以分别绘制直方图,拟合内核密度图,地毯图等
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
该函数结合了matplotlib中的 hist函数(自动计算一个默认的合适的bin大小)、seaborn的kdeplot()和rugplot()函数。它还可以拟合scipy.stats分布并在数据上绘制估计的PDF(概率分布函数)。
a:Series、1维数组或者列表。
观察数据。如果是具有name属性的Series对象,则该名称将用于标记数据轴。
bins
直方图bins(柱)的数目
hist
是否绘制(标准化)直方图.
kde
是否绘制高斯核密度估计图。
rug
是否在横轴上绘制观测值竖线。
fit
一个带有fit方法的对象,返回一个元组,该元组可以传递给pdf方法一个位置参数,该位置参数遵循一个值的网格用于评估pdf。
{hist, kde, rug, fit}_kws
底层绘图函数的关键字参数。
color
可以绘制除了拟合曲线之外所有内容的颜色。
vertical
如果为True,则观测值在y轴显示。
norm_hist
如果为True,则直方图的高度显示密度而不是计数。如果绘制KDE图或拟合密度,则默认为True。
axlabel
横轴的名称。如果为None,将尝试从a.name获取它;如果为False,则不设置标签。
label
图形相关组成部分的图例标签。
## 1) 总体分布概况(无界约翰逊分布等)
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)
2)查看skewness and kurtosis
峰度(Kurtosis)与偏态(Skewness)就是量测数据正态分布特性的两个指标。
峰度衡量数据分布的平坦度(flatness)。尾部大的数据分布,其峰度值较大。正态分布的峰度值为3。正态分布(峰度值=3),厚尾(峰度值>3),瘦尾(峰度值<3)
偏态量度对称性。0说明是最完美的对称性,正态分布的偏态就是0。右偏态为正,表明平均值大于中位数。反之为左偏态,为负。
sns.distplot(Train_data['label']);
print("Skewness: %f" % Train_data['label'].skew())
print("Kurtosis: %f" % Train_data['label'].kurt())
Train_data.skew(), Train_data.kurt()
sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness')
3) 查看预测值的具体频数
plt.hist(Train_data['label'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()
用pandas_profiling生成数据报告
import pandas_profiling
pfr = pandas_profiling.ProfileReport(data_train)
pfr.to_file("./example.html")