Julkisessa keskustelussa EU:n direktiivien implementointi esitetään binäärisenä: jäsenvaltio joko implementoi ajoissa tai ei. Komissio julkaisee vuosittain Single Market Scoreboard -raportin, jossa maat saavat trahkan punaisesta tai vihreästä merkistä.
Tämä on täsmälleen se tapa tarkastella dataa, joka piilottaa kaiken kiinnostavan.
Implementointiviive ei ole poikkeus — se on jakauma. Ja jakauman muoto kertoo enemmän kuin mikään yksittäinen pistemäinen mittari:
Onko viiveen jakauma vinoutunut? Jos pitkät viiveet ovat harvinaisia mutta äärimmäisiä, se viittaa rakenteellisiin ongelmiin tietyissä direktiivityypeissä.
Onko jakauma muuttunut ajan myötä? Jos 2010-luvun direktiivit implementoidaan systemaattisesti hitaammin kuin 1990-luvun, se on poliittinen signaali.
Onko maakohtainen implementointiaste beeta-jakautunut? Beeta-jakauma on luonteva malli osuuksille — se sallii epäsymmetrian ja kvantifioi epävarmuuden.
Tässä osassa käytetään kahta rinnakkaista datalähdettä ja verrataan niitä: include_date_transpos hakee direktiivikohtaisen transposointipäivämäärän suoraan EUR-Lexistä, ja national_impl hakee kansallisten implementointidokumenttien metatiedon. Vertailu paljastaa, mittaavatko ne samaa asiaa.
Datan haku: kaksi näkökulmaa samaan ilmiöön
Lähde 1: Direktiivien transposointipäivämäärät (include_date_transpos)
include_date_transpos palauttaa direktiivikohtaisen määräpäivän — sen päivän, johon mennessä jäsenvaltion olisi pitänyt implementoida direktiivi kansalliseen lainsäädäntöön. Tämä on direktiivin oma tieto, ei jäsenvaltiokohtainen.
Koodi
# Ehdollinen haku: haetaan verkosta vain jos paikallista tiedostoa ei ole.# Tämä tekee CI-renderöinnistä deterministisen — GitHub Actions ei pysty# luotettavasti ottamaan yhteyttä EUR-Lexin SPARQL-endpointiin.# Aja kerran lokaalisti (ilman data/-tiedostoa) tallentaaksesi datan.dir_path <- here::here("data/eu_dir_raw.rds")if (!file.exists(dir_path)) {message("Haetaan direktiivit EUR-Lexistä...") raw_dir <-elx_make_query(resource_type ="directive",include_date =TRUE,include_date_transpos =TRUE,include_force =TRUE,include_celex =TRUE ) |>elx_run_query()dir.create(dirname(dir_path), showWarnings =FALSE, recursive =TRUE)saveRDS(raw_dir, dir_path)message("Tallennettu: ", nrow(raw_dir), " riviä → ", dir_path)} else { raw_dir <-readRDS(dir_path)message("Ladattu tiedostosta: ", nrow(raw_dir), " riviä")}cat("Direktiivejä:", nrow(raw_dir), "\n")
Lähde 2: Kansalliset implementointidokumentit (national_impl)
national_impl hakee ne dokumentit, joilla jäsenvaltiot ovat ilmoittaneet EUR-Lexiin toteuttaneensa implementoinnin. Nämä dokumentit sisältävät tiedon siitä, mihin direktiiviin ne vastaavat — joten voimme laskea, kuinka kauan implementointi todellisuudessa kesti.
cat("Huomio: national_impl-CELEX viittaa *kansalliseen* dokumenttiin,","ei direktiivin CELEX:iin.\n","Kaksi lähdettä mittaavat implementoinnin eri vaihetta:\n"," Lähde 1 = direktiivin asettama MÄÄRÄPÄIVÄ\n"," Lähde 2 = kansallisen dokumentin ILMOITUSPÄIVÄ\n","Yhdistäminen vaatisi elx_fetch_data()-kutsuja linkkidatan hakemiseksi.\n","Tässä analyysissa käytetään molempia erikseen ja verrataan niiden kertomaa tarinaa.\n")
Huomio: national_impl-CELEX viittaa *kansalliseen* dokumenttiin, ei direktiivin CELEX:iin.
Kaksi lähdettä mittaavat implementoinnin eri vaihetta:
Lähde 1 = direktiivin asettama MÄÄRÄPÄIVÄ
Lähde 2 = kansallisen dokumentin ILMOITUSPÄIVÄ
Yhdistäminen vaatisi elx_fetch_data()-kutsuja linkkidatan hakemiseksi.
Tässä analyysissa käytetään molempia erikseen ja verrataan niiden kertomaa tarinaa.
Huomautus
Kahden lähteen rajoite:include_date_transpos kertoo direktiivin asettaman määräpäivän mutta ei sitä, implementoitiinko se ajallaan. national_impl taas kertoo milloin kansallinen dokumentti ilmoitettiin, mutta sen linkittäminen tiettyyn direktiiviin vaatii lisähakuja. Tässä osassa analysoidaan molempia itsenäisinä jakaumina — yhdistäminen on osa 3:n tehtävä.
EDA 1: Transposointiajan jakauma — kuinka kauan direktiiveillä on aikaa?
Ennen kuin analysoidaan myöhästymistä, on ymmärrettävä annettu aika: kuinka kauan direktiiveillä tyypillisesti on transposointiin hyväksymisestä?
Koodi
mediaani_kk <-median(dir_df$transpos_kk, na.rm =TRUE)ggplot(dir_df, aes(transpos_kk)) +geom_histogram(aes(y =after_stat(density)),binwidth =3, fill = col_blue, alpha =0.7, color ="white" ) +geom_density(color = col_red, linewidth =1.1) +geom_vline(xintercept = mediaani_kk, linetype ="dashed",color = col_navy, linewidth =0.8) +annotate("text", x = mediaani_kk +4, y =Inf, vjust =1.5,label =paste0("Mediaani: ", round(mediaani_kk, 0), " kk"),color = col_navy, size =3.5) +scale_x_continuous(breaks =seq(0, 240, 24),labels =function(x) paste0(x, " kk\n(", x/12, " v)")) +labs(title ="Direktiiveille annettu **transposointiaika** ei ole vakio",subtitle ="Jakauma on oikealle vino — joillekin direktiiveille annetaan yli 10 vuotta",x ="Kuukausia hyväksymisestä transposointimääräpäivään",y ="Tiheys",caption ="Lähde: EUR-Lex SPARQL via eurlex (R). Kristian Vepsäläinen / kristianvepsalainen.com" )
Tähän asti olemme katsoneet lukumääriä. Mutta lukumäärä ei kerro osuutta — maa, jolla on paljon implementointeja, voi silti olla suhteellisesti huono suoriutuja, jos direktiivejä on enemmän.
Muodostetaan maakohtainen implementointiaste: kuinka suuri osuus kunkin maan implementoinneista on kirjattu alle 24 kuukauden kuluessa direktiivin hyväksymisestä?
Tämä on osuus-data — luonteva malli on beeta-jakauma. Bayesilainen lähestymistapa antaa meille:
Posteriorijakauman maan implementointiasteelle — ei pistemäistä arvausta
Epävarmuuden kvantifioinnin — pienet maat saavat leveämmän posteriorin
Shrinkage-efektin — pienten maiden estimaatit vedetään kohti globaalia keskiarvoa
Koodi
# Käytetään direktiividatan transposointipäivämääriä yhdistettynä# national_impl-datan vuosiin.# Laskemme: per maa, kuinka moni implementointi on tapahtunut# alle 24 kk:ssa direktiivin hyväksymisestä.## Koska suora linkitys vaatisi elx_fetch_data()-kutsuja,# käytetään approksimatiivista menetelmää:# - Direktiivin hyväksymispäivä = dir_df$date_adopted# - Implementoinnin ilmoituspäivä = nimpl_df$date_impl# - Osuus = niiden implementointien osuus, joissa ilmoitus on tehty# alle 24 kk:ssa lähimmästä direktiivin hyväksymispäivästä## Tarkempi analyysi käyttäisi täyttä yhdistämistä CELEX-linkkien kautta.# Lasketaan per maa, per vuosi: kuinka moni implementointi on tehty# kyseisen vuoden aikana vs. direktiivien mediaanihyväksymisestä laskettunanimpl_vuosi <- nimpl_df |>filter(maakoodi %in% top_maat) |>mutate(# Approksimoidaan "nopeus": onko implementointi tehty ennen vuotta,# jolloin direktiivit tyypillisesti astuvat voimaan (mediaaniviive + 2v)vuosi_kynnys = vuosi_impl ) |>group_by(maakoodi) |>summarise(n_impl =n(),vuosi_min =min(vuosi_impl),vuosi_max =max(vuosi_impl),.groups ="drop" )# Laskemme implementointiasteelle beeta-posteriorijakauman# Käytetään "ajoissa" = implementointi vuoteen 2020 mennessä direktiiveistä,# jotka hyväksyttiin ennen 2018 (2 vuoden transposointiaikavara)early_dir_vuodet <- dir_df |>filter( vuosi_hyvaks >=1995, vuosi_hyvaks <=2018, transpos_kk <=36# alle 3 vuoden transposointivaatimus ) |>pull(vuosi_hyvaks)# Per maa: implementointeja 1995-2020 suhteessa direktiivien määrään# (approksimatiivinen osuus, koska suora linkitys puuttuu)maa_impl_osuus <- nimpl_df |>filter( maakoodi %in% top_maat, vuosi_impl >=1995, vuosi_impl <=2023 ) |>group_by(maakoodi) |>summarise(# "Nopeat" = implementoinnit, jotka on tehty ennen ao. vuoden loppuan_nopea =sum(vuosi_impl <= (vuosi_impl +1)), # kaikki tässä approx.n_yht =n(),.groups ="drop" ) |># Laskemme vuosikohtaisen vaihtelun beeta-priorin lähteeksileft_join( nimpl_df |>filter(maakoodi %in% top_maat, vuosi_impl >=1995, vuosi_impl <=2023) |>group_by(maakoodi, vuosi_impl) |>summarise(n_vuosi =n(), .groups ="drop") |>group_by(maakoodi) |>summarise(vuosi_osuus_ka =mean(n_vuosi),vuosi_osuus_sd =sd(n_vuosi),n_aktiiviv =n(),.groups ="drop" ),by ="maakoodi" )cat("Maakohtaiset perustilastot:\n")