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

失踪人口回归

背景描述 :

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

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

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

数据说明:

字段 说明
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 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
武子康5 小时前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
Q8137574606 小时前
数据挖掘在金融交易中的应用:民锋科技的智能化布局
人工智能·科技·数据挖掘
布说在见6 小时前
魅力标签云,奇幻词云图 —— 数据可视化新境界
信息可视化·数据挖掘·数据分析
Tianyanxiao7 小时前
如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选
大数据·人工智能·科技·数据分析·深度优先·零售
FIT2CLOUD飞致云8 小时前
仪表板展示|DataEase看中国:历年双十一电商销售数据分析
数据分析·开源·数据可视化·dataease·双十一
皓7418 小时前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
菜鸟的人工智能之路9 小时前
桑基图在医学数据分析中的更复杂应用示例
python·数据分析·健康医疗
阡之尘埃16 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
布说在见18 小时前
层次与网络的视觉对话:树图与力引导布局的双剑合璧
信息可视化·数据挖掘·数据分析