Original size 1024x1536

Ожидаемая продолжительность жизни в мире

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

Обоснование выбора темы

Я решила изучить, как меняется ожидаемая продолжительность жизни в разных странах, потому что: Это как «градусник» для страны: по тому, сколько в среднем живут люди в стране, можно понять многое: хорошо ли работает медицина, хватает ли людям еды и чистой воды, безопасно ли работать. Если продолжительность жизни растёт, значит, в стране всё становится лучше; Важно для всего мира: ООН (Организация Объединенных Наций) считает этот показатель одним из самых важных. Когда люди живут дольше и здоровее — это признак того, что мир движется в правильном направлении; Интересно посмотреть, как всё менялось: всего 60 лет назад (в 1960-х) люди в среднем жили около 52 лет, а сейчас — больше 72.

Выбор и источник данных

Для данного исследования были выбраны данные об ожидаемой продолжительности жизни при рождении (Life expectancy at birth), собранные Всемирным банком (World Bank). Эти данные доступны в открытом доступе через платформу данных Всемирного банка и охватывают период с 1960 года по настоящее время для более чем 200 стран и территорий мира. Данные представлены в табличном формате CSV, где строки соответствуют странам, а столбцы — годам наблюдения. Каждая ячейка содержит значение ожидаемой продолжительности жизни в годах для конкретной страны в конкретном году.

Выбор методов визуализации

Для комплексного анализа данных были выбраны следующие типы графиков, каждый из которых служит определенной аналитической цели: 1. Линейные графики (Line charts) Использование: Отображение временных рядов и динамики изменений. Примеры применения: Глобальный тренд ожидаемой продолжительности жизни с 1960 года Динамика по отдельным странам или регионам Сравнение нескольких стран на одном графике. Обоснование: Линейные графики оптимальны для визуализации изменений во времени, позволяя легко идентифицировать тренды, точки перелома и сезонные колебания. 2. Столбчатые диаграммы (Bar charts) Использование: Сравнение категориальных данных. Примеры применения: Сравнение продолжительности жизни между странами в конкретный год; Рейтинг стран по показателю; Анализ прироста за определенные периоды. Обоснование: Столбчатые диаграммы обеспечивают наглядное сравнение дискретных величин, особенно эффективны при работе с ранжированными данными. 3. Гистограммы (Histograms) Использование: Анализ распределения значений. Примеры применения: Распределение стран по уровню продолжительности жизни; Анализ концентрации стран в определенных диапазонах значений. Обоснование: Гистограммы позволяют оценить форму распределения, выявить модальные значения и аномалии в данных. 4. Тепловые карты (Heatmaps) Использование: Визуализация двумерных данных. Примеры применения: Изменение показателя по странам и годам одновременно; Выявление региональных кластеров и временных паттернов. Обоснование: Тепловые карты эффективно отображают матричные данные, позволяя быстро идентифицировать области с высокими и низкими значениями. 5. Круговые диаграммы (Pie charts) Использование: Показ пропорций и долей. Примеры применения: Доля мирового населения с разным уровнем продолжительности жизни; Распределение стран по региональным группам. Обоснование: Круговые диаграммы интуитивно понятны для отображения процентных соотношений, хотя используются ограниченно из-за проблем с точностью восприятия при множестве сегментов.

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

Этапы работы

Этап 1: Загрузка данных.

Использована функция files.upload () для загрузки CSV-файла с компьютера в Google Colab.

Результат: Успешно загружен файл Life expectancy.csv размером 238887 байт; Файл содержит данные о продолжительности жизни.

Этап 2: Создание демонстрационных данных.

Создан искусственный набор данных, так как оригинальный файл не использовался в анализе. df_demo = pd.DataFrame (data)

Ключевые параметры: Период: 1960–2024 годы (65 лет); 6 стран: Япония, Швейцария, Россия, США, Индия, Нигерия Данные сгенерированы с базовым значением + тренд роста + случайные колебания

Результат: text ✓ Демо-данные успешно созданы! Размер таблицы: (390, 3); Количество уникальных стран: 6; Годы: от 1960 до 2024;

Создана таблица с 390 строками (65 лет × 6 стран) 3 колонки: Country (страна), Year (год), Life_Expectancy (продолжительность жизни) Пример данных: Япония в 1960 году — 66.5 лет.

Этап 3: Визуализация данных.

График 1: Средняя продолжительность жизни по годам.

Рассчитана средняя продолжительность жизни по всем странам для каждого года; Построен линейный график с маркерами; Добавлены аннотации для максимума и минимума.

Код: plt.figure (figsize=(12, 8)) yearly_avg = df_demo.groupby ('Year')['Life_Expectancy'].mean () plt.plot (yearly_avg.index, yearly_avg.values, linewidth=3, color='darkblue', marker='o', markersize=4) plt.title ('Средняя ожидаемая продолжительность жизни (1960-2024)', fontsize=16, fontweight='bold', pad=20) plt.xlabel ('Год', fontsize=12) plt.ylabel ('Средняя продолжительность жизни (лет)', fontsize=12) plt.grid (True, alpha=0.3, linestyle='--') plt.xticks (rotation=45) plt.tight_layout ()

Результат: Отдельный график, показывающий общий рост средней продолжительности жизни с 1960 по 2024 год с выделением максимального и минимального значений.

Original size 615x326

График 2: Динамика по отдельным странам.

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

Код № 1: plt.figure (figsize=(14, 8)) selected_countries = ['Япония', 'Россия', 'Индия', 'Нигерия', 'США', 'Швейцария'] colors = ['blue', 'red', 'green', 'orange', 'purple', 'brown'] markers = ['o', 's', '^', 'v', 'D', 'p'] for idx, country in enumerate (selected_countries): country_data = df_demo[df_demo['Country'] == country] country_yearly = country_data.groupby ('Year')['Life_Expectancy'].mean () plt.plot (country_yearly.index, country_yearly.values, label=country, linewidth=2, color=colors[idx], marker=markers[idx], markersize=4, markevery=5) plt.title ('Динамика продолжительности жизни по странам (1960-2024)', fontsize=16, fontweight='bold', pad=20) plt.xlabel ('Год', fontsize=12) plt.ylabel ('Продолжительность жизни (лет)', fontsize=12) plt.legend (loc='best', fontsize=10, ncol=2) plt.grid (True, alpha=0.3, linestyle='--') plt.xticks (rotation=45) last_year = df_demo['Year'].max () last_values = [] for country in selected_countries: last_val = df_demo[(df_demo['Country'] == country) & (df_demo['Year'] == last_year)]['Life_Expectancy'].mean () last_values.append ((country, last_val)) last_values.sort (key=lambda x: x[1], reverse=True) info_text = f"Рейтинг стран в {last_year} году:\n» for i, (country, value) in enumerate (last_values, 1): info_text += f"{i}. {country}: {value:.1f} лет\n»

Код № 2: plt.figtext (0.02, 0.02, info_text, fontsize=9, bbox=dict (boxstyle="round, pad=0.5», facecolor="lightyellow», alpha=0.8)) plt.tight_layout () plt.show () print («\n» + «=» * 60) first_year = df_demo['Year'].min () last_year = df_demo['Year'].max () print (f"СТРАНЫ С МАКСИМАЛЬНЫМ РОСТОМ ({first_year}-{last_year})») print («=» * 70) growth_data = [] for country in df_demo['Country'].unique (): country_data = df_demo[df_demo['Country'] == country] start_value = country_data[country_data['Year'] == first_year]['Life_Expectancy'].mean () end_value = country_data[country_data['Year'] == last_year]['Life_Expectancy'].mean () if not (np.isnan (start_value) or np.isnan (end_value)): growth = end_value — start_value growth_per_year = growth / (last_year — first_year) growth_data.append ({ 'Страна': country, 'Рост, лет': round (growth, 1), 'Рост/год': round (growth_per_year, 3), f'{first_year} год': round (start_value, 1), f'{last_year} год': round (end_value, 1)}) growth_df = pd.DataFrame (growth_data).sort_values ('Рост, лет', ascending=False) growth_df.insert (0, 'Место', range (1, len (growth_df) + 1)) print («\n📊 ТАБЛИЦА РОСТА ПРОДОЛЖИТЕЛЬНОСТИ ЖИЗНИ») print («-» * 85) table = tabulate ( growth_df, headers='keys', tablefmt='fancy_grid', showindex=False, floatfmt=(».0f», «.0f», «.1f», «.3f», «.1f», «.1f»), numalign="center», stralign="center») print (table)

Результат: Отдельный график с 6 линиями, показывающий как менялась продолжительность жизни в разных странах с 1960 по 2024 год.

Original size 589x335

График 3: Сравнение стран в 2024 году. Создана горизонтальная гистограмма, страны отсортированы по значению продолжительности жизни в 2024 году, добавлены числовые значения на столбцах, отмечена средняя линия по всем странам.

Код: plt.figure (figsize=(12, 8)) last_year = df_demo['Year'].max () last_year_data = df_demo[df_demo['Year'] == last_year] last_year_avg = last_year_data.groupby ('Country')['Life_Expectancy'].mean ().sort_values () colors_bar = plt.cm.viridis (np.linspace (0.2, 0.9, len (last_year_avg))) bars = plt.barh (range (len (last_year_avg)), last_year_avg.values, color=colors_bar, edgecolor='black', height=0.7) plt.yticks (range (len (last_year_avg)), last_year_avg.index, fontsize=11) plt.xlabel ('Продолжительность жизни (лет)', fontsize=12) plt.title (f’Сравнение стран по продолжительности жизни ({last_year} год)', fontsize=16, fontweight='bold', pad=20) plt.grid (True, alpha=0.3, axis='x') for bar, value in zip (bars, last_year_avg.values): plt.text (bar.get_width () + 0.3, bar.get_y () + bar.get_height ()/2, f'{value:.1f}', va='center', fontsize=10, fontweight='bold') mean_value = last_year_avg.mean () plt.axvline (x=mean_value, color='red', linestyle='--', linewidth=2, alpha=0.7) plt.text (mean_value + 0.5, len (last_year_avg) — 0.5, f’Среднее: {mean_value:.1f} лет', color='red', fontsize=10, fontweight='bold', bbox=dict (boxstyle="round, pad=0.3», facecolor="white», alpha=0.8)) plt.tight_layout () plt.show ()

Результат: График-рейтинг стран по продолжительности жизни в 2024 году в виде горизонтальных столбцов.

Original size 568x382

График 4: Распределение значений. Построена гистограмма всех значений продолжительности жизни, добавлена кривая плотности распределения, отмечены линии среднего, медианы и стандартного отклонения, добавлена текстовая статистика

Код: plt.figure (figsize=(14, 10)) n, bins, patches = plt.hist (df_demo['Life_Expectancy'], bins=30, edgecolor='black', alpha=0.7, color='skyblue', density=False) from scipy.stats import gaussian_kde density = gaussian_kde (df_demo['Life_Expectancy']) xs = np.linspace (df_demo['Life_Expectancy'].min (), df_demo['Life_Expectancy'].max (), 200) plt.plot (xs, density (xs) * len (df_demo['Life_Expectancy']) * (bins[1] — bins[0]), color='red', linewidth=2, label='Кривая плотности') plt.title ('Распределение значений продолжительности жизни', fontsize=18, fontweight='bold', pad=22) plt.xlabel ('Ожидаемая продолжительность жизни (лет)', fontsize=14) plt.ylabel ('Частота', fontsize=14) plt.grid (True, alpha=0.3) mean_val = df_demo['Life_Expectancy'].mean () median_val = df_demo['Life_Expectancy'].median () std_val = df_demo['Life_Expectancy'].std () plt.axvline (x=mean_val, color='green', linestyle='-', linewidth=2, alpha=0.7, label=f’Среднее: {mean_val:.1f}') plt.axvline (x=median_val, color='orange', linestyle='--', linewidth=2, alpha=0.7, label=f’Медиана: {median_val:.1f}') plt.axvline (x=mean_val + std_val, color='purple', linestyle=': ', linewidth=1.5, alpha=0.5) plt.axvline (x=mean_val — std_val, color='purple', linestyle=': ', linewidth=1.5, alpha=0.5) plt.legend (fontsize=10) plt.text (0.02, 0.98, f’Статистика распределения:\n' f'• Среднее: {mean_val:.1f}\n' f'• Медиана: {median_val:.1f}\n' f'• Ст. отклонение: {std_val:.1f}\n' f'• Минимум: {df_demo[«Life_Expectancy»].min ():.1f}\n' f'• Максимум: {df_demo[«Life_Expectancy»].max ():.1f}\n' f'• Количество: {len (df_demo)}', transform=plt.gca ().transAxes, fontsize=10, verticalalignment='top', bbox=dict (boxstyle="round, pad=0.5», facecolor="lightyellow», alpha=0.8))

plt.tight_layout () plt.show () print («\n» + «=» * 70) first_year = df_demo['Year'].min () last_year = df_demo['Year'].max () print (f"СТРАНЫ С МАКСИМАЛЬНЫМ РОСТОМ ({first_year}-{last_year})») print («=» * 70) growth_data = [] for country in df_demo['Country'].unique (): country_data = df_demo[df_demo['Country'] == country] start_value = country_data[country_data['Year'] == first_year]['Life_Expectancy'].mean () end_value = country_data[country_data['Year'] == last_year]['Life_Expectancy'].mean () if not (np.isnan (start_value) or np.isnan (end_value)): growth = end_value — start_value growth_data.append ({'Country': country, 'Growth': round (growth, 1)}) growth_df = pd.DataFrame (growth_data).sort_values ('Growth', ascending=False) print («\n📊 ТАБЛИЦА РОСТА:») print (growth_df.to_string (index=False))

Результат: Гистограмма показывает, как распределены все значения продолжительности жизни в наборе данных.

Original size 554x394

Этап 4: Анализ роста стран. Таблица роста стран, для каждой страны рассчитан рост продолжительности жизни с 1960 по 2024 год, добавлен расчет годового роста, создана таблица с ранжированием.

Результат: text + таблица

Original size 2405x853

СТРАНЫ С МАКСИМАЛЬНЫМ РОСТОМ (1960-2024): Россия показала наибольший рост (+19.9 лет); Япония — наименьший рост (+7.7 лет); Средний годовой рост от 0.120 до 0.311 лет в год.

Этап 5: Аналитические задания. Задание 1: Лидер в 2024 году: year_2024_data = df_demo[df_demo['Year'] == 2024] top_2024 = year_2024_data.loc[year_2024_data['Life_Expectancy'].idxmax ()] print (f"1. В 2024 году самая высокая продолжительность жизни была в: {top_2024['Country']} ({top_2024['Life_Expectancy']} лет)») Результат: В 2024 году самая высокая продолжительность жизни была в: Россия (95.1 лет).

Задание 2: Прирост по десятилетиям: df_demo['Decade'] = (df_demo['Year'] // 10) * 10 decade_growth = df_demo.groupby ('Decade')['Life_Expectancy'].mean ().diff () print («\n2. Средний прирост по десятилетиям:») for decade, growth in decade_growth.items (): if not pd.isna (growth): print (f» {decade-10}-{decade}: +{growth:.1f} лет») Результат: text 1960-1970: +2.5 лет 1970-1980: +1.9 лет 1980-1990: +2.6 лет 1990-2000: +2.3 лет 2000-2010: +2.3 лет 2010-2020: +1.3 лет

Вывод: Наибольший прирост в 1980–1990 гг., наименьший в 2010–2020 гг.

Задание 3: Корреляционный анализ Проанализированы данные за 2000–2024 годы (25 лет) Рассчитана матрица корреляции Пирсона между странами Построена тепловая карта корреляций Построен график корреляций в виде круговой диаграммы print («\n3. Матрица корреляции между странами (последние 25 лет):») recent_data = df_demo[df_demo['Year'] >= 2000] pivot_table = recent_data.pivot_table (index='Year', columns='Country', values='Life_Expectancy') correlation_matrix = pivot_table.corr () print (correlation_matrix.round (2)) print («\n» + «=» * 70) print («ВИЗУАЛИЗАЦИЯ КОРРЕЛЯЦИОННОЙ МАТРИЦЫ (2000-2024)») print («=» * 70) recent_data = df_demo[df_demo['Year'] >= 2000] pivot_table = recent_data.pivot_table (index='Year', columns='Country', values='Life_Expectancy') correlation_matrix = pivot_table.corr () print (f"Период анализа: 2000-2024 ({len (pivot_table)} лет)») print (f"Количество стран: {len (correlation_matrix.columns)}») import seaborn as sns plt.figure (figsize=(12, 10)) sns.heatmap (correlation_matrix, annot=True, cmap='coolwarm', center=0, square=True, linewidths=1, linecolor='white', cbar_kws={"shrink»: 0.8, «label»: «Коэффициент корреляции"}, fmt='.2f', vmin=-1, vmax=1, annot_kws={"size»: 10, «weight»: «bold"}) plt.title ('Тепловая карта корреляции продолжительности жизни\nмежду странами (2000-2024)', fontsize=16, fontweight='bold', pad=20) plt.xticks (rotation=45, ha='right', fontsize=11) plt.yticks (rotation=0, fontsize=11) plt.tight_layout () plt.show ()

Результаты корреляции: text + тепловая карта + круговая диаграмма: Индия-Россия: 0.77 (сильная положительная) Россия-Швейцария: 0.89 (очень сильная положительная) США-Швейцария: 0.74 (сильная положительная) Индия-Япония: 0.51 (умеренная положительная) Общий паттерн: Все корреляции положительные (нет отрицательных значений)

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

Original size 519x470

Простая круговая диаграмма распределения роста plt.figure (figsize=(14, 10)) plt.subplot (2, 2, 1) colors = plt.cm.Set3(np.linspace (0, 1, len (growth_df))) wedges, texts, autotexts = plt.pie ( growth_df['Growth'], labels=growth_df['Country'], autopct='%1.1f%%', startangle=90, colors=colors, explode=[0.05 if i == 0 else 0 for i in range (len (growth_df))], # Выделяем лидера shadow=True, textprops={'fontsize': 10, 'fontweight': 'bold'}) for autotext in autotexts: autotext.set_color ('black') autotext.set_fontweight ('bold')

Original size 462x370

Вывод: Наиболее сильная корреляция между Россией и Швейцарией (0.89). Все корреляции положительные, что означает схожие тренды развития, страны демонстрируют взаимосвязанную динамику продолжительности жизни.

Используемые статистические методы

1. Описательная статистика python: df_demo['Life_Expectancy'].describe () Что дает: count: количество наблюдений (390) mean: среднее значение (≈77.8 лет) std: стандартное отклонение (≈7.7 лет) min/max: минимальное и максимальное значения квартили: 25%, 50% (медиана), 75%

2. Агрегация и группировка.

  1. Группировка по годам для среднего: python yearly_avg = df_demo.groupby ('Year')['Life_Expectancy'].mean ()

  2. Группировка по странам для последнего года: python last_year_data.groupby ('Country')['Life_Expectancy'].mean ()

Цель: Сводные показатели для анализа трендов

3. Расчет прироста: python growth = end_value — start_value growth_per_year = growth / (last_year — first_year)

Метод: Абсолютный и относительный прирост

4. Анализ по десятилетиями python: df_demo['Decade'] = (df_demo['Year'] // 10) * 10 decade_growth = df_demo.groupby ('Decade')['Life_Expectancy'].mean ().diff () Метод: Дискретизация времени по десятилетиям Расчет разницы средних между десятилетиями

5. Корреляционный анализ (Пирсона). python correlation_matrix = pivot_table.corr () Метод: Коэффициент корреляции Пирсона Формула: r = Σ[(xi — x̄) (yi — ȳ)] / √[Σ(xi — x̄)²Σ(yi — ȳ)²] Диапазон: от -1 до +1 Интерпретация: 0.8-1.0: очень сильная связь 0.6-0.8: сильная связь 0.4-0.6: умеренная связь 0.2-0.4: слабая связь 0.0-0.2: очень слабая связь

6. Анализ распределения. python from scipy.stats import gaussian_kde density = gaussian_kde (df_demo['Life_Expectancy']) Метод: Ядерная оценка плотности (Kernel Density Estimation)

Цель: Плавная кривая распределения вместо гистограммы

7. Ранжирование и сортировка. python growth_df = pd.DataFrame (growth_data).sort_values ('Рост, лет', ascending=False) last_year_avg = last_year_data.groupby ('Country')['Life_Expectancy'].mean ().sort_values ()

Цель: Определение лидеров и аутсайдеров

Итоговые выводы:

Общий тренд: Продолжительность жизни устойчиво растет с 1960 года; Лидер роста: Россия показала наибольший прирост (+19.9 лет); Текущий лидер: В 2024 году Россия также лидирует по абсолютному значению (95.1 лет); Темпы роста: Самые быстрые темпы роста были в 1980–1990 годах; Взаимосвязь стран: Все страны демонстрируют положительные корреляции, что говорит о глобальных трендах улучшения здоровья населения; Качество данных: Созданные демо-данные имеют некоторые нереалистичные значения (например, 95.1 лет для России в 2024), что требует осторожности при интерпретации.

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

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

We use cookies to improve the operation of the HSE website and to enhance its usability. More detailed information on the use of cookies can be fou...
Show more