Objetivo

Analizar caso FIFA mediante un modelo de regresion lineal simple

Descripcion

Determinar modelo de regresión lineal simple para establecer un análisi en el conjunto de datos del caso FIFA ## Proceso - 1. Cargar librerías - 2. Cargar los datos - 3. Determinar variable independiente y dependiente - 4. Limpiar los datos - 5. Partir el conjunto de datos en datos de entrenamiento y datos de validción 70%, 30% - 6. Determinar el modelo de regresión lineal simple - 7. Evaluar el modelo. Interpretación - 8. Linea de tendencia - 9. Determinar predicciones - 10. Interpretar el caso con un texto descriptivo de 80 a 100 palabras. Individual

  1. Cargar librerías
library(readr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(caret)  # Para particionar datos
## Warning: package 'caret' was built under R version 4.0.3
## Loading required package: lattice
  1. Cargar los datos
datos.FIFA <- read.csv("data.csv", encoding = "UTF-8")
datos <- select(datos.FIFA, Overall, Value)
  1. Determinar variable independiente y dependiente
print("La variable 'x' independiente es Overall que significa como se valora en su totalidad un jugador")
## [1] "La variable 'x' independiente es Overall que significa como se valora en su totalidad un jugador"
print("La variable 'y' dependiente es Value character que será Valor en formato  numérico que significa el valor económico de un jugador")
## [1] "La variable 'y' dependiente es Value character que será Valor en formato  numérico que significa el valor económico de un jugador"
  1. Limpiar los datos
source("misfunciones.r")
datos <- datos %>%
  mutate(Valor = ifelse (substr(Value, nchar(Value), nchar(Value)) == 'M', fcleanValue(Value) * 1000000, fcleanValue(Value) * 1000)) %>%
  filter(Valor > 0)
datos <- filter(datos, Valor > 0)
head(datos, 10); tail(datos, 10)
##    Overall   Value     Valor
## 1       94 \200110.5M 110500000
## 2       94    \20077M  77000000
## 3       92 \200118.5M 118500000
## 4       91    \20072M  72000000
## 5       91   \200102M 102000000
## 6       91    \20093M  93000000
## 7       91    \20067M  67000000
## 8       91    \20080M  80000000
## 9       91    \20051M  51000000
## 10      90    \20068M  68000000
##       Overall Value Valor
## 17946      47  \20060K 60000
## 17947      47  \20060K 60000
## 17948      47  \20070K 70000
## 17949      47  \20060K 60000
## 17950      47  \20060K 60000
## 17951      47  \20060K 60000
## 17952      47  \20060K 60000
## 17953      47  \20060K 60000
## 17954      47  \20060K 60000
## 17955      46  \20060K 60000
  ggplot(datos, aes(x = Overall, y = Valor)) +
      geom_point(color = "darkmagenta", size = 2)

  1. Partir el conjunto de datos en datos de entrenamiento y datos de validación 70%, 30%
set.seed(2020)
entrena <- createDataPartition(y = datos$Valor, p = 0.7, list = FALSE, times = 1)

# Datos entrenamiento
datos.entrenamiento <- datos[entrena, ]  # [renglones, columna]

# Datos validación
datos.validacion <- datos[-entrena, ]

head(datos.entrenamiento, 10)
##    Overall   Value     Valor
## 1       94 \200110.5M 110500000
## 2       94    \20077M  77000000
## 3       92 \200118.5M 118500000
## 5       91   \200102M 102000000
## 6       91    \20093M  93000000
## 7       91    \20067M  67000000
## 8       91    \20080M  80000000
## 11      90    \20077M  77000000
## 12      90  \20076.5M  76500000
## 13      90    \20044M  44000000
correla <- cor(x = datos.entrenamiento$Overall, y = datos.entrenamiento$Valor, method = "pearson")
correla
## [1] 0.6252835
cor.test(datos.entrenamiento$Overall, datos.entrenamiento$Valor) 
## 
##  Pearson's product-moment correlation
## 
## data:  datos.entrenamiento$Overall and datos.entrenamiento$Valor
## t = 89.821, df = 12567, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6145185 0.6358156
## sample estimates:
##       cor 
## 0.6252835

Ahora determinar el coeficiente de determinación R2 o R Square o Multiple R-squared: en el modelo de regresión lineal que se construye más adelante.

CR <- correla ^ 2
CR
## [1] 0.3909794
modelo <- lm(formula = Valor ~ Overall, data = datos.entrenamiento)

summary(modelo)
## 
## Call:
## lm(formula = Valor ~ Overall, data = datos.entrenamiento)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
##  -9583770  -2104319   -889593   1030270 102871367 
## 
## Coefficients:
##              Estimate Std. Error t value            Pr(>|t|)    
## (Intercept) -31403214     378886  -82.88 <0.0000000000000002 ***
## Overall        511216       5692   89.82 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4434000 on 12567 degrees of freedom
## Multiple R-squared:  0.391,  Adjusted R-squared:  0.3909 
## F-statistic:  8068 on 1 and 12567 DF,  p-value: < 0.00000000000000022
  1. Evaluación del modelo. Supuestos del modelo de regresión lineal
  par(mfrow = c(2, 2))
plot(modelo)

Residual vs Fitted: Deberia estar distribuidos aleatoriamente alrededor de la linea horizontal que representa un error residual de cero

Normal Q-Q: deberia sugerir que los errores residuales se distribuyen normalmente.

Scale-Location Muestra la raiz cuadrada de los residuos estandarizados, como una funcion de los valores ajustados. No deberia existir una tendencia clara en ese trama.

Residual vs Leverage Las distancias mas grandes que 1 son sospechosos y sugieren la presencia de un valor atipico posible y su eliminacion podria tener efectos sobre la regresion. (https://rpubs.com/osoramirez/316691)

Visualizar tendencia Linea de tendencia con ggplot()

ggplot(data = datos, mapping = aes(x = Overall, y = Valor)) +
  geom_point(color = "dodgerblue", size = 2) +
  labs(title  =  'Valor ~ Overall', x  =  'Overall') +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  theme_bw() +
  theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

  1. Determinar predicciones
paste("Valor de a = ", modelo$coefficients[1])
## [1] "Valor de a =  -31403213.910327"
paste("Valor de b = ", modelo$coefficients[2])
## [1] "Valor de b =  511215.731269587"
prediccion <- predict(modelo, newdata = datos.validacion)
#head(prediccion, 10); tail(prediccion, 10)
datos.validacion <- mutate(datos.validacion, predicho = prediccion)
head(datos.validacion, 10)
##    Overall  Value    Valor predicho
## 1       91   \20072M 72000000 15117418
## 2       91   \20051M 51000000 15117418
## 3       90   \20068M 68000000 14606202
## 4       89   \20089M 89000000 14094986
## 5       89   \20060M 60000000 14094986
## 6       89   \20038M 38000000 14094986
## 7       89   \20027M 27000000 14094986
## 8       88 \20069.5M 69500000 13583770
## 9       88   \20062M 62000000 13583770
## 10      88 \20073.5M 73500000 13583770
  1. Interpretación del caso