You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按类别计算比例并使用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_variableoverall_ratioracerace_group_ratioparent_welfarewelfare_group_ratio
hma1_binary0.35白种人0.42是0.51
hma1_binary0.35黑种人0.28是0.47
hma2_binary0.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:07:14