关于数据集,我们可以从检查变量之间的相关性开始讲起。
研究数据集以查看哪些变量具有相关性,使我们更好地了解正在处理的数据。这也是培养对数据的兴趣,并建立一些初步问题以尝试回答的好方法。
幸运的是,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查找相关性
让我们看一个更大的数据集,看看使用Python查找相关性有多容易。
我们要看的数据来自Kaggle关于流媒体平台上电影的数据集:https://www.kaggle.com/ruchi798/movies-on-netflix-prime-video-hulu-and-disney。
这个数据集包含哪些电影是什么流媒体平台的数据。它还包括关于每部电影的不同的描述,例如名称、时长、IMDB 分数等。
导入和清理
我们将首先导入数据集并使用pandas将其转换为数据帧。
importpandasaspdmovies=pd.read_csv("MoviesOnStreamingPlatforms_updated.csv")
Rotten Tomatoes列是一个字符串,我们将数据类型更改为float。
movies['RottenTomatoes']=movies['RottenTomatoes'].str.replace("%","").astype(float)
Type列似乎没有正确输入,我们删除它。
movies.drop("Type",inplace=True,axis=1)
使用core方法
使用Pandas 的core方法,我们可以看到数据帧中所有数值列的相关性。因为这是一个方法,我们所要做的就是在DataFrame上调用它。返回值将是一个显示相关性的新数据帧。
corr方法有一个参数,允许你选择计算相关系数的方法。Pearson方法是默认方法,但也可以选择Kendall或Spearman方法。
correlations=movies.corr()print(correlations)\\IDYearIMDbRottenTomatoesNetflix\ID1.000000-0.254391-0.399953-0.201452-0.708680Year-0.2543911.000000-0.021181-0.0571370.258533IMDb-0.399953-0.0211811.0000000.6163200.135105RottenTomatoes-0.201452-0.0571370.6163201.0000000.017842Netflix-0.7086800.2585330.1351050.0178421.000000Hulu-0.2197370.0980090.0421910.020373-0.107911PrimeVideo0.554120-0.253377-0.163447-0.049916-0.757215Disney+0.287011-0.0468190.075895-0.011805-0.088927Runtime-0.2060030.0819840.0889870.0037910.099526HuluPrimeVideoDisney+RuntimeID-0.2197370.5541200.287011-0.206003Year0.098009-0.253377-0.0468190.081984IMDb0.042191-0.1634470.0758950.088987RottenTomatoes0.020373-0.049916-0.0118050.003791Netflix-0.107911-0.757215-0.0889270.099526Hulu1.000000-0.255641-0.0343170.033985PrimeVideo-0.2556411.000000-0.298900-0.067378Disney+-0.034317-0.2989001.000000-0.019976Runtime0.033985-0.067378-0.0199761.000000
哎呀!这是很多数字。输出的列太多,很难读取。这仅仅是9个变量的相关性,结果是一个9x9网格。你能想象20到30列的样子吗?
用Jupyter Notebook输出
我们调用print,让Jupyter Notebook格式化返回值,情况会好一点。
movies.corr()
检查一个变量
还可以通过使用列名进行切片来单独检查每个变量。
print(correlations["Year"])//ID-0.254391Year1.000000IMDb-0.021181RottenTomatoes-0.057137Netflix0.258533Hulu0.098009PrimeVideo-0.253377Disney+-0.046819Runtime0.081984
如果只看1个变量的相关性,这就更容易理解了。但必须有一种更容易查看整个数据集的方法。
Seaborn为拯救而生
幸运的是,seaborn给了我们快速生成热图的能力。
我们只需导入seaborn和matplotlib并使用seaborn的heatmap函数。
#如果使用Jupyter,请始终记住这一行%matplotlibinlineimportseabornassnsimportmatplotlib.pyplotaspltsns.heatmap(correlations)plt.show()
很酷!
我们发现的相关性
现在我们可以很快看到一些相关性;
-
IMDb与Rotten Tomatoes呈强正相关。以及Prime Video和ID之间有很强的正相关;
-
Netflix和Year之间有轻微的正相关;
-
Netflix与ID、Netflix和Prime Video之间存在强负相关;
-
Year与Prime Video、Disney Plus与Prime Video、Hulu与Prime Video、Netflix与ID之间存在轻微负相关;
-
runtime和任何流媒体平台之间没有相关。Netflix和Year之间没有相关。
一些观察
有了这些信息,我们可以做一些观察。
-
ID和它出现的两个平台之间存在很强的正相关和负相关,因此数据是按顺序添加的,先添加Netflix,最后添加Prime Video。如果我们打算使用这些数据来建立一个模型,那么最好在将其分解为测试和训练数据之前对其进行随机化。
-
看起来Netflix有更新的电影。这可能是一个有待探索的假设。
-
与其他流媒体平台相比,Netflix和Amazon似乎拥有最多的电影。这是另一个有待探索的假设。
-
不同的平台似乎不会根据评论家或运行时的评分来选择电影。这是我们可以探索的另一个很酷的假设。
在几秒钟内,我们就可以看到输入数据的相关性,并得到至少3个想法来探索。