Calcola, per ciascun CCNL (ed eventualmente per gruppo e periodo), le
misure di rilevanza richieste, la quota sul totale, il rank e la quota
cumulata lungo il rank. Non viene costruito alcun indice composito: ogni
misura produce il proprio ordinamento e la selezione dei CCNL rilevanti
avviene a valle con select_ccnl_rilevanti().
Usage
rank_ccnl(
dt,
measures = c("n_lavoratori", "giornate"),
by = NULL,
periodo = NULL,
ccnl_labels = NULL
)Arguments
- dt
Un
data.tabledi rapporti già passato daprepare_rapporti(), con almeno le colonneccnl_keyegiornate; vedi i Dettagli per le colonne richieste da ciascuna misura.- measures
Vettore character con le misure da calcolare, fra
"n_rapporti","n_lavoratori","n_datori","giornate","giornate_effettive","stock". La prima misura determina l'ordinamento delle righe in uscita.- by
Vettore character con colonne aggiuntive di raggruppamento (es.
"macro_tipologia","sesso");NULLper il solo CCNL.- periodo
Colonna temporale (
"anno"o"trimestre", prodotte daprepare_rapporti()) per un ranking per coorte di avviamento;NULLper l'intera finestra. Viene accodata alle colonne diby.- ccnl_labels
data.tableopzionale con la colonnaccnl_keye colonne di etichetta (es.ccnl_titolo,macro_settore_cnel) da agganciare al risultato con un left join; le chiavi devono essere univoche.
Value
Un data.table con una riga per (by, periodo, ccnl_key),
ordinato per gruppo e per rank_ della prima misura, con la riga dei
non classificati in coda a ogni gruppo. Colonne: quelle di by e
periodo, ccnl_key, classe ("CCNL" o "Non classificati"), le
eventuali etichette di ccnl_labels e, per ciascuna misura m, m,
quota_m, rank_m (integer, NA per i non classificati) e
quota_cum_m. L'attributo ccnlcob_ranking conserva measures, by
e periodo. L'input non viene modificato.
Details
Le misure sono definite sulle righe di dt così:
n_rapporti: numero di rapporti conavviato == TRUE(avviamento nella finestra di analisi);n_lavoratori: numero dicfdistinti fra i rapporti avviati;n_datori: numero didatoredistinti fra i rapporti avviati;giornate: somma digiornate(giorni-contratto nella finestra);giornate_effettive: somma digiornate_effettive(giorni-persona allocati pro quota, vedicompute_giornate_effettive());stock: numero di rapporti conattivo == TRUE, cioè aperti alla dataas_offissata inprepare_rapporti()(fine originale mancante, sentinella o successiva adas_of); coincide conn_attividicnelR.
Se avviato o attivo mancano vengono considerati TRUE per tutte le
righe, con un messaggio; un valore NA equivale a FALSE. Le colonne
datore e giornate_effettive sono richieste solo dalle misure che le
usano.
I rapporti con ccnl_key mancante formano la classe esplicita
"Non classificati" e non vengono scartati: la quota quota_m di ogni
riga è calcolata sul totale del gruppo inclusa questa classe, così
che le quote sommino a 1 entro ogni combinazione di by e periodo. Il
rank rank_m è assegnato solo ai CCNL classificati, in ordine
decrescente della misura, con i pari merito che ricevono il rank minimo
comune; la quota cumulata quota_cum_m segue l'ordine del rank (a parità
di valore, l'ordine alfabetico di ccnl_key) ed è NA per la classe non
classificata. Se il totale del gruppo è zero le quote sono NA.
See also
select_ccnl_rilevanti() per la selezione dei CCNL rilevanti.
Other ranking:
select_ccnl_rilevanti()
Examples
# Tabella preparata a mano da cob_esempio (in uso reale: prepare_rapporti())
dt <- data.table::copy(cob_esempio)[
fine >= inizio & fine <= as.Date("2024-12-31")
]
# attivo: rapporto aperto ad as_of; nel dataset di esempio la fine non
# osservata e' stata chiusa a monte alla data di stabilizzazione
# (troncata = 1)
dt[, `:=`(
ccnl_key = codice_cnel,
giornate = as.integer(fine - inizio + 1L),
avviato = TRUE,
attivo = troncata == 1L,
anno = data.table::year(inizio)
)]
#> id cf inizio fine codice_cnel ccnl
#> <int> <char> <Date> <Date> <char> <char>
#> 1: 1 CF00001 2024-08-18 2024-12-09 Q011 2875
#> 2: 2 CF00002 2024-02-05 2024-04-28 D011 0752
#> 3: 3 CF00003 2020-01-12 2020-04-12 E011 1729
#> 4: 4 CF00004 2020-04-20 2021-07-15 B011 1489
#> 5: 5 CF00005 2019-08-08 2019-09-19 S011 1204
#> ---
#> 4839: 4996 CF00363 2024-03-05 2024-04-25 H011 2614
#> 4840: 4997 CF00098 2022-03-19 2022-10-01 L011 1048
#> 4841: 4998 CF00340 2024-07-24 2024-12-31 G011 1883
#> 4842: 4999 CF00270 2023-10-05 2023-11-14 A011 2638
#> 4843: 5000 CF00098 2023-09-23 2024-12-31 H011 2614
#> cod_tipologia_contrattuale prior comune_sede_lavoro comune_lavoratore
#> <char> <int> <char> <char>
#> 1: A.06.01 0 L682 F205
#> 2: A.05.02 0 C933 A794
#> 3: A.02.00 1 B157 F704
#> 4: A.06.01 1 E507 F205
#> 5: A.01.00 1 B157 B157
#> ---
#> 4839: C.01.00 0 F205 C933
#> 4840: A.02.00 1 B157 E507
#> 4841: A.06.01 1 F205 G388
#> 4842: A.02.00 1 A794 F205
#> 4843: A.01.00 1 L682 E507
#> datore retribuzione ore troncata qualifica ateco_gruppo eta sesso
#> <char> <num> <num> <int> <char> <char> <int> <char>
#> 1: DAT00517 NA 17 0 253 41.2 40 F
#> 2: DAT00164 8645 20 0 541 10.7 47 F
#> 3: DAT00478 NA 38 0 712 43.3 49 M
#> 4: DAT00564 10776 36 0 813 81.2 27 F
#> 5: DAT00231 NA 40 0 813 85.5 27 M
#> ---
#> 4839: DAT00478 14161 28 0 132 43.3 47 M
#> 4840: DAT00427 54213 40 0 332 56.3 54 M
#> 4841: DAT00250 20852 40 1 341 25.6 40 F
#> 4842: DAT00458 18541 40 0 712 69.2 25 F
#> 4843: DAT00028 NA 40 1 332 87.3 55 M
#> ccnl_key giornate avviato attivo anno
#> <char> <int> <lgcl> <lgcl> <int>
#> 1: Q011 114 TRUE FALSE 2024
#> 2: D011 84 TRUE FALSE 2024
#> 3: E011 92 TRUE FALSE 2020
#> 4: B011 452 TRUE FALSE 2020
#> 5: S011 43 TRUE FALSE 2019
#> ---
#> 4839: H011 52 TRUE FALSE 2024
#> 4840: L011 197 TRUE FALSE 2022
#> 4841: G011 161 TRUE TRUE 2024
#> 4842: A011 41 TRUE FALSE 2023
#> 4843: H011 466 TRUE TRUE 2023
ranking <- rank_ccnl(dt, measures = c("n_lavoratori", "giornate"))
head(ranking)
#> ccnl_key classe n_lavoratori quota_n_lavoratori rank_n_lavoratori
#> <char> <char> <int> <num> <int>
#> 1: A011 CCNL 311 0.10966150 1
#> 2: H011 CCNL 248 0.08744711 2
#> 3: T011 CCNL 198 0.06981664 3
#> 4: C011 CCNL 169 0.05959097 4
#> 5: IC91 CCNL 151 0.05324401 5
#> 6: A012 CCNL 126 0.04442877 6
#> quota_cum_n_lavoratori giornate quota_giornate rank_giornate
#> <num> <num> <num> <int>
#> 1: 0.1096615 185093 0.19915257 1
#> 2: 0.1971086 87403 0.09404209 2
#> 3: 0.2669252 74687 0.08036019 3
#> 4: 0.3265162 41122 0.04424561 5
#> 5: 0.3797602 51889 0.05583046 4
#> 6: 0.4241890 33417 0.03595534 6
#> quota_cum_giornate
#> <num>
#> 1: 0.1991526
#> 2: 0.2931947
#> 3: 0.3735549
#> 4: 0.4736309
#> 5: 0.4293853
#> 6: 0.5095863
# Ranking per coorte annuale di avviamento
per_anno <- rank_ccnl(dt, measures = "giornate", periodo = "anno")
per_anno[anno == 2024L & rank_giornate <= 3L]
#> anno ccnl_key classe giornate quota_giornate rank_giornate
#> <int> <char> <char> <num> <num> <int>
#> 1: 2024 A011 CCNL 16777 0.19332350 1
#> 2: 2024 H011 CCNL 8913 0.10270563 2
#> 3: 2024 T011 CCNL 7738 0.08916596 3
#> quota_cum_giornate
#> <num>
#> 1: 0.1933235
#> 2: 0.2960291
#> 3: 0.3851951
# Etichette agganciate al risultato
etichette <- data.table::data.table(
ccnl_key = c("A011", "H011"),
ccnl_titolo = c("Titolo CCNL A011", "Titolo CCNL H011")
)
rank_ccnl(dt, measures = "giornate", ccnl_labels = etichette)[1:3]
#> ccnl_key classe ccnl_titolo giornate quota_giornate rank_giornate
#> <char> <char> <char> <num> <num> <int>
#> 1: A011 CCNL Titolo CCNL A011 185093 0.19915257 1
#> 2: H011 CCNL Titolo CCNL H011 87403 0.09404209 2
#> 3: T011 CCNL <NA> 74687 0.08036019 3
#> quota_cum_giornate
#> <num>
#> 1: 0.1991526
#> 2: 0.2931947
#> 3: 0.3735549