Pogadajmy w końcu o pogodzie. Small talk w oparciu o dane
Za nami naprawdę ciepły kwietniowy weekend. Słoneczko, 20 stopni — czy może być coś piękniejszego? TAK! Poza wyrzuceniem do szafy grubych kurtek i swetrów, jest jeszcze jeden powód do zadowolenia. W momentach niezręcznej cieszy w korporacyjnej windzie i na rodzinnych spotkaniach, można w końcu z czystym sumieniem prozmawiać o pogodzie.
Aby dobrze wypaść przy nadchodzących small talkach, postanowiłem że do tematu podejdę na poważnie. Muszę dobrze się przygotować. I jak na umysł ścisły przystało — zrobić to w oparciu o realne dane. Wykorzystując pythona i techniki data science przygotowałem sobie kilka ciekawostek i asów z rękawa, w sam raz do wykorzystania podczas small talków.
Jeśli nie interesuje Ci aspekt techniczny, pomiń najbliższy rozdział i przejdź od razu do kolejnego: “Czy w pierwszy kwietniowy weekend rzeczywiście było wyjątkowo ciepło?”
Dane i środowisko
Oparłem się na ogólno dostępnej bazie Berkeley Earth - Climate Change: Earth Surface Temperature Data, zawierającej średniomiesięczne pomiary temparatur z całego świata od 1750 roku. Jest więc co analizować.
Do analizy wykorzystałem Pythonowe środowisko do data science i machine learnignu: Anaconda, python 3.5.2, jupyter notebook. Przetwarzanie danych: biblioteki numpy i pandas. Wizualizacja: bilioteka seaborn.
Zacząłem oczywiście od zaimportowania bibliotek i danych:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
%matplotlib inlineclimat = pd.read_csv("GlobalLandTemperaturesByCountry.csv")
climatCities = pd.read_csv("GlobalLandTemperaturesByCity.csv")
climatGlobal = pd.read_csv("GlobalTemperatures.csv")
Obróbka danych
Najbardziej czasochłonna w analize danych jest, jak tozwykle bywa, praca najmniej sexy, czyli obróbka i odpowiednie ich przygotowanie do późniejszego wykorzystania. Na szczeście operowanie na tablicach (dataFrame) przy użyciu pandas jest proste i wygodne.
climatPoland = climat[climat["Country"] == "Poland"]
climatPoland.drop('Country',axis=1,inplace=True)
climatGdansk = climatCities[climatCities["City"] == "Gdansk"]## USUNIĘCIE I DODANIE KOLUMN ##
climatPoland["ds"] = "Poland"
climatGdansk["ds"] = "Gdansk"
climatGdansk.drop('Country',axis=1,inplace=True)
climatGdansk.drop('Latitude',axis=1,inplace=True)
climatGdansk.drop('Longitude',axis=1,inplace=True)
climatGdansk.drop('City',axis=1,inplace=True)## ROZBICIE KOLUMNY Z DATĄ ##
def retYear(x):
return int(x[0:4])
def retMonth(x):
return int(x[5:7])
def retDay(x):
return int(x[8:10])climatPoland['year'] = climatPoland['dt'].apply(retYear)
climatPoland['month'] = climatPoland['dt'].apply(retMonth)
climatPoland['day'] = climatPoland['dt'].apply(retDay)climatGdansk['year'] = climatGdansk['dt'].apply(retYear)
climatGdansk['month'] = climatGdansk['dt'].apply(retMonth)
climatGdansk['day'] = climatGdansk['dt'].apply(retDay)climatPoland = climatPoland.drop("dt", axis = 1)
climatGdansk = climatGdansk.drop("dt", axis = 1)
Przy analizie danych zwykle okazuje się, że są one niepełne lub zawierają błędy. Tak było też w tym przypadku. Na szczęscie luki dotyczyły tylko pierwszych 3 latach, więc po prostu usunąłem dane z tego okresu.
# dane po 1753 są pełne
climatPoland = climatPoland[climatPoland["year"] > 1753]
climatGdansk = climatGdansk[climatGdansk["year"] > 1753]
Na koniec połączyłem dane dla Polski i dla Gdańska w jedną tabelę (DataFrame), żeby móc je potem łatwo porównać i wykorzystać do wizualizacji.
climatPG = pd.concat([climatGdansk,climatPoland])
Z tak przygotowanych danych możemy już zacząć wyciągać ciekawostki.
Czy w pierwszy kwietniowy weekend rzeczywiście było wyjątkowo ciepło?
Średnia temperatura dobowa 1–2 kwietnia 2017 r. w Gdańsku wyniosła ok. 14 stopni. Zobaczmy jak to się ma średniej temperatury w kwietniu na przestrzeni lat.
aprilPoland = climatPoland[climatPoland["month"] == 4]
aprilGdansk = climatGdansk[climatGdansk["month"] == 4]aprilPoland.mean()
aprilGdansk.mean()
Okazuje się, że średnia temeratura kwietnia od 1753 r. dla Gdańska to 7,4 stopnia, a dla Polski 7,5. Porównując więc nasz weekend do średnich temaratur — TAK ten weekend był naprawdę gorący jak na kwiecień :)
Sprawdźmy jeszcze na wszelki wypadek rozkład średnich temperatur w kwietniu:
sns.distplot(aprilGdansk['AverageTemperature'], bins=50)
Podczas small talku możesz więc spokojnie zaskoczyć rozmówcę:
- Wiesz że w ten weekend było prawie 2 razy cieplej niż jest średnio w kwietniu?!
- Wiesz jak ciepło jest zwykle w kwietniu?! Tylko 7 stopni!!
- Rozkład średnich temperatur w kwietniu przypomina rozkład gaussa! To niesamowite!
Czy kwiecień staje się coraz cieplejszy?
Podczas każdego small talku musi paść argument — kiedyś było lepiej. Teraz na takie marudzenie możesz odpowiedzieć za pomocą danych. A przynajmniej możesz to zrobić w kontekście średnich temperatur kwietnia na przestrzeni prawie 300 lat.
sns.lmplot(y="AverageTemperature", x="year", data=aprilGdansk, lowess=True)
Jak widać średnia temeratura rośnie od 1880 r. Od tamtego czasu ociepliło się w kwietniu o ok. 0,8 stopnia. TAK, kwiecień staje się corac cieplejszy w Gdańsku.
Sprawdźmy jeszcze jaka i kiedy była maksymalna i minimalna średnia temperatura w kwietniu w Polsce.
aprilPoland[aprilPoland['AverageTemperature'] == aprilPoland['AverageTemperature'].max()]
aprilPoland[aprilPoland['AverageTemperature'] == aprilPoland['AverageTemperature'].min()]
MAX: 11.9 stopnia, 2000 rok
MIN: 3.2 stopnia, 1812 rok
Jeżeli więc w najbliższych tygodniach pojawi się kilka chłodniejszych dni, zawsze możesz pocieszyć siebie i swoich rozmówców, że “Przerąbane to mieli w 1812 r., wtedy w całym kwietniu średnia temapratura z całego miesiąca miała ledwo 3 stopnie!”
Czy temperatury w Gdańsku różnią się w stosunku do reszty Polski?
Przy analizie nie ma co się zamykać tylko na kwietniu. Jeśli mieszkasz w Gdańsku (tak jak ja) to rozmowy na pewno zejdą też na temat tego, jak to w Gdańsku temperatury są inne niż w całej reszcie Polski — zimy łagodniejsze, ale za to lato chłodniejsze. Sprawdźmy więc jak wyglądają średnie temperatury poszczególnych miesięcy dla Gdańska i całej Polski
climatPoland.groupby('month').mean()
climatGdansk.groupby('month').mean()
sns.barplot(x='month',y='AverageTemperature', hue="ds", data=climatPG, estimator=np.mean, palette="Set2")
Jak widać średnie rejestrowane temeperatury dla poszczególnych miesięcy nie różnią się specjalnie, widać delikatne różnice. Zobaczmy ile konkretnie te różnice wynoszą w poszczególnych miesiącach.
roznica = climatPoland.groupby('month').mean() - climatGdansk.groupby('month').mean()
sns.barplot(x=roznica.index, y="AverageTemperature", data=roznica)
Dodatnia wartość pokazuje miesiące cieplejsze dla całej Polski, ujemna oznacza cieplejsze w Gdańsku. Okazuje się, że prawie we wszystkich miesiącach w Gdańsku jest chłodniej niż w pozostałej części Polski. Tylko we wrześniu i delikatnie w sierpniu jest w Gdańsku cieplej. Różnice te są jednak bardzo małe. Tylko w listopadzie i grudniu jest wyraźniej chłodniej (ok. 0,35 stopnia różnicy).
Tak więc, średnie temperatury w Gdańsku nie różnią się specjalnie od tych w całej Polsce. Ciekawsze mogłoby okazać się porównanie Gdańska z innym dużym miastam np. na południu Polski. Ale o to podczas small talku na pewno nikt nie zapyta.
Kiedy na urlop?
Zostało nam jeszcze jedno odwieczne pytanie ze small talków o pogodzie — kiedy pojechać na urlop (albo wziąć ślub). Jak powszechnie wiadomo, najlepszym wyznacznikiem udanego urlopu jest jego temperatura. W jakich więc miesiącach jest w Polsce zwykle ciepło?
Najpierw zobaczmy wszystkie średnie temperatury w podziale na poszczególne miesiące (każda kropka to jeden rok).
sns.swarmplot(x='month',y='AverageTemperature',data=climatPoland,size = 1, palette='Set2')
Jak widać miesiące letnie mają dużo mniejszy rozrzut temperatur niż miesiące zimowe. Zimy są więc pod względem temperatur zdecydowanie bardziej nieprzewidywalne. Możesz to wykorzystać podczas small talku ze znajomym: “Urlop planuję tylko w okresie letnim. Miesiące zimowe są zbyt nieprzewidywalne — mają dużo szerszy rozkład niż miesiące letnie”
Aby wyciągnąc ostateczne wnioski wyznaczmy sobie jeszcze dokładne średnie dla poszczególnych miesięcy.
climatPoland.groupby('month').mean()
Najcieplejszy miesiąc to lipiec. Dla lubiących ciepło fajny też jest siepień i czerwiec. Dla umiarkowanych, najlepsze okażą się maj i wrzesien.
Jeśli więc Twój znajomy z korpo, za którym nie przepadasz, przyzna się podczas small talku, że na urlop wybiera się w sierpniu, zawsze możesz odpowiedzieć: “A ja jadę w lipcu. Wiesz, że lipiec jest średnio o 0,8 stopnia cieplejszy od sierpnia?”. Oby tylko nie wybierał się za granicę, bo nasze wyliczenia będziemy musieli wyrzucić do kosza.
Sprawdźmy jeszcze czy są tu jakieś róznice pomiędzy Gdańskiem i resztą Polski.
sns.boxplot(x="month", y="AverageTemperature", hue="ds",data=climatPG, palette="coolwarm")
Także tutaj różnice między Gdańskiem i resztą Polski są nieznaczne.
Jestem już gotowy na wszystkie nadciągające small talki. Okazuje się, że podchodząc odpowiednio do tematu, nawet rozmowy o pogodzie mogą być wielce fascynujące ;)
PS. Przedstawione analizy i wizualizacje oparte są o realne dane. Wyciągane na ich podstawie wnioski pisałem jednak oczywiście z lekkim przymróżeniem oka — nie jestem ekspertem od pogody :)