You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python分析数值与非数值数据的相关性?含PhD场景示例

解决方法:分析二分分类变量与有序数值变量的相关性

咱们先明确你的变量类型:

  • Neural Networks familiarity level:是有序数值变量(1-3,有明确的高低顺序)
  • 是否为PhD:是二分分类变量(只有两个类别:PhD / Ms)

你之前用的pearsonr()和.corr()(默认Pearson)更适合两个连续数值变量的线性相关分析,放在这个场景里并不合适——因为Pearson会对分类变量的人为编码(比如把PhD设为1、Ms设为0)过于敏感,而且没法体现有序变量的秩次特性。下面是几个更适合的方法:


1. 点二列相关(Point-Biserial Correlation)

这是专门用于一个二分分类变量 + 一个连续/有序数值变量的相关分析方法,能直接给出两者的相关系数和显著性水平。

代码示例(Python):

import pandas as pd
from scipy.stats import pointbiserialr

# 构建你的数据集
data = {
    'University': ['Virginia', 'Bloomington', 'Toronto', 'Waterloo', 'Germany', 'Nigeria'],
    'Degree Type': ['PhD', 'PhD', 'PhD', 'Ms', 'Ms', 'Ms'],
    'Neural Networks familiarity level': [2, 3, 2, 1, 1, 2]
}
df = pd.DataFrame(data)

# 将Degree Type转为二分变量:PhD=1,Ms=0
df['is_phd'] = df['Degree Type'].map({'PhD': 1, 'Ms': 0})

# 计算点二列相关
corr_coef, p_value = pointbiserialr(df['is_phd'], df['Neural Networks familiarity level'])
print(f"点二列相关系数: {corr_coef:.3f}, p值: {p_value:.3f}")

结果解读:

  • 相关系数范围是[-1,1],绝对值越大表示相关性越强;正数表示PhD群体的熟悉度更高,负数则相反。
  • p值小于0.05时,说明相关性具有统计学显著性。

2. Spearman秩相关(Spearman's Rank Correlation)

Spearman关注的是变量的**秩次(排序)**而非实际数值,非常适合有序变量和分类变量的组合分析——它不需要假设数据服从正态分布,鲁棒性更强。

代码示例(Python):

from scipy.stats import spearmanr

# 手动指定秩次:PhD的秩为2,Ms的秩为1(体现学位的高低顺序)
df['degree_rank'] = df['Degree Type'].map({'PhD': 2, 'Ms': 1})

# 计算Spearman秩相关
spearman_corr, spearman_p = spearmanr(df['degree_rank'], df['Neural Networks familiarity level'])
print(f"Spearman秩相关系数: {spearman_corr:.3f}, p值: {spearman_p:.3f}")

结果解读:

  • 相关系数同样在[-1,1]之间,反映的是两个变量秩次的单调相关性:比如正相关表示学位越高(PhD),熟悉度的秩次也越高。

3. 补充:Mann-Whitney U检验(差异检验)

如果你更关注PhD和Ms群体的熟悉度是否存在显著差异(间接反映相关性),可以用Mann-Whitney U检验——这是针对有序数据的非参数检验,替代t检验(因为你的样本量很小,且不满足正态分布假设)。

代码示例(Python):

from scipy.stats import mannwhitneyu

# 拆分两组数据
phd_familiarity = df[df['Degree Type'] == 'PhD']['Neural Networks familiarity level']
ms_familiarity = df[df['Degree Type'] == 'Ms']['Neural Networks familiarity level']

# 执行Mann-Whitney U检验
u_stat, mw_p = mannwhitneyu(phd_familiarity, ms_familiarity, alternative='two-sided')
print(f"Mann-Whitney U统计量: {u_stat}, p值: {mw_p:.3f}")

结果解读:

  • p值小于0.05时,说明两组的熟悉度分布存在显著差异,间接说明学位类型和熟悉度存在关联。

总结建议

  • 如果想直接得到相关性系数,优先选点二列相关(适合二分+有序/连续)或Spearman秩相关(更适合有序变量的秩次关联)。
  • 如果样本量很小(像你的数据只有6条),结果的统计学显著性可能不足,建议尽量扩充样本量来提升结论的可靠性。

内容的提问来源于stack exchange,提问作者buddingengineer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:03:48