Erik Gahner Larsen

Meningsmålinger fra Wikipedia til R med XML pakken

Internettet er fyldt med spændende data, der uden de store vanskeligheder kan hentes ned og anvendes systematisk. På Wikipedia er der eksempelvis en side med meningsmålingerne fra seneste folketingsvalg til i dag. I dette indlæg viser jeg, hvordan man simpelt kan hente disse meningsmålinger ind i R. Den nemmeste måde at gøre dette (som jeg er bekendt med), er ved at anvende XML pakken.

Det kræver ikke mange sekunders arbejde at hente informationerne ud. Først tager vi XML pakken i brug og angiver hvilken side, vi ønsker at hente data fra:

library(XML)
url <- "http://en.wikipedia.org/wiki/Opinion_polling_for_the_next_Danish_general_election"

Til at hente meningsmålingerne ud, bruger vi readHTMLTable funktionen i pakken XML. Som det fremgår af navnet på funktionen, er readHTMLTable ideel til at hente information fra tabeller ud fra hjemmesider. Vi gemmer vores data i polls:

polls <- readHTMLTable(url)

Nu er tabellen hentet ind i R, og det eneste det kræver herfra, er at lave en dataframe, der passer til vores ønsker. Nedenstående fjerner nogle kolonner (Kristeligt Folkeparti og blokinformationer), fjerner rækken med resultatet fra seneste folketingsvalg, laver en id variabel (1 er første måling lavet efter valget), erstatter DR med Epinion m.v.:

polls <- polls[[1]]
polls <- polls[-1,1:10]
colnames(polls) <- c("Institut", "id","Venstre","Socialdemokraterne","DF","Radikale","SF","Enhedslisten","LA","Konservative")
polls <- na.omit(polls)
polls = polls[-1,]
polls <- polls[polls[,1]!="Election Results",]
polls$Institut <- gsub("\\[|1|2|3|\\]", "", polls$Institut)
polls$Institut <- gsub("DR", "Epinion", polls$Institut)
polls$id <-  nrow(polls) - as.numeric(rownames(polls)) + 4

Nu har vi en tabel, der ser ud som følger:

tail(polls)
    Institut id Venstre Socialdemokraterne   DF Radikale  SF Enhedslisten  LA Konservative
118  Epinion  6    32.5               22.1 11.4      9.0 8.1          7.8 4.8          3.5
119  Megafon  5    32.9               22.8 10.4     10.5 7.4          7.3 4.6          3.9
120  Megafon  4    32.2               23.0 11.4     10.5 7.0          7.5 4.7          3.3
121  Epinion  3    31.9               20.9 11.8      9.6 8.7          7.4 4.8          4.4
122  Megafon  2    33.1               22.9 10.5      9.7 7.9          7.1 4.1          4.0
123  Megafon  1    28.2               24.1 12.4     10.5 7.8          6.9 5.4          4.0

head(polls)
  Institut  id Venstre Socialdemokraterne   DF Radikale  SF Enhedslisten  LA Konservative
2 Voxmeter 122    27.5               23.3 14.9      7.9 5.0         10.9 5.2          4.7
3   Gallup 121    27.5               22.7 15.6      7.7 4.6         10.8 5.0          4.7
4 Voxmeter 120    25.8               24.1 15.8      8.1 5.1         10.2 5.9          4.4
5 Voxmeter 119    24.9               24.7 15.3      7.5 6.0         11.5 5.7          3.9
6  Megafon 118    29.3               22.2 15.9      7.6 5.5         10.2 4.6          3.9
7  Rambøll 117    25.2               22.4 16.4      7.5 6.1         10.9 6.1          4.7

Efter at have lavet partivariablene numeriske, kan man bruge dem efter forgodtbefindende. For eksempel plotte hvordan de enkelte partier har rykket sig i meningsmålingerne siden Folketingsvalget. I disse to plot (lavet vha. ggplot2) er det vist for hhv. Venstre og Dansk Folkeparti:

Venstre havde en stigning i meningsmålingerne efter valget, men er nu begyndt at falde. Dansk Folkeparti kan kun håbe at deres udviklingen i meningsmålingerne fortsætter som hidtil. Der er selvfølgelig også mulighed for at plotte udviklingen for flere partier i samme plot (foruden ggplot2 har jeg anvendt reshape2):

Som bemærket ovenfor har jeg blot lavet en simpel id variabel, der giver hver meningsmåling et unikt id. Alternativt kunne man bruge informationen om hvilken dato meningsmålingen var publiceret, og plotte dem efter eksakt dato for offentliggørelse. Dette ville give et mere retvisende billede af distancen mellem de enkelte meningsmålingers offentliggørelse (og dermed også hvornår de er foretaget).

Mere arbejde krævede det ikke at hente en tabel ned fra nettet. XML pakken kan bruges til at hente al slags information ud, og hvis der blot er tale om en tabel fra en hjemmeside, som i ovenstående tilfælde, kræver det ikke mere end et lille script og lidt databearbejdning, alt efter hvad man ønsker at lave. God fornøjelse.