For å illustrere vekst vil vi benytte bruttonasjonalprodukt (BNP) fra Statistisk Sentralbyrå (SSB). Data finnes i tabell “09842: BNP og andre hovedstørrelser (kr per innbygger), etter statistikkvariabel og år”. Tabellen inneholder årlige data fra 1970 over utviklingen i BNP, målt i kroner per innbygger.
SSB gir oss tilgang til sine data via en API. API står for “Application Programming Interface” og er en forkortelse for software som gjør at to applikasjoner kan kommunisere med hverandre. Hver gang du bruker en app som Facebook, sender en bilde i Snapchat eller sjekker været på telefonen din, så bruker du en API.
SSB tilbyr en API med ferdige datasett. Her er det omtrent 250 oppdaterte datasett med en fast URL over de mest brukte tabellene i Statistikkbanken. Disse er dermed enkelt tilgjengelig, og vi skal se nærmere på noen av dem senere.
For å få tilgang til tabellen med bruttonasjonalprodukt må vi benytte API:Lag egne datasett. Her finner du en API konsoll med en søkefunksjon. Vi søker på “bnp” og får opp følgende resultat i API konsollet:
API konsoll
Her ser vi hvilken url tabellen for bruttonasjonalprodukt har: “https://data.ssb.no/api/v0/no/table/09842”, dersom du går til denne nettsiden vil du se tabellen i JSON-stat format. Vi ser også hvilke variabler tabellen inneholder.
Vi skal nå benytte R kode for å trekke ut data. SSB har laget en R pakke PxWebApiData som vi skal ta i bruk. Du finner eksempel på bruk i denne lenken.
Vi starter med å laste nødvendige R pakker.
library(PxWebApiData)
library(tidyverse)
── Attaching packages ─────────────────────────── tidyverse 1.3.0 ──
✓ ggplot2 3.3.2 ✓ purrr 0.3.3
✓ tibble 3.0.3 ✓ dplyr 1.0.2
✓ tidyr 1.1.2 ✓ stringr 1.4.0
✓ readr 1.3.1 ✓ forcats 0.4.0
── Conflicts ────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()
Ta også en titt på brukerveiledningen til PxWebApiData pakken.
Meta informasjon om tabellen kan finnes med å benytte opsjonen returnMetaFrames = TRUE i spørringen.
variabler <- ApiData("http://data.ssb.no/api/v0/no/table/09842", returnMetaFrames = TRUE)
names(variabler)
[1] "ContentsCode" "Tid"
Vi har metavariablene ContentsCode og Tid. Vi kan nå se på hvilke verdier disse to variablene tar med spørringen:
verdier <- ApiData("https://data.ssb.no/api/v0/no/table/09842/", returnMetaData = TRUE)
verdier
[[1]]
[[1]]$code
[1] "ContentsCode"
[[1]]$text
[1] "statistikkvariabel"
[[1]]$values
[1] "BNP" "BNI" "NI" "DispINorge" "KonsumHIO"
[6] "MEMOBNP"
[[1]]$valueTexts
[1] "Bruttonasjonalprodukt"
[2] "Bruttonasjonalinntekt"
[3] "Nasjonalinntekt"
[4] "Disponibel inntekt for Norge"
[5] "Konsum i husholdninger og ideelle organisasjoner"
[6] "MEMO: Bruttonasjonalprodukt. Faste 2005-priser"
[[2]]
[[2]]$code
[1] "Tid"
[[2]]$text
[1] "år"
[[2]]$values
[1] "1970" "1971" "1972" "1973" "1974" "1975" "1976" "1977" "1978" "1979"
[11] "1980" "1981" "1982" "1983" "1984" "1985" "1986" "1987" "1988" "1989"
[21] "1990" "1991" "1992" "1993" "1994" "1995" "1996" "1997" "1998" "1999"
[31] "2000" "2001" "2002" "2003" "2004" "2005" "2006" "2007" "2008" "2009"
[41] "2010" "2011" "2012" "2013" "2014" "2015" "2016" "2017" "2018" "2019"
[[2]]$valueTexts
[1] "1970" "1971" "1972" "1973" "1974" "1975" "1976" "1977" "1978" "1979"
[11] "1980" "1981" "1982" "1983" "1984" "1985" "1986" "1987" "1988" "1989"
[21] "1990" "1991" "1992" "1993" "1994" "1995" "1996" "1997" "1998" "1999"
[31] "2000" "2001" "2002" "2003" "2004" "2005" "2006" "2007" "2008" "2009"
[41] "2010" "2011" "2012" "2013" "2014" "2015" "2016" "2017" "2018" "2019"
[[2]]$time
[1] TRUE
Vi har nå nok informasjon om strukturen av denne tabellen til at vi kan kjøre en spørring på ContentsCode = BNP og Tid = 1970-2019.
tabell <- ApiData("https://data.ssb.no/api/v0/no/table/09842/",
Tid = paste(1970:2019),
ContentsCode = "BNP")
Resultatet er en liste som vi kaller tabell.
Listen “tabell” i konsoll i RStudio
Vi ser at begge listene inneholder en data.frame men med litt ulike “labels”. Vi kan se på den første listen:
head(tabell[[1]])
statistikkvariabel år value
1 Bruttonasjonalprodukt 1970 23606
2 Bruttonasjonalprodukt 1971 26363
3 Bruttonasjonalprodukt 1972 29078
4 Bruttonasjonalprodukt 1973 32805
5 Bruttonasjonalprodukt 1974 37734
6 Bruttonasjonalprodukt 1975 42884
Deretter den andre listen:
head(tabell[[2]])
ContentsCode Tid value
1 BNP 1970 23606
2 BNP 1971 26363
3 BNP 1972 29078
4 BNP 1973 32805
5 BNP 1974 37734
6 BNP 1975 42884
Vi ser at det er litt ulike variabelnavn og variabelbenevnelser mellom de to listene. I begge tilfellene ser vi at dataene på år er registrert som tegn (<chr>). Dette må vi gjøre om til numeriske (<int>) verdier.
Vi lagrer den første listen som et data objekt vi kaller bnp:
bnp <- tabell[[1]]
str(bnp)
'data.frame': 50 obs. of 3 variables:
$ statistikkvariabel: chr "Bruttonasjonalprodukt" "Bruttonasjonalprodukt" "Bruttonasjonalprodukt" "Bruttonasjonalprodukt" ...
$ år : chr "1970" "1971" "1972" "1973" ...
$ value : int 23606 26363 29078 32805 37734 42884 48711 54652 60091 66069 ...
Vi endrer år til numerisk, og endrer navn på bruttonasjonalprodukt fra value til BNP:
bnp <- bnp %>%
mutate(år=parse_number(år)) %>%
rename(BNP=value)
str(bnp)
'data.frame': 50 obs. of 3 variables:
$ statistikkvariabel: chr "Bruttonasjonalprodukt" "Bruttonasjonalprodukt" "Bruttonasjonalprodukt" "Bruttonasjonalprodukt" ...
$ år : num 1970 1971 1972 1973 1974 ...
$ BNP : int 23606 26363 29078 32805 37734 42884 48711 54652 60091 66069 ...
head(bnp)
statistikkvariabel år BNP
1 Bruttonasjonalprodukt 1970 23606
2 Bruttonasjonalprodukt 1971 26363
3 Bruttonasjonalprodukt 1972 29078
4 Bruttonasjonalprodukt 1973 32805
5 Bruttonasjonalprodukt 1974 37734
6 Bruttonasjonalprodukt 1975 42884
Deretter lager vi et enkelt “default” plot:
bnp %>%
ggplot(aes(x=år, y=BNP)) +
geom_line()
Vi kan enkelt forbedre litt på fremstillingen, som f.eks:
bnp %>%
ggplot(aes(x=år, y=BNP)) +
geom_line(color="dark blue") +
scale_y_continuous(labels = scales::comma) +
labs(title="Bruttonasjonalprodukt - BNP \n (kr per innbygger)",
x =" ",
y = "kr per innbygger") +
theme_bw()
Drøft hvilke endringer som er gjort når du sammenligner de to bruttonasjonalprodukt figurene.
Lag en ny figur der du denne gangen kun benytter BNP tall fra og med 1990.
Hint: benytt dplyr::filter() funksjonen.
Logaritmer er eksponenter. La \(x=b^n\), da vil \(n\) være logaritmen til \(x\) med grunntall \(b\). Det irrasjonelle tallet \(e \cong\) 2.7182818 blir brukt i matematikk, statistikk og økonomi som grunntall for logaritmer. Vi kaller logaritmer med \(e\) som grunntall for naturlige logaritmer. Vi utrykker den naturlige logaritmen av \(x\) som \(\ln(x)\). I R så benyttes funksjonen log() for den naturlige logaritmen, og exp() for eksponentialfunksjonen.
For ethvert positiv tall, \(x > 0\), har vi:
\[e^{\ln(x)}=\texttt{exp}\left [ \ln(x) \right ]=x\] og
\[\ln(e^{x})=x\]
En endring i en variabel \(x\) mellom to verdier, fra \(x_0\) (start) til \(x_1\) (stopp) kalles differansen \(\triangle x\). Ettersom \(\triangle x = x_1 - x_0\) blir den relative endringen i \(x\) lik:
\[\texttt{relativ endring i } x=\frac{x_1 - x_0}{x_0}=\frac{\triangle x}{x_0}\]
Er for eksempel \(x_0=5\) og \(x_1=5.3\), blir den relative endringen i \(x\) lik:
\[\frac{x_1 - x_0}{x_0}=\frac{5.3-5}{5}=0.06\]
Som oftest så benytter vi bare notasjonen \(\triangle x/x\). Den relative endringen er et desimaltall. Den korresponderende prosentvise endringen i \(x\) er 100 ganger den relative endringen.
\[\texttt{prosentvis endring i } x=100 \times \frac{x_1 - x_0}{x_0}=\% \triangle x\]
Er for eksempel \(x_0=5\) og \(x_1=5.3\), blir den prosentvise endringen i \(x\) lik:
\[\% \triangle x=100 \times \frac{x_1 - x_0}{x_0}=100 \times \frac{5.3-5}{5}=6 \%\]
En egenskap med logaritmer, og som gjør dem svært populære blant økonomer er følgende tolkning. La \(x_1\) være en positiv verdi av \(x\), og la \(x_0\) være en verdi av \(x\) som er “nær” \(x_1\). Vi kan da si at:
\[100 \times \left [ \ln(x_1)-\ln(x_0) \right ] \cong \% \triangle x=\texttt{prosentvis endring i } x\]
Så \(100\) ganger differansen mellom logaritmen til \(x_1\) og \(x_0\) er tilnærmet lik den prosentvise forskjellen mellom de to verdiene av \(x\), forutsatt at de to verdiene av \(x\) ikke er langt unna hverandre.
Er for eksempel \(x_0=5\) og \(x_1=5.3\), blir den prosentvise endringen i \(x\) lik:
\[100 \times \left [ \ln(5.3)-\ln(5) \right ] = 5.83 \%\]
Våre \(BNP\) data er tidsseriedata, der årstallet bestemmer rekkefølgen. For å beregne differansen \(\triangle x\) på tidsserier indekserer vi dem med tid (\(t\)). En endring i en tidsserievariabel \(x_t\) mellom to tidspunkt, fra \(x_t\) (denne periode) til \(x_{t-1}\) (forrige periode) er \(\triangle x_t=x_t - x_{t-1}\). I R så benyttes funksjonen lag() for å tidsforskyve en variabel en periode (\(x_{t-1}\)).
Vi gjør dette på våre bnp data, og kaller den nye variabelen \(BNP_{t-1}\) for BNP_L1.
bnp %>%
mutate(BNP_L1=lag(BNP)) %>%
head()
statistikkvariabel år BNP BNP_L1
1 Bruttonasjonalprodukt 1970 23606 NA
2 Bruttonasjonalprodukt 1971 26363 23606
3 Bruttonasjonalprodukt 1972 29078 26363
4 Bruttonasjonalprodukt 1973 32805 29078
5 Bruttonasjonalprodukt 1974 37734 32805
6 Bruttonasjonalprodukt 1975 42884 37734
Vi ser at den første verdien for tidsforskjøvet BNP mangler (NA). Vi kan nå fortsette med å beregne differansen i \(BNP\).
bnp %>%
mutate(BNP_L1=lag(BNP),
dBNP=BNP-BNP_L1) %>%
head()
statistikkvariabel år BNP BNP_L1 dBNP
1 Bruttonasjonalprodukt 1970 23606 NA NA
2 Bruttonasjonalprodukt 1971 26363 23606 2757
3 Bruttonasjonalprodukt 1972 29078 26363 2715
4 Bruttonasjonalprodukt 1973 32805 29078 3727
5 Bruttonasjonalprodukt 1974 37734 32805 4929
6 Bruttonasjonalprodukt 1975 42884 37734 5150
Vi kan selvsagt gjøre beregningen av differansen direkte.
bnp %>%
mutate(dBNP=BNP-lag(BNP)) %>%
head()
statistikkvariabel år BNP dBNP
1 Bruttonasjonalprodukt 1970 23606 NA
2 Bruttonasjonalprodukt 1971 26363 2757
3 Bruttonasjonalprodukt 1972 29078 2715
4 Bruttonasjonalprodukt 1973 32805 3727
5 Bruttonasjonalprodukt 1974 37734 4929
6 Bruttonasjonalprodukt 1975 42884 5150
Den prosentvise endringen i \(BNP\) blir.
bnp %>%
mutate(prosBNP = 100*(BNP - lag(BNP))/lag(BNP)) %>%
head()
statistikkvariabel år BNP prosBNP
1 Bruttonasjonalprodukt 1970 23606 NA
2 Bruttonasjonalprodukt 1971 26363 11.67923
3 Bruttonasjonalprodukt 1972 29078 10.29852
4 Bruttonasjonalprodukt 1973 32805 12.81725
5 Bruttonasjonalprodukt 1974 37734 15.02515
6 Bruttonasjonalprodukt 1975 42884 13.64817
Vi kan lage en enkel figur av de prosentvise endringen. Legg merke til at vi får en feilmelding fordi vi mangler den første observasjonen.
bnp %>%
mutate(prosBNP = 100*(BNP - lag(BNP))/lag(BNP)) %>%
ggplot(aes(x=år, y=prosBNP)) +
geom_line()
Warning: Removed 1 row(s) containing missing values (geom_path).
Vi fjerner den manglende observasjonen, og forbedrer litt på fremstillingen.
bnp %>%
mutate(prosBNP = 100*(BNP - lag(BNP))/lag(BNP)) %>%
filter(år >=1971) %>%
ggplot(aes(x=år, y=prosBNP)) +
geom_line(color="dark red") +
labs(title="Prosentvis endring i bruttonasjonalprodukt - BNP",
x =" ",
y = "prosent") +
theme_bw()
Drøft hvilke endringer som er gjort når du sammenligner de to figurene med prosentvis endring i bruttonasjonalprodukt.
Lag en ny figur der du denne gangen benytter formelen for det logaritmiske differensialet for å beregne prosentvis endring i bruttonasjonalprodukt.
Hvilket år har vi den største årlige nedgangen, og hvorfor?
Hint: Vi kan sortere de prosentvise endringen med å benytte en bestemt funksjon. Gjør et google søk på “r dplyr sort”, benytt denne funksjonen til å ferdigstille koden under.
bnp %>%
mutate(prosBNP = 100*(BNP - lag(BNP))/lag(BNP)) %>%
filter(år >=1971) %>%
___(prosBNP)
Vi kan også gjøre en litt mer avansert analyse ved å beregne gjennomsnittet av de prosentvise endringen i bruttonasjonalprodukt per tiår. Drøft det som er gjort i koden, og kommenter det du ser i figuren.
bnp %>%
mutate(prosBNP = 100*(BNP - lag(BNP))/lag(BNP)) %>%
filter(år >=1971) %>%
mutate(tiår = år - år %% 10) %>%
group_by(tiår) %>%
mutate(snittBNP=mean(prosBNP)) %>%
ggplot(aes(x=år)) +
geom_line(aes(y=prosBNP), color="dark red") +
geom_step(aes(y=snittBNP), color="steelblue", linetype="dashed") +
labs(title="Prosentvis endring i bruttonasjonalprodukt - BNP \n (gjennomsnitt per tiår)",
x=" ",
y="prosent") +
theme_bw()
KPI
Plot på endringsform, samt kumulativ endring. Sette ny basis (=100)
R kode fra dette casetgetwd()
setwd("~/undervisning/okemnprog")
knitr::purl("bnp_vekst.Rmd")