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_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 ...
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
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.
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.
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.