这是我的第一篇学习笔记的博客,因为新手上路学习数据挖掘,所以不会的东西有点多就写了很多。所以有什么意见欢迎来指点呀!
感谢Datawhale的给出的学习指南:https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12281978.0.0.68021b43uFO2bV&postId=95457
1.熟悉了解数据集,对数据集进行验证来确定所获得数据集可用于接下来的机器学习或深度学习使用。
2.了解变量间的相互关系以及变量与预测值之间的存在关系。
3.学习数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。
4.完成对于数据的探索性分析,对数据进行一些图标或文字总结。
数据集(Data set)是一个数据的集合,通常以表格形式出现。每一列代表一个特定变量。每一行都对应于某一成员的数据集的问题。 ——百度百科
(1)pandas库
pandas提供了高级数据结构和函数,这些数据结构和函数的设计使得利用结构化、表格化数据的工作快速、简单、有表现力。其中主要使用的pandas对象是DataFrame,它是二维的表格型数据结构,用于实现表格化、面向列、使用行列标签的数据结构;还有Series,它是一种一维标签数组对象。
(2)numpy库
numpy是Numerical Python库的简写,是python数值计算的基石。它提供多种数据结构、算法以及大部分涉及python数值计算所需的接口。
(3)matplotlib库
matplotlib是用于制图及其他二维数据可视化的python库。
(4)seaborn库 ——数据统计可视化
Seaborn是基于matplotlib的Python数据可视化库。它提供了用于绘制引人入胜且内容丰富的统计图形的高级界面。
(5)missingno库
missingno提供了一个灵活且易于使用的缺失数据可视化和实用程序的小工具集。
下面的代码都是基于零基础入门数据挖掘 - 二手车交易价格预测的比赛:https://tianchi.aliyun.com/competition/entrance/231784/information
#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
Train_data = pd.read_csv('used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv('used_car_testA_20200313.csv', sep=' ')
#简略观察数据(head()+shape)
Train_data.head().append(Train_data.tail())
- pd.read_csv(filename):从CSV文件导入数据
- Train_data.head():查看对象Train_data的前5行
- Train_data.tail():查看对象Train_data的最后5行
Train_data.shape()
- Train_data.shape:查看行数和列数
Test_data.describe()
- Test_data.describe():查看数值列的汇总统计 它有每列的统计量:个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以最大值max
Test_data.info()
- Test_data.info():查看索引、数据类型和内存信息
Train_data.isnull().sum()
- Train_data.isnull().sum():查看对象Train_data的列是否有空值,若没有则返回False;并用sum()将False的个数相加。个数为0就代表没有空值。
# nan可视化
missing = Train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
- missing[missing > 0] :将missing>0的以列表形式放入missing中。
- missing.sort_values(inplace=True):将元素排序并且替换原来的数据。
- missing.plot.bar():画出垂直条形图
- 在这里可以直观得看出哪些列是有空值的、拥有空值的多少。可以帮助我们判断在后续的分析中是否要删除这些空值多的列。
msno.matrix(Train_data.sample(250))
- msno.matrix(Train_data.sample(250)):随机抽取Train_data中的250条数据,生成查看缺失值的可视化。
- 由上图可以看出,白线越多,代表缺失值越多。
msno.bar(Train_data.sample(1000))
- msno.bar(Train_data.sample(1000)):简单展示无效数据的条形图。图表显示了给定数据的空值。
总体分布概况
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(1); plt.title(‘Johnson SU’) :创建了画板1并命名为Johnson SU
- sns.distplot(y, kde=False, fit=st.johnsonsu) :将对象Johnson SU绘制观测值的单变量分布,不绘制高斯克密度估计。
- 说明价格不服从正态分布,所以要先转化后进行回归。
查看skewness和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中的price的无偏倾斜,按N-1归一化。
- Train_data[‘price’].kurt():使用Fisher的峰度定义返回的Train_data中的price上的无偏峰度(normal的峰度==
0.0),按N-1归一化。- 偏度 Skewness是描述数据分布形态的统计量,其描述的是某总体取值分布的对称性,简单来说就是数据的不对称程度。
- 峰度 Kurtosis是描述某变量所有取值分布形态陡缓程度的统计量,简单来说就是数据分布顶的尖锐程度。
查看预测值的具体频数
由前面查看价格的总体分布概况可知道,大于20000的值极少,因此可以当做特殊值直接填充或者删掉。因此就利用log变换进行预测,这也是预测问题常用的技巧。
plt.hist(np.log(Train_data['price']), orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()
# 分离label即预测值
Y_train = Train_data['price']
#数字特征
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']
#类型特征
categorical_features = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox','notRepairedDamage','regionCode','seller','offerType','createDate']
# 特征nunique分布
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())
- str.format():增强字符串格式化的功能,基本语法是通过{}和:代替以前的%。
- Train_data.nunique():返回Train_data的cat_fea有多个不同观测值的序列。
数字特征分析
(1)相关性分析
numeric_features.append('price')
price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
print(correlation['price'].sort_values(ascending = False),'\n')
- price_numeric.corr():计算列的两两相关,不包括NA/null值。
- correlation.sort_values():按降序排序
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)
- sns.heatmap():用颜色编码的矩阵来绘制矩形数据。
(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())
)
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")
- pd.melt():可以选择将数据流从宽格式转换成长格式,设置标识符变量。
- sns.FacetGrid():用于绘制条件关系的多图网格。建立一个有刻度的空白面板。
- g.map():将绘图函数应用于每个方面的数据子集。
- 可以看出匿名特征相对分布均匀
(4)数字特征相互之间的关系可视化
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.pairplot():在数据集中绘制成对关系。参数diag_kind="kde"代表单变量为线形图,其他散点。参数kind ='scatter’代表为类型是散点图。
(5)多变量相互回归关系可视化
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)
- plt.subplots():创建一个图形和一组子图。
- pd.concat():将数据根据不同的轴作简单的融合。
- sns.regplot():图数据与线性回归模型拟合。
类别特征分析
for fea in categorical_features:
print(Train_data[fea].nunique())
运行结果:
99662
248
40
8
7
2
2
7905
2
1
Train_data.nunique():返回在请求轴上多个不同观测值的序列。
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 bar_plot(x, y, **kwargs):
sns.barplot(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(bar_plot, "value", "price")
import pandas_profiling
pfr = pandas_profiling.ProfileReport(Train_data)
pfr.to_file("./example.html")
数据探索会让我们发现数据的一些特性和数据之间的关联性,主要步骤为:
1.查看数据,对数据要有初步的认识。要注意数据是否有缺失值,是否会影响数据中的表现形式,一些无意义的数据可以进行适当的删除。
2.分析记录某些特征值缺失占比30%以上样本的缺失处理,分析特征应该是填充,还是舍去,还是要先做样本分类用不同的特征模型去预测。
3.对异常值做分析,分析特征异常的label是否为异常值,异常值是否要删除,还是用正常值填充,是记录异常还是机器本身异常等等。
4.对label做专门分析,分析标签分布情况等等。
5.进一步分析可通过对特征作图,对特征和特征联合作图,特征和label联合作图,分析关联性。
个人观点:
简单地说,就是将数据做一个简单的预处理。先看数据有没有缺失值,再看缺失值是否有意义,然后再做数据关联分析。