Find guldet

Eller pyrit

Housekeeping

Gå til denne side i din browser: https://kubdatalab.github.io/DM-arrangement

Følg med ved at bruge piletasterne.

Stil endelig spørgsmål!

KUB Datalab

Hvem er vi?

Service på Københavns Universitetsbibliotek (som er en del af Det Kgl. Bibliotek).

Vi hjælper studerende - og deres undervisere og undertiden forskere - med at arbejde med data.

Kurser, åbne konsultationer, “indlejrede” kurser.

Bred portefølje: R, Python, Excel, Voyant, NVivo, SQL, OpenRefine, Orange, VOSViewer

Os tre, og en god håndfuld hangarounds blandt kollegerne

Find os på vores hjemmeside

Hvad er R?

R er et generelt, scriptet, programmeringssprog der er særligt udviklet til statistisk dataanalyse.

Det er relativt let at gå fra nybegynder til at få lavet en visualisering.

Let som i: En kategori 2 stigning i Tour de France er let sammenlignet med en kategori 1 stigning…

Hvad gør det let?

Det er open-source.

Så rare mennesker skriver funktioner der gør ting.

Og deler dem i såkaldte “pakker”

Det kommer vi til at bruge!

Jamen jeg har ikke R installeret på min computer!

No worries. De her slides kommer med R indbygget.

Klik på det lille “>_” ikon i nederste venstre hjørne.

Det er en ret primitiv udgave af R - så der er ting vi gerne ville gøre, som vi ikke kan gøre. Men vi kan lave fine ting alligevel.

Hvad vil vi vise?

Vi vil hente noget data fra Danmarks Statistik.

Og så vil vi gøre ting med det

Målet

       BOPOMR                                         HFUDD  TID INDHOLD
1 hele landet                                H10 Grundskole 2024  938039
2 hele landet                    H20 Gymnasiale uddannelser 2024  463884
3 hele landet               H30 Erhvervsfaglige uddannelser 2024 1120906
4 hele landet       H40 Korte videregående uddannelser, KVU 2024  222851
5 hele landet H50 Mellemlange videregående uddannelser, MVU 2024  649128
6 hele landet                 H60 Bacheloruddannelser, BACH 2024  142432

Trin for trin

  • Definer hvilke data vi skal have.
  • Vi har snydt lidt og forberedt os.
  • Befolkningens højst fuldførte uddannelse (15-69 år) efter bopælsområde, herkomst, højest fuldføte uddannelse, alder og køn.
  • Blandt venner HFUDD11
  • Datavejviser
  • Hov! Man skal logge på!
  • Dann haben wir anderen Methoden…

En smutvej

  • Egentlig ville vi gerne vise et avanceret POST kald op mod Danmarks Statistiks API, med komplekse datastrukturer og avancerede udvælgelseskriterier.
  • Men det kan vores hjemmeside ikke.
  • Og det er måske også lidt avanceret for absolutte nybegyndere…
  • De har en såkaldt “konsol”, som man kan bruge til at konstruere og teste den slags.

Den besøger vi!

Konsollen er her

Det her kalder API’et og giver os vores ønskede data:

data_url <- "https://api.statbank.dk/v1/data/HFUDD11/CSV?BOPOMR=*&HFUDD=H10%2CH20%2CH30%2CH40%2CH50%2CH60%2CH70%2CH80%2CH90&Tid=2024"

Hent data

Vi så hvordan vi kunne gemme oplysninger i “objekter” i R.

Vi kan også gemme mere komplekse data i R.

library(readr)
data <- read_csv2(data_url)

Manipuler data

  • Og så skal vi have taget stilling til hvad vi faktisk vil have på det kort!

  • Vi kunne godt tænke os at se hvor stor en andel af befolkningen i hver kommune, der har grundskolen som den højest gennemførte uddannelse.

  • Husk - vi har borgere ned til 15 år, så vi ser både tal der afspejler lavt uddannelsesniveau. Men også hvor ung befolkningen er. Det er ikke et udtryk for lavt uddannelsesniveau, at en 15-årig ikke har en lang videregående uddannelse endnu.

Inspicer data

head(data)
data |> summary()

Så vi har et antal borgere med forskelligt niveau af uddannelse. Men ikke en andel. Hvordan får vi det?

Grupper og opsummer data

Vi starter med at finde ud af hvor mange der bor i hvert bopælsområde:

library(tidyverse)
data <- data |> 
  group_by(BOPOMR) |> 
  mutate(totbefolk = sum(INDHOLD)) |> 
  ungroup()

Beregn andel

data <- data |> 
  mutate(andel = INDHOLD/totbefolk)

Udvælg det vi var interesserede i

Vi var særligt interesserede i hvor stor en andel af befolkningen, der har grundskolen som højste uddannelse.

data |> 
filter(HFUDD == "H10 Grundskole")

Lidt om plotDK - choropleth

Vi vil gerne have lavet et kort. Og vi vil gerne farvelægge kommunerne på kortet.

Rare mennesker har lavet en pakke der kan hjælpe med det. Den er ret hjælpsom

plotDK

Hvordan bruger man det?

Indbygget hjælpefunktion

?plotDK

Som ser en del bedre ud i RStudio eller Positron.

Læg mærke til at plotDK antager at alle kommunenavne er med småt!

Andele på kort

data |> 
filter(HFUDD == "H10 Grundskole") |> 
plotDK(id = "BOPOMR", value = "andel")

Trælse farver…

Dem kan vi da ændre!

data |> 
 filter(HFUDD == "H10 Grundskole") |> 
  plotDK(id = "BOPOMR", value = "andel")  +
  scale_fill_gradient(low = "blue",
                      high = "red") 

Hvordan gør jeg det derhjemme?

Gør dig selv en tjeneste - download og installer R (først) og (dernæst) Positron

Der er begrænsninger i denne side som bliver trælse på sigt.

Det samlede script - det vi lavede

data_url <- "https://api.statbank.dk/v1/data/HFUDD11/CSV?BOPOMR=*&HFUDD=H10%2CH20%2CH30%2CH40%2CH50%2CH60%2CH70%2CH80%2CH90&Tid=2024"
library(readr)
data <- read_csv2(data_url)

head(data)
data |> summary()

library(dplyr)
data <- data |> 
  group_by(BOPOMR) |> 
  mutate(totbefolk = sum(INDHOLD)) |> 
  ungroup()

data <- data |> 
  mutate(andel = INDHOLD/totbefolk)

data |> 
filter(HFUDD == "H10 Grundskole")

library(plotDK)


data <- data |>mutate(BOPOMR = tolower(BOPOMR))

data |> 
filter(HFUDD == "H10 Grundskole") |> 
plotDK(id = "BOPOMR", value = "andel")

data |> 
 filter(HFUDD == "H10 Grundskole") |> 
  plotDK(id = "BOPOMR", value = "andel")  +
  scale_fill_gradient(low = "blue",
                      high = "red") 

Det samlede script - det vi gerne ville have lavet

library(httr2)
library(tidyverse)
library(plotDK)
endpoint <- "http://api.statbank.dk/v1/data"

variables <- list(list(code = "BOPOMR", values = I("*")),
                  list(code = "HFUDD", values = c("H10", "H20", "H30", "H40", "H50", "H60", "H70", "H80", "H90")),
                  list(code = "Tid", values = I(2024))
              )

our_body <- list(table = "HFUDD11", lang = "da", format = "CSV", variables = variables)

resp <- request(endpoint) |>
  req_body_json(our_body) |>
  req_perform()

csv_text <- resp_body_string(resp)


df <- read.csv2(text = csv_text)
df <- df |>mutate(BOPOMR = tolower(BOPOMR))

df |> 
  group_by(BOPOMR) |> 
  mutate(totbefolk = sum(INDHOLD)) |> 
  mutate(andel = INDHOLD/totbefolk) |> 
  filter(HFUDD == "H10 Grundskole") |> 
  plotDK(id = "BOPOMR", value = "andel", interactive = TRUE) 


Lidt ekstra

Søjlediagrammer

data |> 
  filter(BOPOMR %in% c("københavn", "tårnby")) |> 
  ggplot(aes(x = BOPOMR, y = andel, fill = HFUDD)) +
  geom_col(position = "dodge")