如何用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
相关产品推荐
相关产品推荐

