Votaciones de Eurovisión

Author

Intro

Estamos en el tercer día del curso de Introducción a Quarto y estamos practicando cómo hacer un tutorial. Para ello usamos un gist de Julia Silge

Marco teórico

Los países tienen afinidades/intereses etc… que pueden condicionar las votaciones de Eurovisión. El “prestigioso” diario Marca se hace eco aquí de esta hipótesis. En el artículo se cita a @picanumeros que ha trabajado el tema. Puedes ver su análisis en este hilo de twitter.

En la Wikipedia tenemos un largo artículo sobre Eurovisión lleno de datos, tablas y mapas.

Una imagen de WikiCommons de la 3ª edición del festival en la que aparece Domenico Modugno

Figure 1: Domenico Modugno

Por mucho que me empeñe yo cuesta incorporar ecuaciones a un informe sobre Eurovision, pero aquí tenemos una ecuación inline, \(A(L)=(I_{K}-A_{1}L^{1}- ... -A_{p}L^{p})\) , más abajo una ecuación independiente:

\[y_{t}=A_{1}y_{t-1}+v_{t}\]

Datos

Necesitamos datos. Afortunadamente el proyecto tidytuesday en su edición del 17 de mayo de 2022 utilizó datos sobre votaciones en Eurovision.

Antes de iniciar el análisis cargamos los paquetes de R que usaremos, solo que no vas a ver el chunk en el output final porque hemos puesto #| include: false.

Descargamos datos de Eurovision con este chunk de código:

eurovision_votes <- read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-05-17/eurovision-votes.csv')
Rows: 56312 Columns: 8
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (6): semi_final, edition, jury_or_televoting, from_country, to_country, ...
dbl (2): year, points

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Análisis

La verdad es que con esos datos se podrían hacer algún análisis más, por ejemplo tenemos el orden de aparición: igual el orden en el que cantas influye en las votaciones; pero vamos a replicar el análisis de @juliasilge@fosstodon.org

Vamos a utilizar técnicas de clustering implementadas en el paquete widyr Supondremos que hay 4 clusters.

#- clustering -----
set.seed(234)
eurovision_clusters <-  eurovision_votes %>%
  # dimensionality reduction with SVD: https://www.youtube.com/watch?v=UyAfmAZU_WI
  widyr::widely_svd(from_country, to_country, points, nv = 24) %>%
  #- combination of SVD and k-means: https://www.researchgate.net/publication/284617182_Combination_of_Singular_Value_Decomposition_and_K-means_Clustering_Methods_for_Topic_Detection_on_Twitter
  widyr::widely_kmeans(from_country, dimension, value, k = 4)

Resultados

Los resultados parecen good

Tabla

#- tabla -----
table <- eurovision_clusters %>% 
  group_by(cluster) %>% 
  summarise(from_country = paste(from_country, collapse = ", ")) 
gt::gt(table)
cluster from_country
1 Belarus, Belgium, Bosnia & Herzegovina, Bulgaria, Estonia, Greece, Israel, Latvia, Lithuania, Poland, Romania, Russia, San Marino, Slovakia, United Kingdom
2 Albania, Armenia, Austria, Azerbaijan, Croatia, Czech Republic, F.Y.R. Macedonia, Finland, France, Georgia, Germany, Luxembourg, Macedonia, Malta, Monaco, Montenegro, North Macedonia, Norway, Portugal, Serbia, Serbia & Montenegro, Slovenia, Spain, Sweden, Switzerland, Yugoslavia
3 Andorra, Cyprus, Denmark, Ireland, Italy, Morocco, Netherlands, The Netherlands
4 Australia, Hungary, Iceland, Moldova, Turkey, Ukraine

Mapa

#- mapa -----
map_data("world") %>%
  filter(region %in% eurovision_clusters$from_country) %>%
  left_join(eurovision_clusters, by = c("region" = "from_country")) %>%
  ggplot(aes(long, lat, group = group, fill = cluster)) +
  geom_polygon(alpha = 0.8) +
  coord_map() +
  scale_fill_brewer(palette = "Dark2") +
  labs(title = "Which countries vote similarly for Eurovision?",
       subtitle = "Clusters identified with SVD and K-means",
       caption = "Big thanks to @juliasilge@fosstodon.org") +
  pjpv.curso.R.2022::theme_pjp_maps() +
  theme(panel.background = ggplot2::element_rect(fill = "white",  color = NA)) +
  theme(plot.background = ggplot2::element_rect(colour = "white",fill = "white"))