
Обоснование выбора темы
Я решила изучить, как меняется ожидаемая продолжительность жизни в разных странах, потому что: Это как «градусник» для страны: по тому, сколько в среднем живут люди в стране, можно понять многое: хорошо ли работает медицина, хватает ли людям еды и чистой воды, безопасно ли работать. Если продолжительность жизни растёт, значит, в стране всё становится лучше; Важно для всего мира: ООН (Организация Объединенных Наций) считает этот показатель одним из самых важных. Когда люди живут дольше и здоровее — это признак того, что мир движется в правильном направлении; Интересно посмотреть, как всё менялось: всего 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 год с выделением максимального и минимального значений.
График 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 год.
График 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 году в виде горизонтальных столбцов.
График 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))
Результат: Гистограмма показывает, как распределены все значения продолжительности жизни в наборе данных.
Этап 4: Анализ роста стран. Таблица роста стран, для каждой страны рассчитан рост продолжительности жизни с 1960 по 2024 год, добавлен расчет годового роста, создана таблица с ранжированием.
Результат: text + таблица
СТРАНЫ С МАКСИМАЛЬНЫМ РОСТОМ (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 (умеренная положительная) Общий паттерн: Все корреляции положительные (нет отрицательных значений)
Это значит, что когда в одной стране растет продолжительность жизни, в других она тоже обычно растет, глобальный тренд улучшения здоровья населения.
Простая круговая диаграмма распределения роста 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')
Вывод: Наиболее сильная корреляция между Россией и Швейцарией (0.89). Все корреляции положительные, что означает схожие тренды развития, страны демонстрируют взаимосвязанную динамику продолжительности жизни.
Используемые статистические методы
1. Описательная статистика python: df_demo['Life_Expectancy'].describe () Что дает: count: количество наблюдений (390) mean: среднее значение (≈77.8 лет) std: стандартное отклонение (≈7.7 лет) min/max: минимальное и максимальное значения квартили: 25%, 50% (медиана), 75%
2. Агрегация и группировка.
Группировка по годам для среднего: python yearly_avg = df_demo.groupby ('Year')['Life_Expectancy'].mean ()
Группировка по странам для последнего года: 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 для создания обложки.