This website uses cookies

Read our Privacy policy and Terms of use for more information.

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.

La libreria e il dataframe

Iniziamo importando pandas:

import pandas as pd

Costruiamo 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:

  1. pandas prova a trovare soglie che dividano la serie in gruppi con la stessa numerosità;

  2. 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: