({{}})

({{, ({{"Lezione 5"}, {Statistica e analisi dei dati}, {Crescenzio Gallo - Università di Foggia
crescenzio.gallo@unifg.it}})}})

Note:

Il materiale visualizzato durante questo seminario è disponibile per il download all'indirizzo http://www.crescenziogallo.it/unifg/seminario-mathematica-2014/

Il materiale utilizzato è tratto dai webinar pubblicati da Adalta e prodotti dal dott. Roberto Cavaliere (Mathematica Technical Sales Manager, r.cavaliere@adalta.it)

12-26 Giugno 2014

Agenda

Introduzione

I dati

Funzionalità di statistica e analisi dati

Panoramica

Esempi di statistica descrittiva

Esempi di distribuzioni statistiche

Model fitting e analisi

Conclusioni

I dati

L’introduzione dei dati nel sistema di calcolo Mathematica può avvenire in diversi modi e impiegando varie tecnologie.

Integrazione del kernel con altri ambienti (es. C, C++, Fortran, Java, .NET ed altri)

Import dei file tramite formati standard

Accesso ai database (MySQL, Oracle, ...)

Dati curati (FinancialData, WeatherData, CountryData, ...)

Integrazione con altri ambienti

Si veda Systems Interfaces & Deployment per una lista completa delle modalità di integrazione tra Mathematica ed altri linguaggi

Formati disponibili

$ImportFormats

$ExportFormats

Import

Sintassi di base della Import

Import["file", format]:  importa dati dal file specificato restituendono la versione Mathematica

Import["file", {format, elements}]: importa dal file solo gli elementi specificati.

Import["http://url",…]: importa da un qualsiasi URL accessibile (anche se sono richieste credenziali di accesso)

La maggior parte dei casi si può omettere il formato del file e la Import sarà comunque in grado di identificare il formato automaticamente dal file stesso

Import["C:\\temp\\Fiat.xls"]

oppure direttamente dalla rete

Import["http://ichart.finance.yahoo.com/table.csv?s=AAPL&d=10&e=7&f=2011&g=d&a=8&b=7&c=1984&ignore=.csv"]

Collegamento con i database

Un altro importantissimo aspetto legato alla gestione dei dati è quello dei database. Anche in questo caso Mathematica comprende la tecnologia necessaria per l’integrazione immediata ed altamente flessibile: Database Connectivity

Banche dati interne a Mathematica

Oltre alle interfacce con altri ambienti/linguaggi ed al riconoscimento dei principali formati di file, Mathematica mette a disposizione una serie di banche dati affidabili, robuste ed aggiornate costantemente. Questo è un elenco completo delle banche dati: Computable Data

Funzionalità di statistica e analisi dati: panoramica

La versione 8 di Mathematica ha completamente rinnovato l’area delle funzioni dedicate alla Statistica. Le due immagini che seguono indicano in sintesi i livelli di funzionalità ad oggi disponibili.

Mathematica 7 vs. Mathematica 8

Sintesi delle distribuzioni

?*Distribution*

Apri la guida delle distribuzioni statistiche.

Le funzioni di visualizzazione.

Apri la guida Statistical Visualization

Esempi di statistica descrittiva

Le funzioni di statistica descrittiva di Mathematica si applicano a dati espliciti, elementi simbolici, dataset ibridi simbolico-numerici, rappresentazioni simboliche di distribuzioni statistiche. 
Le funzioni di statistica descrittiva sono elencate nella guida Descriptive Statistics (guida) ed un tutorial si trova in Descriptive Statistics (tutorial).
Vediamo alcuni esempi utilizzando dei dati forniti dalla funzione ExampleData.

I dati della sorgente geyser chiamata “OldFaithful”

intestazioni=ExampleData[{"Statistics","OldFaithful"},"ColumnHeadings"]

Misure descrittive dei primi quattro momenti, della mediana e del decimo e novantesimo percentile relativamente alla durata di un getto:

serie=ExampleData[{"Statistics","OldFaithful"}];
Table[f[serie[[All,1]]],{f,{Mean,Variance,Skewness,Kurtosis,Median,Quantile[#,.1]&,Quantile[#,.9]&}}]

Esempi di visualizzazione.

Grafici di tipo istogramma, box-whisker e a violino:

Table[f[serie[[All,i]],PlotLabel->intestazioni[[i]]],{i,2},{f,{Histogram,BoxWhiskerChart,DistributionChart}}]//Grid

Alcuni indici descrittivi di forma, posizione e dispersione

Calcoliamo alcune misure descrittive relative alle coppie di valori precedenti (durata, attesa).

Panel[Grid[Table[{f[[1]],f[[2]][N[serie]]},{f,{{"Media",Mean},{"Varianza",Variance},{"Deviazione standard",StandardDeviation},{"Skewness",Skewness},{"Curtosi",Kurtosis},{"Mediana",Median},{"10° percentile",Quantile[#,.1]&},{"90° percentile",Quantile[#,.9]&}}}],Alignment->Left, BaseStyle->{"Times",16,Blue}]]

Correlazione tra la durata e l’attesa:

Correlation[serie]//MatrixForm

Come confermato anche dal grafico, le due varaibili sono fortemente correlate:

GraphicsRow[{ListPlot[serie],QuantilePlot[serie[[All,2]],serie[[All,1]]]},ImageSize-> Large]

Altre possibili visualizzazioni. Le funzioni DensityHistogram e SmoothHistogram3D, sono state aggiunte in Mathematica 8.

GraphicsGrid[{
{ListPlot[serie],DensityHistogram[serie,20]},{Histogram3D[serie,20,"PDF"],SmoothHistogram3D[serie]}
},ImageSize->Large]

Le stesse funzioni operano anche su dati simbolici o ibridi:

Correlation[(({{a, b}, {c, d}}))]//TraditionalForm

Categorie e clustering

BinCounts

Possiamo scomporre i dati in categorie, per esempio in base all’intervallo di durata del getto.

BinCounts viene usata per calcolare il tempo t tale che t<2, 2≤t<3, 3≤t<4, e t≥4, rispettivamente.

bc=BinCounts[serie[[All,1]],{{0,2,3,4,10}}]

Visualizzazione in grafico a barre o a torta:

GraphicsRow[Table[f[bc,ChartStyle->"DarkRainbow",ChartLabels->{"t<2","2≤t<3","3≤t<4","t≥4"}],{f,{BarChart,PieChart}}],ImageSize-> Large]

FindClusters

Il clustering è una tecnica spesso utilizzata per separare i dati in gruppi o identificare sottogruppi all’interno di un data set. La principale funzione di Mathematica per il clustering è FindClusters, mentre nella guida Distance and Similarity Measures si trovano tutte le possibili distanze disponibili e che si possono utilizzare per raggruppare i dati in FindClusters.

Generiamo 10 cluster campione da una distribuzione normale bivariata:

origclusters=
BlockRandom[
SeedRandom[123456789];
muvals=RandomReal[{-10,10},{10,2}];
sigmavals=Table[Block[{s1=RandomReal[],s2=RandomReal[],s12},s12=RandomReal[]*Sqrt[s1*s2];{{s1,s12},{s12,s2}}],{10}];
Join[MapThread[RandomReal[MultinormalDistribution[#1,#2],RandomInteger[{20,75}]]&,{muvals,sigmavals}]]];

Mischiamo gli elementi così da non averli già in gruppi, e poi usiamo FindClusters per identificare i cluster nei dati complessivi:

newclusters=BlockRandom[SeedRandom[1];RandomSample[Flatten[origclusters,1]]];

clusters=FindClusters[newclusters];

FindClusters identifica bene 3 distinti cluster, il che sembra ragionevole dato che i valori di partenza sono molto sparpagliati

GraphicsGrid[{{ListPlot[origclusters],ListPlot[clusters]}},ImageSize->Large]

Analisi di serie storiche

Vediamo un esempio di funzioni quali MovingAverage, MovingMedian, ed ExponentialMovingAverage

Serie storica della quotazione Apple:

apple=FinancialData["AAPL",{{2009},{2013}}];
DateListPlot[apple,ImageSize->Large]

Questo grafico mostra una media mobile a 25 termini ed una mediana mobile

movavgdata=Transpose[{apple[[13;;-13,1]],MovingAverage[apple[[All,2]],25]}];
movmeddata=Transpose[{apple[[13;;-13,1]],MovingMedian[apple[[All,2]],25]}];
DateListPlot[{apple[[13;;-13]],movavgdata,movmeddata},Joined->{False,True,True},PlotStyle->{Automatic,Thick,Thick},ImageSize->Large]

Possiamo usare elementi dinamici per osservare le variazioni della media mobile al variare del numero di elementi presi:

Clear[a,b,c,d,e,f]

MovingAverage[{a,b,c,d,e,f},2]

MovingAverage[{a,b,c,d,e,f},3]

Manipulate[Show[{ListPlot[apple[[All,2]]],ListLinePlot[MovingAverage[apple[[All,2]],n],PlotStyle->{Brown}]},ImageSize->Large],{{n,1,"Punti considerati"},1,20,1}]

Esempio di media mobile esponenziale usata per regolarizzare dati sperimentali:

data=Range[20]+RandomReal[{-2,2},20]

res=ExponentialMovingAverage[data,1/4]

ListPlot[{data,res},PlotStyle->{Red,Blue},Joined->True,ImageSize->Large]

Funzionalità di statistica e analisi dati: esempi di distribuzioni statistiche

Distribuzioni parametriche

Discrete univariate e multivariate

Continue univariate e multivariate

Distribuzioni non parametriche

EmpiricalDistribution

HistogramDistribution

SmoothKernelDistribution

SurvivalDistribution

Distribuzioni basate su formule

ProbabilityDistribution (da PDF, CDF, SF)

Distribuzioni derivate

TransformedDistribution

OrderDistribution

MixtureDistribution

ParameterMixtureDistribution

CensoredDistribution

TruncatedDistribution

MarginalDistribution

ProductDistribution

CopulaDistribution

Confronto con altri software

(Labeled[, "distribution coverage in Mathematica"])

Funzionalità di statistica e analisi dati: esempi di distribuzioni statistiche

Per tutte le distribuzioni si possono utilizzare

Funzioni di alto livello

Probability, NProbability

Expectation, NExpectation

RandomVariate

EstimatedDistribution, DistributionFitTest

MomentConvert, MomentEvaluate

Proprietà delle distribuzioni

PDF, CDF, SurvivalFunction (SF), HazardFunction (HF), Quantile (QF), InverseCDF, InverseSurvivalFunction

Moment / MGF, CentralMoment / CMGF, FactorialMoment / FMGF, Cumulant / CGF, CF

Mean, Variance, StandardDeviation, Skewness, Kurtosis, Covariance, Correlation, ...

Median, Quartiles, QuartileDeviation, QuartileSkewness, ...

Likelihood, LogLikelihood, ...

Esempio di calcolo delle proprietà di varie distribuzioni

Calcolo di proprietà di una distribuzione NakagamiDistribution con parametri simbolici

dist=NakagamiDistribution[μ,ω];
Panel[
Grid[{Map[Style[#,Bold,16]&,{"Media","Funzione caratteristica", "Funzione generatrice dei momenti", "Probabilità","Valore atteso"}],
Map[TraditionalForm,{Mean[dist],CharacteristicFunction[dist,t],MomentGeneratingFunction[dist,t],Probability[Log[x]>1/2,x\[Distributed]dist],Expectation[Sqrt[x],x\[Distributed]dist]}]}, Alignment->Center,Dividers->Directive[Orange], ItemSize->25]]

Esempio di calcolo di probabilità e valore atteso

Probability e Expectation sono funzioni generali che operano con algoritmi simbolici. Esistono comunque le corrispondenti funzioni numeriche che secondo la convenzione di Mathematica assumono lo stesso nome solo che sono precedute dalla N: NProbability e NExpectation. Chiaramente i calcoli numerici possono risultare più veloci mentre quelli simbolici sono certamente più esatti.

Considerando la distribuzione usata prima, assegnamo due valori ai parametri μ e ω e calcoliamo una probabilità e poi un valore atteso:

With[{dist=NakagamiDistribution[1,5]},{NProbability[Log[x]>1/2,x\[Distributed]dist],NExpectation[Sqrt[x],x\[Distributed]dist]}]

Verifichiamo il risultato simbolico:

With[{dist=NakagamiDistribution[1,5]},{Probability[Log[x]>1/2,x\[Distributed]dist],Expectation[Sqrt[x],x\[Distributed]dist]}]

N[%]

Ovviamente si può sfruttare la precisione arbitraria di Mathematica per calcolare una probabilità con una precisione maggiore di quella macchina.
Calcoliamo la probabilità che lanciando 200 volte una moneta esca un numero di volte il simbolo testa che varia tra 60 e 80:

Probability[60≤x≤80,x\[Distributed]BinomialDistribution[200,1/2]]

Ora calcoliamo il corrispondente valore numerico ad una precisione arbitraria

N[%,50]

Altri semplici esempi di probabilità

Prababilità univariata discreta:

Probability[x≥1,x\[Distributed]BinomialDistribution[n,p]]

Condizioni non lineari:

Probability[(((x-3))^2)≥x,x\[Distributed]ZipfDistribution[ρ]]

Combinazioni logiche:

Probability[k^2>10||k<2,k\[Distributed]PoissonDistribution[λ]]

Probabilità multivariata:

Probability[X≤1/2&&Y≤1,{X,Y}\[Distributed]DirichletDistribution[{1,2,3}]]

Probabilità condizionata:

Probability[(x^2)>12\[Conditioned]x>2,x\[Distributed]PoissonDistribution[λ]]

Applicazioni immediate

Una fabbrica produce chiodi la cui lunghezza è un valore con distribuzione normale e media 0.5 pollici. Se il 50% della produzione ha una lunghezza compresa tra 0.495 e 0.505, trovare la deviazione standard:

prob=Probability[0.495<x<0.505,x\[Distributed]NormalDistribution[0.5,σ]]

LogLinearPlot[prob,{σ,10^-3,1},GridLines->Automatic,Frame->True]

NSolve[prob==0.5&&10^-3<σ<10^-1,σ]

Creare data set sperimentali

Molte volte risulta fondamentale anche la generazione di numeri pseudo-causali secondo una certa distribuzione. In Mathematica 8 è stata creata una nuova funzione appositamente per la generazione di campioni casuali, chiamata RandomVariate

Simuliamo il lancio di un dado:

RandomVariate[DiscreteUniformDistribution[{1,6}],1]

Di due dadi:

RandomVariate[DiscreteUniformDistribution[{1,6}],2]

Generiamo un campione di 100 lanci di due dadi:

RandomVariate[DiscreteUniformDistribution[{1,6}],{100,2}]

Ancora una volta è interessante riportare l’attenzione su altre funzionalità integrate in Mathematica, come ad esempio quelle dedicate alla creazione di semplici interfacce:

Modelli statistici

Mathematica dispone anche di funzioni ad hoc per l’analisi statistica tramite modelli lineari e non lineari (si veda il tutorial Statistical Model Analysis).

({{LinearModelFit, modello lineare}, {GeneralizedLinearModelFit, modello lineare generalizzato}, {LogitModelFit, modello regressione logistica}, {ProbitModelFit, modello regressione probit}, {NonlinearModelFit, modello non lineare dei minimi quadrati}})

La caratteristica importante delle funzioni in questa categoria è che generano un oggetto di tipo FittedModel ossia uno modello completo con tutti i parametri diagnostici utili alla piena comprensione del fitting eseguito. Facciamo un esempio.

Importiamo dei dati da un file di test:

SetDirectory[NotebookDirectory[]];

lineardata={{8.71,6.92,18.89},{6.05,5.97,15.08},{6.24,0.99,5.92},{8.25,3.37,11.39},{6.58,8.22,20.77},{4.14,9.,21.09},{4.35,9.94,24.32},{8.99,4.47,13.79},{2.82,3.91,10.68},{5.14,0.4,3.82}};

Facciamone una regressione lineare usando LinearModelFit

lm=LinearModelFit[lineardata,{x,y},{x,y}]

Normal[lm]

LinearModelFit produce un oggetto di tipo FittedModel che include tutta l’analisi eseguita sui dati e che possiamo ottenere semplicemente esprimendo le richieste:

lm["Properties"]

Il valore del modello nel punto {x,y}={1,3}.

lm[1,3]

I residui standardizzati e la distanza di Cook:

{stresids,cookd}=lm[{"StandardizedResiduals","CookDistances"}]

GraphicsRow[{ListPlot[stresids],ListPlot[cookd,Filling->Bottom,PlotRange->All]},ImageSize-> Large]

Un esempio reale di calcolo statistico

Questo esempio è tratto da un articolo a cura di Jon McLoone, della Wolfram Research

La Statistica dell’Energia Eolica

Come può contribuire Mathematica nel campo dell’energia sostenibile? Vedremo che con una combinazione di dati built-in e funzionalità statistiche Mathematica può dare un buon supporto all’analisi energetica.

In questo esempio faremo uso di informazioni tratte da WeatherData e studieremo la possibilità di utilizzare il vento per generare elettricità. [Verranno anche utilizzati dati provenienti da www.vestas.com/en/wind-power-plants/procurement/turbine-overview/v90-1.8/2.0-mw.aspx#/vestas-univers]

In primo luogo otteniamo la velocità media del vento giornaliera per la stazione meteo più vicina a Bloomington IL, a partire dal 2000.

wsData=WeatherData[{"Bloomington","Illinois"},"MeanWindSpeed",{{2000,1,1},Date[],"Day"}];

Possiamo dare un’occhiata alla forma dei dati e visualizzare immediatamente i dati della serie temporale:

DateListPlot[wsData,Joined-> True,ImageSize->Large]

Le voci sono coppie ordinate consistenti di data e velocità media del vento per la giornata. Avremo bisogno di estrarre le velocità dai dati.

Prendiamo la seconda parte di tutte le coppie e convertiamo da km/h a m/s; quindi visualizziamo l’istogramma.

wndData=Select[1000. wsData[[All,2]]/(60.^2),#>0&];
histplot=Histogram[wndData,45,"PDF",ImageSize->Large]

La Statistica dell’Energia Eolica

Poiché la velocità del vento può essere assunta variare continuamente, possiamo rappresentare la distribuzione per le nostre osservazioni utilizzando la funzione SmoothKernelDistribution.

Visualizziamo la distribuzione con l’istogramma originale.

dist=SmoothKernelDistribution[wndData];

Show[{histplot,estplot=Plot[PDF[dist,x],{x,0,13},PlotStyle->{Thick,Red}]}]

Possiamo chiedere informazioni su tale distribuzione. Per esempio, qual è la probabilità che la velocità del vento sia maggiore di 3,5 m/s?

Probability[speed>3.5,speed\[Distributed]dist]

La Statistica dell’Energia Eolica

Comunque, stiamo assumendo che i dati seguano una ExtremeValueDistribution, e li utilizzeremo per stimare i parametri della distribuzione.

params= FindDistributionParameters[wndData,ExtremeValueDistribution[α,β]]

distEV=ExtremeValueDistribution[α,β]/.params

Ed ora verifichiamo la nostra ipotesi.

tstData=DistributionFitTest[wndData,distEV,"HypothesisTestData"];

{tstData["AutomaticTest"],tstData["TestConclusion"]}

Ecco la statistica del test ed il p-Value.

tstData["TestDataTable"]

Possiamo ora visualizzare la nostra stima della distribuzione.

Show[{histplot,estplot= Plot[PDF[distEV,x],{x,0,13},PlotStyle->{Thick,Red}]},ImageSize->Large]

Il generatore che stiamo usando per la nostra analisi richiede un vento di 3,5 m/s per generare elettricità. Possiamo usare la funzione Probability per stimare per quale percentuale di tempo il generatore contribuirà alla rete.

Sulla base della distribuzione dei dati, è possibile calcolare la probabilità che la velocità del vento superi la soglia di 3,5 m/s:

Probability[x>3.5,x\[Distributed]distEV]

Visualizziamo il risultato.

Plot[Evaluate[PDF[distEV,x] {1,Boole[x>3.5]}],{x,0,13},Filling->{{2->Axis}},ImageSize->Large]

La Statistica dell’Energia Eolica

Dalla scheda tecnica del produttore per il generatore V90-1.8/2.0 MW possiamo fare una tabella che indichi i livelli di prestazione attesi per la posizione individuata.

Grid[{
{Style["Wind Speed m/s",FontWeight->"Bold"],Style["Probability",FontWeight->"Bold"],Style["Estimated Power MW",FontWeight->"Bold"]},
{"< 3.5",Probability[x<3.5,x\[Distributed]distEV],0.0},
{"Between 3.5 and 7",Probability[3.5<x<7,x\[Distributed]distEV],"0 to .8"},{"Between 7 and 13",Probability[7<x<13,x\[Distributed]distEV],".8 to 1.65"},
{"> 13",Probability[13<x,x\[Distributed]distEV],"1.65"}
},BaseStyle->{"Menu",19},Alignment->{Left},Background->LightYellow,Frame->{False,All},Spacings->{2,0.62}]

Siamo in grado di calcolare la potenza che questo generatore accumulerà nel periodo di tempo dal 2000 fino ad oggi:

power=Total[{
Probability[3.5<x<7,x\[Distributed]distEV] Mean[{0,0.8}],
Probability[7<x<13,x\[Distributed]distEV] Mean[{1.65,0.8}],
Probability[13<x,x\[Distributed]distEV] 1.65}]

Se avessimo acquistato energia elettrica per l’ammontare calcolato, avremmo speso il seguente importo in $ per un anno (questo solo per un generatore eolico):

valuePerYear="$" power*8760*10.73/100*1000

Conclusioni

Anche per la statistica e l’analisi dei dati Mathematica si conferma un sistema altamente competitivo anche rispetto a quei software dedicati che offrono esclusivamente funzioni in tale aree. Questo è ancora un altro esempio di come Mathematica stia diventando sempre più uno strumento integrato e completo.

In relazione all’analisi dei dati ed alla statistica con Mathematica esistono moltissime fonti informative tra cui:

Basic Statistics

Continuous Distributions

Discrete Distributions

Descriptive Statistics

Convolutions and Correlations

Curve Fitting

Importing and Exporting Data

Pseudorandom Numbers

Random Number Generation

Numerical Operations on Data

S18: Import and Export Formats in Mathematica

S24: Working with Imported Data in Mathematica

S41: Statistical Visualization with Mathematica

M215: Applied Statistical Analysis with Mathematica

M221: Introduction to Programming in Mathematica

Examples on the Web: Statistical Visualization

Wolfram Demonstrations Project: demonstrations.wolfram.com

Wolfram Library Archive: library.wolfram.com

Training from Wolfram Education Group: www.wolfram.com/weg