二手車交易價格預測之二-數據分析(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 查看數據維度

在這裏插入圖片描述

3.2 查看數據內容(head() & tail() )

主要查看數據的列名,以及每列的含義。此處使用head() 和 tail() 函數

  • 訓練數據
    在這裏插入圖片描述訓練數據集共有共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個匿名特徵】
  • 測試數據
    在這裏插入圖片描述測試數據比訓練數據少了一列( label)

3.3 查看數據類型(info()函數)

使用info()函數查看數據類型
在這裏插入圖片描述數據類型爲float64 的有20個, 數據類型爲 int64的有9個, 剩下1個object類(notRepairedDamage特徵)

3.4 查看數據分佈(describe()函數)

查看數據分佈使用describe()函數,關於數值列的統計量(對於非數值的列就無法統計了),個數count、平均值mean、方差std、最小值min、中位數25% 50% 75% 、以及最大值
看這個信息主要是瞬間掌握數據的大概的範圍以及每個值的異常值的判斷,比如有的時候會發現
9999999, -1 等值這些其實都是nan的另外一種表達方式,需要注意。

  • 訓練數據
    在這裏插入圖片描述注意到有且僅有notRepairedDamage特徵的類型是object,因此上面describe得到的數據統計特徵裏沒有統計這個,所以最後describe得到的形狀是8x30而不是8x31。

  • 測試數據
    在這裏插入圖片描述

4. 判斷數據缺失和異常

4.1 存在nan以及nan可視化

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

在這裏插入圖片描述存在缺失值的有四列,依次爲:

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

4.1.2 nan的可視化

在這裏插入圖片描述共有四個特徵存在缺失值。如果nan的數量存在的很小一般選擇填充,如果使用lgb等樹模型可以直接空缺,讓樹自己去優化,但如果nan存在的過多、可以考慮刪掉。

4.2 非數值類型的異常值檢測

非數值類型的特徵數據需要額外考慮,因爲 如果非數值類型的數據值爲其它符號比如 ‘-’ ,有有些空值會用 ‘-’ 表示,X.isnull().sum()函數卻視爲非空值。
在這裏插入圖片描述‘-’ 即爲缺失值,替換成nan
在這裏插入圖片描述在之前的統計中,notRepairedDamage特徵是沒有統計到有空缺值的,在替換爲nan值以後再統計:
在這裏插入圖片描述可見notRepairedDamage特徵的缺失值變爲了最多!

4.3 數值類型的異常值檢測(value_counts())

使用value_counts() 查看數值類型的特徵,是否存在嚴重傾斜的特徵,一般不會對預測有什麼幫助,可以先刪掉
在這裏插入圖片描述刪除
在這裏插入圖片描述

4.4 查看所有特徵的偏度和峯度

在這裏插入圖片描述
在這裏插入圖片描述

  • 查看所有特徵的偏度分佈情況
    在這裏插入圖片描述

  • 查看所有特徵的峯度分佈情況

在這裏插入圖片描述

5. 預測值的分佈情況

在這裏插入圖片描述
在這裏插入圖片描述

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)

在這裏插入圖片描述
可以看到價格不服從正態分佈,因此在進行迴歸之前,它必須進行轉換。最佳擬合是約翰遜分佈。

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

在這裏插入圖片描述

5.3 查看預測值的頻數

在這裏插入圖片描述查看頻數, 大於20000得值極少,其實這裏也可以把這些當作特殊得值(異常值)直接用填充或者刪掉

5.4 log變換後的分佈

在這裏插入圖片描述
對價格進行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統計
    在這裏插入圖片描述- 測試數據的nunique統計

在這裏插入圖片描述

6.3 數字特徵分析

在這裏插入圖片描述在這裏插入圖片描述

6.3.1 特徵之間的相關性分析

在這裏插入圖片描述使用熱力圖表示
在這裏插入圖片描述顏色越淡,說明相關性越高

6.3.2 查看幾個數值特徵的偏度和峯度

在這裏插入圖片描述

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

在這裏插入圖片描述

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)

在這裏插入圖片描述

7. 生成數據報告(pandas_profiling)

用pandas_profiling生成一個較爲全面的可視化和數據報告,最終打開html文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章