Вводная часть
В исследовании я взяла за основу таблицу «Набор данных о здоровье сна и образа жизни»: https://www.kaggle.com/datasets/uom190346a/sleep-health-and-lifestyle-dataset (Сайт: https://www.kaggle.com) В таблице представлена информация, полученная от 374 участников опроса. Таблица охватывает широкий спектр переменных, связанных с повседневными привычками, медицинскими показателями, индикаторами психологического комфорта, физического здоровья, со сном.
Мне было интересно проанализировать именно эти данные, так как, все что связано со здоровьем и здоровым образом жизни остается неизменно актуальным и привлекательным для широкой аудитории и для меня лично. В современном мире осознание влияния образа жизни человека на его здоровье считается очевидным фактом. Однако, остается множество вопросов относительно того, какие конкретные факторы и каким образом влияют на здоровье и качество жизни человека. На основе данных таблицы, можно попробовать проанализировать некоторые параметры, чтобы выявить их взаимосвязь и/или влияние на возникновения нарушений сна, а также же отсутствие их взаимосвязи и/или влияния на возникновения нарушений сна.
Для того чтобы структурировать анализ мной была выдвинута гипотеза: Есть профессии, в которых высокий уровень стресса, возможно для этих же профессий характерно большое количество нарушений сна.
Этапы работы
Чтобы понять существует ли влияние уровня стресса в профессии на сон: В первую очередь надо определиться какие на примере каких профессий будет проводиться анализ, потому что проанализировать все было бы сложно. Так, я определила насколько часто в таблице встречается каждая из профессий и выбрала для исследования 2 наиболее (Врачи и медсестры) и 2 наименее (менеджеры и менеджеры по продажам) часто встречающиеся.
код 1
from matplotlib import pyplot as plt import seaborn as sns df.groupby('Occupation').size().plot(kind='barh', color=sns.palettes.mpl_palette('Set2')) plt.gca().spines[['top', 'right',]].set_visible(False)

Далее я определила средний уровень стресса для каждой из выбранных профессий.
Первые два графика - Гистограммы. Этот тип графика позволяет продемонстрировать различные наборы данных в сравнении.
код 2
import matplotlib.pyplot as plt plt.style.use('seaborn-deep')
doctors_stress = df[df['Occupation'] == 'Doctor']['Stress Level'].mean() nurses_stress = df[df['Occupation'] == 'Nurse']['Stress Level'].mean() managers_stress = df[df['Occupation'] == 'Manager']['Stress Level'].mean() sales_reps_stress = df[df['Occupation'] == 'Sales Representative']['Stress Level'].mean()
occupation_stress_levels = [doctors_stress, nurses_stress, managers_stress, sales_reps_stress]
occupation_names = ['Doctor', 'Nurse', 'Manager', 'Sales Representative']
colors = plt.get_cmap('Set2')(np.linspace(0, 1, len(occupation_names))) plt.barh(occupation_names, occupation_stress_levels, color=colors)
plt.title('Stress Level Distribution by Occupation') plt.xlabel('Stress Level') plt.ylabel('Occupation')
plt.show()
Затем выявила процент нарушений сна для каждой группы профессий.
Для этого сравнения я использовала круговые диаграммы, они дают увидеть какой вклад в общую статистику вносит каждая из категорий. Для большей наглядности я добавила "взрыв", сильнее отделяющий части графика друг от друга. Также ко всем графикам я применила цветовую палитру "Set2" так как она, по моему мнению, лучше всего подходит выбранной теме.
код 3
managers_and_sales_df = df[df['Occupation'].isin(['Manager', 'Sale Representative'])]
sleep_disorders = managers_and_sales_df['Sleep Disorder'].value_counts(dropna=False)
labels = sleep_disorders.index sizes = sleep_disorders.values explode = (0.1,) * len(sizes)
fig1, ax1 = plt.subplots()
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=False, startangle=90)
ax1.axis('equal')
colors = cm.get_cmap('Set2')(np.linspace(0, 1, len(sizes)))
for i in range(len(sizes)): ax1.patches[i].set_facecolor(colors[i])
plt.show()
код 4
doctors_and_nurses_df = df[df['Occupation'].isin(['Doctor', 'Nurse'])]
sleep_disorders = doctors_and_nurses_df['Sleep Disorder'].value_counts(dropna=False)
labels = sleep_disorders.index
sizes = sleep_disorders.values
explode = (0.1,) * len(sizes)
fig1, ax1 = plt.subplots()
ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=False, startangle=90)
ax1.axis('equal')
colors = cm.get_cmap('Set2')(np.linspace(0, 1, len(sizes)))
for i in range(len(sizes)): ax1.patches[i].set_facecolor(colors[i])
plt.show()
В процессе работы я обращалась к нескольким нейросетям.
- С помощью Chat GPT3.5 я узнала как проанализировать представителей не только одной профессии за раз, а четырех, так как этого не было показано в лекции курса. Используемый промпт: I have this code: doctors__df = df.loc[df['Occupation'] == 'Doctor'] sleep_disorders = doctors__df['Sleep Disorder'].value_counts()
how do I make it so that it analyzes not only "Doctor" but also "Nurse"?
- Столкнувшись с ошибкой при написании кода я скопировала текст ошибки и попросила Chat GPT3.5 объяснить её, на что получила ответ: Ошибка "TypeError: object of type 'ListedColormap' has no len()" указывает на то, что вы пытаетесь применить функцию len() к объекту типа ListedColormap, который не имеет длины. В данном случае, вы пытаетесь использовать plt.get_cmap('Set2') как цвет для каждого бара в графике, но ListedColormap не может быть использован напрямую как цвет.
Чтобы исправить эту ошибку, вы должны использовать ListedColormap.colors, который возвращает список цветов, используемых в цветовой схеме.
- Обложка для проекта была создана в Leonardo.Ai по промпту: A simple minimalistic cover for a sleep quality and disease analysis proje
Вывод
В ходе анализа выяснилось, что какое-либо расстройство сна присутствует у 50% докторов и медсестер и у 0% менеджеров и менеджеров по продажам. При этом четкой зависимости от уровня стресса и наличия расстройств сна обнаружено не было. Так, моя гипотеза не подтвердилась и можно сделать вывод об отсутствии связи между уровнем стресса и количеством нарушений сна в профессии. Тем не менее, мой анализ нельзя считать полностью достоверным, так как он выполнялся на основе ограниченного количества данных
