睡眠时间影响因素K-Means可视化分析+XGBoost预测

ops/2025/1/21 12:04:32/

1. 导包及数据展示

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.cluster import KMeans
from xgboost import XGBRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.preprocessing import StandardScalerimport warnings
warnings.filterwarnings("ignore")
# 读取数据
data = pd.read_csv('/home/mw/input/sleep5895/sleep.csv', encoding='GBK')
data.head()

 

# 查看字段的详细信息
data.describe().T

 查看缺失值,根据结果可以得出没有缺失值的结论

data.isnull().sum()

2. 数据可视化分析

2.1 字段相关性矩阵

 

# 计算相关性矩阵
correlation_matrix = data.corr()# 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("变量相关性热力图")
plt.show()

 2.2 锻炼时间与睡眠时间的关系¶

# 散点图:锻炼时间与睡眠时间的关系
plt.figure(figsize=(12, 10))
sns.scatterplot(x="工作时间(小时/天)", y="睡眠时间(小时/夜)", data=data)
plt.title("工作时间与睡眠时间的关系")
plt.xlabel("工作时间(小时/天)")
plt.ylabel("睡眠时间(小时/夜)")
plt.show()

 

 

2.3 咖啡因摄入量

顾名思义,查看咖啡因摄入的频率分布

 

# 分布图:咖啡因摄入量
# plt.figure(figsize=(10, 8))
sns.histplot(data["咖啡因摄入量(毫克/天)"], kde=True, bins=10, color='blue')
plt.title("咖啡因摄入量分布")
plt.xlabel("咖啡因摄入量(毫克/天)")
plt.ylabel("频数")
plt.show()

3. 字段分析

使用 statsmodels 库中的 OLS(普通最小二乘法,Ordinary Least Squares)方法来拟合数据,并输出回归模型的统计摘要

 

X = data.drop(columns=["睡眠时间(小时/夜)"])
y = data["睡眠时间(小时/夜)"]
# 添加常数项(截距)
import statsmodels.api as sm# 创建回归模型并拟合
model = sm.OLS(y, X).fit()# 输出模型结果
model.summary()

 

3.1 分析结果

一、回归系数(coef):
1.锻炼时间:每增加1小时的锻炼,睡眠时间会增加 0.8754小时。
2.阅读时间:每增加1小时的阅读,睡眠时间会增加 0.8831小时。
3.手机使用时间:每增加1小时的手机使用,睡眠时间会减少 0.0746小时,不过这项接近显著性(p=0.054),可能需要进一步验证。
4.工作时间:每增加1小时的工作,睡眠时间会增加 0.1470小时。
5.咖啡因摄入量:每摄入1毫克的咖啡因,睡眠时间会增加 0.0036小时。
6.放松时间:每增加1小时的放松,睡眠时间会增加 1.1336小时。
二、标准误差(std err):估计系数的不确定性,标准误差越小,系数越可靠。
三、t值(t):回归系数与其标准误差的比值,用于假设检验。t值越大,表示该自变量的影响越显著。
四、p值(P>|t|):用于检验每个自变量的显著性。通常,p值小于0.05表示自变量对因变量的影响是显著的。
例如 锻炼时间 和 阅读时间 的 p值为 0.000,意味着这两个变量对睡眠时间有显著影响。
手机使用时间 的 p值为 0.054,接近显著性水平 0.05,可以考虑进一步分析或调整模型。
95%置信区间:表示回归系数的可信范围,例如 锻炼时间的置信区间 是 [0.769, 0.982],即我们有 95% 的信心认为锻炼时间对睡眠时间的影响在这个区间内。

4. 聚类分析

对标准化的数据进行聚类,类别数可自选

scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)# K-means聚类
# n_clusters为类别数,可自定义
kmeans = KMeans(n_clusters=4, random_state=42)
data['Cluster'] = kmeans.fit_predict(scaled_data)

4.1 聚类结果展示

# 创建2x3的子图
fig, axes = plt.subplots(3, 2, figsize=(18, 20))# 绘制散点图,展示其他字段与睡眠时间的关系
sns.scatterplot(data=data, x="锻炼时间(小时/天)", y="睡眠时间(小时/夜)", hue="Cluster", palette="viridis", ax=axes[0, 0])
axes[0, 0].set_title("锻炼时间 vs 睡眠时间")
axes[0, 0].set_xlabel("锻炼时间(小时/天)")
axes[0, 0].set_ylabel("睡眠时间(小时/夜)")sns.scatterplot(data=data, x="阅读时间(小时/天)", y="睡眠时间(小时/夜)", hue="Cluster", palette="viridis", ax=axes[0, 1])
axes[0, 1].set_title("阅读时间 vs 睡眠时间")
axes[0, 1].set_xlabel("阅读时间(小时/天)")
axes[0, 1].set_ylabel("睡眠时间(小时/夜)")sns.scatterplot(data=data, x="手机使用时间(小时/天)", y="睡眠时间(小时/夜)", hue="Cluster", palette="viridis", ax=axes[1, 0])
axes[1, 0].set_title("手机使用时间 vs 睡眠时间")
axes[1, 0].set_xlabel("手机使用时间(小时/天)")
axes[1, 0].set_ylabel("睡眠时间(小时/夜)")sns.scatterplot(data=data, x="工作时间(小时/天)", y="睡眠时间(小时/夜)", hue="Cluster", palette="viridis", ax=axes[1, 1])
axes[1, 1].set_title("工作时间 vs 睡眠时间")
axes[1, 1].set_xlabel("工作时间(小时/天)")
axes[1, 1].set_ylabel("睡眠时间(小时/夜)")sns.scatterplot(data=data, x="咖啡因摄入量(毫克/天)", y="睡眠时间(小时/夜)", hue="Cluster", palette="viridis", ax=axes[2, 0])
axes[2, 0].set_title("咖啡因摄入量 vs 睡眠时间")
axes[2, 0].set_xlabel("咖啡因摄入量(毫克/天)")
axes[2, 0].set_ylabel("睡眠时间(小时/夜)")sns.scatterplot(data=data, x="放松时间(小时/天)", y="睡眠时间(小时/夜)", hue="Cluster", palette="viridis", ax=axes[2, 1])
axes[2, 1].set_title("放松时间 vs 睡眠时间")
axes[2, 1].set_xlabel("放松时间(小时/天)")
axes[2, 1].set_ylabel("睡眠时间(小时/夜)")# 调整子图间距
plt.tight_layout()
plt.show()

 

 

5. XGBoost回归预测

 

# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

5.1 模型定义

定义模型参数什么的

 

model = XGBRegressor(n_estimators=200,          # 增加树的数量learning_rate=0.05,        # 降低学习率max_depth=6,               # 控制树的深度min_child_weight=3,        # 控制分裂的最小权重和gamma=0.2,                 # 防止过拟合subsample=0.8,             # 随机采样比例colsample_bytree=0.8,      # 特征采样比例reg_alpha=0.1,             # L1 正则化reg_lambda=1,              # L2 正则化random_state=42            # 保持结果可复现
)
model.fit(X_train_scaled, y_train)

5.2 预测及评估

 

# 预测
y_pred = model.predict(X_test_scaled)# 评估
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)print(f"MSE: {mse:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"MAE: {mae:.2f}")
print(f"R²: {r2:.2f}")

 5.3 模型结果可视化

# 绘制散点图
plt.scatter(y_test, y_pred, alpha=0.7, label="Predictions")
plt.xlabel("实际睡眠时间")
plt.ylabel("预测睡眠时间")
plt.title("实际睡眠时间及预测睡眠时间对比图")
# 添加基准线
min_val = min(min(y_test), min(y_pred))  # y轴最小值
max_val = max(max(y_test), max(y_pred))  # y轴最大值
plt.plot([min_val, max_val], [min_val, max_val], 'r--', label="基准线 (y = x)")  # 基准线
# 添加图例
plt.legend()
# 显示图表
plt.show()

 

 

6. 结果总结

1. 放松时间,锻炼时间,阅读时间对睡眠时间影响较大
2. 模型结果展示的MSE并不好,原因是睡眠时间数据不稳定,导致偏差太大了,可视化结果来看也还是有一定的准确性的


http://www.ppmy.cn/ops/151906.html

相关文章

【2024 CSDN博客之星】技术洞察类:从DeepSeek-V3的成功,看MoE混合专家网络对深度学习算法领域的影响(MoE代码级实战)

目录 一、引言 1.1 本篇文章侧重点 1.2 技术洞察—MoE(Mixture-of-Experts,混合专家网络) 二、MoE(Mixture-of-Experts,混合专家网络) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场…

.gitignore配置忽略out目录

文章目录 说明操作 说明 可以结合IDEA可视化操作git,只要不删除远程仓库,如果本地操作项目出现错误,可以直接修改远程仓库的.gitignore文件,并重新拉取项目到本地。 操作 在项目根目录下找到 .gitignore 文件,打开并…

【java数据结构】优先级队列(堆)

【java数据结构】优先级队列(堆) 一、优先级队列1.1 概念 二、优先级队列的模拟实现2.1 堆的概念2.1.1堆的性质 2.2 堆的存储方式2.3 堆的创建2.3.1 向下调整(以小堆为例):2.3.2 堆的创建2.3.3 创建堆的时间复杂度 2.4…

【c++】【算法】【动态规划】最长公共子序列

【c】【算法】【动态规划】最长公共子序列 //递归方式 //最长公共子序 //直接递归 求最长公共子序长度 int FindValue(const string& X, const string& Y, int i, int j) {if (i 0 || j 0)return 0;if (X[i] Y[j])return FindValue(X, Y, i - 1, j - 1)1;else retu…

C++ 面向对象(继承)

三、继承 3.1 继承的概念 基于一个已有的类 去重新定义一个新的类,这种方式我们叫做继承 关于继承的称呼 一个类B 继承来自 类 A 我们一般称呼 A类:父类 基类 B类: 子类 派生类 B继承自A A 派生了B 示例图的语法 class vehicle // 车类 {}class …

自己搭建远程桌面服务器-RustDesk(小白版)

1.RustDesk简介 此软件主要功能为远程各种设备(其中包括Windows、macOS、Linux、iOS、Android、Web等) 支持文件传输(可直接拷贝远程电脑的文件,类似向日葵的远程文件) 支持内网穿透(支持端口映射&#…

Java开发提速秘籍:巧用Apache Commons Lang工具库

一、Java 开发效率之困 在当今数字化时代,Java 作为一门广泛应用的编程语言,在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台,还是移动应用后端,都能看到 Java 的身影。然而,Java 开发者…

基于springboot的垃圾分类网站

作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 项目包含: 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…