天池二手车交易价格预测Task 02(数据的探索性分析)

1.前言介绍

上一期基本把握了赛题的理解,这一期着重对数据进行探索性分析,即EDA。参照学习文档,EDA的主要目标如下:

  • EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用。
  • 当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。
  • 引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。
  • 完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡。

2.学习任务

学习任务是对自身学习进度的目标安排,此处按照天池文档上的参考文档对自己的学习任务进行了适当的安排。

2.1 使用Anaconda安装各种包和库

#coding:utf-8
#导入warnings包,利用过滤器来实现忽略警告语句。
import warnings
warnings.filterwarnings('ignore')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno

诸如这些包和库对刚入手数据挖掘的人比较困难,此处我推荐使用windows的伙伴安装Anaconda3,通过在Anaconda上安装你所需要的包,参照知名CSDN主coderYYN的介绍,我简要总结下:

  1. 进入Anaconda的官网进行下载,选择你机器对应的Python版和操作系统的位数
  2. 找到安装包所在目录进行安装(ps:win10会自动帮你配置环境变量,否则需要自己配置环境变量)
  3. 使用Anaconda环境管理器安装某个包,使用命令:conda install 对应的包名

2.2 数据分析

2.2.1 数据总览

通过分析Task 2的代码,大部分的数据处理都是关于Pandas的,这里首先附上Pandas的中文链接并对部分代码进行分析。

## 1) 通过describe()来熟悉数据的相关统计量
Train_data.describe()
  SaleID name regDate model brand bodyType fuelType gearbox power kilometer ... v_5 v_6 v_7 v_8 v_9 v_10 v_11 v_12 v_13 v_14
count 150000.000000 150000.000000 1.500000e+05 149999.000000 150000.000000 145494.000000 141320.000000 144019.000000 150000.000000 150000.000000 ... 150000.000000 150000.000000 150000.000000 150000.000000 150000.000000 150000.000000 150000.000000 150000.000000 150000.000000 150000.000000
mean 74999.500000 68349.172873 2.003417e+07 47.129021 8.052733 1.792369 0.375842 0.224943 119.316547 12.597160 ... 0.248204 0.044923 0.124692 0.058144 0.061996 -0.001000 0.009035 0.004813 0.000313 -0.000688
std 43301.414527 61103.875095 5.364988e+04 49.536040 7.864956 1.760640 0.548677 0.417546 177.168419 3.919576 ... 0.045804 0.051743 0.201410 0.029186 0.035692 3.772386 3.286071 2.517478 1.288988 1.038685
min 0.000000 0.000000 1.991000e+07 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.500000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 -9.168192 -5.558207 -9.639552 -4.153899 -6.546556
25% 37499.750000 11156.000000 1.999091e+07 10.000000 1.000000 0.000000 0.000000 0.000000 75.000000 12.500000 ... 0.243615 0.000038 0.062474 0.035334 0.033930 -3.722303 -1.951543 -1.871846 -1.057789 -0.437034
50% 74999.500000 51638.000000 2.003091e+07 30.000000 6.000000 1.000000 0.000000 0.000000 110.000000 15.000000 ... 0.257798 0.000812 0.095866 0.057014 0.058484 1.624076 -0.358053 -0.130753 -0.036245 0.141246
75% 112499.250000 118841.250000 2.007111e+07 66.000000 13.000000 3.000000 1.000000 0.000000 150.000000 15.000000 ... 0.265297 0.102009 0.125243 0.079382 0.087491 2.844357 1.255022 1.776933 0.942813 0.680378
max 149999.000000 196812.000000 2.015121e+07 247.000000 39.000000 7.000000 6.000000 1.000000 19312.000000 15.000000 ... 0.291838 0.151420 1.404936 0.160791 0.222787 12.357011 18.819042 13.847792 11.147669 8.658418

8 rows × 30 columns

Pandas中describe()主要分析数据的基本统计量,如:

  • count:一列的元素个数;
  • mean:一列数据的平均值;
  • std:一列数据的均方差;(方差的算术平方根,反映一个数据集的离散程度:越大,数据间的差异越大,数据集中数据的离散程度越高;越小,数据间的大小差异越小,数据集中的数据离散程度越低)
  • min:一列数据中的最小值;
  • max:一列数中的最大值;
  • 25%:一列数据中,前 25% 的数据的平均值;
  • 50%:一列数据中,前 50% 的数据的平均值;
  • 75%:一列数据中,前 75% 的数据的平均值;

上述信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式。

除此之外,info()用来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常。

2.2.2 数据缺失

## 1) 查看每列的存在nan情况
Train_data.isnull().sum()
SaleID                  0
name                    0
regDate                 0
model                   1
brand                   0
bodyType             4506
fuelType             8680
gearbox              5981
power                   0
kilometer               0
notRepairedDamage       0
regionCode              0
seller                  0
offerType               0
creatDate               0
price                   0
v_0                     0
v_1                     0
v_2                     0
v_3                     0
v_4                     0
v_5                     0
v_6                     0
v_7                     0
v_8                     0
v_9                     0
v_10                    0
v_11                    0
v_12                    0
v_13                    0
v_14                    0
dtype: int64

通过此项api可以各列数据数据缺失值的统计,有利于我们后续进行插值、补值或删除等操作。缺失值处理的方法有很多,具体可以参考Pandas文档。

2.2.3 缺失值可视化包

这节我单独拎出来,因为我也了解很少/(ㄒoㄒ)/~~

missingno是一个灵活且易于使用的缺失数据可视化包,可以快速地总结数据集的完整性。

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

天池二手车交易价格预测Task 02(数据的探索性分析)_第1张图片

msno.matrix()为无效矩阵的密集展示,它可以快速直观地挑选出图案的数据完成。图中对应的白色粗线表示数据的缺失,白线越多,数据缺失越严重。

msno.bar(Test_data.sample(1000))

而msno.bar()生成柱状图,它是列的无效的简单可视化,它的生成图形如下:

天池二手车交易价格预测Task 02(数据的探索性分析)_第2张图片

关于missingno较细的讲解可参考Andy_shenzl 的博客!

2.2.4 异常值检验

手册上的处理方式是先通过info()显示数据的信息,然后对object类型的数据查看值分布(通过value_counts()的方式),对类别严重偏斜的数据列可进行删除。比如下面这种情形,一般就可直接删除。

Train_data["seller"].value_counts()
0.0    37249
-       8031
1.0     4720
Name: notRepairedDamage, dtype: int64

2.2.5 了解预测值的分布

(1) 这部分着重关注数据的分布,学习手册介绍了三种分布:无界约翰逊分布、正态分布、标准对数分布。

## 1) 总体分布概况(无界约翰逊分布等)
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)

天池二手车交易价格预测Task 02(数据的探索性分析)_第3张图片

天池二手车交易价格预测Task 02(数据的探索性分析)_第4张图片

天池二手车交易价格预测Task 02(数据的探索性分析)_第5张图片

无界约翰逊是正态分布转变成的也可以用质量控制过程中来描述非正态过程。

(2) 偏度和峰度的理解(可参考:https://www.cnblogs.com/wyy1480/p/10474046.html)

## 2) 查看skewness and kurtosis
import seaborn as sns
sns.distplot(Train_data['price']);
print("Skewness: %f" % Train_data['price'].skew())
print("Kurtosis: %f" % Train_data['price'].kurt())
Skewness: 3.346487
Kurtosis: 18.995183

天池二手车交易价格预测Task 02(数据的探索性分析)_第6张图片

用seaborn包画出来的偏度和峰度曲线如下:

# 画偏度
sns.distplot(Train_data.skew(),color='blue',axlabel ='Skewness')

# 画峰度
sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness')

天池二手车交易价格预测Task 02(数据的探索性分析)_第7张图片

天池二手车交易价格预测Task 02(数据的探索性分析)_第8张图片

2.2.6 数值型特征分析

(1) 热力图

相关性分析我们借助于热力图进行辅助分析。

## 1) 相关性分析
price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
print(correlation['price'].sort_values(ascending = False),'\n')

f , ax = plt.subplots(figsize = (7, 7))

plt.title('Correlation of Numeric Features with Price',y=1,size=16)

# sns画热力图,
sns.heatmap(correlation,square = True,  vmax=0.8)

这段代码的意思:先根据各列数据生成correlation二维数组,然后将这二维数据作为heatmap的第一个参数。

天池二手车交易价格预测Task 02(数据的探索性分析)_第9张图片

(2) 结构化多绘图网格

结构化多绘图网格讲的是数据集的不同子集上绘制同一图的多个实例,也是相关性分析的一种手段。这种技术有时被称为“格子”或“格子”绘图,它与“小倍数”的概念有关。它允许查看者快速提取有关复杂数据的大量信息。

## 3) 每个数字特征得分布可视化
f = pd.melt(Train_data, value_vars=numeric_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False)
g = g.map(sns.distplot, "value")

天池二手车交易价格预测Task 02(数据的探索性分析)_第10张图片

(3) 绘制成对数据关系

PairGrid允许使用相同的绘图类型快速绘制小子图的网格,以可视化每个子图中的数据。在一个PairGrid中,每个行和列都分配给不同的变量,因此结果图显示数据集中的每个成对关系。

## 4) 数字特征相互之间的关系可视化
sns.set()
columns = ['price', 'v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
sns.pairplot(Train_data[columns],size = 2 ,kind ='scatter',diag_kind='kde')
plt.show()

(4) 多变量关系(具体可参考https://www.jianshu.com/p/6e18d21a4cad)

## 5) 多变量互相回归关系可视化
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6), (ax7, ax8), (ax9, ax10)) = plt.subplots(nrows=5, ncols=2, figsize=(24, 20))
# ['v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
v_12_scatter_plot = pd.concat([Y_train,Train_data['v_12']],axis = 1)
sns.regplot(x='v_12',y = 'price', data = v_12_scatter_plot,scatter= True, fit_reg=True, ax=ax1)

v_8_scatter_plot = pd.concat([Y_train,Train_data['v_8']],axis = 1)
sns.regplot(x='v_8',y = 'price',data = v_8_scatter_plot,scatter= True, fit_reg=True, ax=ax2)

v_0_scatter_plot = pd.concat([Y_train,Train_data['v_0']],axis = 1)
sns.regplot(x='v_0',y = 'price',data = v_0_scatter_plot,scatter= True, fit_reg=True, ax=ax3)

power_scatter_plot = pd.concat([Y_train,Train_data['power']],axis = 1)
sns.regplot(x='power',y = 'price',data = power_scatter_plot,scatter= True, fit_reg=True, ax=ax4)

v_5_scatter_plot = pd.concat([Y_train,Train_data['v_5']],axis = 1)
sns.regplot(x='v_5',y = 'price',data = v_5_scatter_plot,scatter= True, fit_reg=True, ax=ax5)

v_2_scatter_plot = pd.concat([Y_train,Train_data['v_2']],axis = 1)
sns.regplot(x='v_2',y = 'price',data = v_2_scatter_plot,scatter= True, fit_reg=True, ax=ax6)

v_6_scatter_plot = pd.concat([Y_train,Train_data['v_6']],axis = 1)
sns.regplot(x='v_6',y = 'price',data = v_6_scatter_plot,scatter= True, fit_reg=True, ax=ax7)

v_1_scatter_plot = pd.concat([Y_train,Train_data['v_1']],axis = 1)
sns.regplot(x='v_1',y = 'price',data = v_1_scatter_plot,scatter= True, fit_reg=True, ax=ax8)

v_14_scatter_plot = pd.concat([Y_train,Train_data['v_14']],axis = 1)
sns.regplot(x='v_14',y = 'price',data = v_14_scatter_plot,scatter= True, fit_reg=True, ax=ax9)

v_13_scatter_plot = pd.concat([Y_train,Train_data['v_13']],axis = 1)
sns.regplot(x='v_13',y = 'price',data = v_13_scatter_plot,scatter= True, fit_reg=True, ax=ax10)

天池二手车交易价格预测Task 02(数据的探索性分析)_第11张图片

2.2.7 类别特征分析

(1) 箱型图

## 2) 类别特征箱形图可视化

# 因为 name和 regionCode的类别太稀疏了,这里我们把不稀疏的几类画一下
categorical_features = ['model',
 'brand',
 'bodyType',
 'fuelType',
 'gearbox',
 'notRepairedDamage']
for c in categorical_features:
    Train_data[c] = Train_data[c].astype('category')
    if Train_data[c].isnull().any():
        Train_data[c] = Train_data[c].cat.add_categories(['MISSING'])
        Train_data[c] = Train_data[c].fillna('MISSING')

def boxplot(x, y, **kwargs):
    sns.boxplot(x=x, y=y)
    x=plt.xticks(rotation=90)

f = pd.melt(Train_data, id_vars=['price'], value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False, size=5)
g = g.map(boxplot, "value", "price")

天池二手车交易价格预测Task 02(数据的探索性分析)_第12张图片

(2) 小提琴图

## 3) 类别特征的小提琴图可视化
catg_list = categorical_features
target = 'price'
for catg in catg_list :
    sns.violinplot(x=catg, y=target, data=Train_data)
    plt.show()

天池二手车交易价格预测Task 02(数据的探索性分析)_第13张图片

天池二手车交易价格预测Task 02(数据的探索性分析)_第14张图片

天池二手车交易价格预测Task 02(数据的探索性分析)_第15张图片

天池二手车交易价格预测Task 02(数据的探索性分析)_第16张图片

天池二手车交易价格预测Task 02(数据的探索性分析)_第17张图片

天池二手车交易价格预测Task 02(数据的探索性分析)_第18张图片

(3) 柱形图

天池二手车交易价格预测Task 02(数据的探索性分析)_第19张图片

2.2.8 用pandas_profiling生成数据报告(略,可参考:https://blog.csdn.net/Andy_shenzl/article/details/81709409)

3.总结

  • EDA是最基础的,在科研研究或工程项目中,是最基本的一步。
  • 接下来一般要结合模型的效果以及特征工程等来分析数据的实际建模情况,根据自己的一些理解,查阅文献,对实际问题做出判断和深入的理解。
  • 最后不断进行EDA与数据处理和挖掘,来到达更好的数据结构和分布以及较为强势相关的特征。

    数据探索在机器学习中我们一般称为EDA(Exploratory Data Analysis):是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。

数据探索有利于我们发现数据的一些特性,数据之间的关联性,对于后续的特征构建是很有帮助的。

  1. 对于数据的初步分析(直接查看数据,或.sum(), .mean(),.descirbe()等统计函数)可以从:样本数量,训练集数量,是否有时间特征,是否是时许问题,特征所表示的含义(非匿名特征),特征类型(字符类似,int,float,time),特征的缺失情况(注意缺失的在数据中的表现形式,有些是空的有些是”NAN”符号等),特征的均值方差情况。
  2. 分析记录某些特征值缺失占比30%以上样本的缺失处理,有助于后续的模型验证和调节,分析特征应该是填充(填充方式是什么,均值填充,0填充,众数填充等),还是舍去,还是先做样本分类用不同的特征模型去预测。
  3. 对于异常值做专门的分析,分析特征异常的label是否为异常值(或者偏离均值较远或者事特殊符号),异常值是否应该剔除,还是用正常值填充,是记录异常,还是机器本身异常等。
  4. 对于Label做专门的分析,分析标签的分布情况等。
  5. 进步分析可以通过对特征作图,特征和label联合做图(统计图,离散图),直观了解特征的分布情况,通过这一步也可以发现数据之中的一些异常值等,通过箱型图分析一些特征值的偏离情况,对于特征和特征联合作图,对于特征和label联合作图,分析其中的一些关联性。




 

你可能感兴趣的:(技术学习,数据挖掘)