Digitale Kompetenzen in Europa

Der Datensatz “Niveau der digitale Kompetenzen von Einzelpersonen (2015-2019)” enthält Indikatoren zu digitalen Kompetenzen in europäischen Ländern. Er basiert auf dem Eurostat-Digital-Skills-Framework und beschreibt, wie gut verschiedene Bevölkerungsgruppen mit digitalen Technologien umgehen können.

Vorbereitung der Daten

Pakete installieren und laden

library(readxl)
library(readr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)

Datensatz einlesen

data1 <- read_tsv("/Users/keanakastner/Downloads/Digitale Kompetenz von Einzelpersonen.tsv")
## Rows: 137959 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (5): freq,indic_is,ind_type,unit,geo\TIME_PERIOD, 2015, 2016, 2017, 2019
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Erste Ansicht

head(data1)

Es ist ein Rohdatensatz.

Anzahl der Zeilen und Spalten

nrow(data1)
## [1] 137959
ncol(data1)
## [1] 5

Der Datensatz besteht aus 137959 Zeilen und 5 Spalten.

Namen der Variablen

names(data1)
## [1] "freq,indic_is,ind_type,unit,geo\\TIME_PERIOD"
## [2] "2015"                                        
## [3] "2016"                                        
## [4] "2017"                                        
## [5] "2019"

Die ursprüngliche erste Spalte enthält mehrere durch Komma getrennte Variablen, die mit separate() in strukturierte Variablen (freq, Indikator, Einheit, geo) zerlegt werden. Dies ist notwendig, da der Datensatz in einer semi-strukturierten Form vorliegt.

Erste Zeile in einzelne Variablen zerlegen

data11 <- separate(
  data1,
  col = 1,
  into = c("freq", "indic_is", "ind_type", "unit", "geo"),
  sep = ","
)

Neue Übersicht über die Daten

head(data11)
str(data11)
## tibble [137,959 × 9] (S3: tbl_df/tbl/data.frame)
##  $ freq    : chr [1:137959] "A" "A" "A" "A" ...
##  $ indic_is: chr [1:137959] "I_DSK_AB" "I_DSK_AB" "I_DSK_AB" "I_DSK_AB" ...
##  $ ind_type: chr [1:137959] "CB_EU_FOR" "CB_EU_FOR" "CB_EU_FOR" "CB_EU_FOR" ...
##  $ unit    : chr [1:137959] "PC_IND" "PC_IND" "PC_IND" "PC_IND" ...
##  $ geo     : chr [1:137959] "AL" "AT" "BA" "BE" ...
##  $ 2015    : chr [1:137959] ":" "34.92" ":" "30.13" ...
##  $ 2016    : chr [1:137959] ":" "33.72" ":" "36.05" ...
##  $ 2017    : chr [1:137959] ":" "44.83" ":" "32.70" ...
##  $ 2019    : chr [1:137959] ": u" "47.15" "9.05" "30.55" ...
glimpse(data11)
## Rows: 137,959
## Columns: 9
## $ freq     <chr> "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "…
## $ indic_is <chr> "I_DSK_AB", "I_DSK_AB", "I_DSK_AB", "I_DSK_AB", "I_DSK_AB", "…
## $ ind_type <chr> "CB_EU_FOR", "CB_EU_FOR", "CB_EU_FOR", "CB_EU_FOR", "CB_EU_FO…
## $ unit     <chr> "PC_IND", "PC_IND", "PC_IND", "PC_IND", "PC_IND", "PC_IND", "…
## $ geo      <chr> "AL", "AT", "BA", "BE", "BG", "CH", "CY", "CZ", "DE", "DK", "…
## $ `2015`   <chr> ":", "34.92", ":", "30.13", "13.55 u", ":", "19.09", "22.37",…
## $ `2016`   <chr> ":", "33.72", ":", "36.05", "9.13 u", ":", "22.20", "12.30", …
## $ `2017`   <chr> ":", "44.83", ":", "32.70", "30.08 u", "43.30 b", "17.03", "2…
## $ `2019`   <chr> ": u", "47.15", "9.05", "30.55", "23.84 u", "44.83 b", "22.31…

Alle Jahr-Spalten sind als (Text) gespeichert, nicht als numerisch. Das bedeutet der Datensatz muss bereinigt werden. Numerische Variablen aus Zeichenketten weden bereinigt (Entfernung von Sonderzeichen und nicht-numerischen Symbolen), um eine konsistente metrische Skala herzustellen.

year_cols <- c("2015", "2016", "2017", "2019")

data11_clean <- data11 |>
  mutate(across(all_of(year_cols), ~ {
    x <- gsub(",", "", .)          # Tausendertrennzeichen entfernen
    x <- gsub("[^0-9.-]", "", x)   # alles außer Zahl, Punkt, Minus entfernen
    na_if(x, "")                   # leere Strings → NA
  })) |>
  mutate(across(all_of(year_cols), as.numeric))

# Kontrolle
str(data11)
## tibble [137,959 × 9] (S3: tbl_df/tbl/data.frame)
##  $ freq    : chr [1:137959] "A" "A" "A" "A" ...
##  $ indic_is: chr [1:137959] "I_DSK_AB" "I_DSK_AB" "I_DSK_AB" "I_DSK_AB" ...
##  $ ind_type: chr [1:137959] "CB_EU_FOR" "CB_EU_FOR" "CB_EU_FOR" "CB_EU_FOR" ...
##  $ unit    : chr [1:137959] "PC_IND" "PC_IND" "PC_IND" "PC_IND" ...
##  $ geo     : chr [1:137959] "AL" "AT" "BA" "BE" ...
##  $ 2015    : chr [1:137959] ":" "34.92" ":" "30.13" ...
##  $ 2016    : chr [1:137959] ":" "33.72" ":" "36.05" ...
##  $ 2017    : chr [1:137959] ":" "44.83" ":" "32.70" ...
##  $ 2019    : chr [1:137959] ": u" "47.15" "9.05" "30.55" ...

Fehlenden Werte

sum(is.na(data11_clean))
## [1] 106097

Der Datensatz enthält einen sehr hohen Anteil fehlender Werte (NA). Dies deutet darauf hin, dass nicht alle Länder für alle Jahre bzw. Indikatoren vollständige Zeitreihen besitzen. Die Analyse ist dadurch potenziell verzerrt, da Mittelwerte nur auf Basis verfügbarer Beobachtungen berechnet werden.

Erste Deskriptive Statistiken

Mittelwert, SD, Min, Max für numerische Variablen

summary(data11_clean) # Überblick über die Variablen
##      freq             indic_is           ind_type             unit          
##  Length:137959      Length:137959      Length:137959      Length:137959     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      geo                 2015             2016             2017       
##  Length:137959      Min.   :  0.00   Min.   :  0.00   Min.   :  0.00  
##  Class :character   1st Qu.: 14.73   1st Qu.: 14.63   1st Qu.: 13.64  
##  Mode  :character   Median : 28.82   Median : 28.62   Median : 28.13  
##                     Mean   : 36.45   Mean   : 36.62   Mean   : 36.66  
##                     3rd Qu.: 57.92   3rd Qu.: 58.92   3rd Qu.: 59.97  
##                     Max.   :100.00   Max.   :100.00   Max.   :100.00  
##                     NA's   :37282    NA's   :37585    NA's   :20200   
##       2019       
##  Min.   :  0.00  
##  1st Qu.: 12.99  
##  Median : 27.68  
##  Mean   : 36.55  
##  3rd Qu.: 60.05  
##  Max.   :100.00  
##  NA's   :11030
table(data11_clean$geo)
## 
##        AL        AT        BA        BE        BG        CH        CY        CZ 
##      3103      3364      3132      3364      3364      3132      3364      3393 
##        DE        DK        EA        EE        EL        ES      EU15 EU27_2007 
##      3364      3306      3364      3364      3306      3393      3074      3074 
## EU27_2020      EU28        FI        FR        HR        HU        IE        IS 
##      3364      3364      3074      3074      3364      3364      3248      3364 
##        IT        LT        LU        LV        ME        MK        MT        NL 
##      3103      3364      3074      2929      2465      3146      2900      3364 
##        NO        PL        PT        RO        RS        SE        SI        SK 
##      3335      3364      3364      3342      3161      2958      3349      3422 
##        TR        UK        XK 
##      2407      2900      3335

Der durchschnittliche Wert des untersuchten Indikators (digitale Kompetenz) steigt nur minimal über die Jahre. Die „mittlere“ Beobachtung wird eher kleiner, obwohl der Durchschnitt leicht steigt. Das deutet auf einige höhere Werte bzw. Ausreißer nach oben hin. Die Verteilung wird breiter: manche Gruppen schneiden schlechter ab, andere besser. Es fehlen viele Werte. Mögliche Gründe dafür könnten sein, dass nicht alle Länder Daten für jedes Jahr haben bzw. nicht jeder Indikator überall erhoben wurde.

Visualisierung der Ergebnisse

Unterschiede zwischen den Jahren

years <- c("2015", "2016", "2017", "2019")

mean_values <- sapply(data11_clean[years], mean, na.rm = TRUE)

boxplot(data11_clean[years],
        main = "Verteilung pro Jahr",
        ylab = "Wert (0–100)",
        xlab = "Jahr")

Der Boxplot ermöglicht den Vergleich der Verteilungen zwischen den Jahren und zeigt stabile Medianwerte sowie konstante Streuung über die Zeit. Die Verteilung ist rechtsschief (Mittelwert > Median), was auf wenige sehr hohe Werte (bis 100) hinweist, die den Durchschnitt beeinflussen.

plot(as.numeric(years), mean_values, type = "b",
     xlab = "Jahr",
     ylab = "Durchschnitt",
     main = "Durchschnittlicher Wert über Zeit")

Der Linienplot basiert auf aggregierten Mittelwerten und ist sensitiv gegenüber Außreisern sowie fehlenden Werten. Er dient der Identifikation zeitlicher Trends im Gesamtdatensatz. In dieser Visualisierungen sind die Unterschiede besser ersichtlich als im Boxplot, dennoch liegen die Werte nah beieinander.

Limitationen

Einschränkend ist zu beachten, dass viele Werte fehlen und somit möglicherweise eine Verzerrung der Ergebnisse vorliegt. Zudem ist die eine deskriptive Analyse. Es werden keine kausalen Zusammenhänge untersucht.

Ergebnisse

Die Analyse der erhobenen Daten zu digitalen Kompetenzen zeigt über den untersuchten Zeitraum keinen deutlichen zeitlichen Trend. Die Verteilung der Werte bleibt insgesamt relativ stabil. Gleichzeitig weist die Verteilung eine Rechtsschiefe auf, da einige sehr hohe Werte den Durchschnitt nach oben beeinflussen. Darüber hinaus zeigen sich deutliche Unterschiede zwischen den Ländern. Während einige Länder konstant hohe Werte erreichen, weisen viele andere Länder deutlich niedrigere Ausprägungen digitaler Kompetenzen auf.