Explorar el conjunto de datos FIFA

Objetivo:

Explorar y generar tablas de distribución del conjunto de datos, FIFA.

1. Cargar librerías:

library(readr)
library(dplyr)
library(lubridate)
library(fdth)
library(ggplot2)

2. Cargar los datos:

datos_fifa <- read.csv("C:/Users/cinth/Documents/ITD/Analisis inteligente de datos/Datos/data.csv", encoding = "UTF-8")

clubs_per_nation <- read.csv("C:/Users/cinth/Documents/ITD/Analisis inteligente de datos/Datos/clubs.nation.csv", encoding = "UTF-8")

2.5. Revisión de datos pre-limpieza:

#Primeros 3
head(datos_fifa[,c(3,4,6,8,9,10,12,13,14,15,27,28)], 3)
               Name Age Nationality Overall Potential                Club
1          L. Messi  31   Argentina      94        94        FC Barcelona
2 Cristiano Ronaldo  33    Portugal      94        94            Juventus
3         Neymar Jr  26      Brazil      92        93 Paris Saint-Germain
    Value  Wage Special Preferred.Foot Height Weight
1 \200110.5M \200565K    2202           Left    5'7 159lbs
2    \20077M \200405K    2228          Right    6'2 183lbs
3 \200118.5M \200290K    2143          Right    5'9 150lbs
#último 3
tail(datos_fifa[,c(3,4,6,8,9,10,12,13,14,15,27,28)], 3)
                Name Age Nationality Overall Potential             Club Value
18205      B. Worman  16     England      47        67 Cambridge United  \20060K
18206 D. Walker-Rice  17     England      47        66  Tranmere Rovers  \20060K
18207      G. Nugent  16     England      46        66  Tranmere Rovers  \20060K
      Wage Special Preferred.Foot Height Weight
18205  \2001K    1189          Right    5'8 148lbs
18206  \2001K    1228          Right   5'10 154lbs
18207  \2001K    1321          Right   5'10 176lbs

3. Limpiar los datos:

feet_inch_to_m <- function(height){
  est_m <- as.numeric(substring(height, 1,1)) * 30.48 +
    as.numeric(substring(height, 3,4)) * 2.54
  est_m <- round(est_m/100,2)
  est_m
}

lb_to_kg <- function(pounds){
  kgs <- as.numeric(substring(pounds, 1,3))
  kgs <- round(kgs * 0.453592,2)
  kgs
}

mk_to_pesos <- function(m_k) {
  options(scipen=999)
  pesos <- substr(m_k,2,nchar(m_k)-1)
  pesos <- as.numeric(pesos)
  pesos
}

#Crear nuevas columnas
datos_fifa <- mutate(datos_fifa, Height_m = feet_inch_to_m(Height), 
                     Weight_kg = lb_to_kg(Weight))

#Reducir dataframe 

datos_fifa_2 <- select(datos_fifa, Name, Age, Nationality, 
                       Overall, Potential, Club, Value, 
                       Preferred.Foot, Position, Height, Weight,Height_m, Weight_kg)

4. Revisión de datos post-limpieza:

Registros:

paste("Cantidad de registros: ",nrow(datos_fifa_2))
[1] "Cantidad de registros:  18207"

Variables:

paste("Cantidad de variables: ",ncol(datos_fifa_2))
[1] "Cantidad de variables:  13"

Tipos de variables:

str(datos_fifa_2)
'data.frame':   18207 obs. of  13 variables:
 $ Name          : chr  "L. Messi" "Cristiano Ronaldo" "Neymar Jr" "De Gea" ...
 $ Age           : int  31 33 26 27 27 27 32 31 32 25 ...
 $ Nationality   : chr  "Argentina" "Portugal" "Brazil" "Spain" ...
 $ 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          : chr  "FC Barcelona" "Juventus" "Paris Saint-Germain" "Manchester United" ...
 $ Value         : chr  "\200110.5M" "\20077M" "\200118.5M" "\20072M" ...
 $ Preferred.Foot: chr  "Left" "Right" "Right" "Right" ...
 $ Position      : chr  "RF" "ST" "LW" "GK" ...
 $ Height        : chr  "5'7" "6'2" "5'9" "6'4" ...
 $ Weight        : chr  "159lbs" "183lbs" "150lbs" "168lbs" ...
 $ Height_m      : num  1.7 1.88 1.75 1.93 1.8 1.73 1.73 1.83 1.83 1.88 ...
 $ Weight_kg     : num  72.1 83 68 76.2 69.8 ...

5. Análisis de datos

Frecuencia de jugadores por nacionalidad:

frec_nacionalidad <- datos_fifa_2 %>% 
  group_by(Nationality) %>% 
  summarise(Total = n()) %>% 
  arrange(desc(Total))

frec_nacionalidad
# A tibble: 164 x 2
   Nationality Total
   <chr>       <int>
 1 England      1662
 2 Germany      1198
 3 Spain        1072
 4 Argentina     937
 5 France        914
 6 Brazil        827
 7 Italy         702
 8 Colombia      618
 9 Japan         478
10 Netherlands   453
# ... with 154 more rows

Gráfica de barras:

#Primeros 10
ggplot(data = head(frec_nacionalidad, 10), aes(x = Nationality, y = Total, color = Nationality)) + geom_bar(stat = 'identity')

#últimos 10
ggplot(data = tail(frec_nacionalidad, 10), aes(x = Nationality, y = Total, color = Nationality)) + geom_bar(stat = 'identity')

Media y mediana de edad por Nacionalidad

edad_nacionalidad_club <- select(datos_fifa_2, Age, Nationality, Club)

media_nacionalidad <- edad_nacionalidad_club %>% 
  group_by(Nationality) %>% 
  summarise(Total = n(), Mean = mean(Age), Median = median(Age)) %>% 
  arrange(Mean)

Datos:

head(media_nacionalidad, 10)
# A tibble: 10 x 4
   Nationality        Total  Mean Median
   <chr>              <int> <dbl>  <dbl>
 1 Indonesia              1  17     17  
 2 Botswana               1  20     20  
 3 Rwanda                 1  21     21  
 4 Tanzania               3  22     22  
 5 Zambia                 9  22.2   21  
 6 Afghanistan            4  22.5   22  
 7 Chad                   2  22.5   22.5
 8 Antigua & Barbuda      4  22.8   22  
 9 Dominican Republic     2  23     23  
10 Jordan                 1  23     23  
tail(media_nacionalidad, 10)
# A tibble: 10 x 4
   Nationality         Total  Mean Median
   <chr>               <int> <dbl>  <dbl>
 1 Fiji                    1  30     30  
 2 Guam                    1  30     30  
 3 New Caledonia           1  30     30  
 4 Kuwait                  1  31     31  
 5 Palestine               1  31     31  
 6 São Tomé & Príncipe     1  31     31  
 7 Trinidad & Tobago       4  31.8   28.5
 8 Ethiopia                1  32     32  
 9 Puerto Rico             1  34     34  
10 Oman                    1  36     36  
media_nacion_edad <- filter(media_nacionalidad, Total >= mean(media_nacionalidad$Total)) %>% 
  arrange(Mean)

Gráfica de cajas:

#Primeros 10
ggplot(data = head(media_nacion_edad, 10), aes(x = Nationality, y = Mean)) + 
  geom_boxplot() 

# Últimos 10
ggplot(data = tail(media_nacion_edad, 10), aes(x = Nationality, y = Mean)) + 
  geom_boxplot()

Top 10 nacionalidades.

top_10 <- head(media_nacion_edad$Nationality, 10)
top_10
 [1] "Nigeria"     "Ghana"       "Netherlands" "England"     "Norway"     
 [6] "Denmark"     "Mexico"      "Belgium"     "Germany"     "Australia"  

Top 10 nacionalidades en dataframe:

paises_top <- filter(datos_fifa_2, Nationality %in% top_10)

head(paises_top[,c(2,3,6)])
  Age Nationality              Club
1  27     Belgium   Manchester City
2  27     Belgium           Chelsea
3  28     Germany       Real Madrid
4  24     England Tottenham Hotspur
5  26     Germany      FC Barcelona
6  26     Belgium       Real Madrid

Diagrama de cajas del top 10 de nacionalidades:

ggplot(data = paises_top, aes(x = Nationality, y = Age, color = Nationality)) + geom_boxplot()

Frecuencia de equipos por país

Diagrama del top 10 de equipos

data_w_country <- merge(x = datos_fifa_2, y = clubs_per_nation,
                        by.x = 'Club', by.y = 'club')

Crear conjunto de clubs y países:

datos_pais_club <- select(data_w_country, Club, country)
datos_pais_club <- distinct(datos_pais_club)
head(datos_pais_club)
                   Club country
1                              
2   SSV Jahn Regensburg        
3 1. FC Heidenheim 1846        
4  1. FC Kaiserslautern        
5       1. FC Magdeburg Germany
6    1. FC Union Berlin        

Tabla de frecuencias por país

frecuencia <- data.frame(fdt_cat(datos_pais_club$country)) %>% 
  select(Category, f)

names(frecuencia) <- c("Pais", "Equipos")

frecuencia <- frecuencia[-1,]

frecuencia <- filter(frecuencia, !Pais == "")

head(frecuencia, 10)
        Pais Equipos
1    England      48
2        USA      24
3      Italy      22
4      Spain      22
5    Germany      17
6     Mexico      15
7     France      13
8  Argentina      10
9      China      10
10   Ireland       8
tail(frecuencia, 10)
          Pais Equipos
22 South Corea       3
23      Canada       2
24       Chile       2
25    Scotland       2
26      Turkey       2
27     Ucrania       2
28   Australia       1
29     Austria       1
30       Corea       1
31     Denmark       1

Diagrama de barras, 10 más - 10 menos

ggplot(data = head(frecuencia, 10), aes(Pais, Equipos, color = Pais)) + geom_col()

ggplot(data = tail(frecuencia, 10), aes(Pais, Equipos, color = Pais)) + geom_col()

Jugadores por club, con diagrama top 10

players_per_club <- data_w_country %>% 
  group_by(Club) %>% 
  summarise(Total = n())

f_top_10_per_club <- head(arrange(players_per_club, desc(Total)),10)
l_top_10_per_club <- tail(arrange(players_per_club, desc(Total)),10)
f_top_10_per_club
# A tibble: 10 x 2
   Club                  Total
   <chr>                 <int>
 1 ""                      241
 2 "Arsenal"                33
 3 "AS Monaco"              33
 4 "Borussia Dortmund"      33
 5 "Burnley"                33
 6 "Cardiff City"           33
 7 "Chelsea"                33
 8 "Eintracht Frankfurt"    33
 9 "Empoli"                 33
10 "Everton"                33
l_top_10_per_club
# A tibble: 10 x 2
   Club                 Total
   <chr>                <int>
 1 Botafogo                20
 2 Chapecoense             20
 3 Cruzeiro                20
 4 Fluminense              20
 5 Internacional           20
 6 Santos                  20
 7 Sport Club do Recife    20
 8 Limerick FC             19
 9 Sligo Rovers            19
10 Derry City              18

Valor promedio de los jugadores en Ámerica del Sur, Noteámeritca y Europa.

value_data <- data_w_country %>% 
  mutate(data_w_country, Valor = ifelse(substr(Value, nchar(Value), nchar(Value)) == 'M', mk_to_pesos(Value)*1000000, mk_to_pesos(Value)*100)) %>% 
  filter(Valor > 0)

head(value_data)
                  Club            Name Age Nationality Overall Potential Value
1  SSV Jahn Regensburg   S. Nachreiner  29     Germany      68        68 \200700K
2  SSV Jahn Regensburg          A. Dej  26      Poland      67        70 \200925K
3  SSV Jahn Regensburg        A. Geipl  26     Germany      68        70 \200900K
4  SSV Jahn Regensburg       P. Pentke  33     Germany      70        70 \200900K
5  SSV Jahn Regensburg H. Al Ghaddioui  27     Morocco      64        64 \200475K
6  SSV Jahn Regensburg       B. Saller  25     Germany      68        71 \200925K
  Preferred.Foot Position Height Weight Height_m Weight_kg country confederaion
1          Right       CB    6'2 170lbs     1.88     77.11                     
2          Right       CM    5'9 163lbs     1.75     73.94                     
3          Right      RDM   5'10 161lbs     1.78     73.03                     
4          Right       GK    6'3 187lbs     1.91     84.82                     
5          Right       ST    6'3 203lbs     1.91     92.08                     
6          Right       RB   5'10 154lbs     1.78     69.85                     
  continent Valor
1           70000
2           92500
3           90000
4           90000
5           47500
6           92500
tail(value_data)
                     Club          Name Age Nationality Overall Potential Value
14888 Yokohama F. Marinos  T. Nishiyama  18       Japan      53        67 \200110K
14889 Yokohama F. Marinos   R. Yamanaka  25       Japan      65        70 \200600K
14890 Yokohama F. Marinos D. Cvetinovic  29      Serbia      70        70 \2001.4M
14891 Yokohama F. Marinos       Y. Otsu  28       Japan      68        68 \200900K
14892 Yokohama F. Marinos       T. Kubo  17       Japan      64        85 \200975K
14893 Yokohama F. Marinos    T. Ogihara  26       Japan      64        67 \200475K
      Preferred.Foot Position Height Weight Height_m Weight_kg country
14888          Right       CB   5'11 152lbs     1.80     68.95        
14889           Left       LB    5'7 143lbs     1.70     64.86        
14890          Right      LCB    6'1 174lbs     1.85     78.93        
14891          Right      LCM   5'11 161lbs     1.80     73.03        
14892           Left      CAM    5'8 148lbs     1.73     67.13        
14893           Left       CM    6'0 157lbs     1.83     71.21        
      confederaion continent   Valor
14888                          11000
14889                          60000
14890                        1400000
14891                          90000
14892                          97500
14893                          47500

Media del valor de cada continente, donde:

* Ámerica del Sur = ‘SOUTH AMERICA’

* Norteámerica = ‘NORTH AMERICA’

* Europa = ‘EUROPE’

value_data <- value_data %>% 
  filter(!continent == "")

Medias del precio de los jugadores por continente:

mean_continent <- value_data %>% 
  group_by(continent) %>% 
  summarise(Mean = mean(Valor))

mean_continent
# A tibble: 5 x 2
  continent         Mean
  <chr>            <dbl>
1 ASIA          1230822.
2 EUROPE        5248561.
3 NORTH AMERICA 1488178.
4 OCEANIA        485160 
5 SOUTH AMERICA 2080089.

Gráficas de caja detallada:

ggplot(value_data, aes(x = continent, y = Valor )) +
  geom_boxplot() + 
  geom_hline(yintercept = mean(value_data$Valor), color = "red") + 
  labs(title = "Valor económico de los jugadores", subtitle =  paste("Valor económico medio = ", round(mean(value_data$Valor),2)))

Misma gráfica pero con más color:

ggplot(value_data, aes(x = continent, y = Valor)) +
  geom_boxplot() + 
    geom_jitter(aes(color = continent)) +
  geom_hline(yintercept = mean(value_data$Valor), color = "red") +
  labs(title = "Valor económico de los jugadores", subtitle =  paste("Valor económico medio = ", round(mean(value_data$Valor),2)))

Zurdo o derecho

¿Hay más jugadores zurdos, derechos u otros?

left_rigth <- data.frame(fdt_cat(datos_fifa$Preferred.Foot))
left_rigth
  Category     f          rf      rf...    cf     cf...
1    Right 13948 0.766078981 76.6078981 13948  76.60790
2     Left  4211 0.231284671 23.1284671 18159  99.73637
3             48 0.002636349  0.2636349 18207 100.00000

Gráfica de barras:

ggplot(left_rigth, aes(Category, f, fill=Category)) +
  geom_bar(stat = "identity") +
  labs(x = "Pie favorito", y = "Frecuencia")

Altura:

Media y mediana de los jugadores.

media_altura <- mean(datos_fifa$Height, na.rm = TRUE)
media_altura
[1] NA
mediana_altura <- median(datos_fifa$Height, na.rm = TRUE)
mediana_altura
[1] "5'9"

Gráfica de caja:

ggplot(data = value_data, aes(continent, Height_m, color=continent)) +
geom_boxplot() + # dibujamos el diagrama de cajas
stat_summary(fun.y=mean, geom="point",shape=18,
size=3, color="red") +
  geom_hline(yintercept = mean(value_data$Height_m, na.rm = TRUE), color="red") +
  labs(title = "Estatura media de jugadores por Continente", subtitle =  paste("Media total = ", round(mean(value_data$Height_m, na.rm = TRUE),2)))

Peso:

Media y mediana de los jugadores.

media_peso <- mean(datos_fifa$Weight, na.rm = TRUE)
media_peso
[1] NA
mediana_peso <- median(datos_fifa$Weight, na.rm = TRUE)
mediana_peso
[1] "165lbs"

Gráfica de caja:

ggplot(data = value_data, aes(continent, Weight_kg, color=continent)) +
geom_boxplot() + # dibujamos el diagrama de cajas
stat_summary(fun.y=mean, geom="point",shape=18,
size=3, color="red") +
  geom_hline(yintercept = mean(value_data$Weight_kg, na.rm = TRUE), color="red") +
  labs(title = "Peso medio de jugadores por Continente", subtitle =  paste("Media total = ", round(mean(value_data$Weight_kg, na.rm = TRUE),2)))

Interpretación:

De un total de 18,207 registros y 89 variables, tomando de estas como principales ‘Age’, ‘Nationality’, ‘Club’, ‘Value’, ‘Preferred foot’, ‘Height’, ‘Weight’, se obtuvo:

* Los jugadores más jóvenes por nacionalidad están en Indonesia con una media y mediana de 17 años de edad, mientras que los más grandes en Oman con 36 años de edad.

* Los jugadores más jóvenes por club están en FC Nordsjælland con una media y mediana de 20.25 y 19 años de edad respectivamente, mientras que los más grandes en Paraná con 31.60 y 34 años de edad.

* Entre los clubes con más jugadores se encuentran: Arsenal, Chelsea, FC Barcelona, Liverpool, Manchester United, Real Madrid, con 33 jugadores.

* Europa y América del Sur son los que mejor pagan a sus clubes, ocupando Europa el mejor lugar.

* La mayoría de los jugadores prefiere el pie derecho para tirar.

* La media y mediana de la altura de los jugadores es de 181.26 y 180.3 cm respectivamente.

* La media y mediana del peso de los jugadores es de 75.28 y 74.84 kg respectivamente.