按类别计算比例并使用ggplot绘制直方图的高效实现方法
高效计算多分类变量分组比例并生成直方图的方案
核心思路:数据长格式重塑 + 批量分组聚合
手动逐个处理hma*_binary变量效率极低,核心优化点是先把宽格式的hma变量转成长格式,之后用批量分组聚合完成所有比例计算,全程无需重复写单个变量的处理代码。
步骤1:数据格式转换(宽转长)
用pandas.melt把多个hma*_binary列合并为两列:一列记录变量名(如hma1_binary),一列记录对应的值(0/1)。这样所有hma变量可以统一处理。
import pandas as pd # 假设原数据集名为df melted_df = pd.melt(df, id_vars=['race', 'parent_welfare'], # 保留的分组变量 value_vars=['hma1_binary', 'hma2_binary', 'hma3_binary', 'hma4_binary'], # 需要处理的hma变量 var_name='hma_variable', # 新的变量名列名 value_name='binary_value') # 新的二进制值列名
步骤2:批量计算比例
2.1 计算各hma变量的整体比例
直接对长格式数据按hma_variable分组,取binary_value的均值(二进制变量的均值就是1的占比):
overall_proportions = melted_df.groupby('hma_variable')['binary_value'].mean().reset_index() overall_proportions.rename(columns={'binary_value': 'overall_ratio'}, inplace=True)
2.2 按分类变量子组拆分计算比例
可以同时按hma_variable和目标分组变量(如race或parent_welfare)分组,批量生成子组比例:
# 按race分组的比例 race_grouped_proportions = melted_df.groupby(['hma_variable', 'race'])['binary_value'].mean().reset_index() race_grouped_proportions.rename(columns={'binary_value': 'race_group_ratio'}, inplace=True) # 按parent_welfare分组的比例 welfare_grouped_proportions = melted_df.groupby(['hma_variable', 'parent_welfare'])['binary_value'].mean().reset_index() welfare_grouped_proportions.rename(columns={'binary_value': 'welfare_group_ratio'}, inplace=True)
2.3 合并为理想结果数据框
如果需要把整体比例和各子组比例合并到同一个数据框,用merge即可:
# 先合并整体比例和race分组比例 final_df = pd.merge(overall_proportions, race_grouped_proportions, on='hma_variable') # 再合并parent_welfare分组比例 final_df = pd.merge(final_df, welfare_grouped_proportions, on=['hma_variable', 'race']) # 按需调整合并键
理想结果数据框结构示例:
| hma_variable | overall_ratio | race | race_group_ratio | parent_welfare | welfare_group_ratio |
|---|---|---|---|---|---|
| hma1_binary | 0.35 | 白种人 | 0.42 | 是 | 0.51 |
| hma1_binary | 0.35 | 黑种人 | 0.28 | 是 | 0.47 |
| hma2_binary | 0.62 | 白种人 | 0.68 | 否 | 0.59 |
步骤3:批量生成直方图
用seaborn.catplot可以基于长格式数据快速生成分组直方图,无需逐个变量绘图:
import seaborn as sns import matplotlib.pyplot as plt # 按race分组的hma变量比例直方图 sns.catplot(data=race_grouped_proportions, x='hma_variable', y='race_group_ratio', hue='race', kind='bar', palette='Set2') plt.title('HMA变量比例按种族分组') plt.ylabel('比例') plt.xlabel('HMA变量') plt.show() # 按parent_welfare分组的直方图同理,替换hue参数即可
内容的提问来源于stack exchange,提问作者a_todd12
相关产品推荐
相关产品推荐

