1 Objetivo

Construir modelos de regresión lineal simple y polinómico importando datos FIFA con variable Overall y Valor para realizar predicciones y evaluar y comparar su rendimiento.

2 Descripción

  • Cargar librerías

  • Cargar datos de FIFA

  • Métricas a evaluar

  • Explorar datos

    • Variables independiente y dependiente

    • Visualizar dispersión de los datos

  • Construir datos de entrenamiento y datos de validación.

  • Regresión Lineal Simple

    • Construir el modelo

    • Predicciones

    • Metricas del modelo

  • Regresión Polinómica de segundo

    • Construir el modelo

    • Predicciones

    • Métricas del modelo

  • Regresión Polinómica de quinto nivel

    • Construir el modelo

    • Predicciones

    • Métricas del modelo

  • Interpretación

3 Desarrollo

3.1 Métricas a valorar en los modelos

Se van a realizar y evaluar métricas de las predicciones con los modelos de regresión lineal simple y regresión polinómica con los mismos datos.

Los modelos se aceptan si las métricas cumplen estos requisitos:

  • El valor de R Square y R Square ajustado sobrepasa el 50%,

  • Que sus variables sea estadísticamente significativas al 95%. Al menos un ‘*’

  • Que el valor de RMSE (Raiz del Error Estándar Medio) sea menor que : 2 000 000 (dos millones).

  • Al final se deben comparar los modelos.

3.2 Cargar librerías

library(readr) # Para importar datos
library(dplyr) # Para filtrar   
library(knitr) # Para datos tabulares
library(ggplot2) # Para visualizar
library(plotly)
library(caret)  # Para particionar
library(Metrics) # Para determinar rmse 

3.3 Cargar datos

datos <- read.csv("https://raw.githubusercontent.com/rpizarrog/Analisis-Inteligente-de-datos/main/datos/datos.limpios.csv", stringsAsFactors = TRUE)

3.4 Explorar datos

str(datos)
## 'data.frame':    17907 obs. of  51 variables:
##  $ X.1                     : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ X                       : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Name                    : Factor w/ 16912 levels "\xc0ngel Rangel",..: 9517 3142 12351 4109 8519 4396 9525 9723 15209 7697 ...
##  $ Age                     : int  31 33 26 27 27 27 32 31 32 25 ...
##  $ Nationality             : Factor w/ 163 levels "Afghanistan",..: 7 123 21 140 14 14 36 158 140 137 ...
##  $ Overall                 : int  94 94 92 91 91 91 91 91 91 90 ...
##  $ Potential               : int  94 94 93 93 92 91 91 91 91 93 ...
##  $ Club                    : Factor w/ 651 levels " SSV Jahn Regensburg",..: 216 331 436 378 377 140 473 216 473 63 ...
##  $ Preferred.Foot          : Factor w/ 2 levels "Left","Right": 1 2 2 2 2 2 2 2 2 2 ...
##  $ International.Reputation: int  5 5 5 4 4 4 4 5 4 3 ...
##  $ Weak.Foot               : int  4 4 5 3 5 4 4 4 3 3 ...
##  $ Skill.Moves             : int  4 5 5 1 4 4 4 3 3 1 ...
##  $ Height                  : Factor w/ 21 levels "5'1","5'10","5'11",..: 9 14 11 16 3 10 10 12 12 14 ...
##  $ Weight                  : Factor w/ 57 levels "110lbs","115lbs",..: 22 33 18 26 20 24 16 36 32 37 ...
##  $ Crossing                : int  84 84 79 17 93 81 86 77 66 13 ...
##  $ Finishing               : int  95 94 87 13 82 84 72 93 60 11 ...
##  $ HeadingAccuracy         : int  70 89 62 21 55 61 55 77 91 15 ...
##  $ ShortPassing            : int  90 81 84 50 92 89 93 82 78 29 ...
##  $ Volleys                 : int  86 87 84 13 82 80 76 88 66 13 ...
##  $ Dribbling               : int  97 88 96 18 86 95 90 87 63 12 ...
##  $ Curve                   : int  93 81 88 21 85 83 85 86 74 13 ...
##  $ FKAccuracy              : int  94 76 87 19 83 79 78 84 72 14 ...
##  $ LongPassing             : int  87 77 78 51 91 83 88 64 77 26 ...
##  $ BallControl             : int  96 94 95 42 91 94 93 90 84 16 ...
##  $ Acceleration            : int  91 89 94 57 78 94 80 86 76 43 ...
##  $ SprintSpeed             : int  86 91 90 58 76 88 72 75 75 60 ...
##  $ Agility                 : int  91 87 96 60 79 95 93 82 78 67 ...
##  $ Reactions               : int  95 96 94 90 91 90 90 92 85 86 ...
##  $ Balance                 : int  95 70 84 43 77 94 94 83 66 49 ...
##  $ ShotPower               : int  85 95 80 31 91 82 79 86 79 22 ...
##  $ Jumping                 : int  68 95 61 67 63 56 68 69 93 76 ...
##  $ Stamina                 : int  72 88 81 43 90 83 89 90 84 41 ...
##  $ Strength                : int  59 79 49 64 75 66 58 83 83 78 ...
##  $ LongShots               : int  94 93 82 12 91 80 82 85 59 12 ...
##  $ Aggression              : int  48 63 56 38 76 54 62 87 88 34 ...
##  $ Interceptions           : int  22 29 36 30 61 41 83 41 90 19 ...
##  $ Positioning             : int  94 95 89 12 87 87 79 92 60 11 ...
##  $ Vision                  : int  94 82 87 68 94 89 92 84 63 70 ...
##  $ Penalties               : int  75 85 81 40 79 86 82 85 75 11 ...
##  $ Composure               : int  96 95 94 68 88 91 84 85 82 70 ...
##  $ Marking                 : int  33 28 27 15 68 34 60 62 87 27 ...
##  $ StandingTackle          : int  28 31 24 21 58 27 76 45 92 12 ...
##  $ SlidingTackle           : int  26 23 33 13 51 22 73 38 91 18 ...
##  $ GKDiving                : int  6 7 9 90 15 11 13 27 11 86 ...
##  $ GKHandling              : int  11 11 9 85 13 12 9 25 8 92 ...
##  $ GKKicking               : int  15 15 15 87 5 6 7 31 9 78 ...
##  $ GKPositioning           : int  14 14 15 88 10 8 14 33 7 88 ...
##  $ GKReflexes              : int  8 11 11 94 13 8 9 37 11 89 ...
##  $ Valor                   : int  110500000 77000000 118500000 72000000 102000000 93000000 67000000 80000000 51000000 68000000 ...
##  $ Estatura                : num  1.7 1.88 1.75 1.93 1.8 1.73 1.73 1.83 1.83 1.88 ...
##  $ PesoKgs                 : num  72.1 83 68 76.2 69.8 ...

3.4.1 Variables independiente y dependiente

Se identifican dos variables numéricas de interés:

  • Overall: Reputación y jerarquía internacional numérica del jugador

  • Valor: Sería el valor económico internacional de los jugadores

Se define a la variable independiente como Overall y la variable dependiente Valor, es decir, Overall impacta sobre Value o los valores de la variable Valor dependen de Overall.

print ("Variable Overall")
## [1] "Variable Overall"
summary(datos$Overall)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   46.00   62.00   66.00   66.24   71.00   94.00
print ("Variable Valor que significa el valor económico del jugador en moneda Euros ")
## [1] "Variable Valor que significa el valor económico del jugador en moneda Euros "
summary(datos$Valor)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##     10000    325000    700000   2450133   2100000 118500000

3.4.2 head(datos)

kable(head(datos[, c('X', 'Name', 'Overall', 'Valor')], 20), caption = "Datos. Primeros 20 registros")
Datos. Primeros 20 registros
X Name Overall Valor
1 L. Messi 94 110500000
2 Cristiano Ronaldo 94 77000000
3 Neymar Jr 92 118500000
4 De Gea 91 72000000
5 K. De Bruyne 91 102000000
6 E. Hazard 91 93000000
7 L. Modric 91 67000000
8 L. Surez 91 80000000
9 Sergio Ramos 91 51000000
10 J. Oblak 90 68000000
11 R. Lewandowski 90 77000000
12 T. Kroos 90 76500000
13 D. Godn 90 44000000
14 David Silva 90 60000000
15 N. Kant 89 63000000
16 P. Dybala 89 89000000
17 H. Kane 89 83500000
18 A. Griezmann 89 78000000
19 M. ter Stegen 89 58000000
20 T. Courtois 89 53500000

tail(datos)

kable(head(datos[, c('X', 'Name', 'Overall', 'Valor')], 20), caption = "Datos. Primeros 20 registros")
Datos. Primeros 20 registros
X Name Overall Valor
1 L. Messi 94 110500000
2 Cristiano Ronaldo 94 77000000
3 Neymar Jr 92 118500000
4 De Gea 91 72000000
5 K. De Bruyne 91 102000000
6 E. Hazard 91 93000000
7 L. Modric 91 67000000
8 L. Surez 91 80000000
9 Sergio Ramos 91 51000000
10 J. Oblak 90 68000000
11 R. Lewandowski 90 77000000
12 T. Kroos 90 76500000
13 D. Godn 90 44000000
14 David Silva 90 60000000
15 N. Kant 89 63000000
16 P. Dybala 89 89000000
17 H. Kane 89 83500000
18 A. Griezmann 89 78000000
19 M. ter Stegen 89 58000000
20 T. Courtois 89 53500000

3.5 Dispersión de los datos

g <- plot_ly(data = datos, 
             x = ~Overall, 
             y = ~Valor) %>%
layout(title = 'Jugadores FIFA. Dispersión de Overall y Valor')
g
## No trace type specified:
##   Based on info supplied, a 'scatter' trace seems appropriate.
##   Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
##   Setting the mode to markers
##   Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode

Se observa que la relación de los datos no es del todo lineal, pero se construirán los modelos de regresión lineal simple y polinómico con las mismas variables.

3.6 Datos de entrenamiento y datos de validación

Sembrar semilla para la aleatoriedad de los datos

n <- nrow(datos)
# Modificar la semilla estableciendo como parámetro los últimos cuatro dígitos de su no de control. 
# Ej. set.seed(0732), o set.seed(1023)
# set.seed(2022) 
set.seed(0432)

3.6.1 Datos de entrenamiento

De manera aleatoria se construyen los datos de entrenamiento y los datos de validación.

En la variable entrena se generan los registros que van a ser los datos de entrenamiento, de tal forma que los datos de validación serán los que no sena de entrenamiento [-entrena].

entrena <- createDataPartition(y = datos$Valor, p = 0.70, list = FALSE, times = 1)
# Datos entrenamiento
datos.entrenamiento <- datos[entrena, ]  # [renglones, columna]
# Datos validación
datos.validacion <- datos[-entrena, ]

3.6.1.2 tail()

kable(tail(datos.validacion[, c('X', 'Name', 'Overall', 'Valor')], 20), caption = "Datos de Entrenamiento. Primeros 20 registros")
Datos de Entrenamiento. Primeros 20 registros
X Name Overall Valor
17849 17897 D. Mackay 49 30000
17850 17898 A. Iontton 49 60000
17851 17899 W. Appleyard 49 50000
17852 17900 C. Levingston 49 50000
17855 17903 M. Dyrmose 49 50000
17857 17905 Liu Guobo 48 60000
17858 17906 J. Devine 48 50000
17860 17908 T. Lawal 48 60000
17861 17909 L. Jagne 48 50000
17874 17922 C. Hawkins 48 50000
17878 17926 T. Hillman 48 40000
17885 17933 D. Horton 48 40000
17890 17938 A. Kaltner 47 60000
17891 17939 L. Watkins 47 60000
17894 17942 N. Fuentes 47 50000
17895 17943 J. Milli 47 50000
17898 17946 D. Holland 47 60000
17899 17947 J. Livesey 47 60000
17901 17949 J. Young 47 60000
17902 17950 D. Walsh 47 60000

3.6.2 Datos de validación

3.6.2.1 head()

kable(tail(datos.validacion[, c('X', 'Name', 'Overall', 'Valor')], 20), caption = "Datos de Entrenamiento. Primeros 20 registros")
Datos de Entrenamiento. Primeros 20 registros
X Name Overall Valor
17849 17897 D. Mackay 49 30000
17850 17898 A. Iontton 49 60000
17851 17899 W. Appleyard 49 50000
17852 17900 C. Levingston 49 50000
17855 17903 M. Dyrmose 49 50000
17857 17905 Liu Guobo 48 60000
17858 17906 J. Devine 48 50000
17860 17908 T. Lawal 48 60000
17861 17909 L. Jagne 48 50000
17874 17922 C. Hawkins 48 50000
17878 17926 T. Hillman 48 40000
17885 17933 D. Horton 48 40000
17890 17938 A. Kaltner 47 60000
17891 17939 L. Watkins 47 60000
17894 17942 N. Fuentes 47 50000
17895 17943 J. Milli 47 50000
17898 17946 D. Holland 47 60000
17899 17947 J. Livesey 47 60000
17901 17949 J. Young 47 60000
17902 17950 D. Walsh 47 60000

3.6.2.2 tail()

kable(tail(datos.entrenamiento[, c('X', 'Name', 'Overall', 'Valor')], 20), caption = "Datos de Entrenamiento. Primeros 20 registros")
Datos de Entrenamiento. Primeros 20 registros
X Name Overall Valor
17879 17927 R. Roache 48 70000
17880 17928 L. Wahlstedt 48 50000
17881 17929 J. Williams 48 50000
17882 17930 M. Hurst 48 40000
17883 17931 C. Maher 48 50000
17884 17932 Y. Gez 48 50000
17886 17934 E. Tweed 48 50000
17887 17935 Zhang Yufeng 47 60000
17888 17936 C. Ehlich 47 40000
17889 17937 L. Collins 47 60000
17892 17940 J. Norville-Williams 47 50000
17893 17941 S. Squire 47 50000
17896 17944 S. Griffin 47 60000
17897 17945 K. Fujikawa 47 60000
17900 17948 M. Baldisimo 47 70000
17903 17951 J. Lundstram 47 60000
17904 17952 N. Christoffersson 47 60000
17905 17953 B. Worman 47 60000
17906 17954 D. Walker-Rice 47 60000
17907 17955 G. Nugent 46 60000

3.7 Modelos de regresión

3.7.1 Regresión Lineal Simple

modelo.ls <- lm(formula = Valor ~ Overall, data = datos.entrenamiento)
modelo.ls
## 
## Call:
## lm(formula = Valor ~ Overall, data = datos.entrenamiento)
## 
## Coefficients:
## (Intercept)      Overall  
##   -31721711       515912

3.7.1.1 Coeficientes del modelo

Se determinan los valores de a y b de la fórmula \(Y = a+bx\)

a <- modelo.ls$coefficients[1]
b <- modelo.ls$coefficients[2]
paste("Valor de la abcisa a es   : ", round(a, 6))
## [1] "Valor de la abcisa a es   :  -31721710.608622"
paste("Valor de la pendiente b es: ", round(b, 6))
## [1] "Valor de la pendiente b es:  515911.565161"

3.7.1.2 Linea de tendencia del modelo

Con la el valor de los valores de tendencia o valores ajustados del modelo se visualiza la recta de tendencia del modelo.

La gráfica g se construye por partes, primero la dispersión, segundo la linea de tendencia, tercero se agrega el título, para luego solo mostrar la gráfica g.

g <- plot_ly(data = datos.entrenamiento, 
             x = ~Overall, 
             y = ~Valor, 
             name = 'Dispersión',
             type = 'scatter', 
             mode = 'markers', 
             color = I('blue')) 
g <- g %>% add_trace(x = ~Overall,
                     y = ~modelo.ls$fitted.values, name = 'Tendencia', mode = 'lines+markers', color = I('red'))
g <- g %>%
layout(title = 'Jugadores FIFA. Dispersión y Tendencia de Overall y Valor económico.')
g

3.7.1.3 Predicciones

Con los datos de validación, se hacen predicciones con la función predict().

Se hace un data.frame de comparaciones con lo cual se presentan los valores reales y los valores de las predicciones. Se presenta solo las primeras 20 y últimas 20 predicciones.

predicciones <- predict(object = modelo.ls, newdata = datos.validacion)
comparaciones <- data.frame(Overall = datos.validacion$Overall, Valor = datos.validacion$Valor, predicccion = predicciones)
 kable(x = head(comparaciones, 20), caption = "Predicciones")
Predicciones
Overall Valor predicccion
5 91 1.02e+08 15226242
9 91 5.10e+07 15226242
10 90 6.80e+07 14710330
14 90 6.00e+07 14710330
16 89 8.90e+07 14194419
23 89 3.80e+07 14194419
32 88 7.35e+07 13678507
35 88 4.60e+07 13678507
37 88 6.00e+07 13678507
40 88 2.40e+07 13678507
44 87 6.45e+07 13162596
47 87 3.05e+07 13162596
48 87 6.25e+07 13162596
52 87 3.40e+07 13162596
56 86 6.10e+07 12646684
57 86 5.95e+07 12646684
58 86 4.15e+07 12646684
61 86 5.65e+07 12646684
62 86 5.30e+07 12646684
64 86 5.50e+07 12646684
  kable(x = tail(comparaciones, 20), caption = "Predicciones")
Predicciones
Overall Valor predicccion
17849 49 30000 -6442044
17850 49 60000 -6442044
17851 49 50000 -6442044
17852 49 50000 -6442044
17855 49 50000 -6442044
17857 48 60000 -6957955
17858 48 50000 -6957955
17860 48 60000 -6957955
17861 48 50000 -6957955
17874 48 50000 -6957955
17878 48 40000 -6957955
17885 48 40000 -6957955
17890 47 60000 -7473867
17891 47 60000 -7473867
17894 47 50000 -7473867
17895 47 50000 -7473867
17898 47 60000 -7473867
17899 47 60000 -7473867
17901 47 60000 -7473867
17902 47 60000 -7473867

¡Salen predicciones negativas!, ¿que significa? , no debiera haber predicciones negativas, sin embargo, esto sucede porque el modelo así lo calcula por lo estricto de la linea de tendencia.

3.7.1.4 Determinando métricas

res.modelo.ls <- summary(modelo.ls)
res.modelo.ls
## 
## Call:
## lm(formula = Valor ~ Overall, data = datos.entrenamiento)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
##  -9678507  -2119364   -921630   1027017 102757847 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -31721711     378309  -83.85   <2e-16 ***
## Overall        515912       5682   90.80   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4396000 on 12535 degrees of freedom
## Multiple R-squared:  0.3967, Adjusted R-squared:  0.3967 
## F-statistic:  8244 on 1 and 12535 DF,  p-value: < 2.2e-16

El coeficiente de interseción ‘a’ y la pendiente ‘b’ si son estadísticamente significativas por encima del 99.9%

El valor de R Square no sobrepasa el 50% por lo que NO SE ACEPTA el modelo

3.7.2 Determinando rmse()

El valor de rmse se interpreta en que tanto se desvía una predicción media sobre los valore reales.

rmse.ls <- rmse(actual =comparaciones$Valor, predicted = comparaciones$predicccion)
rmse.ls
## [1] 4298772

El valor de rmse en el modelo de regresión lineal simple no está por debajo de los 2,000,000 (dos millones) que se establecieron como métrica aceptable, por lo que este modelo NO SE ACEPTA.

3.7.3 Regresión polinómica segundo nivel

Se usa el argumento poly “poly(Overall, 2)” en la construcción del modelo para indicar que es polinomial de segunda potencia.

\[ y = β0 + β1{x_i} +β2{x_i}^2+β3{x_i}^3...+βd{x_i}^n+ϵi \]

ó

\[ y = a + bx + cx^2 + dx^3 ...zx^n \]

modelo.poly2 <- lm(formula = Valor ~ poly(Overall, 2), data = datos.entrenamiento, )
modelo.poly2
## 
## Call:
## lm(formula = Valor ~ poly(Overall, 2), data = datos.entrenamiento)
## 
## Coefficients:
##       (Intercept)  poly(Overall, 2)1  poly(Overall, 2)2  
##           2441248          399152122          385944088

3.7.3.1 Coeficientes del modelo

Se determinan los valores de a y b de la fórmula \(Y = a+bx\)

a <- modelo.poly2$coefficients[1]
b <- modelo.poly2$coefficients[2]
paste("Valor de la abcisa a es   : ", round(a, 6))
## [1] "Valor de la abcisa a es   :  2441247.906198"
paste("Valor de la pendiente b es: ", round(b, 6))
## [1] "Valor de la pendiente b es:  399152121.788528"

3.7.3.2 Curva de tendencia del modelo

Con la el valor de los valores de tendencia o valores ajustados del modelo se visualiza la curva de tendencia del modelo.

La gráfica g se construye por partes, primero la dispersión, segundo la curva de tendencia, tercero se agrega el título, para luego solo mostrar la gráfica g.

g <- plot_ly(data = datos.entrenamiento, 
             x = ~Overall, 
             y = ~Valor, 
             name = 'Dispersión',
             type = 'scatter', 
             mode = 'markers', 
             color = I('blue')) 
g <- g %>% add_trace(x = ~Overall,
                     y = ~modelo.poly2$fitted.values, name = 'Tendencia', mode = 'lines+markers', color = I('red'))
g <- g %>%
layout(title = 'Jugadores FIFA. Dispersión y Tendencia de Overall y Valor económico.')
g

3.7.3.3 Predicciones

Con los datos de validación, se hacen predicciones con la función predict().

Se hace un data.frame de comparaciones con lo cual se presentan los valores reales y los valores de las predicciones. Se presenta solo las primeras 20 y últimas 20 predicciones.

predicciones <- predict(object = modelo.poly2, newdata = datos.validacion)
comparaciones <- data.frame(Overall = datos.validacion$Overall, Valor = datos.validacion$Valor, predicccion = predicciones)
 kable(x = head(comparaciones, 20), caption = "Predicciones")
Predicciones
Overall Valor predicccion
5 91 1.02e+08 42727305
9 91 5.10e+07 42727305
10 90 6.80e+07 39825512
14 90 6.00e+07 39825512
16 89 8.90e+07 37022998
23 89 3.80e+07 37022998
32 88 7.35e+07 34319763
35 88 4.60e+07 34319763
37 88 6.00e+07 34319763
40 88 2.40e+07 34319763
44 87 6.45e+07 31715806
47 87 3.05e+07 31715806
48 87 6.25e+07 31715806
52 87 3.40e+07 31715806
56 86 6.10e+07 29211129
57 86 5.95e+07 29211129
58 86 4.15e+07 29211129
61 86 5.65e+07 29211129
62 86 5.30e+07 29211129
64 86 5.50e+07 29211129
  kable(x = tail(comparaciones, 20), caption = "Predicciones")
Predicciones
Overall Valor predicccion
17849 49 30000 6331199
17850 49 60000 6331199
17851 49 50000 6331199
17852 49 50000 6331199
17855 49 50000 6331199
17857 48 60000 7599123
17858 48 50000 7599123
17860 48 60000 7599123
17861 48 50000 7599123
17874 48 50000 7599123
17878 48 40000 7599123
17885 48 40000 7599123
17890 47 60000 8966326
17891 47 60000 8966326
17894 47 50000 8966326
17895 47 50000 8966326
17898 47 60000 8966326
17899 47 60000 8966326
17901 47 60000 8966326
17902 47 60000 8966326

3.7.3.4 Determinando métricas

res.modelo.poly2 <- summary(modelo.poly2)
res.modelo.poly2
## 
## Call:
## lm(formula = Valor ~ poly(Overall, 2), data = datos.entrenamiento)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -30319763   -938236    368151   1225446  72771623 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         2441248      24368   100.2   <2e-16 ***
## poly(Overall, 2)1 399152122    2728412   146.3   <2e-16 ***
## poly(Overall, 2)2 385944088    2728412   141.5   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2728000 on 12534 degrees of freedom
## Multiple R-squared:  0.7677, Adjusted R-squared:  0.7676 
## F-statistic: 2.071e+04 on 2 and 12534 DF,  p-value: < 2.2e-16

El coeficiente de interseción ‘a’ y la pendiente ‘b’ si son estadísticamente significativas por encima del 99.9%

El valor de R Square SI sobrepasa el 50% por lo que SI SE ACEPTA el modelo

3.7.4 Determinando rmse()

El valor de rmse se interpreta en que tanto se desvía una predicción media sobre los valore reales.

rmse.poly2 <- rmse(actual =comparaciones$Valor, predicted = comparaciones$predicccion)
rmse.poly2
## [1] 2750550

El valor de rmse en el modelo de regresión lineal simple no está por debajo de los 2,000,000 (dos millones) que se establecieron como métrica aceptable, por lo que este modelo NO SE ACEPTA por esta métrica.

3.7.5 Regresión polinómica quinto nivel

Se usa el argumento poly “poly(Overall, 5)” en la construcción del modelo para indicar que es polinomial de segunda potencia.

\[ y = β0 + β1{x_i} +β2{x_i}^2+β3{x_i}^3…+βd{x_i}^n+ϵi \]

y = β0 + β1{x_i} +β2{x_i}2+β3{x_i}3…+βd{x_i}^n+ϵi

ó

\[ y = a + bx + cx^2 + dx^3 …zx^n \]

modelo.poly5 <- lm(formula = Valor ~ poly(Overall, 5), data = datos.entrenamiento, )
modelo.poly5
## 
## Call:
## lm(formula = Valor ~ poly(Overall, 5), data = datos.entrenamiento)
## 
## Coefficients:
##       (Intercept)  poly(Overall, 5)1  poly(Overall, 5)2  poly(Overall, 5)3  
##           2441248          399152122          385944088          226933807  
## poly(Overall, 5)4  poly(Overall, 5)5  
##          66828420            6349798

3.7.5.1 Coeficientes del modelo

Se determinan los valores de a y b de la fórmula \(Y = a+bx\)

a <- modelo.poly5$coefficients[1]
b <- modelo.poly5$coefficients[2]
paste("Valor de la abcisa a es   : ", round(a, 6))
## [1] "Valor de la abcisa a es   :  2441247.906198"
paste("Valor de la pendiente b es: ", round(b, 6))
## [1] "Valor de la pendiente b es:  399152121.788535"

3.7.5.2 Curva de tendencia del modelo

Con la el valor de los valores de tendencia o valores ajustados del modelo se visualiza la curva de tendencia del modelo.

La gráfica g se construye por partes, primero la dispersión, segundo la curva de tendencia, tercero se agrega el título, para luego solo mostrar la gráfica g.

g <- plot_ly(data = datos.entrenamiento, 
             x = ~Overall, 
             y = ~Valor, 
             name = 'Dispersión',
             type = 'scatter', 
             mode = 'markers', 
             color = I('blue')) 
g <- g %>% add_trace(x = ~Overall,
                     y = ~modelo.poly5$fitted.values, name = 'Tendencia', mode = 'lines+markers', color = I('red'))
g <- g %>%
layout(title = 'Jugadores FIFA. Dispersión y Tendencia de Overall y Valor económico.')
g

3.7.5.3 Predicciones

Con los datos de validación, se hacen predicciones con la función predict().

Se hace un data.frame de comparaciones con lo cual se presentan los valores reales y los valores de las predicciones. Se presenta solo las primeras 20 y últimas 20 predicciones.

predicciones <- predict(object = modelo.poly5, newdata = datos.validacion)
comparaciones <- data.frame(Overall = datos.validacion$Overall, Valor = datos.validacion$Valor, predicccion = predicciones)
 kable(x = head(comparaciones, 20), caption = "Predicciones")
Predicciones
Overall Valor predicccion
5 91 1.02e+08 76603375
9 91 5.10e+07 76603375
10 90 6.80e+07 67621548
14 90 6.00e+07 67621548
16 89 8.90e+07 59487088
23 89 3.80e+07 59487088
32 88 7.35e+07 52140550
35 88 4.60e+07 52140550
37 88 6.00e+07 52140550
40 88 2.40e+07 52140550
44 87 6.45e+07 45525194
47 87 3.05e+07 45525194
48 87 6.25e+07 45525194
52 87 3.40e+07 45525194
56 86 6.10e+07 39586928
57 86 5.95e+07 39586928
58 86 4.15e+07 39586928
61 86 5.65e+07 39586928
62 86 5.30e+07 39586928
64 86 5.50e+07 39586928
  kable(x = tail(comparaciones, 20), caption = "Predicciones")
Predicciones
Overall Valor predicccion
17849 49 30000 14540.275
17850 49 60000 14540.275
17851 49 50000 14540.275
17852 49 50000 14540.275
17855 49 50000 14540.275
17857 48 60000 7654.838
17858 48 50000 7654.838
17860 48 60000 7654.838
17861 48 50000 7654.838
17874 48 50000 7654.838
17878 48 40000 7654.838
17885 48 40000 7654.838
17890 47 60000 15050.655
17891 47 60000 15050.655
17894 47 50000 15050.655
17895 47 50000 15050.655
17898 47 60000 15050.655
17899 47 60000 15050.655
17901 47 60000 15050.655
17902 47 60000 15050.655

3.7.5.4 Determinando métricas

res.modelo.poly5 <- summary(modelo.poly5)
res.modelo.poly5
## 
## Call:
## lm(formula = Valor ~ poly(Overall, 5), data = datos.entrenamiento)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -48140550   -170751     -2666    163257  32005220 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         2441248      15409  158.43  < 2e-16 ***
## poly(Overall, 5)1 399152122    1725304  231.35  < 2e-16 ***
## poly(Overall, 5)2 385944088    1725304  223.70  < 2e-16 ***
## poly(Overall, 5)3 226933807    1725304  131.53  < 2e-16 ***
## poly(Overall, 5)4  66828420    1725304   38.73  < 2e-16 ***
## poly(Overall, 5)5   6349798    1725304    3.68 0.000234 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1725000 on 12531 degrees of freedom
## Multiple R-squared:  0.9071, Adjusted R-squared:  0.9071 
## F-statistic: 2.448e+04 on 5 and 12531 DF,  p-value: < 2.2e-16

El coeficiente de interseción ‘a’ y la pendiente ‘b’ si son estadísticamente significativas por encima del 95%

El valor de R Square SI sobrepasa el 50% por lo que SI SE ACEPTA el modelo

3.7.6 Determinando rmse()

El valor de rmse se interpreta en que tanto se desvía una predicción media sobre los valore reales.

rmse.poly5 <- rmse(actual =comparaciones$Valor, predicted = comparaciones$predicccion)
rmse.poly5
## [1] 1870206

El valor de rmse en el modelo de regresión lineal simple SI está por debajo de los 2,000,000 (dos millones) que se establecieron como métrica aceptable, por lo que este modelo SI SE ACEPTA.

4 Interpretación

Para la realización del caso 2 que es regresión lineal y regresión polinomial se siguió usando los datos del FIFA, pero ahora con las variables Overall y Valor para poder realizar predicciones, evaluar y comparar su rendimiento.

En la exploración de datos la variable Overrall arrojo que entre todos los jugadores tiene como un mínimo de 46 y un máximo de 94. La variable Valor arrojo entre todos los jugadores que el valor mínimo es 10000 y un valor máximo de 118500000, siendo Lionel Messi el jugador mas caro.

Para los datos de entrenamiento se utilizo como en el caso anterior mis últimos 4 dígitos de mi numero de control. Se obtiene que entre mas sea el nivel de la variable Overrall es mayor el valor del jugador, obteniendo que un nivel de Overrall de 80 para arriba el valor monetario del jugador aumenta considerablemente. En comparación contra el caso 1 donde solamente se veía la regresión lineal que era una linea que atravesaba la gráfica de dispersión de menos a mas, en este caso de regresión polinomial de segundo nivel se observa que la tendencia cruza la gráfica de dispersión en un punto medio de 62, 700K, siendo el punto mas alto 94, 52.02836M, con un punto bajo de 46, 10.43281M. En el caso de regresión polinomial de quinto nivel se observa que la tendencia empieza de forma plana subiendo con una curva perfecta llegando hasta el tope con 94, 109.2693M.

5 Bibliografía