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.