Analisi dei processi di selezione — Jet HR

Analisi Jet HR E nel corpo del documento, ogni volta che vuoi evidenziare un KPI, scrivi solo: html
KPI: Durata del processo di selezione (giorni)
Così tutti i KPI hanno lo stesso stile e, se vuoi cambiarlo, modifichi solo il CSS nell'head invece di ogni box. Dimmi a cosa si riferiva il documento che volevi caricare (o ricaricalo) e proseguiamo.

Autore: Pierluigi Papa
Data: 6 luglio 2026

1. Pulizia dei dati: come li ho resi utilizzabili

Caricamento del dataset:

ATS_Data_Task_Jet_HR <- read_excel("ATS Data - Task @ Jet HR.xlsx")
data<-ATS_Data_Task_Jet_HR

Analizzando il dataset su R il primo problema che ho dovuto affrontare è stato il diverso formato per le variabili "Data di candidatura" e "Data di Fine Processo". Ho creato una funzione ad hoc per renderle tutto dello stesso formato. Il focus su queste due variabili è stato dettato dal fatto che si potesse creare un KPI basato su queste due variabili per valutare il processo di selezione.

KPI: Durata del processo di selezione (giorni): Data di Fine Processo - Data di candidatura

La funzione usata per fare ciò, denominata "parsedatamista" per completezza si trova nel file JETHR.Rhtml.

Oltre alla conversione,la variabile durata del processo è stata creata e aggiunta come ulteriore variabile del dataset iniziale.

Un problema nei dati: durate negative

Primo controllo di qualità. Alcune durate risultano negative Verifico quante sono, in valore assoluto e in percentuale sul totale.

sum(data$durata < 0, na.rm = TRUE)
## [1] 2290
(sum(data$durata < 0, na.rm = TRUE) / nrow(data)) * 100
## [1] 22.91146

Queste durate negative sono errori: probabilmente date invertite o di battitura. Non le elimino dal dataset, ma le escludo dai calcoli sulla durata(23%).

Un altro safe check è stato sulla presenza di duplicati.

#quanti
nomi compaiono almeno due volte
sum(duplicated(data$Nome e Cognome))
## [1] 1450

Questo risultato non ci porta ad una soluzione definitiva poichè potrebbe essere che una persona abbia applicato più di una volta o ci siano omonimi. Un consiglio è quello di far registrare le persone quando applicano in modo tale da avere ID univoci.

Arrivati a questo punto, il prossimo step è eliminare unità inutili.

In particolare tutte le unità che hanno un CV non è stato valutato ad eccezione dei Web "Designer" & "Chief of Staff".

noscreen<-data[is.na(data$`Valutazione CV`) & !(data$Ruolo %in% c("Web Designer", "Chief of Staff")),]
nrow(noscreen)
## [1] 439

Queste 439 unità vengono escluse dal dataset.

data_clean
<-
data[!(rownames(data)
%in%
rownames(noscreen)),
] 

Data_clean sarà il dataset di riferimento con non più 9995 candidati ma 9556.

I quattro funnel di selezione

Ogni ruolo segue un processo diverso. Prima di analizzare i dati ho ricostruito i quattro funnel a partire dalle regole fornite, perché applicare lo stesso schema a tutti falserebbe le metriche. La tabella riassume i percorsi.

Funnel Ruoli Percorso
Standard Sales Ops, BDR, Talent Screening → Task → Interview 1 → Interview 2 → Interview 3 → Offer
Software Engineer Software Engineer Screening → Interview 1 → Interview 2 → Interview 3 → Offer (no Task)
Product Designer Product Designer Screening → Interview 1 → Task → Interview 2 → Offer (Task dopo la 1ª interview, 2 interview)
No-Screening Web Designer, Chief of Staff Task → Interview 1 → Interview 2 → Interview 3 → Offer (no Screening)

Il dataset è stato sotto-diviso in 4 sottodataset in base ai diversi processi di selezione.

Nota a margine: per lo stesso ruolo vengono usati nomi diversi. In particolare:

VariabileFunnelRuoli
df_standardStandardSales Ops, BDR, Talent
df_sweSoftware EngineerSoftware Engineer
df_pdProduct DesignerProduct Designer
df_noscreenNo-ScreeningWeb Designer, Chief of Staff