Quando lavori con dataset che contengono valori continui come stipendi, fatture e punteggi, potrebbe servirti suddividere i dati in gruppi delle stesse dimensioni.
In questa micro-lezione vedremo come usare il metodo qcut() di pandas per dividere i dati in quantili.
Il programma della micro-lezione
La libreria e il dataframe
Iniziamo importando pandas:
import pandas as pdCostruiamo un dataframe con ordini di un e-commerce che successivamente andremo a segmentare in base al loro importo:
df = pd.DataFrame({
'id': [10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22],
'città': ['Milano', 'Roma', 'Torino', 'Napoli', 'Firenze', 'Bologna', 'Palermo', 'Genova','Bologna', 'Palermo', 'Genova'],
'importo': [245, 89, 1250, 456, 78, 210, 345, 567, 76, 55, 790]
})Ed ecco il nostro dataframe:
id | città | importo |
|---|---|---|
10 | Milano | 245 |
12 | Roma | 89 |
13 | Torino | 1250 |
14 | Napoli | 456 |
15 | Firenze | 78 |
16 | Bologna | 210 |
17 | Palermo | 345 |
18 | Genova | 567 |
19 | Bologna | 76 |
20 | Palermo | 55 |
22 | Genova | 790 |
Dividere in quartili (4 gruppi uguali)
Partiamo da une delle applicazioni più comuni: dividiamo i dati in 4 gruppi di uguale numerosità: ogni gruppo avrà il 25% dei dati del dataset.
Per farlo, creiamo una nuova colonna, chiamata “fascia_spesa” e usiamo qcut() per indicare le bande di ogni gruppo:
df['fascia_spesa'] = pd.qcut(df['importo'], q=4)Ed ecco il risultato:
id | città | importo | fascia_spesa |
|---|---|---|---|
10 | Milano | 245 | (83.5, 245.0] |
12 | Roma | 89 | (83.5, 245.0] |
13 | Torino | 1250 | (511.5, 1250.0] |
14 | Napoli | 456 | (245.0, 511.5] |
15 | Firenze | 78 | (54.999, 83.5] |
16 | Bologna | 210 | (83.5, 245.0] |
17 | Palermo | 345 | (245.0, 511.5] |
18 | Genova | 567 | (511.5, 1250.0] |
19 | Bologna | 76 | (54.999, 83.5] |
20 | Palermo | 55 | (54.999, 83.5] |
22 | Genova | 790 | (511.5, 1250.0] |
Come possiamo vedere, la colonna fascia_spesa, indica per ogni valore della colonna importo i valori estremi del quartile a cui appartiene.
Infatti, qcut() calcola automaticamente i quantili e divide i dati in modo che ogni fascia contenga (più o meno) lo stesso numero di elementi.
Assegnare etichette comprensibili
Gli intervalli numerici sono precisi, ma poco leggibili.
In questo esempio useremo l’argomento labels per assegnare delle etichette semantiche basate sui valori della colonna importo:
df['segmento'] = pd.qcut(
df['importo'],
q=4,
labels=['basso', 'medio', 'alto', 'premium']
)E adesso, vediamo che aspetto ha il nostro dataframe, limitandolo a quattro colonne:
df[['id', 'città', 'importo', 'segmento']]Ed ecco qui il risultato:
id | città | importo | segmento |
|---|---|---|---|
10 | Milano | 245 | medio |
12 | Roma | 89 | medio |
13 | Torino | 1250 | premium |
14 | Napoli | 456 | alto |
15 | Firenze | 78 | basso |
16 | Bologna | 210 | medio |
17 | Palermo | 345 | alto |
18 | Genova | 567 | premium |
19 | Bologna | 76 | basso |
20 | Palermo | 55 | basso |
22 | Genova | 790 | premium |
Ora puoi usare i valori della colonna segmento per analisi successive: lo stesso cliente ha fatto ordini che si trovano in fasce diverse? Quanti clienti abbiamo per ogni tipo di ordine? E così via.
Usare il parametro q
Negli esempi precedenti, abbiamo usato il parametro q e gli abbiamo assegnato il valore di 4 per ottenere una divisione in quartili.
Cambiando il valore di q possiamo scegliere in quanti gruppi suddividere i nostri dati.
Un esempio tra i più classici è la suddivisione in decili, che si ottiene assegnando il valore 10 al parametro q:
pd.qcut(
df['importo'],
q=10
)Possiamo anche decidere di assegnare al parametro q i valori espressi da una lista di quantili. In questo modo possiamo designare degli intervallo personalizzati.
Immaginiamo di voler creare 4 intervalli:
da 0 al 10%
da appena sopra il 10% fino al 50%
da appena sopra il 50% fino al 90%
da appena sopra il 90% fino al 100%
Per farlo, ci basta fare così:
pd.qcut(
df['importo'],
q=[0, 0.10, 0.50, 0.90, 1]
)Nota bene
La lista di quantili ha 5 valori e indica 4 intervalli. Infatti gli intervalli sono sempre uguali a len(q) - 1.
Attenzione ai duplicati
Quando qcut() costruisce gli intervalli, calcola i quantili. Se ci sono molti valori uguali proprio in corrispondenza di un quantile (ad esempio il 10° o il 50° percentile), succede questo:
pandas prova a trovare soglie che dividano la serie in gruppi con la stessa numerosità;
Se una soglia cade su un valore molto ripetuto, i quantili successivi possono diventare uguali tra loro (ad esempio
76, 76, 76, 245);
In quel caso, qcut() può dare l’errore “Bin edges must be unique”.
Per gestire questo fenomeno puoi passare il parametro duplicates='drop'. Così pandas elimina i bordi duplicati e quindi riduce il numero di intervalli invece di andare in errore.
Alla prossima micro-lezione 👋
Se vuoi imparare la data analysis con micro-lezioni che vanno dritto al sodo, iscriviti alla newsletter: