基于心理健康与数字行为数据的多维度分析
基于心理健康与数字行为数据的多维度分析
背景
随着数字设备的普及,人们在日常生活中的数字行为(如屏幕时间、社交媒体使用、通知数量等)与心理健康之间的关系逐渐受到关注。
本案例旨在通过机器学习方法,分析数字行为与心理健康指标之间的关系,并探索潜在的模式和趋势。
数据说明
数据集包含500个模拟数据点,涵盖以下字段:
• daily_screen_time_min
:每天使用屏幕的总时间(分钟)。
• num_app_switches
:一天内切换应用程序的次数。
• sleep_hours
:每天睡眠的小时数。
• notification_count
:一天内收到的通知数量。
• social_media_time_min
:每天在社交媒体上花费的时间(分钟)。
• focus_score
:自我报告的注意力得分(1-10分,1分非常分心,10分高度集中)。
• mood_score
:自我报告的情绪得分(1-10分,1分非常低落,10分非常愉快)。
• anxiety_level
:自我报告的焦虑水平(1-10分,1分低焦虑,10分高焦虑)。
• digital_wellbeing_score
:基于注意力、睡眠和焦虑水平计算的综合得分,分数越高表示越幸福。
需求
• 相关性分析:计算数字行为特征与心理健康指标之间的相关性。
• 回归分析:使用线性回归模型预测focus_score
。
• 分类分析:将用户划分为低、中、高焦虑水平的类别,并使用逻辑回归进行分类。
• 聚类分析:使用K-Means聚类算法对用户进行分组,探索用户行为和心理健康的潜在模式。
• 可视化:绘制相关性热图、回归预测结果图、分类混淆矩阵和聚类结果图。
导包
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.cluster import KMeans
from sklearn.metrics import mean_squared_error, classification_report, confusion_matrix, silhouette_score# 设置使用的CPU核心数(根据实际情况调整,建议为逻辑核心数的一半)
os.environ["LOKY_MAX_CPU_COUNT"] = "4"# 加载数据
data = pd.read_csv('data/07/mental_health_digital_behavior_data.csv')# 数据概览
print(data.head())
daily_screen_time_min num_app_switches sleep_hours notification_count \
0 389.8 53 5.9 89
1 351.7 52 7.2 79
2 398.9 39 8.0 108
3 451.4 44 6.5 78
4 346.0 43 6.9 35 social_media_time_min focus_score mood_score anxiety_level \
0 133.2 6.8 8.9 10.0
1 109.5 5.5 9.4 10.0
2 84.7 6.7 9.4 9.4
3 88.9 6.0 9.4 5.1
4 78.8 8.2 9.4 8.0 digital_wellbeing_score
0 44.8
1 43.6
2 52.6
3 58.4
4 59.7
1. 相关性分析
# 1. 相关性分析
correlation_matrix = data.corr()
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title('Correlation Heatmap')
# plt.xticks(rotation=30) # 旋转 X 轴标签 30 度
plt.show()
2. 回归分析:预测 focus_score
# 2. 回归分析:预测 focus_score
# 特征选择
features = ['daily_screen_time_min', 'num_app_switches', 'sleep_hours', 'notification_count', 'social_media_time_min']
X = data[features]
y = data['focus_score']# 数据分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 模型训练
regressor = LinearRegression()
regressor.fit(X_train, y_train)# 模型预测
y_pred = regressor.predict(X_test)# 评估模型
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error for Focus Score Prediction: {mse:.2f}')# 可视化回归结果
plt.scatter(y_test, y_pred)
plt.xlabel('Actual Focus Score')
plt.ylabel('Predicted Focus Score')
plt.title('Regression Prediction')
plt.show()
Mean Squared Error for Focus Score Prediction: 0.23
3. 分类分析:将用户划分为低、中、高焦虑水平
# 3. 分类分析:将用户划分为低、中、高焦虑水平
data['anxiety_category'] = pd.cut(data['anxiety_level'], bins=[0, 3, 7, 10], labels=['Low', 'Medium', 'High'])# 特征选择
X = data[features]
y = data['anxiety_category']# 数据分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 模型训练
classifier = LogisticRegression(max_iter=5000, solver='liblinear', C=1.0, random_state=42)
classifier.fit(X_train, y_train)# 模型预测
y_pred = classifier.predict(X_test)# 评估模型
print(classification_report(y_test, y_pred, zero_division=0)) # 设置 zero_division 参数
conf_matrix = confusion_matrix(y_test, y_pred)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.xlabel('Predicted Anxiety Level')
plt.ylabel('Actual Anxiety Level')
plt.title('Confusion Matrix')
plt.show()
precision recall f1-score supportHigh 0.80 1.00 0.89 78Low 0.00 0.00 0.00 1Medium 1.00 0.10 0.17 21accuracy 0.80 100macro avg 0.60 0.37 0.35 100
weighted avg 0.83 0.80 0.73 100
4. 聚类分析:使用 K-Means 对用户进行分组
# 4. 聚类分析:使用 K-Means 对用户进行分组
# 特征选择
X = data[features]# 聚类
kmeans = KMeans(n_clusters=3, random_state=42)
data['cluster'] = kmeans.fit_predict(X)# 聚类结果可视化
sns.scatterplot(data=data, x='daily_screen_time_min', y='focus_score', hue='cluster', palette='viridis')
plt.title('K-Means Clustering')
plt.show()# 评估聚类效果
silhouette_avg = silhouette_score(X, data['cluster'])
print(f'Silhouette Score: {silhouette_avg:.2f}')
Silhouette Score: 0.26