Para el siguiente ejercicio de Data Science y Linear Regression con Pandas utilizaremos la información disponible en kaggle, la cual contiene los siguientes campos:
dt:
LandAverageTemperaturUncertainty :
LandMaxTemperature :
LandMaxTemperatureUncertainty :
LandMinTemperature :
LandMinTemperatureUncertainty :
LandAndOceanAverageTemperature :
LandAndOceanAverageTemperatureUncertainty :
dt:
AverageTemperature :
AverageTemperatureUncertainty :
City :
Country :
Latitude :
Longitude :
In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
% matplotlib inline
plt.style.use('ggplot')
In [2]:
# Leer la informacion
data = pd.read_csv('../data/GlobalTemperatures.csv')
# Mostrar los 5 primeros registros
data.head()
Out[2]:
In [3]:
"""
Para el primer analisis solo tomaremos como referencia el campo de informacion: LandAverageTemperature
"""
data = data[['dt','LandAverageTemperature']]
data.head()
Out[3]:
In [4]:
data.describe()
Out[4]:
Podemos visualizar que la temperatura minima es -2.08
y la maxima 19.02
In [5]:
"""
Generemos una grafica de puntos, modificando el ancho y largo
de la grafica para poder tener una mejor visualizacion de la informacion
"""
plt.figure(figsize = (15, 5))
plt.scatter(x = data['LandAverageTemperature'].index, y = data['LandAverageTemperature'])
plt.title("Temperatura promedio de la tierra 1750-2015")
plt.xlabel("Anio")
plt.ylabel("Temperatura promedio de la Tierra")
plt.show()
In [6]:
# Vamos a probar solo graficar los anios
# Verifiquemos el tipo de dato de la columna dt
print(type(data['dt'][0]))
In [7]:
# Vamos a convertir la columna a un objeto tiempo
times = pd.DatetimeIndex(data['dt'])
# Agrupamos la informacion por anios
grouped = data.groupby([times.year]).mean()
In [8]:
# graficamos
plt.figure(figsize = (15, 5))
plt.plot(grouped['LandAverageTemperature'])
# Change features of the graph
plt.title("Temperatura media anual de la tierra 1750-2015")
plt.xlabel("Anio")
plt.ylabel("Temperatura promedio de la tierra")
plt.show()
In [9]:
# Que puede ocurrir en los primeros anios?
grouped.head()
Out[9]:
In [10]:
# Vamos a checar que es lo que pasa en 1752
data[times.year == 1752]
Out[10]:
In [11]:
# Tenemos demasiada informacion nula
data[np.isnan(data['LandAverageTemperature'])]
Out[11]:
In [12]:
# Usaremos el valor previo validado para llenar las observaciones nulas
data['LandAverageTemperature'] = data['LandAverageTemperature'].fillna(method='ffill')
In [13]:
# Reagrupamos la informacion y graficamos
grouped = data.groupby([times.year]).mean()
# La grafica se ve mejor, aunque no es perfecta
plt.figure(figsize = (15, 5))
plt.plot(grouped['LandAverageTemperature'])
plt.show()
In [14]:
# Para modelar los datos, vamos a necesitar de la libreria sklearn
from sklearn.linear_model import LinearRegression as LinReg
In [15]:
x = grouped.index.values.reshape(-1, 1)
y = grouped['LandAverageTemperature'].values
In [16]:
reg = LinReg()
reg.fit(x, y)
y_preds = reg.predict(x)
print("Certeza: " + str(reg.score(x, y)))
In [17]:
plt.figure(figsize = (15, 5))
plt.title("Linear Regression")
plt.scatter(x = x, y = y_preds)
plt.scatter(x = x, y = y, c = "b")
Out[17]:
In [18]:
reg.predict(2050)
Out[18]:
In [19]:
# Leer la informacion
data = pd.read_csv('../data/GlobalLandTemperaturesByCity.csv')
data.head()
Out[19]:
In [20]:
# Cuantas ciudades estan disponibles
data['City'].nunique()
Out[20]:
In [21]:
# Verificamos que nuestra ciudad de interes este disponible
ciudades = np.array(data['City'])
"Aguascalientes" in ciudades
Out[21]:
In [22]:
# Filtramos la informacion para la ciudad de interes
data = data.loc[data['City'] == 'Aguascalientes']
In [23]:
# clasificamos la informacion
data = data[['dt','AverageTemperature','City']]
In [24]:
data.head()
Out[24]:
In [25]:
# Vamos a convertir la columna dt a un objeto tiempo
times = pd.DatetimeIndex(data['dt'])
# Agrupamos la informacion por anios
grouped = data.groupby([times.year]).mean().plot.line(figsize=(15,5))
In [26]:
# Usaremos el valor previo validado para llenar las observaciones nulas
data['AverageTemperature'] = data['AverageTemperature'].fillna(method='ffill')
# Reagrupamos la informacion y graficamos
grouped = data.groupby([times.year]).mean()
# La grafica se ve mejor, aunque no es perfecta
plt.figure(figsize = (15, 5))
plt.plot(grouped['AverageTemperature'])
plt.show()
x = grouped.index.values.reshape(-1, 1)
y = grouped['AverageTemperature'].values
In [27]:
reg = LinReg()
reg.fit(x, y)
y_preds = reg.predict(x)
print("Certeza: " + str(reg.score(x, y)))
In [28]:
plt.figure(figsize = (15, 5))
plt.title("Linear Regression")
plt.scatter(x = x, y = y_preds)
plt.scatter(x = x, y = y, c = "b")
Out[28]:
Vamos a pedecir la temperatura promedio para el 2018
In [29]:
reg.predict(2018)
Out[29]:
Vamos a pedecir la temperatura promedio para el 2050
In [30]:
reg.predict(2050)
Out[30]: