Comenzamos importando los datos de soccer de la temporada 2019/2020 de la primera división de la liga española que se puede encontrar en el enlace: https://www.football-data.co.uk/spainm.php
futbolData <- read.csv("https://www.football-data.co.uk/mmz4281/1920/SP1.csv")
De los datos obtenidos, tomamos los goles anotados de cada equipo local (FTHG
) y visitante (FTAG
).
homeGoals <- futbolData$FTHG #Goles anotados por los equipos que jugaron en casa
awayGoals <- futbolData$FTAG #Goles anotados por los equipos que jugaron como visitante
Utilizando la función table()
, por medio de clasificación cruzada construimos una “tabla de contigencia”, la cual determina en cuántas ocasiones de las distintas anotaciones realizadas (0,1,2,…), se tuvo el mismo resultado, es decir, en cuántos encuentros el marcador fue 0, 1, 2, y así
sucesivamente.
table(homeGoals)
#homeGoals
# 0 1 2 3 4 5 6
#88 132 99 38 14 8 1
Con las tablas de contigencias obtenidas para las anotaciones de los equipos locales y los equipos visitantes, calculamos la probabilidad marginal en cada caso, al dividirlas entre el total de partidos que se jugaron. La probabilidad simple o marginal se refiere a la probabilidad de ocurrencia de un suceso. Matemáticamente, si es la variable aleatoria que cuenta el número de goles anotados (ya sea local o visitante), esta probabilidad la calculamos como:
table(homeGoals)/length(homeGoals) # Probabilidad marginal equipo de casa
table(awayGoals)/length(awayGoals) # Probabilidad marginal equipo visitante
Cuando se está interesado en conocer la probabilidad de que dos sucesos se verifiquen simultáneamente, se habla de probabilidad conjunta. Para el calculo de la probabilidad conjunta se llaman ambos vectores homeGoals
y awayGoals
dentro el comando table
.
table(homeGoals, awayGoals) # Tabla conjunta
# awayGoals
#homeGoals 0 1 2 3 4 5
# 0 33 28 15 8 2 2
# 1 43 49 32 5 3 0
# 2 39 35 20 3 2 0
# 3 14 14 7 2 1 0
# 4 4 5 4 0 1 0
# 5 2 3 3 0 0 0
# 6 1 0 0 0 0 0
Dividimos entre la cantidad de casos para obtener la probabilidad conjunta. En este caso, si es la variable aleatoria que denota el marcador local y el marcador visitante, el cálculo de tales probabilidades viene dado por:
table(homeGoals, awayGoals) / length(homeGoals) # Probabilidad conjunta
# awayGoals
#homeGoals 0 1 2 3 4 5
# 0 0.086842105 0.073684211 0.039473684 0.021052632 0.005263158 0.005263158
# 1 0.113157895 0.128947368 0.084210526 0.013157895 0.007894737 0.000000000
# 2 0.102631579 0.092105263 0.052631579 0.007894737 0.005263158 0.000000000
# 3 0.036842105 0.036842105 0.018421053 0.005263158 0.002631579 0.000000000
# 4 0.010526316 0.013157895 0.010526316 0.000000000 0.002631579 0.000000000
# 5 0.005263158 0.007894737 0.007894737 0.000000000 0.000000000 0.000000000
# 6 0.002631579 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
Por último, como comprobación podemos sumar todas las probabilidades y el resultado debería ser igual a 1
m <- table(homeGoals, awayGoals)/length(homeGoals)
sum(m)
Antes de comenzar este postwork se debe designar el espacio de trabajo con el comando setwd()
, de preferencia una carpeta que contenga solo los archivos con los que se van a trabajar.
Importamos los datos de soccer de las temporadas 2017/2018, 2018/2019 y 2019/2020 de la primera división de la liga española a R, los datos los puedes encontrar en el siguiente enlace: https://www.football-data.co.uk/spainm.php .
le1718 <- "https://www.football-data.co.uk/mmz4281/1718/SP1.csv"
le1819 <- "https://www.football-data.co.uk/mmz4281/1819/SP1.csv"
le1920 <- "https://www.football-data.co.uk/mmz4281/1920/SP1.csv"
Con ayuda de la función download.file
descargamos los archivos en el directorio previamente elegido
download.file(url = le1718, destfile = "le1718.csv", mode = "wb")
download.file(url = le1819, destfile = "le1819.csv", mode = "wb")
download.file(url = le1920, destfile = "le1920.csv", mode = "wb")
Leemos cada uno de los .csv
y los almacenamos en una lista ligaEsp
en R para facilitar su manipulación.
ligaEsp <- lapply(dir(), read.csv)
Para garantizar que únicamente se lean los archivos con terminación .csv
en dir()
, podemos hacer:
ligaEsp <- lapply(list.files(pattern ="*.csv"), read.csv)
Con ayuda de los comandos str()
, summary()
, head()
y View()
conocemos un poco más la estructura de los datos, de esta manera podemos encontrar irregularidades, las cuales procesamos para dejar los datos de una manera “limpia” y optima, seleccionando solo aquellos datos necesarios para el análisis.
str(ligaEsp[[1]]); str(ligaEsp[[2]]); str(ligaEsp[[3]])
head(ligaEsp[[1]]); head(ligaEsp[[2]]); head(ligaEsp[[3]])
summary(ligaEsp[[1]]); summary(ligaEsp[[2]]); summary(ligaEsp[[3]])
View(ligaEsp[[1]]); View(ligaEsp[[2]]); View(ligaEsp[[3]])
En este caso en específico, observamos que los datos cuentan con un campo de fecha, pero no todos tienen el mismo formato, esto deberá ser modificado, pero antes seleccionaremos las columnas de interés (Date, HomeTeam, AwayTeam, FTHG, FTAG y FTR) utilizando la librería dplyr
.
library(dplyr)
ligaEsp <- lapply(ligaEsp, select, Date, HomeTeam:FTR)
str(ligaEsp)
Cambiamos el forrmato de la fecha de chr
a Date
con el comando mutate
. En este paso se debe tener claro el formato en el que se encuentra escritas las fechas. Con el comando str
verificamos que se haya realizado de forma correcta el cambio.
ligaEsp[[1]] <- mutate(ligaEsp[[1]], Date = as.Date(Date, "%d/%m/%y"))
ligaEsp[[2]] <- mutate(ligaEsp[[2]], Date = as.Date(Date, "%d/%m/%Y"))
ligaEsp[[3]] <- mutate(ligaEsp[[3]], Date = as.Date(Date, "%d/%m/%Y"))
str(ligaEsp)
View(ligaEsp[[1]]); View(ligaEsp[[2]]); View(ligaEsp[[3]])
Por último unimos los tres dataframes en uno solo. Con el comando do.call()
combinamos todos los datos en un solo dataframe. Utilizando el argumento rbind
indicamos que cada dataframe individual de la lista se una en un nuevo renglón al finalizar anterior.
Y nuevamente observamos la estructura de nuestros datos.
data <- do.call(rbind, ligaEsp)
dim(data)
View(data)
str(data)
head(data)
class(data)
Como paso extra para el postwork 03, vamos a almacenar el dataframe resultante data
en el archivo dataPostwork2.csv
write.csv(data, "dataPostwork2.csv", row.names = FALSE)
Cargamos el dataframe obtenido en el Postwork 02 y modificamos el formato de las fechas (utilizando el comando mutate()
) para facilitar más adelante su manipulación.
data <- read.csv("https://raw.githubusercontent.com/edsatan/Proyecto-R/main/dataPostwork2.csv")
data <- mutate(data, Date = as.Date(Date, "%Y-%m-%d"))
Seleccionamos nuestras columnas de interés (goles de casa FTHG
y goles de visitante FTAG
) para realizar el cálculo de las probabilidades marginales y conjunta como en el Postwork 01
homeGoals2 <- data$FTHG
awayGoals2 <- data$FTAG
Calculamos las probabilidades marginales y la conjunta
- Probabilidad marginal equipo de casa
probCasa <- table(homeGoals2)/length(homeGoals2)
probCasa
#homeGoals2
# 0 1 2 3 4 5 6 7 8
#0.232456140 0.327192982 0.266666667 0.112280702 0.035087719 0.019298246 0.005263158 0.000877193 0.000877193
- Probabilidad marginal equipo visitante
probVisitante <- table(awayGoals2)/length(awayGoals2)
probVisitante
#awayGoals2
# 0 1 2 3 4 5 6
#0.351754386 0.340350877 0.212280702 0.054385965 0.028947368 0.009649123 0.002631579
- Probabilidad conjunta
probConjunta <- table(homeGoals2, awayGoals2)/length(homeGoals2)
probConjunta
# awayGoals2
#homeGoals2 0 1 2 3 4 5 6
# 0 0.078070175 0.080701754 0.045614035 0.018421053 0.005263158 0.004385965 0.000000000
# 1 0.115789474 0.114912281 0.068421053 0.017543860 0.008771930 0.001754386 0.000000000
# 2 0.087719298 0.093859649 0.061403509 0.011403509 0.008771930 0.001754386 0.001754386
# 3 0.044736842 0.032456140 0.024561404 0.006140351 0.001754386 0.001754386 0.000877193
# 4 0.014035088 0.010526316 0.007017544 0.000000000 0.003508772 0.000000000 0.000000000
# 5 0.008771930 0.005263158 0.004385965 0.000000000 0.000877193 0.000000000 0.000000000
# 6 0.002631579 0.001754386 0.000000000 0.000877193 0.000000000 0.000000000 0.000000000
# 7 0.000000000 0.000877193 0.000000000 0.000000000 0.000000000 0.000000000 0.000000000
# 8 0.000000000 0.000000000 0.000877193 0.000000000 0.000000000 0.000000000 0.000000000
Para entender mejor los resultados de las operaciones realizadas, desplegaremos unos gráficos utilizando la librería ggplot2
.
library(ggplot2)
Para el caso de las probabilidades marginales, se optó por utilizar un gráfico de barras, permitiéndonos observar la distribución y comportamiento de las distintas probabilidades de una manera más rápida y sencilla.
probCasaPlot <- ggplot() +
geom_col(aes(x=0:8, y=probCasa), color="black", fill="blue")+
ggtitle("Probabilidades Marginales FTHG") +
ylab("Porcentaje") +
xlab("Goles") +
theme_light()
probCasaPlot
probVisitantePlot <- ggplot() +
geom_col(aes(x=0:6, y=probVisitante), color="black", fill="green")+
ggtitle("Probabilidades Marginales FTAG") +
ylab("Porcentaje") +
xlab("Goles") +
theme_light()
probVisitantePlot
Para la probabilidad conjunta, en donde interactuan dos variables, goles de locales y goles de visitantes, optamos por un mapa de calor para ilustrar los resultados. Por medio de un mapa de calor podemos determinar los disntintos valores de probabilidad obtenidos dependiendo de la tonalidad que adquieran, permitiendo un análisis visual sencillo y rápido de los resultados.
install.packages("reshape2")
library(reshape2)
probConjunta <- melt(probConjunta)
probConjuntaPlot <- ggplot()+
geom_tile(aes(x=probConjunta$homeGoals2, y=probConjunta$awayGoals2, fill=probConjunta$value))+
labs(x="Goles Local", y="Goles Visitante", fill="Porcentaje")+
scale_x_continuous(breaks = unique(probConjunta[,1]))+ ##Determinamos los valores unicos para X
scale_y_continuous(breaks = unique(probConjunta[,2]))+ ##Determinamos los valores unicos para y
scale_fill_gradient2(high = "green", mid = "black")
probConjuntaPlot
Cargamos el archivo del postwork 2 y seleccionamos las columnas de interés
data <- read.csv("dataPostwork2.csv")
homeGoals2 <- data$FTHG
awayGoals2 <- data$FTAG
El objetivo es obtener una tabla de cocientes al dividir estas probabilidades conjuntas por el producto de las probabilidades marginales correspondientes. Creamos un Dataframe con la probabilidad conjunta.
probdf <- as.data.frame(table(homeGoals2, awayGoals2)/length(homeGoals2))
Renombramos la columna de frecuencia
como conjunta
colnames(probdf)[3] <- "Conjunta"
Agregamos la probabilidad marginal del equipo de casa
probdf$marginalcasa <- probCasa
Hacemos un vector de la probabilidad marginal del equipo visitante que se repita de la forma a la columna awayGoals2
probVisitanteVector <- rep(probVisitante,length(probCasa))
probVisitanteVector<- probVisitanteVector[order(names(probVisitanteVector))]
probdf$marginalvisita <- probVisitanteVector
Agregamos la columna del producto de las probabilidades marginales
probdf$prodMarginal <- probdf$marginalcasa*probdf$marginalvisita
Y por último agregamos la columna del cociente de la probabilidad conjunta entre el producto de las marginales y mostramos el dataframe final
probdf$cociente <- probdf$Conjunta/probdf$prodMarginal
head(probdf,10)
# homeGoals2 awayGoals2 Conjunta marginalcasa marginalvisita prodMarginal cociente
#1 0 0 0.078070175 0.232456140 0.3517544 0.0817674669 0.9547829
#2 1 0 0.115789474 0.327192982 0.3517544 0.1150915666 1.0060639
#3 2 0 0.087719298 0.266666667 0.3517544 0.0938011696 0.9351621
#4 3 0 0.044736842 0.112280702 0.3517544 0.0394952293 1.1327151
#5 4 0 0.014035088 0.035087719 0.3517544 0.0123422592 1.1371571
#6 5 0 0.008771930 0.019298246 0.3517544 0.0067882425 1.2922240
#7 6 0 0.002631579 0.005263158 0.3517544 0.0018513389 1.4214464
#8 7 0 0.000000000 0.000877193 0.3517544 0.0003085565 0.0000000
#9 8 0 0.000000000 0.000877193 0.3517544 0.0003085565 0.0000000
#10 0 1 0.080701754 0.232456140 0.3403509 0.0791166513 1.0200350
Grafícamos la tabla de cocientes para conocer la distribución
tablaCocientesPlot <- ggplot() +
geom_histogram(aes(probdf$cociente), color="black", fill="purple", binwidth = 0.3)+
ggtitle("Tabla de Cocientes") +
ylab("Frecuencia") +
xlab("Cocientes") +
theme_light()
tablaCocientesPlot
Internamente, lo que se está haciendo es observar de manera empírica si es objetivo asumir que los goles de local y de visitante, al ser vistos como variables aletorias, son independientes. En estadística, dos variables aleatorias y se dicen independientes si la distribución conjunta de estas es igual al producto de las distribuciones marginales, esto es:
Lo que es lo mismo que decir:
Como ya contamos con estimaciones para la distribución conjunta, así como para las marginales correspondientes, una manera de verificar la hipótesis de independencia es mediante los cocientes de tales estimaciones, de ahí el procedimiento que hemos realizado en esta parte del proyecto.
A continuación, obtendremos tablas de cocientes simuladas a través de un procedimiento de remuestreo conocido como Bootstrap.
Nota. -Bootstrap es un método de remuestreo propuesto por Bradley Efron en 1979 que se aplica en situaciones en donde la muestra de datos disponible es muy pequeña. A través de la generación de nuevas muestras basadas en la original, se aumenta la cantidad de datos e información con la que trabajar, de esta manera calculando las medias de cada muestra se puede determinar la distribución de los datos de manera gráfica.
En este caso para implementar el método de boostrap en R
se utilizó la función sample()
, la cual dandole una muestra de datos, genera una “nueva muestra” basada en la original, y como el boostrap necesita una mayor cantidad de muestras, utilizando la función replicate()
determinamos cuantas veces se tendrá que ejecutar la función sample
generando en cada repetición más muestras.
La idea es simular muestras de los marcadores a partir de los originales. Cada simulación de estos nos permitirá construir una nueva tabla de cocientes. Esto lo haremos n=10000
veces. Estableceremos una semilla para poder replicar los resultados.
# Simulación de los marcadores.
set.seed(10)
n = 10000
marcadores <- paste(data$FTHG, "-" ,data$FTAG, sep="")
bootstrap <- replicate(n, sample(marcadores, replace=TRUE))
Ahora definimos dos matrices: tablaCocientes
y muestraCocientes
, las cuales alamacenarán la suma acumulada de los cocientes simulados y las muestras de los mismos, respectivamente.
tablaCocientes <- matrix(rep(0,16), ncol=4)
muestraCocientes <- matrix(ncol= 16)
Iteramos ahora 10 mil veces para construir en cada ocasión una nueva tabla de cocientes.
for(i in 1:n){
# Marcador simulado i
sim <- bootstrap[,i]
marcador_sim <- matrix(as.numeric(unlist(strsplit(sim, "-"))), ncol=length(sim), byrow=FALSE)
marcador.home <- marcador_sim[1,]
marcador.away <- marcador_sim[2,]
# Ditribución conjunta para el escenario simulado i
p_conj <- table(marcador.home,marcador.away)/casos
p_conj <- as.matrix(p_conj)
# Distribuciones marginales para el escenario simulado i
marg.home <- apply(p_conj ,1, sum)
marg.away <- apply(p_conj ,2, sum)
# Tabla de cocientes de la simulación i
Cocientes <- p_conj
for(i in 1:dim(p_conj)[1]){
for(j in 1:dim(p_conj)[2]){
Cocientes[i,j] <- Cocientes[i,j]/(marg.home[i]*marg.away[j])
}
}
# Tabla acumulada de cocientes
tablaCocientes = tablaCocientes + Cocientes[1:4, 1:4]
# Matriz con muestra de cocientes
muestraCocientes = rbind(muestraCocientes, c(Cocientes[1,1:4], Cocientes[2,1:4],
Cocientes[3,1:4], Cocientes[4,1:4]))
}
Notemos que en cada iteración se acumula en la matriz tablaCocientes
los cocientes obtenidos para los marcadores más probables, esto es: hasta 3-3. Además, se guardan las muestras en la matriz muestraCocientes
. Luego, Dividimos tablaCocientes
entre 10 mil para obtener las medias de cada casilla (marcador posible) y convertimos a un data frame la matriz muestraCocientes
, a la cual también se le renombran sus columnas según los marcadores.
tablaCocientes <- tablaCocientes/n
muestraCocientes <- as.data.frame(muestraCocientes[-1, ]) # Eliminando primer registro con NA's
colnames(muestraCocientes) <- c("0-0", "0-1", "0-2", "0-3", "1-0", "1-1", "1-2", "1-3",
"2-0", "2-1", "2-2", "2-3", "3-0", "3-1", "3-2", "3-3")
Construimos ahora un histograma para cada marcador, en el cual se muestra primero las anotaciones del equipo local (H) y luego las del equipo visitante (A).
# Construcción de histogramas
par(mfrow=c(4,4))
for(i in 1:dim(muestraCocientes)[2]){
marcador <- colnames(muestraCocientes)[i]
hist(muestraCocientes[,i],col=i,las=1, xlab='', breaks=20,
main=paste('Marcador (H-A):', marcador), ylab= 'Frecuencia')
}
Finalmente, imprimimos la tabla con los cocientes promedio para cada uno de los marcadores elegidos (más probables o comunes).
tablaCocientes
# marcador.away
#marcador.home 0 1 2 3
# 0 0.9542136 1.0200379 0.9249799 1.4585520
# 1 1.0065278 1.0311455 0.9845862 0.9891774
# 2 0.9352090 1.0344093 1.0849736 0.7852945
# 3 1.1330502 0.8506767 1.0300172 0.9982570
Conclusión
Dados los histogramas y las medias por casilla para los marcadores, nos parece razonable asumir que para los marcadores más comunes, existe una mayor independencia o evidencia para decir que las variables aletorias que describen el número de goles (local y visitantes), son independientes. Esto es más evidente para marcadores donde no hay más de 2 goles por equipo (0-0, 0-1, ..., 2-2). Si observamos, para marcadores donde algún equipo marcó 3 goles, el cociente no es tan cercano a 1.
Utilizando nuevamente DataFrame de datos de soccer de la liga española de las temporadas 2017-2018, 2018-2019 y 2019-2020 generado en el Prework 2, renombraremos sus columnas Date
, HomeTeam
, FTHG
, AwayTeam
y FTAG
, por date
, home.team
, home.score
, away.team
y away.score
, respectivamente. Lo anterior lo podemos hacer con ayuda de la función select
del paquete dplyr
. Con ayuda de la función write.csv
guarda el data frame como un archivo .csv
con nombre soccer.csv
.
library(dplyr)
Seleccionamos el directorio de trabajo con el comando setwd(/ruta)
Carga de datos
dataurl1819 <- "https://www.football-data.co.uk/mmz4281/1819/SP1.csv"
dataurl1920 <- "https://www.football-data.co.uk/mmz4281/1920/SP1.csv"
dataurl1718 <- "https://www.football-data.co.uk/mmz4281/1718/SP1.csv"
download.file(dataurl1718, destfile = "dataurl1718.csv", mode = "wb")
download.file(dataurl1819, destfile = "dataurl1819.csv", mode = "wb")
download.file(dataurl1920, destfile = "dataurl1920.csv", mode = "wb")
ligaEsp <- lapply(list.files(pattern ="*.csv"), read.csv)
ligaEsp <- lapply(ligaEsp, select, Date, HomeTeam:FTAG)
ligaEsp[[1]] <- mutate(ligaEsp[[1]], Date = as.Date(Date, "%d/%m/%y"))
ligaEsp[[2]] <- mutate(ligaEsp[[2]], Date = as.Date(Date, "%d/%m/%Y"))
ligaEsp[[3]] <- mutate(ligaEsp[[3]], Date = as.Date(Date, "%d/%m/%Y"))
Unión de los dataframes
SmallData <- do.call(rbind, ligaEsp)
Renombramos las columnas
SmallData <- rename(SmallData, date = Date,
home.team = HomeTeam,
home.score = FTHG,
away.team = AwayTeam,
away.score = FTAG)
str(SmallData)
head(SmallData)
Guardamos el archivo
write.csv(SmallData, "soccer.csv", row.names = FALSE)
Ahora utilizaremos la librería fbRanks
con su función create.fbRanks.dataframes()
, la cual requiere que tenga, en específico, el nombre de las columnas que se mencionó anteriormente. Con estos datos, la función nos genera dos listas, una con los nombres de los equipos y otra con los distintos resultados de los encuentros. Estos nuevos datos pueden ser asignados de manera directa a la función rank.teams()
utilizando a su vez el modelo poisson ponderado en el tiempo de Dixon y Coles, el cual permite realizar predicciones del rendimiento de los equipos en los disintos encuentros. De esta manera logramos obtener mejores estadísticas de los encuentros de nuestro data frame.
library(fbRanks)
listasoccer <-create.fbRanks.dataframes("soccer.csv")
anotaciones <-listasoccer$scores
equipos <- listasoccer$teams
A continuación, con ayuda de la función unique
creamos un vector de fechas (fecha) que no se repitan y que correspondan a las fechas en las que se jugaron partidos, además de guardar una variable (n
) que contenga el número de fechas diferentes. Posteriormente, con la función rank.teams
y usando como argumentos los dataframes anotaciones
y equipos
, creamos un ranking de equipos usando únicamente datos desde la fecha inicial y hasta la penúltima fecha en la que se jugaron partidos.
fechas <- unique(anotaciones$date)
n <- length(fechas)
ranking <-rank.teams(anotaciones, equipos, max.date=fechas[n-1], min.date = fechas[1])
Finalmente, se estiman las probabilidades de los eventos, el equipo de casa gana, el equipo visitante gana o el resultado es un empate para los partidos que se jugaron en la última fecha del vector fechas.
p <- predict(ranking, date = fechas[n])
Para este ejercicio, importamos el conjunto de datos match.data.csv
a R y se agregó una nueva columna sumagoles
que contenga la suma de goles por partido.
link = paste("https://raw.githubusercontent.com/beduExpert/Programacion-R-Santander-2021/",
"main/Sesion-06/Postwork/match.data.csv", sep = "")
match.data <- read.csv(link, header = TRUE)
match.data$sumagoles <- match.data$home.score + match.data$away.score
A continuación, obtuvimos el promedio por mes de la suma de goles.
library(dplyr)
serie <- match.data %>% mutate(anio_mes = substr(date, 1, 7)) %>%
group_by(anio_mes) %>% summarize(goles_prom = mean(sumagoles))
En seguida construimos la serie de tiempo (Una serie de tiempo son datos estadísticos que se recopilan, observan o registran en intervalos de tiempo regulares [diario, semanal, semestral, anual, etc]) del promedio por mes de la suma de goles hasta diciembre de 2019 y se graficó la serie de tiempo correspondiente.
serie.ts <- ts(serie$goles_prom, end = c(2019, 12), frequency = 10)
plot(serie.ts, las = 1, col = 4, lwd = 2, xlab = "Tiempo", ylab = "Goles",
main = "Serie de Goles Promedio",
sub = "Serie mensual: Agosto de 2010 a Diciembre de 2019")
Observaciones
Notamos que para casi todos los meses contemplados entre Agosto de 2010 y Junio de 2020, los meses de junio y julio no se encuentran en el histórico. Esto debido a que en dichos meses no hay temporada futbolística. Por esta razón, asignamos frequency = 10
(frecuencia) a nuestra serie de tiempo serie.ts
, con el propósito de ajustar la periodicidad lo mejor posible a los datos que tenemos. Sin embargo, una frecuencia de 12 sólo desplazaría ligeramente la gráfica, por lo que ambas opciones son viables.
El objetivo de este postwork es realizar el alojamiento de un fichero .csv
a una base de datos (BDD), en un local host de Mongodb a través de R
. Lo primero que se realiza es crear una conexión desde Mongo Atlas
a Mongo Compas
. Estando dentro de Compas se crea una base de datos con el nombre match_games
y dentro de esta base de datos se crea la colección match
. Dentro de la colección match
se carga el archivo match.data.csv
y nos cambiamos a R Studio
Dentro de R Studio
primero instalamos la librería mongolite
install.packages("mongolite")
library("mongolite")
Posteriormente realizamos la conexion con nuestro servidor de la siguiente forma
cone <- mongo("match", url = "mongodb+srv://manueeellll:manuel21@cluster0.1vtxm.mongodb.net/match_games?retryWrites=true&w=majority")
Relizamos un count
para conocer el número de registros en la base de datos. En este caso se puede verificar que son 3800 entradas o documentos.
cone$count()
#[1] 3800
Realizamos una consulta para conocer el número de goles que metió el Real Madrid el 20 de diciembre de 2015 y contra que equipo jugó para saber si ganó o perdió
consulta <- cone$find(query = '{"date":"2015-12-20","home.team":"Real Madrid"}')
consulta
# date home.team home.score away.team away.score
#1 2015-12-20 Real Madrid 10 Vallecano 2
El Real Madrid en ese partido anotó 10 goles y jugó contra el equipo Vallecano, como podemos ver en la consulta de arriba. Por supuesto que fue goleada.
Por último, cerramos la conexión con la base de datos
rm(cone)
Comenzamos cargando las librerías necesarias para le creación de Dashboard
library(shiny)
library(shinydashboard)
library(shinythemes)
Seleccionamos el directorio de trabajo en donde se almacenan los datos del archivo match.data.csv
setwd("C:/Users/santa/Desktop/R/Sesion 08/Postwork8/data")
data <- read.csv("match.data.csv")
Dentro del ambiente del ui
creamos cuatro menuItem
para cada una de las pestañas: Gráfica de barras, Probabilidades, Data Table y Factores de ganancia.
ui <-fluidPage(
dashboardPage(
dashboardHeader(title = "Postwork 8 - Equipo 9"),
dashboardSidebar(
sidebarMenu(
menuItem("Gráfica de Barras", tabName = "Barras", icon = icon("bar-chart-o")),
menuItem("Probabilidades", tabName = "probs", icon = icon("file-picture-o")),
menuItem("Data Table", tabName = "data_table", icon = icon("table")),
menuItem("Factores de ganancia", tabName = "fact", icon = icon("area-chart"))
)
),
En el dashboardBody agregamos los elementos de cada una de las pestañas. En la primera pestaña se inicializa un gráfico de tipo Barras
, un selectInput
para seleccionar las variables a graficar, las cuales se indican en el vector choices
.
dashboardBody(
tabItems(
# Histograma
tabItem(tabName = "Barras",
fluidRow(
titlePanel("Gráfico de Barras del archivo match.data"),
selectInput("xx", "Seleccione el valor de X",
choices = c("home.score", "away.score")),
box(plotOutput("plot1",width = 650, height = 650)),
)
),
En la segunda pestaña se muestran tres imagenes generadas en el Postwork 03
# Probabilidades
tabItem(tabName = "probs",
fluidRow(
titlePanel(h3("Probabilidad Marginal: equipo local")),
img(src = "Sesion3_plot1.png",
height = 350, width = 450),
h3("Probabilidad Marginal: equipo visitante"),
img(src = "Sesion3_plot2.png",
height = 350, width = 450),
h3("Probabilidades conjuntas"),
img(src = "Sesion3_plot3.png",
height = 350, width = 450)
)
),
En la tercera se inicializa una pestaña para un Data Table
.
# Data Table
tabItem(tabName = "data_table",
fluidRow(
titlePanel(h3("Table Match")),
dataTableOutput ("data_table")
)
),
Y por último, en la cuarta pestaña se muestras las imágenes generadas por el código momios.R
# Factores de ganancia
tabItem(tabName = "fact",
fluidRow(
titlePanel(h3("Factor de ganancia: Máximo")),
img(src = "Momios_max.png",
height = 350, width = 450),
h3("Factor de ganancia: Promedio"),
img( src = "Momios_prom.png",
height = 350, width = 450)
)
)
)
)
)
)
De aquí en adelante es la parte que corresponde al server
. Aquí corresponde llamar a la gráfica de la primera pestaña con los comandos de la librería ggplot2
server <- function(input, output) {
library(ggplot2)
#Gráfico de Histograma
output$plot1 <- renderPlot({
ggplot(data, aes(x = as.factor(data[,input$xx]))) +
geom_bar(color="black", fill = "steelblue") +
facet_wrap(as.factor(data$away.team)) +
xlab("Goles")+
ylab("Frecuencia")
})
Y llamar al Data Table
de la última pestaña. Con el comando options
seleccionamos la cantidad de datos que se van a mostrar en nuestro Dashboard.
#Data Table
output$data_table <- renderDataTable( {data},
options = list(aLengthMenu = c(5,25,50),
iDisplayLength = 5)
)
}
shinyApp(ui, server)
El Dashboard
se puede visualizar en el siguiente enlace