如何基于数值显著性水平对DataFrame列排序并筛选Top3列?
如何基于显著性分析筛选用户最相关的Top3功能列
首先咱们得明确核心逻辑:用户对某个功能越相关,对它的评分分布就越不会是“随机散养”的——要么大量给高分(喜欢这个功能),要么大量给低分(对这个功能不满但关注),和整体评分分布的差异会很显著。咱们用卡方拟合优度检验来量化这种差异,再筛选出Top3,具体步骤如下:
1. 先理清楚你的数据逻辑
从你给的表格来看,A列是评分等级(1最低,5最高),B到H是各个功能,每个单元格是给对应功能打该评分的用户数。咱们的目标就是找出哪些功能的评分分布和整体期望分布有显著差异。
2. 选择合适的显著性检验方法
卡方拟合优度检验是最适合的,它能帮我们判断:某个功能的评分分布,是不是和我们假设的“随机/整体平均分布”有统计学上的显著差异。
3. 具体操作步骤(附Python代码)
第一步:整理数据并确定期望分布
我更推荐用所有功能的整体评分分布作为期望(比假设每个评分占比20%更贴合实际用户习惯)。比如先算出所有功能中,打1分、2分...5分的用户总占比,再用这个占比来计算每个功能的期望用户数。
第二步:对每个功能执行卡方检验
直接上代码,你可以直接套用到自己的数据上:
import pandas as pd from scipy.stats import chisquare # 先把你的数据转成DataFrame(如果还没弄好的话) df = pd.DataFrame({ 'A': [5,4,3,2,1], 'B': [61.0,60.0,35.0,17.0,10.0], 'C': [77.0,51.0,32.0,16.0,7.0], 'D': [40.0,49.0,48.0,22.0,11.0], 'E': [46.0,59.0,57.0,12.0,3.0], 'F': [60.0,59.0,43.0,15.0,4.0], 'G': [73.0,67.0,34.0,5.0,5.0], 'H': [66.0,69.0,34.0,5.0,4.0] }) # 把评分等级设为索引,方便按1-5排序 df.set_index('A', inplace=True) # 转置数据,让每一行对应一个功能,列是1-5分的用户数 df_funcs = df.T # 计算整体期望分布:所有功能各评分的总占比 total_all = df.sum().sum() expected_ratios = df.sum() / total_all # 遍历每个功能做卡方检验 results = [] for func_name in df_funcs.index: # 按1-5分排序观察值(确保和期望的顺序一致) observed_counts = df_funcs.loc[func_name].sort_index() # 计算该功能的期望用户数:总用户数 × 整体占比 expected_counts = observed_counts.sum() * expected_ratios.sort_index() # 执行卡方检验 chi2_stat, p_val = chisquare(f_obs=observed_counts, f_exp=expected_counts) # 记录结果:功能名、卡方值、p值、总用户数 results.append({ '功能': func_name, '卡方值': round(chi2_stat, 2), 'p值': round(p_val, 4), '总参与用户数': int(observed_counts.sum()) }) # 把结果转成DataFrame方便查看 results_df = pd.DataFrame(results)
第三步:基于显著性水平筛选相关功能
咱们设定显著性水平α=0.05(行业通用标准):
- 如果某个功能的
p值 < 0.05,说明它的评分分布和整体分布有显著差异,属于用户更相关的功能(用户对它的评价更集中)。 - 如果
p值 >= 0.05,说明评分分布接近随机,用户对这个功能没那么关注。
4. 确定优先级并选出Top3
筛选出显著相关的功能后,按卡方值从大到小排序就行——卡方值越大,说明该功能的评分分布和整体差异越大,用户对它的关注度/倾向性越强。
执行下面的代码就能得到Top3:
# 先筛选出显著相关的功能(p<0.05),再按卡方值降序取前3 top3 = results_df[results_df['p值'] < 0.05].sort_values(by='卡方值', ascending=False).head(3) print("用户最相关的Top3功能:") print(top3)
额外补充:结合评分偏向性优化优先级
如果你还想区分“用户喜欢的功能”和“用户不满但关注的功能”,可以给每个功能加一个加权平均分:
# 计算每个功能的加权平均分(1分权重1,5分权重5) df_funcs['加权平均分'] = (df_funcs[1]*1 + df_funcs[2]*2 + df_funcs[3]*3 + df_funcs[4]*4 + df_funcs[5]*5) / df_funcs.sum(axis=1) # 把加权平均分合并到结果里 results_df = results_df.merge(df_funcs['加权平均分'], left_on='功能', right_index=True)
之后你可以结合卡方值和加权平均分来排序——比如卡方值高且加权平均分高的是用户最喜欢的功能,卡方值高但加权平均分低的是用户吐槽最多的功能。
内容的提问来源于stack exchange,提问作者sargupta
相关产品推荐
相关产品推荐

