如何通过SAS按通过状态分组统计各分数区间成绩占比
SAS按及格/不及格分组计算分数区间占比实现方案
整体逻辑很简单:先定义你需要的分数分段规则,再按Pass_Fail_Result分组统计组内各分段的占比即可,不需要复杂计算。
1. 准备数据集
如果是用你提供的示例数据,直接运行下面的代码建数据集就行;如果已经有现成的数据集,跳过这步,把后续代码里的score_data替换成你自己的数据集名。
data score_data; input Score Pass_Fail_Result; datalines; 405 0 410 0 430 0 520 1 550 0 630 0 710 1 720 1 ; run;
2. 自定义分数区间
用SAS的格式过程自定义分段规则,你可以根据业务需求随便改区间断点,比如你提到的504-560区间,直接在下面的代码里调整数值范围就行:
proc format; value score_segment 0-<504 = '504分以下' 504-<560 = '504-559分' 560-<640 = '560-639分' 640-high = '640分及以上' ; run;
3. 分组统计占比
用freq过程步直接算组内占比,不需要手动算频数除总数:
proc freq data=score_data; /* 按Pass_Fail_Result分组,统计Score分布 */ tables Pass_Fail_Result * Score / norow nocol nopercent /* 关掉不需要的冗余统计值 */ rowpct /* 核心参数:计算每个Pass_Fail_Result组内的行百分比,就是你要的组内占比 */ out=stat_result(keep=Pass_Fail_Result Score COUNT ROW_PCT); /* 把统计结果存到数据集方便后续复用 */ /* 给分数套用之前定义的区间规则 */ format Score score_segment.; run;
结果解读
运行后输出的交叉表完全匹配你要的展示效果:
- 行维度是Pass_Fail_Result的取值(0=不及格,1=及格)
- 列维度是你定义的各个分数区间
- 单元格内的
Row Pct就是对应占比:比如用示例数据运行后,Pass_Fail_Result=1(及格)的分组里,33.33%的分数落在504-559区间,66.67%落在640分及以上区间,直接读就可以。
如果你需要把结果拼成“pass=1的成绩中,有X%的分数处于XX区间”这类自然语言,直接基于输出的stat_result数据集做文本拼接就行,不需要额外统计。
内容的提问来源于stack exchange,提问作者NewbieCode
相关产品推荐
相关产品推荐

