欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > 数据分析每周挑战——睡眠质量影响因素研究

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

2024/10/28 4:36:28 来源:https://blog.csdn.net/qq_60688380/article/details/143182435  浏览:    关键词:数据分析每周挑战——睡眠质量影响因素研究

失踪人口回归

背景描述 :

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

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

数据说明:

字段说明
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   float641   体温          1000 non-null   float642   睡眠期间活动      1000 non-null   float643   睡眠时长        1000 non-null   float644   睡眠质量评分      1000 non-null   float645   咖啡因摄入量(毫克)  1000 non-null   float646   压力水平        1000 non-null   float647   睡眠规律性       1000 non-null   float648   日间光照时长      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 statsresult = {}
for i,col in enumerate(data.columns):stat,p = stats.shapiro(data[col])result[col] = pplt.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_scorestandardscaler = 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_splitX = 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_scorescaler = 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。这一发现与先前的相关性分析结果高度一致,再次确认了咖啡因摄入量与睡眠质量之间的显著负相关关系。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com