Applicare e utilizzare la distribuzione normale per la Scienza dei Dati

Utilizzo della distribuzione normale per la Scienza dei Dati.

Passaggi per la Scienza dei Dati

Revisione delle varie applicazioni della distribuzione normale per la Scienza dei Dati

(immagine dell'autore)

Introduzione

Una cosa che potrebbe essere estremamente difficile quando si inizia con la Scienza dei Dati è capire esattamente da dove inizia e finisce quel viaggio. Per quanto riguarda la fine del tuo percorso nella Scienza dei Dati, è importante ricordare che ogni giorno vengono compiuti progressi in questo campo e che ci saranno sicuramente nuovi avanzamenti: preparati a imparare molto. La Scienza dei Dati non consiste solo di Scienza, statistiche e programmazione, ma anche di diverse altre discipline.

Per ridurre al minimo l’aspetto travolgente della Scienza dei Dati, è importante assimilare le informazioni a piccoli passi. Certamente può essere divertente approfondire la ricerca e conoscere meglio aree specifiche del dominio: dati, programmazione, apprendimento automatico, analisi o Scienza. Sebbene ciò mi entusiasmi, a volte è anche bello concentrarsi su un argomento specifico e imparare tutto ciò che possiamo su di esso. Per i principianti, ha senso che questi domini interconnessi lascino un punto di partenza incerto. Una cosa di cui posso testimoniarne è che le statistiche e la distribuzione normale sono un ottimo punto di partenza quando si tratta di Scienza dei Dati. Ho scritto un articolo in cui ho spiegato perché è così e ho approfondito il tema della distribuzione normale. Faremo qui un breve riassunto di quell’articolo, ma molti dettagli saranno omessi.

La Prima Cosa da Imparare per le Statistiche della Scienza dei Dati – La Distribuzione Normale

Una panoramica e la programmazione di una semplice distribuzione normale.

chifi.dev

La distribuzione normale, come descritto sopra, è una semplice Funzione di Densità di Probabilità (PDF) che possiamo applicare ai nostri dati. Questa funzione, che chiameremo f, calcola il numero di deviazioni standard x rispetto alla media per f(x). Pensate. Abbiamo bisogno di deviazioni standard rispetto alla media, come potremmo verificare quante deviazioni standard un valore si discosta dalla media? Beh, innanzitutto dobbiamo vedere di quanto si discosta dalla media, giusto? Quindi dobbiamo vedere quante deviazioni standard ha questa differenza. Ed è esattamente ciò che facciamo nella formula. Quindi per ogni x sottraiamo la media e poi dividiamo la differenza per le deviazioni standard. Nelle statistiche, la sigma minuscola (σ) rappresenta la deviazione standard e la mu minuscola (µ) rappresenta la media. Nella formula sottostante, la x barra (x̄) rappresenta l’osservazione (la x in f(x) sopra.)

Prestare attenzione soprattutto alla parte evidenziata.

Nel linguaggio di programmazione

Alla fine dell’ultimo articolo, abbiamo portato tutto ciò in un linguaggio di programmazione – Julia. La scelta del linguaggio spetta interamente al Data Scientist, ma ci sono anche compromessi da considerare ed è anche importante considerare ciò che fa l’industria. Ad esempio, R è un linguaggio relativamente lento ma ha pacchetti di analisi che sono stati perfezionati e mantenuti per anni da ottimi sviluppatori, così come ottime strumenti per dashboard. La scelta più popolare oggi è probabilmente Python per la sua connessione rapida alle librerie C e la facilità d’uso. Julia è un linguaggio un po’ nuovo, ma è il mio linguaggio di programmazione preferito e penso che la maggior parte dei Data Scientist dovrebbe conoscerlo. Anche se Julia sta guadagnando rapidamente popolarità, conoscendo entrambi si ha sempre accesso a più opportunità di lavoro. Per fortuna, la maggior parte dei linguaggi popolari comunemente usati per la Scienza dei Dati tende ad avere molto in comune e finisce per essere abbastanza facile fare riferimento l’uno all’altro. Ecco la nostra distribuzione normale scritta in Python e nelle REPL di Julia, rispettivamente.

python

>>> from numpy import mean, std>>> x = [5, 10, 15]>>> normed = [(mean(x) - i) / std(x) for i in x]>>> print(normed)[1.224744871391589, 0.0, -1.224744871391589]

julia

julia> using Statistics: std, meanjulia> x = [5, 10, 15]Vector{Int64} con 3 elementi:  5 10 15julia> normed = [(mean(x) - i) / std(x) for i in x]Vector{Float64} con 3 elementi:  1.0  0.0 -1.0

Ecco anche i notebook per ogni linguaggio di programmazione. Farò dei notebook in tutti e tre i linguaggi per rendere questo tutorial accessibile a tutti e promuovere l’idea di impegnarsi con più linguaggi. Questi linguaggi sono piuttosto simili e abbastanza facili da leggere, quindi è abbastanza semplice confrontare e confrontare le differenze, vedere quali linguaggi ti piacciono e esplorare anche compromessi più approfonditi per ogni linguaggio.

notebooks

python

Emmetts-DS-NoteBooks/Python3/Applicazione della distribuzione normale (py).ipynb su master ·…

Quaderni casuali per vari progetti. Contribuisci allo sviluppo di Emmetts-DS-NoteBooks di emmettgb/Emmetts-DS-NoteBooks creando un account…

github.com

julia

Emmetts-DS-NoteBooks/Julia/Applicazione della distribuzione normale.ipynb su master ·…

Quaderni casuali per vari progetti. Contribuisci allo sviluppo di Emmetts-DS-NoteBooks di emmettgb/Emmetts-DS-NoteBooks creando un account…

github.com

Configurazione delle nostre funzioni

La prima cosa di cui abbiamo bisogno è una funzione che ci restituisca la normale di un Vector di numeri. Questo è semplicemente ottenere la media e la deviazione standard prima di inserire le due e i nostri xbars nella nostra formula. Questa funzione prenderà un argomento, il nostro Vector, e restituirà il nostro Vector normalizzato. Per questo, ovviamente abbiamo anche bisogno della media e della deviazione standard – potremmo usare le dipendenze per questo. In Python, useremmo le funzioni mean e std di Numpy. In Julia, useremmo Statistics.mean e Statistics.std. Invece, oggi faremo tutto da zero, quindi ecco le mie semplici funzioni di media e deviazione standard sia in Python che in Julia:

# pythonimport math as mtdef mean(x : int):    return(sum(x) / len(x))def std(arr : list):    m = mean(arr)    arr2 = [(i-m) ** 2 for i in arr]    m = mean(arr2)    m = mt.sqrt(m)    return(m)

# juliamean(x::Vector{<:Number}) = sum(x) / length(x)function std(array3::Vector{<:Number})    m = mean(array3)    [i = (i-m) ^ 2 for i in array3]    m = mean(array3)    try        m = sqrt(m)    catch        m = sqrt(Complex(m))    end    return(m)end

Ora che abbiamo alcune funzioni per ottenere i valori di cui abbiamo bisogno per la nostra funzione, dobbiamo racchiudere tutto questo in una funzione. Questo è abbastanza semplice, otterrò semplicemente la media e la deviazione standard della nostra popolazione utilizzando i nostri metodi sopra e quindi usando una comprensione per sottrarre la media da ogni osservazione e quindi dividere la differenza per le deviazioni standard.

# pythondef norm(x : list):    mu = mean(x)    sigma = std(x)    return([(xbar - mu) / sigma for xbar in x])

# juliafunction norm(x::Vector{<:Number})    mu::Number = mean(x)    sigma::Number = std(x)    [(xbar - mu) / sigma for xbar in x]::Vector{<:Number}end

Ora proviamo la nostra funzione di normalizzazione. Questo è facile da testare, forniamo semplicemente un vettore di cui conosciamo la media. Questo perché la media del nostro vettore dovrebbe essere zero. Quindi nel caso di [5, 10, 15], 0 sarebbe 10 – la media di [5, 10, 15]. 5 sarebbe circa -1.5, uno scarto standard dalla media (i nostri scarti standard sono pari a 2.5 numerici in queste circostanze).

norm([5, 10, 15])[-1.224744871391589, 0.0, 1.224744871391589]

I valori statisticamente significativi su una distribuzione normale in genere iniziano a essere notati quando sono quasi 2 scarti standard dalla media. In altre parole, se la maggior parte delle persone fosse alta circa 10 pollici e qualcuno fosse alto 20 pollici, questo sarebbe 3 scarti standard dalla media e abbastanza statisticamente significativo.

mu = mean([5, 10, 15])sigma = std([5, 10, 15])(15 - mu) / sigma1.5811388300841895(20 - mu) / sigma3.162277660168379

Normale per l’analisi

La distribuzione Z, o distribuzione normale, ha anche molte applicazioni nell’analisi dei dati. Questa distribuzione può essere utilizzata per i test, ma non è comunemente utilizzata come ad esempio un test T. Il motivo di ciò è che la distribuzione normale ha code piuttosto corte. Di conseguenza, è spesso riservata per i test eseguiti su campioni di grandi dimensioni in cui le varianze sono note. Confrontando la distribuzione normale con qualcosa come la distribuzione T, ad esempio, vediamo che le code della distribuzione T sono molto più lunghe. Ciò significa che c’è una maggiore area di significatività statistica, rendendo così più facile rilevare.

Solo per dare un'idea - le code della distribuzione T diventano più lunghe e la media meno ponderata man mano che i gradi di libertà diminuiscono. La distribuzione T sopra probabilmente ha circa 8 gradi di libertà, ma una distribuzione T con 1 grado di libertà sarebbe molto più piatta con code più ampie. Immagine dell'autore

Questo tipo di test, un test Z, verifica se le medie delle popolazioni sono sufficientemente diverse da essere statisticamente significative. La formula è anche molto simile alle formule che abbiamo visto dal PDF precedente, quindi non c’è molto di nuovo qui. Invece di utilizzare ogni osservazione, semplicemente cambiamo xbar per rappresentare la media della popolazione che vogliamo testare. Questo test restituirà qualcosa chiamato Z-statistica. Allo stesso modo di una T-statistica, questa viene elaborata attraverso un’altra funzione per darci un valore di probabilità. Creiamo un rapido set di osservazioni unidimensionali e vediamo come eseguiremmo un tale test.

pop = [5, 10, 15, 20, 25, 30]mu = mean(pop)sigma = std(pop)

Prenderemo un campione casuale dal mezzo e calcoleremo una Z-statistica:

xbar = mean(pop[3:5])

Ora inseriamo semplicemente questo nella nostra formula…

(xbar - mu) / sigma0.5976143046671968

Questo nuovo numero è la nostra Z-statistica. La matematica per trasformare questi valori di statistica in valori di probabilità è piuttosto complicata. Ci sono librerie in entrambi i linguaggi che aiutano in queste cose. Per Julia, consiglio HypothesisTests e per Python consiglio il modulo scipy. Per questo articolo, useremo un calcolatore online di Z-statistica in valore di probabilità disponibile qui. Inseriamo la nostra Z-statistica:

Immagine dell'autore

Come ci saremmo aspettati, una parte della nostra popolazione che risiede molto vicino al resto dei campioni e alla media non è affatto statisticamente significativa. Detto questo, possiamo naturalmente sperimentare con qualcosa di molto più significativo dal punto di vista statistico e respingere la nostra ipotesi nulla!

xbar = media([50, 25, 38])(xbar - mu) / sigma4.820755390982054
immagine dell'autore

La distribuzione normale funziona sicuramente bene per i test. La chiave è capire che questa forma di test richiede un campione di grandi dimensioni e non si applica a tutti i dati. Nella maggior parte dei casi, per i principianti, consiglierei di iniziare con una distribuzione con cui sia più facile fare i test, come la distribuzione T. I dati avranno un ruolo molto più importante per i test Z, e può essere difficile trovare grandi quantità di dati per i principianti, inoltre può essere più difficile ottenere un risultato statisticamente significativo, anche quando le cose sono statisticamente significative.

La distribuzione normale può essere utilizzata anche in qualche misura per un’analisi rapida durante i progetti di Data Science. Riuscire a trasformare i dati nella loro relazione con la popolazione può essere estremamente utile per tutto, dalla visualizzazione dei dati alla comprensione di quanto varia una determinata popolazione. Possiamo imparare molto su una popolazione indagando sulla relazione delle nostre osservazioni con la media. Se vuoi saperne di più su questo processo, ho una panoramica adatta ai principianti che potrebbe essere utile in un contesto del genere e che puoi leggere qui:

Un’introduzione amichevole per principianti alla scienza applicata

Impara le basi delle caratteristiche e dell’analisi statistica

towardsdatascience.com

Normale per la normalizzazione dei dati

Un’altra grande applicazione della distribuzione normale è utilizzare la distribuzione per normalizzare i dati. Ci sono alcune cose diverse che possono compromettere una caratteristica continua, una delle più significative sono gli outlier. Dobbiamo rimuovere gli outlier dai nostri dati in modo che i nostri dati siano una generalizzazione. Ricorda, la chiave per costruire dei dati eccellenti è costruire una grande popolazione. Quello che intendo è che vogliamo che la totalità dei dati, come la media, sia rappresentativa di come i dati sarebbero normalmente con un certo livello di varianza. In questo modo, quando qualcosa è diverso, diventa molto evidente.

Dato che la distribuzione normale ci dice quante deviazioni un valore ha rispetto alla media, potrebbe essere facile capire come potremmo usarla per la normalizzazione dei dati. Come detto in precedenza, 2.0 è il punto in cui le cose iniziano a diventare significative. Detto questo, possiamo creare una maschera e usarla per filtrare i valori errati!

# juliafunction drop_outls(vec::Vector{<:Number})    normed = norm(vec)    mask = [~(x <= -2 || x >= 2) for x in normed]    normed[mask]end

Con questa semplice maschera di filtraggio, abbiamo aggiunto la possibilità di capire se i valori si discostano molto dalla media e di eliminarli sulla base di questo. Nella maggior parte dei casi, potremmo voler sostituire questi outlier con la media in modo da non perdere l’osservazione su altre caratteristiche o sul nostro obiettivo.

# pythondef drop_outls(vec : list):    mu = mean(vec)    normed = norm(vec)    mask = [x <= -2 or x >= 2 for x in normed]    ret = []    for e in range(1, len(mask)):        if mask[e] == False:            ret.append(vec[e])        else:            ret.append(mu)    return(ret)

Normale per la scalatura

L’ultima applicazione della distribuzione normale che è comune nella Data Science è lo Standard Scaler. Lo Standard Scaler è semplicemente la distribuzione normale applicata ai tuoi dati. Questo scaler può essere incredibilmente utile perché aiuta a tradurre i tuoi dati in dati che sono più strettamente correlati alla caratteristica di cui fanno parte. Questo è estremamente utile per il machine learning e rende molto facile aumentare l’accuratezza di un modello, a condizione che tu abbia una caratteristica continua. Utilizzare lo Standard Scaler è estremamente semplice; basta usare la nostra PDF come prima e ottenere la caratteristica normalizzata.

myX = [1, 2, 3, 4, 5]normedx = norm(x)

Questo viene utilizzato per i dati forniti a un algoritmo di apprendimento automatico. La distribuzione normale viene spesso utilizzata per elaborare le caratteristiche continue in molti modelli di apprendimento automatico che vengono utilizzati quotidianamente.

In conclusione

In conclusione, la distribuzione normale è un fondamento base della statistica e della scienza dei dati che ha un uso estensivo in una moltitudine di applicazioni diverse nella scienza dei dati. Ci sono molti argomenti diversi in questo dominio che tendono a svilupparsi in questo modo; iniziano relativamente semplici e alla fine diventano piuttosto complicati. Certamente può essere interessante approfondire un argomento, e la distribuzione normale non fa eccezione in quanto è affascinante vedere quanto questa distribuzione essenziale e semplice sia capace. Grazie a tutti per la lettura, e spero che questa panoramica sia stata informativa!