睡眠时间影响因素K-Means可视化分析+XGBoost预测
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 StandardScaler
import 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并不好,原因是睡眠时间数据不稳定,导致偏差太大了,可视化结果来看也还是有一定的准确性的
原文地址:https://blog.csdn.net/m0_66504204/article/details/145263648
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!