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

失踪人口回归

背景描述 :

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

本数据集为人工生成的数据集,目的是探究不同因素是如何影响睡眠质量和整体健康的。

本数据集模拟了多种情况,通过分析可以了解睡眠和健康之间可能存在的各种联系和变化,非常适合用来做预测分析和研究。

数据说明:

字段 说明
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.094489 | 0.989460 | 0.993129 |

|--------|----------|----------|----------|
| 随机森林回归 | 0.114615 | 0.987215 | 0.990399 |

|-------|----------|----------|----------|
| 决策树回归 | 0.174111 | 0.980578 | 0.986495 |

|--------|----------|----------|----------|
| 支持向量回归 | 2.889915 | 0.677634 | 0.709741 |

|------|----------|----------|----------|
| 线性回归 | 4.258074 | 0.525018 | 0.523725 |

|-----|----------|----------|----------|
| 岭回归 | 4.258149 | 0.525009 | 0.523734 |

|---------|----------|----------|----------|
| Lasso回归 | 5.334493 | 0.404945 | 0.406346 |

|--------|----------|----------|----------|
| 弹性网络回归 | 5.435240 | 0.393707 | 0.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。这一发现与先前的相关性分析结果高度一致,再次确认了咖啡因摄入量与睡眠质量之间的显著负相关关系。

相关推荐
終不似少年遊*1 小时前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
陆沙1 小时前
生物信息学导论-北大-RNA-Seq数据分析
数据分析·生物信息·生信
Watermelo6172 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
落魄君子11 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
落魄君子11 小时前
ELM分类-单隐藏层前馈神经网络(Single Hidden Layer Feedforward Neural Network, SLFN)
神经网络·分类·数据挖掘
Altair澳汰尔15 小时前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
qingyunliushuiyu21 小时前
企业为何需要可视化数据分析系统
数据挖掘·数据分析·数据采集·数据可视化·数据分析系统
dundunmm1 天前
数据挖掘之认识数据
人工智能·机器学习·信息可视化·数据挖掘
chenchihwen1 天前
数据分析时的json to excel 转换的好用小工具
数据分析·json·excel
江南野栀子1 天前
数据可视化-1. 折线图
信息可视化·数据挖掘·数据分析