EDA

EDA数据探索分析学习历程

在这里我们用到了python中的几个库,这几个库分别是 pandas numpy matplotlib.pyplot seaborn missingno

pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务二创建的,Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。主要作为一种python的数据分析模块

numpy系统是Python的一种开源的数值 计算扩展。这种工具可用来存储和处理大型矩阵,比如Python自身的嵌套列表结构要高效的多

matplotlib 是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

seborn这个也是一种比较常见的画图软件工具

missingno提供了一个灵活易用的可视化工具来观察数据缺失情况,是基于matplotlib的,可以保证数据集的质量

代码学习过程

1. 1 载入各种数据科学以及可视化库

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.2 载入数据进行分析

这里我们需要载入测试集和训练集样本,我们将二手车交易的数据进行存储,调用pd中read_csv函数,其相关的代码如下所示

Train_data = pd.read_csv(‘E:\二手车交易\used_car_train_20200313.csv’, sep=’ ')

Train_data = pd.read_csv(‘E:\二手车交易\used_car_train_20200313.csv’, sep=’ ')

我在我电脑上保存了一下 然后调用了一下路径发现我的这个路径编辑发生了 错误,主要原因 是\被当作了转译字符,这里我又加了一个/就好了

Test_data = pd.read_csv(‘E:\二手车交易\used_car_testA_20200313.csv’, sep=’ ')

Train_data.head().append(Train_data.tail())

head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头5行
tail 用来显示档案的结尾至标准输出中,默认tail命令打印其相应文件的结尾5行

Train_data.shape

这条命令返回了测试数据的 样本维数,类似与返回了一条矩阵

1.3 总览数据概况

Train_data.describe()

这里用到的describe 主要展现的是数据中出现的一些统计描述信息 如上就是我们展现的 相关的数据统计的信息

Train_data.info()

从上面这个表格中,同过info可以很清晰的看出数据所对应的类型

Test_data.info()

和上面的数据遵循同样的道理,这不过这里查看的是测试数据的数据类型

1.4 判断数据缺失和异常

Train_data.isnull().sum()

insull也是pandas中数据处理中比较常用的函数,主要是判断数据缺失值用的

Test_data.isnull().sum()

和上面同理,这里查看的是测试集的数据

missing = Train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace = True)
missing.plot.bar()

这里主要查看数据的缺省值的情况,和上面用pandas中数据查看缺省值一样,只不过这里使用了matplotlib命令来进行图像的二维化处理

msno.matrix(Train_data.sample(250))

这是从训练数据中寻找250个样本,白线越多则代表 缺省值越多

msno.bar(Train_data.sample(1000))

这里可以看出msno中数据缺省的情况,相对于上面的图 ,我们一可以看出来,使用这种方法,可以更直观的看出各变量的缺省情况

接下来进行的是异常值的检测

Train_data.info()

这一部分就要对其中的数据类型 进行留意和分析了,可以看出notRepairedDamage为object类

Train_data[‘notRepairedDamage’].value_counts()

这里的-为一个缺省值,而之前的数据缺省一般都是nan这种情况,所以这里我们先不做处理,将其当作nan进行处理

Train_data[‘notRepairedDamage’].replace(’-’,np.nan, inplace=True

                                   )

Train_data[‘notRepairedDamage’].value_counts()

从这里我们可以看出经过这种replace的代换其中特殊的缺省值

Train_data.isnull().sum()

在我们将notRepairedDamage更改之后我们发现,原来使用pandas调用时候看出的缺省值已经发生了变化。而不再显示缺省值不为0的这种情况

同样的道理我们对测试集的样本进行分析

Test_data[‘notRepairedDamage’].value_counts()

Test_data[‘notRepairedDamage’].replace(’-’,np.nan,inplace=True
)

有些数据则对于预测帮助不是很大,这里面我们主要进行的是删除,

Train_data[“seller”].value_counts()

del Train_data[“seller”]
del Train_data[“offerType”]
del Test_data[“seller”]
del Test_data[“offerType”]

Train_data[“offerType”].value_counts()

1.5了解预测值的分布

Train_data[‘price’]

Train_data[‘price’].value_counts()

接下来就是进行总体分布概况的一种描述

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.skew(),Train_data.kurt()

这里描述的是一种偏度的计量

sns.distplot(Train_data.skew(),color=‘blue’,axlabel = ‘Skewness’)

sns.distplot(Train_data.kurt().color=‘orange’,axlabel = ‘Kurtness’)

sns.distplot(Train_data.kurt(),color=‘orange’,axlabel = ‘Kurtness’)

这里主要进行的 是峰度的描述

接下来查看的是预测值的具体频数

plt.hist(Train_data[‘price’],orientation = ‘vertical’,histtype = ‘bar’,color = ‘red’)

从这里可以看出频数大于 2000的值很少,说明这里的数据出现了异常。直接填充或者删掉在前进

log变换 Z之后的分布较均匀,可以进行log变换进行预测,这是预测问题常用的trick

plt.hist(np.log(Train_data[‘price’]),orientation = ‘vertical’,histtype = ‘bar’,color = ‘red’)

1.6 特征分为类别特征和数字特征并对类别特征查看unique

首先分离预测值

Y_train = Train_data[‘price’]

这种区别方式适用于没有直接label coding的数据
这里不使用于,需要人为根据实际含义来区分
数字特征

numeric_features = [‘power’,‘kilometer’,‘v_0’,‘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’,‘regDate’,‘model’,‘brand’,‘bodyType’,‘fuelType’,‘gearbox’,‘power’,‘kilometer’,‘notRepairedDamage’,‘regionCode’,‘seller’,‘offerType’,‘creatDate’,‘price’]

特征nuique分布

for cat_fea in categorical_features:
print(cat_fea + “的特征分布如下:”)
print("{}特征有几个{}不同的值".format(cat_fea, Train_data[cat_fea].nunique()))
print(Train_data[cat_fea].value_counts())

for cat_fea in categorical_features:
print(cat_fea + “的特征分布如下:”)
print("{}特征有几个{}不同的值".format(cat_fea, Test_data[cat_fea].nunique()))
print(Test_data[cat_fea].value_counts())

1.7 数字特征分析

numeric_features.append(‘price’)

numeric_features

Train_data.head()

接下来进行相关性的分析

price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
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)

通过这个图可以很清楚的看出各个变量的相关性

查看几个特征的峰度和偏度
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())
)

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()) )

接下来进行每个数字特征分布得可视化

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”)

接下来表示各个数字特征相互之间的关系可视化
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()

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

接下来进行的是多变量互相回归关系可视化

##多变量互相回归关系可视化
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6), (ax7, ax8), (ax9, ax10)) = plt.subplots(nrows=5, ncols=2, figsize=(24, 20))
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)

for fea in categorical_features:
print(Train_data[fea].unique())

for fea in categorical_features:
print(Train_data[fea].nunique())

categorical_features

因为 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”)

Train_data.columns

类别特征的小提琴图可视化
catg_list = categorical_features
target = ‘price’
for catg in catg_list :
sns.violinplot(x=catg, y=target, data=Train_data)
plt.show()

catg_list = categorical_features
target = ‘price’
for catg in catg_list :
sns.violinplot(x=catg, y=target, data=Train_data)
plt.show()

categorical_features = [‘model’,
‘brand’,
‘bodyType’,
‘fuelType’,
‘gearbox’,
‘notRepairedDamage’]

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”)

import pandas_profiling

import pandas_profiling

pfr = pandas_profiling.ProfileReport(Train_data)

import os
print(os.path.abspath(’.’))

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值