Original size 1140x1600

Анализ уровня счастья в странах

PROTECT STATUS: not protected
The project is taking part in the competition

Концепция

В свете последних событий иногда кажется, что мир наполнен только негативом, нетерпимостью, несчастьем, и что на Земле почти не осталось мест, где люди по-настоящему счастливы.

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

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

big
Original size 1750x424

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

Данные получены с сайта «Our World in Data», первоначально основанного на «Wellbeing Research Centre», и охватывает 260 стран в период с 2011–2024 гг. (доступность данных варьируется, так как не всегда информация доступна у всех стран в каждом году)

В визуализации использованы следующие виды диаграмм:

  1. столбчатая диаграмма
  2. точечная диаграмма
  3. горизонтальная столбчатая диаграмма
  4. линейная диаграмма
big
Original size 1750x424

Визуальный стиль вдохновлен игровой эстетикой 80х годов: пиксель-арт, ограниченность, но яркость палитры, космическая тематика в контексте оптимистичного футуризма.

При создании обложки был частично использован ChatGPT, а также графический инструмент Adobe Photoshop. Палитра взята из обложки проекта.

Original size 1750x424

a2e235, ffe300, 022780, d9b68a

Original size 1750x424

Использованный шрифт

Работа с данными

Для анализа были использованы такие переменные как: удовлетворенность жизнью, измеренная по шкале Кантрила — индикатор, основанный на опросе респондентов, оценивших общее качество жизни от 0(худшее значение) до 10(наилучшее значение) — экономические условия через ВВП на душу населения, измеренные в покупательской способности и вычисленные в долларе 2021 г для сопоставления различных стран в дифференцированном контексте времени.

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

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import numpy as np import statsmodels.api as sm

Между ними я установила шрифт для будущих диаграмм:

from matplotlib import font_manager, rcParams

font_path = «BBHHegarty.ttf» font_manager.fontManager.addfont (font_path)

custom_font = font_manager.FontProperties (fname=font_path) rcParams[«font.family»] = custom_font.get_name ()

df = pd.read_csv («gdp-vs-happiness.csv»)

df = df[(df[«Year»] >= 2011) & (df[«Year»] <= 2024)]

df = df.dropna (subset=[ «Cantril ladder score», «GDP per capita, PPP (constant 2021 international $)» ])

df.head ()

Original size 1750x424

Диаграмма 1

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

На первой картинке изображена горизонтальная столбчатая диаграмма со средними значениями удовлетворенности в период с 2011 по 2024 год. В столбцах года и континента указан средний показатель по Кантрилу, вычисленный усреднением данных по странам в регионе. Таким образом, визуализация позволяет сравнивать как уровни, так и изменения значений во времени на разных континентах.

continents = [ «Africa», «Asia», «Europe», «North America», «South America», «Oceania» ] df = pd.read_csv («gdp-vs-happiness.csv») df.columns = df.columns.str.strip ()

df_continents = df[df[«Entity»].isin (continents)].copy ()

selected_years = [2011, 2014, 2017, 2020, 2022, 2024]

df_sel = df_continents[df_continents[«Year»].isin (selected_years)].copy ()

life_sat = df_sel.dropna (subset=[«Cantril ladder score»])

year_palette = { 2011: «#a1071f», 2014: «#f06b04», 2017: «#022780», 2020: «#d9b68a», 2022: «#a2e235», 2024: «#ffe300» }

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

sns.barplot ( data=life_sat, x="Cantril ladder score», y="Entity», hue="Year», palette=year_palette )

plt.title ( «Life Satisfaction by Continent Over Time», fontproperties=custom_font, fontsize=16, color=»#022780» ) plt.xlabel ( «Cantril Ladder Score», fontproperties=custom_font, fontsize=12, color=»#022780» ) plt.yticks ( fontproperties=custom_font, fontsize=11, color=»#022780» ) plt.legend ( title="Year», prop=custom_font, title_fontproperties=custom_font ) plt.tight_layout () plt.show ()

Original size 984x584

горизонтальная столбчатая диаграмма

По диаграмме видно, что траектории различаются по регионам: Европа и Океания сохраняют за собой самые высокие средние значения с относительно небольшими колебаниями во времени. В Северной Америке наблюдается незначительное снижение удовлетворенности в более поздние годы. В Южной Америке также наблюдается снижение показателей особенно по сравнению с серединой 2010х годов. В Азии виден умеренный рост за взятый период, в то время как в Африке показатель остается низким, а изменения незначительны.

Диаграмма 2

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

start_year, end_year = 2011, 2024

df_c = df[df[«Code»].notna ()].dropna (subset=[«Cantril ladder score»]).copy ()

start = (df_c[df_c[«Year»] == start_year][[«Entity», «Cantril ladder score»]] .rename (columns={"Cantril ladder score»: «score_start"}))

end = (df_c[df_c[«Year»] == end_year][[«Entity», «Cantril ladder score»]] .rename (columns={"Cantril ladder score»: «score_end"}))

change = start.merge (end, on="Entity», how="inner») change[«delta»] = change[«score_end»] — change[«score_start»]

most_up = change.sort_values («delta», ascending=False).iloc[0][«Entity»] most_down = change.sort_values («delta», ascending=True).iloc[0][«Entity»]

print («Most increasing:», most_up) print («Most decreasing:», most_down)

global_trend = ( df.groupby («Year»)[«Cantril ladder score»] .mean () .reset_index () .rename (columns={"Cantril ladder score»: «Global average"}) )

def get_country_trend (country_name, label=None): out = ( df[df[«Entity»] == country_name] .groupby («Year»)[«Cantril ladder score»] .mean () .reset_index () ) out = out.rename (columns={"Cantril ladder score»: label or country_name}) return out

russia_trend = get_country_trend («Russia», «Russia») up_trend = get_country_trend (most_up, f"Most increase: {most_up}») down_trend = get_country_trend (most_down, f"Most decrease: {most_down}»)

comparison = (global_trend .merge (russia_trend, on="Year», how="inner») .merge (up_trend, on="Year», how="inner») .merge (down_trend, on="Year», how="inner»))

comparison_long = comparison.melt ( id_vars="Year», var_name="Series», value_name="Cantril ladder score» )

plt.figure (figsize=(9,5)) series_palette = { «Global average»: «#022780», «Russia»: «#ffe300», up_trend.columns[1]: «#a2e235», down_trend.columns[1]: «#d9b68a» } sns.lineplot ( data=comparison_long, x="Year», y="Cantril ladder score», hue="Series», palette=series_palette, marker="o», linewidth=2 )

plt.title («Life Satisfaction: Global vs Russia vs Biggest Changes (2011–2024)») plt.ylabel («Cantril Ladder Score») plt.xlabel (»») plt.ylim (0, 10) plt.tight_layout () plt.show ()

Original size 884x484

линейная диаграмма

Диаграмма 3

Для следующей визуализации мы распределяем страны в соответствии с их показателями по Кантрилу за последний год выборки (2024г). Этот рейтинг позволяет выделить 10 стран с самым высоким показателем и 10 стран с самым низким, при этом Россия включена в качестве точки для сравнения. Диаграмма предоставляет простой, но показательный способ выделения крайних значений. Четко видна существенная разница между странами высоких и низких показателей, что указывает на выраженное неравенство в установленном субъективном благополучии.

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

latest_year = df[«Year»].max ()

latest = df[ (df[«Year»] == latest_year) & (df[«Code»].notna ()) ].copy ()

top10 = ( latest.sort_values («Cantril ladder score», ascending=False) .head (10) .assign (Group="Top 10») )

bottom10 = ( latest.sort_values («Cantril ladder score», ascending=True) .head (10) .assign (Group="Bottom 10») ) russia = ( latest[latest[«Entity»] == «Russia»] .assign (Group="Russia») )

top_bottom_russia = pd.concat ([top10, bottom10, russia])

order = ( top_bottom_russia .sort_values («Cantril ladder score»)[«Entity»] )

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

palette = { «Top 10»: «#a2e235», «Bottom 10»: «#d9b68a», «Russia»: «#ffe300» }

sns.barplot ( data=top_bottom_russia, x="Entity», y="Cantril ladder score», hue="Group», order=order, dodge=False, palette=palette )

plt.title (f"Top 10, Bottom 10, and Russia by Life Satisfaction ({latest_year})») plt.ylabel («Cantril Ladder Score») plt.xlabel (»») plt.ylim (0, 10) plt.xticks (rotation=45, ha="right») plt.legend (title=»») plt.tight_layout () plt.show ()

Original size 981x584

столбчатая диаграмма

Диаграмма 4

Далее исследуем взаимосвязь между удовлетворенностью жизнью и экономическим процветанием. На следующей точечной диаграмме показана зависимость счастья от ВВП на душу населения для отдельных стран за последний год (2024г). Каждая точка представляет страну, расположенную в соответствии со средним баллом по шкале Кантрила по оси Y и ВВП на душу населения по оси X.

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

df.columns df.columns = df.columns.str.strip () region_col = «World region according to OWID»

df[region_col] = ( df.groupby («Entity»)[region_col] .transform (lambda x: x.ffill ().bfill ()) )

latest_year = df[«Year»].max ()

latest = df[ (df[«Year»] == latest_year) & (df[«Code»].notna ()) & (df[region_col].notna ()) ].copy ()

region_palette = { «Africa»: «#d9b68a», «Asia»: «#f06b04», «Europe»: «#022780», «North America»: «#a1071f», «South America»: «#ffe300», «Oceania»: «#a2e235» }

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

sns.scatterplot ( data=latest, x="GDP per capita, PPP (constant 2021 international $)», y="Cantril ladder score», color="lightgray», alpha=0.5, s=45, legend=False )

sns.scatterplot ( data=latest, x="GDP per capita, PPP (constant 2021 international $)», y="Cantril ladder score», hue=region_col, palette=region_palette, alpha=0.75, s=35 )

russia = latest[latest[«Entity»] == «Russia»].iloc[0]

plt.scatter ( russia[«GDP per capita, PPP (constant 2021 international $)»], russia[«Cantril ladder score»], color="red», s=120, edgecolor="black», zorder=5 )

plt.text ( russia[«GDP per capita, PPP (constant 2021 international $)»] * 1.02, russia[«Cantril ladder score»], «Russia», fontsize=9, va="center» )

plt.title (f"GDP per Capita vs Life Satisfaction ({latest_year})») plt.xlabel («GDP per capita (PPP, constant $)») plt.ylabel («Cantril Ladder Score») plt.ylim (0, 10) plt.xlim ( 0, latest[«GDP per capita, PPP (constant 2021 international $)»].max () * 1.02 ) legend = plt.legend (bbox_to_anchor=(1.05, 1), loc="upper left») legend.set_title («Region»)

Original size 834x553

точечная диаграмма

Заключение

Original size 1750x424

В рамках этого проекта с помощью описательной статистики, визуализаций и простого анализа мы получили следующие результаты: видна существенная неоднородность удовлетворенности в разных странах и регионах, а также значительные различия во временных траекториях. Уровни счастья значительно различаются между регионами: в Европе, Северной Америке и Океании средние показатели выше, чем в Африке и некоторых частях Азии. Хоть по региону значения остаются относительно стабильными, но на уровне стран есть явное расхождение. В некоторых странах наблюдается улучшение, а в иных — ухудшение. Эта конкретная динамика отдельных стран зачастую скрыта при сосредоточении внимания на глобальных или региональных показателях.

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

Описание применения генеративной модели:

Модель использовалась для разработки части брендирования, а также при создании диаграмм. В частности потребовалась помощь в интеграции палеты цветов и шрифта в код.

Использованная модель — ChatGPT 5.2 https://chatgpt.com