Original size 735x1058

Анализ данных о сне и образе жизни

PROTECT STATUS: not protected
10

Концепция

big
Original size 1454x430

Для анализа я выбрала Sleep Health and Lifestyle Dataset, содержащий 400 записей и 13 различных показателей, включая продолжительность и качество сна, уровень стресса, физическую активность, индекс массы тела, артериальное давление и другие биометрические данные. Этот набор данных особенно интересен тем, что позволяет исследовать взаимосвязь между качеством сна и различными аспектами образа жизни.

Прикрепить карточку Объем данных достаточно велик для проведения статистического анализа и построения значимых визуализаций, а разнообразие параметров позволяет выявить как очевидные, так и неочевидные корреляции.

Процесс обработки данных

big
Original size 1260x430

Первичная обработка 1. Сначала я загрузила датасет с помощью библиотеки Pandas:

import pandas as pd df = pd.read_csv («Sleep_health_and_lifestyle_dataset.csv»)

2. Далее провела исследование структуры данных, используя методы:

df.info () # для анализа типов данных и выявления пропусков df.describe () # для получения статистических показателей df.isnull ().sum () # для точного подсчета пропущенных значений

3. Для удобства анализа преобразовала столбец с артериальным давлением, разделив его на два отдельных показателя:

bp_split = df[«Blood Pressure»].str.split («/», expand=True) df[«Systolic_BP»] = pd.to_numeric (bp_split[0], errors="coerce») df[«Diastolic_BP»] = pd.to_numeric (bp_split[1], errors="coerce») df.drop (columns=[«Blood Pressure»], inplace=True)

Это позволило провести более детальный анализ связи показателей давления с другими факторами.

Настройка единого стиля визуализаций

Original size 1528x430

Для создания уникального и согласованного визуального стиля я разработала специальную цветовую палитру и настройки оформления графиков:

COLORS = { 'primary': '#3498DB', # синий — основной цвет (сон) 'secondary': '#2ECC71', # зеленый — здоровье 'accent': '#E74C3C', # красный — проблемы/стресс 'neutral': '#95A5A6', # серый — нейтральные данные 'highlight': '#F39C12', # оранжевый — выделения }

Для применения единого стиля ко всем графикам разработала две функции: 1. set_sleep_visualization_style () — настраивает общие параметры для всех графиков 2. style_axes (ax, title, xlabel, ylabel) — применяет стиль к конкретным осям

Эти функции позволили создать визуализации в едином минималистичном стиле, вдохновленном эстетикой Apple, что значительно улучшило читаемость и эстетику графиков по сравнению со стандартными настройками Python.

Создание визуализаций

1. Гистограмма распределения продолжительности сна

Original size 1184x684

Для анализа распределения часов сна среди участников исследования я создала гистограмму с наложенной линией плотности:

Получение данных о продолжительности сна sleep_duration_data = df[«Sleep Duration»] Plain Text Создание гистограммы с наложением кривой плотности sns.histplot (sleep_duration_data, bins=15, kde=True, color=COLORS['primary'], edgecolor="white», linewidth=1, alpha=0.8, ax=ax) Добавление статистических показателей mean_sleep = sleep_duration_data.mean () median_sleep = sleep_duration_data.median () ax.axvline (mean_sleep, color=COLORS['accent'], linestyle='--', linewidth=2, label=f’Среднее: {mean_sleep:.2f} ч') ax.axvline (median_sleep, color=COLORS['secondary'], linestyle='-.', linewidth=2, label=f’Медиана: {median_sleep:.2f} ч')

Для улучшения визуального восприятия я добавила вертикальные линии, показывающие среднее и медианное значение продолжительности сна, а также настроила полупрозрачность столбцов для лучшей видимости линии плотности.

2. Диаграмма размаха качества сна по категориям BMI

Original size 1184x684

Для изучения взаимосвязи между индексом массы тела и качеством сна я создала boxplot с наложенным swarmplot:

Получение данных о BMI и качестве сна bmi_categories = df[«BMI Category»] sleep_quality = df[«Quality of Sleep»] Создание boxplot sns.boxplot (x=bmi_categories, y=sleep_quality, palette=[COLORS['primary'], COLORS['secondary'], COLORS['highlight'], COLORS['accent']], linewidth=1.5, ax=ax) Наложение swarmplot для отображения фактических точек данных sns.swarmplot (x=bmi_categories, y=sleep_quality, color='black', alpha=0.5, size=4, ax=ax)

Такой подход позволил одновременно отобразить как статистические характеристики распределения (медиану, квартили, выбросы), так и Plain Text Plain Text конкретные значения для каждого участника, что дает более полное представление о данных.

3. Scatter диаграмма: продолжительность сна и уровень стресса

Original size 1184x684

Для анализа взаимосвязи между часами сна и уровнем стресса я использовала regplot, который позволяет одновременно отобразить точки и линию регрессии:

Получение данных о продолжительности сна и уровне стресса sleep_duration = df[«Sleep Duration»] stress_level = df[«Stress Level»] Создание regplot с настройкой внешнего вида точек и линии регрессии sns.regplot (x=sleep_duration, y=stress_level, scatter_kws={'color': COLORS['secondary'], 'edgecolor': 'white', 's': 80, 'alpha': 0.7}, line_kws={'color': COLORS['accent'], 'linewidth': 2}, ax=ax) Расчет и отображение коэффициента корреляции corr = sleep_duration.corr (stress_level) ax.annotate (f’Корреляция: {corr:.2f}', xy=(0.75, 0.95), xycoords='axes fraction', fontsize=12, fontweight='bold', bbox=dict (boxstyle="round, pad=0.3», fc=COLORS['neutral'], alpha=0.3))

Для повышения информативности графика я добавила значение коэффициента корреляции в аннотации, что сразу дает количественную оценку силы связи между переменными.

4. Столбчатая диаграмма распределения типов расстройств сна

Original size 1184x684

Для анализа частоты различных нарушений сна я создала столбчатую диаграмму с подписями абсолютных и относительных значений:

Получение данных о расстройствах сна и их подсчет sleep_disorder_counts = df[«Sleep Disorder»].value_counts () Создание цветовой карты в зависимости от серьезности нарушения colors = [COLORS['primary'], COLORS['highlight'], COLORS['accent']] if len (sleep_disorder_counts) < len (colors): colors = colors[: len (sleep_disorder_counts)]

Создание диаграммы с настройкой внешнего вида столбцов bars = ax.bar (sleep_disorder_counts.index, sleep_disorder_counts.values, color=colors, edgecolor="white», linewidth=1.5, alpha=0.8) Добавление подписей с количеством и процентами total = sleep_disorder_counts.sum () for bar in bars: height = bar.get_height () percentage = (height / total) * 100 ax.text (bar.get_x () + bar.get_width ()/2., height + 0.1, f'{int (height)}\n ({percentage:.1f}%)', ha='center', va='bottom', fontsize=12, fontweight='bold')

Я добавила процентные значения над каждым столбцом для лучшего сравнения пропорций различных расстройств, а также использовала различные цвета для визуального разделения категорий.

5. Тепловая карта корреляций между числовыми переменными

Original size 1133x979

Для комплексного анализа взаимосвязей между всеми числовыми переменными я создала тепловую карту корреляций:

Выбор только числовых переменных numeric_df = df.select_dtypes (include='number') correlation_matrix = numeric_df.corr () Создание маски для верхнего треугольника mask = np.triu (np.ones_like (correlation_matrix, dtype=bool)) Создание собственной цветовой карты colors = [COLORS['primary'], 'white', COLORS['highlight']] custom_cmap = LinearSegmentedColormap.from_list («custom_blue_orange», colors, N=256) Построение тепловой карты sns.heatmap (correlation_matrix, mask=mask, annot=True, fmt=».2f», cmap=custom_cmap, linewidths=0, cbar_kws={"shrink»: .8}, square=True, ax=ax, vmin=-1, vmax=1) Выделение важных корреляций (по модулю > 0.5) for i in range (len (correlation_matrix.columns)): for j in range (i): if abs (correlation_matrix.iloc[i, j]) > 0.5: ax.add_patch (plt.Rectangle ((j, i), 1, 1, fill=False, edgecolor='black', lw=2))

Для улучшения читаемости я создала кастомную цветовую схему, настроила отображение только нижнего треугольника матрицы (для избежания дублирования информации) и добавила рамки вокруг ячеек с сильной корреляцией (>0.5 по модулю).

Результаты анализа и выводы

На основе проведенного анализа я выявила несколько значимых закономерностей:

1. Распределение продолжительности сна показало, что большинство людей в выборке спят 6-7 часов, что меньше рекомендуемых 8 часов. Это может указывать на общую тенденцию к недосыпанию. 2. Качество сна зависит от индекса массы тела: люди с нормальным весом сообщают о более высоком качестве сна по сравнению с людьми, страдающими ожирением. 3. Существует отрицательная корреляция между продолжительностью сна и уровнем стресса (-0.83): чем дольше человек спит, тем ниже у него уровень стресса. Это подтверждает гипотезу о важности достаточного сна для психологического благополучия. 4. Бессонница и апноэ сна представлены примерно в равных пропорциях среди испытуемых с нарушениями сна, что указывает на необходимость равного внимания к обоим состояниям. 5. Тепловая карта корреляций выявила несколько важных взаимосвязей: - Положительная связь между продолжительностью сна и его качеством (0.86) - Сильная положительная корреляция между физической активностью и количеством шагов (0.92) - Умеренная положительная корреляция возраста с артериальным давлением (0.41 и 0.43) - Связь между стрессом и частотой сердечных сокращений (0.33)

Эти результаты подтверждают важность комплексного подхода к здоровому образу жизни: сон, физическая активность, контроль веса и уровня стресса взаимосвязаны и влияют друг на друга. Особенно важно отметить сильную связь между продолжительностью сна и уровнем стресса, что может служить основой для практических рекомендаций по улучшению психологического благополучия.

Заключение

Original size 1454x430

Проект показал, что даже относительно небольшой набор данных (400 записей) может дать значимые результаты при правильном анализе. Применение комплексного подхода к визуализации данных, включающего различные типы графиков и единый стиль оформления, позволило наглядно представить выявленные закономерности и сделать их доступными для понимания.

В процессе работы я применила различные техники обработки данных и визуализации в Python, включая трансформацию данных, кастомизацию графиков и статистический анализ, что демонстрирует полученные в ходе обучения навыки.

Блокнот с кодом и датасет:

Анализ данных о сне и образе жизни
10
We use cookies to improve the operation of the website and to enhance its usability. More detailed information on the use of cookies can be fo...
Show more