如何比较单列数据集内分类变量各水平的频率?
单列分类变量各水平频率比较方法
针对包含a、b、c、d、e五个水平的单列分类变量,你可以通过描述性统计、可视化、统计检验三个维度来比较各水平的频率,具体方法如下:
1. 计算频率/占比(描述性统计)
先直接计算每个水平的绝对频数和相对频率,这是最基础的对比步骤:
R 实现
# 假设你的数据框是df,分类列名为cat_col freq_table <- table(df$cat_col) # 计算各水平绝对出现次数 prop_table <- prop.table(freq_table) * 100 # 转换为百分比占比 print(freq_table) print(prop_table)
运行后可直接对比各水平的数值差异。
Python 实现
import pandas as pd # 假设数据框是df,分类列名为cat_col freq_table = df['cat_col'].value_counts() # 绝对频数 prop_table = df['cat_col'].value_counts(normalize=True) * 100 # 百分比占比 print(freq_table) print(prop_table)
2. 可视化对比
用图表直观展示频率差异,比数值更清晰:
R 实现(条形图)
# 展示频数分布 barplot(freq_table, main = "各水平频数分布", xlab = "分类水平", ylab = "频数") # 展示占比分布 barplot(prop_table, main = "各水平占比分布", xlab = "分类水平", ylab = "占比(%)")
Python 实现(seaborn条形图)
import seaborn as sns import matplotlib.pyplot as plt # 频数分布 sns.countplot(x='cat_col', data=df) plt.title('各水平频数分布') plt.xlabel('分类水平') plt.ylabel('频数') plt.show() # 占比分布 df['prop'] = df['cat_col'].map(df['cat_col'].value_counts(normalize=True)*100) sns.barplot(x='cat_col', y='prop', data=df, ci=None) plt.title('各水平占比分布') plt.ylabel('占比(%)') plt.show()
3. 统计检验(判断差异是否显著)
如果需要验证各水平的频率是否存在统计学意义上的显著差异,可以用卡方拟合优度检验:
R 实现
# 原假设:各水平频率相等(每个水平理论占比20%) chisq_result <- chisq.test(freq_table) print(chisq_result)
若输出的p值小于0.05,则拒绝原假设,说明各水平频率存在显著差异。
Python 实现
from scipy.stats import chisquare # 计算理论频数:假设各水平频率相等,总样本数除以5 total = len(df) expected = [total/5]*5 chisq_result = chisquare(freq_table, f_exp=expected) print(chisq_result)
同样,p值<0.05时,可认为各水平频率差异显著。
内容的提问来源于stack exchange,提问作者learningr
相关产品推荐
相关产品推荐

