Per prima cosa, all'inizio del lavoro con un nuovo set di dati, è necessario comprenderlo. Per farlo, ad esempio, si deve determinare l'intervallo di valori accettabili per le variabili, i loro tipi e anche scoprire quanti valori mancanti ci sono.
La libreria pandas ci offre molti strumenti utili per eseguire l'analisi esplorativa dei dati (Exploratory Data Analysis, EDA). Tuttavia, prima di utilizzarli, di solito è necessario partire da funzioni più generali, come df.describe(). Va notato che le capacità fornite da tali funzioni sono limitate, e le fasi iniziali di lavoro con qualsiasi set di dati nell'ambito dell'EDA sono spesso molto simili tra loro.
L'autore del materiale che pubblichiamo oggi afferma di non essere un amante delle azioni ripetitive. Di conseguenza, nella ricerca di strumenti che permettano di svolgere velocemente ed efficacemente l'analisi esplorativa dei dati, ha trovato la libreria . I risultati del suo lavoro non si presentano sotto forma di indicatori separati, ma come un dettagliato report HTML, contenente gran parte delle informazioni sui dati analizzati necessarie prima di iniziare un lavoro più approfondito.
Qui verranno esaminate le peculiarità dell'uso della libreria pandas-profiling con l'esempio del set di dati Titanic.
Analisi esplorativa dei dati con pandas
Ho deciso di sperimentare con pandas-profiling sul set di dati Titanic poiché contiene dati di diversi tipi e presenta valori mancanti. Credo che la libreria pandas-profiling sia particolarmente interessante nei casi in cui i dati non siano ancora puliti e richiedano ulteriori elaborazioni in base alle loro peculiarità. Per poter eseguire con successo tale elaborazione, è necessario sapere da dove partire e a cosa prestare attenzione. Qui ci verranno in aiuto le possibilità di pandas-profiling.
Per cominciare, importiamo i dati e utilizziamo pandas per ottenere indicatori di statistica descrittiva:
# импорт необходимых пакетов
import pandas as pd
import pandas_profiling
import numpy as np
# импорт данных
df = pd.read_csv('/Users/lukas/Downloads/titanic/train.csv')
# вычисление показателей описательной статистики
df.describe()Dopo l'esecuzione di questo frammento di codice, si otterrà quanto mostrato nell'immagine seguente.

Indicatori di statistica descrittiva ottenuti mediante i mezzi standard di pandas
Sebbene contenga molte informazioni utili, qui non c'è tutto ciò che sarebbe interessante sapere sui dati esaminati. Ad esempio, si può supporre che nel frame di dati, nella struttura DataFrame, ci siano 891 righe. Se serve verificare ciò, sarà necessaria un'altra riga di codice per determinare la dimensione del frame. Anche se questi calcoli non sono particolarmente dispendiosi, la loro ripetizione costante porterà sicuramente a perdere tempo, tempo che probabilmente sarebbe meglio dedicare alla pulizia dei dati.
Analisi esplorativa dei dati con pandas-profiling
Ora faremo lo stesso utilizzando pandas-profiling:
pandas_profiling.ProfileReport(df)L'esecuzione della riga di codice sopraindicata genererà un rapporto con indicatori di analisi esplorativa dei dati. Il codice mostrato sopra porterà all'output delle informazioni trovate sui dati, ma si può fare in modo che il risultato sia un file HTML, che per esempio, si può mostrare a qualcun altro.
La prima parte del rapporto conterrà la sezione Overview (Panoramica), che fornisce informazioni di base sui dati (numero di osservazioni, numero di variabili, e così via). Inoltre, conterrà un elenco di avvertenze che avvisa l'analista su cosa prestare particolare attenzione. Queste avvertenze possono servire come suggerimenti su dove concentrare gli sforzi per la pulizia dei dati.

Sezione del rapporto Overview
Analisi esplorativa delle variabili
Dopo la sezione Overview, nel rapporto si possono trovare informazioni utili su ciascuna variabile. Queste includono, tra l'altro, piccoli grafici che descrivono la distribuzione di ciascuna variabile.

Informazioni sulla variabile numerica Age
Come si può vedere dall'esempio precedente, pandas-profiling ci fornisce diversi indicatori utili, come la percentuale e il numero di valori mancanti, nonché indicatori di statistica descrittiva che abbiamo già visto. Poiché Age è una variabile numerica, la visualizzazione della sua distribuzione sotto forma di istogramma ci consente di concludere che abbiamo a che fare con una distribuzione inclinata a destra.
Esaminando una variabile categoriale, gli indicatori riportati differiscono leggermente da quelli trovati per la variabile numerica.

Informazioni sulla variabile categoriale Sex
In particolare, invece di trovare la media, il minimo e il massimo, la libreria pandas-profiling ha trovato il numero di classi. Poiché Sesso — una variabile binaria, i cui valori sono rappresentati da due classi.
Se, come me, ami esplorare il codice, potresti essere interessato a come la libreria pandas-profiling calcola queste metriche. Scoprire questo, considerando che il codice della libreria è aperto e disponibile su GitHub, non è così difficile. Poiché non sono un grande amante dell'uso di 'scatole nere' nei miei progetti, ho dato un'occhiata al codice sorgente della libreria. Ad esempio, ecco come appare il meccanismo di elaborazione delle variabili numeriche, presentato dalla funzione :
def describe_numeric_1d(series, **kwargs):
"""Calcola le statistiche riassuntive di una variabile numerica (`TYPE_NUM`) (una Serie).
Crea anche istogrammi (mini e completi) della sua distribuzione.
Parametri
----------
series : Serie
La variabile da descrivere.
Ritorna
-------
Serie
La descrizione della variabile come una Serie con indice che sono le chiavi delle statistiche.
"""
# Formatta un numero come una percentuale. Ad esempio, 0.25 diventerà 25%.
_percentile_format = "{:.0%}"
stats = dict()
stats['type'] = base.TYPE_NUM
stats['mean'] = series.mean()
stats['std'] = series.std()
stats['variance'] = series.var()
stats['min'] = series.min()
stats['max'] = series.max()
stats['range'] = stats['max'] - stats['min']
# Per evitare di calcolarlo più volte
_series_no_na = series.dropna()
for percentile in np.array([0.05, 0.25, 0.5, 0.75, 0.95]):
# La dropna() è un workaround per https://github.com/pydata/pandas/issues/13098
stats[_percentile_format.format(percentile)] = _series_no_na.quantile(percentile)
stats['iqr'] = stats['75%'] - stats['25%']
stats['kurtosis'] = series.kurt()
stats['skewness'] = series.skew()
stats['sum'] = series.sum()
stats['mad'] = series.mad()
stats['cv'] = stats['std'] / stats['mean'] if stats['mean'] else np.NaN
stats['n_zeros'] = (len(series) - np.count_nonzero(series))
stats['p_zeros'] = stats['n_zeros'] * 1.0 / len(series)
# Istogrammi
stats['histogram'] = histogram(series, **kwargs)
stats['mini_histogram'] = mini_histogram(series, **kwargs)
return pd.Series(stats, name=series.name) Sebbene questo frammento di codice possa sembrare abbastanza grande e complesso, in realtà è molto semplice da comprendere. Si tratta del fatto che nel codice sorgente della libreria esiste una funzione che determina i tipi di variabili. Se si scopre che la libreria ha incontrato una variabile numerica, la funzione sopra menzionata troverà le metriche che abbiamo esaminato. In questa funzione vengono utilizzate le operazioni standard di pandas per lavorare con oggetti di tipo Serie, come series.mean(). I risultati dei calcoli vengono memorizzati in un dizionario stats. Gli istogrammi vengono generati utilizzando una versione adattata della funzione matplotlib.pyplot.hist. L'adattamento è mirato affinché la funzione possa lavorare con vari tipi di set di dati.
Indicatori di correlazione e campione di dati esaminati
Dopo i risultati dell'analisi delle variabili di pandas-profiling, nella sezione Correlazioni verranno visualizzate le matrici di correlazione di Pearson e Spearman.

Matrice di correlazione di Pearson
Se necessario, puoi impostare i valori soglia nella riga di codice che avvia la generazione del report, applicabili al calcolo della correlazione. In questo modo, puoi specificare quale forza di correlazione è considerata significativa per la tua analisi.
Infine, nel report di pandas-profiling, nella sezione Campione, viene mostrato un frammento di dati preso dall'inizio del set di dati. Questo approccio può portare a sorprese sgradite, poiché le prime osservazioni potrebbero rappresentare un campione che non riflette le peculiarità dell'intero set di dati.

Sezione contenente un campione di dati esaminati
Pertanto, non consiglio di prestare attenzione a quest'ultima sezione. È meglio utilizzare il comando df.sample(5), che selezionerà casualmente 5 osservazioni dal set di dati.
Conclusioni
In conclusione, si può notare che la libreria pandas-profiling offre agli analisti alcune funzionalità utili, che si rivelano preziose nei casi in cui si desidera ottenere rapidamente una panoramica generale dei dati o trasmettere a qualcuno un report di analisi esplorativa dei dati. Tuttavia, il vero lavoro con i dati, tenendo conto delle loro peculiarità, viene svolto, come senza l'uso di pandas-profiling, manualmente.
Se desideri vedere com'è l'intera analisi esplorativa dei dati in un unico notebook Jupyter, dai un'occhiata al mio progetto, creato con nbviewer. E nel repository di GitHub puoi trovare il codice corrispondente.
Gentili lettori! Da dove inizi ad analizzare nuovi set di dati?
Fonte: habr.com
