最近在整理过往做过的数据分析项目时,翻到了这个大学生心理健康分析的研究。作为曾经在高校心理咨询中心做过志愿者的我,对这个话题特别有感触。当时我们每周都会接待不少前来咨询的学生,但受限于人力,很难对全校学生的心理状况进行全面评估。这个项目就是尝试用数据科学的方法,建立一个可量化的心理健康评估模型。
这个项目最大的特点在于:
特别说明:所有数据均经过严格脱敏处理,不包含任何个人隐私信息。项目目的是帮助识别潜在风险群体,而非对个体下结论。
原始数据来自某高校连续3年的心理健康普查问卷,包含以下主要字段:
| 字段类别 | 具体字段 | 数据类型 | 说明 |
|---|---|---|---|
| 基础信息 | 性别、年级、专业 | 分类变量 | 用于群体分析 |
| 生活状况 | 睡眠时长、饮食规律性、运动频率 | 数值/分类 | 生活习惯指标 |
| 学业压力 | 课程负荷、成绩满意度、未来焦虑 | Likert 5级量表 | 1-5分制 |
| 社交关系 | 室友关系、家庭支持、朋友数量 | 分类/数值 | 社会支持系统 |
| 心理指标 | PHQ-9抑郁量表得分 | 数值 | 0-27分,越高风险越大 |
原始数据存在缺失值、异常值和量表反向计分等问题,处理流程如下:
python复制# 检查各字段缺失率
missing_rates = df.isnull().mean().sort_values(ascending=False)
# 处理策略:
# - 缺失率<5%的字段:用中位数/众数填充
# - 缺失率5-20%的字段:用KNN插补
# - 缺失率>20%的字段:整列删除
python复制# 对连续变量进行箱线图分析
plt.figure(figsize=(12,6))
sns.boxplot(data=df[['sleep_hours', 'exercise_freq']])
plt.xticks(rotation=45)
plt.show()
# 处理策略:
# - 睡眠时间<3h或>12h的记录标记为异常
# - 运动频率>14次/周(每天2次)的记录剔除
python复制# 例如:将"我对未来感到乐观"的1-5分反向计分
df['optimism'] = 6 - df['optimism_raw']
使用Seaborn绘制抑郁得分的分布直方图:
python复制plt.figure(figsize=(10,6))
sns.histplot(data=df, x='phq9_score', bins=20, kde=True)
plt.title('PHQ-9 Score Distribution')
plt.xlabel('Depression Severity (0-27)')
plt.ylabel('Count')
plt.show()

从分布可以看出,大部分学生得分集中在0-9分(无或轻度抑郁),但有约15%的学生得分≥10分(中重度抑郁风险)。
python复制gender_plot = sns.catplot(x='gender', y='phq9_score',
data=df, kind='box',
height=6, aspect=1.2)
gender_plot.set_axis_labels("Gender", "PHQ-9 Score")
plt.title('Depression Scores by Gender')
分析发现:
python复制year_trend = df.groupby('grade')['phq9_score'].mean().plot(
kind='line', marker='o', figsize=(10,6))
plt.ylabel('Average PHQ-9 Score')
plt.title('Depression Trend Across Grades')
结果显示:
python复制sleep_effect = sns.lmplot(x='sleep_hours', y='phq9_score',
data=df, lowess=True,
height=6, aspect=1.5)
sleep_effect.set_axis_labels("Sleep Hours/Day", "PHQ-9 Score")
关键发现:
将原始特征转换为模型可用的形式:
python复制from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['sleep_hours','exercise_freq']] = scaler.fit_transform(
df[['sleep_hours','exercise_freq']])
python复制df = pd.get_dummies(df, columns=['gender','grade'], drop_first=True)
python复制# 将PHQ-9得分≥10定义为有抑郁风险
df['depression_risk'] = (df['phq9_score'] >= 10).astype(int)
选择逻辑回归因其可解释性强,便于分析各因素影响程度:
python复制from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 划分训练测试集
X = df.drop(['phq9_score','depression_risk'], axis=1)
y = df['depression_risk']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)
# 模型训练
model = LogisticRegression(penalty='l2', C=1.0, solver='liblinear')
model.fit(X_train, y_train)
# 评估
from sklearn.metrics import accuracy_score, confusion_matrix
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred):.3f}")
查看特征系数:
python复制coef_df = pd.DataFrame({
'feature': X.columns,
'coefficient': model.coef_[0]
}).sort_values('coefficient', ascending=False)
重要发现:
保护性因素(系数为负):
风险因素(系数为正):
这个模型可以用于:
数据隐私保护:
模型使用建议:
常见问题排查:
这个项目让我深刻体会到,技术可以成为心理健康工作的有力辅助工具。在实际应用中,我们通过这个模型成功识别出多个需要关注的学生群体,并及时提供了干预支持。不过也要时刻记住,数据模型只是工具,真正的帮助还需要专业的人文关怀。