Eurovision og Kendall’s Tau

Det er på tide med Eurovision! Glam, glitter og pappmusikk - og en anledning til å ha en liten konkurranse, og lære litt om statistikk for rankinger.


Author

Affiliation

Eivind Hageberg

 

Published

May 20, 2021

DOI


Eurovision 2021 - eller Melodi Grand Prix, som vi kaller det i Norge, går snart av stabelen. Og det bør jo bli fantastisk, etter flere år uten musikken.

Riktignok er musikken enestående forglemmelig, men det er allikevel gøy. Derfor hadde vi en liten konkurranse på jobb om å tippe på vinnere i konkurransen.

Resultatene hentes fra Eurovisionworld.com. Deltakelsen i tippekonkurransen ble henta inn i Easyfact, og er anonymisert.

Her har jeg også tatt i bruk read_excel-funksjonen fra readxl-pakka. Tidligere har jeg hatt et svare strev med å importere excel-filer til R. Derfor har jeg alltid konvertert data til csv-format for import. Men denne funksjonen ser ut til å funke veldig bra nå.

For den som ikke har sluttplasseringene i hodet, så ble resultatlista slik:

land plass
Italia 1
Frankrike 2
Sveits 3
Island 4
Ukraina 5
Finland 6
Malta 7
Litauen 8
Russland 9
Hellas 10
Bulgaria 11
Portugal 12
Moldova 13
Sverige 14
Serbia 15
Kypros 16
Israel 17
Norge 18
Belgia 19
Aserbajdsjan 20
Albania 21
San Marino 22
Nederland 23
Spania 24
Tyskland 25
Storbritannia 26

Det er to spørsmål som er interessante å se på her:

  1. hvis vi hadde vært et land, hvordan hadde lista blitt da, sammenliknet med resultatene totalt sett?
  2. hvem var best til å tippe?

Hvis vi var et land, hvordan hadde resultatet blitt da?

Det første spørsmålet er veldig lett å svare ut - det er bare å summere poengene og sette på en plassering

analyse_df = group_by(df, land) %>%
  summarise(
    poeng = sum(poengverdi)
  ) %>%
  mutate(
    plass = rank(desc(poeng), ties.method = "min")
  ) %>%
  left_join(
    ., select(resultat_df, land, faktisk_plass = plass), by = "land"
  ) %>%
  arrange(plass)

knitr::kable(select(analyse_df, land, plass, faktisk_plass))
land plass faktisk_plass
Malta 1 7
Island 2 4
Portugal 3 12
Frankrike 4 2
Bulgaria 5 11
Sveits 6 3
Ukraina 7 5
Italia 8 1
Hellas 9 10
Sverige 10 14
Kypros 11 16
San Marino 12 22
Storbritannia 12 26
Aserbajdsjan 14 20
Litauen 14 8
Norge 14 18
Serbia 14 15
Nederland 18 23
Finland 19 6
Russland 20 9
Albania 21 21
Belgia 21 19
Israel 21 17
Tyskland 21 25
Moldova 25 13
Spania 25 24

Hvis Analyseavdelinga hadde fått bestemme, hadde Maltas !Je me casse! vunnet, foran pussig teknobit-dans fra Island, og svarthvitt crooning fra Portugal. Ikke narkotikafrie rockere fra Italia, Voila-Frankrike og tårevåte Sveits.

Men hvem var nærmest det faktiske resultatet?

Dette er i grunnen et interessant spørsmål. Først lager vi et utpivotert datasett, hvor de ulike deltakerne er med, sammen med totalpoengene:

temp = group_by(df, deltaker) %>%
  mutate(
    plass = rank(desc(poengverdi), ties.method = "min")
  ) %>%
  select(
    deltaker, land, plass
  )

temp = bind_rows(select(resultat_df, -variabel), temp)
temp = pivot_wider(temp, names_from = deltaker, values_from = plass)

knitr::kable(temp)
land totalt Glam International Magiske Soppen Analytix Brandenburger Tor Eivindmaskin RS
Italia 1 10 12 2 11 5 2
Frankrike 2 10 15 2 1 10 1
Sveits 3 10 5 2 2 11 4
Island 4 1 7 2 5 4 5
Ukraina 5 10 15 1 3 11 12
Finland 6 10 15 2 11 11 7
Malta 7 2 2 2 4 2 11
Litauen 8 4 15 2 11 11 12
Russland 9 10 15 2 11 8 12
Hellas 10 10 8 2 11 3 12
Bulgaria 11 10 5 2 10 1 6
Portugal 12 10 1 2 6 7 3
Moldova 13 10 15 2 11 11 12
Sverige 14 5 15 2 8 11 9
Serbia 15 10 4 2 11 11 12
Kypros 16 3 15 2 9 11 12
Israel 17 8 15 2 11 11 12
Norge 18 10 15 2 7 11 8
Belgia 19 9 12 2 11 11 12
Aserbajdsjan 20 6 12 2 11 11 9
Albania 21 10 10 2 11 11 12
San Marino 22 10 3 2 11 11 12
Nederland 23 10 15 2 11 6 12
Spania 24 10 15 2 11 11 12
Tyskland 25 10 10 2 11 11 12
Storbritannia 26 7 9 2 11 9 12

Kendall’s Tau, eller rang-korrelasjons-koeffisient, er den en bruker for å korrelere ranker. Den kan måle styrken på forbindelsen mellom to ordinale variabler, i en bivariat krysstabell - som du vil få hvis du f.eks. har to personer som har rangert Eurovision-bidrag på en skala fra 1 til 12.

For å gjøre det mer forvirrende, og fordi økonomer liker å sette navnet sitt på ting, finnes det tre ulike implementeringer av Tau:

  1. Kendall’s Tau-a. Standardmålet og det opprinnelige forslaget.
  2. Kendall’s Tau-b. Denne justerer seg for uavgjorte verdier (hvis en har gitt samme rangering til en verdi).
  3. Stuart’s Tau-c. Denne justerer for uavgjorte verdier, og håndterer tabeller som har ulik størrelse (f.eks. om en totalt har rangert 26 bidrag fra 1 til 26, mens en deltaker har rangert fra 1 til 11).

I base-R er det Kendalls tau b som er implementert, antakeligvis fordi den håndterer “ties” - noe som hyppig kommer opp.

Vi regner like greit ut for alle, med hjelp av DescTools-pakka, som har implementert alle tre:

kor_matrise = data.frame(
  deltakere = c("Glam International", "Magiske Soppen", "Analytix", "Brandenburger Tor", "Eivindmaskin", "RS"),
  tau_a = c(
    DescTools::KendallTauA(temp$`Glam International`, temp$totalt),
    DescTools::KendallTauA(temp$`Magiske Soppen`, temp$totalt),
    DescTools::KendallTauA(temp$Analytix, temp$totalt),
    DescTools::KendallTauA(temp$`Brandenburger Tor`, temp$totalt),
    DescTools::KendallTauA(temp$Eivindmaskin, temp$totalt),
    DescTools::KendallTauA(temp$RS, temp$totalt)
),
tau_b = c(
    DescTools::KendallTauB(temp$`Glam International`, temp$totalt),
    DescTools::KendallTauB(temp$`Magiske Soppen`, temp$totalt),
    DescTools::KendallTauB(temp$Analytix, temp$totalt),
    DescTools::KendallTauB(temp$`Brandenburger Tor`, temp$totalt),
    DescTools::KendallTauB(temp$Eivindmaskin, temp$totalt),
    DescTools::KendallTauB(temp$RS, temp$totalt)
),
  tau_c = c(
    DescTools::StuartTauC(temp$`Glam International`, temp$totalt),
    DescTools::StuartTauC(temp$`Magiske Soppen`, temp$totalt),
    DescTools::StuartTauC(temp$Analytix, temp$totalt),
    DescTools::StuartTauC(temp$`Brandenburger Tor`, temp$totalt),
    DescTools::StuartTauC(temp$Eivindmaskin, temp$totalt),
    DescTools::StuartTauC(temp$RS, temp$totalt)
)) %>%
  mutate(
    plass = rank(desc(tau_c))
  ) %>%
  arrange(plass)

knitr::kable(kor_matrise, digits = 2)
deltakere tau_a tau_b tau_c plass
RS 0.40 0.49 0.43 1
Brandenburger Tor 0.35 0.45 0.37 2
Eivindmaskin 0.19 0.24 0.20 3
Analytix 0.05 0.19 0.10 4
Glam International 0.02 0.02 0.02 5
Magiske Soppen -0.02 -0.03 -0.03 6

Den endelige resultatlista rangerer alle 26 deltakerne, mens hver enkelt deltaker kun har rangert 10 land. Dermed er det Tau-c som er det korrekte målet å bruke. Vi ser at det har særlig betydning for Analytix, som kun ga poeng til Ukraina - og ingenting annet. De fleste får en høyere sammenhengsverdi med tau-b enn tau-c, antakeligvis pga. hvordan sisteplass er håndtert i poenggivninga.