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”)
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 1271 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 1271 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=1271)
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([[ 89.7],
## [ 5.4],
## [175.7],
## [216.4],
## [ 74.7],
## [184.9],
## [250.9],
## [248.8],
## [262.7]])
TV_test[1:10]
## array([[ 8.7],
## [139.5],
## [ 19.4],
## [228.3],
## [187.9],
## [ 97.2],
## [253.8],
## [ 8.6],
## [292.9]])
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: [6.85295949]
print("Valor de b; ", b)
## Valor de b; [[0.04925669]]
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([[ 89.7],
## [ 5.4],
## [175.7],
## [216.4],
## [ 74.7],
## [184.9],
## [250.9],
## [248.8],
## [262.7]])
predicciones = modelo_ls.predict(TV_test)
predicciones[1:10]
## array([[ 7.28149265],
## [13.72426706],
## [ 7.80853918],
## [18.0982607 ],
## [16.10829062],
## [11.64070928],
## [19.35430617],
## [ 7.27656698],
## [21.28024255]])
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': [199.8, 8.7, 139.5, 19.4, 228.3, 187.9, 97.2, 253.8, 8.6, 292.9, 175.1, 240.1, 218.4, 280.7, 38.2, 93.9, 44.5, 165.6, 239.3, 31.5, 136.2, 213.5, 75.5, 290.7, 137.9, 206.9, 193.7, 206.8, 151.5, 171.3, 177.0, 85.7, 80.2, 225.8, 18.8, 215.4, 205.0, 66.9, 120.5, 193.2, 219.8, 109.8, 123.1, 120.2, 48.3, 27.5, 188.4, 180.8, 104.6, 75.1, 228.0, 66.1, 100.4, 76.3, 218.5, 97.5, 216.8, 43.1, 276.9, 135.2], 'Real': [10.6, 7.2, 10.3, 6.6, 15.5, 14.7, 9.6, 17.6, 4.8, 21.4, 14.9, 13.2, 18.0, 16.1, 7.6, 15.3, 10.4, 12.6, 15.7, 9.5, 13.2, 21.7, 9.9, 12.8, 19.2, 12.9, 19.2, 12.2, 18.5, 19.0, 12.8, 13.3, 8.8, 13.4, 7.0, 17.1, 22.6, 9.7, 14.2, 15.2, 19.6, 16.7, 15.2, 13.2, 11.6, 6.9, 14.9, 12.9, 10.4, 12.6, 21.5, 8.6, 10.7, 12.0, 12.2, 9.7, 22.3, 10.1, 27.0, 17.2], 'Predicho': [16.694445172825215, 7.2814926518532275, 13.724267061812075, 7.808539182331512, 18.098260697930925, 16.108290620237213, 11.64070928244465, 19.354306167762353, 7.276566983344084, 21.28024255483721, 15.47780505106693, 18.679489582009783, 17.610619515525784, 20.67931099672178, 8.734564862050368, 11.478162221642936, 9.044881978126368, 15.00986654269836, 18.64008423393664, 8.404545071937797, 13.561720001010361, 17.369261758577785, 10.571839215960651, 21.171877847636065, 13.64545636566579, 17.044167636974358, 16.393979393767502, 17.039241968465213, 14.315347282909219, 15.290629647719502, 15.571392752740644, 11.074257403893222, 10.803345635890366, 17.975118985202357, 7.778985171276656, 17.462849460251498, 16.950579935300645, 10.148231724174366, 12.788390045074934, 16.369351051221784, 17.679578874653785, 12.26134351459665, 12.916457426312647, 12.773613039547506, 9.232057381473796, 8.207518331572082, 16.13291896278293, 15.758568156088073, 12.00520875212122, 10.55213654192408, 18.083483692403497, 10.108826376101224, 11.798330674737223, 10.611244564033793, 17.61554518403493, 11.655486287972078, 17.5318088193795, 8.975922618998368, 20.49213559337435, 13.512463315918932]}
comparaciones = pd.DataFrame(diccionario)
comparaciones
## TV Real Predicho
## 0 199.8 10.6 16.694445
## 1 8.7 7.2 7.281493
## 2 139.5 10.3 13.724267
## 3 19.4 6.6 7.808539
## 4 228.3 15.5 18.098261
## 5 187.9 14.7 16.108291
## 6 97.2 9.6 11.640709
## 7 253.8 17.6 19.354306
## 8 8.6 4.8 7.276567
## 9 292.9 21.4 21.280243
## 10 175.1 14.9 15.477805
## 11 240.1 13.2 18.679490
## 12 218.4 18.0 17.610620
## 13 280.7 16.1 20.679311
## 14 38.2 7.6 8.734565
## 15 93.9 15.3 11.478162
## 16 44.5 10.4 9.044882
## 17 165.6 12.6 15.009867
## 18 239.3 15.7 18.640084
## 19 31.5 9.5 8.404545
## 20 136.2 13.2 13.561720
## 21 213.5 21.7 17.369262
## 22 75.5 9.9 10.571839
## 23 290.7 12.8 21.171878
## 24 137.9 19.2 13.645456
## 25 206.9 12.9 17.044168
## 26 193.7 19.2 16.393979
## 27 206.8 12.2 17.039242
## 28 151.5 18.5 14.315347
## 29 171.3 19.0 15.290630
## 30 177.0 12.8 15.571393
## 31 85.7 13.3 11.074257
## 32 80.2 8.8 10.803346
## 33 225.8 13.4 17.975119
## 34 18.8 7.0 7.778985
## 35 215.4 17.1 17.462849
## 36 205.0 22.6 16.950580
## 37 66.9 9.7 10.148232
## 38 120.5 14.2 12.788390
## 39 193.2 15.2 16.369351
## 40 219.8 19.6 17.679579
## 41 109.8 16.7 12.261344
## 42 123.1 15.2 12.916457
## 43 120.2 13.2 12.773613
## 44 48.3 11.6 9.232057
## 45 27.5 6.9 8.207518
## 46 188.4 14.9 16.132919
## 47 180.8 12.9 15.758568
## 48 104.6 10.4 12.005209
## 49 75.1 12.6 10.552137
## 50 228.0 21.5 18.083484
## 51 66.1 8.6 10.108826
## 52 100.4 10.7 11.798331
## 53 76.3 12.0 10.611245
## 54 218.5 12.2 17.615545
## 55 97.5 9.7 11.655486
## 56 216.8 22.3 17.531809
## 57 43.1 10.1 8.975923
## 58 276.9 27.0 20.492136
## 59 135.2 17.2 13.512463
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.531
print('R Square :', r2_score(comparaciones['Real'], comparaciones['Predicho'] ))
## R Square : 0.5145324375428474
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 10.231369124969202
print('Root Mean Squared Error RMSE:', np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
## Root Mean Squared Error RMSE: 3.198651141492176
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.198651141492176]
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([[16.96457357],
## [ 6.68111726],
## [14.17182174],
## [ 7.36755077],
## [18.13946229],
## [16.44644824],
## [11.9639541 ],
## [19.11174715],
## [ 6.67464009],
## [20.45779849],
## [15.87101427],
## [18.5986489 ],
## [17.74189818],
## [20.05661462],
## [ 8.54183051],
## [11.78308341],
## [ 8.92627493],
## [15.43179087],
## [18.56802203],
## [ 8.12798423],
## [14.00695399],
## [17.5409671 ],
## [10.75170504],
## [20.38671492],
## [14.09204178],
## [17.26597454],
## [16.70100794],
## [17.26176958],
## [14.76081665],
## [15.69656649],
## [15.95761737],
## [11.32824175],
## [11.01884586],
## [18.04012776],
## [ 7.32940654],
## [17.61920588],
## [17.18588427],
## [10.25633776],
## [13.20548426],
## [16.67921504],
## [17.79880149],
## [12.64306756],
## [13.3401641 ],
## [13.18989441],
## [ 9.15596206],
## [ 7.87845848],
## [16.46854494],
## [16.129582 ],
## [12.36500424],
## [10.72885271],
## [18.12757998],
## [10.20982603],
## [12.13815159],
## [10.79735466],
## [17.74597016],
## [11.98033499],
## [17.67659069],
## [ 8.84123606],
## [19.92817058],
## [13.95674759]])
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': [199.8, 8.7, 139.5, 19.4, 228.3, 187.9, 97.2, 253.8, 8.6, 292.9, 175.1, 240.1, 218.4, 280.7, 38.2, 93.9, 44.5, 165.6, 239.3, 31.5, 136.2, 213.5, 75.5, 290.7, 137.9, 206.9, 193.7, 206.8, 151.5, 171.3, 177.0, 85.7, 80.2, 225.8, 18.8, 215.4, 205.0, 66.9, 120.5, 193.2, 219.8, 109.8, 123.1, 120.2, 48.3, 27.5, 188.4, 180.8, 104.6, 75.1, 228.0, 66.1, 100.4, 76.3, 218.5, 97.5, 216.8, 43.1, 276.9, 135.2], 'Real': [10.6, 7.2, 10.3, 6.6, 15.5, 14.7, 9.6, 17.6, 4.8, 21.4, 14.9, 13.2, 18.0, 16.1, 7.6, 15.3, 10.4, 12.6, 15.7, 9.5, 13.2, 21.7, 9.9, 12.8, 19.2, 12.9, 19.2, 12.2, 18.5, 19.0, 12.8, 13.3, 8.8, 13.4, 7.0, 17.1, 22.6, 9.7, 14.2, 15.2, 19.6, 16.7, 15.2, 13.2, 11.6, 6.9, 14.9, 12.9, 10.4, 12.6, 21.5, 8.6, 10.7, 12.0, 12.2, 9.7, 22.3, 10.1, 27.0, 17.2], 'Predicho': [16.964573571385678, 6.681117258556514, 14.171821742258587, 7.367550772142348, 18.139462288418272, 16.446448238495563, 11.963954104456043, 19.111747150042348, 6.6746400851262635, 20.457798489690518, 15.87101427020357, 18.598648895029168, 17.741898184528015, 20.056614618287785, 8.541830506484175, 11.783083409995118, 8.926274931874485, 15.431790865414172, 18.568022026650564, 8.127984230502802, 14.006953993891905, 17.540967095172366, 10.751705037109643, 20.386714924604604, 14.092041778057938, 17.265974536969434, 16.701007939113644, 17.261769577820925, 14.7608166460445, 15.696566486525512, 15.95761737292375, 11.32824174519778, 11.018845862751572, 18.040127755781555, 7.329406540014249, 17.61920588134382, 17.1858842744786, 10.256337760280417, 13.205484262695164, 16.67921503864416, 17.79880149379125, 12.643067562608662, 13.34016409581989, 13.189894412464001, 9.155962056093063, 7.878458477505536, 16.46854494158092, 16.129582000126412, 12.365004238020681, 10.728852712346821, 18.12757997652573, 10.20982602757902, 12.13815158681761, 10.797354658236939, 17.745970158380523, 11.980334987913443, 17.67659068909259, 8.84123606110649, 19.9281705756277, 13.956747588776832]}
comparaciones = pd.DataFrame(diccionario)
comparaciones.head(10)
## TV Real Predicho
## 0 199.8 10.6 16.964574
## 1 8.7 7.2 6.681117
## 2 139.5 10.3 14.171822
## 3 19.4 6.6 7.367551
## 4 228.3 15.5 18.139462
## 5 187.9 14.7 16.446448
## 6 97.2 9.6 11.963954
## 7 253.8 17.6 19.111747
## 8 8.6 4.8 6.674640
## 9 292.9 21.4 20.457798
# 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.5453
print('R Square :', r2_score(comparaciones['Real'], comparaciones['Predicho'] ))
## R Square : 0.5279443390770824
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.948709425585866
print('Root Mean Squared Error RMSE:', np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
## Root Mean Squared Error RMSE: 3.1541574826862826
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.198651141492176, 3.1541574826862826]
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.38855966],
## [ 5.4001951 ],
## [13.69647396],
## [ 7.74711688],
## [18.03075141],
## [16.86535067],
## [11.4940421 ],
## [18.34795452],
## [ 5.373154 ],
## [22.10993344],
## [16.14229097],
## [18.14366102],
## [17.89258609],
## [20.06125689],
## [ 9.91314874],
## [11.39614226],
## [10.27656919],
## [15.52383348],
## [18.13593036],
## [ 9.35961889],
## [13.47337009],
## [17.79486974],
## [11.01389702],
## [21.65308249],
## [13.58766144],
## [17.62494084],
## [17.13987377],
## [17.6220048 ],
## [14.53746987],
## [15.90164791],
## [16.25864593],
## [11.19636836],
## [11.09118146],
## [18.00191509],
## [ 7.64146017],
## [17.83546076],
## [17.56725355],
## [10.88319061],
## [12.50713656],
## [17.11764268],
## [17.9165064 ],
## [11.9717186 ],
## [12.65382751],
## [12.49060345],
## [10.4393274 ],
## [ 8.92548325],
## [16.8904242 ],
## [16.48251275],
## [11.75419779],
## [11.00767856],
## [18.02745901],
## [10.87057299],
## [11.59950025],
## [11.02646878],
## [17.89435043],
## [11.50348178],
## [17.86314807],
## [10.20678821],
## [19.6318646 ],
## [13.40683602]])
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': [199.8, 8.7, 139.5, 19.4, 228.3, 187.9, 97.2, 253.8, 8.6, 292.9, 175.1, 240.1, 218.4, 280.7, 38.2, 93.9, 44.5, 165.6, 239.3, 31.5, 136.2, 213.5, 75.5, 290.7, 137.9, 206.9, 193.7, 206.8, 151.5, 171.3, 177.0, 85.7, 80.2, 225.8, 18.8, 215.4, 205.0, 66.9, 120.5, 193.2, 219.8, 109.8, 123.1, 120.2, 48.3, 27.5, 188.4, 180.8, 104.6, 75.1, 228.0, 66.1, 100.4, 76.3, 218.5, 97.5, 216.8, 43.1, 276.9, 135.2], 'Real': [10.6, 7.2, 10.3, 6.6, 15.5, 14.7, 9.6, 17.6, 4.8, 21.4, 14.9, 13.2, 18.0, 16.1, 7.6, 15.3, 10.4, 12.6, 15.7, 9.5, 13.2, 21.7, 9.9, 12.8, 19.2, 12.9, 19.2, 12.2, 18.5, 19.0, 12.8, 13.3, 8.8, 13.4, 7.0, 17.1, 22.6, 9.7, 14.2, 15.2, 19.6, 16.7, 15.2, 13.2, 11.6, 6.9, 14.9, 12.9, 10.4, 12.6, 21.5, 8.6, 10.7, 12.0, 12.2, 9.7, 22.3, 10.1, 27.0, 17.2], 'Predicho': [17.388559655894333, 5.400195099366398, 13.696473960564878, 7.7471168768384935, 18.03075140621396, 16.865350666587965, 11.494042096872478, 18.347954516933292, 5.373154000093435, 22.109933435865763, 16.142290965376, 18.143661020248167, 17.892586094743585, 20.061256889456466, 9.913148738805662, 11.396142258121548, 10.276569193471824, 15.52383347755316, 18.135930363941064, 9.359618893330444, 13.473370091104824, 17.794869743583455, 11.013897015370008, 21.65308248591534, 13.587661436428368, 17.624940836160185, 17.139873771647977, 17.62200480075912, 14.53746987370595, 15.901647911298474, 16.258645934678263, 11.196368359157466, 11.091181460174388, 18.00191509270072, 7.64146017189609, 17.835460758229083, 17.56725355011698, 10.883190610725547, 12.507136559813281, 17.11764268089913, 17.916506397304282, 11.971718601025428, 12.653827514205217, 12.490603446246082, 10.43932740136587, 8.925483251976768, 16.89042420413721, 16.482512747199742, 11.75419778630713, 11.00767855639029, 18.027459013476822, 10.870572992170567, 11.59950025170662, 11.02646878246347, 17.89435043091816, 11.503481778460843, 17.863148074838215, 10.206788211898468, 19.63186460239958, 13.406836021288603]}
comparaciones = pd.DataFrame(diccionario)
comparaciones.head(10)
## TV Real Predicho
## 0 199.8 10.6 17.388560
## 1 8.7 7.2 5.400195
## 2 139.5 10.3 13.696474
## 3 19.4 6.6 7.747117
## 4 228.3 15.5 18.030751
## 5 187.9 14.7 16.865351
## 6 97.2 9.6 11.494042
## 7 253.8 17.6 18.347955
## 8 8.6 4.8 5.373154
## 9 292.9 21.4 22.109933
# 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.52
print('R Square :', r2_score(comparaciones['Real'], comparaciones['Predicho'] ))
## R Square : 0.49260699320685875
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 10.693454198367416
print('Root Mean Squared Error RMSE:', np.sqrt(metrics.mean_squared_error(Sales_test, predicciones)))
## Root Mean Squared Error RMSE: 3.2700847387135727
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.198651141492176, 3.1541574826862826, 3.2700847387135727]
Se cambio la semilla como se recomendo, con esto podemos ver que los valores de R Square se logro mantener por encima del 60%, por lo que podemos aceptar el modelo conforme los valores que se nos dieron.
Los tres modelos tienen un R Square por encima del 60% por lo que se acepta el modelo conforme a la métrica establecida como estadístico de medición. Estosignifica que la variable TV explica al menos el 60% a la variable Sales.
Los coeficientes de los tres modelos son diferents de 0 con nivees de confianza en su mayoría por encima del 90%
La tabla siguiente resume cual modelo es más eficiente dado que tiene menor error de variación rmse = Root Mean Stándar Error.
rmse
## [3.198651141492176, 3.1541574826862826, 3.2700847387135727]
El modelo más óptimo en cuanto a la métrica de rmse es Polinomial Segundo nivel con un valor de 3.1541574826862826 comparado con los otros dos y que significa que las predicciones tienen menor variación o diferencia con respecto a los valores reales. Podemos ver que la métrica rmse sale mejor on python que con R, para este caso podemos decir que es mas eficiente Python que R.