构建预测睡眠质量模型:相关性分析、多变量分析和聚类分析
构建预测睡眠质量模型:相关性分析、多变量分析和聚类分析
本文将介绍如何构建一个预测睡眠质量的模型。通过相关性分析、多变量分析和聚类分析,我们可以更好地理解影响睡眠质量的各种因素,并使用线性回归模型进行预测。
数据集说明
本数据集目的是探究不同因素是如何影响睡眠质量和整体健康的。数据集包含以下字段:
- Heart Rate Variability:心率变异性(心跳时间间隔的模拟变化)
- Body Temperature:体温(以摄氏度为单位的人工生成体温)
- Movement During Sleep:睡眠期间活动(睡眠时活动量的合成数据)
- Sleep Duration Hours:睡眠时长(模拟生成的总睡眠小时数)
- Sleep Quality Score:睡眠质量评分(代表睡眠质量的合成评分)
- Caffeine Intake (mg):咖啡因摄入量(毫克)(以毫克为单位的模拟咖啡因摄入量)
- Stress Level:压力水平(压力水平的模拟指数)
- Bedtime Consistency:睡眠规律性(睡眠时间一致性的模拟值;范围 0-1,数值越低表示规律性越差)
- Light Exposure Hours:日间光照时长(白天接触到光照的时长)
相关性分析
首先进行相关性分析,以探索这些变量之间的关联,特别是与睡眠质量评分(Sleep_Quality_Score)的关系。
import pandas as pd
file_path = 'wearable_tech_sleep_quality.csv'
data = pd.read_csv(file_path)
correlation_matrix = data.corr()
correlation_matrix
相关性分析结果:
- 睡眠质量评分(Sleep_Quality_Score)与其他变量的相关性普遍较弱。其中,与咖啡因摄入量(Caffeine_Intake_mg)的相关性最强,为-0.722,表明咖啡因摄入量与睡眠质量评分呈负相关。
- 其他变量之间的相关性也普遍不强,但有一些值得注意的关联,例如心率变异性(Heart_Rate_Variability)与就寝时间一致性(Bedtime_Consistency)之间的相关性为0.048,以及睡眠期间的运动(Movement_During_Sleep)与就寝时间一致性(Bedtime_Consistency)之间的相关性为-0.039。
多变量分析
使用多元线性回归来探究多个变量如何共同影响睡眠质量评分。
from sklearn.linear_model import LinearRegression
import numpy as np
X = data.drop('Sleep_Quality_Score', axis=1)
y = data['Sleep_Quality_Score']
model = LinearRegression()
model.fit(X, y)
coefficients = model.coef_
coefficients_df = pd.DataFrame(coefficients, X.columns, columns=['Coefficient'])
coefficients_df
多变量分析结果(多元线性回归):
多元线性回归模型的系数如下:
- 心率变异性(Heart_Rate_Variability):0.0036
- 体温(Body_Temperature):-0.0107
- 睡眠期间的运动(Movement_During_Sleep):-0.2030
- 睡眠时长(Sleep_Duration_Hours):0.1324
- 咖啡因摄入量(Caffeine_Intake_mg):-0.0229
- 压力水平(Stress_Level):-0.0418
- 就寝时间一致性(Bedtime_Consistency):-0.5801
- 光照暴露时间(Light_Exposure_hours):0.0033
这些系数表明,每个变量对睡眠质量评分的相对影响。例如,就寝时间一致性(Bedtime_Consistency)的系数为-0.5801,这意味着就寝时间一致性每增加一个单位,睡眠质量评分预计会减少0.5801个单位。
聚类分析
使用KMeans算法进行聚类分析,以识别数据中的自然分组。
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
plt.figure(figsize=(10, 5))
plt.plot(range(1, 11), wcss, marker='o', linestyle='--')
plt.title('Elbow Method to Find Optimal Number of Clusters')
plt.xlabel('Number of Clusters')
plt.ylabel('Within-Cluster Sum of Squares (WCSS)')
plt.grid(True)
plt.show()
使用肘部法则(Elbow Method)来确定最佳的聚类数。从图中可以看出,随着聚类数量的增加,组内平方和(WCSS)逐渐减小。理想的聚类数通常是在WCSS下降速度开始减缓的点。根据这个图表,我们可以选择2或3个聚类作为最佳数量。
现在,使用KMeans算法进行聚类分析,选择3个聚类作为例子,并展示每个聚类中心的特点。
kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
clusters = kmeans.fit_predict(X)
cluster_centers = kmeans.cluster_centers_
cluster_centers_df = pd.DataFrame(cluster_centers, columns=X.columns)
cluster_centers_df['Cluster'] = ['Cluster 1', 'Cluster 2', 'Cluster 3']
cluster_centers_df = cluster_centers_df.set_index('Cluster')
cluster_centers_df.T
聚类分析结果(KMeans,3个聚类):
每个聚类中心的特点如下:
Cluster 1:
心率变异性(Heart_Rate_Variability):70.395
体温(Body_Temperature):36.520
睡眠期间的运动(Movement_During_Sleep):1.973
睡眠时长(Sleep_Duration_Hours):7.494
咖啡因摄入量(Caffeine_Intake_mg):46.825
压力水平(Stress_Level):4.903
就寝时间一致性(Bedtime_Consistency):0.493
光照暴露时间(Light_Exposure_hours):8.006
Cluster 2:
心率变异性(Heart_Rate_Variability):70.387
体温(Body_Temperature):36.563
睡眠期间的运动(Movement_During_Sleep):2.033
睡眠时长(Sleep_Duration_Hours):7.582
咖啡因摄入量(Caffeine_Intake_mg):277.643
压力水平(Stress_Level):5.007
就寝时间一致性(Bedtime_Consistency):0.508
光照暴露时间(Light_Exposure_hours):8.146
Cluster 3:
心率变异性(Heart_Rate_Variability):70.380
体温(Body_Temperature):36.532
睡眠期间的运动(Movement_During_Sleep):2.017
睡眠时长(Sleep_Duration_Hours):7.396
咖啡因摄入量(Caffeine_Intake_mg):157.392
压力水平(Stress_Level):4.935
就寝时间一致性(Bedtime_Consistency):0.511
光照暴露时间(Light_Exposure_hours):8.001
这些聚类展示了数据中的自然分组,每个聚类都有其独特的特征。例如,Cluster 2的咖啡因摄入量显著高于其他两个聚类,这可能表明这个聚类中的个体可能有更高的咖啡因依赖性,这可能会影响他们的睡眠质量。
构建预测睡眠质量线性回归模型
首先,进行数据预处理,包括处理缺失值、异常值,以及特征选择。然后,选择适当的模型来构建预测睡眠质量的模型。考虑到数据的性质,选择线性回归模型,因为它简单且易于解释。接着,使用训练数据集来训练模型。最后,使用测试数据集来评估模型的性能。
from sklearn.model_selection import train_test_split
from sklearn.imputer import SimpleImputer
from sklearn.preprocessing import StandardScaler
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
imputer = SimpleImputer(strategy='mean')
X_train_imputed = imputer.fit_transform(X_train)
X_test_imputed = imputer.transform(X_test)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train_imputed)
X_test_scaled = scaler.transform(X_test_imputed)
上述代码使用均值填充策略填充了训练集和测试集中的缺失值,并使用标准缩放方法对数据进行了标准化处理。下一步,选择线性回归模型来构建预测睡眠质量的模型,并使用训练数据集进行训练。
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
model = LinearRegression()
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)
mse = mean_squared_error(y_test, y_pred)
mse
模型训练与评估结果:
已经使用线性回归模型训练了模型,并且模型已经拟合了训练数据。使用测试数据集评估模型的性能,得到的均方误差(MSE)为3.93。MSE是一个衡量模型预测准确性的指标,值越小表示模型预测越准确。总结来说,这个线性回归模型能够较好地预测睡眠质量。