Anders Lie Brenna og enerWE lager datadrevet journalistikk basert på åpne data og enkel programmering.

Kommentar:

Dette er datadrevet journalistikk i praksis: Slik kan vi automatisere vår dekning av strømprisen – med åpne data fra SSB

- Programmetspråket R er enkelt, og perfekt for journalister som har lyst til å jobbe med datadrevet journalistikk, skriver enerWE-redaktør Anders Lie Brenna.

Denne artikkelen er over to år gammel.

  • ANDERS LIE BRENNA, ansvarlig redaktør for enerWE.no

Førstkommende lørdag er det Data-SKUP, minikonferansen for alle journalister som er opptatt av datajournalistikk.

Jeg gleder meg veldig, og er både glad og lei meg for at konferansen er fullbooket.

På den ene siden er det fantastisk at så mange journalister har fått øynene opp for hvor viktig datajournalistikken er i ferd med å bli, men på den andre siden er det trist at ikke alle som ønsker å lære mer om det får plass.

Selv er jeg helt overbevist om at data må bli en naturlig del av journalistikken, og at det ikke er noe som kan overlates til utviklere som blir rekruttert fra IT-bransjen.

Det er kjempefint å ha en redaksjonell utvikler å lene seg på, men flere journalister bør også lære seg å programmere selv.

Heldigvis finnes det et programmeringsspråk som egner seg spesielt godt for journalister, og de spesielle behovene som vår yrkesgruppe har når vi utvikler egne løsninger.

Som journalister har vi en hektisk hverdag med mange tidsfrister. Vi gjør kjappe småsaker som haster og vi gjør grundige gravesaker som tar tid. I en slik arbeidshverdag er det vanskelig å sette av lange tidsperioder til å jobbe uavbrutt og uforstyrret med programmering.

Vi må se raske resultater av den innsatsen vi legger inn i programmeringsarbeidet, og vi må kunne gjenbruke gammel kildekode som det er en stund siden vi skrev.

Det betyr at vi trenger et programmeringsspråk som er enkelt å lære, som ikke krever mange linjer med kode for å oppnå det vi ønsker, og som er enkelt å lære og forstå.

Programmeringsspråket R er perfekt for dette. Det er i utgangspunktet utviklet for statistikk, og har dermed alt som trengs for å rapportere tall fra for eksempel SSB. Det har en språklig syntaks som er litt uvant for de som har programmeringserfaring fra før, men det er kort og konsist.

Med R kan man gjøre mye med lite.

Jeg har tidligere skrevet og forklart litt om hvordan vi i enerWE bruker R til å sjekke oljeprisen og dollarkursen opp mot statsbudsjettet hver måned. Ved hjelp av en liten kodesnutt på bare 24 linjer samler vi inn historiske oljepriser og dollarkurser for å regne oljeprisen om til norske kroner, for så å sammenligne det med prisforventningene som ligger i henholdsvis opprinnelig og revidert statsbudsjett.

Tilsvarende lager vi lignende egenutviklede programvaresnutter for å samle inn og rapportere andre opplysninger fra andre datagrunnlag.

En av kildene vi sjekker ut hver eneste dag er SSB. De oppdaterer hjemmesiden sin med nye artikler og ny statistikk så og si hver dag klokken 08:00.

SSB.no er datagrunnlaget lett tilgjengelig, og kan lastes ned blant annet som Excel-filer. Det fungerer greit nok når man skal lage én artikkel, men når vi skal følge opp mange forskjellige tall hver måned eller hvert kvartal er det en fordel å automatisere hele prosessen.

Det kan vi gjøre ved hjelp av SSBs programmeringsgrensesnitt.

I enerWE skriver vi for og om energibransjen, og er derfor opptatt av alle tall som har med energi å gjøre. Noen av disse tallene blir veldig bransjespesifikke, men strømprisen er noe som er interessant for de fleste lesere og dermed også de fleste redaksjoner.

Jeg skal derfor vise et eksempel på hvordan man automatisk kan hente ut SSB-tall om hvordan strømprisen utvikler seg for husholdningene. 

Ved hjelp av en kort kodesnutt på bare 60 linjer kan vi:

  • Laste ned oppdatert data fra SSB
  • Regne ut hvor mye merverdiavgiften utgjør på de historiske prisene
  • Lage en graf som viser strømprisen fordelt på strømmen og nettleien, samt hvor mye elavgiften og merverdiavgiften utgjør

Grafen som lages er tilpasset størrelsen på vår nettavis.

Slik ser kildekoden ut:

Kort fortalt gjør de forskjellige deler av kildekoden følgende...

Først lastes det inn biblioteker som kildekoden trenger:

install.packages("pacman")install.packages("rjstat")library(rjstat)require(pacman)p_load(httr,rjstat,mosaic)

 

Deretter sørger vi for at teksten støtter de norske tegnene Æ, Ø og Å.

Sys.setlocale(category="LC_ALL", locale="UTF-8")

 

Så bruker vi SSBs programmeringsgrensesnitt (API) til å hente data fra tabellen som inneholder strømprisene (tabell 09387):

url <- "http://data.ssb.no/api/v0/no/table/09387"data <- '{  "query": [    {      "code": "ContentsCode",      "selection": {        "filter": "all",        "values": [          "*"        ]      }    },    {      "code": "Tid",      "selection": {        "filter": "all",        "values": ["*" ]      }    }  ],  "response": {    "format": "json-stat"  }}'

temp <- POST(url , body = data, encode = "json", verbose())table <- fromJSONstat(content(temp, "text"))df <- table[[1]]

 

Nå har vi informasjonen vi trenger, og skal bare bearbeide den litt, samt regne ut merverdiavgiften for de historiske prisnivåene.

q.kraftpris <- filter(df, statistikkvariabel=="Kraftpris ekskl. mva (øre/kWh)")q.nettleie <- filter(df, statistikkvariabel=="Nettleie, ekskl. avgifter (øre/kWh)")q.forbruksavgift <- filter(df, statistikkvariabel=="Forbruksavgift på elektrisk kraft (øre/kWh)")q.totalpris <- filter(df, statistikkvariabel=="Kraft og nett i alt inkl. avgifter (øre/kWh)")merverdiavgift <- (q.kraftpris$value + q.nettleie$value + q.forbruksavgift$value) * 0.25

Til slutt lager vi grafen, og lagrer den som et JPG-bilde:

ggplot() + geom_line(aes(q.kraftpris$kvartal, q.kraftpris$value, group=1, color="Kraftpris")) +  geom_line(aes(q.nettleie$kvartal, q.nettleie$value, group=1, color="Nettleie")) +  geom_line(aes(q.forbruksavgift$kvartal, q.forbruksavgift$value, group=1, color="Elavgift")) +  geom_line(aes(q.totalpris$kvartal, q.totalpris$value, group=1, color="Totalpris")) +  geom_line(aes(q.totalpris$kvartal, merverdiavgift, group=1, color="Merverdiavgift")) +  scale_x_discrete(name="Tid", breaks=c("2012K1", "2013K1", "2014K1", "2015K1", "2016K1", "2017K1")) +  labs(x="Tid", y="Øre/kWh", title="Strømprisen") +  theme(    legend.position = "right",    legend.title = element_blank(),    legend.direction = "vertical"  )ggsave("Elektrisitetspris.jpg", dpi=100, width=6, height=3)

Hvis du aldri har programmert før kan dette se litt skremmende ut, men det er overaskende hvor enkelt det faktisk er.

Det tar litt tid å bli kjent med syntaksen i programmeringsspråket, og det kan til tider være frustrerende å lete seg frem til hvor man har gjort en liten skrivefeil som ødelegger for hele koden.

Med dette kodeeksempelet som utgangspunkt er du imidlertid langt på vei til å hente ut de SSB-dataene som du og din redaksjon er interessert i å gjøre noe på for dine lesere.

Det er viktig å ikke gape over for mye av gangen, og dette er et ganske enkelt eksempel på hvordan man kan bruke programmering til å rapportere viktige nøkkeltall fra bransjen. 

På samme måte som den ordinære journalistikken blir mye bedre med flere kilder, blir også den datadrevne journalistikken bedre av å kombinere flere datagrunnlag. Her er det mange muligheter.

Man kan for eksempel koble strømpriser opp mot strømforbruk og import/eksport av strøm for å finne nye sammenhenger som kan følges opp journalistisk.

Mulighetene med datadreven journalistikk er uendelige, og R i mine øyne det perfekte programmeringsspråket for journalister.

Jeg vet at det er noen av dere som sysler med det, men jeg håper vi kan bli flere, og at vi kan dele erfaringer rundt den journalistiske bruken av det i tiden fremover. 

Hvis du ble nysgjerrig på R, er det mange gode kilder for dette rundt på nettet. Du kan begynne med å laste ned programmeringsspråket her, og installere utviklingsverktøyet R Studio herfra

Vi ses på Data-SKUP!

  • For ordens skyld: enerWE-gründer og majoritetseier Chul Christian Aamodt eier også 10 prosent av Medier24 AS, gjennom investeringsselskapet Screensailor AS.
Powered by Labrador CMS