如何可视化30岁以下糖尿病数据集的类别频率差异及不平衡情况
问题根因
你当前用的散点图将离散的Outcome(仅0/1两个取值)作为Y轴,大量样本点重叠堆叠,完全无法体现两类样本的数量差异。可以用以下几种绘图方式优化:
方案1:类别计数柱状图(最直观体现不平衡)
直接统计30岁以下人群两类Outcome的总数量绘图,一眼就能看出数量差距:
import seaborn as sns import matplotlib.pyplot as plt # 先筛选30岁以下的全量数据,不需要分开取两列,运行效率更高 under30_data = data[data['Age'] < 30] # 统计Outcome的计数 sns.countplot(x='Outcome', data=under30_data) plt.xticks([0,1], ['未患病', '患病']) plt.ylabel('样本数量') plt.title('30岁以下人群糖尿病患病情况统计') # 可选:在柱子上标注具体数值 for p in plt.gca().patches: plt.gca().text(p.get_x() + p.get_width()/2, p.get_height(), int(p.get_height()), ha='center', va='bottom') plt.show()
绘制后就能直接看到312(未患病)和84(患病)的数量差,不平衡特征非常清晰。
方案2:分年龄分组柱状图(同时看年龄和患病率的关联)
如果还需要观测不同年龄下的患病分布,可以按年龄分组统计两类的数量:
under30_data = data[data['Age'] < 30] sns.countplot(x='Age', hue='Outcome', data=under30_data) plt.xlabel('年龄') plt.ylabel('样本数量') plt.legend(title='是否患病', labels=['未患病', '患病']) plt.title('30岁以下各年龄糖尿病患病分布') plt.show()
这个图既可以看到每个年龄下患病/未患病的数量差异,也能整体看出全年龄段的类别不平衡。
方案3:占比饼图(直观体现占比差异)
如果想突出两类的占比差距,用饼图更合适:
under30_data = data[data['Age'] < 30] outcome_counts = under30_data['Outcome'].value_counts() plt.pie(outcome_counts, labels=['未患病', '患病'], autopct='%.1f%%') plt.title('30岁以下人群糖尿病患病占比') plt.show()
绘制后可以直接看到未患病占比约78.8%,患病仅21.2%,不平衡特征一目了然。
内容的提问来源于stack exchange,提问作者Py_Student
相关产品推荐
相关产品推荐

