library(readr)
library(dplyr)
library(ggplot2)
library(caret) # Para particionar datos
datos.FIFA <- read.csv("data.csv", encoding = "UTF-8")
datos <- select(datos.FIFA, Wage, Value)
print("La variable 'x' independiente es Wage que significa saario de un jugador")
## [1] "La variable 'x' independiente es Wage que significa saario de 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"
source("misfunciones.r")
# o
# source("https://raw.githubusercontent.com/rpizarrog/FundamentosMachineLearning/master/scripts/misfunciones.r")
datos <- datos %>%
mutate(Valor = ifelse (substr(Value, nchar(Value), nchar(Value)) == 'M', fcleanValue(Value) * 1000000, fcleanValue(Value) * 1000)) %>%
filter(Valor > 0)
datos <- datos %>%
mutate(Salario = ifelse (substr(Wage, nchar(Wage), nchar(Wage)) == 'M', fcleanValue(Wage) * 1000000, fcleanValue(Wage) * 1000)) %>%
filter(Salario > 0)
head(datos, 10); tail(datos, 10)
## Wage Value Valor Salario
## 1 \200565K \200110.5M 110500000 565000
## 2 \200405K \20077M 77000000 405000
## 3 \200290K \200118.5M 118500000 290000
## 4 \200260K \20072M 72000000 260000
## 5 \200355K \200102M 102000000 355000
## 6 \200340K \20093M 93000000 340000
## 7 \200420K \20067M 67000000 420000
## 8 \200455K \20080M 80000000 455000
## 9 \200380K \20051M 51000000 380000
## 10 \20094K \20068M 68000000 94000
## Wage Value Valor Salario
## 17946 \2001K \20060K 60000 1000
## 17947 \2001K \20060K 60000 1000
## 17948 \2001K \20070K 70000 1000
## 17949 \2001K \20060K 60000 1000
## 17950 \2001K \20060K 60000 1000
## 17951 \2001K \20060K 60000 1000
## 17952 \2001K \20060K 60000 1000
## 17953 \2001K \20060K 60000 1000
## 17954 \2001K \20060K 60000 1000
## 17955 \2001K \20060K 60000 1000
ggplot(datos, aes(x = Salario, y = Valor)) +
geom_point()
* De acuerdo la gráfica se aprecia una relación en forma de curva y no precisamente lineal, pero a pesar de ello, se construirá un modelo de regresión lineal simple con estas dos variables.
# entrena <- 70%
# valida <- 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)
## Wage Value Valor Salario
## 1 \200565K \200110.5M 110500000 565000
## 2 \200405K \20077M 77000000 405000
## 3 \200290K \200118.5M 118500000 290000
## 5 \200355K \200102M 102000000 355000
## 6 \200340K \20093M 93000000 340000
## 7 \200420K \20067M 67000000 420000
## 8 \200455K \20080M 80000000 455000
## 11 \200205K \20077M 77000000 205000
## 12 \200355K \20076.5M 76500000 355000
## 13 \200125K \20044M 44000000 125000
head(datos.validacion, 10)
## Wage Value Valor Salario
## 4 \200260K \20072M 72000000 260000
## 9 \200380K \20051M 51000000 380000
## 10 \20094K \20068M 68000000 94000
## 16 \200205K \20089M 89000000 205000
## 22 \200200K \20060M 60000000 200000
## 23 \200130K \20038M 38000000 130000
## 25 \200215K \20027M 27000000 215000
## 29 \200315K \20069.5M 69500000 315000
## 30 \200165K \20062M 62000000 165000
## 31 \200315K \20073.5M 73500000 315000
correla <- cor(x = datos.entrenamiento$Salario, y = datos.entrenamiento$Valor, method = "pearson")
correla
## [1] 0.8591612
cor.test(datos.entrenamiento$Salario, datos.entrenamiento$Valor)
##
## Pearson's product-moment correlation
##
## data: datos.entrenamiento$Salario and datos.entrenamiento$Valor
## t = 188.22, df = 12567, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.8545137 0.8636711
## sample estimates:
## cor
## 0.8591612
CR <- correla ^ 2
CR
## [1] 0.7381579
El Coefiente de Correlación en la regresión lineal significa responder a la pregunta: ¿qué porcentaje de la variación total en Y se debe a la variación en X?, en otras palabras, cual es la proporción de la variación total en Y que puede ser explicada por la variación en X? (https://rpubs.com/osoramirez/316691)
Para este caso significa que Salario explica el 73.82% del Valor económico del jugador . Tal vez no es representativo la variable Salario sobre el Valor económico del jugador.
El salario de un jugador explica más el valor económico del mismo en relación a otra variable como Overall visto en el caso 5.
Ya que se tienen el conjunto de datos de entrenamiento, sobre ese conjunto de datos construir el modelo.
modelo <- lm(formula = Valor ~ Salario, data = datos.entrenamiento)
summary(modelo)
##
## Call:
## lm(formula = Valor ~ Salario, data = datos.entrenamiento)
##
## Residuals:
## Min 1Q Median 3Q Max
## -25014292 -609756 -311372 46592 58868607
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 292987.55 28334.43 10.34 <0.0000000000000002 ***
## Salario 218.38 1.16 188.22 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2907000 on 12567 degrees of freedom
## Multiple R-squared: 0.7382, Adjusted R-squared: 0.7381
## F-statistic: 3.543e+04 on 1 and 12567 DF, p-value: < 0.00000000000000022
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)
ggplot(data = datos, mapping = aes(x = Salario, y = Valor)) +
geom_point(color = "forestgreen", size = 2) +
labs(title = 'Valor ~ Salario', x = 'Salario') +
geom_smooth(method = "lm", se = FALSE, color = "black") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'
* Precisamente se observa que si hay una relación lineal.
paste("Valor de a = ", modelo$coefficients[1])
## [1] "Valor de a = 292987.553576029"
paste("Valor de b = ", modelo$coefficients[2])
## [1] "Valor de b = 218.384057537379"
prediccion <- predict(modelo, newdata = datos.validacion)
datos.validacion <- mutate(datos.validacion, predicho = prediccion)
head(datos.validacion, 10)
## Wage Value Valor Salario predicho
## 1 \200260K \20072M 72000000 260000 57072843
## 2 \200380K \20051M 51000000 380000 83278929
## 3 \20094K \20068M 68000000 94000 20821089
## 4 \200205K \20089M 89000000 205000 45061719
## 5 \200200K \20060M 60000000 200000 43969799
## 6 \200130K \20038M 38000000 130000 28682915
## 7 \200215K \20027M 27000000 215000 47245560
## 8 \200315K \20069.5M 69500000 315000 69083966
## 9 \200165K \20062M 62000000 165000 36326357
## 10 \200315K \20073.5M 73500000 315000 69083966
tail(datos.validacion, 10)
## Wage Value Valor Salario predicho
## 5377 \2001K \20020K 20000 1000 511371.6
## 5378 \2001K \20060K 60000 1000 511371.6
## 5379 \2001K \20040K 40000 1000 511371.6
## 5380 \2001K \20040K 40000 1000 511371.6
## 5381 \2001K \20050K 50000 1000 511371.6
## 5382 \2001K \20060K 60000 1000 511371.6
## 5383 \2001K \20060K 60000 1000 511371.6
## 5384 \2001K \20070K 70000 1000 511371.6
## 5385 \2001K \20060K 60000 1000 511371.6
## 5386 \2001K \20060K 60000 1000 511371.6