Mål og forberedelser
Denne arbeidsboken har oppgaver knyttet til hvordan man jobber med data i R. Før du løser dette oppgavesettet anbefales det å du jobber deg igjennom Arbeidsbok 2: Data i R
.
Oppgavesett 1
I dette oppgavesettet skal du vi på data på akademisk ranking. Vi skal se og beskrive data på lands akademiske produksjon. Vi skal sammenligne ulike land og regioners output. For en oversikt funksjonene vi skal bruke, burde du først se på Andre arbeidsbok: Data i R.
Laste inn data
Datene vi skal jobbe med er kompilert fra følgende nettside https://www.scimagojr.com/countryrank.php og er en ranking av lands sin akademiske produksjon.
Datasettet heter coutry_ranking.
I dette datasettet er det registrert data på akademisk ranking, publiserte artikler og siteringer for et land for hvert år fra 1996. Det vil si at en observasjonsenhet er et land i et år. Dette kaller man ofte for land-år-data. Datasettet består av 3847 observasjoner (land-år) og 7 variabler.
Datasettet består av følgende variabler:
- Country: land
- Rank: numerisk verdi som rangerer landets akademiske rank ift andre land for et gitt år
- Region: hvilken region landet befinner seg i (verdensdel)
- Citations: hvor mange forskningsartikler fra det gitte landet har blitt sitert for et gitt år
- Citations_per_document: hvor mange siteringer per forskningsartikler for et land i et gitt år
- year: årstall
- Index: Dette er en variabel som måler en forskers “vitenskapelig publisering og innflytelse i faglitteraturen.” Tallet beregnes ut fra antall publiserte arbeider og det antall ganger hvert arbeid er sitert
Last in dataene ved hjelp av følgende url: https://raw.githubusercontent.com/louisabo/Data-For-Teaching/main/country_scientific_ranking.csv. Kall datasettet country_ranking. Husk at koden for å laste inn data er read.csv()
og denne koden tar en url i hermetegn som argument.
country_ranking <- read.csv("https://raw.githubusercontent.com/louisabo/Data-For-Teaching/main/country_scientific_ranking.csv")
Laste inn pakker
I de neste oppgavene skal vi bruke noen av funksjonene i pakken dplyr
. For å kunne bruke disse må vi først laste inn pakken fra biblioteket.
library()
for å laste inn pakken dplyr
.
library(dplyr)
Oversikt over data
Nå som vi har pakken vi trenger og datasettet er lastet inn kan vi begynne med å få litt oversikt over datasettet. Husk at datasettet heter country_ranking
. Vi kan begynne med koden head()
head()
til å få oversikt over de første radene i datasettet.
head(country_ranking)
Når du bruker head er det lett å se hva observasjonsenheten i datasettet er. I dette datasettet er det registrert data på akademisk ranking, publiserte artikler og siteringer på et land for hvert år fra 1996. Det vil si at en observasjonsenhet er et land i et år. Dette kaller man ofte for land-år-data.
Bruk kodensummary()
for å hente ut mer informasjon om variablene i datasettet country_ranking
.
summary(country_ranking)
Her ser du oversikt over høyeste og laveste verdi for hver variabel, gjennomsnitt, og median. Du får også oversikt over hvilken klasse alle variablene har. Merk at med funksjonen summary()
får du også oversikt over hva variablene heter. En annen funksjon som gir deg navnene på alle variablene i et datasett er names()
. names()
tar et datasett som sitt argument.
names()
for å få opp variabelnavnene i datasettet country_ranking.
names(country_ranking)
Nå som du har litt oversikt skal vi se videre på datasettet. Og bruke tid på hva hver enkel variabel består av.
Oversikt over variablenes klasser
Brukclass()
til å finne klassen til variabelen year
i datasettet country_ranking
.
class(country_ranking$year)
Integer er hele tall og er en kontinuerlig eller numerisk variabel.
Brukclass()
til å finne klassen til variabelen Country
i datasettet country_ranking
?
class(country_ranking$Country)
class()
til å finne klassen til variabelen Citations
i datasettet country_ranking
?
class(country_ranking$Citations)
Nå har vi sett litt på klassene til de ulike variablene også. Merk at klassen integer er numerisk, men består kun av heltall og ikke desimaltall. Klassen numeric i R består av desimaltall.
Husk at for å få oversikt over klassen på alle variabelene i et datasett så kan du bruke funksjonen str()
og summary()
. Vi skal se litt nærmere på noen av variablene i datasettet i neste seksjon.
Beskrivende statistikk
Før vi går videre så printer vi alle variabel-navnene igjen:
names(country_ranking)
## [1] "Country" "Rank" "Region"
## [4] "Citations" "Citations_per_document" "year"
## [7] "Index"
Vi kan bruke funksjonen table()
til å printe en tabell som viser oss fordelingen av observasjoner på hver kategori i variabelen.
table()
for å printe en oversikt over variabelen Country
i datasettet country_ranking
. Tabellen skal ikke inneholde missingverdier.
table(country_ranking$Country)
Her får du en lang liste med land og 24. Det betyr at hvert land er listet som en rad i datasettet 24 ganger. Hvorfor er de listet 24 ganger? Det gir kanskje mer mening når vi ser nærmere på variabelen year.
Bruk table()
for å printe en oversikt over variabelen year
i datasettet country_ranking
. Tabellen skal ikke inneholde missingverdier.
table(country_ranking$year)
Her ser du at vi får opp årstall og antall observasjoner i hvert år. Hver av disse observasjonene er land. I forrige tabell fikk vi opp 24 under hvert land. For å gjøre det enda mer tydelig:
Regn ut 2020-1996 i codechunken under.
2020-1996
Her får du opp 24. Nå er det kanskje mer tydelig hva et land-år er. Observasjonsenheten i dette datasettet er som sagt et land i et år. Vi har altså data for Norge i alle år fra 1996 til og med 2019, derfor når du printer en tabell med land så får du opp et land og 24. Noen land er ikke registrert i f.eks 1997, da vil disse landene bare være med i 23 år, som betyr at vi bare “observerer dem” 23 ganger i vårt datasett.
En annen nyttig funksjon er range()
. Denne viser spennet på en variabel. Hvis en variabel er numerisk og består av tall fra 0-1000 kan det være fint å vite at spennet er så stort.
Bruk range()
til å finne ut hva spennet til variabelen Citations
i datasettet country_ranking
er.
range(country_ranking$Citations)
Her ser du at minste antall siteringer for et land i et år er 0, mens maks er 5257180!
Bruk range()
til å finne ut hva spennet til variabelen Citations_per_document
i datasettet country_ranking
er.
range(country_ranking$Citations_per_document)
Her ser man at siteringer per dokument går fra 0 til 133.96.
La oss jobbe videre med å se på enda litt mer beskrivende statistikk.
Bruk mean()
til å finne gjennomsnittet til variabelen Citations
i datasettet country_ranking
.
mean(country_ranking$Citations)
Når du leser gjennomsnittet kan det være lurt å si hva det faktisk er til deg selv – hva det betyr substansielt. Her ser vi at gjennomsnittlig antall siteringer er 201.156. Det vil si at gjennomsnittlig antall siteringer for et land-år er 201.156 siteringer.
Bruk mean()
til å finne gjennomsnittet til variabelen Citations_per_document
i datasettet country_ranking
.
mean(country_ranking$Citations_per_document)
Igjen, det kan være lurt å formulere en setning om hva gjennomsnittet faktisk betyr. Her ser vi at gjennomsnittet av siteringer per dokument (eller forskningsartikkel om du vil) er ca. 18 siteringer for en land-år-observasjon.
I dette datasettet er det også en variabel som heter Index
. Dette er en variabel som måler en forskers “vitenskapelig publisering og innflytelse i faglitteraturen. Tallet beregnes ut fra antall publiserte arbeider og det antall ganger hvert arbeid er sitert.”
Bruk range()
til å finne spennet til variabelen Index
i datasettet country_ranking
.
range(country_ranking$Index)
Bruk mean()
til å finne gjennomsnittet til variabelen Index
i datasettet country_ranking
.
mean(country_ranking$Index)
Plotting – Univariat beskrivelse
Vi ønsker å få mer oversikt over hva dataene faktisk betyr. Vi vil sammenligne land med hverandre. Hvilke land er det som gjør det best akademisk? Og hvilke land har gjort det bra over tid? Nå skal du vise dette grafisk ved hjelp av funksjonen ggplot()
. Først må du laste inn pakken.
ggplot2
ved hjelp av library()
.
library(ggplot2)
Lag et barplot av variabelen Region
for å se hvordan land er fordelt i regioner i datasettet country_ranking
.
ggplot(country_ranking, aes(x = Region)) +
geom_bar()
Kanskje ikke den beste inndelingen av land? Uansett, ved hjelp av plotting er det lettere å se hvordan dataene ser ut. Her kan vi bruke geom_density()
, som viser fordelingen til en numerisk variabel.
Bruk geom_density()
for å se fordelingen av variabelen Index
i datasettet country_ranking
.
ggplot(country_ranking, aes(x = Index)) +
geom_density()
Bruk geom_boxplot()
til å få oversikt over variabelen Citations_per_document
i datasettet country_ranking
.
ggplot(country_ranking, aes(x = Citations_per_document)) +
geom_boxplot()
Den siste delen av dette oppgavesettet viser hvordan vi kan lage plots som ser bedre ut. Når vi jobber med ggplot()
legger vi til flere argumenter med +
og skrive flere argumenter. Akkurat som dette:
Her har jeg lagt på flere arugmenter for å vise hvordan vi kan ‘pimpe’ plottene våre. Hvis du vil f.eks endre hva det står på X-aksen (se plottet du lagde over, der står navnet på variabelen “Citations_per_document”, det er default) kan du bruke koden xlab()
eller y-aksen ylab()
. Når du skal skrive nytt navn må du bruke anførseslstegn som dette: xlab("Det som skal stå på x-aksen")
.
Hvis du ikke vil ha noen ting på f.eks y-aksen kan du la den stå tom ved å bruke koden ylab("")
. Dvs ved å ikke sette noe mellom anførselstegnene. Du kan også fjerne aksene ved hjelp av koden scale_y_discrete()
for y-aksen og scale_x_discrete()
for x-aksen.
ggplot(country_ranking, aes(x = Citations_per_document)) + # Her spesifiserer vi data og variabel
geom_boxplot() + # Her kommer geom-argumentet vårt
xlab("Siteringer per dokument") + # Endrer tittel på x-aksien)
ggtitle("Eksempel på plot med justeringer") + # Legger til tittel
scale_y_discrete() # Fjerner y-aksen
Merk det +
som skiller lagene fra hverandre når man bruker ggplot
.
Lag et boxplot av variabelen Citations_per_document
i datasettet country_ranking.
I plottet skal du først legge til en ny tittel på x-aksen som er “Citations per research article” før du fjerner y-aksen fra plottet.
ggplot(country_ranking, aes(x = Citations_per_document)) +
geom_boxplot() +
xlab("Citations per research article") +
scale_y_discrete()
# Husk at koden for å fjerne y-aksen er scale_y_discrete(). Legg på flere argumenter med +. Vær også oppmerksom på at når du endrer tittel må det stå i hermetegn.
Box-plottet viser fordelingen av variabelen siteringer per forskningsartikkel. Streken er medianen. Det laveste punktet på streken er den laveste verdien, mens den høyeste punktet på den streken til høyre er den høyeste verdien. Begynnelsen på boksen viser verdien for 25% av dataene, medianen deler altså dataene på to, mens den øverste delen av boksen er der hvor 75% av dataene lander.
For mer oversikt over hvordan du kan bygge fine grafer i R: https://datacarpentry.org/R-ecology-lesson/04-visualization-ggplot2.html#Plotting_with_ggplot2
Oppgavesett 2
I dette oppgavesettet skal vi jobbe med data fra Verdensbanken. Dataene ser på andelen av befolkningen i et land som lever under fattigdomsgrensen (povery head count ratio - PHR). Dataene er fra 2008. Vi skal se på et utvalg av asiatiske land. Nedenfor ser du en oversikt over de 9 ulike asiatiske landene og hvor stor andel av befolkningen som lever under fattigdomsgrensen. Datasettet heter PHR
og består av to variabler – land
og phr
. Datasettet ser slik ut:
Klasse
Brukclass()
til å finne målenivået til variabelen phr
(poverty head count ration/fattigdomsrate).
class(PHR$phr)
class()
til å finne målenivået til variabelen land
?
class(PHR$land)
Beskrivende statistikk
Brukmean()
til å finne den gjennomsnittlige fattigdomsraten.
mean(PHR$phr)
sd()
til å finne standardavviket til variabelen phr
.
sd(PHR$phr)
summary()
til å få oversikt over variablen phr
.
summary(PHR$phr)
Her ser du oversikt over hele variabelen phr. Som du ser er den laveste fattigdomsraten 0.35 % av befolkningen, mens det høyeste fattigdomsraten er 55.83 % av befolkningen.
Fremstilling av data
En fin måte å forstå data på er vise det grafisk. Bruk ggplot()
til å lage et histogram av variabelen phr. Vi skal plotte hvert land og deres respektive phr for å sammenligne dem. Under brukes koden geom_col()
. Denne koden gjør det mulig å spesifisere to variabler i plottet, en x-variabel og en y-variabel. Den første kodelinjen i ggplot()
tar to argumenter, 1) først spesifiserer du hvilket datasett du skal hente variablen(e) du ønsker å vise frem fra, i vårt tilfelle heter datasettet PHR. 2) aes()
som spør oss hvilke variabler vi ønsker å fremstille, vi kan spesifisere enten bare én x-variabel (dvs at vi bare fremstiller en variabel), eller så kan vi spesifisere én x-variabel og én y-variabel slik som i eksempelet nedenfor.
ggplot(PHR, aes(x=phr, y=land)) +
geom_col()
Legg til en ny tittel på y-aksen i plottet ovenfor. Y-aksen skal være titulert “Land”. Tips: kopier koden fra forrige svar og legg til tittel på y-aksen
ggplot(PHR, aes(x=phr, y=land)) +
geom_col()+
ylab("Land")
# Husk at bokstaver skal i hermetegn og at koden for å legge på tittel på y-aksen er ylab() og for x-aksen xlab().
ggplot(PHR, aes(x=phr, y=land)) +
geom_col()+
ylab("Land")+
xlab("Andel av befolkningen som lever under fattigdomsgrensen")
# Husk at bokstaver skal i hermetegn og at koden for å legge på tittel på y-aksen er ylab() og for x-aksen xlab().
ggtitle()
og tittelen må som ellers skrives i hermetegn.
ggplot(data= PHR, aes(x=phr, y=land)) +
geom_col()+
ylab("Land")+
xlab("Andel av befolkningen som lever under fattigdomsgrensen") +
ggtitle("Poverty headcount ratio")
# Husk at du legger til flere kodesnutter med + når du bruker ggplot.
I koden geom_col()
kan du legge til et argument som er color=""
og et som er fill=""
. Mellom hermetegnene kan du skrive en farge, f.eks “blue”, “red”, “green”, “yello”, “orange”, “purple”, “violet” osv. Med koden color=""
enderer du fargen rundt stolpene, mens med fill=""
endrer du fargen i stolpene.
color=""
og skriv inn fargen blue.
ggplot(data= PHR, aes(x=phr, y=land)) +
geom_col(color = "blue")+
ylab("Land")+
xlab("Andel av befolkningen som lever under fattigdomsgrensen") +
ggtitle("Poverty headcount ratio")
# Husk at argumentet skal legges til inni geom_col() siden det er det visuelle du endrer fargen på, i dette tilfellet stolpene.
fill=""
til å endre fargen også inni stolpene til blå
ggplot(data= PHR, aes(x=phr, y=land)) +
geom_col(color = "blue", fill = "blue")+
ylab("Land")+
xlab("Andel av befolkningen som lever under fattigdomsgrensen") +
ggtitle("Poverty headcount ratio")
Filtrering av data
Her skal vi bruke koden filter()
til å filtrere ut observasjoner med spesifikke verdier. For mer informasjon om hvordan du bruker koden gå tilbake til arbeidsbok 2.
Et eksempel er at vi spør R om å filtrer ut land med større filter(>)
phr enn f.eks 20. Det som er viktig å huske på her er at vi må passe på at variabelene vi filtrer på er numeriske dersom vi oppgir f.eks tallverdier.
Et eksempel på hvordan bruke filter er som følger:
filter(PHR, phr > 30)
R vil da vise de landene som har en PHR-verdi større enn 30. Koden følger argumentet data først som heter PHR og deretter variabelen vi ønsker å filtrere på. Vi kan også skrive koden på følgende måte:
PHR %>%
filter(phr > 30)
Begge kodene gjør akkurat det samme. Jeg anbefaler alle til å jobbe med den nederste måten hvor man bruker %>%
(eller en pipe som det heter). Koden gir en pipe inn i datasettet PHR og sier at inni dette datasettet så vil jeg filtrere ut alle verdier som har større verdier enn 30 på variabelen phr.
I resten av oppgavene du skal du filtrere ut observasjoner. Du får kun rett om du bruker %>%
og skriver koden med pipe.
phr
enn 10.
PHR %>%
filter(phr < 10)
phr
enn 10-
PHR %>%
filter(phr > 10)
phr
lik 50
PHR %>%
filter(phr >= 50)
phr
lik 50
PHR %>%
filter(phr <= 50)
Ofte når vi bruker filter()
vil vi telle observasjonene. I dette datasettet er det ikke så mange observasjoner. Men senere vil dere se datasett med mange mange fler observasjoner. I R kan du bygge opp kode på følgende måte vha av %>%
(eller piper).
PHR %>%
filter(phr <= 50) %>%
count()
Når vi bruker count()
etter filter vil R telle hvor mange observasjoner som blir filtrert ut på den variabelen du filtrer på. Dette skal vi se mer på i Oppgavesett 3 hvor vi skal filtrere, telle og plotte data.
Oppgavesett 3
En naturlig tanke er at yngre bruker mye mer internett enn eldre. Men stemmer det? Er det slik at personer som bruker mye tid på internett har mer eller mindre tillit til politikere? Hvordan henger tillit sammen med utdanning? Dette og mer skal du finne ut av gjennom å se nærmere på datasettet internett.
I denne arbeidsboken skal vi jobbe videre med regning og filtrering av data.
Innlasting av data
Det neste vi skal gjøre er å laste inn datasettet vi skal jobbe med i dag. Datasettet heter internett, og omhandler internettbruken til italienere. Det består av et utvalg variabler hentet fra European Social Survey, Round 9 (2018). Enhetene er italienske statsborgere, og samlet inneholder datasettet 2745 observasjoner og 5 variabler.
Vi skal undersøke sammenhengen mellom internettbruk, alder, kjønn, utdanning og tillit.
I dette datasettet måles:
internettbruk
på en skala fra 1-5 hvor fem er høyest og 1 er minstalder
i antall årkjonn
som dikotom (1 = menn, 2 = kvinner)utdanning
som antall år med fullført utdanningtillit
(til politikere) på en skala fra 0-10 hvor 10 er høy tillit og 0 er ingen tillit.
Oversikt over data
Bruknames()
til å se på variabel-navna i datasettet internett
.
names(internett)
summary()
til å hente ut mer informasjon om variablene i datasettet internett
.
summary(internett)
Vi er interessert i å bli bedre kjent med utvalget – altså respondentene i undersøkelsen. Husk at dette utvalget skal være representativt for den italienske befolkningen, det kan derfor være fint å begynne med å se på litt deskriptiv statistikk.
Gjennomsnitt
Brukmean()
til å finne gjennomsnittet til variabelen alder
i datasettet internett
.
mean(internett$alder)
mean()
til å finne gjennomsnittet til variabelen utdanning
i datasettet internett
.
mean(internett$utdanning)
mean()
til å finne gjennomsnittet til variabelen tillit
i datasettet internett
.
mean(internett$tillit)
mean()
til å finne gjennomsnittet til variabelen internettbruk
i datasettet internett
.
mean(internett$internettbruk)
Standardavvik
Standardavviket er det gjennomsnittlige avviket fra gjennomsnittet. Det høres mer komplisert ut enn det er. Poenget er at det gir en indikasjon av hver enkelt observasjons avvik fra gjennomsnittet.
Bruksd()
til å finne standardavviket til variabelen alder
i datasettet internett
.
sd(internett$alder)
sd()
til å finne standardavviket til variabelen utdanning
i datasettet internett
.
sd(internett$utdanning)
sd()
til å finne standardavviket til variabelen tillit
i datasettet internett
.
sd(internett$tillit)
sd()
til å finne standardavviket til variabelen internettbruk
i datasettet internett
.
sd(internett$internettbruk)
filter
og count
Vi skal se litt nærmere på noen av observasjonene i datasettet vårt internett
. I dette datsettet er det mange observasjoner. Noen ganger er vi interessert å se på data for enkeltgrupper i befolkningen. For eksempel så kan vi ønsker å undersøke dataen for kvinner, de over 80 år eller de under 45 år. Vi kan med andre ord være interessert i deler av utvalget vårt.
I R kan vi enkelt hente ut data for disse undergruppene. Det gjør viv et hjelp av filtrering. Funksjonen vi skal bruker heter filter()
og ligger i pakken dplyr
. Her skal du filtrere ut observasjoner basert på spesifikke verdier på variable. Hvis du er usikker på hvordan du gjør dette anbefaler vi deg å ta en titt på Oppgavesett 2
før du går videre. Eventuelt ta en titt i Andre arbeidsbok: Data i R.
Vi har installert dplyr
tidligere, men vi må laste den inn ved hjelp av library
før vi kan bruke funksjonen filter()
.
library()
for å laste inn pakken dplyr
fra biblioteket.
library(dplyr)
filter()
og %>%
til å hente ut data for alle kvinner i datasettet internett
. Husk at variabelen kjonn
inneholder informasjon om kjønn. Kvinner er kodet til 2 og menn er kodet som 1.
internett %>%
filter (kjonn == 2)
filter()
og %>%
til å hente ut data for alle menn i datasettet internett
.
internett %>%
filter (kjonn == 1)
Gjennom å legge til en til %>%
etterfulgt av koden count()
teller R hvor mange observasjoner i datasett ditt som oppfyller kriteriet du ønsker å filtere på. Dersom du for eksempel vil vite hvor mange som er menn i datasettet så kan du skrive:
internett %>%
filter (kjonn == 1) %>%
count()
%>%
, filter()
og count()
til å finne ut hvor mange av observasjonene i datasettet internett
som er over 80 år. Variabelen alder
inneholder informasjon om respondentenes alder.
internett %>%
filter (alder > 80) %>%
count()
%>%
, filter()
og count()
til å finne ut hvor mange av observasjonene i datasettet internett
som er under 20 år.
internett %>%
filter (alder < 20) %>%
count()
%>%
, filter()
og count()
til å finne ut hvor mange av observasjonene i datasettet internett
som svarer at de bruker veldig mye internett. Variabelen internettbruk
inneholder svarene på dette spørsmålet og verdien 5
betyr at respondentene har svart “veldig mye”.
internett %>%
filter (internettbruk == 5) %>%
count()
%>%
, filter()
og count()
til å finne ut hvor mange av observasjonene i datasettet internett
som svarer at de bruker veldig lite internett. Variabelen internettbruk
inneholder svarene på dette spørsmålet og verdien 1
betyr at respondentene har svart “veldig lite”.
internett %>%
filter (internettbruk == 1) %>%
count()
%>%
, filter()
og count()
til å finne ut hvor mange av observasjonene i datasettet internett
som svarer at de har ingen tillit til politikerne. Svarene på dette spørsmålet er lagret i variabelen tillit
og de som har svart “ingen tillit” har verdien 0.
internett %>%
filter (tillit == 0) %>%
count()
%>%
, filter()
og count()
til å finne ut hvor mange av observasjonene i datasettet internett
som svarer at de har veldig høy tillit til politikerne. Svarene på dette spørsmålet er lagret i variabelen tillit
og de som har svart “veldig høy tillit” har verdien 10.
internett %>%
filter (tillit == 10) %>%
count()
%>%
, filter()
og count()
til å finne ut hvor mange av observasjonene i datasettet internett
som har mer enn 20 år med utdanning. Variabelen som inneholder informasjon om utdanning heter utdanning
.
internett %>%
filter (utdanning > 20) %>%
count()
%>%
, filter()
og count()
til å finne ut hvor mange av observasjonene i datasettet internett
som ikke har noen utdanning (0 år). Variabelen som inneholder informasjon om utdanning heter utdanning
.
internett %>%
filter (utdanning == 0) %>%
count()