Ti interessa seguire un corso su Pandas? Valuta il nostro corso Data Manipulation with pandas !
Importare i dati Per iniziare a esplorare i tuoi dati, devi partire dal loro caricamento. Probabilmente questo già lo sai, ma grazie alla libreria Pandas è un compito semplice: importi il pacchetto come pd, seguendo la convenzione, e usi la funzione read_csv(), a cui passi l’URL in cui si trovano i dati e un argomento header. Quest’ultimo argomento ti serve per assicurarti che i dati vengano letti correttamente: la prima riga dei dati non verrà interpretata come i nomi delle colonne del tuo DataFrame.
In alternativa, ci sono anche altri argomenti che puoi specificare per garantire una lettura corretta: puoi specificare il delimitatore con gli argomenti sep o delimiter, i nomi delle colonne con names o la colonna da usare come etichette di riga per il DataFrame risultante con index_col.
Ma questi non sono nemmeno tutti gli argomenti che puoi aggiungere alla funzione read_csv(). Approfondisci questa funzione e i suoi argomenti nella documentazione .
# Import the `pandas` library as `pd`
import pandas as pd
# Load in the data with `read_csv()`
digits = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra",
header=None)
# Print out `digits`
print(digits)
Nota che in questo caso hai usato read_csv() perché i dati sono in formato separato da virgola. Se hai file con un altro separatore, puoi considerare altre funzioni per caricare i tuoi dati, come read_table(), read_excel(), read_fwf() e read_clipboard, per leggere rispettivamente file delimitati generici, file Excel, dati a larghezza fissa e dati copiati negli Appunti.
Troverai anche read_sql() tra le opzioni per leggere una query SQL o una tabella di un database in un DataFrame. Per altre funzioni di input, dai un’occhiata a questa sezione della documentazione di Pandas.
Che cos’è l’Exploratory Data Analysis (EDA)? L’Exploratory Data Analysis (EDA) serve, da un lato, per rispondere a domande, testare assunzioni di business, generare ipotesi per analisi successive. Dall’altro, puoi anche usarla per preparare i dati alla modellazione. Ciò che probabilmente accomuna questi due aspetti è una buona conoscenza dei dati, utile sia per ottenere le risposte che ti servono sia per sviluppare un’intuizione nell’interpretare i risultati della modellazione futura.
Ci sono molti modi per raggiungere questi obiettivi: puoi ottenere una descrizione di base dei dati, visualizzarli, identificare pattern, individuare le criticità nell’uso dei dati, ecc.
Una delle cose che spesso incontrerai leggendo di EDA è il data profiling. Il data profiling si occupa di riassumere il dataset tramite statistiche descrittive. Vuoi usare misure diverse per comprendere meglio il tuo dataset. L’obiettivo del data profiling è costruire una comprensione solida dei dati per poi iniziare a interrogarli e visualizzarli in vari modi. Tuttavia, questo non significa che non serva iterare: proprio perché il data profiling riassume il dataset, è spesso usato per valutarne la qualità. A seconda dei risultati del data profiling, potresti decidere di correggere, scartare o gestire diversamente i dati.
Imparerai di più sul data profiling in un prossimo post.
EDA e Data Mining (DM) L’EDA si distingue dal data mining, anche se i due sono strettamente correlati, poiché molte tecniche EDA sono state adottate nel data mining. Anche gli obiettivi sono molto simili: l’EDA fa in modo di esplorare i dati in modo che feature interessanti e relazioni tra feature risultino più chiare. Nell’EDA, in genere esplori e confronti molte variabili diverse con una varietà di tecniche per cercare e trovare pattern sistematici. Il data mining, invece, si occupa di estrarre pattern dai dati. Quei pattern forniscono informazioni sulle relazioni tra variabili che possono essere usate per migliorare le decisioni di business. Inoltre, in entrambi i casi, non hai aspettative a priori o le tue aspettative sulle relazioni tra variabili non sono complete.
Tuttavia, in generale, si può dire che il Data Mining è più orientato all’applicazione, mentre l’EDA si concentra sulla natura di base dei fenomeni sottostanti. In altre parole, il Data Mining è relativamente meno interessato a identificare le relazioni specifiche tra le variabili coinvolte. Di conseguenza, il Data Mining accetta un approccio “black box” all’esplorazione dei dati e non usa solo tecniche impiegate anche nell’EDA, ma anche tecniche come le reti neurali per generare previsioni valide senza identificare la natura specifica delle relazioni tra le variabili su cui si basano le previsioni.
Descrizione di base dei dati Come hai letto sopra, l’EDA serve a conoscere i tuoi dati. Uno dei passi più elementari è ottenere una descrizione di base dei dati. “Descrizione di base” è un termine ampio: puoi intenderla come un modo rapido e semplice per ricavare qualche informazione sui dati, per ottenere informazioni facili da capire, per farti un’idea generale, ecc.
Questa sezione non farà distinzioni tra queste interpretazioni: ti presenterà effettivamente alcuni modi per raccogliere velocemente informazioni sul tuo DataFrame che siano facili da comprendere.
Descrivere i dati Per esempio, puoi usare la funzione describe() per ottenere varie statistiche di riepilogo che escludono i valori NaN. Considera questo esempio in cui descrivi il famoso dataset Iris . I dati sono già stati caricati per te nel blocco DataCamp Light:
Vedi che questa funzione restituisce conteggio, media, deviazione standard, valori minimo e massimo e i quantili dei dati. Nota che, ovviamente, esistono molti pacchetti in Python che ti forniscono queste statistiche, incluso lo stesso Pandas. Usare questa funzione è solo uno dei modi per ottenerle.
Nota anche che vale la pena dedicare tempo ad approfondire le statistiche descrittive, se non l’hai ancora fatto. Puoi usarle per iniziare a valutare la qualità dei dati. In seguito potrai decidere se correggere, scartare o trattare i dati in un altro modo. Di solito questo è lo step di data profiling. Questo passaggio dell’EDA serve a comprendere meglio gli elementi del dato e le sue anomalie e a verificare come i dati si allineano alla documentazione da un lato e soddisfano le esigenze di business dall’altro.
Nota che tornerai sul data profiling man mano che procedi con l’analisi esplorativa, poiché la qualità dei dati può essere influenzata dai passaggi che seguirai.
Prime e ultime righe del DataFrame Ora che hai un’idea generale del dataset, è anche una buona idea guardare più da vicino i dati stessi. Con le funzioni head() e tail() della libreria Pandas puoi facilmente controllare rispettivamente le prime e le ultime righe del tuo DataFrame.
Ispeziona le prime e le ultime cinque righe dei dati delle cifre scritte a mano con le funzioni head() e tail() nel blocco DataCamp Light qui sotto. I dati sono già stati caricati per te nel blocco DataCamp Light:
# Inspect the first 5 rows of `digits`
first = digits._____(5)
# Inspect the last 5 rows
last = digits.____(5)
Vedrai che il risultato delle funzioni head() e tail() non dice granché se non hai familiarità con questo tipo di dati.
Potresti vedere solo una serie di righe e colonne con valori numerici. Considera di leggere la descrizione del dataset se non l’hai ancora fatto: ti darà informazioni utili su come sono stati raccolti i dati e indica anche il numero di attributi e righe, cosa utile per verificare di aver importato correttamente i dati.
Inoltre, torna alla tua prima osservazione: i valori numerici nelle righe. A prima vista, potresti non vedere problemi, dato che gli interi sembrano corretti e non destano sospetti a un’occhiata veloce.
Ma se avessi fatto tutto questo su un altro dataset davanti a te che, ad esempio, contenesse informazioni di tipo data/ora, un rapido sguardo al risultato di queste righe di codice potrebbe sollevare domande come: “I miei dati sono stati letti come DateTime?”, “Come posso verificarlo?” e “Come posso cambiare il tipo di dato?”.
Queste sono domande più approfondite che in genere affronti nello step di data profiling, che verrà trattato in un prossimo post.
Campionare i dati Se hai un dataset di grandi dimensioni, potresti considerare di prelevarne un campione come modo semplice per farti rapidamente un’idea dei dati. Un primo modo semplice è usare la funzione sample() inclusa in Pandas, così:
# Take a sample of 5
digits.sample(5)
Un altro modo —forse più articolato— è creare un indice casuale e poi estrarre righe casuali dal tuo DataFrame. Vedrai che il codice qui sotto usa il pacchetto random, che ha un modulo sample per campionare i dati, in combinazione con range() e len(). Nota che usi anche ix per selezionare le righe esatte del DataFrame da includere nel campione.
Se non ti è chiaro perché usare ix in questo contesto, il tutorial più specifico di DataCamp può aiutarti! Copre in dettaglio questi argomenti più generali. Vai a dare un’occhiata cliccando sul link incluso sopra!
Per ora, mettiamo in pratica le nostre skill in Python! Inizia con l’esercizio qui sotto:
# import `sample` from `random`
from random import ______
# Create a random index
randomIndex = np.array(sample(range(len(______)), 5))
# Get 5 random rows
digitsSample = digits.ix[___________]
# Print the sample
print(____________)
Le sfide dei tuoi dati Ora che hai raccolto alcune informazioni di base, è utile approfondire un po’ le sfide che i tuoi dati possono porre. Se hai già svolto lo step di data profiling, sarai consapevole di eventuali valori mancanti, avrai un’idea di quali valori possano essere outlier, ecc.
Questa sezione descriverà alcuni modi basilari per farsi un’idea di questi aspetti e spiegherà come gestire i dati nel caso in cui trovi irregolarità. Nota ancora una volta che andrai —o sei già andato— più a fondo nell’identificazione di queste irregolarità nello step di data profiling, ed è normale tornarci dopo aver gestito alcune delle sfide poste dai dati.
Valori mancanti Qualcosa che potresti voler controllare quando esplori i dati è se il dataset ha o meno valori mancanti.
Esaminare questo aspetto è importante perché, quando alcuni dati mancano, il dataset può perdere espressività, portando ad analisi deboli o distorte. In pratica, significa che quando ti mancano valori per certe feature, aumentano le probabilità che la classificazione o le previsioni sui dati siano errate.
Ovviamente, la causa dei dati mancanti nel dataset può essere un’estrazione o un’importazione difettosa, oppure il processo di raccolta. I sistemi che forniscono i dati possono avere malfunzionamenti o il sondaggio che hai inviato può avere risposte lasciate in bianco dagli intervistati. È molto importante considerare anche se ci sia un pattern nei dati mancanti, e qui il data profiling può essere utile. Ricorda che puoi usarlo per farti un’idea migliore della qualità dei dati. Potrai leggere di più su come scoprire pattern di dati mancanti in un post di follow-up.
In breve, le cause dei dati mancanti possono essere varie e dipendono in larga parte dal contesto dei dati, ma possono dipendere anche da te. Ecco perché hai prima ispezionato i dati al momento dell’importazione in uno dei passaggi precedenti!
Per identificare le righe che contengono valori mancanti, puoi usare isnull(). Nel risultato che riceverai, vedrai comparire True o False in ogni cella: True indica che il valore all’interno della cella è mancante, False significa che la cella contiene un valore “normale”.
# Identifiy missing values
pd.isnull(______)
In questo caso, vedi che i dati sono piuttosto completi: non ci sono valori mancanti.
Nota che avresti potuto leggerlo anche nella descrizione del dataset sul UCI Machine Learning Repository linkata sopra, dove è indicato che non ci sono valori mancanti.
Tuttavia, non sarà così per ogni dataset che incontrerai. Ecco perché è bene sapere cosa fare quando ti trovi in una situazione in cui devi decidere come gestire i dati mancanti.
Puoi eliminare i dati mancanti: elimini l’intero record oppure mantieni solo i record in cui le feature di interesse sono presenti. Ovviamente devi fare attenzione, perché eliminare dati può introdurre bias nell’analisi. Ecco perché dovresti chiederti se la probabilità che certi dati siano mancanti per un record è la stessa per tutti gli altri record. Se la probabilità non varia da record a record, eliminare i dati mancanti è un’opzione valida. Oltre all’eliminazione, ci sono metodi per riempire le celle con valori mancanti con le cosiddette “tecniche di imputazione”. Se hai già esperienza con la statistica, saprai che l’imputazione è il processo di sostituzione dei dati mancanti con valori sostitutivi. Puoi inserire la media, la moda o la mediana. Ovviamente, qui devi pensare se vuoi usare, ad esempio, media o mediana per tutti i valori mancanti di una variabile, o se vuoi sostituire i valori mancanti in base a un’altra variabile. Ad esempio, per dati con feature categoriali come “maschio” o “femmina”, potresti voler considerare queste categorie prima di sostituire i valori mancanti, poiché le osservazioni potrebbero differire tra maschi e femmine. In tal caso, potresti calcolare la media delle osservazioni femminili e poi riempire i valori mancanti degli altri record “femmina” con questa media. Stimare il valore con l’aiuto di regressione, ANOVA, regressione logistica o un’altra tecnica di modellazione. È il modo di gran lunga più complesso per riempire i valori. Riempire le celle con i valori dei record più simili a quello con valori mancanti. In questi casi puoi usare KNN o K-Nearest Neighbors. Nota che ogni metodo sopra ha vantaggi e svantaggi! Prima di decidere, considera aspetti come tempo, costi, natura dei dati, ecc.
Dopo aver deciso come gestire i dati mancanti, continua a leggere per vedere come implementare le modifiche desiderate.
Riempire i valori mancanti Se decidi di riempire i valori con imputazione, puoi ancora scegliere come farlo!
Usa fillna() di Pandas in combinazione con le funzioni offerte da NumPy. Considera il seguente blocco di codice, in cui ipotizziamo di avere un DataFrame con i risultati di un sondaggio che chiede lo stipendio delle persone. Supponendo un contesto in cui il tuo pubblico appartiene alla stessa classe sociale e la probabilità che rispondano alla domanda è la stessa per ogni persona, puoi calcolare la media di chi ha risposto e usarla per riempire i valori di chi non ha risposto.
# Import NumPyimport numpy as np# Calculate the meanmean = np. mean ( df. Salary) # Replace missing values with the meandf. = df. Salary. fillna ( mean) Offerto da Ovviamente, non è necessario passare un valore a fillna(). Puoi anche propagare i valori non nulli in avanti o indietro aggiungendo l’argomento method alla funzione fillna(). Passa ffill o bfill per specificare se vuoi riempire i valori in avanti o all’indietro.
Eliminare etichette con valori mancanti Per escludere colonne o righe che contengono valori mancanti, puoi usare la funzione dropna() di Pandas:
# Drop rows with missing valuesdf. dropna ( axis= 0 ) # Drop columns with missing values df. dropna ( axis= 1 ) Offerto da Interpolazione In alternativa, puoi scegliere di interpolare i valori mancanti: la funzione interpolate() eseguirà un’interpolazione lineare nei punti di dati mancanti per “indovinare” il valore più probabile da inserire.
df. interpolate ( ) Offerto da Puoi anche aggiungere l’argomento method per accedere a metodi di interpolazione più sofisticati, come quella polinomiale o cubica, ma per usare questi tipi di interpolazione devi avere SciPy installato.
Ovviamente, l’interpolazione ha dei limiti, soprattutto se i valori NaN da interpolare sono troppo lontani dall’ultima osservazione valida. In tali casi, vuoi aggiungere un argomento limit al codice originale. Passi un intero positivo e questo numero determinerà quante osservazioni dopo un valore non-NaN verranno riempite. La direzione predefinita del limite è forward, ma anche questo puoi cambiarlo aggiungendo limit_direction
Outlier Così come i valori mancanti, i tuoi dati possono contenere anche valori che divergono fortemente dalla grande maggioranza degli altri. Questi punti dati sono chiamati “outlier”. Per trovarli, puoi verificare la distribuzione delle singole variabili con un box plot oppure creare uno scatter plot per identificare i punti che non ricadono nell’area “attesa” del grafico.
Le cause degli outlier possono variare, dai problemi di sistema all’interferenza umana durante l’inserimento o l’elaborazione dei dati, ma è importante considerare l’effetto che possono avere sulla tua analisi: alterano i risultati di test statistici come deviazione standard, media o mediana, possono ridurre la normalità e influenzare i risultati di modelli statistici, come regressione o ANOVA.
Per gestire gli outlier, puoi eliminarli, trasformarli o imputarli: la decisione dipenderà ancora una volta dal contesto dei dati. Ecco perché è di nuovo importante capire i dati e identificare la causa degli outlier:
Se il valore anomalo è dovuto a errori di inserimento o elaborazione, potresti considerare di eliminarlo. Puoi trasformare gli outlier assegnando pesi alle osservazioni o usando il logaritmo naturale per ridurre la variazione causata dagli outlier. Come per i valori mancanti, puoi usare metodi di imputazione per sostituire i valori estremi con mediana, media o moda. Puoi usare le funzioni descritte nella sezione precedente per gestire gli outlier nei dati.
Le feature dei tuoi dati Nota che questo passaggio è iterativo insieme ad altri compiti di data science: costruirai i modelli e li validerai, ma poi potresti decidere di modificare le feature e iterare nuovamente sulla costruzione del modello, ecc.
Pattern nei tuoi dati Uno dei passaggi successivi nell’esplorazione è l’identificazione di pattern nei dati, incluse le correlazioni tra attributi o tra dati mancanti. Una delle cose che aiuta è la visualizzazione; e non deve essere statica: osa usare visualizzazioni interattive con le librerie Python Bokeh o Plotly.
Identificare correlazioni con Matplotlib Ora che hai guardato i numeri e analizzato i dati in modo quantitativo, può essere utile considerarli anche visivamente. È il momento di esplorarli anche visivamente.
Per farlo in modo semplice e rapido puoi usare la libreria di visualizzazione Matplotlib. L’unico ostacolo, ironicamente, sono i tuoi dati: come ben sai, hanno 64 colonne o feature. Quando hai così tante feature, si parla di dati ad alta dimensionalità.
Imparerai cos’è esattamente la dimensionalità nel nostro tutorial di machine learning, ma per ora è importante capire che, se vuoi visualizzare i dati in un grafico 2D o 3D, ti servono solo due o tre dimensioni. Questo significa che devi ridurre le dimensioni dei dati.
Quindi dovrai usare tecniche di riduzione della dimensionalità, come la Principal Component Analysis (PCA):
# Import `PCA` from `sklearn.decomposition`
from sklearn.decomposition import ___
# Build the model
pca = PCA(n_components=2)
# Reduce the data, output is ndarray
reduced_data = pca.fit_transform(_______)
# Inspect the shape of `reduced_data`
reduced_data.______
# print out the reduced data
print(_______________)
Quando ispezioni i dati ridotti, noterai che le colonne o feature sono state ridotte a due soltanto. Il numero di righe o osservazioni è ancora lo stesso, cioè 3823. E ora che i dati sono nel formato giusto, è il momento di passare al plotting!
La scelta del grafico giusto è già un ottimo inizio, ma cosa sceglierai?
In questo caso stai esplorando i dati, quindi probabilmente vuoi scoprire possibili correlazioni tra gli attributi. Uno scatter plot è probabilmente una buona scelta: ti permette di identificare una relazione tra le due feature ottenute dalla riduzione della dimensionalità.
import matplotlib. pyplot as pltplt. scatter ( reduced_data[ : , 0 ] , reduced_data[ : , 1 ] , c= labels, cmap = 'viridis' ) plt. show ( ) Offerto da
Identificare correlazioni con Bokeh In secondo luogo, puoi considerare l’uso di Bokeh per costruire un grafico interattivo con cui scoprire correlazioni tra gli attributi nei tuoi dati. Bokeh è una libreria Python per la visualizzazione interattiva pensata per i browser moderni. È ideale se lavori con dataset grandi o in streaming, ma come vedi nel seguente esempio, puoi usarla anche con dati “normali”.
Il codice è molto semplice: importi i moduli necessari, costruisci lo scatter plot, configuri lo stato di output predefinito per generare un file quando viene chiamato show(). Infine, chiami show() per vedere lo scatter plot costruito!
# Import the necessary modulesfrom bokeh. charts import Scatter, output_file, show# Construct the scatter plotp = Scatter ( iris, x= 'Petal_length' , y= 'Petal_width' , color= "Class" , title= "Petal Length vs Petal Width" , xlabel= "Sepal Length" , ylabel= "Sepal Width" ) # Output the file output_file ( 'scatter.html' ) # Show the scatter plotshow ( p) Offerto da Il risultato è elegante:
Nota che questa è un’immagine statica del grafico, ma il grafico risultante nel tuo notebook o terminale sarà interattivo! Naturalmente, questo è solo un semplice esempio di come usare Bokeh per creare grafici interattivi. Dai un’occhiata alla Bokeh Gallery per ispirazione o segui il corso di DataCamp Interactive Data Visualization with Bokeh .
Identificare correlazioni con Pandas I grafici che hai visto nelle sezioni precedenti sono un modo visivo per esplorare la correlazione tra gli attributi dei tuoi dati. Ma questo non significa che tu non possa esplorare questa misura anche in modo quantitativo! Quando decidi di farlo, usa la funzione corr() di Pandas. Tieni però presente che i valori NaN o null vengono esclusi da questo calcolo!
# Pearson correlation
iris.corr()
# Kendall Tau correlation
iris.corr('kendall')
# Spearman Rank correlation
iris.corr('spearman')
Nota che le ultime due misure di correlazione richiedono di ordinare i dati prima di calcolare i coefficienti. Puoi farlo facilmente con rank(): per l’esercizio sopra, i dati iris sono stati ordinati eseguendo per te iris.rank().
Inoltre, queste correlazioni lavorano con alcune assunzioni: la correlazione di Pearson presuppone che le variabili siano distribuite normalmente, che esista una relazione lineare tra ciascuna delle variabili e che i dati siano distribuiti normalmente attorno alla retta di regressione. La correlazione di Spearman, invece, presuppone di avere due variabili ordinali o due variabili correlate in qualche modo, ma non linearmente.
La correlazione di Kendall Tau è un coefficiente che rappresenta il grado di concordanza tra due colonne di dati ordinati. Puoi usare la correlazione di Spearman per misurare il grado di associazione tra due variabili. Sembrano molto simili, vero?
Anche se le misure di Kendall e Spearman sembrano simili, differiscono: la differenza sta nel fatto che i calcoli sono diversi. Il coefficiente Kendall Tau è calcolato come il numero di coppie concordanti meno il numero di coppie discordanti diviso per il numero totale di coppie. Il coefficiente di Spearman è la somma degli scarti al quadrato divisa per n volte n meno 1.
Il coefficiente di Spearman di solito è maggiore del Kendall’s Tau, ma non sempre: otterrai un coefficiente di Spearman più piccolo quando le deviazioni tra le osservazioni dei tuoi dati sono grandi. La correlazione di Spearman è molto sensibile a questo e ciò può tornare utile in alcuni casi!
Quindi, quando usare quale coefficiente, dato che questi due testano in realtà cose diverse? Il Kendall’s Tau rappresenta la proporzione di coppie concordanti rispetto alle discordanti, mentre il coefficiente di Spearman non lo fa. Si può anche sostenere che la correlazione Kendall Tau abbia un’interpretazione più intuitiva e sia più facile da calcolare, che fornisca una stima migliore del corrispondente parametro di popolazione e che i p-value siano più accurati su campioni piccoli.
Consiglio aggiungi la funzione print() per vedere i risultati dei calcoli di correlazione specifici tra colonne.
Come saprai ormai, la libreria Python per la manipolazione dei dati Pandas serve per manipolare i dati; per chi è alle prime armi, questo potrebbe far pensare che il pacchetto sia utile solo nella fase di preprocessing, ma non è affatto così: Pandas è ottimo anche per esplorare i dati e per salvarli dopo che hai terminato il preprocessing.
Inoltre, per chi ha seguito i tutorial Python di DataCamp o è già stato introdotto alle basi di SciPy, NumPy, Matplotlib e Pandas, potrebbe essere una buona idea ripassare alcune delle nozioni acquisite.
Il tutorial di oggi ti presenterà alcuni modi per esplorare i tuoi dati in modo efficace con tutti i pacchetti sopra citati, così da poter iniziare a modellare i tuoi dati: