学生抑郁情况可视化分析及预测

1. 导包

日常导包
根据工具包可以看出使用的是seaborn和matplotlib进行可视化分析
使用标签编码和标准化对数据进行特征处理
使用xgboost进行训练预测
使用混淆矩阵,准确率,F1-Score等进行结果可视化展示

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import chardet
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn.metrics import accuracy_score, classification_report, roc_curve, auc
from sklearn.metrics import confusion_matrix
  1. 数据读取
    先获取数据对应的编码方式,再使用数据对应的编码方式读取数据
file_path = '/home/mw/input/depression4298/Depression_Students.csv'
with open(file_path, 'rb') as file:
    raw_data = file.read()
    detected_encoding = chardet.detect(raw_data)['encoding']
# 读取数据
data = pd.read_csv(file_path, encoding=detected_encoding)

# 展示数据
data.head()

在这里插入图片描述

data.info()

在这里插入图片描述

3. 数据可视化分析

# 设置白色背景和网格线
# 可选的 style 参数值:
# white:白色背景,没有网格线。
# dark:深色背景,默认显示网格线。
# darkgrid:深色背景,带有网格线。
# whitegrid:白色背景,带有网格线。
# ticks:带有刻度线的白色背景图。
sns.set(style="whitegrid")
# 设置支持中文的字体,确保中文字符能正常显示
matplotlib.rcParams['font.sans-serif'] = ['Microsoft YaHei']
matplotlib.rcParams['axes.unicode_minus'] = False 

3.1 性别分布

数据样本性别分布

plt.figure(figsize=(10, 6))
sns.countplot(data=data, x="性别", palette="pastel")
# 添加顶部数值标签
ax = sns.countplot(data=data, x="性别", palette="pastel")
for p in ax.patches:
    ax.annotate(f'{p.get_height()}', 
                (p.get_x() + p.get_width() / 2., p.get_height()), 
                ha = 'center', va = 'center', 
                fontsize=12, color='black', 
                xytext=(0, 5), textcoords='offset points')

plt.title("性别分布", fontsize=14)
plt.xlabel("性别", fontsize=12)
plt.ylabel("人数", fontsize=12)
plt.show()

在这里插入图片描述

3.2 不同性别抑郁情况分布

plt.figure(figsize=(10, 6))
sns.countplot(data=data, x="性别", hue="是否抑郁", palette="Set2")
plt.title("不同性别抑郁情况分布", fontsize=14)
plt.xlabel("性别", fontsize=12)
plt.ylabel("人数", fontsize=12)
plt.legend(title="是否抑郁")
plt.show()

在这里插入图片描述

3.3 不同睡眠时长与抑郁情况的关系

plt.figure(figsize=(17, 10))
sns.countplot(data=data, x="睡眠时间", hue="是否抑郁", palette="Set1")
plt.title("不同睡眠时长与抑郁情况的关系", fontsize=14)
plt.xlabel("睡眠时间", fontsize=12)
plt.ylabel("人数", fontsize=12)
plt.legend(title="是否抑郁")
plt.show()

在这里插入图片描述

3.4 学习压力与抑郁的关系

从这个图可以看出,学习压力是抑郁的主要因素

plt.figure(figsize=(10, 8))
sns.boxplot(data=data, x="是否抑郁", y="学习压力", palette="coolwarm")
plt.title("学习压力与抑郁的关系", fontsize=14)
plt.xlabel("是否抑郁", fontsize=12)
plt.ylabel("学习压力", fontsize=12)
plt.show()

在这里插入图片描述

3.5 年龄分布与抑郁情况的关系

绘制小提琴图:年龄分布与抑郁情况的关系

plt.figure(figsize=(12, 8))
sns.violinplot(data=data, x="是否抑郁", y="年龄", palette="muted")
plt.title("年龄分布与抑郁情况的关系", fontsize=14)
plt.xlabel("是否抑郁", fontsize=12)
plt.ylabel("年龄", fontsize=12)
plt.tight_layout()
plt.show()

在这里插入图片描述

4. 特征编码

使用标签编码和数据标准化

# 创建标签编码器
label_encoder = LabelEncoder()

# 将类别变量转换为数值
data['性别'] = label_encoder.fit_transform(data['性别'])
data['是否抑郁'] = label_encoder.fit_transform(data['是否抑郁'])
data['睡眠时间'] = label_encoder.fit_transform(data['睡眠时间'])
data['饮食习惯'] = label_encoder.fit_transform(data['饮食习惯'])
data['是否有过自杀的念头'] = label_encoder.fit_transform(data['是否有过自杀的念头'])
data['精神疾病家族史'] = label_encoder.fit_transform(data['精神疾病家族史'])

# 标准化数值变量
scaler = StandardScaler()
data[['年龄', '学习压力', '学习满意度', '学习时间', '经济压力']] = scaler.fit_transform(data[['年龄', '学习压力', '学习满意度', '学习时间', '经济压力']])

5. 模型训练

先划分数据集,再使用xgboost进行训练

# 特征和目标变量
X = data.drop('是否抑郁', axis=1)  # 去掉目标变量
y = data['是否抑郁']  # 目标变量

# 切分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

X.head()

在这里插入图片描述

# 初始化并训练XGBoost模型
xgb_model = xgb.XGBClassifier(random_state=42)
xgb_model.fit(X_train, y_train)

在这里插入图片描述

# 在测试集上进行预测
y_pred_xgb = xgb_model.predict(X_test)
# 评估模型性能
accuracy_xgb = accuracy_score(y_test, y_pred_xgb)
print(f"XGBoost模型准确率: {accuracy_xgb:.2f}")
print(classification_report(y_test, y_pred_xgb))

在这里插入图片描述

6. 结果可视化展示

6.1 混淆矩阵

绘制各个标签的混淆矩阵分为TT,TF,FT,FF

# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred_xgb)
# 绘制混淆矩阵
plt.figure(figsize=(10, 8))
sns.heatmap(cm, annot=True, fmt="d", cmap="Blues", xticklabels=label_encoder.classes_, yticklabels=label_encoder.classes_)
plt.title('混淆矩阵')
plt.xlabel('预测类别')
plt.ylabel('实际类别')
plt.show()

在这里插入图片描述

6.2 特征重要性

查看各个特征对目标变量的重要性

# 特征重要性
plt.figure(figsize=(10, 6))
xgb.plot_importance(xgb_model, importance_type="weight", max_num_features=10, title="特征重要性")
plt.show()

在这里插入图片描述

总结

学习压力是学生抑郁的主要影响因素
其他影响因素请看上图

# 需要数据集的请点击以下链接。
https://mbd.pub/o/bread/mbd-Z5ybm5hq
数据文档 背景描述 本数据集包含了心理、生理、社会、环境学术等不同方面信息,为深入探讨学生面临的各种压力提供参考数据。从睡眠质量到学习负担,再到环境人际关系的影响,数据集涵盖了约20个最显著的特征。 本数据集适合初学者进行探索分析,了解当前学生所面临的压力挑战心理状况。 问题描述 描述性统计 数据集中有多少学生? 数据集中学生的平均焦虑水平是多少? 有多少学生报告过心理健康问题的历史? 心理因素 有多少学生的自尊心水平低于平均水平? 有百分之多少的学生报告过抑郁经历? 生理因素 有多少学生经常头痛? 学生的平均血压水平是多少? 有多少学生评价自己的睡眠质量较差? 环境因素 有多少学生生活在噪音水平较高的环境? 有百分之多少的学生在居住条件中感到不安全? 有多少学生报告基本需求未得到满足? 学术因素 有多少学生将自己的学业表现评为平均水平以下? 学生报告的平均学业负担是多少? 有多少学生担心自己的未来职业? 社会因素 有多少学生感觉自己有强大的社会支持? 有百分之多少的学生曾经经历过欺凌? 有多少学生参与课外活动? 比较分析 焦虑水平与学业表现之间是否存在相关性? 睡眠质量较差的学生是否也报告更高的抑郁水平? 经历过欺凌的学生是否更有可能有心理健康问题的历史? 总体探索 在不同因素中(心理、生理、环境、学术、社会),有多少学生报告了负面经历或状况? 在比较不同因素时,是否有明显的趋势或模式? 根据数据集,每个因素中哪个具体特征对学生的压力影响最为显著?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bony-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值