失踪人口回归
背景描述 :
在当今社会,越来越多的人开始关注睡眠与健康之间的紧密联系。随着可穿戴设备技术的发展,人们可以更精确地追踪自己的睡眠模式和健康状况,从而更好地理解睡眠质量对日常生活的实际影响。
本数据集为人工生成的数据集,目的是探究不同因素是如何影响睡眠质量和整体健康的。
本数据集模拟了多种情况,通过分析可以了解睡眠和健康之间可能存在的各种联系和变化,非常适合用来做预测分析和研究。
数据说明:
字段 | 说明 |
---|---|
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.总结:
本项目通过描述性统计 、相关性分析 、聚类分析 和机器学习模型四个主要维度,深入探讨了影响睡眠质量的多种因素。研究得出以下关键结论:
-
描述性统计分析
-
心率变异性(HRV):平均值70.39,标准差19.58,最小值5.17,显示部分个体HRV波动较大。
-
体温:平均36.53°C,标准差0.50°C,最低35.03°C,总体波动在正常范围内。
-
睡眠中动作次数:平均2.01次,标准差0.97,最小值0,表明大多数人睡眠中存在轻微活动。
-
睡眠时长:平均7.47小时,标准差1.54小时,多数人睡眠时间在6-9小时之间。
-
睡眠质量评分:平均2.59分,标准差2.98,评分范围1-9分,反映睡眠质量个体差异显著。
-
咖啡因摄入量:平均148.26mg,标准差94.03mg,部分受试者完全不摄入咖啡因。
-
压力水平:平均4.94,标准差2.03,个体间压力水平差异明显。
-
就寝时间一致性:平均0.50,标准差0.20,表明就寝时间规律性分布广泛。
-
光照时长:平均8.04小时,标准差2.02小时,大多数人光照时间集中在6-10小时区间。
-
相关性分析
斯皮尔曼相关性分析揭示,睡眠质量评分与咖啡因摄入量呈强烈负相关(相关系数-0.81),表明咖啡因摄入量越高,睡眠质量倾向于越低。其他变量间关联性较弱或不显著。
- 聚类分析
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。这一发现与先前的相关性分析结果高度一致,再次确认了咖啡因摄入量与睡眠质量之间的显著负相关关系。