Анализ данных с Python на примере исследования изменения температуры в мире и России

Среднегодовая температура воздуха в большинстве стран растет с каждым годом. Это факт. И виноват в этом в первую очередь человек.

Ученые подтвердили связь, а также влияние человеческой деятельности на климат. Многочисленные свидетельства указывают на беспрецедентный уровень изменения климата в истории человечества. В период с 2011 по 2020 год глобальная температура поверхности Земли была примерно на 1,09 °С выше доиндустриального уровня. Сейчас температура сопоставима с уровнем, который в последний раз наблюдался около 125000 лет назад.

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

В России климат тоже стремительно меняется. И хотя это почти не ощущается (страна у нас большая, да и холодно исторически), но факты доказывают обратное – среднегодовая температура растет. Причем последние 20-30 лет стремительными темпами. Мое исследование всех найденных температурных данных с 1812 года также наглядно это подтверждает. Ниже я поделюсь моим кодом как я проводил этот анализ данных на Python.

Начнем с того, что импортируем необходимые питоновские библиотеки и сам датасет.

import pandas as pd
df = pd.read_csv('climate_changing.csv')
df

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

Рис. 1: Датасет с показателями среднегодовой температуры во всех странах начиная с 1743 года

Видим что данных более чем достаточно. Всего в датасете 577462 строки и 4 колонки.

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

df.Country.value_counts().head(20)

Åland 3239
Faroe Islands 3239
Greece 3239
Germany 3239
Saint Pierre And Miquelon 3239
France 3239
France (Europe) 3239
Finland 3239
San Marino 3239
Europe 3239
Switzerland 3239
Estonia 3239
Slovakia 3239
Slovenia 3239
Spain 3239
Denmark (Europe) 3239
Czech Republic 3239
Croatia 3239
Guernsey 3239
Romania 3239
Name: Country, dtype: int64

Максимум для каждой страны есть 3239 записи температур. Давайте посмотрим сколько в строках есть NaN (пропусков).

df.isna().mean().sort_values(ascending=False)

AverageTemperature 0.056542
AverageTemperatureUncertainty 0.055263
dt 0.000000
Country 0.000000
dtype: float64

Видим что около 5.5% строк не заполнены. Это не есть хорошо, но в целом приемлемо для обычного анализа данных, без машинного обучения.

Лично мне не нравятся названия столбцов, они длинные и не отражают суть. Переименуем их.

df.columns = ['date', 'av_temp', 'deviations', 'country']

Вернемся к пропускам. Давайте посмотрим в каких строках они чаще встречаются.

df.loc[pd.isnull(df.av_temp), :]

Таблица с отфильтрованными строками, которые содержат пропуски в данных

Рис. 2: Таблица с отфильтрованными строками, которые содержат пропуски в данных

Видим, что в основном это периоды 18-19 века. Дособирать данные за эти периоды сейчас, разумеется, не представляется возможным, поэтому я решил все оставить как есть.

Давайте теперь взглянем на статистики по нашим данным.

df.describe()

Описательные статистики температурных данных (среднее, мин, макс, медиана и т. д.)

Рис. 3: Описательные статистики температурных данных (среднее, мин, макс, медиана и т. д.)

Видим, что по всем странам за все века:

  • Средняя температура составила 17.19 градусов;
  • Минимальная: -37.65 °С;
  • Максимальная 38.84 °С;
  • В 3/4 стран средняя температура составляет 25.81 °С, т.е. большинство стран на Земле с теплым климатом.

Теперь самое время углубиться в анализ по конкретным странам. Однако анализировать изменение климата по дням – так себе идея. Давайте добавим еще пару столбцов: year (год) и decade (декада, десятилетие).

def yearExtractor(date):
    year = date[:4]
    return year
df['year'] = df['date'].apply(yearExtractor)

def assignDecade(x):
    if x.isdigit():
        decade = int(x)
        decade = decade/10
        decade = int(decade)
        decade = decade*10
        return str(decade) + "-" + str(decade+10)
    else:
        return float('NaN')
df['decade'] = df['year'].apply(assignDecade) 
df

Таблица со средними температурами по странам с добавлением признаков год и декада (десятилетие)

Рис. 4: Таблица со средними температурами по странам с добавлением признаков год и декада (десятилетие)

Давайте теперь посмотрим какие страны в мире имеют самую жаркую среднегодовую температуру.

def hottest(df, column_name):
    return df.sort_values(by=column_name, ascending=False)[:15]
    
hottest(df, 'av_temp')

Таблица стран мира с самой высокой средней температурой в году

Рис. 5: Таблица стран мира с самой высокой средней температурой в году

Однозначный лидер – Кувейт!

Читайте также:  Поиск инсайтов в данных веб-аналитики с помощью Python и Pandas

А в каких странах всегда холоднее всего на планете?

def coldest(df, column_name):
    return df.sort_values(by=column_name, ascending=True)[:15]
    
coldest(df, 'av_temp')

Таблица стран мира с самой низкой средней температурой в году

Рис. 6: Таблица стран мира с самой низкой средней температурой в году

Здесь 2 лидера: Гренландия и Дания. Однако обратите внимание – последний низкотемпературный рекорд был поставлен аж в 1983 году. Более того, большая часть записей вообще относятся к прошлому и позапрошлому векам! То есть даже в самых холодных странах планеты климат становится теплее.

Давайте теперь построим таблицу топ-15 самых холодных стран. Однако с 1743 года мир сильно изменился. Изменился не только климат, изменились границы стран, многих государств теперь вообще уже не существует. Поэтому отфильтруем данные с 1980 года.

import numpy as np
def calc_av_temp(df):
    df = df[df['year'] > '1980']
    df = df.groupby('country').agg({'av_temp': np.mean})
    return df.sort_values('av_temp').head(15)
calc_av_temp(df)

Самые холодные страны мира по показателю средней температуры с 1980 года

Рис. 7: Самые холодные страны мира по показателю средней температуры с 1980 года

Видим что Россия – 4-я самая холодная страна на планете. Вы об этом знали? Я лично нет. 🙂

Интересно также отметить что в топ-15 холодных стран попали еще Кыргызстан и Таджикистан (тоже лично для меня новость, думал что у них как-то потеплее).

Теперь давайте построим рейтинг топ-15 самых жарких стран за последние 40 лет.

def calc_av_temp(df):
    df = df[df['year'] > '1980']
    df = df.groupby('country').agg({'av_temp': np.mean})
    return df.sort_values('av_temp', ascending=False).head(15)
calc_av_temp(df)

Самые теплые страны мира по показателю средней температуры с 1980 года

Рис. 8: Самые теплые страны мира по показателю средней температуры с 1980 года

Звание “самая жаркая страна” однозначно можно присвоить каждой 2й на африканском континенте. Сюда же можно отнести ОАЭ и несколько островных государств.

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

Для начала отфильтруем данные в датасете по нашей стране.

df[df['country'] == 'Russia']

Таблица с исторической среднегодовой температурой в России

Рис. 9: Таблица с исторической среднегодовой температурой в России

Данные есть с 1812 года. Неплохо!

Взглянем какова была средняя температура в России за 19, 20 и 21 век.

df[df['country'] == 'Russia']['av_temp'].mean()

-5.521881912681913

А какая была средняя температура в России за последнее десятилетие?

df[(df.country=='Russia') & (df.decade=='2010-2020')]['av_temp'].mean()

-3.6361818181818193

Видим что температура стала заметно выше, чем за 2 предыдущих столетия. Разница почти в 2 градуса.

На первый взгляд, кажется что это небольшая цифра, но учитывайте, что прошло всего чуть более 200 лет (через каких-то 500 лет в нашей стране будет такой же климат как в Польше сейчас), плюс Россия – огромная страна со множеством климатических зон (в каких-то это изменение температуры происходило стремительнее).

Продолжим наш анализ. Для сравнения возьмем выборочно несколько декад 20 века.

print('1920-1930: ', df[(df.country=='Russia') & (df.decade=='1920-1930')]['av_temp'].mean())
print('1950-1960: ', df[(df.country=='Russia') & (df.decade=='1950-1960')]['av_temp'].mean())
print('1980-1990: ', df[(df.country=='Russia') & (df.decade=='1980-1990')]['av_temp'].mean())

1920-1930: -5.4886333333333335
1950-1960: -5.472849999999999
1980-1990: -4.902166666666667

Очевидно, что чем ближе к 21 веку, тем теплее становится климат в России.

Теперь давайте посмотрим как изменилась средняя температура по декадам во всех странах мира.

df.groupby('decade').mean()

Изменение среднегодовой температуры на Земле по декадам

Рис. 10: Изменение среднегодовой температуры на Земле по декадам

Видим, что температура на нашей планете и вправду растет. И довольно стремительными темпами.

Читайте также:  Big Data исследование: Снимали ли кино раньше лучше, чем сейчас?

Построим график.

df.groupby('decade', dropna=False).mean()['av_temp'].plot()

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

Рис. 11: График изменения среднегодовой температуры на планете

График и впрям впечатляет. Причем обратите внимание какой резкий скачок роста произошел в середине 19 века – период начала промышленной революции.

В период с 1850 по 1900 годы появилось и стало повсеместно внедряться множество новых технологий, оказывающих воздействие на окружающую среду:

  • Паровые машины и локомотивы: В период с 1850 по 1890 годы произошло несколько значительных прорывов, которые способствовали росту популярности паровых машин. Первое – масштабное и повсеместное строительство железнодорожных путей и соответственно паровых поездов. Паровые машины также начали активно использоваться в морском транспорте. Широкое использование паровых машин, локомотивов, пароходов привело к значительному увеличению выбросов углекислого газа, сернистого газа и других загрязняющих веществ в атмосферу;
  • Стальное производство: В 1856 году Генри Бессемер изобрел бессемеровский процесс производства стали, что значительно удешевило и ускорило производство стали. В 1864 году Пьер-Эмиль Мартен усовершенствовал этот процесс, создав мартеновский процесс. Бессемеровский и мартеновский процессы производства отличались повышенными требованиями к количеству угля и кокса, что приводило к выбросам углекислого газа, диоксида серы и других загрязняющих веществ;
  • Газовое освещение: В то время города освещались в основном фонарями на газе, что также сказалось на росте выбросов углекислого газа и других загрязняющих веществ в атмосферу;
  • Электричество: В 1882 году Томас Эдисон построил первую коммерческую электростанцию в Нью-Йорке, которая начала поставлять электричество для освещения домов и предприятий. Далее электростанции стали строиться повсеместно. Широкое использование паровых котлов для отопления и производства энергии привело к началу строительства угольных электространций, что стало причиной резкого увеличения выбросов углекислого газа, диоксида серы и других загрязняющих веществ в воздух;
  • Двигатели внутреннего сгорания: В 1876 году Николаус Отто изобрел четырехтактный двигатель внутреннего сгорания, который стал основой для современных автомобильных двигателей. Начались продажи автомобилей.

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

Все это весьма занятно не так-ли? Видеть причину и следствие…

Но что нам мир? Давайте проанализируем как менялся климат в России. Создадим отдельный датафрейм с показателями температуры в России. И посмотрим тоже как все менялось по декадам.

df_ru = df[df['country'] == 'Russia']
df_ru.groupby('decade').mean()

Изменение среднегодовой температуры в России по декадам

Рис. 12: Изменение среднегодовой температуры в России по декадам

Очевидно что Россия тоже следует общемировой тенденции. Но по своему пути и в своем темпе. Построим график.

df_ru.groupby('decade', dropna=False).mean()['av_temp'].plot()

График изменения среднегодовой температуры в России

Рис. 13: График изменения среднегодовой температуры в России

График здесь получился несколько иной, чем в целом по миру. На нем видно, что до 1960-1970 прирост был плавным, потом резкое ускорение. В чем причина?

Резкая автомобилизация? Возможно. Ведь именно со строительства Волжского автозавода (ВАЗ) автомобиль в нашей стране перестал быть роскошью и началась масштабная автомобилизация и бурный рост количества автомобилей на душу населения.

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

  • 1930: ~0.5 автомобилей на 1000 человек;
  • 1940: ~1.2;
  • 1950: ~2.5;
  • 1960: ~5.5;
  • 1970: ~18.4;
  • 1980: ~45.2;
  • 1990: ~75.7;
  • 2000: ~132.4.

Видим, что самый значительный рост произошел начиная с 1970 годов. Рост в 3.3 раза за десятилетие. Что совпадает со строительством Волжского автозавода. Потом количество автомобилей тоже росло, но уже не такими быстрыми темпами.

Читайте также:  Прогнозирование спроса с помощью машинного обучения

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

boxplot = df_ru.boxplot(column=['av_temp'], by=['decade'])

Боксплоты изменения среднегодовой температуры в России по десятилетиям

Рис. 14: Боксплоты изменения среднегодовой температуры в России по десятилетиям

На графике видно что верхние и нижние “усы” с каждым десятилетием становятся выше. Повышается также зеленая риска медианных значений. То есть присутствует некоторый тренд наверх.

Взглянем также на размах средних температур в России по годам:

boxplot = df_ru.boxplot(column=['av_temp'], by=['year'])

Размах температур в России по годам

Рис. 15: Размах температур в России по годам

В целом, подтверждается тенденция – средняя температура в РФ растет. Однако этот график шумноват. Давайте усечем данные до последних 70 лет.

df_ru_last = df_ru[df_ru['year'] >= '1950']
boxplot = df_ru_last.boxplot(column=['av_temp'], by=['year'])

Размах температур в России по годам начиная с 1953 года

Рис. 16: Размах температур в России по годам начиная с 1953 года

Видим резкое устремление медианных значений вверх (зеленые риски) в последние годы. Растут также усы и границы боксплотов со временем.

А что нам скажет боксплот анализ данных по декадам?

boxplot = df_ru_last.boxplot(column=['av_temp'], by=['decade'])

Размах температур в России по декадам начиная с 50х гг XX века

Рис. 17: Размах температур в России по декадам начиная с 50х гг XX века

Здесь потепление наблюдается еще более наглядно.

А что остальной мир? Страны с похожим климатом. Например, Канада?

Размах температур в Канаде по декадам начиная с 50х гг XX века

Рис. 18: Размах температур в Канаде по декадам начиная с 50х гг XX века

Видим, что в Канаде похожая и даже чуть более сильная тенденция. Интересно отметить что и в России, и в Канаде основной рост средних температур пришелся именно на последнее десятилетие.

Интересно также посмотреть на самые теплые месяцы в России за всю историю наблюдений.

hot_months = df_ru.groupby('date').filter(lambda x: x['av_temp'] > 16)
hot_months

Таблица с исторически самыми теплыми месяцами в России за все время

Рис. 19: Таблица с исторически самыми теплыми месяцами в России за все время

По таблице выше мы можем сделать 2 очень интересных вывода:

  1. Потепление в России действительно есть;
  2. В 21-м веке лето в стране стало значительно теплее, чем в 20-м веке;
  3. Самый жаркий месяц в стране – это июль.

На то, что данные обрываются 2013 годом, не обращайте внимания, это просто старый датасет обрывающийся именно так (мне к сожалению не удалось найти более свежий).

Давайте также узнаем какие были самые теплые годы в России.

def hot_years(df):
    hot_years = df.groupby('year').mean()
    hot_years = hot_years.loc[hot_years.av_temp>-4]
    return hot_years

hot_years(df_ru)

Самые теплые годы в России по показателю среднегодовой температуры

Рис. 20: Самые теплые годы в России по показателю среднегодовой температуры

Интересно взглянуть и на обратную статистику. То есть самые холодные месяцы в России за всю историю.

cold_months = df_ru.groupby('date').filter(lambda x: x['av_temp'] < -29)
cold_months

Таблица с исторически самыми холодными месяцами в России за все время

Рис. 21: Таблица с исторически самыми холодными месяцами в России за все время

Видим, что рекорды ультрахолодных зим уже долгое время остаются не побитыми, аж с 1972 года. Еще одно интересное наблюдение – январь более чем в 95% случаев холоднее февраля и декабря.

А что насчет самых холодных лет в России?

def cold_years(df):
    cold_years = df.groupby('year').mean()
    cold_years = cold_years.loc[cold_years.av_temp<-6.5]
    return cold_years

cold_years(df_ru)

Самые холодные годы в России по показателю среднегодовой температуры

Рис. 22: Самые холодные годы в России по показателю среднегодовой температуры

Видим что самые морозные года – 1812-1813 гг. Цифры по 1815 году – это вероятно какой-то выброс, аномалия в данных. Ну а с 1969 года в России зимы становятся все теплее и теплее. То есть в России тоже происходит потепление климата. Что и требовалось доказать.

На этом наше исследование завершено. Спасибо за внимание!