• Home
  • Chi sono
  • Risorse
  • Contatti
  • Approfondimenti
  • Cerca nel sito

Lorenzo Govoni

Business e Tecnologia

  • Big Data
  • Business
  • Excel
  • Intelligenza Artificiale

Modello di regressione di Poisson in Python

Modello di regressione di Poisson

L’uso di Python per la scienza e l’analisi dei dati sta crescendo in popolarità e una delle ragioni per questo sono le eccellenti librerie di supporto (NumPy, SciPy, Pandas, Scikit-Learn e Matplotlib, per citare le più comuni).

In ambito statistico, sta avendo sempre più diffusione Statmodels, un “must” per poter valutare e analizzare modelli di regressione.

Questo articolo mostra come una caratteristica di Statsmodels, ovvero Generalized Linear Models (GLM), può essere utilizzata per costruire un modello di regressione di Poisson in Python per la comprensione dei dati di conteggio.

 

Scelta del dataset

Per l’analisi è stato scelto un dataset di Kaggle relativo al trasporto via bici a New York.

Questo set di dati è una registrazione giornaliera del numero di biciclette che attraversano o escono da Manhattan attraverso uno dei ponti dell’East River (nello specifico Brooklyn Bridge, Manhattan Bridge, Williamsburg Bridge e Queensboro Bridge).

Un conteggio del numero di biciclette su ciascuno dei ponti in questione è fornito quotidianamente, insieme a informazioni sulla temperatura massima, minima e sulle condizioni meteorologiche.

Puoi trovare il dataset qua, in formato csv, dopo esserti iscritto a Kaggle.

L’obiettivo del problema è tentare di capire se è possibile creare un modello di regressione di Poisson per il conteggio del numero di biciclette che attraversano i ponti di New York, e se esso è più efficace di un modello di regressione lineare.

Importare le librerie

La prima fase consiste nell’importare le varie librerie fondamentali di Python (pandas, seaborn e matplotlib). In aggiunta ad esse viene importata la libreria Statmodels.

 

Come suggerisce il nome, Statsmodels fornisce funzionalità di modellazione statistica in Python con una particolare forza nell’analisi econometrica e statistica. Si basa sulle funzionalità di NumPy/SciPy per la gestione di array numerici e funzioni scientifiche e si integra inoltre con Pandas per l’immissione di tabelle di dati.

 

Analizzare il dataset

Il secondo step necessario risulta quello di importare il dataset. Si noti che ho rinominato il file in “conteggio-bici a newyork.csv”. Al posto dei puntini, invece, va inserito il percorso dove è salvato il file in formato csv.

 

Con la stringa bici.head() invece andiamo a studiare la forma del dataset.

Possiamo vedere che esso è formato da 5 righe (perché spyder con questa funzione estrae solo le prime 5 righe) e 11 colonne.

 

La colonna “Unnamed: 0” non ci serve e quindi la possiamo cancellare:

Valutiamo ora il tipo dei dati delle varie colonne tramite l’oggetto dtypes:

La colonne sono di tipo float, int o object, come possiamo vedere dal risultato seguente:

 

 

Infine studiamo se all’interno del dataset abbiamo valori nulli in qualche colonna.

Il seguente risultato ci dice che nessun campo all’interno del dataset è vuoto.

Analisi descrittiva

Arrivati a questo punto può essere interessante procedere ad eseguire un’analisi descrittiva dei dati.

Tramite linguaggio python, ciò è molto semplice ed eseguibile tramite il seguente script:

Che ci darà il seguente risultato, dove possiamo vedere il numero dei dati (210), la media, la deviazione standard, il valore minimo e massimo della colonna Total:

 

 

Attraverso la funzione sns.displot poi visualizziamo l’andamento della distribuzione del dataset per vedere se esistono degli outliers, ossia delle eccezioni o punti solitari dell’analisi.

 

 

Stampiamo ora due parametri chiave dell’analisi statistica, l’asimmetria (skewness) e la curtosi (Kurtosis).

L’asimmetria rappresenta il grado di distorsione dalla curva a campana simmetrica. In altre parole, permette di misurare la mancanza di simmetria nella distribuzione dei dati. Una distribuzione simmetrica avrà un’asimmetria pari a 0. Al contrario:

  • Se l’asimmetria è compresa tra -0,5 e 0,5, i dati sono abbastanza simmetrici.
  • Se l’asimmetria è compresa tra -1 e -0,5  o tra 0,5 e 1, i dati sono moderatamente distorti.
  • Se l’asimmetria è inferiore a -1 o maggiore di 1, i dati sono fortemente distorti.

La curtosi riguarda invece le code della distribuzione, non il picco o la piattezza. È usata per descrivere i valori estremi in un verso rispetto all’altro della coda. Anch’essa individua i valori anomali presenti nella distribuzione.

La curtosi viene in genere confrontata con quella di una distribuzione normale. A seconda del modo in cui viene calcolata, una distribuzione normale standard può assumere curtosi pari a 3 o a 0.

Pandas considera la curtosi di una distribuzione normale pari a 0 (vedi documentazione).

Il risultato del precedente script genera valori abbastanza simmetrici e con pochi outliers:

Creiamo ora una nuova colonna per la temperatura media sommando la più alta e la più bassa temperatura e poi dividiamo per 2.

Valutiamo la relazione lineare tra la temperatura media e il numero dei ciclisti totali:

Lanciando il precedente script otteniamo il seguente grafico:

 

 

Sembrerebbe che la linea così disegnata non rappresenti correttamente tutti i vari punti. La relazione lineare non è molto adatta a rappresentare la relazione tra temperatura media e numero di ciclisti.

 

Modello di regressione di Poisson

Siccome il numero di ciclisti è una variabile di conteggio, proviamo a creare il modello di regressione di Poisson.

Come prima cosa associamo alla variabile di input X la temperatura media e alla variabile di risposta il numero delle bici (si ricorda che un modello di regressione di Poisson, per essere efficace, deve avere la variabile di risposta che segua una distribuzione di Poisson).

 

 

La funzione add_constant della libreria Statmodels serve per aggiungere l’intercetta al modello (che chiamerà const), altrimenti non inclusa.

Successivamente creiamo il modello tramite la classe GLM e avvalendoci di una funzione di collegamento di poisson (link function).

Stampiamo poi il risultato del modello e otteniamo la seguente immagine:

 

 

Il modello così creato tramite la funzione di collegamento logaritmica è semplice perché:

  • Ha analizzato 210 osservazioni (che sono i dati del file);
  • Ha un grado di libertà;
  • Ha trovato il valore dei coefficienti dopo 4 iterazioni.

Possiamo scrivere quindi l’equazione del modello (con E si va ad indicare il valore dei residui):

y = e^(8,1461 + 0,0263 x + E)

Volendo rappresentare quanto sopra in un grafico, si può eseguire il seguente script.

 

 

Conclusione

In quest’articolo abbiamo visto come creare un modello di regressione di Poisson in Python.

La regressione di Poisson può essere utile nelle situazioni in cui si voglia prevedere variabili di conteggio, come il numero di decessi in un giorno, il numero di terremoti in un paese sismico.

Importante è definire una regione, solitamente un periodo temporale, e che la variabile di risposta (un conteggio) segua la distribuzione di Poisson.

Per il dataset analizzato, il modello di regressione creato è piuttosto semplice, ha poche iterazioni e un solo grado di libertà. Rappresenta con maggior precisione la relazione tra temperatura media e numero di ciclisti rispetto ad un modello di regressione lineare.

  • Una breve introduzione al modello di regressione di Poisson
    Una breve introduzione al modello di regressione di Poisson
  • Come costruire e manipolare un array Numpy
    Come costruire e manipolare un array Numpy
  • Python e le librerie principali per il machine learning
    Python e le librerie principali per il machine learning
  • Modello ARIMA: come prevedere le serie temporali
    Modello ARIMA: come prevedere le serie temporali
Share
Pin1
Share
Tweet

Intelligenza Artificiale Analisi dati, Python

  • Home
  • Archivio
  • Risorse
  • Newsletter
  • Cerca nel sito

Copyright © 2021 · Lorenzo Govoni - Privacy Policy