二手车交易价格预测之二-数据分析(EDA)

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

1. 载入相关库

  • 数据科学基础工具库, pandas、numpy、scipy
  • 可视化库,matplotlib、seabon
  • 模型预测
  • 数据降维处理
  • 参数搜索和评价

missingno是“缺失值可视化处理”库,方便我们直接观察缺失值。
seaborn是一个可以理解成为更为简便的matplotlib的库

## 导入相关库

## 基础工具
import numpy as np
import pandas as pd
import warnings
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno
from scipy.special import jn
from IPython.display import display, clear_output
import time

warnings.filterwarnings('ignore')
%matplotlib inline

#模型预测的
from sklearn import linear_model
from sklearn import preprocessing
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
import lightgbm as lgb
import xgboost as xgb

#数据降维处理
from sklearn.decomposition import PCA, FastICA, FactorAnalysis, SparsePCA

#参数搜索和评价的
from sklearn.model_selection import GridSearchCV, cross_val_score, StratifiedKFold, train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error

2. 数据载入(pd.read_csv)

#通过Pandas对数据进行读取
Train_data=pd.read_csv('used_car_train_20200313.csv', sep=' ')
TestA_data=pd.read_csv('used_car_testA_20200313.csv', sep=' ')

3. 数据总览

3.1 查看数据维度

二手车交易价格预测之二-数据分析(EDA)_第1张图片

3.2 查看数据内容(head() & tail() )

主要查看数据的列名,以及每列的含义。此处使用head() 和 tail() 函数

  • 训练数据
    二手车交易价格预测之二-数据分析(EDA)_第2张图片训练数据集共有共150000个样本, 30列特征(31列是30列特征+1列标签价格)。
    31个数据列的属性依次为:

    • name - 汽车编码
    • regDate - 汽车注册时间
    • model - 车型编码
    • brand - 品牌
    • bodyType - 车身类型
    • fuelType - 燃油类型
    • gearbox - 变速箱
    • power - 汽车功率
    • kilometer - 汽车行驶公里
    • notRepairedDamage - 汽车有尚未修复的损坏
    • regionCode - 看车地区编码
    • seller - 销售方
    • offerType - 报价类型
    • creatDate - 广告发布时间
    • price - 汽车价格
    • v_0’, ‘v_1’, ‘v_2’, ‘v_3’, ‘v_4’, ‘v_5’, ‘v_6’, ‘v_7’, ‘v_8’, ‘v_9’, ‘v_10’, ‘v_11’, ‘v_12’, ‘v_13’,‘v_14’ 【匿名特征,包含v0-14在内15个匿名特征】
  • 测试数据
    二手车交易价格预测之二-数据分析(EDA)_第3张图片测试数据比训练数据少了一列( label)

3.3 查看数据类型(info()函数)

使用info()函数查看数据类型
二手车交易价格预测之二-数据分析(EDA)_第4张图片数据类型为float64 的有20个, 数据类型为 int64的有9个, 剩下1个object类(notRepairedDamage特征)

3.4 查看数据分布(describe()函数)

查看数据分布使用describe()函数,关于数值列的统计量(对于非数值的列就无法统计了),个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值
看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现
9999999, -1 等值这些其实都是nan的另外一种表达方式,需要注意。

  • 训练数据
    二手车交易价格预测之二-数据分析(EDA)_第5张图片注意到有且仅有notRepairedDamage特征的类型是object,因此上面describe得到的数据统计特征里没有统计这个,所以最后describe得到的形状是8x30而不是8x31。

  • 测试数据
    二手车交易价格预测之二-数据分析(EDA)_第6张图片

4. 判断数据缺失和异常

4.1 存在nan以及nan可视化

4.1.1 查看每列的nan (X.isnull().sum())

二手车交易价格预测之二-数据分析(EDA)_第7张图片存在缺失值的有四列,依次为:

  • model - 1个
  • bodyType - 4506个
  • fuelType - 8680个
  • gearbox - 5981个

4.1.2 nan的可视化

二手车交易价格预测之二-数据分析(EDA)_第8张图片共有四个特征存在缺失值。如果nan的数量存在的很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,但如果nan存在的过多、可以考虑删掉。

4.2 非数值类型的异常值检测

非数值类型的特征数据需要额外考虑,因为 如果非数值类型的数据值为其它符号比如 ‘-’ ,有有些空值会用 ‘-’ 表示,X.isnull().sum()函数却视为非空值。
在这里插入图片描述‘-’ 即为缺失值,替换成nan
二手车交易价格预测之二-数据分析(EDA)_第9张图片在之前的统计中,notRepairedDamage特征是没有统计到有空缺值的,在替换为nan值以后再统计:
二手车交易价格预测之二-数据分析(EDA)_第10张图片可见notRepairedDamage特征的缺失值变为了最多!

4.3 数值类型的异常值检测(value_counts())

使用value_counts() 查看数值类型的特征,是否存在严重倾斜的特征,一般不会对预测有什么帮助,可以先删掉
二手车交易价格预测之二-数据分析(EDA)_第11张图片删除
二手车交易价格预测之二-数据分析(EDA)_第12张图片

4.4 查看所有特征的偏度和峰度

二手车交易价格预测之二-数据分析(EDA)_第13张图片
二手车交易价格预测之二-数据分析(EDA)_第14张图片

  • 查看所有特征的偏度分布情况
    二手车交易价格预测之二-数据分析(EDA)_第15张图片

  • 查看所有特征的峰度分布情况

二手车交易价格预测之二-数据分析(EDA)_第16张图片

5. 预测值的分布情况

二手车交易价格预测之二-数据分析(EDA)_第17张图片
二手车交易价格预测之二-数据分析(EDA)_第18张图片

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)

二手车交易价格预测之二-数据分析(EDA)_第19张图片
可以看到价格不服从正态分布,因此在进行回归之前,它必须进行转换。最佳拟合是约翰逊分布。

5.2 查看price的skewness和kurtosis(偏度和峰度)

二手车交易价格预测之二-数据分析(EDA)_第20张图片

5.3 查看预测值的频数

二手车交易价格预测之二-数据分析(EDA)_第21张图片查看频数, 大于20000得值极少,其实这里也可以把这些当作特殊得值(异常值)直接用填充或者删掉

5.4 log变换后的分布

二手车交易价格预测之二-数据分析(EDA)_第22张图片
对价格进行log变换后,分布会变得比较均匀

6. 特征分析

6.1 特征分类

把特征分为数字特征和类别特征

Y_train = Train_data['price']
numeric_features = ['power', 'kilometer', 'v_0', 'v_1', 'v_2', 'v_3', 'v_4', 'v_5', 'v_6', 'v_7', 'v_8', 'v_9', 'v_10', 'v_11', 'v_12', 'v_13', 'v_14']
categorical_features = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionCode',]

6.2 类别特征分析

利用nunique统计各特征中不同的值的数量

  • 训练数据的nunique统计
    二手车交易价格预测之二-数据分析(EDA)_第23张图片- 测试数据的nunique统计

二手车交易价格预测之二-数据分析(EDA)_第24张图片

6.3 数字特征分析

二手车交易价格预测之二-数据分析(EDA)_第25张图片二手车交易价格预测之二-数据分析(EDA)_第26张图片

6.3.1 特征之间的相关性分析

二手车交易价格预测之二-数据分析(EDA)_第27张图片使用热力图表示
二手车交易价格预测之二-数据分析(EDA)_第28张图片颜色越淡,说明相关性越高

6.3.2 查看几个数值特征的偏度和峰度

二手车交易价格预测之二-数据分析(EDA)_第29张图片

6.3.3 每个数字特征的分布可视化

## 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")

二手车交易价格预测之二-数据分析(EDA)_第30张图片

6.3.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()

6.3.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)

二手车交易价格预测之二-数据分析(EDA)_第31张图片

7. 生成数据报告(pandas_profiling)

用pandas_profiling生成一个较为全面的可视化和数据报告,最终打开html文件

你可能感兴趣的:(机器学习,机器学习,数据分析)