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.
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)
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.
head(data1)
Es ist ein Rohdatensatz.
nrow(data1)
## [1] 137959
ncol(data1)
## [1] 5
Der Datensatz besteht aus 137959 Zeilen und 5 Spalten.
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.
data11 <- separate(
data1,
col = 1,
into = c("freq", "indic_is", "ind_type", "unit", "geo"),
sep = ","
)
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
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" ...
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.
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.
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.
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.
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.