sabato 29 settembre 2018

Comuni dell'Arberia

Avendo qualche ora libera ho pensato di fare una mappa dei comuni di Arberia.
Per chi non sapesse cos'è vi rimando alla pagina Wikipedia sull'argomento -> Arberia.

In pratica ho scritto in R uno scraper di tabelle per la pagina Wikipedia che riporta tutti i comuni d'Italia che ne fanno parte, poi con il package ggmap ho recuperato le coordinate.
Un pò di pulizia dei dati ed è già tutto pronto da caricare su uMap.
Non ho toccato nulla dalle informazioni di Wikipedia quindi non si offendano quelli che (come me) abitano in una frazione arbëreshë di un comune che non lo è 😉

Il codice e il geojson della mappa lo potete trovare sul mio github di seguito invece la mappa interattiva.



Visualizza a schermo intero

martedì 11 settembre 2018

Appunti di Data Science

Sempre più spesso il termine Data Science viene confuso con la previsione del futuro (nemmeno fossimo la zingara di Brera ☺).
La Data Science è un ecosistema complesso (fig. 1) in cui anche l'implementazione del modello di data mining/machine learning è una fase di un processo più ampio.
Vedendo nuovi aspiranti data scientist concentrarsi maggiormente su "potremmo applicare il modello X?" e poco su "che problema andiamo a risolvere?" ho pensato di scrivere questo post per chi vuole avvicinarsi alla disciplina.


fig. 1 data science


Solitamente per affrontare un progetto (che sia di data science o no) utilizzo l'approccio CRISP - DM.
Il CRoss-Industry Standard Process for Data Mining è ormai uno standard per i progetti di analisi dati e divide il problema in 6 fasi (fig.2).

fig.2 CRISP-DM Process
  1.  Comprensione del problema: questa è la fase più delicata, da qui deriva tutto il resto. Il mio consiglio è di investire più tempo in questa fase approfondendo (col cliente, col professore, ...) ciò che vi è richiesto. Vi eviterà molto lavoro nelle fasi successive.
  2. Comprensione dei dati: in questa fase con delle statistiche descrittive andiamo a scoprire cosa abbiamo a disposizione.
    1. Quante osservazioni e quante variabili ha il dataset?
    2. Per ogni variabile quanti valori mancanti?
    3. Per le variabili categoriali: quante categorie/valori distinti abbiamo?
    4. Per le variabili numeriche: minimo, massimo, media, mediana, quartili, deviazione standard.
  3.  Preparazione dei dati: ogni progetto ha le sue specifiche elaborazioni, qui cerco di riassumere le più comuni.
    1. Trattamento dei valori mancanti. Possono essere utilizzate diverse strategie a seconda di come è fatto il dataset e di quanto influiscono.
      1. Li imposto a zero? Sconsigliatissimo!
      2. Li sostituisco con media o mediana?
      3. Uso metodi di machine learning per predire il valore che manca?
      4. Uso l'interpolazione tra n valori prima e n dopo il mancante? (Molto usato nelle serie storiche)
    2. Trattamento Outlier. A meno che non lavoriamo proprio su outlier detection, e quindi cerchiamo proprio questi comportamenti anomali (es. scoprire frodi bancarie), questi valori "sporcano" il dataset, anche qui possono essere usate diverse strategie.
      1. Sostituire con la media o la mediana
      2. Sostituire con minimo o massimo
      3. Sostuire il valore usando modelli di machine learining
    3. Elaborazioni varie dipendenti dal problema da risolvere:
    4. fig.3 tidyverse è una libreria R per manipolare i dati
      1. Raggruppare secondo granularità spaziale/temporale
      2. Discretizzare variabili continue in range
      3. Creare variabili dummy
      4. Utilizzare metodi di Dimensionality Reduction (es. PCA)
      5. Remove Stopwords, Stemming (es. progetti NLP)
  4.  Modeling: finalmente arrivati al punto chiave, bisogna scegliere il modello da adottare. 
    1. La scelta dipende da:
      1. Che problema dobbiamo risolvere?
        Regressione? Classificazione? Pattern recognition? ...
        L'unico consiglio che mi sento di dare è di non esagerare con la complessità, non sempre un modello complesso è un modello migliore, anzi si può andare incontro ai fenomeni di overfitting e underfitting.
      2. Quanti dati abbiamo?
        Spesso ci si lancia sul deep learning perchè và molto di moda ma non abbiamo abbastanza dati per applicarli e quindi non danno quel vantaggio che dovrebbero.
    2.  Una volta scelti N modelli da valutare per ogni modello proponiamo un diverso tuning dei parametri (es. nel Random Forest il numero di alberi)
    3. Fatto questo "alleniamo" il modello su una parte del dataset (circa il 75% delle osservazioni) e lo testiamo sul restante.
      Se il test ci soddisfa scegliamo il modello migliore altrimenti si torna alla fase di tuning o a quella di preparazione del dato.

      [A questo link c'è un'ottimo cheatsheet sugli algoritmi di machine learning in R.]
  5.  Valutazione: in questa fase si valutano i risultati, se sono in linea con quanto richiesto nella prima fase ok, altrimenti si torna alla fase di comprensione del problema.
    Se il processo è andato a buon fine si valutano i possibili sviluppi futuri e le modifiche/miglioramenti apportabili. Tengo ad aggiungere che i modelli non sono statici ma và fatto un re-tuning dei parametri utilizzando i nuovi casi che si verranno a presentare, quindi in questa fase è importante anche calendarizzare anche questo.
  6. Deploy: se è tutto a posto il modello và in produzione. In questa fase durante gli anni di lavoro sono sempre stato affiancato da altre figure come Data Engineer, quindi è molto importante saper comunicare con altre figure del mondo Dati, nessun progetto può andare in porto con una sola figura seppur molto preparata.
Quanto scritto non è altro che una breve infarinatura sulla metodologia CRISP-DM con qualche aggiunta scaturita dall'esperienza.
Troppo spesso il Data Scientist è confuso con un mago (e questo a volte fa piacere) ma dietro a qualsiasi magia c'è sempre tanto metodo.

fig.4 Abatantuono interpreta "Il mago di Segrate"



giovedì 12 luglio 2018

Perchè non si può predire chi vincerà i mondiali di calcio?


I mondiali FIFA 2018 sono ormai all'atto finale, in questo mese man mano che alcune nazionali venivano eliminate è salito alla ribalta un articolo, e un modello di Machine Learning, che prevedeva una finale Germania - Brasile vinta dalla Germania.
Il link all'articolo è qui: https://www.kdnuggets.com/2018/06/football-world-cup-predictions.html

World Cup KDnuggets brackets
La Previsione di KDNuggets


Su vari forum e social network ho letto diversi commenti sul perchè il modello non abbia funzionato:
  • andava usato un altro modello
  • le fonti dati non erano quelle giuste
  • analisti scarsi
  • blablabla...
  • ...
Premesso che nel ML come nel calcio siamo tutti allenatori (del modello) al bar e l'assente ha sempre ragione.
Secondo me non è nessuno dei precedenti motivi ma il motivo principale è che i mondiali di calcio non sono prevedibili perchè:
  • il calcio è uno sport basato sul blitz: puoi essere il Brasile e giocare contro Taiwan, ma se ti fanno un gol in qualsiasi modo e si chiudono bene con un pò di fortuna Taiwan passa il turno;
L'imprevedibilità di Higuita che qualifica il Camerun
  • basarsi sui dati storici è inutile: ogni 4 anno le rose cambiano completamente: puoi avere squadre totalmente rinnovate (Francia 2014 vs Francia 2018) o squadre quasi uguali ma con 4 anni in più sulle spalle (Argentina 2014 vs Argentina 2018);
 
Totò Schillaci numero 9 del Palermo, Eto'o e Miccoli: una ...
Le "imprevedibili" notti magiche di Totò Schillaci
  • la competizione è talmente breve che una squadra/calciatore molto in forma può fare un'enorme differenza: vedi le notti magiche di Totò Schillaci in Italia 90 o il Brasile del 2002 che si qualifica a stento e poi vince il torneo.

Detto questo il calcio è il gioco più bello del mondo e quando si può unire passione e lavoro anche se i risultati non ci danno ragione "almeno ci siamo divertiti", quindi ben vengano questi esperimenti e per il mondiale 2022 in Quatar non dimenticatevi di inserire tra le variabili di input lo sbalzo termico tra il paese di origine/campionato di provenienza dei calciatori e la sede del torneo!

Buona finale mondiale a tutti!

 

Enjoy!
Enjoy!


sabato 23 settembre 2017

My First Shiny App

Da diverso tempo utilizzo RStudio e i suoi prodotti, uno che mi ha sempre incuriosito ma non ho mai utilizzato è Shiny.
Shiny è una libreria che permette di costruire interfacce web utilizzando R, così seguendo un video ho creato la mia prima app in Shiny, visto che sono pochi passi ho pensato di condividere quanto appreso.
Per prima cosa và installato shiny su R e richiamata la libreria.

   install.package("shiny")  
   library (shiny)  

Per prima cosa bisogna salvare lo script nella cartella del progetto (che conterrà tutto ciò che serve all'app, per applicazioni più elaborate) e chiamare il file nomefile-app.R
Gli script shiny hanno una struttura divisa in due blocchi:
  • ui: dove viene indicato ciò che "si vede"
  • server: dove vengono scritte le funzioni
quindi vediamo lo scheletro base dell'app.

 library(shiny)  
 ui <- fluidPage()  
 server <- function(input, output){  
 }  
 shinyApp(ui = ui, server = server)  


Vogliamo costruire un'app che calcoli la funzione rnorm() per un dato input numerico, iniziamo con ui.
Per scegliere l'input vogliamo una barra di scorrimento con valori che vanno da 1 a 100 e impostiamo il valore di default a 25.

 ui <- fluidPage(  
  sliderInput(inputId = "num", label = "scegli un numero", min = 1, max = 100, value = 25),  
 )  

I comandi come sliderInput non bisogna ricordarli a memoria ma ci sono diverse pagine sul sito di RStudio e Shiny dove riporta il codice per molti componenti.
Oltre alla barra cosa vogliamo visualizzare? La distribuzione su un istogramma quindi aggiungiamo a fluidPage:

 ui <- fluidPage(  
  sliderInput(inputId = "num", label = "scegli un numero", min = 1, max = 100, value = 25),  
  plotOutput("hist")  
 )  

Se avviamo l'app da "Run app" ora vedremo una pagina bianca e la barra a scorrimento, questo perchè finchè non completiamo il server non verrà calcolato nulla e quindi niente istogramma.
Nel server vogliamo visualizzare l'istogramma "hist" come definito in ui, che rappresenta rnorm() calcolata su input$num ovvero il "num" assegnato a inputId.

 server <- function(input, output){  
  output$hist <- renderPlot({  
   title <- "100 random normal values"  
   hist(rnorm(input$num), main = title)  
  })  
 }  

Fatto questo possiamo salvare e provare l'app. Io inizialmente per renderla più interattiva ho modificato title con:

 title <- paste0(input$num, " random normal values")  

così da vedere sempre il numero scelto nel titolo dell'istogramma. Il risultato è il seguente.








Partendo da questo potete modificare la vostra app come volete.
Per pubblicarla, se non avete a disposizione un server, potete crearvi un account gratuito (max 5 app) su shinyapps.io, la procedura di registrazione è molto semplice.
La mia prima app potete trovarla qui: nickprock.shinyapps.io/myFirstShinyApp/ 
 

venerdì 26 maggio 2017

YARS - Yet Another R Scraper

Tempo fa una collega mi ha chiesto una funzione per scaricare dei dati dal portale del Ministero dell'Interno da utilizzare per fini scientifici, e non a scopo di lucro, naturalmente.
La funzione si basa sul package XML e permette di scaricare le tabelle presenti sulle pagine del sito.
Ne ho fatto un package "datiMinInterno" che potete trovare sul mio GitHub.

N.B. I dati scaricati vanno preprocessati per avere i formati desiderati.

giovedì 10 novembre 2016

TwitteRendum

INTRO

Torno dopo una lunga assenza per sperimentare se i social possano in qualche modo "predire" le dinamiche politiche.
Il 4 dicembre ci sarà il referendum costituzionale, su Twitter se ne parla molto, ma sicuramente i tweet non sono voti.
L'esperimento è questo:
  • scaricare tutti i tweet (che le API mi consentono) per gli hashtag ufficiali:
    • #iovotosi
    • #iovotono
  • rappresentare settimanalmente (più o meno) semplici grafici
  • vedere se il popolo di twitter ha "visto giusto"
Naturalmente questo non ha nulla di scientifico ma è un modo per riprendere il blog con un post che si aggiornerà fino al 4 dicembre.
Mi è stato detto che l'hashtag della campagna per il si è #bastaunsi ma come già specificato io sto scaricando solo l'hashtag proposto da twitter, per non squilibrare la cosa ho deciso di non scaricare altri hashtag.

Dal 1 Novembre al 9 Novembre 2016

In questo periodo sono riuscito a scaricare circa 41000 tweets.
Il 72% circa sono per il NO e il restante 28% per il SI.

Come detto i tweet non sono voti, anchè perchè un solo utente manda più tweet ma un solo cittadino è un solo voto.
Conteggiando solo gli utenti unici il NO si attesta al 63,5% e il SI al 36,5%, quindi gli user del NO tweettano molto di più.



In termini assoluti possiamo vedere il grafico a barre.


Vediamo anche l'andamento dei tweets.


Dal 10 al 16 Novembre


Dopo una settimana andiamo a vedere come e se è cambiata la situazione.
I dati seguenti sono cumulati a quelli della scorsa settimana.
I tweet unici sono 84865, sono stati scaricati/prodotti circa 4000 tweets in meno di quelli scaricati la scorsa settimana.

Anche questa settimana la piechart dei tweet mostra una prevalenza dei tweet per #iovotono (70%)

 Vediamo i tweet da utenti unici  anche questa settimana la partita torna in equilibrio, infatti #iovotosi recupera un 8%.

Il grafico a barre ci mostra i tweet prodotti in 16 giorni.
Sono 59504 per #iovotono e 25361 per #iovotosi.

Infine concludiamo con l'andamento. Il grafico ci mostra un'impennata nella serata di domenica per il no che ha un andamento molto "scorbutico" rispetto al più lineare si.


Rispetto ad una settimana fa ho creato la wordcloud degli hashtag. Naturalmente i due più frequenti sono quelli che abbiamo usato come chiave di ricerca, ma ci può dare una panoramica di come scrivono e si classificano gli utenti.



Dal 16 Novembre al 23 Novembre 2016

Situazione pressochè invariata, siamo ormai a 134400 tweet da inizio mese, ecco le frequenze assolute e la serie temporale.



Il SI continua a salire ma resta il predominio (almeno in termini di tweet assoluti) del NO.

Vediamo le percentuali:
  • per quanto riguarda i tweets
    • NO 66%
    • SI 34%
  • per quanto riguarda gli utenti unici
    • NO 58%
    • SI 42%
Le cose si stanno livellando pian piano, decideranno all'ultimo secondo i voti degli indecisi?

percentuali dei tweets

Percentuali degli utenti

 Infine vediamo la wordcloud, si vedono molti più hashtag per il si rispetto alla precedente, sarà l'effetto Leopolda?



Dal 24 Novembre al 3 Dicembre 2016

Ultimo appuntamento prima di tirare le somme!!!
Siamo arrivati a 193778 Tweets così suddivisi:
  • 61% #iovotono
  • 39% #iovotosi

Tweet Assoluti

Tweets percentuali

Vediamo l'andamento giornaliero. Continua la risalita del SI e l'andamento"a scatti" del NO, con i picchi del fine settimana.

Serie Storica Tweets.
Infine vediamo la percentuale degli utenti e le wordcloud:
  • 55% #iovotono
  • 45% #iovotosi




Nella wordcloud esce qualche riferimento alla Leopolda ed entra quello alle bufale del no.

Ora non ci resta che aspettare i risultati per vedere se nel 2016 il social cinguettante riflette la società reale.

POST REFERENDUM

I risultati ufficiali potete trovarli qui. I tg danno un 60% NO - 40% SI, le percentuali precise sono un pò diverse ma ci siamo andati vicini.

lunedì 16 maggio 2016

Dopo più di 6 anni torno al DESF.

Mercoledì 18 Maggio, a partire dalle 10:30 ci sarà la presentazione di un nuovo corso di laurea dell'UniCal, con un mio piccolo intervento.