EDA-数据探索性分析
赛题:零基础入门数据挖掘 - 二手车交易价格预测
地址:
https://tianchi.aliyun.com/competition/entrance/231784/introduction?spm=5176.12281957.1004.1.38b02448ausjSX
2 EDA目标
EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用。当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡。
3 代码示例
3.1 载入各种数据科学以及可视化库
#coding:utf-8
#导入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
3.2 载入数据
## 1)载入训练集和测试集;
path = './datalab/231784/'
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 - 汽车注册时间
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个匿名特征】
3.3 总览数据概况
Train_data.describe()
Test_data.describe()
Train_data.info()
Test_data.info()
3.4 判断数据缺失和异常
Train_data.isnull().sum()
Test_data.isnull().sum()
3.4 特征工程
可以发现除了notRepairedDamage 为object类型其他都为数字 这里我们把他的几个不同的值都进行显示就知道了
Train_data['notRepairedDamage'].value_counts()
对于特征’notRepairedDamage’,可以看出来‘ - ’也为空缺值,因为很多模型对nan有直接的处理,这里我们先不做处理,先替换成nan
Train_data['notRepairedDamage'] = Train_data['notRepairedDamage'].replace(
'-', np.nan)
Train_data['notRepairedDamage'] =Train_data['notRepairedDamage'].astype(
'float')
TestA_data['notRepairedDamage'] = TestA_data['notRepairedDamage'].replace(
'-', np.nan)
TestA_data['notRepairedDamage'] = TestA_data['notRepairedDamage'].astype(
'float')
对于特征’seller’和’offerType’,删除特征
Train_data["seller"].value_counts()
Train_data["offerType"].value_counts()
以下两个类别特征严重倾斜,一般不会对预测有什么帮助,故这边先删掉,当然你也可以继续挖掘,但是一般意义不大
del Train_data['seller']
del Train_data['offerType']
del TestA_data['seller']
del TestA_data['offerType']
对于价格标签‘price’,我对于进行log处理,让它趋于正态分布
## 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)
通过绘图可知,价格不服从正态分布,所以在进行回归之前,它必须进行转换。虽然对数变换做得很好,但最佳拟合是无界约翰逊分布
Train_data['price'] = np.log1p(Train_data['price'])
对于特征‘regDate’和’creatDate’,我提取它的年份
def date_parse(x):
year = int(str(x)[:4])
month = int(str(x)[4:6])
day = int(str(x)[6:8])
if month < 1:
month = 1
date = datetime(year, month, day)
return date
Train_data['regDate'] = Train_data['regDate'].apply(date_parse)
Train_data['creatDate'] = Train_data['creatDate'].apply(date_parse)
Train_data['regDate_year'] = Train_data['regDate'].dt.year.astype(
'float')
Train_data['creatDate_year'] = Train_data['creatDate'].dt.year.astype(
'float')
TestA_data['regDate'] = TestA_data['regDate'].apply(date_parse)
TestA_data['creatDate'] = TestA_data['creatDate'].apply(date_parse)
TestA_data['regDate_year'] = TestA_data['regDate'].dt.year.astype(
'float')
TestA_data['creatDate_year'] = TestA_data['creatDate'].dt.year.astype(
'float')
3.5 提取特征
去点Train_data中的‘price’标签
X_data = Train_data.drop('price',axis = 1)
Y_data = Train_data['price']
X_test = TestA_data
print('X train shape:',X_data.shape)
print('X test shape:',X_test.shape)