睡眠健康数据分析

1章 数据收集

1.1 数据获取方法

本数据集是从CSDN编程社区中名为睡眠数据集中下载得来的,作者为程序员奇奇,在许多个平台中寻找数据集后,选择了这个数据集。

数据集链接:

https://download.csdn.net/download/pythonyanyan/88017459

1.2 原始数据集展示和说明

图1

本数据集有13个属性,374个样本,数据集信息比较完整,如图1。在表中有多个数据属性可以去清晰地看见各个样本的数据信息,主要关注的属性是性别、职业、睡眠质量、身体活动水平、压力水平、BMI、血压、心率、每日步数、睡眠障碍。主要研究的方向是睡眠的影响因素,通过对数据的可视化分析哪些属性对睡眠有影响。

  1. 数据处理

2.1 数据预处理

使用df.isnull()函数查看数据集是否含有空缺值,发现数据集不含有空缺值。在使用df.isnull().sum()对缺失值进行统计查看得到数据集不含空置,如图2。

图2

删除无用列df = df.drop('ID', axis=1),如图3。

图3

2.2 描述应统计

在处理数据集前,要了解数据的详细信息,使用df.info()函数获取数据集详细信息。

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 374 entries, 0 to 373

Data columns (total 13 columns):

ID        374 non-null int64

性别        374 non-null object

年龄        374 non-null int64

职业        374 non-null object

睡眠时长      374 non-null float64

睡眠质量      374 non-null int64

身体活动水平    374 non-null int64

压力水平      374 non-null int64

BMI       374 non-null object

血压        374 non-null object

心率        374 non-null int64

每日步数      374 non-null int64

睡眠障碍      374 non-null object

dtypes: float64(1), int64(7), object(5)

memory usage: 38.1+ KB

使用df.ndim得到数据集维度为2,使用df.describe()函数统计个属性的统计数据,如图4。

 

图4

统计一些属性在数据集中的数量,使用df.describe()函数统计数量,如图5。

图5

  1. 数据可视化分析

3.1 单个属性的可视化

①性别可视化

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

gender_count = df['性别'].value_counts()

print(gender_count)

plt.pie(gender_count,labels=gender_count.index,autopct='%1.1f%%',colors=[custom_colors[ 2], custom_colors[0]])

plt.title('性别分布')

plt.show()

首先,plt.figure(figsize=(5, 5))创建一个指定大小的图形画布。接着,gender_count = df['性别'].value_counts()统计数据框df中‘性别’列不同值的出现频次。print(gender_count)便于查看统计结果。然后,plt.pie()依据频次绘制饼图,用labels添加类别标签,autopct展示占比,colors设置颜色。plt.title('性别分布')为饼图添加标题使其表意清晰。最后,plt.show()将绘制好的饼图展示出来,实现数据可视化。

②职业可视化

sns.countplot(data = df, x = '职业', palette=custom_colors)

首先,sns.countplot(data = df, x = '职业', palette=custom_colors)利用seaborn库按df数据框里‘职业’列分类统计数量,并通过palette参数赋予自定义颜色。接着,plt.ylabel("数量")明确纵轴代表含义。年龄和睡眠时长和职业使用的可视化方法一致。

③睡眠质量

df['睡眠质量'].value_counts()

sns.countplot(x='睡眠质量',data= df,order= df['睡眠质量'].value_counts().index)

首先,df['睡眠质量'].value_counts()统计了数据框df中‘睡眠质量’列各值出现的频次。接着,sns.countplot(x='睡眠质量', data= df, order= df['睡眠质量'].value_counts().index)以‘睡眠质量’为分类依据,绘制计数柱状图,且依据频次顺序排列横坐标类别,使图表更有条理。压力水平和睡眠质量的方法是一致的。

④BMI可视化

plt.pie(BMI,labels=['正常','超重','肥胖'],autopct='%1.1f%%',explode=[0,0,0.2])

首先,plt.pie(BMI,labels=['正常','超重','肥胖'],autopct='%1.1f%%',explode=[0,0,0.2])利用matplotlib库绘制饼图,BMI数据决定各部分占比,设置对应类别标签,通过autopct展示各部分占比数值,且让代表‘肥胖’的部分突出显示(explode参数作用),使其更醒目。

⑤睡眠障碍可视化

plt.figure(figsize=(8,6))

df['睡眠障碍'].value_counts().plot(kind='bar')

通过plt.figure(figsize=(8,6))创建了一个宽度为 8、高度为 6 的图形画布,为后续绘图设定了合适的展示空间。接着,利用df['睡眠障碍'].value_counts()统计出数据框df里‘睡眠障碍’列不同值的出现频次,再调用plot(kind='bar')方法将其以柱状图的形式进行绘制,直观呈现不同睡眠障碍类型对应的数量情况。

3.2多个属性结合可视化

①睡眠障碍和睡眠时长可视化

sns.boxplot(x = "睡眠障碍",  y = "睡眠时长", data = df)

plt.show()

这里使用seaborn里的函数boxplot绘制箱线图,x 参数指定了箱线图的横坐标变量,这里设置为数据框 df 中的 “睡眠障碍” 列。y 参数指定了纵坐标变量,即 “睡眠时长” 列。data = df 表示指定了数据来源是名为 df 的数据框,这个数据框应该包含了 “睡眠障碍” 和 “睡眠时长” 这两个列,并且已在之前的代码中正确定义和加载好数据。

②性别和睡眠障碍的可视化

sns.countplot(x='性别', data = df, hue='睡眠障碍')

plt.show()

这里使用的是seaborn里的函数countplot绘制柱状图,职业与睡眠障碍的关系的可视化与这里用的方法一致。

③职业与压力水平的可视化

stress_by_occupation = df.groupby('职业', as_index=False)['压力水平'].mean()

stress_by_occupation

sns.barplot(x='压力水平', y='职业', data=stress_by_occupation.sort_values('压力水平', ascending=False))

通过 groupby 操作依据 “职业” 对数据框 df 中的 “压力水平” 进行分组,并计算每组的均值,将结果存储在 stress_by_occupation 中。接着使用 seaborn 的 barplot 函数,以 “压力水平” 为横坐标、“职业” 为纵坐标绘制条形图,且按压力水平降序排列数据来展示,能直观呈现不同职业的平均压力水平差异,便于对比分析各职业压力状况。身体活动与压力水平的关系可视化与这里一致。

④压力水平与睡眠质量的可视化

sns.regplot(x='压力水平', y='睡眠质量', data=df)

使用了 seaborn 库(通常简称为 sns)中的 regplot 函数来绘制回归图。其作用是以数据框 df 中的 “压力水平” 列作为自变量(对应 x 轴),“睡眠质量” 列作为因变量(对应 y 轴)进行分析并可视化展示。

⑤心率与BMI可视化

df['心率'].plot(kind='kde')

该代码 df['心率'].plot(kind='kde') 借助 pandas 绘图功能,选取 df 数据框里的 “心率” 列。plot 方法调用 matplotlib 绘制图形,kind='kde' 设定绘制核密度估计图。此图以平滑曲线呈现 “心率” 数据分布,能清晰展现其集中区间,如单峰或双峰形态等。

日常步数与Blodd压力的可视化与这里的方法一致。

⑥热力图

numeric_df = df.select_dtypes(include=['float64', 'int64'])

correlation_matrix = numeric_df.corr()

plt.figure(figsize=(10, 8))

sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")

首先,通过 df.select_dtypes(include=['float64', 'int64']) 从数据框 df 中筛选出浮点型和整型的数值列,存储在 numeric_df 里,确保后续分析针对合适的数据类型。接着,利用 correlation_matrix = numeric_df.corr() 计算这些数值列两两之间的相关系数,形成相关系数矩阵。然后,设置图形大小并调用 sns.heatmap,以直观的热力图展示矩阵,annot=True 显示系数数值,cmap='coolwarm' 定义颜色,fmt=".2f" 规范格式,便于观察变量关联强弱。

3.3可视化分析

图6,中展示的是性别的分布情况,这里统计了男女的数量,在饼状图中展示了其在本数据集中的占比,清晰的看到了在这个数据集中男女的比例相差不大,比例大概在1:1左右。

图6

下面是职业的柱状图,如图7。这里展示了数据集中的所有职业,共有11个其中医生、老师、护士、工程师、会计师、律师等,数量大于等于30,软件工程师、销售代表、会计师、科学家、营业员、主管等,数量低于10,这些职业都是一些工作的内容较为复杂并且工作任务很繁重的。对于这些人就要格外关注一些生活上的事情,尤其像睡眠这类的,很容易影响其工作上的事。

图7

下面要分析的是年龄,如图8。整个数据集的年龄范围在27-59岁之间,总体倾向与中年阶段。

图8

下面是关于睡眠时长的,如图9。从图中可以看到在6.0-6.1,6.5-6.6,7.1-7.2,7.7-7.8,这些时间段的人数较多,看可以看出总体的睡眠状况还是较好的。

图9

下一个是睡眠质量的分布,如图10。在图中可以清晰的看出睡眠质量排序为8、6、7、9、5、4可以看出总体睡眠质量较好,睡眠质量差的较少。

图10

下面是压力水平,如图11。从图中可以看出,压力水平为 3 和 4 时的计数最高,表明在这些压力水平下的数据点数量最多;而压力水平为 6 时的计数相对较低。这张图可以帮助我们直观地了解压力水平的分布情况,可能用于分析某种现象或人群在不同压力水平下的表现。

图11

下面是BMI,如图12。正常:占比 57.8%,在图中用蓝色表示。这表明大部分人(超过一半)的 BMI 处于正常范围。超重:占比 39.6%,在图中用绿色表示。这是第二大群体,有相当一部分人的 BMI 处于超重范围。肥胖:占比 2.7%,在图中用红色表示。这是占比最小的群体,只有一小部分人的 BMI 处于肥胖范围。从图中可以看出,正常 BMI 的人群占比最多,其次是超重人群,肥胖人群占比最少。这种分布可以帮助我们了解该样本中不同 BMI 类别的比例情况,对于健康管理和统计分析有一定的参考价值。

图12

下面是睡眠障碍,如图13。从图中可以看出,没有睡眠障碍的人群数量最多,而有轻度睡眠障碍和失眠问题的人群数量相对较少且接近。这张图可以帮助我们直观地了解不同睡眠状态的人群分布情况。

图13

下面是睡眠障碍和睡眠时长的箱线图,如图14。从图中可以看出,无睡眠障碍和睡眠呼吸暂停的睡醒时长中位数相似,而失眠的睡醒时长中位数较低,且存在一个较低的异常值。这表明失眠可能会导致睡醒时长减少。

图14

下面是性别与睡眠障碍的柱状图,如图15。男性中无睡眠障碍的人数远高于女性,而女性在睡眠呼吸暂停和失眠方面的人数相对较多。男性和女性在失眠方面的人数较为接近,而在无睡眠障碍和睡眠呼吸暂停方面的人数差异较大。这张图通过直观的柱状图展示了性别与睡眠障碍类型之间的关系,有助于分析不同性别在睡眠障碍方面的差异。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏日里的阴雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值