En 2010 la température moyenne à Dijon a été de 9.07°C. Le modèle créé dans ce notebook, prédit 10.91°C en 2050 et 12.02°C en 2100.
Licence: Creative Commons Attribution-Share Alike 3.0 Source
On a besoin des données historiques des températures à Dijon, notamment à partir de 1950. On va décrire toutes les étapes pour créer le modèle qui va nous permettre de prédire la température moyenne qui fera à Dijon dans le futur.
Les points bleus réprésentent les températures moyennes annuelles au fil des années.
La ligne rouge, indique les prédictions du modèle pour les mêmes dates.
Voici les étapes :
Source des données : Berkeley Earth (http://berkeleyearth.org)
Licence des données : CC BY-NC-SA 4.0
Au lieu de coder tout à la main, on va prendre appui sur les librairies les plus populaires de Python pour la science des données :
import numpy as np # Bibliotheque de fonctions mathématiques optimisées
import pandas as pd # Structures de données pour analyse de données
%matplotlib inline
import matplotlib.pyplot as plt # Bibliothèque de visualisation 2D
import seaborn; seaborn.set() # Evolution de matplotlib
temp = pd.read_csv('data/dijon-temp.csv')
temp = temp.drop(['City', 'Country', 'Latitude', 'Longitude', 'AverageTemperatureUncertainty', 'Unnamed: 0'], axis=1)
temp = temp.rename(columns={'dt': 'date', 'AverageTemperature': 'avg'})
temp['an'] = temp['date'].str[:4].astype(int)
temp['mois'] = temp['date'].str[5:7].astype(int)
temp = temp.dropna(axis = 0 , how = 'any')
temp = temp.drop(['date'], axis=1)
temp.head()
avg = temp['avg']
print('Nombre de mois: ', len(temp))
print('Mois temp < -5° : ', np.sum(avg < -5))
print('Mois temp < 0° : ', np.sum(avg < 0))
print('Mois temp >0°<5° : ', np.sum((avg > 0) & (avg < 5)))
print('Mois temp >5°<10° : ', np.sum((avg > 5) & (avg < 10)))
print('Mois temp >10°<15° : ', np.sum((avg > 10) & (avg < 15)))
print('Mois temp >15°<20° : ', np.sum((avg > 15) & (avg < 20)))
print('Mois temp >20°<25° : ', np.sum((avg > 20) & (avg < 25)))
print('Mois temp >25°<30° : ', np.sum((avg > 25) & (avg < 30)))
print('Mois temp >30°<35° : ', np.sum((avg > 30) & (avg < 35)))
max = np.max(temp)
print('Mois le plus chaud: en ', max['an'], ' le mois ', max['mois'], 'avec ', max['avg'])
min = np.min(temp)
print('Mois le plus froid:en ', min['an'], ' le mois ', max['mois'], ' avec ', min['avg'])
Quelles températures moyennes sont les plus fréquentes ? :
a=plt.hist(temp['avg'], 40)
On va d'abord charger l'algorithme de regression linéaire à partir de la librairie de machine learning :
from sklearn import linear_model
Puis calculer les températures moyennes annuelles (les données d'origine donnent les températures moyennes mensuelles) :
temp_an = temp.groupby(['an'], as_index=False).mean()
temp_an = temp_an.drop(['mois'], axis=1)
temp_an.head()
On va afficher les données pour vérifier que tout semble correct. On peut constater qu'autour de 1750 il y a eu des mesures qui ne semblent pas exactes :
temp_an.plot(kind='scatter', x='an', y='avg', figsize=(12,8))
Maintenant, il faut préparer les données pour appliquer la régression linéaire :
temp_an.insert(0, 'ones', 1)
temp_an.head()
X = temp_an[['ones','an']]
X = np.matrix(X.values)
y = temp_an['avg']
y = y.values.reshape(267,1)
y = np.matrix(y)
theta = np.matrix( np.array([0, 0]) )
X.shape, y.shape, theta.shape
model = linear_model.LinearRegression()
model.fit(X, y)
years = np.array(X[:, 1].A1)
predicted_temp = model.predict(X).flatten()
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(years, predicted_temp, 'r', label='Prediction')
ax.scatter(temp_an.an, temp_an.avg, label='Training data')
La hausse de température est évidente. Mais on a l'impression qu'elle est plus importante à partir de 1950.
Pour vérifier cette hypothèse, on va créer un modèle seulement avec les données à partir de 1950 :
temp_1950 = temp[temp['an'] > 1950]
temp_1950.head()
temp_1950_an = temp_1950.groupby(['an'], as_index=False).mean()
temp_1950_an = temp_1950_an.drop(['mois'], axis=1)
temp_1950_an.head()
temp_1950_an.insert(0, 'ones', 1)
X = temp_1950_an[['ones', 'an']]
X = np.matrix( X.values )
y = temp_1950_an[['avg']]
y = y.values.reshape(63, 1)
y = np.matrix( y )
theta = np.matrix( np.array( [0, 0]))
X.shape, y.shape, theta.shape
model = linear_model.LinearRegression()
model.fit(X, y)
years = np.array(X[:, 1].A1)
predicted_temp = model.predict(X).flatten()
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(years, predicted_temp, 'r', label='Prediction')
ax.scatter(temp_1950_an.an, temp_1950_an.avg, label='Training data')
La hausse semble bien plus nette avec le nouveau modèle !
Avec le modèle calculé, il suffit d'une petite manipulation pour faire nos prédictions
years = np.array([2010,2050,2100])
df = pd.DataFrame({'an':years})
df.insert(0,'ones',1)
Z = np.matrix(df)
predicted_temp = model.predict(Z).flatten()
print('Température moyenne en 2010 : ', predicted_temp[0], '°C')
print('Température moyenne en 2050 : ', predicted_temp[1], '°C')
print('Température moyenne en 2100 : ', predicted_temp[2], '°C')