Affrontiamo un esempio di esplorazione dati con funzioni statistiche tentando di tracciare una sorta di percorso che può essere utile all'inizio di qualsiasi analisi. Per l'occasione creiamo noi un dataset, piuttosto piccolo in modo da poter verificare chiaramente quanto rileviamo.
Questi i nostri dati:
import pandas as pd
dict={
'agente': [1,1,1,1,1,1,2,2,2,3,3],
'ordine': [100,100,101,101,102,102,201,201,202,300,300],
'prodotto': ['blu','green','blu','blu','green','red','blu','green','red','red','red'],
'quantita':[3,6,3,5,7,2,1,1,1,8,9]
}
df=pd.DataFrame(dict)
Rappresentano degli ordini raccolti da agenti di commercio (indicati con i numeri identificativi 1, 2 e 3) in cui sono stati acquistati prodotti denominati 'blu', 'green' e 'red'. I campi ordine
e quantita
rappresentano, rispettivamente, il numero dell'ordine raccolto dall'agente e la quantità in cui uno specifico prodotto è stato richiesto.
Con df.head()
diamo uno sguardo alla forma del dataset:
agente ordine prodotto quantita
0 1 100 blu 3
1 1 100 green 6
2 1 101 blu 3
3 1 101 blu 5
4 1 102 green 7
Organizziamo le nostre ricerche nel seguente modo:
- verifichiamo quantità di dati a disposizione ed elementi non nulli;
- individuiamo valori unici per conoscere gli elementi che compongono alcuni insiemi interni al dataset;
- rileviamo misure statistiche per osservare come i dati sono distribuiti;
- sviluppiamo raggruppamenti multipli a colpo d'occhio con tabelle pivot.
Iniziamo le nostre valutazioni.
Conteggio e valori nulli
Quello di cui abbiamo bisogno è df.info()
:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 11 entries, 0 to 10
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 agente 11 non-null int64
1 ordine 11 non-null int64
2 prodotto 11 non-null object
3 quantita 11 non-null int64
dtypes: int64(3), object(1)
memory usage: 480.0+ bytes
Abbiamo appena usato uno di quei tipici comandi Pandas che riesce a riassumere con un solo risultato tante informazioni importanti. Ci dice il numero di campioni complessivi, il tipo di ogni campo (colonna a destra), il numero di valori non nulli per ogni campo (risulta 11 sempre come il numero complessivo di righe quindi nessun valore nullo).
Su dataset reali, se a seguito della chiamata a questo metodo individuiamo sacche di valori nulli, sarà necessario indagare maggiormente per vedere la loro incidenza (anche in corrispondenza di ulteriori dati) e applicare tecniche - che conosceremo più avanti nella guida - per compensarli.
Valori unici
Considerando che abbiamo una serie di valori discreti, in dataset più estesi soprattutto, sarebbe utile sapere quanti valori unici esistono in questi casi. Ciò ci aiuterebbe a rispondere a domande del tipo "Quanti e chi sono gli agenti nominati nel dataset?", "Quanti e quali i prodotti presenti negli ordini?".
Con df['agente'].unique()
sapremo che gli agenti coinvolti sono tre etichettati con i seguenti identificativi:
array([1, 2, 3])
mentre con df['prodotto'].unique()
possiamo sapere che i prodotti complessivamente richiamati almeno una volta negli ordini sono:
array(['blu', 'green', 'red'], dtype=object)
Misurazioni statistiche
Praticamente tutta la statistica di cui abbiamo bisogno la otteniamo con df.describe()
:
agente ordine quantita
count 11.000000 11.000000 11.000000
mean 1.636364 164.545455 4.181818
std 0.809040 80.615586 2.960344
min 1.000000 100.000000 1.000000
25% 1.000000 101.000000 1.500000
50% 1.000000 102.000000 3.000000
75% 2.000000 201.500000 6.500000
max 3.000000 300.000000 9.000000
Per ogni campo possiamo sapere le principali informazioni descrittive ma siamo al punto in cui non vale la pena di fermarsi solo ai puri aspetti tecnici e conviene entrare un po' nel merito della significatività di queste grandezze.
Ad esempio, non tutte queste indicazioni sono utili per ogni campo. In realtà, per "agente" e "ordine" le misurazioni sono del tutto inutili. Pandas le ha svolte in automatico trattandosi di numeri ma avere la deviazione standard degli identificativi degli agenti o dei numeri d'ordine non ha alcun senso tanto che si sarebbe potuto ridurre il comando a df['quantita'].describe()
ottenendo una Series.
La colonna a destra ci informa sulle quantità di un singolo prodotto incluso in un ordine. Ci dice che, come minimo, il prodotto appare una volta in un ordine (informazione superflua, sarebbe impossibile un valore inferiore) e al massimo in 9 pezzi.
Utile ciò che la riga etichettata "50%" ci dice. Si tratta del secondo quartile, comunemente detto mediana, che indica che 3 è il valore che divide esattamente in due il range di elementi. Si trova
però decisamente più vicino a 1 (il minimo) che a 9 (il massimo) e ciò rispecchia la grande presenza di valori come 1 e 2 negli ordini: in pratica gli elementi presenti nel range da 1 a 3 sono in quantità uguale a quelli appartenenti al range, di estensione tripla, che va da 3 a 9.
Tabelle pivot
I raggruppamenti sono l'ideale per verificare valori statistici e conteggi di sottogruppi del dataset ma ciò richiederebbe di intervenire molto con vari comandi groupby
. Un modo più sintetico di sviluppare tali indagini è quello di azionare tabelle pivot. Quanti pezzi di prodotto green l'agente 2 ha venduto? Qual è il prodotto che l'agente 1 ha venduto più facilmente? Qualche agente non è riuscito mai a vendere uno specifico prodotto?
Tutte queste domande trovano risposte o in diversi raggruppamenti o in un'unica tabella pivot fornita da pd.pivot_table(df,index=["agente"],columns=["prodotto"],values=['ordine'],aggfunc='count')
:
ordine
prodotto blu green red
agente
1 3.0 2.0 1.0
2 1.0 1.0 1.0
3 NaN NaN 2.0
Con il comando appena impartito, abbiamo richiesto i raggruppamenti possibili tra "prodotto" e "ordine" con count
come funzione di aggregazione basata sui valori presenti in "ordine".
Così abbiamo tutte le risposte: l'agente 2 ha venduto una volta green, l'agente 1 è stato più efficace nella vendita di blu e negli ordini dell'agente 3 non ci sono tracce di green e blu.
Abbiamo svolto finora poche operazioni ma che ci hanno dato un'idea di base sui valori che stiamo trattando. Proseguiremo l'esplorazione nella prossima lezione estendendo il dataset e associando dei grafici.