Web Scraping, PCA y K-means para sacar todo el potencial a @LaLiga

 a 11 de Octubre, 2016

Introducción

Esta claro que el mundo de fútbol levanta pasiones, el fútbol y todo lo que lo rodeada, entre ellas algunas web que nos permiten gestionar de manera virtual a nuestro equipo, además de recoger los puntos de la jornada sirve para confeccionar el once inicial.

En este caso, nuestro objetivo es poder llegar a segmentar a los jugadores de la liga profesional de fútbol en función a una serie de inputs que la web  pone a nuestra disposición, y de esta forma poder ayudar en la toma decisiones a la hora de gestionar mi equipo. http://www.comuniazo.com/

liga

Análisis

En primer lugar necesitamos extraer la información necesaria para seleccionar los atributos que determinaran la segmentación. Para ello, realizamos scraping a la web “comuniazo” a través de la siguiente url:

url <- "http://www.comuniazo.com/comunio/jugadores"

La libreria XML nos permite extraer información de la página web mediante la función readHTMLTable

library(XML)

jugadores= readHTMLTable(jugadores,
 stringsAsFactors = T,
 colnames = c("Posicion","Equipo","Jugador","Puntos","Media","Puntos_Casa","Media_Casa","Puntos_Fuera","Media_fuera", "Valor"),
 colClasses = c("character","character","character","FormattedNumber","FormattedNumber","FormattedNumber","FormattedNumber","FormattedNumber","FormattedNumber"))

El dataset esta formado por 504 registros y 14 variables candidatas.

Análisis de componentes principales

A continuación vamos a aplicar una de las técnicas de reducción de dimensionalidad , aplicamos análisis de componentes principales de los datos en R, para ello previamente escalaremos el dataset:

# Seleccionamos los atributos numéricos y escalamos

jugadores_num <- jugadores[,4:10]
jugadores_scale <- scale(jugadores_num)

# Aplicamos análisis de componentes principales
pc <- princomp(jugadores_scale)
plot(pc)
plot(pc, type = "l")
summary(pc)

rplot
rplot01Seleccionando dos componentes principales conseguimos explicar el 86% de la varianza.

# Obtenemos componentes principales
pc <- prcomp(jugadores_scale)
summary(pc)

Importance of components:
 Comp.1 Comp.2 Comp.3 Comp.4
Standard deviation 2.2477665 0.9923867 0.71057691 0.50588385
Proportion of Variance 0.7232142 0.1409699 0.07227477 0.03663246
Cumulative Proportion 0.7232142 0.8641840 0.93645881 0.97309127
 Comp.5 Comp.6 Comp.7
Standard deviation 0.37326927 0.22058428 0
Proportion of Variance 0.01994385 0.00696488 0
Cumulative Proportion 0.99303512 1.00000000 1

# Primeras componentes principales
comp <- data.frame(pc$x[,1:2])

rplot02

Análisis Cluster

Vamos a segmentar con la técnica más simple, para ello utilizaremos k-medias en R.
En primer lugar, ¿cómo determinamos el número de grupos? El método más simple es mirar a la suma de cuadrados dentro de los grupos y escoger el “punto” en la gráfica, de forma similar a como ocurre con el gráfico de sedimentación que hicimos para el PCA previamente. A continuación mostramos el código utilizado:

# Plot
plot(comp, pch = 16, col= rgb(0,0,0,0.5))


wss <- (nrow(jugadores_scale)-1)*sum(apply(jugadores_scale,2,var))

for (i in 2:15) 
 
 wss[i] <- sum(kmeans(jugadores_scale, centers =i)$withinss)

plot(1:15, wss, type = "b", xlab = "Number of Cluster", ylab = "Within groups sum of squares")

rplot03

# K-Means Clustering con 6 clusters

jugadores_Cluster <- kmeans(comp, 6, nstart = 25, iter.max = 1000)
jugadores_Cluster
aggregate(jugadores[,4:10], by=list(jugadores_Cluster$cluster), FUN = mean)

K-means clustering with 6 clusters of sizes 72, 114, 71, 64, 144, 39

Cluster means:
 PC1 PC2
1 -1.51933814 -1.1588460
2 0.81871056 -0.4593748
3 -0.09203462 0.9141368
4 -2.37569832 0.9286046
5 2.47658186 0.1106443
6 -4.66639217 -0.1143984

Clustering vector:
 [1] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 4 6 6 6 6 6 6 6 6 4 6 4 6 6 6 6 6
 [34] 6 6 4 4 6 6 1 4 4 6 6 6 4 1 4 1 4 4 4 1 4 1 4 4 1 4 4 4 1 4 4 6 1
 [67] 4 1 4 1 1 1 4 4 4 4 4 4 4 1 6 1 4 4 4 1 1 4 4 4 1 4 4 4 4 1 4 4 4
[100] 1 4 4 4 4 1 4 4 1 4 1 4 4 1 1 4 4 1 1 4 1 1 1 1 1 1 4 4 1 1 4 4 1
[133] 4 3 3 3 1 3 1 1 3 3 1 3 1 4 1 1 1 3 1 1 1 3 1 4 3 3 1 1 3 3 1 1 1
[166] 1 2 1 3 3 2 1 3 3 1 3 1 3 3 1 3 1 1 1 1 3 3 3 2 3 2 3 3 2 4 1 1 3
[199] 1 2 3 3 1 2 1 2 2 3 2 3 3 3 2 2 2 2 3 3 2 1 1 3 2 3 3 3 3 3 4 4 3
[232] 1 2 2 2 3 3 2 2 3 3 2 2 2 3 2 2 2 2 1 3 3 2 2 3 3 2 2 2 2 2 3 2 2
[265] 2 3 2 3 2 2 2 2 2 2 2 2 2 2 2 3 3 2 3 2 2 2 2 2 2 2 2 2 2 3 2 2 2
[298] 3 3 3 2 2 2 2 2 3 3 3 3 2 1 3 2 2 2 2 2 2 2 2 5 2 2 3 5 2 2 2 3 2
[331] 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 2 5 5 2 2 5 3 5 2 2 2 2 5 5 5 5 2
[364] 5 2 2 2 2 2 5 2 5 2 2 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[397] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[430] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[463] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[496] 5 5 5 5 5 5 5 5 5

Within cluster sum of squares by cluster:
[1] 76.21358 75.80518 55.22837 67.37217 75.01832 118.73351
 (between_SS / total_SS = 84.6 %)

Available components:

[1] "cluster" "centers" "totss" "withinss" 
[5] "tot.withinss" "betweenss" "size" "iter" 
[9] "ifault"

Una vez calculados los clusters correspondientes los visualizaremos en función de las dos componentes principales utilizadas:

library(ggplot2)

jugadores$cluster <- as.factor(jugadores_Cluster$cluster)

jugadores$PC1 <- comp$PC1
jugadores$PC2 <- comp$PC2

ggplot(jugadores, aes(PC1, PC2, color = jugadores$cluster)) +
 geom_point()

rplot04

El siguiente paso sería identificar los segmentos y establecer una etiqueta que los identifique y poder gestionar la estrategia.

Hasta aquí llega este post. ¡Espero que le haya gustado! Cualquier pregunta o comentario, no dude en dejar un comentario o acercarse a mí en Twitter: @mirallesjm

Anuncios