1 EDA目標
· EDA的價值主要在於熟悉數據集,了解數據集,對數據集進行驗證來確定所獲得數據集可以用於接下來的機器學習或者深度學習使用。
· 當了解了數據集之后我們下一步就是要去了解變量間的相互關系以及變量與預測值之間的存在關系。
· 引導數據科學從業者進行數據處理以及特征工程的步驟,使數據集的結構和特征集讓接下來的預測問題更加可靠。
· 完成對於數據的探索性分析,並對於數據進行一些圖表或者文字總結並打卡。
2 內容介紹
1)載入各種數據科學以及可視化庫:
· 數據科學庫 pandas、numpy、scipy
· 可視化庫 matplotlib、seabon
· 其他
2)載入數據:
· 載入訓練集和測試集
· 簡略觀察數據(head()+shape)
3)數據總覽:
· 通過describe()來熟悉數據的相關統計量
· 通過info()來熟悉數據類型
4)判斷數據缺失和異常:
· 查看每列的存在nan情況
· 異常值檢測
5)了解預測值的分布:
· 總體分布概況(無界約翰遜分布等)
· 查看skewness and kurtosis
· 查看預測值的具體頻數
6)特征分為類別特征和數字特征,並對類別特征查看unique分布
7)數字特征分析:
· 相關性分析
· 查看幾個特征得偏度和峰值
· 每個數字特征得分布可視化
· 數字特征相互之間的關系可視化
· 多變量互相回歸關系可視化
8)類型特征分析:
· unique分布
· 類別特征箱形圖可視化
· 類別特征的小提琴圖可視化
· 類別特征的柱形圖可視化類別
· 特征的每個類別頻數可視化(count_plot)
9)用pandas_profiling生成數據報告
3 代碼分析
3.1 載入各種數據科學以及可視化庫
1 import warnings 2 warnings.filterwarnings('ignore') 3 import pandas as pd 4 import numpy as np 5 import matplotlib.pyplot as plt 6 import seaborn as sns 7 import missingno as msno 8 import scipy.stats as st
3.2 載入數據
1 train_path = './train_data.csv' 2 test_path = './test_data.csv' 3 # pandas顯示首尾數據 4 train_data = pd.read_csv(train_path,header=None,names=['time','cross','direction','leftFlow','straightFlow']) 5 train_data = train_data.eval('total = leftFlow + straightFlow', inplace=False) 6 print(train_data.head().append(train_data.tail())) 7 print(train_data.shape) 8 9 test_data = pd.read_csv(test_path,header=None,names=['time','cross','direction','leftFlow','straightFlow']) 10 test_data = test_data.eval('total = leftFlow + straightFlow', inplace=False) 11 print(test_data.head().append(test_data.tail())) 12 print(test_data.shape)
訓練數據和測試數據概覽如下(其中,total為leftFlow和straightFlow新合並成的列):
· time - 時間
· cross - 路口名
· direction - 車流方向
· leftFlow - 左轉車流
· straight - 直行車流
3.3 總覽數據概況
· describe種有每列的統計量,個數count、平均值mean、方差std、最小值min、中位數25% 50% 75% 、以及最大值 看這個信息主要是瞬間掌握數據的大概的范圍以及每個值的異常值的判斷,比如有的時候會發現999 9999 -1 等值這些其實都是nan的另外一種表達方式,有的時候需要注意下
· info 通過info來了解數據每列的type,有助於了解是否存在除了nan以外的特殊符號異常
1 # 總覽數據概況 2 print(train_data.describe()) 3 print(test_data.describe()) 4 5 # 查看數據類型 6 print(train_data.info()) 7 print(test_data.info())
3.4 判斷數據缺失和異常
1 # 查看數據缺失和異常 2 print(train_data.isnull().sum()) 3 print(test_data.isnull().sum())
由此可見,該數據集中並無缺失和異常數據。
3.5 查看預測值的分布
1 # 查看預測值數據分布情況 2 print(train_data['leftFlow'].value_counts()) 3 print(train_data['straightFlow'].value_counts()) 4 print(train_data['total'].value_counts()) 5 print(test_data['leftFlow'].value_counts()) 6 print(test_data['straightFlow'].value_counts()) 7 print(test_data['total'].value_counts())
可視化結果:
1 y = train_data['total'] 2 plt.figure(1) 3 plt.title('Johnson SU') 4 sns.distplot(y, kde=False, fit=st.johnsonsu) 5 plt.figure(2) 6 plt.title('Normal') 7 sns.distplot(y, kde=False, fit=st.norm) 8 plt.figure(3) 9 plt.title('Log Normal') 10 sns.distplot(y, kde=False, fit=st.lognorm) 11 plt.show() 12 13 y = train_data['leftFlow'] 14 plt.figure(1) 15 plt.title('Johnson SU') 16 sns.distplot(y, kde=False, fit=st.johnsonsu) 17 plt.figure(2) 18 plt.title('Normal') 19 sns.distplot(y, kde=False, fit=st.norm) 20 plt.figure(3) 21 plt.title('Log Normal') 22 sns.distplot(y, kde=False, fit=st.lognorm) 23 plt.show() 24 25 y = train_data['straightFlow'] 26 plt.figure(1) 27 plt.title('Johnson SU') 28 sns.distplot(y, kde=False, fit=st.johnsonsu) 29 plt.figure(2) 30 plt.title('Normal') 31 sns.distplot(y, kde=False, fit=st.norm) 32 plt.figure(3) 33 plt.title('Log Normal') 34 sns.distplot(y, kde=False, fit=st.lognorm) 35 plt.show()
total:
leftFlow:
straightFlow:
由上圖可見,當前時刻總車流量更擬合無界約翰遜分布,其他數據對各分布的擬合效果並不是很好。
3.6 查看類別特征的unique分布
1 categorical_features = ['time', 'cross', 'direction'] 2 # 特征unique分布 3 for cat_fea in categorical_features: 4 print(cat_fea + "的特征分布如下:") 5 print("{}特征有個{}不同的值".format(cat_fea, train_data[cat_fea].nunique())) 6 print(train_data[cat_fea].value_counts()) 7 8 # 特征unique 分布 9 for cat_fea in categorical_features: 10 print(cat_fea + "的特征分布如下:") 11 print("{}特征有個{}不同的值".format(cat_fea, test_data[cat_fea].nunique())) 12 print(test_data[cat_fea].value_counts())
訓練集:
測試集:
4 數據分析總覽
訓練集數據報告請見:http://123.57.131.141:8080/sample/train_report.html
測試集數據報告請見:http://123.57.131.141:8080/sample/test_report.html