Evaluar y comparar los modelos de regresión lineal simple y polinomial de segunda y quinta potencia con datos de Adverstising_WEB.csv y programación Python.
Se cargan los datos de la dirección:https://raw.githubusercontent.com/rpizarrog/Analisis-Inteligente-de-datos/main/datos/Advertising_Web.csv
Los datos contienen variables que en el contexto se interpreta que son inversiones hechas de una empresa y las ventas de la misma, a tanta inversión de marketing en medios tales como TV, Radio, NewsPapers (medios impresos) y Web (digital) existe en relacuón a las ventas (Sales) generadas.
Se trata de comparar modelos predictivos para evaluar cuál es mejor con respecto a los estadísticos R Square y RMSE.
Las variables de interés serán:
TV como variable independiente o la variable explicativa hacia la variables Sales
Sales como variable dependiente que es la variable a predecir.
Se construyen datos de entrenamiento y datos de validacion al 70 y 30% respectivamente
Se construyen el modelo de regresión lineal simple con los datos de entrenamiento y se evaluán los siguiente aspectos:
Se identifican los coeficientes a y b
Se analizan los niveles de confianza de los coeficientes.
Se identifica el valor de R Square par evaluar el grado de explicación de la variable dependiente con respecto a la variable independiente. El modelo se acepta si está por encima del 60%.
Se hacen prediciones con la funcion predict() con los datos de validación.
Se mide el valor de RMSE Root Mean Stándar Error.
Se construye el modelo polinomial a la segunda potencia y quinta potencia con los datos de entrenamiento y se evalúan los siguientes aspectos.
Se identifican los coeficientes
Se analizan los niveles de confianza de los coeficientes.
Se identifica el valor de R Square para evaluar el grado de explicación de la variable independiente con respecto a la variable dependiente. Se acepta si está por encima del 60%
Se hacen predicciones con la función predict() con los datos de validación.
Se mide el valor de rmse Root Mean Stándar Error.
Para trabajar con código Python, se deben cargan las librerías de Python previamente instaladas con la función py_install() de la librería reticulate de R. La función repl_python() se utiliza para ejecutar ventana de comando o shell de Python.
py_install(packages = “pandas”)
py_install(packages = “matplotlib”)
py_install(packages = “numpy”)
py_install(packages = “sklearn”)
Se debe instalar el paquete reticulate en R para poder ejecuar código Python en R Studio
# install.packages("reticulate")
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures # Polinomial
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import mean_squared_error, r2_score
datos = pd.read_csv("https://raw.githubusercontent.com/rpizarrog/Analisis-Inteligente-de-datos/main/datos/Advertising_Web.csv", encoding='latin1')
Observar los primeros diez registros
datos.head(10)
## Unnamed: 0 X TV Radio Newspaper Web Sales
## 0 1 1 230.1 37.8 69.2 306.634752 22.1
## 1 2 2 44.5 39.3 45.1 302.653070 10.4
## 2 3 3 17.2 45.9 69.3 49.498908 9.3
## 3 4 4 151.5 41.3 58.5 257.816893 18.5
## 4 5 5 180.8 10.8 58.4 195.660076 12.9
## 5 6 6 8.7 48.9 75.0 22.072395 7.2
## 6 7 7 57.5 32.8 23.5 246.811598 11.8
## 7 8 8 120.2 19.6 11.6 229.971459 13.2
## 8 9 9 8.6 2.1 1.0 144.617385 4.8
## 9 10 10 199.8 2.6 21.2 111.272264 10.6
print("Observaciones y variables: ", datos.shape)
## Observaciones y variables: (200, 7)
print("Columnas y tipo de dato")
# datos.columns
## Columnas y tipo de dato
datos.dtypes
## Unnamed: 0 int64
## X int64
## TV float64
## Radio float64
## Newspaper float64
## Web float64
## Sales float64
## dtype: object
Se identifican dos variables numéricas de interés:
TV: Inversión de publicidad a través de televisión
Sales: Ventas de la empresa.
Se define a la variable independiente como TV y la variable dependiente Sales, es decir, TV impacta sobre Sales o los valores de inversión de la variable Sales dependen de TV.
datos['TV'].describe()
## count 200.000000
## mean 147.042500
## std 85.854236
## min 0.700000
## 25% 74.375000
## 50% 149.750000
## 75% 218.825000
## max 296.400000
## Name: TV, dtype: float64
datos['Sales'].describe()
## count 200.000000
## mean 14.022500
## std 5.217457
## min 1.600000
## 25% 10.375000
## 50% 12.900000
## 75% 17.400000
## max 27.000000
## Name: Sales, dtype: float64
plt.plot(datos['TV'], datos['Sales'], 'o', color= 'blue')
Se observa que la relación entre las dos variables no es del todo lineal.
Los datos de entrenamiento son el 70% de los datos originales y los de validación el 30%.
Se siembra una semilla del año en curso 2022 para generar los mismos valores cada vez que se cnstruya el documento *markdown*.
Determinas las variables de interés en variables específicas en Python.
TV = datos[['TV']].to_numpy()
Sales = datos[['Sales']].to_numpy()
Se utiliza el método train_test_split() que forma parte de la librería Scikit-Learn.
El argumento test_size establece el 30% para datos de validación por lo que el 70% pertenece a los datos de entrenamiento.
Se siembra la semilla 2022 para la generación de valores aleatorios.
TV_train, TV_test, Sales_train, Sales_test = train_test_split(TV, Sales, test_size=0.3, random_state=2022)
Ver los registros (cuántos) de cada conjunto de la variable TV.
TV_train.shape
## (140, 1)
TV_test.shape
## (60, 1)
Ver los primeros 10 registros de cada conjunto de datos de la variable TV.
TV_train[1:10]
## array([[296.4],
## [193.2],
## [166.8],
## [ 8.7],
## [141.3],
## [ 93.9],
## [228. ],
## [ 38. ],
## [ 13.1]])
TV_test[1:10]
## array([[ 13.2],
## [253.8],
## [265.2],
## [289.7],
## [193.7],
## [218.5],
## [149.8],
## [ 19.6],
## [ 48.3]])
No deben ser los mismos… …
Se construye un modelo lineal con la función LinearRegression() y los valores ajustados con la función fit() del modelo construido.
La variable dependiente Sales está en función de la variable independiente TV de los datos de entrenamiento (train)
modelo_ls = LinearRegression()
modelo_ls.fit(TV_train, Sales_train)
LinearRegression()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
LinearRegression()
\[ Y = a + b \cdot x_i \\\therefore\\Y = 7.35825513 + 0.04520679 \cdot TV_i \]
a = modelo_ls.intercept_
b = modelo_ls.coef_
print("Valor de a: ", a)
## Valor de a: [7.35825513]
print("Valor de b; ", b)
## Valor de b; [[0.04520679]]
linea_tendencia = modelo_ls.predict(TV_train)
plt.plot(TV_train, Sales_train, 'o', color= 'blue')
plt.plot(TV_train, linea_tendencia, color="red")
Las predicciones se hacen con el conjunto de datos de validación. Se muestran sólo los primeros diez valores de TV y las predicciones.
TV_train[1:10]
## array([[296.4],
## [193.2],
## [166.8],
## [ 8.7],
## [141.3],
## [ 93.9],
## [228. ],
## [ 38. ],
## [ 13.1]])
predicciones = modelo_ls.predict(TV_test)
predicciones[1:10]
## array([[ 7.95498473],
## [18.83173789],
## [19.34709527],
## [20.45466157],
## [16.11480994],
## [17.23593828],
## [14.13023195],
## [ 8.24430818],
## [ 9.54174299]])
Se construye una tabla comparativa con los datos de validación y las predicciones generadas para comparar y generar el estadístico rmse.
Crear un data.frame llamado comparaciones a partir de la creación de un diccionario con los valores reales del conjunto de validación y las predicciones calculadas.
Con la función flatten().tolist() convierte el arreglo a una lista de una dimensión.
diccionario = {'TV': TV_test.flatten().tolist(),
'Real' : Sales_test.flatten().tolist(),
'Predicho' : predicciones.flatten().tolist()}
diccionario
## {'TV': [210.8, 13.2, 253.8, 265.2, 289.7, 193.7, 218.5, 149.8, 19.6, 48.3, 97.2, 280.2, 164.5, 123.1, 218.4, 131.7, 266.9, 171.3, 216.8, 229.5, 8.6, 66.1, 90.4, 202.5, 50.0, 217.7, 187.9, 281.4, 239.9, 213.5, 75.3, 5.4, 139.2, 206.9, 292.9, 140.3, 136.2, 237.4, 75.5, 36.9, 213.4, 8.4, 215.4, 76.4, 273.7, 225.8, 112.9, 177.0, 85.7, 69.0, 76.4, 56.2, 222.4, 25.0, 11.7, 43.1, 129.4, 137.9, 230.1, 109.8], 'Real': [23.8, 5.6, 17.6, 12.7, 25.4, 19.2, 12.2, 10.1, 7.6, 11.6, 9.6, 14.8, 14.5, 15.2, 18.0, 12.9, 25.4, 19.0, 22.3, 19.7, 4.8, 8.6, 8.7, 16.6, 8.4, 19.4, 14.7, 24.4, 23.2, 21.7, 11.3, 5.3, 12.2, 12.9, 21.4, 10.3, 13.2, 18.9, 9.9, 10.8, 17.0, 5.7, 17.1, 9.4, 20.8, 13.4, 11.9, 12.8, 13.3, 9.3, 11.8, 8.7, 11.5, 7.2, 7.3, 10.1, 11.0, 19.2, 22.1, 16.7], 'Predicho': [16.887846012530773, 7.954984732771214, 18.831737890211244, 19.347095271735835, 20.454661574135173, 16.114809940243887, 17.235938278999136, 14.130231953495688, 8.244308175030634, 9.541742986412714, 11.752354912426089, 20.025197089531346, 14.79477173493529, 12.923210717819675, 17.231417600213835, 13.311989093355768, 19.42394681108599, 15.102177892335924, 17.15908673964898, 17.733212945382512, 7.747033508647257, 10.346423810196724, 11.444948755025456, 16.512629673350588, 9.618594525762873, 17.199772848716712, 15.85261057069629, 20.07944523495499, 18.20336353905407, 17.009904339733964, 10.762326258444638, 7.602371787517548, 13.651040002253524, 16.711539539903942, 20.59932329526488, 13.700767468891863, 13.515419638694421, 18.090346569421484, 10.771367616015246, 9.026385604888125, 17.005383660948663, 7.73799215107665, 17.095797236654732, 10.812053725082977, 19.731352968486625, 17.565947830326287, 12.462101481718726, 15.359856583098217, 11.232476852116195, 10.477523494970523, 10.812053725082977, 9.898876610451685, 17.41224475162597, 8.488424829437019, 7.887174550991663, 9.306667689576937, 13.20801348129379, 13.59227117804458, 17.760337018094333, 12.321960439374319]}
comparaciones = pd.DataFrame(diccionario)
comparaciones
## TV Real Predicho
## 0 210.8 23.8 16.887846
## 1 13.2 5.6 7.954985
## 2 253.8 17.6 18.831738
## 3 265.2 12.7 19.347095
## 4 289.7 25.4 20.454662
## 5 193.7 19.2 16.114810
## 6 218.5 12.2 17.235938
## 7 149.8 10.1 14.130232
## 8 19.6 7.6 8.244308
## 9 48.3 11.6 9.541743
## 10 97.2 9.6 11.752355
## 11 280.2 14.8 20.025197
## 12 164.5 14.5 14.794772
## 13 123.1 15.2 12.923211
## 14 218.4 18.0 17.231418
## 15 131.7 12.9 13.311989
## 16 266.9 25.4 19.423947
## 17 171.3 19.0 15.102178
## 18 216.8 22.3 17.159087
## 19 229.5 19.7 17.733213
## 20 8.6 4.8 7.747034
## 21 66.1 8.6 10.346424
## 22 90.4 8.7 11.444949
## 23 202.5 16.6 16.512630
## 24 50.0 8.4 9.618595
## 25 217.7 19.4 17.199773
## 26 187.9 14.7 15.852611
## 27 281.4 24.4 20.079445
## 28 239.9 23.2 18.203364
## 29 213.5 21.7 17.009904
## 30 75.3 11.3 10.762326
## 31 5.4 5.3 7.602372
## 32 139.2 12.2 13.651040
## 33 206.9 12.9 16.711540
## 34 292.9 21.4 20.599323
## 35 140.3 10.3 13.700767
## 36 136.2 13.2 13.515420
## 37 237.4 18.9 18.090347
## 38 75.5 9.9 10.771368
## 39 36.9 10.8 9.026386
## 40 213.4 17.0 17.005384
## 41 8.4 5.7 7.737992
## 42 215.4 17.1 17.095797
## 43 76.4 9.4 10.812054
## 44 273.7 20.8 19.731353
## 45 225.8 13.4 17.565948
## 46 112.9 11.9 12.462101
## 47 177.0 12.8 15.359857
## 48 85.7 13.3 11.232477
## 49 69.0 9.3 10.477523
## 50 76.4 11.8 10.812054
## 51 56.2 8.7 9.898877
## 52 222.4 11.5 17.412245
## 53 25.0 7.2 8.488425
## 54 11.7 7.3 7.887175
## 55 43.1 10.1 9.306668
## 56 129.4 11.0 13.208013
## 57 137.9 19.2 13.592271
## 58 230.1 22.1 17.760337
## 59 109.8 16.7 12.321960
Es el valor de la correlación al cuadrado de las predicciones y los valores reales.Se interpreta como la representación que tienen la variable independiente sobre la variable dependiente. En este caso, que tanto TV representa a Sales en los datos.
R2 es el coeficiente de determinación, y tiene que ver con la capacidad de un modelo para predecir futuros resultados.
# Con lo real vs predicciones
r = np.corrcoef(comparaciones['Real'], comparaciones['Predicho'])
r = r ** 2
r = r.reshape(-1,2)
r = r[0, 1]
print('R Square :', np.round(r, 4) )
# con r2_score([2, 5, 9], [3, 5, 11])
## R Square : 0.6922
print('R Square :', r2_score(comparaciones['Real'], comparaciones['Predicho'] ))
## R Square : 0.6776916070956498
El valor de R Square está por encima del 60% por lo que el modelo se acepta.
Se determina la variación de los valores reales contra las predicciones por medio del estadístico rmse (Root Mean Stándar Error) que servirá para compararse con otro modelo concluyendo que en el que tenga menor error es mas eficiente el modelo.
rmse Root Mean Stándar Error, este valor normalmente se compara contra otro modelo y el que esté mas cerca de cero es mejor.
RMSE es una forma útil de ver qué tan bien un modelo de regresión puede ajustarse a un conjunto de datos.
Cuanto mayor sea el rmse, mayor será la diferencia entre los valores predichos y reales, lo que significa que peor se ajusta un modelo de regresión a los datos. Por el contrario, cuanto más pequeño sea el rmse, mejor podrá un modelo ajustar los datos.
\[ rmse = \sqrt{\frac{\sum(predicho_i - real_i)^{2}}{n}} \]
print('Mean Squared Error: MSE', metrics.mean_squared_error(Sales_test, predicciones))
## Mean Squared Error: MSE 9.692919966782783
print('Root Mean Squared Error RMSE:', np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
## Root Mean Squared Error RMSE: 3.1133454621649013
El valor de 3.1133 habrá que compararlo con otro modelo.
Construir un arreglo para ir guardando los valores de rmse y compararlos al final.
rmse = []
rmse.append(np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
rmse
## [3.1133454621649013]
Desde Sklearn con PolynomialFeatures, se crea un objeto polinómico de segundo nivel. Se crea otro objeto de X_poly a partir de los datos de entrenamiento y finalmente se cra el modelo polinómico de segundo nivel.
Se carga la librería necesaria y se utiliza la variable TV de los datos de entrenamiento.
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = 2)
TV_poly = poly_reg.fit_transform(TV_train)
modelo_poly2 = LinearRegression()
modelo_poly2.fit(TV_poly, Sales_train)
LinearRegression()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
LinearRegression()
\[ Y = \beta0 + \beta_1\cdot x_i+\beta_2\cdot x_i^2 + … \beta_n \cdot x_i^n \]
curva_tendencia = modelo_poly2.predict(poly_reg.fit_transform(TV_train))
plt.scatter(TV_train, Sales_train, color = 'b', )
plt.scatter(TV_train, curva_tendencia, color='r', linestyle = 'solid')
plt.show()
Se utiliza la variable TV con los datos de validación
predicciones = modelo_poly2.predict(poly_reg.fit_transform(TV_test))
predicciones
## array([[17.14254647],
## [ 7.06226296],
## [18.38954062],
## [18.66339748],
## [19.171475 ],
## [16.55261839],
## [17.3907147 ],
## [14.79310998],
## [ 7.50071058],
## [ 9.37470471],
## [12.22048639],
## [18.9875034 ],
## [15.42155813],
## [13.5505061 ],
## [17.38756128],
## [13.96498768],
## [18.70219819],
## [15.69889225],
## [17.33685757],
## [17.72642021],
## [ 6.74249909],
## [10.46124237],
## [11.85094718],
## [16.86288991],
## [ 9.48097938],
## [17.36543605],
## [16.34037345],
## [19.01165321],
## [18.02345136],
## [17.23080169],
## [11.00009625],
## [ 6.51777093],
## [14.31540614],
## [17.01271164],
## [19.22972603],
## [14.3659353 ],
## [14.17647394],
## [17.95385667],
## [11.01163845],
## [ 8.64837539],
## [17.22755676],
## [ 6.72850847],
## [17.29210754],
## [11.06348779],
## [18.85211261],
## [17.61597237],
## [13.04136658],
## [15.92484448],
## [11.59058507],
## [10.6327701 ],
## [11.06348779],
## [ 9.86408793],
## [17.51227106],
## [ 7.86482069],
## [ 6.95841758],
## [ 9.0463464 ],
## [13.85546372],
## [14.25540439],
## [17.74409461],
## [12.88285575]])
Se construye tabla de comparaciones para determinar R Square y rmse
diccionario = {'TV': TV_test.flatten().tolist(),
'Real' : Sales_test.flatten().tolist(),
'Predicho' : predicciones.flatten().tolist()}
diccionario
## {'TV': [210.8, 13.2, 253.8, 265.2, 289.7, 193.7, 218.5, 149.8, 19.6, 48.3, 97.2, 280.2, 164.5, 123.1, 218.4, 131.7, 266.9, 171.3, 216.8, 229.5, 8.6, 66.1, 90.4, 202.5, 50.0, 217.7, 187.9, 281.4, 239.9, 213.5, 75.3, 5.4, 139.2, 206.9, 292.9, 140.3, 136.2, 237.4, 75.5, 36.9, 213.4, 8.4, 215.4, 76.4, 273.7, 225.8, 112.9, 177.0, 85.7, 69.0, 76.4, 56.2, 222.4, 25.0, 11.7, 43.1, 129.4, 137.9, 230.1, 109.8], 'Real': [23.8, 5.6, 17.6, 12.7, 25.4, 19.2, 12.2, 10.1, 7.6, 11.6, 9.6, 14.8, 14.5, 15.2, 18.0, 12.9, 25.4, 19.0, 22.3, 19.7, 4.8, 8.6, 8.7, 16.6, 8.4, 19.4, 14.7, 24.4, 23.2, 21.7, 11.3, 5.3, 12.2, 12.9, 21.4, 10.3, 13.2, 18.9, 9.9, 10.8, 17.0, 5.7, 17.1, 9.4, 20.8, 13.4, 11.9, 12.8, 13.3, 9.3, 11.8, 8.7, 11.5, 7.2, 7.3, 10.1, 11.0, 19.2, 22.1, 16.7], 'Predicho': [17.142546474250675, 7.062262961210172, 18.389540622778977, 18.663397481706717, 19.171475004140696, 16.552618391008313, 17.390714704535377, 14.793109978049504, 7.500710577959602, 9.374704709055353, 12.220486391704206, 18.987503401700444, 15.421558125710973, 13.550506101133672, 17.387561276767656, 13.96498767651379, 18.70219818976571, 15.698892252555366, 17.336857565862406, 17.72642020953176, 6.742499085546902, 10.461242367141942, 11.850947181513057, 16.862889912962856, 9.480979379927813, 17.365436045147963, 16.34037344803565, 19.0116532109153, 18.023451359822904, 17.230801686652246, 11.000096250376771, 6.5177709330682925, 14.315406135578028, 17.012711639605786, 19.229726025902572, 14.365935299436327, 14.176473935552774, 17.953856668862823, 11.011638454476454, 8.64837539361376, 17.22755676380301, 6.728508473065897, 17.292107539477954, 11.063487792794337, 18.852112606290156, 17.61597236727559, 13.041366577688883, 15.924844481381749, 11.590585065313327, 10.632770097648708, 11.063487792794337, 9.864087926958335, 17.51227106420486, 7.864820687997847, 6.958417584318582, 9.046346401685451, 13.855463716596761, 14.2554043863639, 17.744094613127864, 12.882855752862476]}
comparaciones = pd.DataFrame(diccionario)
comparaciones.head(10)
## TV Real Predicho
## 0 210.8 23.8 17.142546
## 1 13.2 5.6 7.062263
## 2 253.8 17.6 18.389541
## 3 265.2 12.7 18.663397
## 4 289.7 25.4 19.171475
## 5 193.7 19.2 16.552618
## 6 218.5 12.2 17.390715
## 7 149.8 10.1 14.793110
## 8 19.6 7.6 7.500711
## 9 48.3 11.6 9.374705
# Con lo real vs predicciones
r = np.corrcoef(comparaciones['Real'], comparaciones['Predicho'])
r = r ** 2
r = r.reshape(-1,2)
r = r[0, 1]
print('R Square :', np.round(r, 4) )
# con r2_score([2, 5, 9], [3, 5, 11])
## R Square : 0.6816
print('R Square :', r2_score(comparaciones['Real'], comparaciones['Predicho'] ))
## R Square : 0.6695798444564593
El valor de R Square está por encima del 60% por lo que se acepta el modelo conforme a lo establecido al principio del caso.
Con la tabla de comparaciones se determina rmse.
print('Mean Squared Error: MSE', metrics.mean_squared_error(Sales_test, predicciones))
## Mean Squared Error: MSE 9.9368685197283
print('Root Mean Squared Error RMSE:', np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
## Root Mean Squared Error RMSE: 3.152279892352248
Agregar el valor de la métrica rmse al arreglo rmse[] creado anteriormente.
rmse.append(np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
rmse
## [3.1133454621649013, 3.152279892352248]
Desde Sklearn con PolynomialFeatures, se crea un objeto polinómico de segundo nivel. Se crea otro objeto de X_poly a partir de los datos de entrenamiento y finalmente se crea el modelo polinómico de quinto nivel.
Se carga la librería necesaria y se utiliza la variable TV de los datos de entrenamiento.
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree = 5)
TV_poly = poly_reg.fit_transform(TV_train)
modelo_poly5 = LinearRegression()
modelo_poly5.fit(TV_poly, Sales_train)
LinearRegression()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
LinearRegression()
\[ Y = \beta0 + \beta_1\cdot x_i+\beta_2\cdot x_i^2 + \beta_3\cdot x_i^3 +\beta_4\cdot x_i^4 +\beta_5\cdot x_i^5 \]
curva_tendencia = modelo_poly5.predict(poly_reg.fit_transform(TV_train))
plt.scatter(TV_train, Sales_train, color = 'b', )
plt.scatter(TV_train, curva_tendencia, color='r', linestyle = 'solid')
plt.show()
Se utiliza la variable TV con los datos de validación
predicciones = modelo_poly5.predict(poly_reg.fit_transform(TV_test))
predicciones
## array([[17.15551798],
## [ 6.40374995],
## [17.90591725],
## [18.24262187],
## [20.03055422],
## [16.64416057],
## [17.32362698],
## [14.58860055],
## [ 7.507313 ],
## [10.31192264],
## [12.14709604],
## [19.09651099],
## [15.35511891],
## [13.22589331],
## [17.32166116],
## [13.64616836],
## [18.31116573],
## [15.6920917 ],
## [17.28947247],
## [17.51232523],
## [ 5.45426825],
## [11.10689936],
## [11.91047895],
## [16.932178 ],
## [10.4062931 ],
## [17.30775045],
## [16.42588588],
## [19.19432591],
## [17.663386 ],
## [17.2184895 ],
## [11.41893505],
## [ 4.70648374],
## [14.03044951],
## [17.05630966],
## [20.43842839],
## [14.08780527],
## [13.87517093],
## [17.62731179],
## [11.42543505],
## [ 9.51791781],
## [17.21623767],
## [ 5.40971599],
## [17.26013482],
## [11.45460924],
## [18.65080148],
## [17.45414771],
## [12.76519362],
## [15.96022301],
## [11.75472382],
## [11.20892352],
## [11.45460924],
## [10.71147992],
## [17.39635219],
## [ 8.26939649],
## [ 6.10952865],
## [ 9.98804709],
## [13.53131807],
## [13.96294164],
## [17.52139223],
## [12.63435499]])
Se construye tabla de comparaciones para determinar R Square y rmse
diccionario = {'TV': TV_test.flatten().tolist(),
'Real' : Sales_test.flatten().tolist(),
'Predicho' : predicciones.flatten().tolist()}
diccionario
## {'TV': [210.8, 13.2, 253.8, 265.2, 289.7, 193.7, 218.5, 149.8, 19.6, 48.3, 97.2, 280.2, 164.5, 123.1, 218.4, 131.7, 266.9, 171.3, 216.8, 229.5, 8.6, 66.1, 90.4, 202.5, 50.0, 217.7, 187.9, 281.4, 239.9, 213.5, 75.3, 5.4, 139.2, 206.9, 292.9, 140.3, 136.2, 237.4, 75.5, 36.9, 213.4, 8.4, 215.4, 76.4, 273.7, 225.8, 112.9, 177.0, 85.7, 69.0, 76.4, 56.2, 222.4, 25.0, 11.7, 43.1, 129.4, 137.9, 230.1, 109.8], 'Real': [23.8, 5.6, 17.6, 12.7, 25.4, 19.2, 12.2, 10.1, 7.6, 11.6, 9.6, 14.8, 14.5, 15.2, 18.0, 12.9, 25.4, 19.0, 22.3, 19.7, 4.8, 8.6, 8.7, 16.6, 8.4, 19.4, 14.7, 24.4, 23.2, 21.7, 11.3, 5.3, 12.2, 12.9, 21.4, 10.3, 13.2, 18.9, 9.9, 10.8, 17.0, 5.7, 17.1, 9.4, 20.8, 13.4, 11.9, 12.8, 13.3, 9.3, 11.8, 8.7, 11.5, 7.2, 7.3, 10.1, 11.0, 19.2, 22.1, 16.7], 'Predicho': [17.155517977601132, 6.403749950726516, 17.905917249173168, 18.24262186758659, 20.03055422237747, 16.64416057489049, 17.32362697834466, 14.58860055405955, 7.507312998136489, 10.311922639939501, 12.147096041535978, 19.09651099216614, 15.355118905354015, 13.225893314555954, 17.321661157247288, 13.646168356539693, 18.311165730062097, 15.692091698714844, 17.289472472536257, 17.512325233544257, 5.4542682472306705, 11.106899361351138, 11.910478951010704, 16.932177998275503, 10.406293101610707, 17.307750453203337, 16.425885877826442, 19.1943259069763, 17.66338599789543, 17.218489498134968, 11.418935045446919, 4.706483739832395, 14.030449505538957, 17.05630965839364, 20.438428391808028, 14.08780527215934, 13.875170934307885, 17.627311789259974, 11.425435049031295, 9.517917814267511, 17.21623766813047, 5.409715988165635, 17.260134819305673, 11.454609242153893, 18.650801479218497, 17.454147712411153, 12.765193621015651, 15.960223008957197, 11.75472382245617, 11.208923519392595, 11.454609242153893, 10.711479923814547, 17.396352192660114, 8.269396488216474, 6.10952865021931, 9.988047092960741, 13.531318074208151, 13.962941640888008, 17.52139223038935, 12.634354993421118]}
comparaciones = pd.DataFrame(diccionario)
comparaciones.head(10)
## TV Real Predicho
## 0 210.8 23.8 17.155518
## 1 13.2 5.6 6.403750
## 2 253.8 17.6 17.905917
## 3 265.2 12.7 18.242622
## 4 289.7 25.4 20.030554
## 5 193.7 19.2 16.644161
## 6 218.5 12.2 17.323627
## 7 149.8 10.1 14.588601
## 8 19.6 7.6 7.507313
## 9 48.3 11.6 10.311923
# Con lo real vs predicciones
r = np.corrcoef(comparaciones['Real'], comparaciones['Predicho'])
r = r ** 2
r = r.reshape(-1,2)
r = r[0, 1]
print('R Square :', np.round(r, 4) )
# con r2_score([2, 5, 9], [3, 5, 11])
## R Square : 0.6858
print('R Square :', r2_score(comparaciones['Real'], comparaciones['Predicho'] ))
## R Square : 0.676120432679816
El valor de R Square está por encima del 60% por lo que se acepta el modelo conforme a lo establecido al principio del caso.
Con la tabla de comparaciones se determina rmse.
print('Mean Squared Error: MSE', metrics.mean_squared_error(Sales_test, predicciones))
## Mean Squared Error: MSE 9.7401705758324
print('Root Mean Squared Error RMSE:', np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
## Root Mean Squared Error RMSE: 3.1209246347568858
Agregar el valor de la métrica rmse al arreglo rmse[] creado anteriormente.
rmse.append(np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
rmse
## [3.1133454621649013, 3.152279892352248, 3.1209246347568858]
rmse
## [3.1133454621649013, 3.152279892352248, 3.1209246347568858]
De acuerdo al valor de la métrica rmse el modelo que resultó con menor variación en las predicciones es el modelo de regresión lineal simple para este conjunto de datos y con estas variables de TV como independiente y Sales como dependiente.