numpy.corrcoef() 是否足以找到相关性?

数据挖掘 机器学习 Python 特征选择 麻木的 卡格尔
2022-03-10 14:22:06

我目前正在处理 Kaggle 的泰坦尼克号比赛,并试图弄清楚该Survived专栏与其他专栏之间的相关性。numpy.corrcoef()用来矩阵列之间的相关性,这就是我所拥有的:

The correlation between pClass & Survived is: [[ 1.         -0.33848104]
 [-0.33848104  1.        ]]

The correlation between Sex & Survived is: [[ 1.         -0.54335138]
 [-0.54335138  1.        ]]

The correlation between Age & Survived is:[[ 1.         -0.07065723]
 [-0.07065723  1.        ]]

The correlation between Fare & Survived is: [[1.         0.25730652]
 [0.25730652 1.        ]]

The correlation between Parent-Children & Survived is: [[1.         0.08162941]
 [0.08162941 1.        ]]

The correlation between Sibling-Spouse & Survived is: [[ 1.        -0.0353225]
 [-0.0353225  1.       ]]

The correlation between Embarked & Survived is: [[ 1.         -0.16767531]
 [-0.16767531  1.        ]]

Survived和 [ pClass, sex, ]之间应该有更高的相关性Sibling-Spouse,但值非常低。我是新手,所以我知道一个简单的方法不是找到相关性的最佳方法,但目前,这并没有加起来。

这是我的完整代码(没有printf()调用):

import pandas as pd
import numpy as np

train = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/train.csv")
test = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/test.csv")

survived = train['Survived']
pClass = train['Pclass']
sex = train['Sex'].replace(['female', 'male'], [0, 1])
age = train['Age'].fillna(round(float(np.mean(train['Age'].dropna()))))
fare = train['Fare']
parch = train['Parch']
sibSp = train['SibSp']
embarked = train['Embarked'].replace(['C', 'Q', 'S'], [1, 2, 3])
2个回答

附带说明一下,我认为相关性不是您要使用的正确关系度量,因为从Survived技术上讲,它是一个二元分类变量。

使用的“相关性”措施应取决于所调查变量的类型:

  1. 连续变量 v 连续变量:使用“传统”相关 - 例如 Spearman 等级相关或 Pearson 线性相关。
  2. 连续变量 v 分类变量:使用 ANOVA F 检验/均值差
  3. 分类变量 v 分类变量:使用卡方/克莱默 V

您可能将Women编码为 0,将 men 编码为 1,这就是为什么您会得到 -0.54 的负相关,因为Survived为 No 为 0,Yes 为 1。您的计算实际上显示了您的预期。负相关仅取决于您的编码方向,女性幸存者之间的关系为 0.54。

类似地, pClass与 -0.33 负相关,因为最高类别(第一类)被编码为 1,最低类别为 3,因此方向为负。

如果您为男性和女性创建新列,根据性别在其中放置 0 和 1,则可以使关系更直观,那么相关性将具有直观的方向(符号)。pClass也是如此