数据挖掘 Task2:数据的探索性分析(EDA)

数据挖掘 Task2:数据的探索性分析(EDA)

1、载入数据分析和可视化常用库

其他都是我平时常用的库,missingno第一次用,主要是用于直观显示数据集中缺失值的分布以及相关性的。

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import missingno as msno

2、载入数据和观察数据基本特征

读取训练集数据,初步观察数据集规模,数值特性,数据类型等

filepath=r'C:\Users\信息\Desktop\DataWhale 14 天训练营\used_car\used_car_train_20200313.csv'
#打开训练集,查看数据规模,观察特征
train=pd.read_csv(filepath,sep=' ')
print(train.head().append(train.tail()))
print(train.shape)
#总览数据概况
print(train.info())#数据类型
print(train.describe())#数据数值特性

3、判断数据缺失和异常

(1)数据缺失

统计数据有缺失的列,统计缺失个数,利用missingno库直观查看
小tip:使用pycharm时没找到missingno的库,进入cmd,使用pip install missingno安装完成

#查看缺失值
print(train.isnull().sum())
missing=train.isnull().sum()
missing=missing[missing>0]
plt.bar(missing.index,missing.values)
plt.show()
msno.matrix(train,labels=True)#无效矩阵的数据密集显示
msno.bar(train)#列的无效的简单显示
msno.heatmap(train)#热图相关性,一个变量的存在或不存在如何强烈影响的另一个的存在
plt.show()

(2)数据异常

异常值不太容易能直接看出来,数据量大,按照一般思路找到唯一一个数据属性是object的观察了一下,发现有‘-’,用nan值代替,其他的数据等待进行可视化的时候发现异常。

#查看异常值
print(train.info())
print(train['notRepairedDamage'].value_counts())
train['notRepairedDamage'].replace('-',np.nan,inplace=True)
print(train['notRepairedDamage'].value_counts())

4、了解预测值的分布

(1)拟合数据分布

需要预测的值是价格,用核密度函数观察实际价格分布符合哪种分布,用johnsonsu,norm,lognorm三种分布进行尝试,绘制图片,观察哪个分布更符合预测值的实际分布,需要用到scipy库和seaborn绘图库。

#总体分布情况
import seaborn as sns
import scipy.stats as st
result=train['price']
plt.figure(figsize=(10,8))
ax1=plt.subplot(131)
ax1.title.set_text('johnsonsu')
sns.distplot(result, fit=st.johnsonsu)
ax2=plt.subplot(132)
ax2.title.set_text('norm')
sns.distplot(result, fit=st.norm)
ax3=plt.subplot(133)
ax3.title.set_text('lognorm')
sns.distplot(result, fit=st.lognorm)
plt.show()

下面是绘制出的分布图
数据挖掘 Task2:数据的探索性分析(EDA)_第1张图片
可以直观地看出更符合johnsonsu分布,不符合正态分布。

(2)查看偏度skewness和峰度kurtosis

偏度:能够反应分布的对称情况,右偏(也叫正偏),在图像上表现为数据右边脱了一个长长的尾巴,这时大多数值分布在左侧,有一小部分值分布在右侧。
峰度:反应的是图像的尖锐程度,峰度越大,表现在图像上面是中心点越尖锐。在相同方差的情况下,中间一大部分的值方差都很小,为了达到和正太分布方差相同的目的,必须有一些值离中心点越远,所以这就是所说的“厚尾”,反应的是异常点增多这一现象。

sns.distplot(result)
print(result.skew())#价格偏度
print(result.kurt())#价格峰度
plt.figure(figsize=(10,8))
plt.subplot(121)
sns.distplot(train.skew(),axlabel='skewness')
plt.subplot(122)
sns.distplot(train.kurt(),axlabel='kurtosis')
plt.show()

数据挖掘 Task2:数据的探索性分析(EDA)_第2张图片

(3)查看预测值的具体频数

plt.hist(result)
plt.show()

数据挖掘 Task2:数据的探索性分析(EDA)_第3张图片
超过20000的很少,可以着重分析20000以内的,其他值我认为可以当作异常值处理。

你可能感兴趣的:(数据分析,python,可视化)