一、数据分析
1.1 载入各种数据科学以及可视化库
ModuleNotFoundError: No module named 'missingno'
解决方法:
尚未安装名为 missingno
的库。该错误信息显示了 ModuleNotFoundError: No module named 'missingno'
,这意味着 Python 找不到名为 missingno
的库。
要解决这个问题,需要先安装 missingno
库。在 Jupyter Notebook 中,可以使用以下命令来安装 missingno
:
!pip install missingno
1.2载入数据
##载入训练集和测试集
path='C:/Users/Lenovo/Desktop/'
Train_data=pd.read_csv(path+'used_car_train_20200313.csv',sep=' ')
Test_data=pd.read_csv(path+'used_car_testA_20200313.csv',sep=' ')
## 2) 简略观察数据(head()+shape)
Train_data.head().append(Train_data.tail())
Train_data.shape
Test_data.head().append(Test_data.tail())
append()
是一个Python列表的方法,用于将一个序列(如另一个列表)追加到当前列表的末尾。
在这个问题中,Train_data.head()
返回了Train_data
数据集的前几行,而Train_data.tail()
返回了Train_data
数据集的最后几行。通过使用append(Train_data.tail())
,可以将Train_data.tail()
返回的最后几行追加到Train_data.head()
返回的前几行后面,生成一个新的列表或数据框。
所以,Train_data.head().append(Train_data.tail())
是将Train_data
数据集的头部和尾部进行合并,展示了数据集的整体内容。
1.3 总览数据概况
1.3.1通过describe()来熟悉数据的相关统计量
describe种有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值 看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下
## 在上面的代码框继续编代码
Train_data.describe() ## 通过describe()来熟悉数据的相关统计量
Test_data.describe()
1.3.2通过info()来熟悉数据类型
info 通过info来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常
## 2) 通过info()来熟悉数据类型
Train_data.info()
##运行结果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150000 entries, 0 to 149999
Data columns (total 31 columns):
# Column Non-Null Count Dtype
SaleID 150000 non-null int64
name 150000 non-null int64
regDate 150000 non-null int64
model 149999 non-null float64
这是一个Pandas数据框(DataFrame)的概览。下面是对每个信息的解释:
RangeIndex: 150000 entries:数据框的索引范围是从0到149999,共有150000个条目。
Data columns (total 31 columns)::数据框总共有31列。
Column:列名
Non-Null Count:非空值的数量,即该列中存在的有效数据的数量。
Dtype:列的数据类型
有一种数据类型是object,object
是 Pandas 中的一种数据类型,用于表示混合类型或不同类型的数据。在 Pandas 中,object
数据类型通常用于存储字符串(包括文本)或其他Python对象。
使用 object
数据类型可以处理多种不同的数据,但也可能导致一些性能问题,因为它需要更多的内存和计算资源来处理和操作这些数据。如果可以确定数据的具体类型,最好是将其转换为更适合的数据类型,以提高计算效率和减少内存占用。
1.4判断数据缺失和异常
1.4.1查看每列的存在nan情况
nan
是一个缩写,表示 "Not a Number"(不是一个数字)。在许多编程语言和数据分析库中,包括Python和Pandas,nan
用于表示缺失值或无效的数值。
当数据中存在缺失值时,通常会以 nan
的形式出现。例如,在一个包含数值的数据集中,某些单元格可能没有被填充,或者是由于数据采集过程中的错误而导致数值无效。这些未知、缺失或无效的数值会被表示为 nan
。
在Pandas中,nan
是一个特殊的浮点数值(numpy.nan
),用于表示缺失值。它可以出现在Pandas数据框中的任何列或单元格中,通常会与 float64
数据类型一起使用。当进行数据分析和处理时,需要注意处理和处理 nan
值,以避免对计算和统计结果产生不良影响。
## 1) 查看每列的存在nan情况
Train_data.isnull().sum()
Test_data.isnull().sum()
Train_data.isnull().sum()
是一个 Pandas DataFrame(数据框)的操作,用于计算每列中缺失值(NaN)的数量。
具体而言,isnull()
方法会将数据框中的每个单元格检查是否为缺失值,并返回一个新的布尔类型数据框,其中缺失值对应的单元格为True,非缺失值对应的单元格为False。
接着,sum()
方法会对每一列进行求和操作,计算出每列中 True 数量(即缺失值的数量),因为 True
被解释为1,False
被解释为0。
所以,Train_data.isnull().sum()
返回的结果是一个包含了每一列缺失值数量的数据框。
1.4.2nan可视化
## nan可视化
missing=Train_data.isnull().sum()
missing=missing[missing>0]
missing.sort_values(inplace=True)
colors=['yellow','green','red']
missing.plot.bar(color=colors)
Train_data.isnull().sum()
会计算每列中的缺失值数量,并将结果存储在 missing
变量中。
missing = missing[missing > 0]
会筛选出具有缺失值的列,并将结果重新赋值给 missing
变量。
missing.sort_values(inplace=True)
会对 missing
数据框按照缺失值数量进行排序,使得条形图的顺序更加整齐。
sort_values(inplace=True)
是 Pandas 数据框的一个方法,用于对数据框进行排序操作。具体而言,sort_values()
方法按照指定的列或多个列的值对数据框进行排序。在这里,missing.sort_values(inplace=True)
表示将 missing
数据框按照缺失值数量进行排序,并修改原数据框而不创建副本。
参数 inplace=True
表示将排序后的结果直接替换原数据框,而不返回新的数据框。通过设置 inplace=True
,可以节省内存和避免创建不必要的数据副本。
因此,在代码中使用 missing.sort_values(inplace=True)
表示对 missing
数据框按照缺失值数量进行排序,并将排序后的结果保存在原数据框中。
在 missing.plot.bar()
中,plot
和 bar
都是 matplotlib.pyplot
库中的函数方法。matplotlib.pyplot
是一个用于绘制图表的子模块,通常将其简化为 plt
。在导入语句中使用 import matplotlib.pyplot as plt
将该库导入。
在这里,plot
是用于绘制图表的函数方法,而 bar
是该函数方法的一个参数,表示绘制条形图。missing.plot.bar()
的含义是使用 missing
数据框的索引作为横轴,数据框中的值作为纵轴,绘制条形图。
此外,还可以使用其他的 plot
函数方法绘制不同类型的图表,如线图、散点图等。bar
参数表示绘制条形图,我们也可以根据需要选择其他参数来绘制不同类型的图表。
上述代码的运行结果如下:
当使用 missing.plot.bar()
方法绘制条形图时,默认情况下,每个条形的颜色都是相同的。如果要让绘制的条形颜色不一样,可以通过传递一个颜色列表给 color
参数来实现。创建了一个包含不同颜色的列表 colors
。然后,在 missing.plot.bar()
方法中,通过将 colors
列表传递给 color
参数,为每个条形指定了不同的颜色。
1.4.3可视化看下缺省值
缺失值(或缺省值)指的是数据集中某些条目或观测值在特定列中缺少数值或信息的情况。在数据分析和统计建模过程中,经常会遇到缺失值的情况。
缺失值可能由于各种原因而产生,例如记录错误、数据采集问题、设备故障等。在实际应用中,缺失值的存在可能会对数据分析和模型构建产生影响。
常见的表示缺失值的方式包括:
NaN(Not a Number):在Python的NumPy和Pandas库中,缺失值通常以NaN表示。
None:在Python中,None是一个特殊的对象,常用于表示缺失值。
其他特定的符号或标记:有些数据集使用特定的符号或标记来表示缺失值,例如-9999或NA。
处理缺失值的方式包括:
删除缺失值:可以直接删除缺失值所在的行或列,但这可能会导致数据量减少或丢失重要信息。
填充缺失值:可以使用各种方法填充缺失值,例如平均值、中位数、众数或者根据其他相关特征进行插值计算。
在数据分析和建模过程中,处理缺失值是一个重要的任务,需要根据具体情况采取适当的方法来处理缺失值,以确保数据质量和模型的准确性。
msno.matrix(Train_data.sample(250))
msno.matrix(Train_data.sample(250))
是使用 missingno
库中的 matrix
函数来绘制一个缺失值矩阵图的代码。sample(250) 是对训练数据进行随机抽样,抽取其中的250个样本作为可视化的数据子集。msno.matrix() 是 missingno 库中用于绘制缺失值矩阵图的函数。它会将数据集中每个列的缺失值以矩阵的形式进行可视化,缺失值用白色表示,非缺失值用黑色表示。
通过绘制缺失值矩阵图,可以直观地了解整个数据集中每个特征的缺失情况。矩阵中每一列对应数据集的一个特征,每一行对应数据集中的一个样本。如果某个格子是白色,则表示该样本在该特征上存在缺失值;如果格子是黑色,则表示该样本在该特征上不存在缺失值。
这种图形展示方式有助于我们快速识别出哪些特征有较多的缺失值,以及缺失值的分布情况。从而可以更好地决定如何处理缺失值,选择适当的填充策略或者考虑删除缺失值所在的行或列。
1.4.4查看异常值检测
Train_data.info()
Train_data['notRepairedDamage'].value_counts()
1.4.4.1 value_counts()
Train_data['notRepairedDamage'].value_counts()
是 Pandas 库中的一个函数,用于计算指定列中各个唯一值的频数。
Train_data 是一个数据集,表示训练数据。
['notRepairedDamage'] 是数据集中的一个列名,表示要计算频数的列。
value_counts() 是 Pandas 库中的函数,用于统计指定列中每个唯一值出现的频数,并返回一个包含频数结果的序列(Series)。
例如,假设 Train_data['notRepairedDamage']
列中有值:'Yes'、'No'、'Yes'、'Yes'、'No'。那么执行 Train_data['notRepairedDamage'].value_counts()
将返回以下结果:
Yes 3
No 2
以上结果表示在 'notRepairedDamage'
列中,'Yes' 出现了3次,'No' 出现了2次。通过使用 value_counts()
函数,可以很方便地获取某个列中每个唯一值的频数信息,帮助我们快速了解数据的分布情况,进行数据清洗、特征工程或其他数据处理操作。
上述代码的运行结果为:
0.0 111361
- 24324
1.0 14315
Name: notRepairedDamage, dtype: int64
可以看出来‘ - ’也为空缺值,因为很多模型对nan有直接的处理,这里我们先不做处理,先替换成nan
Test_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
Test_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
这行代码是用于在 Test_data
数据集中将特定值 '-'
替换为缺失值 np.nan
的操作。
具体解释如下:
Test_data['notRepairedDamage']
是指定要进行操作的列,即'notRepairedDamage'
列。replace('-', np.nan, inplace=True)
是 Pandas 库中的函数,用于将指定的值替换为另一个值。'-'
是要被替换的特定值,即将'-'
替换为np.nan
。np.nan
是缺失值的表示,它来自于 NumPy 库,表示数据缺失或不可用的值。inplace=True
是一个参数,表示在原始数据集上进行修改,即直接在Test_data['notRepairedDamage']
列上进行替换操作,而不是创建一个新的副本。
因此,执行这行代码后,在 Test_data['notRepairedDamage']
列中,所有的 '-'
值都会被替换为缺失值 np.nan
。这种操作通常用于数据预处理过程中,将特定的占位符或无效值替换为有效的缺失值表示方式,以便后续的数据分析和建模处理。
1.5了解预测值的分布
1.5.1 总体分布概况(无界约翰逊分布等)
无界约翰逊分布(Unbounded Johnson distribution)是一类连续概率分布,用于拟合实数范围内的非对称数据。它是约翰逊分布(Johnson distribution)的一个特殊情况,不具有上下界限。约翰逊分布是通过对正态分布进行坐标变换得到的,通过引入两个形状参数和两个尺度参数来完全描述分布的形状。无界约翰逊分布是当形状参数设置为零时得到的特殊情况。
代码如下:
## 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)
1.5.1.1 scipy
scipy
是一个开源的科学计算库,用于数学、科学和工程领域的高级计算。它构建在 Python 编程语言的基础上,并提供了许多用于数值计算、优化、统计分析、信号处理、图像处理、机器学习等方面的函数和工具。scipy
提供了许多子模块,每个子模块都专注于特定的领域或功能。以下是 scipy
的一些主要子模块:
scipy.integrate
: 数值积分和常微分方程求解。scipy.optimize
: 优化和寻找函数最小值或最大值的工具。scipy.stats
: 统计分布、概率密度函数、随机变量生成和统计检验。scipy.signal
: 信号处理和滤波。scipy.linalg
: 线性代数运算和矩阵计算。scipy.sparse
: 稀疏矩阵及其相关操作。scipy.interpolate
: 插值和拟合。scipy.spatial
: 空间数据结构和算法。scipy.io
: 输入输出工具,用于读取和写入各种文件格式。
1.5.1.2 matplotlib.pyplot
matplotlib.pyplot
是 matplotlib
库的子模块之一,用于创建图形和可视化数据。它通常被导入并简写为 plt
,以方便在代码中使用。使用 matplotlib.pyplot
可以完成各种绘图任务,包括绘制线型图、散点图、柱状图、直方图、饼图等,以及设置图形标题、坐标轴标签、图例和样式等。以下是 matplotlib.pyplot
的一些常用函数:
plt.plot()
: 绘制折线图或散点图。plt.scatter()
: 绘制散点图。plt.bar()
: 绘制柱状图。plt.hist()
: 绘制直方图。plt.pie()
: 绘制饼图。plt.title()
: 设置图形标题。plt.xlabel()
: 设置 x 轴标签。plt.ylabel()
: 设置 y 轴标签。plt.legend()
: 添加图例。plt.grid()
: 添加网格线。plt.show()
: 显示图形窗口。
通过 matplotlib.pyplot
,你可以根据需要自定义图形的外观、布局和标注,使数据更具可视化效果,从而更好地理解和传达数据。
1.5.1.3 plt.figure()
plt.figure(1)
是 matplotlib.pyplot
中的一个函数调用,用于创建一个新的图形窗口或选择已存在的图形窗口。 在 matplotlib.pyplot
中,每个图形窗口都有一个唯一的数字标识符,用于区分不同的窗口。plt.figure()
函数可以接受一个可选的数字参数,用于指定要创建或选择的图形窗口的标识符。
具体来说,plt.figure(1)
的作用是:
- 如果没有标识符为 1 的图形窗口存在,则创建一个标识符为 1 的新图形窗口。
- 如果已经存在标识符为 1 的图形窗口,则将当前绘图操作切换到该窗口上,并在该窗口中进行后续的绘图操作。
在后续的绘图操作中,如果没有指定其他图形窗口的标识符,plt.figure()
函数会默认使用最近选择的图形窗口。需要注意的是,plt.figure()
函数返回一个 Figure
对象,你可以将其用作后续图形设置和绘图的基础。总结起来,plt.figure(1)
用于创建一个新的图形窗口或选择已存在的编号为 1 的图形窗口。
1.5.1.4 sns.distplot( )
使用 seaborn
,需要将其导入为 sns
,并调用相应的函数来创建图形。例如,你可以使用 sns.distplot()
创建直方图,使用 sns.scatterplot()
创建散点图,或者使用 sns.barplot()
创建条形图等。
在上述代码中的sns.distplot()
函数中,括号里的内容具体表示如下:
y
:要绘制的数据。这可以是一维数组、Series 或 DataFrame 的列。kde=False
:设置是否显示核密度估计曲线。默认为True
,即显示核密度估计曲线;设置为False
则不显示。fit=st.johnsonsu
:指定要拟合的概率分布函数。st.johnsonsu
是scipy.stats
模块中的 Johnson SU 分布函数。通过将数据拟合到指定的概率分布函数,可以在直方图上绘制出拟合的曲线
需要注意的是,st.johnsonsu
是 scipy.stats
模块中的一个概率分布函数,用于对数据进行概率分布拟合。需要先导入 scipy.stats
模块,可以使用类似 import scipy.stats as st
的方式导入。
1.5.1.4.1 使用sns.distplot( )的步骤
1.导入所需的库:
import seaborn as sns
import matplotlib.pyplot as plt
2.准备数据。将要绘制的数据存储在一个变量中,例如 data
3.调用 sns.distplot() 函数来创建直方图和核密度估计曲线
4.可以设置是否显示核密度估计曲线、调整直方图的颜色等。
下面是一些常用的参数:
kde
:是否显示核密度估计曲线,默认为True
。hist
:是否显示直方图,默认为True
。color
:指定直方图和拟合曲线的颜色,可以是颜色名称或颜色代码。label
:图例标签,用于表示数据集的标识。bins
:指定直方图的柱数。
例如,以下是一个设置了一些常用参数的示例:
sns.distplot(data, kde=False, hist=True, color='blue', label='Data', bins=30)
5.最后使用plt.show()显示图形
1.5.1.4.2 kde
其中,kde
是 Kernel Density Estimation(核密度估计)的缩写,是一种非参数估计概率密度函数的方法。
在数据分析和可视化中,核密度估计可以用于估计数据的概率密度分布。它通过在每个数据点周围放置一个核函数,并将这些核函数进行加权平均来估计概率密度分布。核密度估计可以在直方图的基础上提供更平滑的连续概率密度估计曲线。
在 seaborn
中的 sns.distplot()
函数中,kde
参数用于控制是否显示核密度估计曲线。默认情况下,kde
的取值为 True
,即显示核密度估计曲线。如果将 kde
参数设置为 False
,则不显示核密度估计曲线,只显示直方图。
核密度估计曲线可以提供关于数据分布的平滑表示,尤其在数据量较小或存在噪声时,能够更好地反映数据的概率密度情况。它对于观察数据分布的整体形状和趋势非常有用。
1.5.2 skewness and kurtosis
sns.distplot(Train_data['price'])
print("Skewness:%f"%Train_data['price'].skew())
print("Kurtosis:%f"%Train_data['price'].kurt())
偏度(Skewness)和峰度(Kurtosis)是描述概率分布形状的统计量。
-
偏度(Skewness): 偏度是衡量概率分布对称性或偏斜程度的统计量。它描述了数据集的分布在平均值周围的对称性。如果数据集的分布相对于平均值向右侧延伸得更长,即有更多的极端值在右侧,那么偏度将是正的。如果数据集的分布相对于平均值向左侧延伸得更长,即有更多的极端值在左侧,那么偏度将是负的。偏度为零表示数据集相对于平均值是对称的。
-
峰度(Kurtosis): 峰度是衡量概率分布尾部厚度或峰态程度的统计量。它描述了数据集尖峭或扁平的程度。高峰度表示分布具有较尖峭的峰值和较重的尾部,而低峰度表示分布趋于扁平且尾部较轻。峰度的计算通常相对于正态分布进行比较,正态分布的峰度被定义为3。因此,峰度值大于3表示数据集比正态分布更尖峭,而峰度值小于3表示数据集比正态分布更扁平。
1.5.3 查看预测值的具体频数
## 查看预测值的具体频数
plt.hist(Train_data['price'],orientation='vertical',histtype='bar',color='red')
plt.show()
具体解释如下:
plt.hist
: 这是 Matplotlib 库中的一个函数,用于绘制直方图。Train_data['price']
: 这是你的数据集中的价格数据列,它作为绘制直方图的输入数据。orientation='vertical'
: 这是可选参数,指定了直方图的方向。在这个例子中,直方图是垂直方向的,也就是竖直显示直方条。histtype='bar'
: 这是可选参数,指定了直方图的类型。在这个例子中,使用的是标准的柱状条形图。color='red'
: 这是可选参数,用于指定直方图的颜色。在这个例子中,直方图的颜色被设置为红色。
1.5.3.1 orientation
orientation='vertical'
是一个可选的参数,用于指定直方图的方向。当设置orientation='vertical'
时,直方图将以垂直方向展示,也就是竖直显示直方条。每个直方条的高度表示对应价格范围内的观测值数量或频率。这种方向通常用于显示数值型变量的分布情况,并且在 x 轴上表示不同的价格范围。
相反,如果设置 orientation='horizontal'
,直方图将以水平方向展示,也就是横向显示直方条。每个直方条的宽度表示对应价格范围内的观测值数量或频率。这种方向通常用于显示类别型变量的分布情况,并且在 y 轴上表示不同的价格范围。
1.5.4 log变换
log变换 z之后的分布较均匀,可以进行log变换进行预测,这也是预测问题常用的技巧。
plt.hist(np.log(Train_data['price']),orientation='vertical',histtype='bar',color='red')
plt.show()
1.6 特征分为类别特征和数字特征,并对类别特征查看unique分布
先分离预测值,这个区别方式适用于没有直接label coding的数据,即将分类数据转换为数值编码。这里不适用,需要人为根据实际含义来区分。
数字特征:
numeric_features = Train_data.select_dtypes(include=[np.number])
numeric_features.columns
类型特征:
categorical_features = Train_data.select_dtypes(include=[np.object])
categorical_features.columns
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',]
# 特征nunique分布
for cat_fea in categorical_features:
print(cat_fea+"的特征分布如下:")
unique_values=Train_data[cat_fea].unique()
print("{}特征有个{}不同的值".format(cat_fea,len(unique_values)))
print(Train_data[cat_fea].value_counts())
1.6.1 unique()
unique()
方法是用于获取数组或Series中的唯一值的方法,它返回一个包含所有唯一值的数组。
1.6.2 format()
这个用法在我的另一篇文章里,链接如下:
python 学习中的细枝末节——format函数_岚劲的博客-CSDN博客
1.7 数字特征分析
1.7.1 相关性分析
price_numeric=Train_data[numeric_features]
correlation=price_numeric.corr()
print(correlation['price'].sort_values(ascending=False),'\n')
此代码是想计算Train_data
中数值特征与"price"之间的相关性,并按相关系数的大小进行排序。从Train_data
中选择数值特征保存到price_numeric
变量中。然后,使用corr()
函数计算price_numeric
中各个特征列与"price"之间的相关性矩阵,并将结果保存到correlation
中。最后,通过sort_values()
函数对"price"这一列进行降序排序,并将排序结果保存到sorted_correlation
中。
correlation['price']
:获取 correlation
相关性矩阵中与特征 "price" 相关的那一列。这样可以得到一个包含其他特征与"price"之间相关系数的 Series。
1.7.1.1 corr()
corr()
是 Pandas DataFrame 提供的一个函数,用于计算数据框中各个数值列之间的相关系数。它返回一个相关性矩阵,其中每个元素代表了两个数值列之间的相关性。
在上述代码中,price_numeric
是一个包含数值特征的 DataFrame。通过调用 corr()
函数,可以得到这些数值特征之间的相关性矩阵,并将结果保存在 correlation
变量中。
相关系数反映了两个变量之间的线性关系程度。值的范围在 -1 到 1 之间,其中正值表示正相关,负值表示负相关,0 表示无相关性。
1.7.1.2 sort_values()
sort_values()
是 Pandas 库中的一个函数,用于对 DataFrame 或 Series 进行排序操作。ascending=False
是 sort_values()
函数的一个参数,用于指定排序的顺序。当 ascending=False
时,表示按照降序进行排序,也就是将值从大到小排列。相反,当 ascending=True
时,表示按照升序进行排序,将值从小到大排列(这是默认设置)。
1.7.2 热力图展示相关性
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)
这段代码使用了 Matplotlib 和 Seaborn 库来创建一个热力图,展示数值特征与价格之间的相关性。
1.7.2.1 Figure 对象
Figure 对象 是整个图形窗口的顶级容器,可以看作是一个画布。在一个 Figure 对象上可以包含多个子图(Axes 对象),以及其他一些元素如标题、图例等。创建 Figure 对象的方式是使用 plt.figure()
函数。
1.7.2.2 Axes 对象
Axes 对象 是实际用于绘制数据的对象,可以通过它进行具体的绘图操作,也可以理解为一个子图。在 Axes 对象上可以绘制各种图形、设置坐标轴、添加标签等。
Axes 对象包含了许多方法和属性,可以用来添加图形元素、设置坐标轴、调整图形样式等。通过对 Axes 对象的操作,我们可以实现各种绘图功能,如绘制线条、散点图、柱状图等。
以下是一些常用的 Axes 对象的方法和属性:
plot()
: 绘制线条或数据点。scatter()
: 绘制散点图。bar()
: 绘制柱状图。set_xlabel()
: 设置 x 轴标签。set_ylabel()
: 设置 y 轴标签。set_title()
: 设置图表标题。legend()
: 添加图例。grid()
: 显示网格线。
##例如,我们可以使用 Axes 对象的 plot() 方法绘制一条线条和两个数据点:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
ax.plot(x, y, color='blue', marker='o')
1.7.2.3 plt.subplots()
plt.subplots()
是 Matplotlib 库中的一个函数,用于创建包含一个或多个子图的 Figure 对象和 Axes 对象。
f, ax = plt.subplots(figsize=(7, 7))
这行代码通过 plt.subplots()
函数创建了一个包含一个子图的 Figure 对象和 Axes 对象。将 figsize=(7, 7)
作为参数传递给 plt.subplots()
函数可以设置图形的宽度和高度。即图形的宽度和高度都被设置为 7。
plt.subplots()
函数返回一个元组 (figure, axes)
,其中 figure
是 Figure 对象,axes
是 Axes 对象。可以使用这两个对象进行图形的定制和绘制。
1.7.2.4 figsize=()
figsize=()
是 plt.subplots()
函数中的一个参数,用于设置创建的 Figure 对象的大小。
figsize=(7, 7)
表示创建的 Figure 对象的宽度为 7 英寸,高度也为 7 英寸。 figsize=()
这个参数允许自定义 Figure 对象的尺寸,以便使图形适应你的需求。
在 Matplotlib 中,Figure 对象的大小通常是以英寸为单位进行定义。通过调整 figsize
参数的值,可以控制 Figure 对象的宽度和高度,从而影响图形的整体大小。
1.7.2.5 heatmap()
heatmap()
函数是 Matplotlib 中用于绘制热力图的函数之一。它可以将二维数据以彩色方块的形式展示在一个矩形区域中,用不同的颜色表示数据的大小或数值。heatmap()
函数还支持其他参数,如 vmin
和 vmax
控制热力图颜色映射的取值范围,annot
控制是否在热力图上显示数值标签等。
sns.heatmap(correlation, square=True, vmax=0.8)
这行代码使用 Seaborn 库中的 heatmap()
函数创建了一个热力图。correlation
是包含相关性矩阵的 DataFrame;square=True
表示每个单元格将会是正方形的;vmax=0.8
表示颜色映射的最大值为 0.8。
1.7.3 查看几个特征的偏度和峰值
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())
)
这段代码使用了一个循环来遍历名为 numeric_features
的变量,并打印每个变量的偏度(skewness)和峰度(kurtosis)。
首先使用 format()
函数将变量名进行格式化输出,使用 {:15}
控制输出宽度为 15 个字符,保证每个变量名都占据相同的位置。
然后使用 Train_data[col].skew()
和 Train_data[col].kurt()
分别计算该变量的偏度和峰度,并使用 {:05.2f}
和 {:06.2f}
进行格式化输出。
{:05.2f}
的意思是将一个浮点数值格式化为一个长度为 5 的字符串,其中包括小数点和符号,并保留 2 位小数。如果该浮点数值的宽度不足 5 个字符,则在其左侧使用零进行补齐。例如,对于浮点数值 3.14159
,使用 {:05.2f}
进行格式化,将得到字符串 '03.14'
。
1.7.3.1 {:05.2f}—
格式化输出字符串
具体含义如下:
{}
:表示占位符,用于插入要格式化的值。:
:用于定义格式化选项。05
:表示输出总宽度为 5 个字符(包括小数点和符号),不足部分使用零补齐。.2
:表示保留 2 位小数。f
:表示将值作为浮点数进行格式化。
1.7.4 每个数字特征的分布可视化
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()
函数将 Train_data
数据集进行"融化"操作,将 numeric_features
列表中的多个变量转换为两列:variable
和 value
。其中,value_vars
参数用于指定要融化的变量列表。
接下来,使用 sns.FacetGrid()
函数创建一个网格图形对象 g
,并设置 col
参数为 "variable",即根据变量名称进行分组。其他参数如下:
col_wrap
:定义每行显示的网格数量,这里设置为 2。sharex
和sharey
:设置为 False,表示每个子图的 x 轴和 y 轴不共享。
最后,g.map(sns.distplot, "value")
表示将 sns.distplot()
函数应用到 g
对象中的每个子图上,其中 "value"
是用于绘制直方图的数据列名。
sns.distplot()
函数是 seaborn 库提供的用于绘制直方图和核密度估计(KDE)的函数。它可以帮助我们观察数据的分布情况和密度估计。
1.7.4.1 pd.melt()
函数
pd.melt()
函数接受两个主要参数:要转换的数据集和要转换的变量列表。在这段代码中,Train_data 是要转换的数据集,而 numeric_features 是要转换的数值型特征的变量列表。
上述代码的第一行是使用 pandas 库的 melt 函数将 Train_data 数据集中的数值型特征转换为长格式(long format)的数据表。
通过调用 pd.melt(Train_data, value_vars=numeric_features)
,将 Train_data 中的数值型特征按照列进行“融化”,即将每个特征的列展开为多行,每行包含一个特征的名称、对应的值以及其他与该特征相关的列。
这样转换后的数据表通常更适合进行分析和处理,特别是在需要对多个数值型特征进行比较或聚合分析时。
1.7.4.2 FacetGrid 对象
FacetGrid 是 seaborn 库中的一个对象,用于创建包含多个子图的网格布局。
通过 FacetGrid,可以将数据按照一个或多个变量进行分组,并在网格中的每个子图上绘制不同的数据视图。这种网格的图形布局可以帮助我们更好地比较不同组之间的数据差异、趋势和关系。
使用 FacetGrid 对象有以下几个基本步骤:
- 创建 FacetGrid 对象并指定数据来源。
- 指定用于分组的变量,通常是一个列名。
- 使用
map()
方法来绘制子图,可以是各种 seaborn 的绘图函数(如map(sns.scatterplot, "x", "y")
)或自定义函数。 - 根据需要设置其他参数,如子图的大小、标题、轴标签等。
FacetGrid 可以实现类似于 matplotlib 中的 subplot 功能,但提供了更方便的方法来绘制和组织多个子图。它使得在一个网格中展示不同组的数据变得更加简单和直观。
在上述代码的第二行中,使用 seaborn 库创建了一个 FacetGrid 对象,其中的参数设置如下:
f
:表示数据来源,通常是一个 DataFrame。col="variable"
:表示按照 "variable" 列的值进行分组,每个不同的值将会对应一个子图列。col_wrap=2
:表示每行最多展示两个子图,超过两个会自动换行。sharex=False
:表示子图之间的 x 轴不共享,每个子图有独立的 x 轴刻度和范围。sharey=False
:表示子图之间的 y 轴不共享,每个子图有独立的 y 轴刻度和范围。
通过上述代码,我们创建了一个 FacetGrid 对象 g
,并设置了相应的参数。接下来可以通过 g
对象来绘制具有不同变量分组的子图网格。每个子图列对应一个唯一的 "variable" 值,并且子图中的 x 轴和 y 轴都是独立的,不共享。
1.7.4.2.1 sharex与sharey
sharex=False
和 sharey=False
是 matplotlib 中的两个参数,用于控制子图中各个轴之间是否共享坐标轴。
如果将 sharex
设置为 False,则子图中的 x 轴不会共享。也就是说,每个子图都会有自己独立的 x 轴刻度和范围。
同样地,如果将 sharey
设置为 False,则子图中的 y 轴不会共享。每个子图都会有自己独立的 y 轴刻度和范围。
这两个参数通常在绘制具有不同数据或不同坐标尺度的子图时使用。如果设置为 True(默认值),则所有子图将共享相同的 x 轴或 y 轴,这样可以方便地进行比较和联动。
1.7.5 数字特征相互之间的关系可视化
## 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()
函数来生成这个对象。
在函数中,传入了以下参数:
Train_data[columns]
:指定要绘制关系图的数据,其中Train_data
是一个 DataFrame,columns
是包含要绘制的特征列名的列表。size=2
:指定子图的大小,默认为 2,表示每个子图的高度和宽度都是 2。kind='scatter'
:指定绘图类型为散点图,即根据给定的特征绘制每对特征之间的散点图。diag_kind='kde'
:对角线上的图形类型为核密度估计图,即显示每个特征的单变量分布情况。
最后,通过 plt.show()
方法展示生成的关系图。
1.7.5.1 sns.set()
sns.set()
是 seaborn 库中的一个函数,用于设置绘图的默认配置参数。
当调用 sns.set()
时,它会将 seaborn 库的默认配置应用于后续的绘图操作。这些默认配置包括绘图风格、颜色主题、字体设置等,并且可以帮助我们更好地呈现数据的可视化效果。
通过调用 sns.set()
,我们可以方便地更改 seaborn 绘图的默认样式,而不必在每个绘图函数中单独指定参数。当我们调用其他 seaborn 绘图函数时,它们将自动使用 sns.set()
设置的默认配置。
需要注意的是,在同一个程序中多次调用 sns.set()
会覆盖之前的配置,因此如果需要在绘制不同类型的图时使用不同的配置,可以在每个绘图之前调用 sns.set()
来分别设置。
1.7.5.2 pairplot() 函数
pairplot()
函数是 seaborn 库提供的一个用于绘制多个特征之间关系的图形的函数。
pairplot()
函数可以通过数据集中给定的特征列之间的散点图、直方图或核密度估计图来展示它们之间的关系。函数会将这些图形按照栅格布局的方式排列在一起,以便方便地比较和观察不同特征之间的关联。
调用 pairplot()
函数时,需要传入包含要绘制关系图的数据的 DataFrame 对象,并指定要绘制的特征列名。函数会自动根据给定的特征列生成所有可能的两两组合,并绘制这些组合的图形。
此外,pairplot()
函数还支持通过参数来调整图形的外观,例如设置图形的大小、颜色等。可以通过 Seaborn 库的其他函数和方法来定制绘图的外观,以满足数据可视化的需求。
1.7.5.2.1 pairplot()
函数参数设置
在 seaborn 的 pairplot()
函数中,可以使用参数来设置散点图、直方图或核密度估计图的外观。以下是一些常用的参数和设置方式:
-
示例:kind
参数:用于指定要绘制的图形类型。可以选择'scatter'
(散点图,默认值)、'hist'
(直方图)或'kde'
(核密度估计图)。sns.pairplot(data, kind='hist')
-
示例:diag_kind
参数:用于设置对角线上绘制的图形类型。可以选择'auto'
(自动选择,默认值)、'hist'
(直方图)或'kde'
(核密度估计图)。sns.pairplot(data, diag_kind='kde')
-
示例:plot_kws
参数:用于设置绘图函数的关键字参数。可以通过这个参数传递其他子图的设置,例如设置散点图的颜色、大小等。sns.pairplot(data, plot_kws={'color': 'red', 'alpha': 0.5})
-
示例:diag_kws
参数:用于设置对角线上绘图函数的关键字参数。可以通过这个参数传递其他对角线图形的设置,例如设置直方图的颜色、边界等。sns.pairplot(data, diag_kws={'color': 'blue', 'linewidth': 2})
1.7.6 多变量互相回归关系可视化
## 5) 多变量互相回归关系可视化
fig,((ax1,ax2),(ax3,ax4),(ax5,ax6),(ax7,ax8),(ax9,ax10))=plt.subplots(nrows=5,ncols=2,figsize=(24,20))
# ['v_12', 'v_8' , 'v_0', 'power', 'v_5', 'v_2', 'v_6', 'v_1', 'v_14']
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,color='red',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,color='red',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,color='green',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,color='green',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,color='yellow',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,color='yellow',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,color='green',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,color='green',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,color='red',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,color='red',ax=ax10)
上述代码的第一行是fig
是一个图形对象,代表整个图像。而 (ax1, ax2), (ax3, ax4), (ax5, ax6), (ax7, ax8), (ax9, ax10)
是一个包含多个子图对象的网格结构。在 plt.subplots()
函数中,通过设置 nrows=5
和 ncols=2
,我们创建了一个 5 行 2 列的子图网格。然后,通过多重赋值的方式将每个子图对象分别赋值给 ax1
、ax2
、ax3
、ax4
、ax5
、ax6
、ax7
、ax8
、ax9
和 ax10
这些变量。
1.8 类别特征分析
1.8.1 类别特征箱形图可视化
# 因为 name和 regionCode的类别太稀疏了,这里我们把不稀疏的几类画一下
categorical_features=['name','model','brand','bodyType','fuelType','gearbox','regionCode']
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")
1.8.1.1 astype('category')
astype('category')
是一种将数据类型转换为category
的方法。在这段代码中,它用于将指定的特征列从原始数据类型转换为category
类型。
在Python中,category
数据类型是一种用于表示离散变量的数据类型。与其他数据类型(如字符串或整数)相比,category
类型在存储和计算上具有更高的效率,并且在某些情况下可以提供更好的可读性和内存使用优化。
1.8.1.2 any()
any()
是一个Python内置函数,用于判断给定的可迭代对象中是否存在至少一个为True的元素。
在这段代码中,Train_data[c].isnull().any()
用于检查指定分类特征列c
是否存在缺失值。Train_data[c].isnull()
返回一个布尔型的Series,表示每个元素是否为缺失值,然后any()
函数判断该Series中是否存在至少一个为True的元素,即是否存在缺失值。
如果存在缺失值,则条件表达式if Train_data[c].isnull().any():
为True,执行相应的代码块来处理缺失值;否则,跳过处理步骤。
1.8.1.3 cat.add_categories(['MISSING'])
cat.add_categories(['MISSING'])
是Pandas中Categorical类型的方法之一,用于向Categorical类型的特征中添加新的类别。
具体来说,Train_data[c].cat.add_categories(['MISSING'])
表示对Train_data
数据集中的分类特征列c
进行操作。方法add_categories(['MISSING'])
会将一个名为'MISSING'的新类别添加到c
列中的已有类别中。
这样做的目的是在处理缺失值时,将缺失值视为一个独立的类别,并将其添加到已有类别中。这样,在后续的分析和可视化中,我们可以更好地理解并区分出缺失值的情况。
1.8.1.4 **kwargs
**kwargs
是一个特殊的语法,它允许函数接受任意数量的关键字参数。关键字参数是以键值对的形式传递给函数的额外参数。
在这段代码中,**kwargs
表示可以接受任意数量的关键字参数。这些参数将被传递给sns.boxplot()
函数,以便进行自定义设置。通过将关键字参数传递给sns.boxplot()
,我们可以对箱线图的外观、样式或其他属性进行更精细的控制。