Pandas 数据框列的相关性与显著性检验

Pandas 数据框列的相关性与显著性检验

阅读更多:Pandas 教程

在使用pandas包分析数据时,往往会涉及到数据框中不同列之间的相关性研究。具体而言,我们需要知道数据框中各列之间的相关性大小,即它们是否随着对方的变化而变化,以及这种相关性是否具有统计学上的显著性。在本文中,我们将以生物医学数据分析为例,详细介绍这一问题的解决方案。

生物医学数据分析中相关性的研究

生物医学研究中常常需要研究不同指标之间的相关性。比如,我们可能需要研究某种药物的效果与患者的年龄、性别等基本信息之间的相关性;或者需要研究不同患者的某种癌症的发病机制是否有差异。为了方便对这些相关性进行研究,我们通常会将不同指标(也就是数据框中的不同列)放在同一个表格中,并对它们进行相关性分析。

下面,我们以一份来自UCI数据库的乳腺癌诊断数据为例来讲解相关性分析的方法。这份数据共有569个样本,每个样本有30个特征,其中包括了肿块大小、肿块形状、是否有浸润、细胞核大小等多个指标。为了方便观察数据的相关性,我们可以用pandas包将这个数据集读入到一个数据框中:

import pandas as pd

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data"
column_names = ["id", "diagnosis", "mean_radius", "mean_texture", "mean_perimeter", "mean_area", "mean_smoothness", "mean_compactness", "mean_concavity", "mean_concave_points", "mean_symmetry", "mean_fractal_dimension", "se_radius", "se_texture", "se_perimeter", "se_area", "se_smoothness", "se_compactness", "se_concavity", "se_concave_points", "se_symmetry", "se_fractal_dimension", "worst_radius", "worst_texture", "worst_perimeter", "worst_area", "worst_smoothness", "worst_compactness", "worst_concavity", "worst_concave_points", "worst_symmetry", "worst_fractal_dimension"]
data = pd.read_csv(url, names=column_names, header=None)

读取完数据后,我们往往需要对数据做一些简单的清洗工作。比如,对于id这一列,我们可以将它从数据框中删除,因为它对于我们后续的分析没有任何帮助。同时,我们可以将类别(也就是诊断结果)存储在另一个numpy数组中,方便后续的可视化工作。具体代码如下:

import numpy as np

data = data.drop("id", axis=1)

# 创建numpy数组存储诊断结果
target = np.where(data["diagnosis"] == "M", 1, 0)

现在我们已经将数据中的id列删除了,下面我们可以开始考虑列的相关性分析了。

列的相关性与显著性检验

Pandas包提供了corr()函数,用于计算数据框中各列之间的相关性。比如,在乳腺癌数据集中,我们可以用以下代码计算不同指标之间的相关性:

corr_matrix = data.corr()

得到相关矩阵后,我们就可以使用各种可视化工具来展示各列之间的相关性了。这里,我们使用seaborn包中的heatmap函数来可视化相关矩阵:

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=False, cmap=plt.cm.Reds)
plt.title("Correlation Matrix")
plt.show()

可以看出,不同指标之间的相关性大小有巨大的差异。比如,我们可以发现mean_perimeter和mean_area之间的相关性非常高,接近于1;而mean_smoothness和mean_compactness之间的相关性相对较弱,甚至有一些负相关。

有了相关矩阵,我们还可以进一步检验每个相关系数是否具有统计学上的显著性。这里,我们可以使用scipy包中的pearsonr()函数来计算相关系数的p值(显著性水平)。具体代码如下:

from scipy.stats import pearsonr

p_values = []
for i in range(corr_matrix.shape[0]):
    for j in range(i+1, corr_matrix.shape[1]):
        corr, p = pearsonr(data.iloc[:, i], data.iloc[:, j])
        p_values.append(p)

rejected, p_adjusted = multipletests(p_values, method="bonferroni")[:2]

上述代码中,我们首先以0.05的显著性水平使用pearsonr()函数计算了每对列之间的相关系数及其p值;然后,我们使用multipletests()函数对这些p值进行了多重比较校正(采用Bonferroni校正方法)。最终,我们得到了每个相关系数是否具有显著性的结果。

最后,我们可以将相关系数和其对应的显著性结果整理成一个数据框,方便后续的分析和可视化:

result = pd.DataFrame({"col1": [], "col2": [], "corr": [], "p": [], "significant": []})
idx = 0
for i in range(corr_matrix.shape[0]):
    for j in range(i+1, corr_matrix.shape[1]):
        result.loc[idx] = [data.columns[i], data.columns[j], corr_matrix.iloc[i][j], p_adjusted[idx], rejected[idx]]
        idx += 1

最终,我们得到了一个数据框,它记录了每对列之间的相关系数、p值以及是否具有显著性。有了这份数据,我们可以通过不同的筛选和排序方式来挖掘不同列的相关性信息,为进一步的数据分析提供有力的支持。

总结

在本文中,我们以生物医学数据分析为例,详细介绍了如何使用pandas包来分析数据框中列之间的相关性及其显著性。具体而言,我们使用了corr()函数来计算相关矩阵,并使用heatmap函数来可视化相关性;同时,我们还使用pearsonr()函数来计算各个相关系数的p值,并对其进行了多重比较校正。通过这些分析,我们可以深入了解数据中各个指标之间的关系,为后续的数据分析提供更加可靠、有益的信息。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程