我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文以经典的鸢尾花数据为例,展示dataframe的数据相关性分析功能,也就是说看看各个字段之间相关度有多少。当然,这些相关度的计算,都是基于数字类型的。注意:字符串类型是无法参与相关度计算的。

苏南大叔:以鸢尾花数据集为例,如何分析数据字段的相关性? - 数据相关性
以鸢尾花数据集为例,如何分析数据字段的相关性?(图6-1)

大家好,这里是苏南大叔的“十万个编程为什么”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8pandas@1.1.5

鸢尾花数据源

从以前的文章里面,大家可以知道:鸢尾花数据源实际上有好几个,也有好几个不同的数据格式。而本文的目的是计算字段的相关性,所以对于鸢尾花数据集的不标准性,必然要做出一些调整。这些调整的细节,就要具体看使用的是哪个鸢尾花数据集了。

参考文章:

鸢尾花数据调整

下面的代码,是基于加州大学欧文分校的鸢尾花数据集,

import pandas as pd
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
iris = pd.read_csv(url, header=None)
print(iris.head())
     0    1    2    3            4
0  5.1  3.5  1.4  0.2  Iris-setosa
1  4.9  3.0  1.4  0.2  Iris-setosa
2  4.7  3.2  1.3  0.2  Iris-setosa
3  4.6  3.1  1.5  0.2  Iris-setosa
4  5.0  3.6  1.4  0.2  Iris-setosa

苏南大叔:以鸢尾花数据集为例,如何分析数据字段的相关性? - 原始数据
以鸢尾花数据集为例,如何分析数据字段的相关性?(图6-2)

iris.columns = ['萼长', '萼宽', '瓣长', '瓣宽', '归属']
print(iris.head())
   萼长 萼宽  瓣长 瓣宽         归属
0  5.1  3.5  1.4  0.2  Iris-setosa
1  4.9  3.0  1.4  0.2  Iris-setosa
2  4.7  3.2  1.3  0.2  Iris-setosa
3  4.6  3.1  1.5  0.2  Iris-setosa
4  5.0  3.6  1.4  0.2  Iris-setosa

corr()

【报错】文字类型的字段,是无法参与相关性分析的。

print(iris.corr()) 

报错:

ValueError: could not convert string to float: 'Iris-setosa'

【解决方案】之数据筛选:

iris_part = iris.select_dtypes(include=['float64', 'int64'])
print(iris_part.head())
corr_part = iris_part.corr()
print(corr_part)

输出:

   萼长 萼宽  瓣长 瓣宽
0  5.1  3.5  1.4  0.2
1  4.9  3.0  1.4  0.2
2  4.7  3.2  1.3  0.2
3  4.6  3.1  1.5  0.2
4  5.0  3.6  1.4  0.2

          萼长       萼宽      瓣长      瓣宽
萼长  1.000000 -0.109369  0.871754  0.817954
萼宽 -0.109369  1.000000 -0.420516 -0.356544
瓣长  0.871754 -0.420516  1.000000  0.962757
瓣宽  0.817954 -0.356544  0.962757  1.000000

苏南大叔:以鸢尾花数据集为例,如何分析数据字段的相关性? - 相关性分析
以鸢尾花数据集为例,如何分析数据字段的相关性?(图6-3)

【解决方案】之数据修改:

iris2 = iris.copy()
iris2['归属'] = iris2['归属'].map({'Iris-setosa': 0, 'Iris_versicolor': 1, 'Iris-virginica': 2})
iris2['归属'] = iris2['归属'].astype("Int64")
print(iris2.head())
corr_2 = iris2.corr()
print(corr_2)

输出:

   萼长 萼宽  瓣长 瓣宽  归属
0  5.1  3.5  1.4  0.2   0
1  4.9  3.0  1.4  0.2   0
2  4.7  3.2  1.3  0.2   0
3  4.6  3.1  1.5  0.2   0
4  5.0  3.6  1.4  0.2   0

          萼长       萼宽      瓣长      瓣宽      归属
萼长  1.000000 -0.109369  0.871754  0.817954  0.840970
萼宽 -0.109369  1.000000 -0.420516 -0.356544 -0.536251
瓣长  0.871754 -0.420516  1.000000  0.962757  0.980933
瓣宽  0.817954 -0.356544  0.962757  1.000000  0.974207
归属  0.840970 -0.536251  0.980933  0.974207  1.000000

图形化相关性

如果说上述的相关性数据表格还不够清晰明了的话,还可以使用seaborn的图形进行进一步具象化处理。

import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rc('axes', unicode_minus=False)

plt.figure(figsize=(20,10), dpi=150)
sns.heatmap(corr_part, annot=True, square=True, fmt='.2f')
plt.savefig("part.png")

plt.figure(figsize=(20,10), dpi=150)
sns.heatmap(corr_2, annot=True, square=True, fmt='.2f')
plt.savefig("corr.png")

图形结果如下:

苏南大叔:以鸢尾花数据集为例,如何分析数据字段的相关性? - 相关性图1
以鸢尾花数据集为例,如何分析数据字段的相关性?(图6-4)

苏南大叔:以鸢尾花数据集为例,如何分析数据字段的相关性? - 相关性图2
以鸢尾花数据集为例,如何分析数据字段的相关性?(图6-5)

从图形上可以看到:

颜色越浅,相关系数越高,相关性越强。而黑色的方块显示其相关性最低。

plt画图中文方框的问题,解决方案:

corr()参数

相关度计算,实际上有3种算法。对比3种算法的结果,虽然数值不同,但是趋势是一致的。所以,作为比较为目的的相关性分析来说,使用具体哪种算法,对于实际的效果来说,并没有太大区别。

苏南大叔:以鸢尾花数据集为例,如何分析数据字段的相关性? - 三种相关算法的不同结果
以鸢尾花数据集为例,如何分析数据字段的相关性?(图6-6)

pearson

【默认】是pearson算法。

print(corr_part.corr())
print(corr_part.corr(method = 'pearson'))

输出:

     萼长        萼宽        瓣长        瓣宽
萼长  1.000000 -0.941225  0.975716  0.963204
萼宽 -0.941225  1.000000 -0.992071 -0.994744
瓣长  0.975716 -0.992071  1.000000  0.997991
瓣宽  0.963204 -0.994744  0.997991  1.000000
     萼长        萼宽        瓣长        瓣宽
萼长  1.000000 -0.941225  0.975716  0.963204
萼宽 -0.941225  1.000000 -0.992071 -0.994744
瓣长  0.975716 -0.992071  1.000000  0.997991
瓣宽  0.963204 -0.994744  0.997991  1.000000

spearman

【第二种算法】spearman

print(corr_part.corr(method = 'spearman'))

输出:

     萼长 萼宽  瓣长 瓣宽
萼长  1.0 -0.4  0.4  0.2
萼宽 -0.4  1.0 -1.0 -0.8
瓣长  0.4 -1.0  1.0  0.8
瓣宽  0.2 -0.8  0.8  1.0

kendall

【第三种算法】kendall

print(corr_part.corr(method = 'kendall'))

输出:

          萼长       萼宽      瓣长      瓣宽
萼长  1.000000 -0.333333  0.333333  0.000000
萼宽 -0.333333  1.000000 -1.000000 -0.666667
瓣长  0.333333 -1.000000  1.000000  0.666667
瓣宽  0.000000 -0.666667  0.666667  1.000000

结语

更多机器学习的相关经验文章,可以参考下面的文章链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    机器学习