External independent tests report 2016-2025
Image source: uatv.ua
Background
The aim of this study was to analyze the performance of Ukrainian school graduates in the External Independent Tests (EIT/NMT) from 2016 to 2025, and to provide insights into the factors that may affect their results. To achieve this goal, data was collected from the Ukrainian Center for Educational Quality Assessment (UCEQA) website and meticulously cleaned. Moreover, information about the administrative-territorial structure was added to ensure that the analysis takes into account regional differences. The quality of the source data was also verified to ensure its reliability.
The report provides comprehensive and detailed analyses of the data, including graphs and charts depicting participant performance metrics, distribution by various criteria, and geospatial metrics. These analyses aim to shed light on the strengths and weaknesses of the current EIT system, highlight areas for improvement, and provide recommendations for policymakers and educators.
Overall, this study serves as a valuable resource for anyone interested in understanding the EIT results, as well as for those seeking to improve the educational system in the country.
Load R libraries
Loading R libraries
libs <- c("ggbump", "ggraph", "rworldmap", "tidyverse", "data.table", "ggplot2", "googledrive", "sf", "plotly", "leaflet", "htmlwidgets", "IRdisplay", "stringi", "igraph", "ggraph", "ggrepel", "htmlwidgets", "rmarkdown", "webshot"
)
# Install the missing packages
installed_libs <- libs %in% rownames(installed.packages())
if (any(installed_libs == FALSE)) {
install.packages(libs[!installed_libs])
}
invisible(lapply(libs, library, character.only = TRUE))Connect to Google Drive and download file with raw data.
# Retrieve the path to the Google service account JSON file from environment variables
google_json <- Sys.getenv("GOOGLE_JSON")
# Authenticate with Google Drive using the service account JSON file
googledrive::drive_auth(path = google_json)source_file_name <- "ZNO_2016+_raw_data.csv"
zno_file <- googledrive::drive_get(source_file_name)
googledrive::drive_download(as_id(zno_file$id),
path = "data/raw_file.csv",
overwrite = TRUE)Read data from CSV file
zno_raw <- fread("data/raw_file.csv", quote = "",
na.strings = "", dec = ".", encoding = "UTF-8")Read geojson data of Ukrainian administrative entities. Source: Minregion
# Define the names of the geojson files for oblast, rayon, and hromad
oblast_file_name <- "oblast.geojson"
rayon_file_name <- "rayon.geojson"
hromad_file_name <- "terhromad_1.geojson"
# Retrieve the file metadata from Google Drive for each geojson file
oblast_file <- googledrive::drive_get(oblast_file_name)
rayon_file <- googledrive::drive_get(rayon_file_name)
hromad_file <- googledrive::drive_get(hromad_file_name)
# Download the oblast geojson file from Google Drive and save it locally
googledrive::drive_download(as_id(oblast_file$id),
path = "data/oblast.geojson",
overwrite = TRUE)
# Download the rayon geojson file from Google Drive and save it locally
googledrive::drive_download(as_id(rayon_file$id),
path = "data/rayon.geojson",
overwrite = TRUE)
# Download the hromad geojson file from Google Drive and save it locally
googledrive::drive_download(as_id(hromad_file$id),
path = "data/terhromad_1.geojson",
overwrite = TRUE)# Read the oblast geojson file into an sf object
oblasts <- sf::st_read(
"data/oblast.geojson", stringsAsFactors = FALSE
)
# Read the rayon geojson file into an sf object and replace single quotes with right single quotation marks in the ADMIN_2 column
rayons <- sf::st_read(
"data/rayon.geojson", stringsAsFactors = FALSE
) %>%
mutate(
across(
ADMIN_2,
~ stri_replace_all_regex(., "\\'", "’", vectorise_all = FALSE)
)
)
# Read the hromad geojson file into an sf object
# Replace single quotes with right single quotation marks in the ADMIN_1, ADMIN_2, and ADMIN_3 columns
# Remove the phrase "територіальна громада" from the TYPE column and trim any leading or trailing whitespace
hromadas <- sf::st_read(
"data/terhromad_1.geojson", stringsAsFactors = FALSE
) %>%
mutate(
across(
c(ADMIN_1, ADMIN_2, ADMIN_3),
~ stri_replace_all_regex(., "\\'", "’", vectorise_all = FALSE)
),
across(
TYPE,
~ stri_replace_all_regex(
., "територіальна громада", "", vectorise_all = FALSE
)
),
across(TYPE, ~ trimws(.))
)