以鸢尾花数据集为例,如何分析数据字段的相关性?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文以经典的鸢尾花数据为例,展示dataframe
的数据相关性分析功能,也就是说看看各个字段之间相关度有多少。当然,这些相关度的计算,都是基于数字类型的。注意:字符串类型是无法参与相关度计算的。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.6.8
,pandas@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
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
【解决方案】之数据修改:
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")
图形结果如下:
从图形上可以看到:
颜色越浅,相关系数越高,相关性越强。而黑色的方块显示其相关性最低。
plt
画图中文方框的问题,解决方案:
corr()
参数
相关度计算,实际上有3种算法。对比3种算法的结果,虽然数值不同,但是趋势是一致的。所以,作为比较为目的的相关性分析来说,使用具体哪种算法,对于实际的效果来说,并没有太大区别。
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
结语
更多机器学习的相关经验文章,可以参考下面的文章链接:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。