磐创AI分享
作者 | Jeremiah Lutes
编译 | VK
来源 | Towards Data Science
数据集可以讲许多故事。作为一个很好的开始,可以检查变量之间的相关性。
研究数据集以查看哪些变量具有相关性时,这是我首先执行的任务之一。这使我更好地了解我正在处理的数据。这也是培养对数据的兴趣并建立一些初步问题以尝试回答的好方法。
幸运的是,Python有一些库,这些库为我们提供了快速有效地查看相关性所需的工具。让我们简单看看什么是相关性,以及如何使用热图在数据集中找到强相关性。
相关性是确定数据集中的两个变量是否以任何方式相关的一种方法。
相关有许多实际应用。我们可以看到使用某些搜索词是否与youtube上的浏览量相关。或者,我们可以看看广告是否与销售额相关。在建立机器学习模型时,相关性是决定特征的一个重要因素。这不仅可以帮助我们了解哪些特征是线性相关的,而且如果特征是强相关的,我们可以删除它们以防止重复信息。
在数据科学中,我们可以使用r值,也称为皮尔逊相关系数。它测量两个数字序列(即列、列表、序列等)之间的相关程度。
r值是介于-1和1之间的数字。它告诉我们两列是正相关,不相关,还是负相关。越接近1,正相关越强。越接近-1,负相关越强(即列越“相反”)。越接近0,相关性越弱。
R值公式为:
我们不打算解释r值背后的数学原理,但如果你好奇的话,这段youtube视频做得很好。相反,让我们用一个简单的数据集来可视化相关性:https://youtu.be/lVOzlHx_15s
下面的数据集显示了七个子数据。它有以下列,体重,年龄(以月为单位),乳牙的数量,和眼睛的颜色。眼睛颜色列已经分类,其中1=蓝色,2=绿色,3=棕色。
让我们用上面的数据做三个散点图。我们来看看以下三种关系:年龄和体重,年龄和乳牙,年龄和眼睛颜色。
当我们观察年龄和体重之间的关系时,绘图点开始形成一个正斜率。当我们计算r值时,我们得到0.954491。当r值接近1时,我们可以得出年龄和体重有很强的正相关的结论。直觉上应该看看。在一个成长中的孩子,随着年龄的增长,体重开始增加。
反之,绘图点上的年龄和乳牙散点图开始形成负斜率。这种相关性的r值为-0.958188。这意味着强烈的负相关。直觉上,这也是有道理的。当孩子长大后,他们会失去乳牙。
在最后一个散点图上,我们看到一些没有明显坡度的点。这种相关性的r值为-0.126163。年龄与眼睛颜色无显著相关。这也应该是有道理的,因为眼睛的颜色不应该随着孩子年龄的增长而改变。如果这种关系显示出很强的相关性,我们需要检查数据以找出原因。
让我们看一个更大的数据集,看看使用Python查找相关性有多容易。
我们要看的数据来自Kaggle关于流媒体平台上电影的数据集:https://www.kaggle.com/ruchi798/movies-on-netflix-prime-video-hulu-and-disney。
这个数据集包含哪些电影是什么流媒体平台的数据。它还包括关于每部电影的一些不同的描述,例如名称、时长、IMDB 分数等。
我们将首先导入数据集并使用pandas将其转换为数据帧。
import pandas as pd
movies = pd.read_csv("MoviesOnStreamingPlatforms_updated.csv")
Rotten Tomatoes列是一个字符串,让我们将数据类型更改为float。
movies['Rotten Tomatoes'] =
movies['Rotten Tomatoes'].str.replace("%" , "").astype(float)
Type列似乎没有正确输入,让我们删除它。
movies.drop("Type", inplace=True, axis=1)
好吧,现在开始有趣的事情吧!
使用Pandas 的core方法,我们可以看到数据帧中所有数值列的相关性。因为这是一个方法,我们所要做的就是在DataFrame上调用它。返回值将是一个显示相关性的新数据帧。
corr方法有一个参数,允许你选择计算相关系数的方法。Pearson方法是默认方法,但也可以选择Kendall或Spearman方法。
correlations = movies.corr()
print(correlations)
\\
ID Year IMDb Rotten Tomatoes Netflix \
ID 1.000000 -0.254391 -0.399953 -0.201452 -0.708680
Year -0.254391 1.000000 -0.021181 -0.057137 0.258533
IMDb -0.399953 -0.021181 1.000000 0.616320 0.135105
Rotten Tomatoes -0.201452 -0.057137 0.616320 1.000000 0.017842
Netflix -0.708680 0.258533 0.135105 0.017842 1.000000
Hulu -0.219737 0.098009 0.042191 0.020373 -0.107911
Prime Video 0.554120 -0.253377 -0.163447 -0.049916 -0.757215
Disney+ 0.287011 -0.046819 0.075895 -0.011805 -0.088927
Runtime -0.206003 0.081984 0.088987 0.003791 0.099526
Hulu Prime Video Disney+ Runtime
ID -0.219737 0.554120 0.287011 -0.206003
Year 0.098009 -0.253377 -0.046819 0.081984
IMDb 0.042191 -0.163447 0.075895 0.088987
Rotten Tomatoes 0.020373 -0.049916 -0.011805 0.003791
Netflix -0.107911 -0.757215 -0.088927 0.099526
Hulu 1.000000 -0.255641 -0.034317 0.033985
Prime Video -0.255641 1.000000 -0.298900 -0.067378
Disney+ -0.034317 -0.298900 1.000000 -0.019976
Runtime 0.033985 -0.067378 -0.019976 1.000000
哎呀!这是很多数字。输出的列太多,很难读取。这仅仅是9个变量的相关性,结果是一个9x9网格。你能想象20到30列的样子吗?这将是非常困难的。
我们调用print,让Jupyter Notebook格式化返回值,情况会好一点。
movies.corr()
我们还可以通过使用列名进行切片来单独检查每个变量。
print(correlations["Year"])
//
ID -0.254391
Year 1.000000
IMDb -0.021181
Rotten Tomatoes -0.057137
Netflix 0.258533
Hulu 0.098009
Prime Video -0.253377
Disney+ -0.046819
Runtime 0.081984
如果只看1个变量的相关性,这就更容易理解了。但必须有一种更容易查看整个数据集的方法。
幸运的是,seaborn给了我们快速生成热图的能力。
我们只需导入seaborn和matplotlib并使用seaborn的heatmap函数。
# 如果使用Jupyter,请始终记住这一行
%matplotlib inline
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(correlations)
plt.show()
哇!很酷
现在我们可以很快看到一些相关性;
有了这些信息,我们可以做一些观察。
在几秒钟内,我们就可以看到输入数据的相关性,并得到至少3个想法来探索。
相关性有助于探索新的数据集。通过使用seaborn的热图,我们很容易看到最强的相关性在哪里。现在你可以去Kaggle看看更多的数据集,看看还有什么相关可以激发你的兴趣!