Quinto Encuentro. Aprendiendo a Programar en 30 lecciones
Quinto encuentro
By Yanina Bellini Saibene in Español rstats Education 100DaysToOffload
March 24, 2024
En esta clase resolvimos preguntas que Juan Cruz trajo sobre los datos, aprendimos algunos verbos nuevos de dplyr y hicimos nuestros primeros graficos.
Preguntas sobre los datos
El ultimo ejercicio de la clase anterior era pensar en preguntas a contestar usando los datos de nuestros conjuntos de datos. Juan Cruz trajo muchas preguntas, contestamos algunas y dejamos otras para mas adelante porque aun no habiamos visto los conceptos necesarios para poder resolverlas.
Veamos las preguntas que si pudimos contestar:
Para copas
- Todas las veces que Argentina quedo entre los 3 mejores:podemos usar filter(), pero como indicamos que deje las filas en caso que Argentina haya sido campeon, subcampeon o tercero?
filter
puede tener mas de una condicion.
Ejercicio 1
La clase pasada vimos que Brasil es el pais con mas campeonatos y que 161 es el maximo de goles en una de las copas en la que salieron campeones.
Como podriamos listar todas las copas en las que Brasil salio campeon pero que no tiene el maximo de goles anotados?
-
Solucion propuesta durante la clase
copas %>% filter(Winner == "Brazil") %>% filter(GoalsScored != 161)
-
Podemos reescribir esa solucion de esta manera:
copas %>% filter(Winner == "Brazil", GoalsScored != 161)
Separar las condiciones con una coma es lo mismo que decir “y”, en este caso seria: Que el ganador sea Brasil y que la cantidad de goles anotados no sea 161.
La expresion !=
significa “distinto” o “no igual a”. Ahora, como sabemos que otros simbolos existen para poder generar condiciones a usar con filter?
Las condiciones se generan con operadores logicos. R tiene varios operadores logicos:
operador | definicion |
---|---|
< | menor que |
x|y | x o y |
<= | menor o igual a |
is.na(x) | chequea si x es NA |
!is.na(x) | chequea si x no es NA |
> | mayor que |
>= | mayor o igual a |
x %in% y | chequea si x esta en y |
!(x %in% y) | chequea si x no esta en y |
== | igual a |
!= | no igual a |
!x | no x |
x & z | x y z |
Entonces volviendo a la pregunta Todas las veces que Argentina quedo entre los 3 mejores, ahora podemos contestarla usando el operador | que significa o.
copas %>%
filter(Winner == "Argentina" | `Runners-Up` == "Argentina" | Third == "Argentina")
# A tibble: 5 × 10
Year Country Winner `Runners-Up` Third Fourth GoalsScored QualifiedTeams MatchesPlayed
<date> <chr> <chr> <chr> <chr> <chr> <int> <int> <int>
1 1930-01-01 Uruguay Uruguay Argentina USA Yugos… 70 13 18
2 1978-01-01 Argentina Argentina Netherlands Brazil Italy 102 16 38
3 1986-01-01 Mexico Argentina Germany FR France Belgi… 132 24 52
4 1990-01-01 Italy Germany FR Argentina Italy Engla… 115 24 52
5 2014-01-01 Brazil Germany Argentina Netherla… Brazil 171 32 64
# ℹ 1 more variable: Attendance <chr>
Al ver los resultados, nos dimos cuenta que si Argentina llego a la semifinal, siempre paso a la final, o sea nunca perdimos una semifinal!. Armamos esta consulta para chequear ese dato:
copas %>%
filter(Third == "Argentina" | Fourth == "Argentina")
# A tibble: 0 × 10
# ℹ 10 variables: Year <date>, Country <chr>, Winner <chr>, Runners-Up <chr>, Third <chr>,
# Fourth <chr>, GoalsScored <int>, QualifiedTeams <int>, MatchesPlayed <int>, Attendance <chr>
Consultas para jugadores.
- Listar todos los jugadores que tuvieron la 10.
diez <- jugadores %>%
filter(`Shirt Number` == 10)
La solucion propuesta es correcta, pero nos devuelve el mismo jugador varias veces, ya que ese jugador pudo haber jugado mas de un mundial con el mismo numero, por ejemplo Maradona con el numero 10. Para obtener valores unicos, usamos la funcion distinct()
.
diez <- jugadores %>%
filter(`Shirt Number` == 10) %>%
distinct(`Player Name`)
Consultas para partidos:
- Todos los cuartos de final de Argentina
partidos %>%
filter(Stage == "Quarter-finals",
`Away Team Name` == "Argentina" | `Home Team Name` == "Argentina")
- Todos los partidos que en el primer tiempo se metieron 2 goles o mas
La cantidad de goles totales no esta en ninguna columna de nuestro conjunto de datos.
Tenemos disponibles las variables Half-time Home Goals
que son los goles del local
al llegar el medio tiempo y Half-time Away Goals
, que son los goles del equipo
visitante al terminar el primer tiempo.
Para agregar una columna con el total de goles, vamos a usar la función mutate()
.
partidos %>%
mutate(goles = `Half-time Home Goals` + `Half-time Away Goals`)
Esta operacion genera una nueva columna llamada goles
que almacena el resultado de sumar los goles del visitante y del local, o sea, de sumar los valores que tienen las columnas
Half-time Home Goals
y Half-time Away Goals
.
Recordá que las funciones de dplyr nunca modifican la tabla original. mutate()
devolvió una nueva tabla que es igual a la tabla partidos
pero con la columna “goles” agregada. La tabla partidos
sigue intacta.
Ahora podemos usar esa variable goles
con la funcion filter()
partidos %>%
mutate(goles = `Half-time Home Goals` + `Half-time Away Goals`) %>%
filter(goles >= 2)
- Todos los partidos que se jugaron en Wembley.
partidos %>%
filter(Stadium == "Wembley Stadium")
- Todos los partidos que Argentina fue local
partidos %>%
filter(`Home Team Name` == "Argentina")
- Ordenar los partidos por audiencia de menor a mayor. Cual fue el partido menos visto?
partidos %>%
arrange(Attendance)
- ya ahora ordenarlo de mayor a menor. Cual fue el partido mas visto?
partidos %>%
arrange(desc(Attendance))
Preguntas para mas adelante:
Juan Cruz genero muchas preguntas mas, pero para poder responderlas tenemos que aprender otros conceptos. Asi que las dejamos para proximas clases.
Este es el listado propuesto y un breve detalle de que tenemos que aprender para poder resolverlo.
-
Jugadores:
-
todos los jugadores que metieron 1 o mas goles en el segundo tiempo. Hay que ver manejo de cadenas porque los datos estan en la columna “Event” y con anotaciones al estilo “G20” o “Y56” que significan: “Gol a los 20 minutos” y “Tarjeta amarilla a los 56 minutos”, respectivamente.
-
todos los jugadores que tuvieron de técnico a un sudamericano. Hay que aprender manejo de cadenas y unir mas de un conjunto de datos, ya que la informacion no se encuentra en la tabla de jugadores solamente. Tambien es necesario poder generar una nueva columna y asignar el valor usando case.
-
ordenar los jugadores por cantidad de goles. Al igual que la primera necesitamos aprender como manejar cadenas.
-
-
Partidos y Jugadores:
- todos los partidos de Di Maria.
- todos los goles de Neymar.
- todos los partidos donde un Europeo fue visitante.
Para todas estas consultas necesitamos aprender sobre cadenas, joins y case.
-
Copas:
- ordenar de mayor a menor o al revez la audiencia de los mundiales. Cambiar al tipo correcto. Hay que entender locale y la configuracion regional de la computadora.
Graficos
Antes de terminar la clase, vamos a ver como podemos visualizar nuestros datos en otra forma que no sea una tabla de resultados.
Visualizar datos es útil para identificar a relación entre distintas variables pero también para comunicar el análisis de los datos y resultados. El paquete ggplot2
permite generar gráficos de gran calidad en pocos pasos. Cualquier gráfico de ggplot tendrá como mínimo 3 componentes: los datos, un sistema de coordenadas y una geometría (la representación visual de los datos) y se irá construyendo por capas.
Primera capa: el área del gráfico
Cómo siempre, primero hay que cargar los paquetes y los datos. Vamos a usar los datos de partidos para este primer grafico, asi que ya lo tenemos cargado. Para cargar el paquete usamos library(ggplot2)
.
Nuestro objetivo es graficar la cantidad de goles en cada copa del mundo. Queremos poder graficar tambien la cantidad de goles que hacen los equipos locales y los equipos visitantes en cada copa del mundo.
Para poder realizar ese grafico, primero tenemos que calcular la cantidad de goles por cada copa. Podemos hacer ese agrupando por año y sumando la cantidad de goles del equipo visitante (variable Away Team Goals
) y del equipo local (variable Home Team Goals
) en cada partido y el total.
Vamos a guardar esos calculos en un nuevo conjunto de datos llamado goles
goles <- partidos %>%
group_by(Year) %>%
summarise(goles_v = sum(`Away Team Goals`),
goles_l = sum(`Home Team Goals`),
goles_t = goles_v + goles_l)
El paquete para hacer graficos se llama ggplot2
y la funcion principal es ggplot()
. El primer argumento de ggplot es el conjunto de datos (igual que las otras funciones del tidyverse), en nuestro caso sera goles
.
goles %>%
ggplot()
El resultado de pasarle los datos a la funcion ggplot()
es este recuadro gris, que nos indica que el grafico se inicializo, pero no hay ningun tipo de grafico porque aun no le indicamos que variables queremos graficar, ni que tipo de grafico queremos hacer.
Segunda capa: las coordenadas
El segundo argumento se llama “mapping” (mapeo en inglés). Este argumento define la relación entre cada columna del data frame y los distintos parámetros gráficos. Por ejemplo, qué columna va a representar el eje x, cuál va a ser el eje y, etc.. Este mapeo se hace siempre con la función aes()
(que viene de “aesthetics”, estética en inglés).
Por ejemplo, si querés hacer un gráfico que muestre la evolucion de la cantidad de goles totales en las copas del mundo, usarias algo asi:
goles %>%
ggplot(mapping = aes(x= Year, y = goles_t))
Este código le indica a ggplot
que genere un gráfico donde el eje x se mapea a la columna Year
y el eje y, a la columna goles_t
. Pero, como se ve, esto sólo genera el área del gráfico y los ejes. Lo que falta es indicar con qué geometrías representar los datos.
Tercera capa: geometrias.
Para agregar geometrías que representen los datos lo que hay que hacer es sumar (+) el resultado de una función que devuelva una capa de geometrías. Estas suelen ser funciones que empiezan con “geom_” y luego el nombre de la geometría (en inglés). Para representar los datos usando lineas, hay que uasr geom_line()
goles %>%
ggplot(mapping = aes(x= Year, y = goles_t)) +
geom_line()
Ejercicio 1: Intentemos hacer un grafico
Que cambios le tendrias que hacer al grafico anterior para mostrar la cantidad de goles de los equipos visitantes?
- Solucion propuesta:
goles %>%
ggplot(aes(x=Year, y = goles_v)) +
geom_line()
Agregando mas capas
Supongamos que quisieramos comparar la cantidad de goles de los equipos locales con los visitantes. ggplot() es muy poderoso porque usando el mas podemos agregar mas capas y podriamos tener un geom_line por cada variable. Vamos a hacerlo.
goles %>%
ggplot() +
geom_line(aes(x=Year, y = goles_v)) +
geom_line(aes(x=Year, y = goles_l))
Tenemos ambos valores graficados y las lineas son diferentes, pero como las lineas tienen el mismo color no podemos distingir cual pertenece a los visitantes y cual a los locales.
Ya vamos a ver en las proximas clases que cada parte del grafico se puede asociar a una variable del conjunto de datos. Tambien veremos que podemos dar valores constantes a diferentes partes del grafico. En este caso vamos a pintar de colores verde y azul las lineas para poder diferenciarlas.
goles %>%
ggplot() +
geom_line(aes(x=Year, y = goles_v), color = "blue") +
geom_line(aes(x=Year, y = goles_l), color = "green")
Ahora podemos distinguir entre cada serie de datos y ademas notar que con exepcion de la copa del mundo del 2014, los equipos que son locales siempre hacen mas goles que los equipos visitantes. Mostrando en el grafico la siempre mencionada “ventaja” del local.