Vai al contenuto principale

Prevedere l’Employee Churn in Python

Analizza l’employee churn. Scopri perché le persone lasciano l’azienda e impara a prevedere chi sarà il prossimo a lasciare.
Aggiornato 29 set 2026  · 14 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

In passato, l’attenzione era rivolta soprattutto ai “tassi”, come il tasso di abbandono e quello di retention. Gli HR Manager calcolano i tassi storici e cercano di prevedere i tassi futuri usando strumenti di data warehousing. Questi tassi mostrano l’impatto aggregato del churn, ma sono solo metà del quadro. Un altro approccio è concentrarsi sui singoli record oltre che sugli aggregati.

Esistono molti case study sul churn dei clienti. Nel customer churn puoi prevedere chi e quando smetterà di acquistare. L’employee churn è simile, ma si concentra sui dipendenti invece che sui clienti. Qui puoi prevedere chi e quando interromperà il rapporto di lavoro. L’employee churn è costoso e anche piccoli miglioramenti possono generare risultati significativi. Aiuta a progettare piani di retention migliori e a migliorare la soddisfazione dei dipendenti.

Analisi dell’Employee Churn

analisi dell’employee churn in python


L’employee churn può essere definito come una perdita o fuoriuscita di asset intellettuali da un’azienda o organizzazione. In parole semplici, quando i dipendenti lasciano l’organizzazione si parla di churn. Un’altra definizione è quando un membro di una popolazione lascia la popolazione.

Dalla ricerca emerge che l’employee churn è influenzato da età, anzianità, retribuzione, soddisfazione lavorativa, salario, condizioni di lavoro, potenziale di crescita e percezione di equità. Altre variabili come età, genere, etnia, istruzione e stato civile sono fattori importanti nella previsione dell’employee churn. In alcuni casi, i dipendenti con competenze di nicchia sono più difficili da sostituire: ciò impatta il lavoro in corso e la produttività dei colleghi. Acquisire nuovi dipendenti come sostituti ha costi propri, come quelli di assunzione e formazione. Inoltre, il nuovo assunto impiegherà tempo per raggiungere un livello di competenze tecniche o di business simile a quello di un collega più esperto. Le organizzazioni affrontano questo problema applicando tecniche di machine learning per prevedere l’employee churn, così da poter intervenire di conseguenza.

I seguenti punti ti aiutano a comprendere meglio l’employee churn e il customer churn:

  • Nel business scegli i dipendenti da assumere, mentre nel marketing non puoi scegliere i tuoi clienti.

  • I dipendenti sono il volto della tua azienda e, collettivamente, producono tutto ciò che la tua azienda realizza.

  • Perdere un cliente influisce su ricavi e immagine del brand. Acquisire nuovi clienti è più difficile e costoso rispetto a trattenere quelli esistenti. Anche l’employee churn è doloroso per le aziende e le organizzazioni: richiede tempo e impegno per trovare e formare un sostituto.

L’employee churn ha dinamiche specifiche rispetto al customer churn. Ci aiuta a progettare piani di retention migliori e a migliorare la soddisfazione dei dipendenti. Gli algoritmi di data science possono prevedere il churn futuro.


Analisi Esplorativa


L’Exploratory Data Analysis è una fase iniziale in cui puoi riassumere le caratteristiche dei dati, come pattern, trend, outlier e testare ipotesi usando statistiche descrittive e visualizzazioni.

Importazione dei moduli

#import modules
import pandas  # for dataframes
import matplotlib.pyplot as plt # for plotting graphs
import seaborn as sns # for plotting graphs
% matplotlib inline


Caricamento del dataset

Per prima cosa carichiamo il dataset HR richiesto usando la funzione di pandas per leggere i CSV. Puoi scaricare i dati da questo link.

data=pandas.read_csv('HR_comma_sep.csv')
data.head()

caricamento del dataset di employee churn

  • Qui, i dati originali sono separati da virgola (",") nel dataset fornito.
  • Puoi dare un’occhiata più da vicino ai dati usando la funzione “head()” della libreria pandas, che restituisce le prime cinque osservazioni.
  • Allo stesso modo, “tail()” restituisce le ultime cinque osservazioni.

data.tail()

dataset hr


Dopo aver caricato il dataset, potresti volerlo conoscere meglio. Puoi controllare i nomi degli attributi e i tipi di dato usando info().

 
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 14,999 entries, 0 to 14,998
Data columns (total 10 columns):
satisfaction_level       14999 non-null float64
last_evaluation          14999 non-null float64
number_project           14999 non-null int64
average_montly_hours     14999 non-null int64
time_spend_company       14999 non-null int64
Work_accident            14999 non-null int64
left                     14999 non-null int64
promotion_last_5years    14999 non-null int64
Departments              14999 non-null object
salary                   14999 non-null object
dtypes: float64(2), int64(6), object(2)
memory usage: 1.1+ MB
  • Questo dataset ha 14.999 campioni e 10 attributi (6 interi, 2 float e 2 oggetto).
  • Nessuna colonna ha valori nulli/mancanti.


Puoi descrivere in dettaglio i 10 attributi come segue:

  • satisfaction_level: è il punteggio di soddisfazione del dipendente, varia da 0 a 1.
  • last_evaluation: è la valutazione delle performance da parte del datore di lavoro, anch’essa varia da 0 a 1.
  • number_projects: quanti progetti sono assegnati a un dipendente?
  • average_monthly_hours: quante ore mensili in media lavora un dipendente?
  • time_spent_company: indica l’esperienza del dipendente, cioè gli anni trascorsi in azienda.
  • work_accident: se un dipendente ha avuto o meno un infortunio sul lavoro.
  • promotion_last_5years: se un dipendente ha avuto o meno una promozione negli ultimi 5 anni.
  • Departments: reparto/divisione in cui lavora il dipendente.
  • Salary: livello salariale del dipendente, ad esempio low, medium e high.
  • left: se il dipendente ha lasciato l’azienda o no.


Passiamo agli insight sui dati

Nel dataset hai due tipi di dipendenti: chi è rimasto e chi ha lasciato l’azienda. Puoi quindi dividere i dati in due gruppi e confrontarne le caratteristiche. Qui puoi trovare la media di entrambi i gruppi usando le funzioni groupby() e mean().

left = data.groupby('left')
left.mean()

dati raggruppati per media


Qui puoi interpretare che i dipendenti che hanno lasciato l’azienda avevano un basso livello di soddisfazione, un basso tasso di promozione, salari più bassi e lavoravano di più rispetto a chi è rimasto.

La funzione describe() in pandas è comoda per ottenere varie statistiche riassuntive. Restituisce conteggio, media, deviazione standard, valori minimo e massimo e i quantili dei dati.

 
data.describe()

dati con funzione describe di pandas


Visualizzazione dei dati

Dipendenti che hanno lasciato

Vediamo quanti dipendenti hanno lasciato.

Qui puoi tracciare un grafico a barre usando Matplotlib. Il grafico a barre è adatto a mostrare i conteggi di variabili discrete.

left_count=data.groupby('left').count()
plt.bar(left_count.index.values, left_count['satisfaction_level'])
plt.xlabel('Dipendenti che hanno lasciato l\'azienda')
plt.ylabel('Numero di dipendenti')
plt.show()

grafico dei dipendenti che hanno lasciato con matplotlib
 
data.left.value_counts()
0    11428
1     3571
Name: left, dtype: int64


Qui puoi vedere che su circa 15.000 dipendenti, 3.571 hanno lasciato e 11.428 sono rimasti. Il numero di chi ha lasciato è il 23% del totale.

Numero di progetti

Allo stesso modo, puoi tracciare un grafico a barre per contare quanti dipendenti sono assegnati a quanti progetti.

num_projects=data.groupby('number_project').count()
plt.bar(num_projects.index.values, num_projects['satisfaction_level'])
plt.xlabel('Numero di progetti')
plt.ylabel('Numero di dipendenti')
plt.show()

numero di progetti con matplotlib
  • La maggior parte dei dipendenti lavora su 3-5 progetti.

Anni trascorsi in azienda

Analogamente, puoi tracciare un grafico a barre per contare i dipendenti in base all’esperienza maturata.

time_spent=data.groupby('time_spend_company').count()
plt.bar(time_spent.index.values, time_spent['satisfaction_level'])
plt.xlabel('Anni trascorsi in azienda')
plt.ylabel('Numero di dipendenti')
plt.show()

grafico anni trascorsi in azienda con matplotlib

La maggior parte dei dipendenti ha tra 2 e 4 anni di esperienza. C’è anche un grande divario tra chi ha 3 e 4 anni.

Sottoplot con Seaborn

Analizzare le feature una per una è possibile, ma richiede tempo. Un’opzione migliore è usare la libreria Seaborn e tracciare tutti i grafici in un’unica esecuzione con i sottoplot.

features=['number_project','time_spend_company','Work_accident','left', 'promotion_last_5years','Departments ','salary']
fig=plt.subplots(figsize=(10,15))
for i, j in enumerate(features):
    plt.subplot(4, 2, i+1)
    plt.subplots_adjust(hspace = 1.0)
    sns.countplot(x=j,data = data)
    plt.xticks(rotation=90)
    plt.title("No. of employee")

grafici dei dipendenti con seaborn

Dalla visualizzazione sopra puoi osservare:

  • La maggior parte dei dipendenti lavora su 3-5 progetti.
  • C’è un forte calo tra chi ha 3 e 4 anni di esperienza.
  • Il numero di chi ha lasciato è il 23% dell’organico totale.
  • Pochissimi dipendenti hanno ottenuto una promozione negli ultimi 5 anni.
  • Il reparto vendite ha il maggior numero di dipendenti, seguito da tecnico e supporto.
  • La maggior parte dei dipendenti percepisce uno stipendio medio o basso.

fig=plt.subplots(figsize=(10,15))
for i, j in enumerate(features):
    plt.subplot(4, 2, i+1)
    plt.subplots_adjust(hspace = 1.0)
    sns.countplot(x=j,data = data, hue='left')
    plt.xticks(rotation=90)
    plt.title("No. of employee")

Dalla visualizzazione sopra puoi osservare:

  • I dipendenti con più di 5 progetti hanno lasciato l’azienda.
  • Chi ha svolto 6 o 7 progetti ha lasciato: sembra fossero sovraccarichi di lavoro.
  • I dipendenti con cinque anni di esperienza lasciano di più a causa dell’assenza di promozioni negli ultimi 5 anni; chi ha più di 6 anni tende a non lasciare per attaccamento all’azienda.
  • Chi ha ricevuto una promozione negli ultimi 5 anni non ha lasciato; cioè, tutti quelli che hanno lasciato non hanno avuto promozioni nei 5 anni precedenti.


Riepilogo di analisi e visualizzazione dati:

Le seguenti caratteristiche influenzano maggiormente la decisione di lasciare l’azienda:

  • Promozioni: è molto più probabile che i dipendenti si dimettano se non hanno ricevuto una promozione negli ultimi 5 anni.
  • Anni in azienda: il traguardo dei tre anni sembra un punto cruciale nella carriera; molti si dimettono intorno a quel momento. Un altro punto importante è quello dei 6 anni, in cui è molto improbabile lasciare.
  • Numero di progetti: il livello di coinvolgimento è un altro fattore chiave. Chi lavora su 3-5 progetti è meno incline a lasciare; chi ne ha di meno o di più è più propenso a farlo.
  • Salario: la maggior parte di chi si dimette appartiene ai gruppi con stipendio medio o basso.


Analisi dei cluster:


Vediamo i gruppi di dipendenti che hanno lasciato. Puoi osservare che i fattori più importanti per restare o lasciare sono la soddisfazione e la performance in azienda. Raggruppiamoli quindi con un’analisi per cluster.

#import module
from sklearn.cluster import KMeans
# Filter data
left_emp =  data[['satisfaction_level', 'last_evaluation']][data.left == 1]
# Create groups using K-means clustering.
kmeans = KMeans(n_clusters = 3, random_state = 0).fit(left_emp)
# Add new column "label" annd assign cluster labels.
left_emp['label'] = kmeans.labels_
# Draw scatter plot
plt.scatter(left_emp['satisfaction_level'], left_emp['last_evaluation'], c=left_emp['label'],cmap='Accent')
plt.xlabel('Satisfaction Level')
plt.ylabel('Last Evaluation')
plt.title('3 Clusters of employees who left')
plt.show()

analisi dei cluster per l’analisi dei dipendenti


Qui, i dipendenti che hanno lasciato l’azienda possono essere raggruppati in 3 tipologie:

  • Alta soddisfazione e alta valutazione (in verde nel grafico), li puoi chiamare “Vincenti”.
  • Bassa soddisfazione e alta valutazione (in blu nel grafico), li puoi chiamare “Frustrati”.
  • Soddisfazione e valutazione moderate (in grigio nel grafico), li puoi chiamare “Cattivo abbinamento”.


Costruire un modello di previsione


Pre-processing dei dati

Molti algoritmi di machine learning richiedono input numerici, quindi è necessario rappresentare le colonne categoriche come numeriche.

Per codificare questi dati, puoi mappare ogni valore a un numero. Ad esempio, i valori della colonna Salary possono essere rappresentati come low:0, medium:1 e high:2.

Questo processo è noto come label encoding e sklearn lo gestisce comodamente con LabelEncoder.

# Import LabelEncoder
from sklearn import preprocessing
#creating labelEncoder
le = preprocessing.LabelEncoder()
# Converting string labels into numbers.
data['salary']=le.fit_transform(data['salary'])
data['Departments ']=le.fit_transform(data['Departments '])


Qui hai importato il modulo preprocessing e creato un oggetto LabelEncoder. Usandolo hai effettuato fit e transform delle colonne "salary" e "Departments " in colonne numeriche.

Suddividere train e test set

Per capire le prestazioni del modello, suddividere il dataset in training set e test set è una buona strategia.

Dividiamo il dataset usando la funzione train_test_split(). Devi passare 3 parametri: feature, target e dimensione del test set. Inoltre, puoi usare random_state per selezionare i record in modo casuale.

#Spliting data into Feature and
X=data[['satisfaction_level', 'last_evaluation', 'number_project',
       'average_montly_hours', 'time_spend_company', 'Work_accident',
       'promotion_last_5years', 'Departments ', 'salary']]
y=data['left']
# Import train_test_split function
from sklearn.model_selection import train_test_split

# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  # 70% training and 30% test


Qui, il dataset è stato suddiviso in due parti nel rapporto 70:30. Significa che il 70% dei dati è usato per l’addestramento e il 30% per il test.

Costruzione del modello

Costruiamo un modello per prevedere l’employee churn.

Qui userai un Gradient Boosting Classifier per prevedere il churn.

Per prima cosa importa il modulo GradientBoostingClassifier e crea un classificatore Gradient Boosting usando la funzione GradientBoostingClassifier().

Poi, allena il modello sul train set con fit() ed effettua le previsioni sul test set con predict().

#Import Gradient Boosting Classifier model
from sklearn.ensemble import GradientBoostingClassifier

#Create Gradient Boosting Classifier
gb = GradientBoostingClassifier()

#Train the model using the training sets
gb.fit(X_train, y_train)

#Predict the response for test dataset
y_pred = gb.predict(X_test)


Valutazione delle prestazioni del modello

 
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
# Model Precision
print("Precision:",metrics.precision_score(y_test, y_pred))
# Model Recall
print("Recall:",metrics.recall_score(y_test, y_pred))
Accuracy: 0.971555555556
Precision: 0.958252427184
Recall: 0.920708955224

Hai ottenuto un tasso di classificazione del 97%, considerato un’ottima accuratezza.

Precision: la precision riguarda l’essere precisi, cioè quanto è preciso il modello. In altre parole, quando il modello fa una previsione, quanto spesso è corretta. Nel tuo caso, quando il modello di Gradient Boosting ha previsto che un dipendente avrebbe lasciato, quel dipendente ha effettivamente lasciato il 95% delle volte.

Recall: se nel test set è presente un dipendente che ha lasciato, il tuo modello di Gradient Boosting lo identifica nel 92% dei casi.

Conclusione


Congratulazioni, sei arrivato alla fine di questo tutorial!

In questo tutorial hai imparato che cos’è l’Employee Churn, come differisce dal customer churn, come fare analisi esplorativa e visualizzazione del dataset di employee churn usando matplotlib e seaborn, e come costruire e valutare un modello usando il pacchetto scikit-learn di Python.

Aspetto volentieri feedback o domande. Puoi lasciare un commento e farò del mio meglio per risponderti.

Se vuoi approfondire Python, dai un’occhiata al corso di DataCamp Intermediate Python for Data Science.

Argomenti
Python

Scopri di più su Python

Corso

Python - Livello Intermedio

4 ore
1.4M
Migliora le tue competenze nella scienza dei dati creando visualizzazioni con Matplotlib e manipolando DataFrames con pandas.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro