Dai dati al modello teorico Analisi descrittiva univariata in R 1 Un po di terminologia Popolazione: (insieme dei dispositivi che verranno messi in produzione) finito o infinito sul quale si desidera avere informazioni. insieme Campione casuale: (prototipi) sottoinsieme della popolazione scelta in modo casuale. Unità statistica o campionaria: (un prototipo) un elemento del campione casuale Taglia del campione: (numero di prototipi realizzati) numero di unità statistiche Statistica descrittiva Descrizione per via grafica Descrizione per via numerica Carattere (tempo di rottura del dispositivo) ogni aspetto elementare oggetto di rilevazione nelle unità statistiche della popolazione (e quindi del campione) Modalità o classe di modalità: i diversi modi con cui il carattere si presenta nelle unità statistiche della popolazione (e quindi del campione) 2 1
Se si ha un campione casuale di tempi di vita, come si perviene ad un modello teorico? Esempio: si misura il tempo di vita di 20 lampadine, che è stato riportato di seguito Stimare la funzione guasto, la funzione di affidabilità, la densità di guasto, il tempo medio di vita. Determinare quale modello teorico potrebbe descrivere il tempo di vita. 10,45 2,30 19,71 49,81 46,89 69,08 0,32 11,36 43,20 3,24 6,10 1,01 0,71 3,89 5,38 0,37 7,29 9,12 17,52 9,60 dati<-c(10.45,2.30,19.71,49.81,46.89,69.08,0.32,11.36,43.20,3.24,6.10,1.01,0.71,3.89, + 5.38,0.37,7.29,9.12,17.52,9.60) hist(dati, col= blue,labels=t, freq=f,ylim=range(0,0.08)) - Labels: Consente di etichettare le barre Sui parametri di input - freq: Consente di scegliere se rappresentare la freq. assoluta oppure la densità E possibile manipolare i valori calcolati dalla funzione hist() 3 Per lavorare con i vettori generati, usare la sintassi Nell esempio: NOMEHISTOGRAMMA$NOMEVETTORE fornisce le frequenze relative. Notare che le frequenze relative sono diverse dai dati forniti nel vettore density, che invece sono calcolati dividendo le frequenze relative per l ampiezza delle classi. 4 2
La funzione density() delinea l andamento della distribuzione dei dati una volta suddivisi in classi. Il comando rug(dati) aggiunge il grafico dot-plotall istogramma. Nei grafici la scelta delle classi è stata automatica. Potrebbe essere necessario scegliere un numero di classi diverso. 5 hist(dati,prob=true, col='blue',labels=t,ylim=range(0,0.08), breaks=4) Parametro di input: -Breaks Se intero, specifica Il numero delle classi Non sempre la scelta del numero delle classi produce un effetto sul grafico. Questo dipende dall algoritmo implementato. A volte si rende necessario immettere direttamente gli estremi delle classi. E possibile che il numero delle classi prodotto sia diverso da quello richiesto. 6 3
hist(dati,prob=true, col='blue',labels=t,ylim=range(0,0.08), + breaks=c(0,15,30,45,60,75)) Parametro di input: -Breaks Se contiene un vettore, specifica gli estremi delle classi Ad esempio con questa scelta delle classi, il carattere bimodale della stima si attenua. 7 Stimare il tempo medio. Per calcolare il tempo medio di vita, è possibile usare l indice di sintesi media campionaria x 1 n xi n i = 1 = Alternativamente: La media rappresenta un indice di posizione del campione. Rappresenta il suo baricentro, immaginando di assegnare ad ogni elemento del campione casuale peso 1/n. 8 4
Altri indici Deviazione standard campionaria. Indice di variabilità dei dati. Campo di variazione Indice di variabilità dei dati. Quartili In particolare la mediana è un indice di posizione più robusto della media. La differenza tra il terzo ed il primo quartile è nota come IQR (interquartile range): 15.065 ed è un altro indice di variabilità dei dati. Esso rappresenta un indice più robusto rispetto alla deviazione standard. Robustezza di un indice= stabilità rispetto alla presenza di outliers. OUTLIERS? 9 Alla Ricerca degli Outliers. Il BOX - PLOT +/- 1.58 IQR/sqrt(n) OUTLIERS 10 5
Specie in presenza di outliers, può essere utile conoscerne il loro valore e la loro collocazione all interno del campione casuale. Con la seguente sintassi, si ottengono le seguenti informazioni: outliers<-boxplot(dati) outliers $stats [,1] [1,] 0.320 [2,] 2.770 [3,] 8.205 [4,] 18.615 [5,] 19.710 Gli estremi necessari alla costruzione del box-plot $n [1] 20 Gli outliers $out [1] 49.81 46.89 69.08 43.20 Per gestire gli outliers: outliers$out [1] 49.81 46.89 69.08 43.20 Per conoscere la loro posizione nel campione casuale: dati %in% outliers$out [1] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 11 Indici di Asimmetria Il confronto tra media e mediana non garantisce la caratterizzazione dell asimmetria. Quello che segue è un controesempio. Supponiamo di costruire i seguenti sets di dati: primo<-c(1,rep(2,2),rep(3,3),rep(4,4),rep(5,5),rep(6,6),rep(7,7)) primo [1] 12 23334 4445 55556 66666 77777 77 secondo<-c(rep(1,7),rep(2,6),rep(3,5),rep(4,4),rep(5,3),rep(6,2),rep(7,1)) secondo [1] 11 11111 2222 22333 33444 45556 67 12 6
summary(primo) Min. 1st Qu. Median Mean3rd Qu. Max. 1.00 4.00 5.00 5.00 6.25 7.00 summary(secondo) Min. 1st Qu. Median Mean3rd Qu. Max. 1.00 1.75 3.00 3.00 4.00 7.00 Le due distribuzioni stesso segno di media mediana=0 Eppure guardando i due istogrammi si vede che le code delle due distribuzioni sono diverse Usando la function skewnessdella libreria e1071 si ha: skewness(primo) [1] -0.5466986 skewness(secondo) [1] 0.5466986 13 Indice di curtosi E un indice che misura la variabilità della distribuzione del campione rispetto alla gaussiana standard. 0 distribuzione appuntita =0 distribuzione come quella gaussiana <0 distribuzione piatta kurtosis(dati) [1] 0.5395651 Tale indice ha significato soprattutto per quelle distribuzioni con indice di simmetria prossimo allo zero. 14 7
Coefficiente di variazione Una proprietà desiderabile per un indice di variabilità è che non dipenda dalla unità di misura in cui è espresso il carattere. Es: altezza di 5 studenti: 172, 175, 176, 178, 180 La media risulta essere 176.2 cm e la devstandard risulta essere 2.71. Se esprimiamo gli indici in metri, la media diviene 1.762 e la dev.standard 0.0271. Esempio: Un processo industriale produce bustine di camomilla del peso medio di 2 grammi. La dev. standard è 0.034. Un secondo processo industriale produce confezioni di pasta alimentare del peso di 500 grammi. La dev. standard è 2.7. Quale tra i due processi è più preciso? Questa comparazione può essere effettuata in modo appropriato esprimendo la deviazione standard di ciascun processo come percentuale della rispettiva media. 0.034 2.7 100= 1.7 100= 0.5 2 500 15 CV = s x sd(dati)/mean(dati) [1] 1.25574 = 1 la media non è un indice corretto = 0 la media è un indice perfetto 0.5 la media non è un indice corretto 0.5 la media è un indice corretto In che senso la media non è un indice corretto? ERRORE STANDARD e= s n Misura la dispersione della media campionaria ossia è una misura della sua imprecisione sd(dati)/sqrt(20) [1] 4.455466 16 8
Stima DISTRIBUZIONE EMPIRICA CUMULATIVA Per stimare la funzione di guasto, è possibile usare la functionecdf() che stima la funzione di distribuzione empirica cumulativa Per conoscere i valori dei gradini: Teoricamente In R: ) F x ( ) num. dati x = N cf<-ecdf(dati) cf(sort(dati)) [1] 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 [16] 0.80 0.85 0.90 0.95 1.00 sort(dati) [1] 0.32 0.37 0.71 1.01 2.30 3.24 3.89 5.38 6.10 7.29 9.12 9.60 [13] 10.45 11.36 17.52 19.71 43.20 46.89 49.81 69.08 17 Per stimare la funzione di affidabilità: Stima FUNZIONE DI AFFIDABILITA plot(sort(dati),1-cf(sort(dati)),type='s') title('funzione di affidabilità') points(sort(dati),1-cf(sort(dati)),pch=20) 18 9
Se i dati sono in Tabella. Età in mesi Frequenza dei guasti 0-26.9877 127 26.9877-54.9877 70 54.9877-82.9877 27 82.9877-110.9877 15 110.9877-138.9877 11 138.9877-166.9877 7 166.9877-194.9877 3 194.9877-222.9877 1 222.9877-250.9877 1 TOTALE 262 Le formule relative a media e varianza vanno corrette con i centri delle classi: k k fi 2 2 fi x = ci e s = ( ci x) n n i= 1 i= 1 Per il loro calcolo conviene usare un ciclo forin R 19 Per calcolare la media classi<-c(0,26.99,54.99,82.99,110.99,138.99,166.99,194.99,222.99,250.99) freq<-c(127,70,27,15,11,7,3,1,1) sum<-0 for(i in 1:9){ + centro<-(classi[i]+classi[i+1])/2 + sum<-sum+centro*freq[i]/262 + } sum [1] 43.26532 Per calcolare la VARIANZA sum1<-0 for(i in 1:9){ + centro<-(classi[i]+classi[i+1])/2 + sum1<-sum1+(centro-sum)^2*freq[i]/262 + } sum1 [1] 1731.773 20 10
Per calcolare la Mediana e i QUARTILI Età in mesi Frequenza dei guasti 0-26.9877 127 26.9877-54.9877 70 54.9877-82.9877 27 82.9877-110.9877 15 110.9877-138.9877 11 138.9877-166.9877 7 166.9877-194.9877 3 194.9877-222.9877 1 222.9877-250.9877 1 TOTALE 262 Frequenza cumulata 0,48 0,75 0,85 0,91 0,95 0,98 0,992 0,996 1 262 freqcumulate<-cumsum(freq)/262 cumsum(freq)/262 [1] 0.4847328 0.7519084 0.8549618 0.9122137 0.9541985 0.9809160 0.9923664 [8] 0.9961832 1.0000000 Va prima determinata la classe mediana (ossia quella contenente la frequenza cumulata 0.5, oppure 0.25/0.75 per i quartili) e poi va intersecata la retta y=0.5 con quella ottenuta Interpolando linearmente i valori della frequenza cumulata nella classe così determinata. Per la mediana, la classe di riferimento è (26.99;54.99) 21 Pertanto 0.75 0.48 y = 0.48 + ( x 26.99) 54.99 26.99 y= 0.50 x=29.96 Più in generale risulta 0.50 F( c ) M = c + ( c c ) i i i+ 1 i F( ci+ 1) F( ci) 0.25 F( c ) Q = c + ( c c ) i 1 i i+ 1 i F( ci+ 1) F( ci) 0.75 F( c ) Q = c + ( c c ) i 3 i i+ 1 i F( ci+ 1) F( ci) Qui ( c, c i i+ 1 ] denota la classe contenente rispettivamente M, Q, Q 1 3 Nella tabella, i valori della funzione di ripartizione empirica vengono assegnati all estremo destro dell intervallo. Si assume F( c ) = 0 1 Età in mesi Frequenza dei guasti 0-26.9877 0,48 26.9877-54.9877 0,75 54.9877-82.9877 0,85 82.9877-110.9877 0,91 110.9877-138.9877 0,95 138.9877-166.9877 0,98 166.9877-194.9877 0,992 194.9877-222.9877 0,996 222.9877-250.9877 1 TOTALE 262 22 11
Per costruire il Box Plot con questi valori Senza ricorrere a specifici pacchetti software Costruire un vettore dove inserire il min, il maxdei dati e i quartili. Fornire quel vettore come input alla function boxplot() dati<-c(0, 14.1,29.96,54.99,250.99) boxplot(dati) In questo caso, il maxviene segnalato come outliernel grafico 23 Come ripartire i dati in tabella Specialmente in presenza di database estesi, può essere utile costruire una tabella delle frequenze come quella che abbiamo appena visto. Questa tabella si riferisce a un dataset disponibile in rete http://oldwww.unibas.it/utenti/dinardo/tempi.txt che riguarda tempi di attesa ad un centralino telefonico. Come procedere 1) Copiare ed incollare il contenuto del file tempi.txt in un file 2) Salvare il file con estensione tempi.txt sul desktop e aggiungere il nome del vettore alla colonna (ad esempio tempi) 3) Spostarsi sulla cartella setwd( C:/Users/ /Desktop ) tempi<-read.table('c:/users/ /Desktop/tempi.txt,header=TRUE) 4) E stato creato un vettore tempicontenente i dati attach(tempi) 5) Stabilire gli estremi delle classi al seguente modo: 24 12
Passo 1: Stabilire il numero delle classi Una regola empirica consiste nel determinare quel valore di ktale che 2^k n In tal caso k=9 poiché length(tempi) [1] 262 Passo 2: Determinare l ampiezza delle classi max min h k e 2^8=256, 2^9=512 diff(range(tempi))/9 [1] 27.74697 Il valore viene arrotondato a 28. Passo 3: Determinare gli estremi delle classi Arrotondando l ampiezza della classe, l unione delle classi copre un intervallo di ampiezza maggiore del campo di variazione Unione classi= 252 Campo di variazione= 249 Siccome 28 9= 252 249.7227, la quantità 252 249.7227 = 2.2773 va equamente ripartita a sinistra del minimo e a destra del massimo. 25 Ossia min( tempi) 1.1386 = 1.0123 estremo sinistro I classe Quindi la prima classe è ( 1.0123, 1.0123+ 28 = 26.9877) La seconda classe è ( 26.9877, 26.9877+ 28 =.) Per costruire il vettore degli estremi in R, bisogna prima inizializzare un vettore numerico: clas<-numeric(10) Poi calcolare gli estremi delle classi e memorizzarli in clas: clas[1]<--1.012 for(i in 2:10) { + clas[i]=clas[i-1]+28 + } clas [1] -1.012 26.988 54.988 82.988110.988138.988166.988194.988222.988 [10] 250.988 clas[1]<-0 26 13
Infine, ripartire i dati nelle classi con la function cut() tempi.cut=cut(tempi,clas,right=true) Calcolare le frequenze di occorrenza nelle classi con la function table() tempi.freq=table(tempi.cut) tempi.freq tempi.cut (0,27] (27,55] (55,83] (83,111] (111,139] (139,167] (167,195] 127 70 27 15 11 7 3 (195,223] (223,251] 1 1 xx<-cbind(tempi.freq) Istruzione per assegnare al vettore XX le frequenze assolute 27 Ad esempio per La funzione di ripartizione plot(clas[2:10],cumsum(xx),type='s',col='red',lwd=4, + main='frequenze cumulate',xlab='tempi',ylab='freq. ass cum') 28 14