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

1. 导包及数据展示

python 复制代码
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 StandardScaler

import warnings
warnings.filterwarnings("ignore")
python 复制代码
# 读取数据
data = pd.read_csv('/home/mw/input/sleep5895/sleep.csv', encoding='GBK')
data.head()
python 复制代码
# 查看字段的详细信息
data.describe().T

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

python 复制代码
data.isnull().sum()

2. 数据可视化分析

2.1 字段相关性矩阵

python 复制代码
# 计算相关性矩阵
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 锻炼时间与睡眠时间的关系

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

2.3 咖啡因摄入量

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

python 复制代码
# 分布图:咖啡因摄入量
# 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)方法来拟合数据,并输出回归模型的统计摘要

python 复制代码
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. 聚类分析

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

python 复制代码
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 聚类结果展示

python 复制代码
# 创建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回归预测

python 复制代码
# 数据划分
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 模型定义

定义模型参数什么的

python 复制代码
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 预测及评估

python 复制代码
# 预测
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 模型结果可视化

python 复制代码
# 绘制散点图
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并不好,原因是睡眠时间数据不稳定,导致偏差太大了,可视化结果来看也还是有一定的准确性的

相关推荐
2501_938140071 小时前
做内容很省心,2026好用AI笔记,支持抖音小红书视频无水印保存
人工智能
sell-cloud4 小时前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
Navicat中国5 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI5 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区6 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris8 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy8 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V8 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI8 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技8 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人