Rilevare leggi di potenza nei dati del mondo reale con Python

Rilevamento delle tendenze di potenza nei dati del mondo reale attraverso l'uso di Python

Scomposizione di un approccio basato sulla verosimiglianza massima con codice di esempio

Questo è il secondo articolo di una serie su Leggi di Potenza e Code Grasse. Nel post precedente, ho dato una introduzione amichevole per principianti sulle leggi di potenza e ho presentato 3 problemi con i nostri strumenti statistici standard nell’analizzarle. Nonostante la consapevolezza possa aiutarci a evitare questi problemi, non è sempre chiaro quale distribuzione segua in pratica alcuni dati dati. In questo articolo, descriverò come rilevare oggettivamente le leggi di potenza dai dati del mondo reale e condividerò un esempio concreto con dati dai social media.

Nota: se sei sconosciuto con termini come distribuzione di legge di potenza o code grasse, rivedi il primo articolo di questa serie come introduzione.

Foto di Luke Chesser su Unsplash

Le leggi di potenza rompono STAT 101

Nell’articolo precedente, ci siamo concentrati su due tipi di distribuzioni: la distribuzione gaussiana e la distribuzione di legge di potenza. Abbiamo visto che queste distribuzioni hanno proprietà statistiche diametralmente opposte. In particolare, le leggi di potenza sono determinate da eventi rari, mentre le gaussiane no.

Distribuzioni gaussiane e di legge di potenza di esempio, rispettivamente. Immagine dell'autore

Questo tratto determinato da eventi rari ha portato a 3 problemi con molti dei nostri strumenti statistici preferiti (ad es. media, deviazione standard, regressione, ecc.) nell’analisi delle leggi di potenza. La conclusione è che se i dati sono simili a distribuzioni gaussiane, si possono utilizzare approcci comuni come la regressione e il calcolo dei valori attesi senza preoccupazioni. Tuttavia, se i dati sono più simili a leggi di potenza, queste tecniche possono fornire risultati errati e fuorvianti.

Abbiamo anche visto una terza distribuzione (più maliziosa) che poteva assomigliare sia a una gaussiana che a una legge di potenza (nonostante le loro proprietà opposte) chiamata una distribuzione log-normale.

La distribuzione log-normale (maliziosa) appare sia simile a una gaussiana che a una legge di potenza. Immagine dell'autore.

Questa ambiguità presenta sfide per i professionisti nel decidere il miglior modo per analizzare un determinato set di dati. Per aiutare a superare queste sfide, può essere vantaggioso determinare se i dati si adattano a una legge di potenza, log-normale o a un altro tipo di distribuzione.

Approccio Log-Log

Un modo popolare per adattare una legge di potenza ai dati del mondo reale è quello che chiamerò “approccio Log-Log” [1]. L’idea deriva dal prendere il logaritmo della funzione di densità di probabilità (PDF) della legge di potenza, come derivato di seguito.

Prendere il logaritmo della funzione di distribuzione di probabilità delle leggi di potenza [2]. Immagine dell'autore.

La derivazione sopra traduce la definizione della PDF della Legge di Potenza in un’equazione lineare, come mostrato nella figura seguente.

Evidenzia la forma lineare del log(PDF). Immagine dell'autore.

Ciò implica che l’istogramma dei dati che seguono la legge di potenza seguirà una linea retta. In pratica, ciò significa generare un istogramma per alcuni dati e tracciarlo su un grafico log-log [1]. Si potrebbe andare ancora oltre e eseguire una regressione lineare per stimare il valore α della distribuzione (qui, α = -m+1).

Tuttavia, ci sono significative limitazioni a questo approccio. Queste sono descritte nel riferimento [1] e riassunte di seguito.

  • Le stime della pendenza (quindi di α) sono soggette a errori sistemici
  • Gli errori di regressione possono essere difficili da stimare
  • Il fit può sembrare buono anche se la distribuzione non segue una legge di potenza
  • I fit potrebbero non rispettare condizioni di base per le distribuzioni di probabilità, ad esempio la normalizzazione

Approccio Massima Verosimiglianza

Mentre l’approccio Log-Log è semplice da implementare, le sue limitazioni lo rendono meno ottimale. Invece, possiamo rivolgerci a un approccio più matematicamente valido tramite la Massima Verosimiglianza, un metodo statistico ampiamente utilizzato per inferire i migliori parametri per un modello dati alcuni dati.

La Massima Verosimiglianza consiste di 2 passaggi chiave. Passo 1: ottenere una funzione di verosimiglianza. Passo 2: massimizzare la verosimiglianza rispetto ai parametri del modello.

Passo 1: Scrivi la Funzione di Verosimiglianza

La verosimiglianza è un tipo speciale di probabilità. In poche parole, essa quantifica la probabilità dei nostri dati dati un particolare modello. Possiamo esprimerla come la probabilità congiunta su tutti i nostri dati osservati [3]. Nel caso di una distribuzione di Pareto, possiamo scriverla come segue.

Funzione di verosimiglianza per la distribuzione di Pareto (ossia un tipo speciale di legge di potenza) [4]. Nota: quando si lavora con funzioni di verosimiglianza, le osservazioni (ossia x_i) sono fisse mentre i parametri del modello sono quelli che variano. Immagine dell'autore.

Per rendere più semplice la massimizzazione della verosimiglianza, è consueto lavorare con la log-verosimiglianza (vengono massimizzate dallo stesso valore di α).

Derivazione della log-verosimiglianza [4]. Immagine dell'autore.

Passo 2: Massimizza la Verosimiglianza

Con una funzione di verosimiglianza (logaritmica) a disposizione, possiamo ora formulare il compito di determinare la migliore scelta dei parametri come un problema di ottimizzazione. Per trovare il valore ottimale di α basato sui nostri dati, questo si riduce a impostare la derivata di l(α) rispetto ad α uguale a zero e quindi risolvere per α. Una derivazione di ciò è fornita di seguito.

Derivazione dell'estimatore di massima verosimiglianza per α [4]. Immagine dell'autore.

Questo ci fornisce quello che viene chiamato stimatore della Massima Verosimiglianza per α. Con questo, possiamo inserire i valori osservati di x per stimare il valore α di una distribuzione di Pareto.

Con le fondamenta teoriche stabilite, vediamo come questo si applica ai dati del mondo reale (dai miei account sui social media).

Esempio di codice: Adattamento Power Law ai dati dei social media

Un settore in cui sono prevalenti i dati a coda grassa è quello dei social media. Ad esempio, una piccola percentuale di creatori ottiene la maggior parte dell’attenzione, una minoranza di blog VoAGI ottiene la maggior parte delle letture, e così via.

Qui useremo la libreria Python powerlaw per determinare se i dati dai miei vari canali di social media (cioè VoAGI, YouTube, LinkedIn) seguono realmente una distribuzione Power Law. I dati e il codice per questi esempi sono disponibili nel repository di GitHub.

YouTube-Blog/power-laws/2-detecting-powerlaws at main · ShawhinT/YouTube-Blog

Codici per completare i video di YouTube e i post del blog su VoAGI. – YouTube-Blog/power-laws/2-detecting-powerlaws at main ·…

github.com

Dati Artificiali

Prima di applicare l’approccio basato sulla Massima Verosimiglianza ai dati non strutturati del mondo reale, vediamo cosa succede quando applichiamo questa tecnica a dati artificiali generati (veramente) dalle distribuzioni di Pareto e Log Normale, rispettivamente. Questo ci aiuterà a stabilire le nostre aspettative prima di utilizzare l’approccio su dati in cui non conosciamo la classe sottostante “vera” della distribuzione.

Prima di tutto, importiamo alcune librerie utili.

import numpy as npimport matplotlib.pyplot as pltimport powerlawimport pandas as pdnp.random.seed(0)

Quindi generiamo dati dalle distribuzioni di Pareto e Log Normale.

# dati di legge poterea = 2x_min = 1n = 1_000x = np.linspace(0, n, n+1)s_pareto = (np.random.pareto(a, len(x)) + 1) * x_min# dati log normalim = 10s = 1s_lognormal = np.random.lognormal(m, s, len(x)) * s * np.sqrt(2*np.pi)

Per avere un’idea di come appaiano questi dati, è utile tracciare degli istogrammi. Qui traccio un istogramma dei valori grezzi di ciascun campione e il log dei valori grezzi. Quest’ultima distribuzione rende più facile distinguere visivamente tra dati Power Law e Log Normal.

Istogrammi dei dati dalla distribuzione Power Law. Immagine dell'autore.
Istogrammi dei dati dalla distribuzione Log Normal. Immagine dell'autore.

Come possiamo vedere dagli istogrammi sopra, le distribuzioni dei valori grezzi sembrano simili qualitativamente per entrambe le distribuzioni. Tuttavia, possiamo vedere una differenza significativa nelle distribuzioni logaritmiche. In particolare, la distribuzione logaritmica Power Law è altamente asimmetrica e non centrata sulla media, mentre il logaritmo della distribuzione Log Normale ricorda una distribuzione Gaussiana.

Ora, possiamo utilizzare la libreria powerlaw per adattare una Power Law a ciascun campione e stimare i valori per α e x_min. Ecco come appare per il nostro campione Power Law.

# adatta la potenza ai dati della legge del potereresults = powerlaw.Fit(s_pareto)# stampa dei risultatiprint("alpha = " + str(results.power_law.alpha)) # nota: la definizione di alpha di powerlaw lib è diversa dalla definizione standard, cioè a_powerlawlib = a_standard + 1print("x_min = " + str(results.power_law.xmin))print('p = ' + str(compute_power_law_p_val(results)))# Calcolo del miglior valore minimo per adattare la legge del potereresult# alpha = 2.9331912195958676# x_min = 1.2703447024073973# p = 0.999

La stima dei valori del parametro effettuata dal fitting fa un buon lavoro (cioè a=3, x_min=1), come si può vedere dai valori di alpha e x_min stampati sopra. Il valore p sopra quantifica la qualità del fitting. Un valore di p più alto indica un fitting migliore (ulteriori informazioni su questo valore nella sezione 4.1 di ref [1]).

Possiamo fare una cosa simile per la distribuzione Log Normale.

# fitting della potenza ai dati log normaliresults = powerlaw.Fit(s_lognormal)print("alpha = " + str(results.power_law.alpha)) # nota: la definizione di alpha della libreria powerlaw è diversa da quella standard, cioè a_powerlawlib = a_standard + 1print("x_min = " + str(results.power_law.xmin))print('p = ' + str(compute_power_law_p_val(results)))# Calcolo del miglior valore minimo per un fitting power law# alpha = 2.5508694755027337# x_min = 76574.4701482522# p = 0.999

Possiamo vedere che il campione Log Normale si adatta bene anche a una distribuzione Power Law (p=0.999). Tuttavia, si noti che il valore di x_min è molto nella coda. Sebbene questo possa essere utile per alcuni casi d’uso, non ci dice molto sulla distribuzione che si adatta meglio a tutti i dati del campione.

Per superare questo problema, possiamo impostare manualmente il valore di x_min al minimo del campione e rifare il fitting.

# fissando xmin in modo che il fitting debba includere tutti i datiresults = powerlaw.Fit(s_lognormal, xmin=np.min(s_lognormal))print("alpha = " + str(results.power_law.alpha))print("x_min = " + str(results.power_law.xmin))# alpha = 1.3087955873576855# x_min = 2201.318351239509

Il metodo .Fit() genera automaticamente anche stime per una distribuzione Log Normale.

print("mu = " + str(results.lognormal.mu))print("sigma = " + str(results.lognormal.sigma))# mu = 10.933481999687547# sigma = 0.9834599169175509

I valori stimati dei parametri Log Normale sono vicini ai valori effettivi (mu=10, sigma=1), quindi il fitting ha fatto ancora un buon lavoro!

Tuttavia, fissando x_min, abbiamo perso la nostra metrica di qualità p (per qualche motivo, il metodo non genera valori per essa quando viene fornito x_min). Quindi sorge la domanda, quali parametri di distribuzione dovrei utilizzare? Power Law o Log Normale?

Per rispondere a questa domanda, possiamo confrontare il fitting Power Law con altre distribuzioni candidate tramite rapporti di verosimiglianza logaritmica (R). Un valore R positivo implica che la Power Law si adatta meglio, mentre un valore R negativo implica che la distribuzione alternativa è migliore. Inoltre, ogni confronto ci fornisce un valore di significatività (p). Ciò è dimostrato nel blocco di codice sottostante.

distribution_list = ['lognormal', 'esponenziale', 'truncated_power_law', \      'stretched_exponential', 'lognormale_positiva']    for distribution in distribution_list:    R, p = results.distribution_compare('power_law', distribution)    print("power law vs " + distribution +           ": R = " + str(np.round(R,3)) +           ", p = " + str(np.round(p,3)))# power law vs lognormal: R = -776.987, p = 0.0# power law vs exponential: R = -737.24, p = 0.0# power law vs truncated_power_law: R = -419.958, p = 0.0# power law vs stretched_exponential: R = -737.289, p = 0.0# power law vs lognormal_positiva: R = -776.987, p = 0.0

Come mostrato sopra, ogni distribuzione alternativa è preferibile alla Power Law quando si includono tutti i dati nel campione Log Normale. Inoltre, in base ai rapporti di verosimiglianza, i fitting lognormale e lognormale_positiva funzionano meglio.

Dati reali

Ora che abbiamo applicato la libreria powerlaw a dati in cui conosciamo la verità fondamentale, proviamola su dati per i quali la distribuzione sottostante è sconosciuta.

Seguiremo una procedura simile a quella di cui sopra, ma con dati del mondo reale. Qui, analizzeremo i seguenti dati: follower mensili ottenuti nel mio profilo VoAGI, guadagni di tutti i miei video YouTube e impression giornaliere sulle mie pubblicazioni LinkedIn dell’ultimo anno.

Inizieremo tracciando gli istogrammi.

Istogrammi dei follower di VoAGI. Immagine dell'autore.
Istogrammi dei guadagni dei video di YouTube. Immagine dell'autore.
Istogrammi delle impressioni giornaliere di LinkedIn. Immagine dell'autore.

Due cose mi colpiscono da questi grafici. Uno, tutti e tre somigliano più agli istogrammi Log Normal che agli istogrammi Power Law che abbiamo visto in precedenza. Due, le distribuzioni di VoAGI e YouTube sono sparse, il che significa che potrebbero avere dati insufficienti per trarre conclusioni valide.

Successivamente, applicheremo l’adattamento della Legge di Potenza a tutte e tre le distribuzioni, impostando x_min come il valore più piccolo in ogni campione. I risultati di ciò sono stampati di seguito.

Stime dei parametri della Legge di Potenza e della Log Normal per i dati empirici. Immagine dell'autore.

Per determinare quale distribuzione sia migliore, possiamo confrontare nuovamente l’adattamento della Legge di Potenza con alcune alternative. Questi risultati sono riportati di seguito.

Confronto dell'adattamento della Legge di Potenza con distribuzioni alternative. Immagine dell'autore.

Utilizzando il valore di significatività di p<0,1 come punto di riferimento, possiamo trarre le seguenti conclusioni. I follower di VoAGI e le impressioni di LinkedIn si adattano meglio a una distribuzione Log Normal, mentre i guadagni di YouTube sono meglio rappresentati dalla Legge di Potenza.

Ovviamente, dato che i dati dei follower di VoAGI e degli incassi di YouTube qui sono limitati (N<100), dovremmo prendere qualsiasi conclusione da questi dati con le pinze.

Conclusione

Molti strumenti statistici standard non funzionano bene quando applicati a dati che seguono una distribuzione di Legge di Potenza. Pertanto, rilevare Leggi di Potenza nei dati empirici può aiutare i ricercatori a evitare analisi errate e conclusioni ingannevoli.

Tuttavia, le Leggi di Potenza sono un caso estremo del fenomeno più generale delle code grasse. Nel prossimo articolo di questa serie, faremo un passo ulteriore in avanti e quantificheremo la presenza di code grasse per qualsiasi dataset tramite 4 euristiche utili.

Pareto, Leggi di Potenza e Code Grasse

Cosa non insegnano in statistica

towardsdatascience.com

Risorse

Collegamenti: Il mio sito web | Prenota una chiamata | Chiedimi qualcosa

Social: YouTube 🎥 | LinkedIn | Twitter

Supporto: Offrimi un caffè ☕️

Gli imprenditori dei dati

Una comunità per gli imprenditori nello spazio dei dati. 👉 Unisciti al Discord!

VoAGI.com

[1] arXiv:0706.1062 [physics.data-an]

[2] arXiv:2001.10488 [stat.OT]

[3] https://it.wikipedia.org/wiki/Funzione_di_verosimiglianza

[4] https://it.wikipedia.org/wiki/Distribuzione_di_Pareto