R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Presidentinvaalit, vaalikoneet ja oman ehdokkaan valinta

Tänään oli presidentinvaalien 2018 varsinainen vaalipäivä. Näpyttelin huvikseni kaikki seitsemän löytämääni vaalikonetta (Ilta-Sanomat, Yle, Etelä-Suomen Sanomat, Ilta-Sanomat, MTV3, Helsingin Sanomat ja Keskisuomalainen) läpi. Kukin vaalikone antoi kaikille kahdeksalle ehdokkaalle sijoituksen (1-8) sen mukaan kuinka hyvin ehdokkaan vastaukset vastasivat antamiani vastauksia. Mutta miten saisin kaikki ehdokkaat paremmuusjärjestykseen vaalikoneiden antamien sijojen perusteella? Borda-laskenta tarjoaa tähän valmiin menetelmän.

Borda-laskennassa ensimmäiseksi sijoitettu ehdokas saa ehdokkaiden määrän mukaisen pistemäärän, seuraava yhtä vähemmän pisteitä, ja viimeiseksi sijoittettu ehdokas yhden pisteen. Tämä tehdään kullekin vaalikoneelle erikseen. Tämän jälkeen pisteet skaalataan välille 0-1, ja lasketaan vaalikoneiden yli yhteen. Suurimman yhteispistemäärän saanut ehdokas valitaan. Tässä tapauksessa siis ko. ehdokkaalle annettaisiin ääni.

Vaalikoneiden antamat sijat voisivat olla vaikkapa seuraavat (eivät ole omat vastaukseni, simuloin ne alla olevalla koodilla):

           IS Yle ESS IL MTV3 HS KSML
Kyllönen    3   5   2  3    4  7    4
Haavisto    8   2   8  4    3  4    6
Vanhanen    7   6   6  7    2  6    8
Huhtasaari  6   4   3  5    7  1    3
Haatainen   2   8   4  6    6  3    7
Väyrynen    5   1   1  2    8  2    5
Niinistö    1   3   7  1    1  8    1
Torvalds    4   7   5  8    5  5    2
 
simulateAnswers<-function(ehdokkaat=c("Kyllönen", "Haavisto", "Vanhanen", "Huhtasaari", "Haatainen", "Väyrynen", "Niinistö", "Torvalds"),
                          vaalikoneet=c("IS", "Yle", "ESS", "IL", "MTV3", "HS", "KSML")) {
   res <- replicate(7,sample(1:8))
   colnames(res) <- vaalikoneet
   rownames(res) <- ehdokkaat
   return(res)
}  
 
s <- simulateAnswers()

Vaalikoneiden antamat vastaukset voitaisiin sitten käsitellä seuraavalla koodilla yhteispistemääräksi, joka lopuksi vielä järjestetään suuruusjärjestykseen:

ranks2points <- function(ranks, maxrank) {
   res <- maxrank-ranks
   return(res)
}
 
points2relpoints <- function(points) {
   res <- points/max(points)
   return(res)
}
 
# Argumentiksi maxrank annetaan tässä yhdeksän, siis ehdokkaiden määrä+1:
sort(rowSums(points2relpoints(ranks2points(s, 9))), decreasing=TRUE)
 
# Niinistö   Väyrynen   Kyllönen Huhtasaari   Haavisto  Haatainen   Torvalds   Vanhanen 
#    5.125      4.875      4.375      4.250      3.500      3.375      3.375      2.625

Borda-laskennalla käsiteltyjen vaalikonevastausten perusteella ääni olisi siis menossa Niinistölle.

Borda-laskennan lisäksi on olemassa muitakin menetelmiä päästä samankaltaiseen lopputulokseen, mutta monet ovat laskennallisesti raskaampia kuin Borda-laskenta. Eräs tällainen on Schulzen menetelmä, joka löytyy muun muassa R-paketista relations.


Category