DataWhale二手車價(jià)格預(yù)測(cè)Task2-數(shù)據(jù)探索性分析EDA

二手車數(shù)據(jù)探索性分析EDA

Tip:此部分為零基礎(chǔ)入門數(shù)據(jù)挖掘的 Task1 賽題理解 部分祷肯,為大家入門數(shù)據(jù)挖掘比賽提供一個(gè)基本的賽題入門講解佳遂,歡迎后續(xù)大家多多交流他嫡。

賽題:零基礎(chǔ)入門數(shù)據(jù)挖掘 - 二手車交易價(jià)格預(yù)測(cè)

地址:https://tianchi.aliyun.com/competition/entrance/231784/introduction?spm=5176.12281957.1004.1.38b02448ausjSX

1.EDA概念

EDA (Exploratory Data Analysis)械蹋,也就是對(duì)數(shù)據(jù)進(jìn)行探索性的分析降传,從而為之后的數(shù)據(jù)預(yù)處理和特征工程提供必要的結(jié)論至非。

通常使用數(shù)據(jù)分析pandas庫(kù)加上一些可視化庫(kù)比如matplotlib钠署、seaborn對(duì)數(shù)據(jù)進(jìn)行一些常規(guī)處理,對(duì)整個(gè)數(shù)據(jù)集進(jìn)行一個(gè)初步的特征理解

主要的步驟一般是:
1.理解問(wèn)題
2.讀取數(shù)據(jù)
3.單變量探索
4.多變量探索
5.數(shù)據(jù)預(yù)處理
6.建立假設(shè)并檢驗(yàn)

拿到數(shù)據(jù)之后荒椭,我們必須要明確以下幾件事情:

數(shù)據(jù)是如何產(chǎn)生的谐鼎,數(shù)據(jù)又是如何存儲(chǔ)的;
數(shù)據(jù)是原始數(shù)據(jù)趣惠,還是經(jīng)過(guò)人工處理(二次加工的)狸棍;
數(shù)據(jù)由那些業(yè)務(wù)背景組成的,數(shù)據(jù)字段又有什么含義味悄;
數(shù)據(jù)字段是什么類型的草戈,每個(gè)字段的分布是怎樣的
訓(xùn)練集和測(cè)試集的數(shù)據(jù)分布是否有差異;

2.數(shù)據(jù)讀取

核心方法是使用pandas.read_csv和pandas.read_table等方法讀取數(shù)據(jù)。
有多個(gè)文件組成數(shù)據(jù)則將他們連接侍瑟,也經(jīng)常把訓(xùn)練集和測(cè)試集合并起來(lái)處理唐片,可用pandas.concat等方法丙猬,如df = pd.concat([train.assign(is_train=1), test.assign(is_train=0)])。

df.columns:顯示所有的變量名
df.shape:shape
df.head():給前幾個(gè)樣本
df.tail():給后幾個(gè)樣本
df.sample(10):隨機(jī)給幾個(gè)樣本
df.describe():連續(xù)變量的一些描述信息费韭,如基本統(tǒng)計(jì)量茧球、分布等。
df.describe(include=['O']):分類變量的一些描述信息
df.describe(include='all'):全部變量的一些描述信息星持。
Y_train.value_counts():觀察取值數(shù)量

3.二手車EDA示例

  1. 載入各種數(shù)據(jù)科學(xué)以及可視化庫(kù):
    • 數(shù)據(jù)科學(xué)庫(kù) pandas抢埋、numpy、scipy督暂;
    • 可視化庫(kù) matplotlib揪垄、seabon;
    • 其他损痰;
  2. 載入數(shù)據(jù):
    • 載入訓(xùn)練集和測(cè)試集福侈;
    • 簡(jiǎn)略觀察數(shù)據(jù)(head()+shape);
  3. 數(shù)據(jù)總覽:
    • 通過(guò)describe()來(lái)熟悉數(shù)據(jù)的相關(guān)統(tǒng)計(jì)量
    • 通過(guò)info()來(lái)熟悉數(shù)據(jù)類型
  4. 判斷數(shù)據(jù)缺失和異常
    • 查看每列的存在nan情況
    • 異常值檢測(cè)
  5. 了解預(yù)測(cè)值的分布
    • 總體分布概況(無(wú)界約翰遜分布等)
    • 查看skewness and kurtosis
    • 查看預(yù)測(cè)值的具體頻數(shù)
  6. 特征分為類別特征和數(shù)字特征卢未,并對(duì)類別特征查看unique分布
  7. 數(shù)字特征分析
    • 相關(guān)性分析
    • 查看幾個(gè)特征得 偏度和峰值
    • 每個(gè)數(shù)字特征得分布可視化
    • 數(shù)字特征相互之間的關(guān)系可視化
    • 多變量互相回歸關(guān)系可視化
  8. 類型特征分析
    • unique分布
    • 類別特征箱形圖可視化
    • 類別特征的小提琴圖可視化
    • 類別特征的柱形圖可視化類別
    • 特征的每個(gè)類別頻數(shù)可視化(count_plot)
  9. 用pandas_profiling生成數(shù)據(jù)報(bào)告

3.1 載入各種數(shù)據(jù)科學(xué)以及可視化庫(kù)

以下庫(kù)都是pip install 安裝肪凛, 有特殊情況我會(huì)單獨(dú)說(shuō)明
例如 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

#coding:utf-8
#導(dǎo)入warnings包,利用過(guò)濾器來(lái)實(shí)現(xiàn)忽略警告語(yǔ)句辽社。
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

3.2 載入數(shù)據(jù)

## 1) 載入訓(xùn)練集和測(cè)試集伟墙;
path = './data/'
Train_data = pd.read_csv(path+'used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv(path+'used_car_testA_20200313.csv', sep=' ')

所有特征集均脫敏處理(方便大家觀看)

  • name - 汽車編碼
  • regDate - 汽車注冊(cè)時(shí)間
  • model - 車型編碼
  • brand - 品牌
  • bodyType - 車身類型
  • fuelType - 燃油類型
  • gearbox - 變速箱
  • power - 汽車功率
  • kilometer - 汽車行駛公里
  • notRepairedDamage - 汽車有尚未修復(fù)的損壞
  • regionCode - 看車地區(qū)編碼
  • seller - 銷售方
  • offerType - 報(bào)價(jià)類型
  • creatDate - 廣告發(fā)布時(shí)間
  • price - 汽車價(jià)格
  • 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在內(nèi)15個(gè)匿名特征】
## 2) 簡(jiǎn)略觀察數(shù)據(jù)(head()+shape)
Train_data.head().append(Train_data.tail())
Train_data.shape
(150000, 31)
Test_data.head().append(Test_data.tail())
Test_data.shape
(50000, 30)

可以看到測(cè)試集比訓(xùn)練集少一列滴铅,就是我們需要預(yù)測(cè)的價(jià)格啦
要養(yǎng)成看數(shù)據(jù)集的head()以及shape的習(xí)慣戳葵,這會(huì)讓你每一步更放心,導(dǎo)致接下里的連串的錯(cuò)誤, 如果對(duì)自己的pandas等操作不放心汉匙,建議執(zhí)行一步看一下拱烁,這樣會(huì)有效的方便你進(jìn)行理解函數(shù)并進(jìn)行操作

3.2 總攬數(shù)據(jù)概況

看完數(shù)據(jù)頭尾后,我們需要簡(jiǎn)單的查看下數(shù)據(jù)的分布噩翠、平均值戏自、方差等參數(shù),可以使用describe來(lái)看

  1. describe種有每列的統(tǒng)計(jì)量伤锚,個(gè)數(shù)count擅笔、平均值mean、方差std屯援、最小值min猛们、中位數(shù)25% 50% 75% 、以及最大值 看這個(gè)信息主要是瞬間掌握數(shù)據(jù)的大概的范圍以及每個(gè)值的異常值的判斷狞洋,比如有的時(shí)候會(huì)發(fā)現(xiàn)999 9999 -1 等值這些其實(shí)都是nan的另外一種表達(dá)方式弯淘,有的時(shí)候需要注意下
  2. info 通過(guò)info來(lái)了解數(shù)據(jù)每列的type,有助于了解是否存在除了nan以外的特殊符號(hào)異常
## 1) 通過(guò)describe()來(lái)熟悉數(shù)據(jù)的相關(guān)統(tǒng)計(jì)量
Train_data.describe()

通過(guò)describe可以對(duì)數(shù)據(jù)有個(gè)總體的了解

Test_data.describe()
## 2) 通過(guò)info()來(lái)熟悉數(shù)據(jù)類型
Train_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150000 entries, 0 to 149999
Data columns (total 31 columns):
SaleID               150000 non-null int64
name                 150000 non-null int64
regDate              150000 non-null int64
model                149999 non-null float64
brand                150000 non-null int64
bodyType             145494 non-null float64
fuelType             141320 non-null float64
gearbox              144019 non-null float64
power                150000 non-null int64
kilometer            150000 non-null float64
notRepairedDamage    150000 non-null object
regionCode           150000 non-null int64
seller               150000 non-null int64
offerType            150000 non-null int64
creatDate            150000 non-null int64
price                150000 non-null int64
v_0                  150000 non-null float64
v_1                  150000 non-null float64
v_2                  150000 non-null float64
v_3                  150000 non-null float64
v_4                  150000 non-null float64
v_5                  150000 non-null float64
v_6                  150000 non-null float64
v_7                  150000 non-null float64
v_8                  150000 non-null float64
v_9                  150000 non-null float64
v_10                 150000 non-null float64
v_11                 150000 non-null float64
v_12                 150000 non-null float64
v_13                 150000 non-null float64
v_14                 150000 non-null float64
dtypes: float64(20), int64(10), object(1)
memory usage: 35.5+ MB
Test_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50000 entries, 0 to 49999
Data columns (total 30 columns):
SaleID               50000 non-null int64
name                 50000 non-null int64
regDate              50000 non-null int64
model                50000 non-null float64
brand                50000 non-null int64
bodyType             48587 non-null float64
fuelType             47107 non-null float64
gearbox              48090 non-null float64
power                50000 non-null int64
kilometer            50000 non-null float64
notRepairedDamage    50000 non-null object
regionCode           50000 non-null int64
seller               50000 non-null int64
offerType            50000 non-null int64
creatDate            50000 non-null int64
v_0                  50000 non-null float64
v_1                  50000 non-null float64
v_2                  50000 non-null float64
v_3                  50000 non-null float64
v_4                  50000 non-null float64
v_5                  50000 non-null float64
v_6                  50000 non-null float64
v_7                  50000 non-null float64
v_8                  50000 non-null float64
v_9                  50000 non-null float64
v_10                 50000 non-null float64
v_11                 50000 non-null float64
v_12                 50000 non-null float64
v_13                 50000 non-null float64
v_14                 50000 non-null float64
dtypes: float64(20), int64(9), object(1)
memory usage: 11.4+ MB

3.4 判斷數(shù)據(jù)缺失和異常

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
Test_data.isnull().sum()
SaleID                  0
name                    0
regDate                 0
model                   0
brand                   0
bodyType             1413
fuelType             2893
gearbox              1910
power                   0
kilometer               0
notRepairedDamage       0
regionCode              0
seller                  0
offerType               0
creatDate               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

發(fā)現(xiàn)bodyType徘铝、fuelType耳胎、gearbox有大量的缺失值惯吕,通過(guò)可視化來(lái)直觀的看一眼

missing = Train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace = True)
missing.plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x1a20acb7f0>
png

通過(guò)以上兩句可以很直觀的了解哪些列存在 “nan”, 并可以把nan的個(gè)數(shù)打印惕它,主要的目的在于 nan存在的個(gè)數(shù)是否真的很大怕午,如果很小一般選擇填充,如果使用lgb等樹模型可以直接空缺淹魄,讓樹自己去優(yōu)化郁惜,但如果nan存在的過(guò)多、可以考慮刪掉

# 可視化看下缺省值
msno.matrix(Train_data.sample(250))
<matplotlib.axes._subplots.AxesSubplot at 0x1a21139cc0>
png
msno.bar(Train_data.sample(1000))
<matplotlib.axes._subplots.AxesSubplot at 0x1a20cfde80>
png
# 可視化看下缺省值
msno.matrix(Test_data.sample(250))
<matplotlib.axes._subplots.AxesSubplot at 0x1a21280f60>
png
msno.bar(Test_data.sample(1000))
<matplotlib.axes._subplots.AxesSubplot at 0x1a2179ff98>
png

測(cè)試集的缺省和訓(xùn)練集的差不多情況, 可視化有四列有缺省甲锡,notRepairedDamage缺省得最多

2) 查看異常值檢測(cè)

Train_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150000 entries, 0 to 149999
Data columns (total 31 columns):
SaleID               150000 non-null int64
name                 150000 non-null int64
regDate              150000 non-null int64
model                149999 non-null float64
brand                150000 non-null int64
bodyType             145494 non-null float64
fuelType             141320 non-null float64
gearbox              144019 non-null float64
power                150000 non-null int64
kilometer            150000 non-null float64
notRepairedDamage    150000 non-null object
regionCode           150000 non-null int64
seller               150000 non-null int64
offerType            150000 non-null int64
creatDate            150000 non-null int64
price                150000 non-null int64
v_0                  150000 non-null float64
v_1                  150000 non-null float64
v_2                  150000 non-null float64
v_3                  150000 non-null float64
v_4                  150000 non-null float64
v_5                  150000 non-null float64
v_6                  150000 non-null float64
v_7                  150000 non-null float64
v_8                  150000 non-null float64
v_9                  150000 non-null float64
v_10                 150000 non-null float64
v_11                 150000 non-null float64
v_12                 150000 non-null float64
v_13                 150000 non-null float64
v_14                 150000 non-null float64
dtypes: float64(20), int64(10), object(1)
memory usage: 35.5+ MB

可以發(fā)現(xiàn)除了notRepairedDamage 為object類型其他都為數(shù)字 這里我們把他的幾個(gè)不同的值都進(jìn)行顯示就知道了

Train_data['notRepairedDamage'].value_counts()
0.0    111361
-       24324
1.0     14315
Name: notRepairedDamage, dtype: int64

可以看出來(lái)‘ - ’也為空缺值兆蕉,因?yàn)楹芏嗄P蛯?duì)nan有直接的處理,這里我們先不做處理缤沦,先替換成nan

Train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
Train_data['notRepairedDamage'].value_counts()
0.0    111361
1.0     14315
Name: notRepairedDamage, dtype: int64
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    24324
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
Test_data['notRepairedDamage'].value_counts()
0.0    37249
-       8031
1.0     4720
Name: notRepairedDamage, dtype: int64
Test_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

以下兩個(gè)類別特征嚴(yán)重傾斜虎韵,一般不會(huì)對(duì)預(yù)測(cè)有什么幫助,故這邊先刪掉缸废,當(dāng)然你也可以繼續(xù)挖掘包蓝,但是一般意義不大

Train_data["seller"].value_counts()
0    149999
1         1
Name: seller, dtype: int64
Train_data["offerType"].value_counts()
0    150000
Name: offerType, dtype: int64
del Train_data["seller"]
del Train_data["offerType"]
del Test_data["seller"]
del Test_data["offerType"]

3.5 了解預(yù)測(cè)值的分布

Train_data['price']
0          1850
1          3600
2          6222
3          2400
4          5200
5          8000
6          3500
7          1000
8          2850
9           650
10         3100
11         5450
12         1600
13         3100
14         6900
15         3200
16        10500
17         3700
18          790
19         1450
20          990
21         2800
22          350
23          599
24         9250
25         3650
26         2800
27         2399
28         4900
29         2999
          ...  
149970      900
149971     3400
149972      999
149973     3500
149974     4500
149975     3990
149976     1200
149977      330
149978     3350
149979     5000
149980     4350
149981     9000
149982     2000
149983    12000
149984     6700
149985     4200
149986     2800
149987     3000
149988     7500
149989     1150
149990      450
149991    24950
149992      950
149993     4399
149994    14780
149995     5900
149996     9500
149997     7500
149998     4999
149999     4700
Name: price, Length: 150000, dtype: int64
Train_data['price'].value_counts()
500      2337
1500     2158
1200     1922
1000     1850
2500     1821
600      1535
3500     1533
800      1513
2000     1378
999      1356
750      1279
4500     1271
650      1257
1800     1223
2200     1201
850      1198
700      1174
900      1107
1300     1105
950      1104
3000     1098
1100     1079
5500     1079
1600     1074
300      1071
550      1042
350      1005
1250     1003
6500      973
1999      929
         ... 
21560       1
7859        1
3120        1
2279        1
6066        1
6322        1
4275        1
10420       1
43300       1
305         1
1765        1
15970       1
44400       1
8885        1
2992        1
31850       1
15413       1
13495       1
9525        1
7270        1
13879       1
3760        1
24250       1
11360       1
10295       1
25321       1
8886        1
8801        1
37920       1
8188        1
Name: price, Length: 3763, dtype: int64
## 1) 總體分布概況(無(wú)界約翰遜分布等) 看看二車大蓋都在什么價(jià)格
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)
<matplotlib.axes._subplots.AxesSubplot at 0x1a21fc4860>
png
png
png

價(jià)格不服從正態(tài)分布,所以在進(jìn)行回歸之前企量,它必須進(jìn)行轉(zhuǎn)換测萎。雖然對(duì)數(shù)變換做得很好,但最佳擬合是無(wú)界約翰遜分布
筆者這里對(duì)數(shù)據(jù)概率分布知識(shí)有點(diǎn)模糊了届巩,后續(xù)需要找些知識(shí)補(bǔ)充

seaborn中的distplot主要功能是繪制單變量的直方圖硅瞧,且還可以在直方圖的基礎(chǔ)上施加kdeplot和rugplot的部分內(nèi)容,是一個(gè)功能非常強(qiáng)大且實(shí)用的函數(shù)恕汇,其主要參數(shù)如下:

a:一維數(shù)組形式腕唧,傳入待分析的單個(gè)變量

bins:int型變量,用于確定直方圖中顯示直方的數(shù)量瘾英,默認(rèn)為None枣接,這時(shí)bins的具體個(gè)數(shù)由Freedman-Diaconis準(zhǔn)則來(lái)確定

hist:bool型變量,控制是否繪制直方圖方咆,默認(rèn)為True

kde:bool型變量月腋,控制是否繪制核密度估計(jì)曲線,默認(rèn)為True

rug:bool型變量瓣赂,控制是否繪制對(duì)應(yīng)rugplot的部分榆骚,默認(rèn)為False

fit:傳入scipy.stats中的分布類型,用于在觀察變量上抽取相關(guān)統(tǒng)計(jì)特征來(lái)強(qiáng)行擬合指定的分布煌集,默認(rèn)為None妓肢,即不進(jìn)行擬合

hist_kws,kde_kws,rug_kws:這幾個(gè)變量都接受字典形式的輸入,鍵值對(duì)分別對(duì)應(yīng)各自原生函數(shù)中的參數(shù)名稱與參數(shù)值苫纤,在下文中會(huì)有示例

color:用于控制除了fit部分?jǐn)M合出的曲線之外的所有對(duì)象的色彩

vertical:bool型碉钠,控制是否顛倒x-y軸纲缓,默認(rèn)為False,即不顛倒

norm_hist:bool型變量喊废,用于控制直方圖高度代表的意義祝高,為True直方圖高度表示對(duì)應(yīng)的密度,為False時(shí)代表的是對(duì)應(yīng)的直方區(qū)間內(nèi)記錄值個(gè)數(shù)污筷,默認(rèn)為False

label:控制圖像中的圖例標(biāo)簽顯示內(nèi)容
圖中的Johnson SU為約翰遜分布工闺,是一種經(jīng)過(guò)約翰變換后服從正態(tài)分布概率的隨機(jī)變量的概率分布;normal為正態(tài)分布瓣蛀;lognormal為對(duì)數(shù)正態(tài)分布陆蟆,對(duì)數(shù)正態(tài)分布從短期來(lái)看,與正態(tài)分布非常接近惋增。但長(zhǎng)期來(lái)看叠殷,對(duì)數(shù)正態(tài)分布向上分布的數(shù)值更多一些。

通過(guò)結(jié)果我們可以看到诈皿,無(wú)界約翰遜分布對(duì)price的分布情況擬合最好林束。

## 2) 查看skewness and kurtosis
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
png

在這里計(jì)算了price的峰度和偏度

  • 偏度(skewness)也稱為偏態(tài)、偏態(tài)系數(shù)纫塌,是統(tǒng)計(jì)數(shù)據(jù)分布偏斜方向和程度的度量诊县,是統(tǒng)計(jì)數(shù)據(jù)分布非對(duì)稱程度的數(shù)字特征。
  • 峰度(Kurtosis)與偏度類似措左,是描述總體中所有取值分布形態(tài)陡緩程度的統(tǒng)計(jì)量依痊。這個(gè)統(tǒng)計(jì)量需要與正態(tài)分布相比較,峰度為0表示該總體數(shù)據(jù)分布與正態(tài)分布的陡緩程度相同怎披;峰度大于0表示該總體數(shù)據(jù)分布與正態(tài)分布相比較為陡峭胸嘁,為尖頂峰;峰度小于0表示該總體數(shù)據(jù)分布與正態(tài)分布相比較為平坦凉逛,為平頂峰金闽。峰度的絕對(duì)值數(shù)值越大表示其分布形態(tài)的陡緩程度與正態(tài)分布的差異程度越大芭商。
    skew、kurt說(shuō)明參考https://www.cnblogs.com/wyy1480/p/10474046.html
Train_data.skew(), Train_data.kurt()
(SaleID               6.017846e-17
 name                 5.576058e-01
 regDate              2.849508e-02
 model                1.484388e+00
 brand                1.150760e+00
 bodyType             9.915299e-01
 fuelType             1.595486e+00
 gearbox              1.317514e+00
 power                6.586318e+01
 kilometer           -1.525921e+00
 notRepairedDamage    2.430640e+00
 regionCode           6.888812e-01
 creatDate           -7.901331e+01
 price                3.346487e+00
 v_0                 -1.316712e+00
 v_1                  3.594543e-01
 v_2                  4.842556e+00
 v_3                  1.062920e-01
 v_4                  3.679890e-01
 v_5                 -4.737094e+00
 v_6                  3.680730e-01
 v_7                  5.130233e+00
 v_8                  2.046133e-01
 v_9                  4.195007e-01
 v_10                 2.522046e-02
 v_11                 3.029146e+00
 v_12                 3.653576e-01
 v_13                 2.679152e-01
 v_14                -1.186355e+00
 dtype: float64, SaleID                 -1.200000
 name                   -1.039945
 regDate                -0.697308
 model                   1.740483
 brand                   1.076201
 bodyType                0.206937
 fuelType                5.880049
 gearbox                -0.264161
 power                5733.451054
 kilometer               1.141934
 notRepairedDamage       3.908072
 regionCode             -0.340832
 creatDate            6881.080328
 price                  18.995183
 v_0                     3.993841
 v_1                    -1.753017
 v_2                    23.860591
 v_3                    -0.418006
 v_4                    -0.197295
 v_5                    22.934081
 v_6                    -1.742567
 v_7                    25.845489
 v_8                    -0.636225
 v_9                    -0.321491
 v_10                   -0.577935
 v_11                   12.568731
 v_12                    0.268937
 v_13                   -0.438274
 v_14                    2.393526
 dtype: float64)
sns.distplot(Train_data.skew(),color='blue',axlabel ='Skewness')
<matplotlib.axes._subplots.AxesSubplot at 0x1a20bd3668>
png
sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness')
<matplotlib.axes._subplots.AxesSubplot at 0x1a20b7fac8>
png
## 3) 查看預(yù)測(cè)值的具體頻數(shù)
plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()
png

查看頻數(shù), 大于20000得值極少,其實(shí)這里也可以把這些當(dāng)作特殊得值(異常值)直接用填充或者刪掉渴语,再前面進(jìn)行

# log變換 z之后的分布較均勻神妹,可以進(jìn)行l(wèi)og變換進(jìn)行預(yù)測(cè)拳昌,這也是預(yù)測(cè)問(wèn)題常用的trick
plt.hist(np.log(Train_data['price']), orientation = 'vertical',histtype = 'bar', color ='red') 
plt.show()
png

3.6 特征分為類別特征和數(shù)字特征趴乡,并對(duì)類別特征查看unique分布

回顧一下數(shù)據(jù)類型

  • name - 汽車編碼
  • regDate - 汽車注冊(cè)時(shí)間
  • model - 車型編碼
  • brand - 品牌
  • bodyType - 車身類型
  • fuelType - 燃油類型
  • gearbox - 變速箱
  • power - 汽車功率
  • kilometer - 汽車行駛公里
  • notRepairedDamage - 汽車有尚未修復(fù)的損壞
  • regionCode - 看車地區(qū)編碼
  • seller - 銷售方 【以刪】
  • offerType - 報(bào)價(jià)類型 【以刪】
  • creatDate - 廣告發(fā)布時(shí)間
  • price - 汽車價(jià)格
  • 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在內(nèi)15個(gè)匿名特征】
# 分離label即預(yù)測(cè)值
Y_train = Train_data['price']
# 這個(gè)區(qū)別方式適用于沒(méi)有直接label coding的數(shù)據(jù)
# 這里不適用焙糟,需要人為根據(jù)實(shí)際含義來(lái)區(qū)分
# 數(shù)字特征
# numeric_features = Train_data.select_dtypes(include=[np.number])
# numeric_features.columns
# # 類型特征
# categorical_features = Train_data.select_dtypes(include=[np.object])
# categorical_features.columns
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',]
# 特征nunique分布
for cat_fea in categorical_features:
    print(cat_fea + "的特征分布如下:")
    print("{}特征有個(gè){}不同的值".format(cat_fea, Train_data[cat_fea].nunique()))
    print(Train_data[cat_fea].value_counts())
name的特征分布如下:
name特征有個(gè)99662不同的值
708       282
387       282
55        280
1541      263
203       233
53        221
713       217
290       197
1186      184
911       182
2044      176
1513      160
1180      158
631       157
893       153
2765      147
473       141
1139      137
1108      132
444       129
306       127
2866      123
2402      116
533       114
1479      113
422       113
4635      110
725       110
964       109
1373      104
         ... 
89083       1
95230       1
164864      1
173060      1
179207      1
181256      1
185354      1
25564       1
19417       1
189324      1
162719      1
191373      1
193422      1
136082      1
140180      1
144278      1
146327      1
148376      1
158621      1
1404        1
15319       1
46022       1
64463       1
976         1
3025        1
5074        1
7123        1
11221       1
13270       1
174485      1
Name: name, Length: 99662, dtype: int64
model的特征分布如下:
model特征有個(gè)248不同的值
0.0      11762
19.0      9573
4.0       8445
1.0       6038
29.0      5186
48.0      5052
40.0      4502
26.0      4496
8.0       4391
31.0      3827
13.0      3762
17.0      3121
65.0      2730
49.0      2608
46.0      2454
30.0      2342
44.0      2195
5.0       2063
10.0      2004
21.0      1872
73.0      1789
11.0      1775
23.0      1696
22.0      1524
69.0      1522
63.0      1469
7.0       1460
16.0      1349
88.0      1309
66.0      1250
         ...  
141.0       37
133.0       35
216.0       30
202.0       28
151.0       26
226.0       26
231.0       23
234.0       23
233.0       20
198.0       18
224.0       18
227.0       17
237.0       17
220.0       16
230.0       16
239.0       14
223.0       13
236.0       11
241.0       10
232.0       10
229.0       10
235.0        7
246.0        7
243.0        4
244.0        3
245.0        2
209.0        2
240.0        2
242.0        2
247.0        1
Name: model, Length: 248, dtype: int64
brand的特征分布如下:
brand特征有個(gè)40不同的值
0     31480
4     16737
14    16089
10    14249
1     13794
6     10217
9      7306
5      4665
13     3817
11     2945
3      2461
7      2361
16     2223
8      2077
25     2064
27     2053
21     1547
15     1458
19     1388
20     1236
12     1109
22     1085
26      966
30      940
17      913
24      772
28      649
32      592
29      406
37      333
2       321
31      318
18      316
36      228
34      227
33      218
23      186
35      180
38       65
39        9
Name: brand, dtype: int64
bodyType的特征分布如下:
bodyType特征有個(gè)8不同的值
0.0    41420
1.0    35272
2.0    30324
3.0    13491
4.0     9609
5.0     7607
6.0     6482
7.0     1289
Name: bodyType, dtype: int64
fuelType的特征分布如下:
fuelType特征有個(gè)7不同的值
0.0    91656
1.0    46991
2.0     2212
3.0      262
4.0      118
5.0       45
6.0       36
Name: fuelType, dtype: int64
gearbox的特征分布如下:
gearbox特征有個(gè)2不同的值
0.0    111623
1.0     32396
Name: gearbox, dtype: int64
notRepairedDamage的特征分布如下:
notRepairedDamage特征有個(gè)2不同的值
0.0    111361
1.0     14315
Name: notRepairedDamage, dtype: int64
regionCode的特征分布如下:
regionCode特征有個(gè)7905不同的值
419     369
764     258
125     137
176     136
462     134
428     132
24      130
1184    130
122     129
828     126
70      125
827     120
207     118
1222    117
2418    117
85      116
2615    115
2222    113
759     112
188     111
1757    110
1157    109
2401    107
1069    107
3545    107
424     107
272     107
451     106
450     105
129     105
       ... 
6324      1
7372      1
7500      1
8107      1
2453      1
7942      1
5135      1
6760      1
8070      1
7220      1
8041      1
8012      1
5965      1
823       1
7401      1
8106      1
5224      1
8117      1
7507      1
7989      1
6505      1
6377      1
8042      1
7763      1
7786      1
6414      1
7063      1
4239      1
5931      1
7267      1
Name: regionCode, Length: 7905, dtype: int64
# 特征nunique分布
for cat_fea in categorical_features:
    print(cat_fea + "的特征分布如下:")
    print("{}特征有個(gè){}不同的值".format(cat_fea, Test_data[cat_fea].nunique()))
    print(Test_data[cat_fea].value_counts())
name的特征分布如下:
name特征有個(gè)37453不同的值
55        97
708       96
387       95
1541      88
713       74
53        72
1186      67
203       67
631       65
911       64
2044      62
2866      60
1139      57
893       54
1180      52
2765      50
1108      50
290       48
1513      47
691       45
473       44
299       43
444       41
422       39
964       39
1479      38
1273      38
306       36
725       35
4635      35
          ..
46786      1
48835      1
165572     1
68204      1
171719     1
59080      1
186062     1
11985      1
147155     1
134869     1
138967     1
173792     1
114403     1
59098      1
59144      1
40679      1
61161      1
128746     1
55022      1
143089     1
14066      1
147187     1
112892     1
46598      1
159481     1
22270      1
89855      1
42752      1
48899      1
11808      1
Name: name, Length: 37453, dtype: int64
model的特征分布如下:
model特征有個(gè)247不同的值
0.0      3896
19.0     3245
4.0      3007
1.0      1981
29.0     1742
48.0     1685
26.0     1525
40.0     1409
8.0      1397
31.0     1292
13.0     1210
17.0     1087
65.0      915
49.0      866
46.0      831
30.0      803
10.0      709
5.0       696
44.0      676
21.0      659
11.0      603
23.0      591
73.0      561
69.0      555
7.0       526
63.0      493
22.0      443
16.0      412
66.0      411
88.0      391
         ... 
124.0       9
193.0       9
151.0       8
198.0       8
181.0       8
239.0       7
233.0       7
216.0       7
231.0       6
133.0       6
236.0       6
227.0       6
220.0       5
230.0       5
234.0       4
224.0       4
241.0       4
223.0       4
229.0       3
189.0       3
232.0       3
237.0       3
235.0       2
245.0       2
209.0       2
242.0       1
240.0       1
244.0       1
243.0       1
246.0       1
Name: model, Length: 247, dtype: int64
brand的特征分布如下:
brand特征有個(gè)40不同的值
0     10348
4      5763
14     5314
10     4766
1      4532
6      3502
9      2423
5      1569
13     1245
11      919
7       795
3       773
16      771
8       704
25      695
27      650
21      544
15      511
20      450
19      450
12      389
22      363
30      324
17      317
26      303
24      268
28      225
32      193
29      117
31      115
18      106
2       104
37       92
34       77
33       76
36       67
23       62
35       53
38       23
39        2
Name: brand, dtype: int64
bodyType的特征分布如下:
bodyType特征有個(gè)8不同的值
0.0    13985
1.0    11882
2.0     9900
3.0     4433
4.0     3303
5.0     2537
6.0     2116
7.0      431
Name: bodyType, dtype: int64
fuelType的特征分布如下:
fuelType特征有個(gè)7不同的值
0.0    30656
1.0    15544
2.0      774
3.0       72
4.0       37
6.0       14
5.0       10
Name: fuelType, dtype: int64
gearbox的特征分布如下:
gearbox特征有個(gè)2不同的值
0.0    37301
1.0    10789
Name: gearbox, dtype: int64
notRepairedDamage的特征分布如下:
notRepairedDamage特征有個(gè)2不同的值
0.0    37249
1.0     4720
Name: notRepairedDamage, dtype: int64
regionCode的特征分布如下:
regionCode特征有個(gè)6971不同的值
419     146
764      78
188      52
125      51
759      51
2615     50
462      49
542      44
85       44
1069     43
451      41
828      40
757      39
1688     39
2154     39
1947     39
24       39
2690     38
238      38
2418     38
827      38
1184     38
272      38
233      38
70       37
703      37
2067     37
509      37
360      37
176      37
       ... 
5512      1
7465      1
1290      1
3717      1
1258      1
7401      1
7920      1
7925      1
5151      1
7527      1
7689      1
8114      1
3237      1
6003      1
7335      1
3984      1
7367      1
6001      1
8021      1
3691      1
4920      1
6035      1
3333      1
5382      1
6969      1
7753      1
7463      1
7230      1
826       1
112       1
Name: regionCode, Length: 6971, dtype: int64
numeric_features.append('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',
 'price']
Train_data.head()
## 1) 相關(guān)性分析 即計(jì)算矩陣相關(guān)性系數(shù)
price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
print(correlation['price'].sort_values(ascending = False),'\n')
price        1.000000
v_12         0.692823
v_8          0.685798
v_0          0.628397
power        0.219834
v_5          0.164317
v_2          0.085322
v_6          0.068970
v_1          0.060914
v_14         0.035911
v_13        -0.013993
v_7         -0.053024
v_4         -0.147085
v_9         -0.206205
v_10        -0.246175
v_11        -0.275320
kilometer   -0.440519
v_3         -0.730946
Name: price, dtype: float64 
f , ax = plt.subplots(figsize = (7, 7))

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

sns.heatmap(correlation,square = True,  vmax=0.8)
# 相關(guān)分析口渔,熱度圖heatmaps1
<matplotlib.axes._subplots.AxesSubplot at 0x1a2e55f588>
png
del price_numeric['price']
## 2) 查看幾個(gè)特征得 偏度和峰值
for col in numeric_features:
    print('{:15}'.format(col), 
          'Skewness: {:05.2f}'.format(Train_data[col].skew()) , 
          '   ' ,
          'Kurtosis: {:06.2f}'.format(Train_data[col].kurt())  
         )
power           Skewness: 65.86     Kurtosis: 5733.45
kilometer       Skewness: -1.53     Kurtosis: 001.14
v_0             Skewness: -1.32     Kurtosis: 003.99
v_1             Skewness: 00.36     Kurtosis: -01.75
v_2             Skewness: 04.84     Kurtosis: 023.86
v_3             Skewness: 00.11     Kurtosis: -00.42
v_4             Skewness: 00.37     Kurtosis: -00.20
v_5             Skewness: -4.74     Kurtosis: 022.93
v_6             Skewness: 00.37     Kurtosis: -01.74
v_7             Skewness: 05.13     Kurtosis: 025.85
v_8             Skewness: 00.20     Kurtosis: -00.64
v_9             Skewness: 00.42     Kurtosis: -00.32
v_10            Skewness: 00.03     Kurtosis: -00.58
v_11            Skewness: 03.03     Kurtosis: 012.57
v_12            Skewness: 00.37     Kurtosis: 000.27
v_13            Skewness: 00.27     Kurtosis: -00.44
v_14            Skewness: -1.19     Kurtosis: 002.39
price           Skewness: 03.35     Kurtosis: 019.00
## 3) 每個(gè)數(shù)字特征得分布可視化
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")
png

每個(gè)數(shù)字特征的分布可視化
使用melt()函數(shù)將列名轉(zhuǎn)換成列數(shù)據(jù)
再使用FaceGrid和map繪制出每個(gè)屬性的分布圖

## 4) 數(shù)字特征相互之間的關(guān)系可視化
## 使用paiplot展示兩兩屬性之間的關(guān)系,對(duì)角線是單個(gè)屬性的分布圖
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()
png
Train_data.columns
Y_train
#### 此處是多變量之間的關(guān)系可視化穿撮,可視化更多學(xué)習(xí)可參考很不錯(cuò)的文章 http://www.reibang.com/p/6e18d21a4cad
## 5) 多變量互相回歸關(guān)系可視化
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)

<matplotlib.axes._subplots.AxesSubplot at 0x1a2b8fd8d0>
png
## 3.8 類別特征分析
    - unique分布
    - 類別特征箱形圖可視化
    - 類別特征的小提琴圖可視化
    - 類別特征的柱形圖可視化類別
    - 特征的每個(gè)類別頻數(shù)可視化(count_plot)
## 1) unique分布
for fea in categorical_features:
    print(Train_data[fea].nunique())
99662
248
40
8
7
2
2
7905
categorical_features
['name',
 'model',
 'brand',
 'bodyType',
 'fuelType',
 'gearbox',
 'notRepairedDamage',
 'regionCode']
## 2) 類別特征箱形圖可視化

# 因?yàn)?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")
png

箱形圖國(guó)內(nèi)的同學(xué)們可能不太熟悉痪欲,我也是當(dāng)初學(xué)GRE數(shù)學(xué)的時(shí)候才了解到這個(gè)東東 https://baike.baidu.com/item/%E7%AE%B1%E5%BD%A2%E5%9B%BE/10671164?fr=aladdin

Train_data.columns
Index(['SaleID', 'name', 'regDate', 'model', 'brand', 'bodyType', 'fuelType',
       'gearbox', 'power', 'kilometer', 'notRepairedDamage', 'regionCode',
       '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'],
      dtype='object')
## 3) 類別特征的小提琴圖可視化
catg_list = categorical_features
target = 'price'
for catg in catg_list :
    sns.violinplot(x=catg, y=target, data=Train_data)
    plt.show()
png
png
png
png
png
png

小提琴圖和箱形圖是可以參考https://www.cnblogs.com/zhhfan/p/11344310.html

categorical_features = ['model',
 'brand',
 'bodyType',
 'fuelType',
 'gearbox',
 'notRepairedDamage']
## 4) 類別特征的柱形圖可視化
def bar_plot(x, y, **kwargs):
    sns.barplot(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(bar_plot, "value", "price")
png
##  5) 類別特征的每個(gè)類別頻數(shù)可視化(count_plot)
def count_plot(x,  **kwargs):
    sns.countplot(x=x)
    x=plt.xticks(rotation=90)

f = pd.melt(Train_data,  value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False, size=5)
g = g.map(count_plot, "value")

png

3.9 用pandas_profiling生成數(shù)據(jù)報(bào)告

用pandas_profiling生成一個(gè)較為全面的可視化和數(shù)據(jù)報(bào)告(較為簡(jiǎn)單、方便) 最終打開html文件即可

import pandas_profiling
pfr = pandas_profiling.ProfileReport(Train_data)
pfr.to_file("./example.html")

4 經(jīng)驗(yàn)總結(jié)

所給出的EDA步驟為廣為普遍的步驟攻礼,在實(shí)際的不管是工程還是比賽過(guò)程中业踢,這只是最開始的一步,也是最基本的一步秘蛔。

接下來(lái)一般要結(jié)合模型的效果以及特征工程等來(lái)分析數(shù)據(jù)的實(shí)際建模情況陨亡,根據(jù)自己的一些理解傍衡,查閱文獻(xiàn)深员,對(duì)實(shí)際問(wèn)題做出判斷和深入的理解。

最后不斷進(jìn)行EDA與數(shù)據(jù)處理和挖掘蛙埂,來(lái)到達(dá)更好的數(shù)據(jù)結(jié)構(gòu)和分布以及較為強(qiáng)勢(shì)相關(guān)的特征


數(shù)據(jù)探索在機(jī)器學(xué)習(xí)中我們一般稱為EDA(Exploratory Data Analysis):

是指對(duì)已有的數(shù)據(jù)(特別是調(diào)查或觀察得來(lái)的原始數(shù)據(jù))在盡量少的先驗(yàn)假定下進(jìn)行探索倦畅,通過(guò)作圖、制表绣的、方程擬合叠赐、計(jì)算特征量等手段探索數(shù)據(jù)的結(jié)構(gòu)和規(guī)律的一種數(shù)據(jù)分析方法。

數(shù)據(jù)探索有利于我們發(fā)現(xiàn)數(shù)據(jù)的一些特性屡江,數(shù)據(jù)之間的關(guān)聯(lián)性芭概,對(duì)于后續(xù)的特征構(gòu)建是很有幫助的。

  1. 對(duì)于數(shù)據(jù)的初步分析(直接查看數(shù)據(jù)惩嘉,或.sum(), .mean()罢洲,.descirbe()等統(tǒng)計(jì)函數(shù))可以從:樣本數(shù)量,訓(xùn)練集數(shù)量文黎,是否有時(shí)間特征惹苗,是否是時(shí)許問(wèn)題,特征所表示的含義(非匿名特征)耸峭,特征類型(字符類似桩蓉,int,float劳闹,time)院究,特征的缺失情況(注意缺失的在數(shù)據(jù)中的表現(xiàn)形式,有些是空的有些是”NAN”符號(hào)等)本涕,特征的均值方差情況业汰。

  2. 分析記錄某些特征值缺失占比30%以上樣本的缺失處理,有助于后續(xù)的模型驗(yàn)證和調(diào)節(jié)偏友,分析特征應(yīng)該是填充(填充方式是什么蔬胯,均值填充,0填充位他,眾數(shù)填充等)氛濒,還是舍去产场,還是先做樣本分類用不同的特征模型去預(yù)測(cè)。

  3. 對(duì)于異常值做專門的分析舞竿,分析特征異常的label是否為異常值(或者偏離均值較遠(yuǎn)或者事特殊符號(hào)),異常值是否應(yīng)該剔除京景,還是用正常值填充,是記錄異常骗奖,還是機(jī)器本身異常等确徙。

  4. 對(duì)于Label做專門的分析,分析標(biāo)簽的分布情況等执桌。

  5. 進(jìn)步分析可以通過(guò)對(duì)特征作圖鄙皇,特征和label聯(lián)合做圖(統(tǒng)計(jì)圖,離散圖)仰挣,直觀了解特征的分布情況伴逸,通過(guò)這一步也可以發(fā)現(xiàn)數(shù)據(jù)之中的一些異常值等,通過(guò)箱型圖分析一些特征值的偏離情況膘壶,對(duì)于特征和特征聯(lián)合作圖错蝴,對(duì)于特征和label聯(lián)合作圖,分析其中的一些關(guān)聯(lián)性颓芭。

# END.參考文檔
1.[數(shù)據(jù)探索性分析(EDA)](https://blog.csdn.net/weixin_42297855/article/details/97501680)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顷锰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亡问,更是在濱河造成了極大的恐慌官紫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玛界,死亡現(xiàn)場(chǎng)離奇詭異万矾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)慎框,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門良狈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人笨枯,你說(shuō)我怎么就攤上這事薪丁。” “怎么了馅精?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵严嗜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我洲敢,道長(zhǎng)漫玄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮睦优,結(jié)果婚禮上渗常,老公的妹妹穿的比我還像新娘。我一直安慰自己汗盘,他們只是感情好皱碘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著隐孽,像睡著了一般癌椿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菱阵,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天踢俄,我揣著相機(jī)與錄音,去河邊找鬼送粱。 笑死褪贵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抗俄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼世舰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼动雹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起跟压,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤胰蝠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后震蒋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茸塞,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年查剖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钾虐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笋庄,死狀恐怖效扫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情直砂,我是刑警寧澤菌仁,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站静暂,受9級(jí)特大地震影響济丘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洽蛀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一摹迷、第九天 我趴在偏房一處隱蔽的房頂上張望弯院。 院中可真熱鬧,春花似錦泪掀、人聲如沸听绳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)椅挣。三九已至,卻和暖如春塔拳,著一層夾襖步出監(jiān)牢的瞬間鼠证,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工靠抑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留量九,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓颂碧,卻偏偏與公主長(zhǎng)得像荠列,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子载城,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容