数据挖掘EDA学习

数据挖掘EDA学习

"""
EDA-数据探索性分析
1.EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于
接下来的机器学习或者深度学习使用。
2.当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。
3.引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测
问题更加可靠。
4.完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡
"""

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

path='./data/'
Train_data=pd.read_csv(path+'used_car_train.csv',sep=' ') #默认即是空格
Test_data=pd.read_csv(path+'used_car_testA.csv',sep=' ')

#简略观察数据 head()+shape
Train_data.head().append(Train_data.tail())
#通过,describele来熟悉数据的相关统计量
descibe=Train_data.describe()
info=Train_data.info()
#查看每列是否存在缺失值,并将其可视化
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(100000))

#查看异常对象类型的特征值的统计
Train_data['notRepairedDamage'].value_counts() #notRepairedDamage 汽车有没有损坏
#将'-'值替换成Nan,因为很多模型对nan有直接的处理
Train_data['notRepairedDamage'].replace('-',np.nan,inplace=True) #inplace 是否替换
Test_data['notRepairedDamage'].value_counts()
Train_data['notRepairedDamage'].replace('-',np.nan,inplace=True)

#去掉倾斜特征,可在describle描述中初步观察某个特征的方差和最大最小判断是否可能是倾斜特征,再用value_counts()统计
Train_data['seller'].value_counts()
Test_data['offerType'].value_counts()
#通过del函数去除
del Train_data["seller"]
del Train_data["offerType"]
del Test_data["seller"]
del Test_data["offerType"]

#了解预测值的分布
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)
#价格不服从正态分布,所以在进行回归之前,它必须进行转换。虽然对数变换做得很好,
#但最佳拟合是无界约翰逊分布
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='blue',axlabel ='Skewness')
sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness',kde=False)
#查看预测值的具体频数
sns.distplot(Train_data['price'],color='red',kde=False,bins=8)

#分离Label即预测值
Y_train=Train_data['price']

#分类特征nunique分布

categorical_features = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 
                        'notRepairedDamage', 'regionCode',]

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


numeric_features = ['power', 'kilometer', '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' ]

#数字特征分析

numeric_features.append('price')

## 1.相关性分析

price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
print(correlation['price'].sort_values(ascending = False),'\n')

ax1=plt.subplots(figsize = (5, 5))
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
sns.heatmap(correlation,square = True,  vmax=0.8,annot=False) #annot:是否显示数字

del price_numeric['price']
## 2.查看几个特征得偏度和峰值
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())  
         )

## 3.每个数组特征得分布可视化
f = pd.melt(Train_data, id_vars=[],value_vars=numeric_features)
#pd.melt 将数据拆分成单变量形式的Nx2表,id_vars不需要转换的特征列表,values_var需要转换的
g = sns.FacetGrid(f, col="variable",  col_wrap=3, sharex=False, sharey=False)
#sns.FacetGrid 构建结构化多绘图网络
#基本工作流程是FacetGrid使用数据集和用于构造网格的变量初始化对象。
#然后,可以通过调用FacetGrid.map()或将一个或多个绘图函数应用于每个子集 FacetGrid.map_dataframe()。
#最后,可以使用其他方法调整绘图,以执行更改轴标签,使用不同刻度或添加图例等操作
g=g.map(sns.distplot,"value")

## 4.数字特征相互之间的关系可视化
#sns.pairplot主要展现的是变量两两之间的关系,kind:控制非对角线上图的类型,可选"scatter"与"reg"
#diag_kind:控制对角线上的图的类型,可选"hist"与"kde",Hue:不同种类标志不同颜色,
sns.set() #可用此函数对sns整体的图进行风格控制
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()

#5. 绘制回归图
#sns.regplot(x,y,data) data参数是DataFram类型,x是data某一列列名作为X坐标,y也是data某一列列名,作为坐标
fig,(ax1,ax2)=plt.subplots(nrows=1, ncols=2, figsize=(24, 20))
v_12_scatter_plotData = pd.concat([Y_train,Train_data['v_12']],axis = 1)
sns.regplot(x='v_12',y='price',data=v_12_scatter_plotData,scatter= True, fit_reg=True, ax=ax1)
v_8_scatter_plotData = pd.concat([Y_train,Train_data['v_8']],axis = 1)
sns.regplot(x='v_8',y = 'price',data = v_8_scatter_plotData,scatter= True, fit_reg=True, ax=ax2)


# 用pandas_profiling 生成数据报告
import pandas_profiling

pfr = pandas_profiling.ProfileReport(Train_data)
pfr.to_file("./example.html")






















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值