当前位置: 首页 > article >正文

数据分析每周挑战——睡眠质量影响因素研究

失踪人口回归

背景描述 :

在当今社会,越来越多的人开始关注睡眠与健康之间的紧密联系。随着可穿戴设备技术的发展,人们可以更精确地追踪自己的睡眠模式和健康状况,从而更好地理解睡眠质量对日常生活的实际影响。

本数据集为人工生成的数据集,目的是探究不同因素是如何影响睡眠质量和整体健康的。
本数据集模拟了多种情况,通过分析可以了解睡眠和健康之间可能存在的各种联系和变化,非常适合用来做预测分析和研究。

数据说明:

字段说明
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日间光照时长:白天接触到光照的时长

处理数据:

1.数据导入:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


# 设置字体以支持中文显示
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

data = pd.read_csv("D:/每周挑战/wearable_tech_sleep_quality.csv")
data.head(5)

读取到数据后,为了后续方便处理,我们将英文名称全部换为中文

data.rename(columns = {"Heart_Rate_Variability":"心率变异性",
                      "Body_Temperature":"体温",
                      "Movement_During_Sleep":"睡眠期间活动",
                      "Sleep_Duration_Hours":"睡眠时长",
                      "Sleep_Quality_Score":"睡眠质量评分",
                      "Caffeine_Intake_mg":"咖啡因摄入量(毫克)",
                      "Stress_Level":"压力水平",
                      "Bedtime_Consistency":"睡眠规律性",
                      "Light_Exposure_hours":"日间光照时长",},inplace=True)

data.head(5)

2.数据清洗:

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 9 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   心率变异性       1000 non-null   float64
 1   体温          1000 non-null   float64
 2   睡眠期间活动      1000 non-null   float64
 3   睡眠时长        1000 non-null   float64
 4   睡眠质量评分      1000 non-null   float64
 5   咖啡因摄入量(毫克)  1000 non-null   float64
 6   压力水平        1000 non-null   float64
 7   睡眠规律性       1000 non-null   float64
 8   日间光照时长      1000 non-null   float64
dtypes: float64(9)
memory usage: 70.4 KB

没有缺失值,因此我们对数据进行可视化,先对各个因素与睡眠时长的宏观因素进行分析

3.数据可视化:

import seaborn as sns
plt.figure(figsize=(21,21))

for i,col in enumerate(data.columns):
    plt.subplot(3,3,i+1)
    sns.boxplot(y=data[col])
    plt.title(f"{col}的箱线图",fontsize=14)
    plt.grid(linestyle='-.',alpha=0.7,axis='y')

plt.tight_layout()
plt.show()

X = data.drop("睡眠质量评分",axis=1)
y = data["睡眠质量评分"]

plt.figure(figsize=(16,8))
for i,col in enumerate(X.columns):
    plt.subplot(2,4,i+1)
    sns.scatterplot(x=y,y=X[col])
    plt.title(f"{col}与睡眠质量评分之间的关系")

plt.tight_layout()
plt.show()

 

from scipy.stats import probplot
from scipy import stats

result = {}
for i,col in enumerate(data.columns):
    stat,p = stats.shapiro(data[col])
    result[col] = p

    plt.subplot(3,3,i+1)
    probplot(data[col],dist='norm',plot=plt)


normality_results_df = pd.DataFrame(list(result.items()), columns=['变量', 'p值'])
plt.tight_layout()
plt.show()
print(normality_results_df)

 

spearman_matrix = data.corr(method='spearman')

plt.figure(figsize=(15,12),dpi=100)
sns.heatmap(spearman_matrix,annot=True,fmt='.2f',cmap='coolwarm')
plt.show()

 

4.数据建模:

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

standardscaler = StandardScaler()

new_data = standardscaler.fit_transform(data)

inertia = []
silhouette_scores = []
k_range = range(2,11)

for k in k_range:
    kmeans = KMeans(n_clusters=k,random_state = 15).fit(new_data)
    inertia.append(kmeans.inertia_)
    silhouette_scores.append(silhouette_score(new_data,kmeans.labels_))

plt.figure(figsize=(15,5))

plt.subplot(1, 2, 1)
plt.plot(k_range, inertia, marker='o')
plt.xlabel('聚类中心数目')
plt.ylabel('惯性')
plt.title('肘部法则图')

plt.subplot(1, 2, 2)
plt.plot(k_range, silhouette_scores, marker='o')
plt.xlabel('聚类中心数目')
plt.ylabel('轮廓系数')
plt.title('轮廓系数图')

plt.tight_layout()
plt.show()

# 聚类中心热力图
cluster_centers = standardscaler.inverse_transform(kmeans.cluster_centers_) # inverse_transform() 是撤销之前的标准化操作。
center_df = pd.DataFrame(cluster_centers, columns=data.drop(['clusters'],axis=1).columns.tolist())

plt.figure(figsize=(15,10))
sns.heatmap(center_df, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('聚类中心热力图')
plt.xlabel('特征')
plt.ylabel('聚类')
plt.show()

 

从这个热力图中可以看出,咖啡因的摄入量对睡眠质量的影响非常大 

from sklearn.model_selection import train_test_split

X = data.drop(['睡眠质量评分','clusters'],axis=1)
y = data['睡眠质量评分']

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=15)

from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression,Ridge,Lasso,ElasticNet
from sklearn.ensemble import RandomForestRegressor,GradientBoostingRegressor
from sklearn.svm import SVR
from sklearn.metrics import r2_score,mean_squared_error
from sklearn.model_selection import cross_val_score

scaler = StandardScaler()

x_train = scaler.fit_transform(X_train)
x_test = scaler.fit_transform(X_test)

models = [LinearRegression(),Ridge(),Lasso(),ElasticNet(),DecisionTreeRegressor(),RandomForestRegressor(),GradientBoostingRegressor(),SVR()]
names = ['线性回归','岭回归','Lasso回归','弹性网络回归','决策树回归','随机森林回归','梯度提升回归','支持向量回归']

model_evaluation = []
for name,model in zip(names,models):
    model.fit(x_train,y_train)
    y_pred = model.predict(x_test)
    mse = mean_squared_error(y_test,y_pred)
    r2 = r2_score(y_test,y_pred)
    cv_scores = cross_val_score(model,x_train,y_train,cv=5,scoring='r2')
    model_evaluation.append([name,mse,r2,cv_scores.mean()])

evaluation = pd.DataFrame(model_evaluation,columns=['模型名称','均方误差','R2决定系数','交叉验证平均R2系数'])
evaluation.sort_values('R2决定系数',ascending=False)

 

梯度提升回归0.0944890.9894600.993129
随机森林回归0.1146150.9872150.990399
决策树回归0.1741110.9805780.986495
支持向量回归2.8899150.6776340.709741
线性回归4.2580740.5250180.523725
岭回归4.2581490.5250090.523734
Lasso回归5.3344930.4049450.406346
弹性网络回归5.4352400.3937070.395257

从这里我们可以看出梯度提升回归对于睡眠质量的预测效果较好,因此,我们选择梯度提升回归模型来可视化重要特征

gb = GradientBoostingRegressor()

gb.fit(x_train,y_train)

feature_importance = gb.feature_importances_
feature_names = X.columns


# 根据特征重要性排序
indices = np.argsort(feature_importance)[::-1]  # 从大到小排序
sorted_feature_importance = feature_importance[indices]
sorted_feature_names = feature_names[indices]

# 可视化特征重要性
plt.figure(figsize=(12, 8))
sns.barplot(x=sorted_feature_importance, y=sorted_feature_names)
plt.title('梯度提升回归特征图')
plt.xlabel('重要性')
plt.ylabel('特征')
plt.show()

 

5.总结:

本项目通过描述性统计相关性分析聚类分析机器学习模型四个主要维度,深入探讨了影响睡眠质量的多种因素。研究得出以下关键结论:

  1. 描述性统计分析

  2. 心率变异性(HRV):平均值70.39,标准差19.58,最小值5.17,显示部分个体HRV波动较大。

  3. 体温:平均36.53°C,标准差0.50°C,最低35.03°C,总体波动在正常范围内。
  4. 睡眠中动作次数:平均2.01次,标准差0.97,最小值0,表明大多数人睡眠中存在轻微活动。
  5. 睡眠时长:平均7.47小时,标准差1.54小时,多数人睡眠时间在6-9小时之间。
  6. 睡眠质量评分:平均2.59分,标准差2.98,评分范围1-9分,反映睡眠质量个体差异显著。
  7. 咖啡因摄入量:平均148.26mg,标准差94.03mg,部分受试者完全不摄入咖啡因。
  8. 压力水平:平均4.94,标准差2.03,个体间压力水平差异明显。
  9. 就寝时间一致性:平均0.50,标准差0.20,表明就寝时间规律性分布广泛。
  10. 光照时长:平均8.04小时,标准差2.02小时,大多数人光照时间集中在6-10小时区间。

  11. 相关性分析

斯皮尔曼相关性分析揭示,睡眠质量评分与咖啡因摄入量呈强烈负相关(相关系数-0.81),表明咖啡因摄入量越高,睡眠质量倾向于越低。其他变量间关联性较弱或不显著。

  1. 聚类分析

K-Means聚类将数据分为5类,各类特征如下:

  • 聚类0:中等咖啡因摄入(166.36mg),较高HRV(70.77),平均睡眠质量(1.25分)。
  • 聚类1:最低咖啡因摄入(16.69mg),最高睡眠质量(8.64分),中等压力水平(4.86)。
  • 聚类2:最高咖啡因摄入(209.53mg),最长睡眠时间(8.86小时),但睡眠质量较低(1.14分)。
  • 聚类3:较高咖啡因摄入(173.39mg),最短睡眠时间(6.73小时),较低压力水平(3.70)。
  • 聚类4:最高HRV(85.52),中等咖啡因摄入(151.97mg),睡眠中活动最频繁(2.89次)。

  • 机器学习模型比较

  • Gradient Boosting模型表现最优,CV R2 Mean达0.9931,预测睡眠质量分数准确度极高。

  • 树基模型(Gradient Boosting、Random Forest、Decision Tree)整体表现优异,暗示数据可能存在复杂的非线性关系或特征交互。
  • 支持向量回归(SVR)性能介于树基模型和线性模型之间,能捕捉部分非线性关系。
  • 线性模型(Linear Regression、Ridge、Lasso、ElasticNet)表现相对欠佳,进一步证实数据中可能存在显著非线性关系。

  • 特征重要度分析

Gradient Boosting模型分析显示,咖啡因摄入量是影响睡眠质量的最关键因素,其重要性分数接近1。这一发现与先前的相关性分析结果高度一致,再次确认了咖啡因摄入量与睡眠质量之间的显著负相关关系。


http://www.kler.cn/news/368419.html

相关文章:

  • 对角双差速轮AGV平移、直行、转弯、原地旋转案例
  • 【零售和消费品&软件包】快递包装类型检测系统源码&数据集全套:改进yolo11-HSPAN
  • 【Android】perfetto使用学习
  • Minio文件服务器:SpringBoot实现文件上传
  • 13 Docker容器单机网络架构全攻略:使用自定义桥接的实践与探索
  • 大数据开发扩展shell 笔记
  • 《YOLO 目标检测》—— YOLO v3 详细介绍
  • Mybatis-plus-扩展功能
  • 【题解】—— LeetCode一周小结43
  • 《BLEU: a Method for Automatic Evaluation of Machine Translation》翻译
  • 数据库如何保证主键唯一性
  • Python如何处理zip压缩文件(Python处理zip压缩文件接口源码)
  • ES6面试题:(第二天)
  • 如何使用git上传项目至github。记一次上传github经历
  • Spring IoC DI
  • 基于NERF技术重建学习笔记
  • 算法 - 高精度算法(加减乘除)
  • 计算结构体及其中元素的大小
  • LeetCode Hot 100:二叉树
  • Face Swap API 的整合与使用手册
  • 【jvm】堆的内部结构
  • 【笔记】记一次因Spring版本和Tomcat版本不对应,造成Spring MVC项目启动后页面访问报404的问题
  • 动态规划-子序列问题——1218.最长定差子序列
  • Linux 进程间通信_匿名管道
  • 【c++丨STL】string模拟实现(附源码)
  • 智慧商城项目5-订单结算以及mixins混入与打包