Importación de los paquetes básicos

import matplotlib.pyplot as plt # para crear graficos
import pandas as pd             # herramientas para analisis de datos y estructuras de datos
import pylab as pl              # añade numpy+scipy+sympy+pandas+matplotlib+ipython = MatLab
import numpy as np              # paquete básico para calculos científicos
%matplotlib inline              # muestra los graficos en la linea de comandos de Python

Descarga del fichero de datos

!wget -O FuelConsumption.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/FuelConsumptionCo2.csv
df = pd.read_csv("FuelConsumption.csv")
df.head() # mostramos los primeros datos 
MODELYEAR MAKE MODEL VEHICLECLASS ENGINESIZE CYLINDERS TRANSMISSION FUELTYPE FUELCONSUMPTION_CITY FUELCONSUMPTION_HWY FUELCONSUMPTION_COMB FUELCONSUMPTION_COMB_MPG CO2EMISSIONS
0 2014 ACURA ILX COMPACT 2.0 4 AS5 Z 9.9 6.7 8.5 33 196
1 2014 ACURA ILX COMPACT 2.4 4 M6 Z 11.2 7.7 9.6 29 221
2 2014 ACURA ILX HYBRID COMPACT 1.5 4 AV7 Z 6.0 5.8 5.9 48 136
3 2014 ACURA MDX 4WD SUV – SMALL 3.5 6 AS6 Z 12.7 9.1 11.1 25 255
4 2014 ACURA RDX AWD SUV – SMALL 3.5 6 AS6 Z 12.1 8.7 10.6 27 244

Listamos los estadísticos principales para cada variable

df.describe()
MODELYEAR ENGINESIZE CYLINDERS FUELCONSUMPTION_CITY FUELCONSUMPTION_HWY FUELCONSUMPTION_COMB FUELCONSUMPTION_COMB_MPG CO2EMISSIONS
count 1067.0 1067.000000 1067.000000 1067.000000 1067.000000 1067.000000 1067.000000 1067.000000
mean 2014.0 3.346298 5.794752 13.296532 9.474602 11.580881 26.441425 256.228679
std 0.0 1.415895 1.797447 4.101253 2.794510 3.485595 7.468702 63.372304
min 2014.0 1.000000 3.000000 4.600000 4.900000 4.700000 11.000000 108.000000
25% 2014.0 2.000000 4.000000 10.250000 7.500000 9.000000 21.000000 207.000000
50% 2014.0 3.400000 6.000000 12.600000 8.800000 10.900000 26.000000 251.000000
75% 2014.0 4.300000 8.000000 15.550000 10.850000 13.350000 31.000000 294.000000
max 2014.0 8.400000 12.000000 30.200000 20.500000 25.800000 60.000000 488.000000

Selecciona algunas variables para verlas con más detalle.

cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB','CO2EMISSIONS']]
cdf.head(9)
ENGINESIZE CYLINDERS FUELCONSUMPTION_COMB CO2EMISSIONS
0 2.0 4 8.5 196
1 2.4 4 9.6 221
2 1.5 4 5.9 136
3 3.5 6 11.1 255
4 3.5 6 10.6 244
5 3.5 6 10.0 230
6 3.5 6 10.1 232
7 3.7 6 11.1 255
8 3.7 6 11.6 267

Para verlas mejor, podemos dibujar cada una de esas verialbes

viz = cdf[['CYLINDERS','ENGINESIZE','CO2EMISSIONS','FUELCONSUMPTION_COMB']]
viz.hist()
plt.show()

Comparamos cada variable con la emisión de carbono, para ver si se pueden relacionar linealmente

plt.scatter(cdf.FUELCONSUMPTION_COMB, cdf.CO2EMISSIONS,  color='blue')
plt.xlabel("FUELCONSUMPTION_COMB")
plt.ylabel("Emission")
plt.show()

plt.scatter(cdf.ENGINESIZE, cdf.CO2EMISSIONS,  color='blue')
plt.xlabel("Engine size")
plt.ylabel("Emission")
plt.show()

plt.scatter(cdf.CYLINDERS, cdf.CO2EMISSIONS,  color='blue')
plt.xlabel("Cylinders")
plt.ylabel("Emission")
plt.show()


Creamos un conjunto de datos de entrenamiento y otro de prueba

Se divide el conjunto de datos en uno de entrenamiento y otro de pruebas, siendo excluyentes. Esto permite una evaluación más exacta, ya que los datos de entrenamiento no son parte de los datos que se usaran para comprobar el modelo.

msk = np.random.rand(len(df)) < 0.8
train = cdf[msk]
test = cdf[~msk]

Modelado de datos usando el paquete sklearn

from sklearn import linear_model #  importación del paquete sklearn
train_x = np.asanyarray(train[['ENGINESIZE']]) # conjunto de datos independientes
train_y = np.asanyarray(train[['CO2EMISSIONS']]) # conjunto de datos dependientes 
regr = linear_model.LinearRegression() # uso del modelo de regresion lineal
regr.fit (train_x, train_y) # ejecución de los calculos
print ('Pendiente: ', regr.coef_) # muestra la pendiente
print ('Ordenada: ',regr.intercept_) # muestra la ordenada en el origen

Pendiente: [[39.071235]]
Ordenada: [126.65808636]

Pintamos el ajuste realizado

plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS,  color='blue')
plt.plot(train_x, regr.coef_[0][0]*train_x + regr.intercept_[0], '-r')
plt.xlabel("Engine size")
plt.ylabel("Emission")

Se comparan los valores actuales con los predichos para calcular la exactitud del modelo de regresión

Existen distintas métricas de evaluación de modelos, utilicemos MSE para calcular la exactitud de nuestro modelo basado en el set de prueba:
– Error medio absoluto: Es una media del valor absoluto de los errores. Es la métrica más fácil de comprender ya que simplemente es el promedio de los errores pero en valor absoluto para que errores negativos no compensen los positivos.
– Error Cuadrado Medio (MSE): Es la media de los errores al cuadrado. Es más popular que el error medio absoluto porque hace que los grandes errores tengan más peso.
– R-cuadráticono es un error, es una medida popular que indica la precisión del modelo. Representa como de cerca están los datos de la linea de regresión. Mientras más alto es el R-cuadrático, mejor ajusta el modelo respecto de los datos. El máximo valor posible es 1 y puede tomar valores negativos.

from sklearn.metrics import r2_score # importación del paquete metrics de sklearn
test_x = np.asanyarray(test[['ENGINESIZE']]) # conjunto de datos independientes
test_y = np.asanyarray(test[['CO2EMISSIONS']]) # conjunto de datos dependientes
test_y_ = regr.predict(test_x) # ejecución de los calculos
print("Error medio absoluto: %.2f" % np.mean(np.absolute(test_y_ - test_y)))
print("Error cuadrado medio (MSE): %.2f" % np.mean((test_y_ - test_y) ** 2))
print("R2-cuadrático: %.2f" % r2_score(test_y_ , test_y) )

Error medio absoluto: 23.04
Error cuadrado medio (MSE): 894.25
R2-score: 0.70