如何用Pandas、Scipy分析DataFrame同列分类变量的关联及统计显著性
报错原因说明
- 第一次报错:你筛选得到的
pageviews和clicks是两个独立的子DataFrame,行数、索引都不匹配,无法逐行对应计算相关性 - 第二次报错:
corr()方法需要传入两个数值型序列作为计算对象,你直接传入分类字符串类型的event列,且只传了一个参数,不符合方法要求
分析前置步骤:数据格式转换
你的原始表是每行对应一条事件记录的长表,要计算两种事件的关联,需要先按观测维度(比如链接url、会话id、用户id,根据你的分析场景选择)聚合为宽表,每个观测单元对应一行,不同事件的发生次数作为单独列:
import pandas as pd import numpy as np from scipy import stats # 示例按链接url分组,统计每个url下三类事件的发生次数,可替换为你实际的分组字段 event_count = df.groupby(['url', 'event']).size().unstack(fill_value=0).reset_index() # 输出的event_count包含字段:url、click、pageview、preview,每一行对应一个链接的三类事件计数
线性相关性检验(皮尔逊相关)
适合分析click和preview的发生次数之间的线性关联,同时输出相关系数和统计显著性:
# 计算click与preview的皮尔逊相关 pearson_corr, pearson_p = stats.pearsonr(event_count['click'], event_count['preview']) print(f"皮尔逊相关系数:{pearson_corr:.4f},显著性p值:{pearson_p:.4f}") # 如需计算click和pageview的相关,替换上述代码中的preview为pageview即可
结果解读:
- 相关系数范围为[-1,1],绝对值越大线性相关性越强,正负号代表相关方向
- p值<0.05时可认为相关性具备统计显著性
二元关联检验(卡方检验+phi效应量)
适合分析“是否发生click”和“是否发生preview”两个二分类变量的关联:
# 将计数转换为二值标识:1=发生过该事件,0=未发生 event_count['has_click'] = (event_count['click'] > 0).astype(int) event_count['has_preview'] = (event_count['preview'] > 0).astype(int) # 生成混淆矩阵 confusion_matrix = pd.crosstab(event_count['has_click'], event_count['has_preview']) # 卡方检验 chi2, p_value, dof, expected = stats.chi2_contingency(confusion_matrix) # 计算phi系数(2x2混淆矩阵的效应量指标) n = confusion_matrix.sum().sum() phi_coef = np.sqrt(chi2 / n) print(f"卡方值:{chi2:.4f},显著性p值:{p_value:.4f},phi效应量:{phi_coef:.4f}")
结果解读:
- p值<0.05时可认为两个二分类变量存在显著关联
- phi系数绝对值越大关联效应越强,通常0.1为小效应,0.3为中等效应,0.5为大效应
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

