二手車數(shù)據(jù)探索性分析EDA
Tip:此部分為零基礎(chǔ)入門數(shù)據(jù)挖掘的 Task1 賽題理解 部分祷肯,為大家入門數(shù)據(jù)挖掘比賽提供一個(gè)基本的賽題入門講解佳遂,歡迎后續(xù)大家多多交流他嫡。
賽題:零基礎(chǔ)入門數(shù)據(jù)挖掘 - 二手車交易價(jià)格預(yù)測(cè)
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示例
- 載入各種數(shù)據(jù)科學(xué)以及可視化庫(kù):
- 數(shù)據(jù)科學(xué)庫(kù) pandas抢埋、numpy、scipy督暂;
- 可視化庫(kù) matplotlib揪垄、seabon;
- 其他损痰;
- 載入數(shù)據(jù):
- 載入訓(xùn)練集和測(cè)試集福侈;
- 簡(jiǎn)略觀察數(shù)據(jù)(head()+shape);
- 數(shù)據(jù)總覽:
- 通過(guò)describe()來(lái)熟悉數(shù)據(jù)的相關(guān)統(tǒng)計(jì)量
- 通過(guò)info()來(lái)熟悉數(shù)據(jù)類型
- 判斷數(shù)據(jù)缺失和異常
- 查看每列的存在nan情況
- 異常值檢測(cè)
- 了解預(yù)測(cè)值的分布
- 總體分布概況(無(wú)界約翰遜分布等)
- 查看skewness and kurtosis
- 查看預(yù)測(cè)值的具體頻數(shù)
- 特征分為類別特征和數(shù)字特征卢未,并對(duì)類別特征查看unique分布
- 數(shù)字特征分析
- 相關(guān)性分析
- 查看幾個(gè)特征得 偏度和峰值
- 每個(gè)數(shù)字特征得分布可視化
- 數(shù)字特征相互之間的關(guān)系可視化
- 多變量互相回歸關(guān)系可視化
- 類型特征分析
- unique分布
- 類別特征箱形圖可視化
- 類別特征的小提琴圖可視化
- 類別特征的柱形圖可視化類別
- 特征的每個(gè)類別頻數(shù)可視化(count_plot)
- 用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)看
- 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í)候需要注意下
- 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>
通過(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>
msno.bar(Train_data.sample(1000))
<matplotlib.axes._subplots.AxesSubplot at 0x1a20cfde80>
# 可視化看下缺省值
msno.matrix(Test_data.sample(250))
<matplotlib.axes._subplots.AxesSubplot at 0x1a21280f60>
msno.bar(Test_data.sample(1000))
<matplotlib.axes._subplots.AxesSubplot at 0x1a2179ff98>
測(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>
價(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
在這里計(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>
sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness')
<matplotlib.axes._subplots.AxesSubplot at 0x1a20b7fac8>
## 3) 查看預(yù)測(cè)值的具體頻數(shù)
plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()
查看頻數(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()
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>
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")
每個(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()
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>
## 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")
箱形圖國(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()
小提琴圖和箱形圖是可以參考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")
## 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")
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)建是很有幫助的。
對(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)等)本涕,特征的均值方差情況业汰。
分析記錄某些特征值缺失占比30%以上樣本的缺失處理,有助于后續(xù)的模型驗(yàn)證和調(diào)節(jié)偏友,分析特征應(yīng)該是填充(填充方式是什么蔬胯,均值填充,0填充位他,眾數(shù)填充等)氛濒,還是舍去产场,還是先做樣本分類用不同的特征模型去預(yù)測(cè)。
對(duì)于異常值做專門的分析舞竿,分析特征異常的label是否為異常值(或者偏離均值較遠(yuǎn)或者事特殊符號(hào)),異常值是否應(yīng)該剔除京景,還是用正常值填充,是記錄異常骗奖,還是機(jī)器本身異常等确徙。
對(duì)于Label做專門的分析,分析標(biāo)簽的分布情況等执桌。
進(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)