Pandas按model分组执行Tukey HSD检验并导出CSV结果
Pandas分组执行Tukey HSD检验实现
核心解决点
- 修复原循环逻辑未传入对应model子集的问题:通过
groupby遍历直接获取每个model对应的子集数据传入检验函数 - 实现多组检验结果合并:用列表暂存每个分组的结构化检验结果,最后一次性拼接导出
- 内置字段校验逻辑,避免空值、分组数不足导致的运行报错
依赖安装
执行代码前先安装需要的第三方库:
pip install pandas statsmodels
完整可运行代码(带详细注释)
import pandas as pd from statsmodels.stats.multicomp import pairwise_tukeyhsd # ---------------------- # 数据读取部分,替换为你自己的数据集路径即可 # ---------------------- # 读入csv数据集,如果是excel格式换成pd.read_excel即可 df = pd.read_csv("your_car_dataset_path.csv") # 预处理:把气缸数字段转为字符串类型,避免数值型分组识别错误 df["No_of_cylinders"] = df["No_of_cylinders"].astype(str) # 剔除关键字段为空的无效行,避免检验报错 df = df.dropna(subset=["mpg", "No_of_cylinders", "model"]) # ---------------------- # 按model分组循环执行Tukey检验 # ---------------------- # 初始化空列表,存储每个model的检验结果 result_container = [] # 遍历所有model分组,group_name是当前model名称,group_data是对应model的子集数据 for model_name, group_data in df.groupby("model"): # 校验当前model下的气缸类别数,不足2组无法做多重比较直接跳过 valid_cylinder_groups = group_data["No_of_cylinders"].nunique() if valid_cylinder_groups < 2: print(f"model {model_name} 下气缸类别不足2组,跳过检验") continue # 传入当前model的子集执行Tukey HSD检验 tukey_output = pairwise_tukeyhsd( endog=group_data["mpg"], # 待检验的连续指标:油耗mpg groups=group_data["No_of_cylinders"], # 分组维度:气缸数 alpha=0.05 # 显著性水平取常规0.05 ) # 把statsmodels输出的结果对象转为结构化DataFrame # 跳过结果表的表头行取实际数据,用内置表头做DataFrame列名 group_result_df = pd.DataFrame( data=tukey_output._results_table.data[1:], columns=tukey_output._results_table.data[0] ) # 新增列标记当前结果对应的model名称 group_result_df["model"] = model_name # 将当前model的结果存入暂存列表 result_container.append(group_result_df) # ---------------------- # 结果合并与导出 # ---------------------- # 拼接所有model的检验结果 final_result = pd.concat(result_container, ignore_index=True) # 调整列顺序,把model字段放到最左侧方便查看 col_order = ["model"] + [col for col in final_result.columns if col != "model"] final_result = final_result[col_order] # 导出为CSV文件,用utf-8-sig编码避免中文乱码,不导出行索引 final_result.to_csv("all_model_tukey_hsd_result.csv", index=False, encoding="utf-8-sig") print(f"检验完成,共导出{len(result_container)}个model的检验结果")
输出结果字段说明
model:当前对比结果对应的车型型号group1/group2:参与对比的两组气缸数meandiff:两组mpg的均值差值p-adj:经多重比较校正后的p值,p<0.05代表两组油耗差异存在统计学显著性lower/upper:均值差的95%置信区间上下限reject:是否拒绝“两组无差异”的原假设,值为True代表两组油耗差异显著
内容的提问来源于stack exchange,提问作者RayX500
相关产品推荐
相关产品推荐

