如何用Scipy和Pandas检验同列pageview与click的线性/分类/二元关系
检验同列下pageview和click事件相关性的实现方案
你之前的写法报错是因为corr()用于计算数据框列与列之间的相关性,而你筛选得到的pageviews和clicks是两个行子集,长度、索引都无法对齐,自然无法计算,你需要先重构数据结构再做分析。
第一步:重构数据格式
首先将长格式数据表转换为宽格式,让pageview和click作为独立列,每行对应同一个关联对象(示例以link_id即链接唯一标识为分组依据,你可以根据业务逻辑替换为会话ID、用户ID等分组字段):
# 统计每个link_id下的pageview和click发生次数,无发生则填充0 event_count = df.groupby(['link_id', 'event']).size().unstack(fill_value=0)
运行后得到的event_count会包含pageview和click两个数值列,每行对应一个链接的两个事件的发生次数。
第二步:检验线性相关关系
如果要验证「浏览量越高的链接,点击量是否越高」的线性关联,可使用皮尔逊相关检验,同时得到相关系数(效应量)和显著性p值:
import scipy.stats as stats # corr为相关系数,p_value为显著性值 corr, p_value = stats.pearsonr(event_count['pageview'], event_count['click'])
结果解读:
- 相关系数绝对值在0.1、0.3、0.5附近分别对应小、中、大效应量,数值正负代表正/负相关
- p值小于0.05即可认为相关性统计上显著
第三步:检验二元分类关联
如果要验证「是否有浏览」和「是否有点击」的二分类关联,可先将数值转换为二元标识,再用卡方检验+phi系数计算显著性和效应量:
# 转换为二元变量:1=发生过该事件,0=未发生 event_binary = event_count.applymap(lambda x: 1 if x > 0 else 0) # 构建列联表 contingency_table = pd.crosstab(event_binary['pageview'], event_binary['click']) # 卡方检验 chi2, p, dof, expected = stats.chi2_contingency(contingency_table, correction=False) # 计算2*2列联表的效应量phi系数 phi = (chi2 / len(event_binary)) ** 0.5
结果解读:
- p值小于0.05即可认为两个二元事件存在统计上显著的关联
- phi系数的效应量解读逻辑和皮尔逊相关系数一致
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

