EDA-task2
#导入warnings包,利用过滤器来实现忽略警告语句。
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
## 1) 载入训练集和测试集;
Train_data = pd.read_csv(r'E:\二手车交易数据\used_car_train_20200313.csv', sep=' ') #若是不加sep,会出现只有一列的情况
Test_data = pd.read_csv(r'E:\二手车交易数据\used_car_testA_20200313.csv', sep=' ')
Train_data.head().append(Train_data.tail())
Train_data.shape
Test_data.head().append(Test_data.tail())
Test_data.shape
## 1) 通过describe()来熟悉数据的相关统计量
Train_data.describe()
Test_data.describe()
## 2) 通过info()来熟悉数据类型
Train_data.info()
Test_data.info()
## 1) 查看每列的存在nan情况
Train_data.isnull().sum()
Test_data.isnull().sum()
# nan可视化
missing = Train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
# 可视化看下缺省值
msno.matrix(Train_data.sample(1000))
msno.bar(Train_data.sample(1000))
msno.matrix(Test_data.sample(250))
msno.bar(Test_data.sample(1000))
## 2) 查看异常值检测
Train_data.info()
#只有'notRepairedDamage'是object型的数据,查看该变量的数据分布
Train_data['notRepairedDamage'].value_counts()
Test_data['notRepairedDamage'].value_counts()
#将‘-’用‘nan’来替代,因为很多模型可以直接处理nan
Train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
Train_data['notRepairedDamage'].value_counts() #确定'nan'都已经被替换掉了
Test_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
Test_data['notRepairedDamage'].value_counts()
Train_data.isnull().sum()
#发现下面两个变量存在严重的类别不均衡现象,可以删除这两个变量,一般不会对预测有什么帮助
Train_data["seller"].value_counts()
Train_data["offerType"].value_counts()
del Train_data["seller"]
del Train_data["offerType"]
del Test_data["seller"]
del Test_data["offerType"]
###了解预测目标(价格)的分布
Train_data['price']
Train_data['price'].value_counts()
## 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)
价格不服从正态分布,转换成正态分布近似正态分布。从上面的三幅图看出虽然对数变换做得很好,但最佳拟合是无界约翰逊分布
## 2) 查看skewness and kurtosis
sns.distplot(Train_data['price'])
print("Skewness: %f" % Train_data['price'].skew()) #偏度值
print("Kurtosis: %f" % Train_data['price'].kurt()) #峰度
Train_data.skew()
Train_data.kurt()
sns.distplot(Train_data.skew(),color='red',axlabel ='Skewness')
sns.distplot(Train_data.kurt(),color='yellow',axlabel ='Kurtness')
## 3) 查看预测值的具体频数
plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='purple')
plt.show()
# log变换之后的分布较均匀,因此可以对预测变量进行log变换,这也是预测问题常用的trick
plt.hist(np.log(Train_data['price']), orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()
##数值特征分布
numeric_features.append('price')
## 1) 相关性分析
price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
#查看price与其他变量的相关性
print(correlation['price'].sort_values(ascending = False),'\n')
#绘制相关性的图
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)