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. Außerdem werden numerische Variablen aus Zeichenketten 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_clean)
## 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    : num [1:137959] NA 34.9 NA 30.1 13.6 ...
##  $ 2016    : num [1:137959] NA 33.72 NA 36.05 9.13 ...
##  $ 2017    : num [1:137959] NA 44.8 NA 32.7 30.1 ...
##  $ 2019    : num [1:137959] NA 47.15 9.05 30.55 23.84 ...

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
sort(table(data11_clean$geo), decreasing = TRUE)
## 
##        SK        CZ        ES        AT        BE        BG        CY        DE 
##      3422      3393      3393      3364      3364      3364      3364      3364 
##        EA        EE EU27_2020      EU28        HR        HU        IS        LT 
##      3364      3364      3364      3364      3364      3364      3364      3364 
##        NL        PL        PT        SI        RO        NO        XK        DK 
##      3364      3364      3364      3349      3342      3335      3335      3306 
##        EL        IE        RS        MK        BA        CH        AL        IT 
##      3306      3248      3161      3146      3132      3132      3103      3103 
##      EU15 EU27_2007        FI        FR        LU        SE        LV        MT 
##      3074      3074      3074      3074      3074      2958      2929      2900 
##        UK        ME        TR 
##      2900      2465      2407

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. Dabei gilt zu beachten, dass viele Werte fehlen. Einige Länder haben deutlich vollständigere Daten als andere, wodurch die Panelstruktur unbalanciert ist und Vergleiche vorsichtig interpretiert werden müssen. 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 die 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.

Vergleich der Länder in 2019

Top Ten

country_means_2019 <- data11_clean %>%
  filter(!geo %in% c("EA", "EU15", "EU27_2007", "EU27_2020", "EU28")) %>%
  group_by(geo) %>%
  summarise(mean_2019 = mean(`2019`, na.rm = TRUE)) %>%
  arrange(desc(mean_2019))

barplot(
  country_means_2019$mean_2019[1:10],
  names.arg = country_means_2019$geo[1:10],
  main = "Die höchsten durchschnittlichen Werte 2019",
  xlab = "Land",
  ylab = "Durchschnitt 2019",
  las = 2
)

Im Jahr 2019 schneiden skandinavische Länder wie Island und Norwegen bei der Erhebung der digitalen Kompetenzen am besten ab und erreichen die höchsten Durchschnittswerte.

Niedrigsten 10

barplot(
  tail(country_means_2019$mean_2019, 10),
  names.arg = tail(country_means_2019$geo, 10),
  main = "Die niedrigsten durchschnittlichen Werte 2019",
  xlab = "Land",
  ylab = "Durchschnitt 2019",
  las = 2
)

Die niedrigsten Durchschnittswerte weisen dagegen Länder wie Polen, Lettland, Zypern und Italien auf.

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.