dispensa r

82
Introduzione al Calcolo Grafico e Statistico con R Mario Romanazzi Dipartimento di Statistica, Universit` a di Venezia “Ca’ Foscari” S. Giobbe, Cannaregio 873, 30100 Venezia 17 dicembre 2007

Upload: vannguyet

Post on 05-Jan-2017

246 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Dispensa R

Introduzione al Calcolo Grafico e Statistico

con R

Mario Romanazzi

Dipartimento di Statistica, Universita di Venezia “Ca’ Foscari”

S. Giobbe, Cannaregio 873, 30100 Venezia

17 dicembre 2007

Page 2: Dispensa R

2

Page 3: Dispensa R

Indice

1 Cos’e R? 9

2 Primi passi 11

2.1 Operatori aritmetici e logici . . . . . . . . . . . . . . . . . . . . . 12

2.2 Variabili e operatore di assegnazione . . . . . . . . . . . . . . . . 13

3 Oggetti 15

3.1 Vettore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3.2 Matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.3 Data Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.4 Fattore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.5 Lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.6 Funzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.7 Cambiare modalita . . . . . . . . . . . . . . . . . . . . . . . . . . 21

4 Lavorare con gli oggetti 23

4.1 Vettori numerici . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

4.2 Matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

4.3 Estrazione e modifica di elementi di oggetti . . . . . . . . . . . . 25

4.4 Subsetting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

4.5 Stringhe di caratteri . . . . . . . . . . . . . . . . . . . . . . . . . 27

4.6 Dati mancanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

5 Importazione ed esportazione di dati 31

6 Distribuzioni di probabilita 35

6.1 Distribuzioni di probabilita . . . . . . . . . . . . . . . . . . . . . 35

6.2 Campionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

7 Un primo sguardo ai grafici 41

7.1 La funzione plot() . . . . . . . . . . . . . . . . . . . . . . . . . . 41

7.2 Le primitive grafiche . . . . . . . . . . . . . . . . . . . . . . . . . 44

3

Page 4: Dispensa R

4 INDICE

8 Analisi iniziale dei dati 49

8.1 Tabelle di frequenza . . . . . . . . . . . . . . . . . . . . . . . . . 498.2 Istogrammi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548.3 Diagrammi scatola-baffi . . . . . . . . . . . . . . . . . . . . . . . 588.4 Indici di sintesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618.5 Analisi della concentrazione . . . . . . . . . . . . . . . . . . . . . 63

9 Visualizzare dati multivariati 65

9.1 Correlazione lineare . . . . . . . . . . . . . . . . . . . . . . . . . 669.2 Diagrammi di dispersione . . . . . . . . . . . . . . . . . . . . . . 679.3 Componenti principali . . . . . . . . . . . . . . . . . . . . . . . . 68

10 Modelli lineari 75

Page 5: Dispensa R

Elenco delle tabelle

2.1 Operatori aritmetici, di confronto binario e logici. . . . . . . . . . 13

3.1 Funzioni elementari. . . . . . . . . . . . . . . . . . . . . . . . . . 20

4.1 Arrotondamento. . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.2 Funzioni di matrici. . . . . . . . . . . . . . . . . . . . . . . . . . . 25

5.1 Opzioni di read.table. . . . . . . . . . . . . . . . . . . . . . . . 325.2 Opzioni di write.table. . . . . . . . . . . . . . . . . . . . . . . . 33

6.1 Distribuzioni di Probabilita Univariate. . . . . . . . . . . . . . . 36

7.1 Alcuni parametri grafici. . . . . . . . . . . . . . . . . . . . . . . . 47

8.1 Principali diagrammi statistici. . . . . . . . . . . . . . . . . . . . 50

5

Page 6: Dispensa R

6 ELENCO DELLE TABELLE

Page 7: Dispensa R

Elenco delle figure

2.1 Console di R. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2 Dizionario alfabetico dell’aiuto in linea. . . . . . . . . . . . . . . 12

7.1 Diagrammi di funzioni con plot(). . . . . . . . . . . . . . . . . . 427.2 Funzioni di densita gaussiane. . . . . . . . . . . . . . . . . . . . . 437.3 Funzione di probabilita binomiale. . . . . . . . . . . . . . . . . . 447.4 Funzioni di ripartizione binomiale e normale. . . . . . . . . . . . 457.5 Ottagono regolare. . . . . . . . . . . . . . . . . . . . . . . . . . . 467.6 Cerchi casuali. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

8.1 Campione Banca d’Italia: distribuzione territoriale delle famiglie. 518.2 Campione Banca d’Italia: numero di componenti delle famiglie

per area territoriale. . . . . . . . . . . . . . . . . . . . . . . . . . 538.3 Campione Banca d’Italia: reddito familiare per area territoriale. 558.4 Campione Banca d’Italia: distribuzione del reddito familiare con

interpolante lognormale. . . . . . . . . . . . . . . . . . . . . . . . 568.5 Campione Banca d’Italia: quantili del reddito empirici e basati

sul modello lognormale. . . . . . . . . . . . . . . . . . . . . . . . 578.6 Voto di laurea in Economia. . . . . . . . . . . . . . . . . . . . . . 598.7 Voto di diploma dei laureati in Economia. . . . . . . . . . . . . . 608.8 Campione Banca d’Italia: quantili del reddito nelle aree territoriali. 628.9 Campione Banca d’Italia: curva di concentrazione di Lorenz. . . 64

9.1 Dendrogramma delle variabili socio-demografiche. . . . . . . . . . 679.2 Frazione di famiglie con un solo componente e frazione di separati

e divorziati. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699.3 Diagramma di dispersione delle componenti principali standard-

izzate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719.4 Biplot dei comuni e delle variabili socio-demografiche. . . . . . . 729.5 Errore di approssimazione dei dati socio-demografici dei comuni. 73

10.1 Redditi e consumi familiari pro capite (scala logaritmica). . . . . 7610.2 Influenza delle variabili di stratificazione sulla relazione reddito

consumo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

7

Page 8: Dispensa R

8 ELENCO DELLE FIGURE

Page 9: Dispensa R

Capitolo 1

Cos’e R?

Come S-Plus, R e figlio del linguaggio S, sviluppato negli anni ottanta del secoloscorso presso i Bell Laboratories AT&T da R. Becker, J. Chambers e A. Wilks.L’atto di nascita ufficiale e l’articolo di R. Ihaka e R. Gentleman R: a language

for data analysis and graphics [2] apparso nel 1996 sul Journal of Computational

and Graphical Statistics. Da allora il software si e sviluppato grazie ai contributidei ricercatori del Comprehensive R Archive Network (CRAN).

A differenza di S-Plus, R e un software non commerciale, ed e distribuitogratuitamente sotto le condizioni dettate dalla GNU Public Licence della FreeSoftware Foundation. La sua caratteristica distintiva e di essere open source,il che significa che l’utente ha la possibilita di accedere al codice che sta allabase del programma, ed eventualmente modificarlo e redistribuirlo. Un altropunto di forza e la compatibilita con gran parte dei sistemi operativi in uso, daWindows a Linux, da Unix a Mac/OS.

Ma cos’e R? Lo si puo definire un linguaggio di programmazione e, nellostesso tempo, un sistema integrato di calcolo le cui risorse consentono di

• specificare un insieme di comandi e richiederne l’esecuzione,

• visualizzare i risultati in formato testo,

• visualizzare i grafici in una finestra ausiliaria,

• accedere ad archivi esterni, anche sulla rete, per acquisire documenti, datie grafici,

• archiviare in modo permanente risultati e/o grafici.

Il software di R, con la relativa documentazione, cosı come le informazioni suaggiornamenti e progetti collaterali, sono facilmente ottenibili dalla rete. Eccogli indirizzi piu utili.

• http://www.r-project.org: pagina principale,

• http://cran.at.r-project.org/sources.html: software,

9

Page 10: Dispensa R

10 CAPITOLO 1. COS’E R?

• http://cran.at.r-project.org/manuals.html: documentazione,

• http://cran.at.r-project.org/faqs.html: archivio delle domande piufrequenti,

• http://cran.at.r-project.org/mail.html: mailing list.

La guida di riferimento di R e [3]

R Development Core Team, A language and environment for statistical

computing,R Foundation for Statistical Computing, Vienna, 2006

(http://www.R-project.org).

Applicazioni della metodologia statistica di base con R sono illustrate nelmanuale di S. M. Iacus e G. Masarotto, Laboratorio di Statistica con R, McGraw-Hill, 2007 [1].

Lo sviluppo del sistema e curato dalla Fondazione R, raggiungibile all’indi-rizzo http://www.r-project.org/foundation/main.html, sostenuta finanzia-riamente da contributi di una rete di universita, istituzioni ed imprese sparsein tutto il mondo. R e affiancato da progetti che mirano a sviluppare softwarededicato ad applicazioni particolari. Ricordiamo tra gli altri

• Bioconductor (http://www.bioconductor.org): analisi statistica di datidi espressione genica,

• gR (http://www.r-project.org/gR): modelli grafici statistici.

Page 11: Dispensa R

Capitolo 2

Primi passi

Quando si lancia R mediante l’eseguibile Rgui.exe si apre una finestra, la consoledi R (illustrata nella Figura 2.1), contenente informazioni sulla versione delprogramma e l’aiuto in linea.

Figura 2.1: Console di R.

Il segnale che il sistema e pronto a ricevere i comandi e il simbolo di maggioreche appare sul lato sinistro della console

>

R non supporta menu se non in misura limitata percio i comandi devonoessere digitati sulla tastiera e vengono eseguiti premendo il tasto Enter. Ilsegnale del sistema e i comandi sono evidenziati in rosso. Commenti e noteesplicative si possono inserire dopo il carattere # (cancelletto). Data e ora siottengono mediante la funzione date()

> date()

[1] ’’Fri Dec 17 19:01:33 2007’’

Per uscire dal sistema si da il comando

> q()

Il sistema offre varie forme di assistenza. L’assistenza in linea si ottienedigitando il punto interrogativo seguito dal nome della funzione desiderata. Adesempio eseguendo

> ?mean

il sistema visualizza in una finestra a parte la descrizione della funzione mean

(media aritmetica di un insieme di dati).Il comando

11

Page 12: Dispensa R

12 CAPITOLO 2. PRIMI PASSI

> help.start()

apre un file HTML contenente informazioni sui diversi elementi del programma,in particolare sulle librerie disponibili. Utilissimo l’elenco alfabetico dei coman-di, illustrato nella Figura 2.2, con descrizioni corredate da esempi e collegamentiipertestuali.

Figura 2.2: Dizionario alfabetico dell’aiuto in linea.

2.1 Operatori aritmetici e logici

R offre tutte le funzionalita di una calcolatrice numerica. Per valutare l’espres-sione numerica (15 + 5)(19 − 15)3/2 si digita il comando

> (15+5)*(19-15)^3/2 # Esempio di espressione numerica

la cui esecuzione produce la visualizzazione sulla console del messaggio

[1] 640

contenente il risultato; [1] indica che la visualizzazione parte dal primo, e inquesto caso unico, dato prodotto dalla valutazione dell’espressione. E impor-tante notare che il risultato stesso non e archiviato in memoria. I simboli

+,−, ∗, /, ˆ, ()

rappresentano gli operatori aritmetici di addizione, sottrazione, moltiplicazione,divisione e potenza e le parentesi. I simboli

==, ! =, <, <=, >, >=

indicano invece gli operatori logici di uguale, diverso, minore e minore o uguale,maggiore e maggiore o uguale . Ne illustriamo l’uso con alcuni esempi.

> 5 == 10 # Proposizione falsa

[1] FALSE

> 5 != -1 # Proposizione vera

[1] TRUE

> 2*(6-8) < -4

[1] FALSE

> 2*(6-8) <= -4

[1] TRUE

TRUE e FALSE indicano le costanti logiche VERO, FALSO. Gli operatori logiciAND (prodotto logico), OR (somma logica), NOT (negazione logica) sono resimediante i simboli

&, |, !il cui uso ` illustrato di seguito.

Page 13: Dispensa R

2.2. VARIABILI E OPERATORE DI ASSEGNAZIONE 13

> (1+4)>0 & (1-10)>0 # Operatore AND

[1] FALSE

> (1+4)>0 | (1-10)>0 # Operatore OR

[1] TRUE

> !(2*(5-10)>0) # Operatore NOT

[1] TRUE

La Tabella 2.1 offre un prospetto riassuntivo degli operatori aritmetici, diconfronto binario e logici.

Operatori Aritmetici+ addizione− sottrazione∗ prodotto/ divisioneˆ potenza%/% divisione intera%% resto della divisione intera

Operatori di Confronto Binario< (<=) minore (minore o uguale)> (>=) maggiore (maggiore o uguale)== uguale! = diverso

Operatori Logici! negazione logica (NOT)& prodotto logico (AND)— somma logica (OR)

Tabella 2.1: Operatori aritmetici, di confronto binario e logici.

2.2 Variabili e operatore di assegnazione

In una sessione di lavoro sorge spesso la necessita di archiviare dati nella memo-ria del computer in modo da poterli usare piu volte. Possiamo ad esempiorichiedere che la variabile cambio contenga il cambio dollaro - euro, circa ugualea 1.4741. Il comando

> cambio <- 1.4741

archivia il numero decimale 1.4741 in un’area della memoria identificata dalnome cambio. La freccia (ottenuta digitando il simbolo di minore, <, seguitodal simbolo di sottrazione, -) e l’operatore di assegnazione . Il comando

> cambio

produce il risultato

Page 14: Dispensa R

14 CAPITOLO 2. PRIMI PASSI

[1] 1.4741

cioe visualizza il contenuto corrente dell’area di memoria corrispondente al nomecambio. Ecco ulteriori esempi.

> 10000/cambio

[1] 6783.8

R gestisce correttamente le situazioni eccezionali.

> 0 -> zero

> 1/zero

[1] Inf

> 10-1/zero

[1] -Inf

> 0*1/zero

[1] NaN

Le costanti numeriche -Inf e Inf sono usate per rappresentare quantitanon limitate mentre NaN (not a number, non e un numero) e il codice utilizzatoper risultati non interpretabili come numeri e nemmeno uguali a -INF o INF.

Page 15: Dispensa R

Capitolo 3

Oggetti

Le entita con cui si opera nell’ambiente di R prendono il nome di oggetti e sonocaratterizzati da due attributi base: mode (traducibile con modo o modalita) elength (lunghezza) .

Mode Mode e la modalita di base degli elementi che formano un oggetto. Cisono quattro modalita fondamentali

• numeric (numero reale),

• complex (numero complesso),

• logical (dato logico, con due possibili determinazioni: vero o falso),

• character (carattere alfanumerico),

• function (funzione), riservata alle funzioni.

Length Length e il numero di elementi che compongono un oggetto.

Gli oggetti piu importanti sono vettore, matrice, data frame, lista, fattore efunzione. La funzione ls() visualizza sulla console l’elenco degli oggetti cor-rentemente presenti nella memoria. La funzione str(nome) produce una brevedescrizione della struttura dell’oggetto nome. La funzione rm(nome1,nome2,...)rimuove dalla memoria gli oggetti specificati.

> ls() # Quali sono gli oggetti presenti nella memoria?

[1] ’’cambio’’ ’’cost’’ ’’zero’’

> rm(cost) # Libera l’area di memoria occupata da cost

> ls()

[1] ’’cambio’’ ’’zero’’

3.1 Vettore

Il vettore e una collezione ordinata di n ≥ 1 componenti aventi tutte la stessamodalita (numeric, complex, logical, character) ed e l’oggetto base di R (uno

15

Page 16: Dispensa R

16 CAPITOLO 3. OGGETTI

scalare e un vettore di lunghezza unitaria. Il metodo piu generale di definire unvettore e di usare la funzione c()(c sta per concatenate, cioe componi in un’unica

sequenza ordinata). Ad esempio, per costruire il vettore vett1 con componentiordinatamente uguali a -1.5, 0, 3, -4 daremo il comando

> vett1 <- c(-1.5,0,3,-4)

> mode(vett1); length(vett1)

[1] ’’numeric’’

[1] 4

Otteniamo un vettore logico se controlliamo quali componenti di vett1 sonominori di zero.

> vett2 <- vett1<0

> vett2

[1] TRUE FALSE FALSE TRUE

> length(vett2) == length(vett1)

[1] TRUE

Vale la pena osservare che, nell’espressione vett1<0, l’operatore di confrontobinario e applicato singolarmente a tutte le componenti del vettore.

Ancora, il vettore vett3 alfanumerico avente come elementi le sigle automo-bilistiche delle province del Veneto si costruisce col comando

> vett2 <- c(’’BL’’,’’PD’’,’’RO’’,’’TV’’,’’VE’’,’’VI’’,’’VR’’)

> mode(vett2); length(vett2)

[1] ’’character’’

[1] 7

La funzione rep() (da repeat, ripeti) crea vettori con elementi ripetuti, comead esempio

> rep(1,times=5)

[1] 1 1 1 1 1

> rep(c(0,1),c(5,5)) # forma breve

[1] 0 0 0 0 0 1 1 1 1 1

> rep(c(0,1),5)

[1] 0 1 0 1 0 1 0 1 0 1

La funzione seq() (sequence, sequenza) produce vettori con componentiequispaziate.

> seq(from=0,to=1,by=0.2)

[1] 0.0 0.2 0.4 0.6 0.8 1.0

> seq(0,1,0.3) # forma breve

[1] 0.0 0.3 0.6 0.9

Un operatore utilissimo e “:” che produce vettori con elementi separati daintervalli unitari.

Page 17: Dispensa R

3.2. MATRICE 17

> 15:20

[1] 15 16 17 18 19 20

> c(1.1:5,5.5:8.5)

[1] 1.1 2.1 3.1 4.1 5.5 6.5 7.5 8.5

3.2 Matrice

La matrice (piu in generale, un array) e una generalizzazione multivariata delvettore. Una matrice n × m si puo considerare come la collezione ordinata deisuoi n vettori riga (ciascuno con m componenti) o dei suoi m vettori colonna(ciascuno con n componenti). Come per i vettori, gli elementi di una matricedevono avere la stessa modalita (non necessariamente numeric).

La funzione piu semplice per definire una matrice e matrix(). La matrice4 × 3 avente nelle colonne i numeri da 1 a 12 si ottiene con

> matr1 <- matrix(1:12,nrow=4,ncol=3,byrow=FALSE)

> matr1

[,1] [,2] [,3]

[1,] 1 5 9

[2,] 2 6 10

[3,] 3 7 11

[4,] 4 8 12

> length(matr1); dim(matr1); str(matr1)

[1] 12

[1] 4 3

int [1:4, 1:3] 1 2 3 4 5 6 7 8 9 10 ...

La funzione dim() (da dimensions, dimensioni) restituisce ordinatamente ilnumero di righe e di colonne. I seguenti comandi costruiscono la matrice nulla3 × 3 e la matrice identica d’ordine tre.

> matrix(0,3,3)

[,1] [,2] [,3]

[1,] 0 0 0

[2,] 0 0 0

[3,] 0 0 0

> matrix(c(rep(c(1,0,0,0),2),1),3,3)

[,1] [,2] [,3]

[1,] 1 0 0

[2,] 0 1 0

[3,] 0 0 1

3.3 Data Frame

E un oggetto simile ad una matrice, ma i vettori colonna possono avere modalitadiverse. Un esempio importante di data frame e la matrice dati derivante dalla

Page 18: Dispensa R

18 CAPITOLO 3. OGGETTI

rilevazione di m variabili (non necessariamente tutte numeriche) su n unitastatistiche. Supponiamo ad esempio di aver rilevato nome, numero di matricola,genere ed eta di un campione di cinque studenti e di aver ordinato i dati diciascuna variabile in un vettore.

> nome <- c(’’Dino’’,’’Anna’’,’’Luisa’’,’’Marco’’,’’Paolo’’)

> matr <- c(492311,500542,596759,486415,678076)

> gen <- c(’’M’’,’’F’’,’’F’’,’’M’’,’’M’’)

> eta <- c(22,19,20,23,24)

Per ordinare dati osservati in un’unica tabella in cui le righe corrispondonoagli studenti, le colonne alle variabili e utile la funzione data.frame().

> dati <- data.frame(matr,gen,eta,row.names = nome)

> dati

matr gen eta

Dino 492311 M 22

Anna 500542 F 19

Luisa 596759 F 20

Marco 486415 M 23

Paolo 678076 M 24

L’opzione row.names = nome associa ad ogni riga un’etichetta corrispon-dente alla determinazione di nome. Se non l’avessimo specificata le etichettesarebbero state 1, 2, 3, 4, 5. L’oggetto dati non puo avere una struttura dimatrice perche le colonne hanno tipologie differenti.

3.4 Fattore

E un vettore le cui componenti corrispondono ai gruppi individuati da unaclassificazione. L’utilizzazione piu frequente e la ripartizione delle n unita diun collettivo in gruppi corrispondenti alle determinazioni distinte di una varia-bile categoriale. Nell’esempio del campione di studenti possiamo considerareil gruppo dei maschi e quello delle femmine. La funzione factor() crea unfattore assegnando opportune etichette alle modalita. Una funzione frequente-mente usata con i fattori e tapply(oggetto, fattore, funzione) che applicauna funzione specificata ai gruppi definiti dalle determinazioni di un fattore.

> genere <- factor(gen,labels=c(’’Femmina’’,’’Maschio’’))

> mean(eta) # media complessiva

[1] 21.6

> tapply(eta,genere,mean) # medie parziali

Femmina Maschio

19.5 23.0

> tapply(eta,genere,length) # dimensioni dei gruppi

Femmina Maschio

2 3

Page 19: Dispensa R

3.5. LISTA 19

Nell’esempio precedente tapply(, ,mean) calcola l’eta media separatamenteper le femmine e per i maschi mentre tapply(, ,length) fornisce le numerositadei due gruppi.

3.5 Lista

La lista generalizza ulteriormente la nozione di vettore perche gli elementi pos-sono avere modalita diverse ed essere a loro volta vettori, matrici, liste. I risul-tati di molte funzioni statistiche hanno questa struttura. Illustriamo di seguitola costruzione di una lista contenente le regioni delle Venezie, il numero dellerispettive province e le corrispondenti sigle automobilistiche.

> reg <- c(’’FriuliVG’’,’’TrentinoAA’’,’’Veneto’’)

> npr <- c(4,2,7)

> pfvg <- c(’’GO’’,’’PN’’,’’TS’’,’’UD’’)

> ptaa<-c(’’BZ’’,’’TN’’)

> pven <- c(’’BL’’,’’PD’’,’’RO’’,’’TV’’,’’VE’’,’’VI’’,’’VR’’)

La funzione che costruisce la lista e list().

> venezie <- list(regione=reg,nprov=npr,

+ province=list(pfvg,ptaa,pven))

> venezie

$regione

[1] ’’FriuliVG’’ ’’TrentinoAA’’ ’’Veneto’’

$nprov

[1] 4 2 7

$province

$province[[1]]

[1] ’’GO’’ ’’PN’’ ’’TS’’ ’’UD’’

$province[[2]]

[1] ’’BZ’’ ’’TN’’

$province[[3]]

[1] ’’BL’’ ’’PD’’ ’’RO’’ ’’TV’’ ’’VE’’ ’’VI’’ ’’VR’’

3.6 Funzione

Le funzioni (sia quelle interne del sistema sia quelle definite dagli utenti) sonooggetti con modalita function. Ne abbiamo gia incontrato svariati esempi, comegli operatori aritmetici e logici, le funzioni che costruiscono gli oggetti (c(),matrix(), data.frame(), list(), factor()) e quelle che ne descrivono lecaratteristiche (mode(), length(), dim()). Funzioni come ls(), rm() permet-tono di controllare l’insieme degli oggetti presenti nella memoria. La funzionemean() esegue invece una trasformazione di un vettore numerico, cioe il calcolodella corrispondente media aritmetica. La Tabella 3.1 riporta un elenco di altrefunzioni di questo tipo. Vale la pena osservare che, mentre il risultato di funzioni

Page 20: Dispensa R

20 CAPITOLO 3. OGGETTI

Funzione R Risultatomin(x), max(x) elemento minimo (massimo)range(x) vettore con elementi min(x), max(x)sum(x), prod(x) somma (prodotto)sort(x) vettore ordinato in modo crescenteabs(x) valore assolutosqrt(x) radice quadratalog(x), log10(x) logaritmo (naturale e in base 10)exp(x) esponenzialesin(x), cos(x), tan(x) funzioni trigonometricheasin(x), acos(x), atan(x) funzioni trigonometriche inverse

Tabella 3.1: Funzioni elementari.

come sort(), sum(), min(), max() dipende da tutte le componenti del vettore,le funzioni abs(), sqrt() ecc. operano separatamente su ciascuna componente.

Tipicamente, le funzioni definite dall’utente eseguono microprogrammi cherisolvono problemi particolari. L’esempio seguente mostra la definizione di unafunzione che calcola la media geometrica1 di n numeri positivi.

> mgeo <- function(x)

+ {

+ if (length(x)==0) return(NaN)

+ if(!is.numeric(x)) return(NaN)

+ if(min(x)<0) return(NaN)

+ if(min(x)==0) return(0)

+ if(min(x)>0) return(prod(x)^(1/length(x)))

+ }

> mgeo(1:3)

[1] 1.817121

> mgeo(c(-1,3,5))

[1] NaN

Il nome della funzione e mgeo e gli argomenti ammissibili sono vettori nu-merici con componenti non negative. Il programma comprende alcuni controllisui dati. Se, ad esempio, il vettore non e numerico oppure ci sono dati negativi,il risultato predefinito e NaN. Il costrutto if (cond) expr esegue l’espressioneexpr a condizione che cond sia vera. Il costrutto if (cond) expr1 else expr2

esegue expr1 se cond e vera, altrimenti esegue expr2.Come ulteriore esempio proponiamo un microprogramma per la generazione

dei primi n numeri di Fibonacci2.

> fibon <- function(x)

1La media geometrica dei numeri positivi x1, ..., xn e la radice n-esima del prodotto dix1, ..., xn.

2La successione di Fibonacci e definita dalle proprieta x1 = x2 = 1 e, per i > 2, xi =xi−1 + xi−2.

Page 21: Dispensa R

3.7. CAMBIARE MODALITA 21

+ {

+ str1 <- ’’Numeri di Fibonacci minori di (o uguali a)’’

+ str2 <- ’’Argomento della funzione non numerico’’

+ str3 <- ’’Argomento della funzione minore di 1’’

+ if (!is.numeric(x)) stop(str2)

+ if (is.numeric(x) & x < 1) stop(str3)

+ if (is.numeric(x) & trunc(x) == 1)

+ {

+ print(c(str1,as.character(1)),quote=F)

+ print(as.character(1),quote=F)

+ }

+ if (is.numeric(x) & trunc(x) == 2)

+ {

+ print(c(str1,as.character(2)),quote=F)

+ print(as.character(c(1,1)),quote=F)

+ }

+ if (is.numeric(x) & trunc(x) > 2)

+ {

+ vett <- numeric(); vett[1] <- 1; vett[2] <- 1

+ for (i in 3:trunc(x)) vett[i] <- vett[i-1] + vett[i-2]

+ print(c(str1,as.character(trunc(x))),quote=F)

+ print(as.character(vett),quote=F)

+ }

+ }

> fibon(8)

[1] Numeri di Fibonacci minori di (o uguali a)

[2] 8

[1] 1 1 2 3 5 8 13 21

Il costrutto for (i in i1:i2) espressione esegue in sequenza i comandicontenuti in espressione facendo variare i da i1 a i2. La funzione stop(messaggio)provoca l’arresto dell’esecuzione dell’espressione corrente e visualizza il contenu-to di messaggio.

> fibon(-6)

Error in fibon(-6) : Argomento della funzione minore di 1

3.7 Cambiare modalita

E possibile, con alcune limitazioni, cambiare la modalita di un oggetto median-te funzioni del tipo as.character(), as.logical(), as.numeric(). Comeregola generale, un oggetto puo sempre essere convertito a modalita carattereracchiudendo fra virgolette (”) le sue determinazioni, mentre la conversione amodalita logica o numerica puo provocare la sostituzione di dati col codice NA

(not available, dato mancante).

Page 22: Dispensa R

22 CAPITOLO 3. OGGETTI

Cosı as.logical(x) converte il numero 0 nella costante logica FALSE e tuttigli altri numeri nella costante logica TRUE; inoltre essa converte le stringhe dicaratteri ’’FALSE’’, ’’F’’ nella costante logica FALSE e le stringhe ’’TRUE’’,’’T’’ nella costante logica TRUE. Tutte le altre stringhe di caratteri sono tradottecome NA.

A sua volta, la funzione as.numeric(x) traduce le costanti logiche FALSE eTRUE nelle costanti numeriche 0 e 1, rispettivamente; inoltre stringhe di caratteridel tipo ”1”, ”2.5” , interpretabili come dati numerici, sono tradotte nelle cor-rispondenti costanti numeriche 1, 2.5. Tutte le altre stringhe di caratteri sonotradotte come NA.

Queste regole sono documentate dai seguenti esempi. La costante numericapi corrisponde al numero reale pi greco3 approssimativamente uguale a 3.1415....

> as.character(2.34)

[1] ’’2.34’’

> as.character(pi)

[1] ’’3.14159265358979’’

as.character(1 > 0)

[1] ’’TRUE’’

as.logical(pi)

[1] TRUE

> as.logical(’’pi’’)

[1] NA

3Pi greco e il rapporto delle lunghezze di una circonferenza e del suo diametro.

Page 23: Dispensa R

Capitolo 4

Lavorare con gli oggetti

Eseguire un calcolo, o elaborare dati, equivale a trasformare un insieme di oggettix1, ..., xn in un insieme di oggetti y1, ..., ym mediante opportune funzioni. Comeabbiamo visto, insieme agli oggetti-tipo del Capitolo 3, R mette a disposizio-ne moltissime funzioni, comprese tutte le funzioni matematiche di base (vediTabella 3.1).

4.1 Vettori numerici

Se x, y sono vettori numerici con n componenti e a, b sono numeri reali, lacombinazione lineare di x e y e il vettore z = ax+by in cui la componente j-esimadi z e zj = axj + byj . Vale la pena osservare che il risultato e ottenuto in duepassi: prima si moltiplicano le componenti di x e di y per a e b, rispettivamente,poi si sommano le componenti corrispondenti. La combinazione lineare di unnumero finito qualsiasi di vettori si ottiene in modo analogo.

> x <- 1:5; y <- rep(1,5); a <- 2; b <- -1

> a*x+b*y

[1] 1 3 5 7 9

In R e ammessa la somma algebrica di vettori di dimensione diversa. Inparticolare, se x e un vettore con n componenti e a e un numero reale, latrasformazione x + a produce il vettore z con componenti zj = xj + a.

> x <- seq(1,5,0.5); a <- -0.5

> x+a

[1] 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5

Le usuali funzioni matematiche, se hanno per argomento un vettore, sonoapplicate componente per componente.

> x <- 1:3

> x^2

23

Page 24: Dispensa R

24 CAPITOLO 4. LAVORARE CON GLI OGGETTI

Funzione Risultatoceiling(x) minimo intero maggiore o uguale a xfloor(x) massimo intero minore o uguale a xround(x,m) arrotonda x ad m cifre decimalisignif(x,m) arrotonda x ad m cifre complessivetrunc(x) tronca le cifre decimali

Tabella 4.1: Arrotondamento.

[1] 1 4 9

> sqrt(x)

[1] 1.000000 1.414214 1.732051

La Tabella 4.1 elenca le funzioni per l’arrotondamento di valori numerici. Lapiu importante e round(x, m), che arrotonda le componenti del vettore x adm cifre decimali (default m = 0).

> x <- sqrt(1:10)

> round(x); round(x,2)

[1] 1 1 2 2 2 2 3 3 3 3

[1] 1.00 1.41 1.73 2.00 2.24 2.45 2.65 2.83 3.00 3.16

4.2 Matrici

R mette a disposizione un buon apparato di funzioni per la trasformazione dimatrici (Tabella 4.2).

I seguenti esempi mostrano l’uso della funzione diag(x). In generale, sex e una matrice quadrata, diag(x) produce il vettore degli elementi diagonalidi x; se x e un vettore, diag(x) produce una matrice diagonale con elementidiagonali ordinatamente uguali alle componenti di x.

> diag(matrix(1:9,3,3))

[1] 1 5 9

> diag(rep(1,3))

[,1][,2][,3]

[1,] 1 0 0

[2,] 0 1 0

[3,] 0 0 1

Per vettorializzare una matrice basta applicare la funzione as.vector().

> as.vector(matrix(1:9,3,3))

[1] 1 2 3 4 5 6 7 8 9

La traccia, somma degli elementi della diagonale principale di una matricequadrata, si ottiene mediante la funzione sum().

Page 25: Dispensa R

4.3. ESTRAZIONE E MODIFICA DI ELEMENTI DI OGGETTI 25

Funzione R Risultatochol(x) triangolarizzazione di CholeskicolSums(x) (rowSums(x)) somme di colonna (riga)det(x) determinanteeigen(x) autovalori, autovettoriqr(x) scomposizione QRsolve(x) inversasvd(x) scomposizione in valori singolarit(x) trasposta

Tabella 4.2: Funzioni di matrici.

> m1 <- matrix(1:9,3,3))

> sum(diag(m1))

[1] 15

L’operatore del prodotto righe per colonne e %*% . Se le matrici non hannodimensioni compatibili, si ottiene un messaggio d’errore.

> m1 <- matrix(1:6,3,2); m2 <- matrix(c(-1,1,0,1),2,2)

< m3 <- rep(1,3)

> m1%*%m2

[,1][,2]

[1,] 3 4

[2,] 3 5

[3,] 3 6

> m1%*%m3

Error in m1 %*% m3 : non-conformable arguments

Per costruire matrici a blocchi, o aggiungere righe o colonne a matrici preesisten-ti, sono utili le funzioni rbind(), cbind(). La prima giustappone le righe, laseconda le colonne.

> rbind(cbind(matrix(1,2,2),matrix(0,2,2)),

+ cbind(matrix(0,2,2),matrix(2,2,2)))

[,1][,2][,3][,4]

[1,] 1 1 0 0

[2,] 1 1 0 0

[3,] 0 0 2 2

[4,] 0 0 2 2

4.3 Estrazione e modifica di elementi di oggetti

Un problema frequente e la costruzione di nuovi oggetti mediante elementi dioggetti gia esistenti, di solito vettori, matrici o liste. Gli operatori piu importantiper effettuare queste trasformazioni sono [ ], per vettori e matrici, [[ ]] per leliste.

Page 26: Dispensa R

26 CAPITOLO 4. LAVORARE CON GLI OGGETTI

Se x e un vettore, x[i] restituisce l’elemento i-esimo xi, x[−i] restituisce ilvettore x privato dell’elemento i-esimo e x[c(i1, i2, ..., ik)] restituisce il vettorecon elementi xi1 , xi2 , ..., xik

.

> v <- c(-10,4,-3,0,1,1.5,10,6)

> v[5] # Componente 5

[1] 1

> v[2:5] # Componenti 2, 3, 4 e 5

[1] 4 -3 0 1

> v[-length(v)] # Elimina l’ultima componente

[1] -10.0 4.0 -3.0 0.0 1.0 1.5 10.0

> v[1] <- 8 # Ridefinisce la prima componente

> v

[1] 8.0 4.0 -3.0 0.0 1.0 1.5 10.0 6.0

Se y e una matrice, y[i, j] restituisce l’elemento yij mentre y[i, ] e y[, j] resti-tuiscono, rispettivamente, riga i-esima e colonna j-esima di y. Valori negatividegli argomenti dell’operatore [ ] cancellano da y gli elementi corrispondenti.

> y <- matrix(1:10,2,5)

[,1] [,2] [,3] [,4] [,5]

[1,] 1 3 5 7 9

[2,] 2 4 6 8 10

> y[2,5] # Elemento sulla seconda riga e quinta colonna

[1] 10

> y[1,] # Prima riga

[1] 1 3 5 7 9

> y[-1,] # Elimina la prima riga

[1] 2 4 6 8 10

> y[,5] # Quinta colonna

[1] 9 10

> y[,1:3] # Prime tre colonne

[,1] [,2] [,3]

[1,] 1 3 5

[2,] 2 4 6

> y[,5] <- rep(1,2) # Ridefinisce la quinta colonna

> y

[,1] [,2] [,3] [,4] [,5]

[1,] 1 3 5 7 1

[2,] 2 4 6 8 1

4.4 Subsetting

Gli esempi precedenti illustrano l’uso dell’operatore [ ] per selezionare elementidi vettori o matrici in base alla posizione. Lo stesso operatore consente diselezionare elementi con proprieta specificate, non necessariamente dipendenti

Page 27: Dispensa R

4.5. STRINGHE DI CARATTERI 27

dalla posizione. Gli esempi sottostanti mostrano come estrarre da un vettore lecomponenti positive e contare il numero di componenti uguali a zero.

> vett <- c(-10,1,0.5,-3,4,10,0)

> vett[vett>0] # Estrae le componenti positive

[1] 1.0 0.5 4.0 10.0

> length(vett[vett == 0]) # Conta le componenti nulle

[1] 1

Nel seguente esempio le componenti negative sono poste uguali a zero.

> vett[vett < 0] <- 0

> vett

[1] 0.0 1.0 0.5 0.0 4.0 10.0 0.0

4.5 Stringhe di caratteri

Operazioni frequenti sulle stringhe di caratteri alfanumerici sono conteggio deicaratteri, conversione maiuscolo/minuscolo, ricerca, estrazione o sostituzione disottostringhe .

Dato un vettore alfanumerico x, nchar(x) fornisce il numero di caratteridelle singole componenti, mentre tolower(x) e toupper(x) riscrivono tutti icaratteri alfabetici in formato minuscolo e maiuscolo, rispettivamente

> vett <- c(’’cANe’’,’’GATTO’’,’’Topo’’)

> nchar(vett)

[1] 4 5 4

> tolower(vett)

[1] ’’cane’’ ’’gatto’’ ’’topo’’

> toupper(vett)

[1] ’’CANE’’ ’’GATTO’’ ’’TOPO’’

La funzione paste(str1,str2,...) fonde le componenti corrispondenti deivettori alfanumerici str1, str2, ..., inserendo eventuali separatori. Al contrario,strsplit(x,str) divide le componenti del vettore alfanumerico x in corrispon-denza alle sottostringhe specificate dalle componenti del vettore str. Il risultatoe una lista degli spezzoni cosı originati. Negli esempi che seguono usiamo i vet-tori alfanumerici letters e LETTERS i cui elementi sono le lettere minuscole emaiuscole dell’alfabeto latino.

> paste(LETTERS[1],1:3,sep=’’’’)

[1] ’’A1’’ ’’A2’’ ’’A3’’

> paste(LETTERS[1],1:3,sep=’’_’’)

[1] ’’A_1’’ ’’A_2’’ ’’A_3’’

> unlist(strsplit(’’Nel mezzo del cammin di nostra vita’’,’’ ’’))

[1] ’’Nel’’ ’’mezzo’’ ’’del’’ ’’cammin’’ ’’di’’ ’’nostra’’ ’’vita’’

> unlist(strsplit(’’Dante’’,’’’’))

[1] ’’D’’ ’’a’’ ’’n’’ ’’t’’ ’’e’’

Page 28: Dispensa R

28 CAPITOLO 4. LAVORARE CON GLI OGGETTI

La ricerca di una particolare combinazione di caratteri in una stringa al-fanumerica e eseguita dalle funzioni grep() e regexpr(). Se x e un vettorealfanumerico, grep(str,x) restituisce gli indici delle componenti di x conte-nenti la sottostringa str, mentre regexpr(str,x) fornisce le posizioni in cuiinizia la sottostringa str all’interno di ogni componente di x (se la sottostringacercata non e presente, la posizione e posta uguale a −1).

> vett <- c(’’Po’’,’’topo’’,’’gatto’’,’’ippopotamo’’)

> grep(’’po’’,vett)

[1] 2 4

> regexpr(’’po’’,vett)

[1] -1 3 -1 3

attr(,’’match.length’’)

[1] -1 2 -1 2

La funzione gsub(str1,str2,x) sostituisce la sottostringa str2 al posto distr1 in tutte le componenti di x.

> gsub(’’po’’,’’PO’’,vett)

[1] ’’Po’’ ’’toPO’’ ’’gatto’’ ’’ipPOPOtamo’’

Infine, la funzione substring(x,i1,i2) estrae dalle componenti del vettorex le sottostringhe comprese tra le posizioni i1 e i2. La versione substring(x,i1,i2)<- str1 sostituisce la sottostringa con str1.

> testo <- ’’Nel mazzo del cammin’’

> substr(testo,6,6) <- ’’e’’

> testo

[1] ’’Nel mezzo del cammin’’

Nel seguente esempio preleviamo da un vettore alfanumerico le componentiche iniziano con la lettera ”a”.

> vett <- c(’’Alberto’’,’’asino’’,’’burro’’,’’ape’’)

> vett[substr(vett,1,1) == ’’a’’]

[1] ’’asino’’ ’’ape’’

4.6 Dati mancanti

Nell’ambiente di R i dati mancanti sono individuati dal codice NA (not available,non disponibile). Numerose funzioni consentono di riconoscerne la presenzanegli oggetti, rimuoverli oppure specificare le modalita di trattamento. Le piuimportanti sono is.na(), na.fail(), na.omit().

La funzione is.na(x) consente di localizzare eventuali dati mancanti in unoggetto (vettore, matrice o data-frame). Infatti is.na(x) produce un ogget-to dello stesso tipo di x, i cui elementi assumono la determinazione TRUE sel’elemento corrispondente di x e NA, FALSE in caso contrario.

Page 29: Dispensa R

4.6. DATI MANCANTI 29

> x <- c(NA,1:5,NA)

> is.na(x)

[1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE

> length(x[is.na(x)])

[1] 2

La funzione na.fail(x) restituisce l’oggetto x invariato se esso non contieneNA, altrimenti produce un messaggio d’errore.

> na.fail(x)

Error in na.fail.default(x) : missing values in object

La funzione na.omit(x) produce risultati diversi a seconda della natura dix. Se e un vettore, na.omit(x) esclude da x i dati mancanti. Se e una matriceo un data frame, na.omit(x) esclude le righe contenenti (almeno un) NA.

> na.omit(x)

[1] 1 2 3 4 5

> y <- matrix(c(NA,1:6,NA,),4,2)

> na.omit(y)

[,1] [,2]

[1,] 1 5

[2,] 2 6

Quando si eseguono elaborazioni di oggetti con dati mancanti, e quasi sem-pre necessario indicarne esplicitamente le modalita di trattamento onde evitarerisultati imprevisti o messaggi d’errore.

L’esempio piu comune e la media aritmetica mean(x) . Se x contiene NA, ilrisultato della funzione e a sua volta NA perche il comportamento di default edi usare tutte le componenti del vettore. Volendo invece calcolare la media deisoli dati completi si dovra usare la specificazione mean(x, na.rm=TRUE).

> x

[1] NA 1 2 3 4 5 NA

> mean(x)

[1] NA

> mean(x,na.rm=TRUE)

[1] 3

> y <- x; y[is.na(y)] <- mean(x,na.rm=TRUE)

> y

[1] 3 1 2 3 4 5 3

Nel vettore y dell’esempio precedente i dati mancanti di x sono stati sostituitidalla media dei dati osservati.

Un altro esempio e l’ordinamento di un vettore numerico mediante sort(x).In questo caso il trattamento dei dati mancanti e specificato dall’opzione na.lastche puo assumere le determinazioni

Page 30: Dispensa R

30 CAPITOLO 4. LAVORARE CON GLI OGGETTI

• na.last=NA: i dati mancanti sono rimossi dal vettore,

• na.last=TRUE (FALSE): i dati mancanti sono spostati alla fine (all’inizio)del vettore.

> sort(x)

[1] 1 2 3 4 5

> sort(x,na.last=TRUE)

[1] 1 2 3 4 5 NA NA

Page 31: Dispensa R

Capitolo 5

Importazione edesportazione di dati

Le funzioni piu importanti per leggere dati da un archivio esterno sono read.table()e scan().

La funzione read.table() legge da un supporto esterno tabelle di dati informato testo e crea un oggetto di tipo data frame. E particolarmente utile perleggere tabelle unita × variabili, con righe corrispondenti alle unita e colonnecorrispondenti alle variabili. Le numerose opzioni, alcune delle quali descrittenella Tabella 5.1, conferiscono alla funzione grande flessibilita.

Il file studenti.txt riporta, per un campione di sette studenti universitari, levariabili nome, genere, eta, facolta, voto medio. I dati mancanti sono indicaticon “:”.

> stud <- read.table(file=’’c:/studenti.txt’’,header=T,

+ dec=’’,’’,row.names=1,as.is=c(1,4),na.strings=’’:’’)

> stud

Genere Eta Facolta Voto

Sara F 22 Sci 24.5

Mara F 20 Let 26.1

Bruno M 21 Let 28.6

Luca M 25 Eco 23.7

Marco M 20 Eco NA

Elisa F 23 Lin 28.0

Giulia F 21 Let 24.1

Le opzioni utilizzate usano i nomi degli studenti come descrittori delle righee richiedono di trattare le variabili 1 e 4 (nome e facolta) come variabili al-fanumeriche. Si noti anche la specificazione del punto decimale e dei datimancanti.

Una variante di read.table(), read.csv(), consente la lettura dei formati.csv.

31

Page 32: Dispensa R

32 CAPITOLO 5. IMPORTAZIONE ED ESPORTAZIONE DI DATI

Opzione Contenutofile nome del file esterno (puo essere un indirizzo web)header variabile logica (T/F): la prima riga del file contiene i nomi

delle variabili?dec carattere usato nel file esterno per separare le cifre intere

da quelle decimalirow.names vettore dei descrittori delle righe (default: 1, 2, ...)col.names vettore dei descrittori delle colonne (default: V1, V2, ...)as.is vettore logico o numerico per controllare la conversione di

variabili alfanumeriche in fattorina.strings codifica dei dati mancanti nel file esterno (il codice R

e NA, not available)skip numero di righe da saltare prima di iniziare la lettura

Tabella 5.1: Opzioni di read.table.

La funzione scan() da la possibilita di associare ai dati esterni oggetti ditipo diverso (vettori, matrici, data frame, liste) ed e dunque piu generale diread.table(). Vediamo come si possa creare una lista con i dati degli studenti.

> scan(’’c:/studenti.txt’’,skip=1,

+ what=list(’’’’,’’’’,0,’’’’,0),dec=’’,’’,na.strings=’’:’’)

[[1]]

[1] ’’Sara’’ ’’Mara’’ ’’Bruno’’ ’’Luca’’ ’’Marco’’ ’’Elisa’’ ’’Giulia’’

[[2]]

[1] ’’F’’ ’’F’’ ’’M’’ ’’M’’ ’’M’’ ’’F’’ ’’F’’

[[3]]

[1] 22 20 21 25 20 23 21

[[4]]

[1] ’’Sci’’ ’’Let’’ ’’Let’’ ’’Eco’’ ’’Eco’’ ’’Lin’’ ’’Let’’

[[5]]

[1] 24.5 26.1 28.6 23.7 NA 28.0 24.1

La funzione scan() condivide con read.table() le opzioni file, dec, skip,na.strings. L’opzione what descrive le caratteristiche dell’oggetto da creare;nell’esempio precedente what=list(’’’’,’’’’,0,’’’’,0) indica che l’oggettoda creare e una lista di cinque vettori dei quali il primo, secondo e quartoalfanumerici, il terzo e quinto numerici.

La scrittura di un data frame su un file esterno e eseguita dalla funzionewrite.table(). Le opzioni principali sono specificate nella Tabella 5.2.

L’esempio seguente illustra la scrittura del data frame stud su un file esterno.

> write.table(stud,file=’’c:/stud1.txt’’,row.names=T,

+ col.names=TRUE,quote=FALSE,na=’’:’’,dec=’’.’’)

L’opzione quote=FALSE richiede di non usare le virgolette per le variabilialfanumeriche.

Page 33: Dispensa R

33

Opzione Contenutox nome dell’oggetto da scriverefile nome del filequote variabile logica che specifica le variabili da scrivere tra virgolettena codifica dei dati mancantidec codifica del punto decimalerow.names variabile logica (T/F): i descrittori delle righe vanno indicati?col.names variabile logica (T/F): i descrittori delle colonne vanno indicati?

Tabella 5.2: Opzioni di write.table.

La funzione write.table() puo essere usata per scrivere su un file unoggetto diverso da un data frame. L’esempio seguente illustra il caso dellematrici.

> matr <- matrix(1:10,5,2)

> write.table(matr,file=’’c:/matr.txt’’,

+ row.names=FALSE,col.names=FALSE,quote=FALSE)

Page 34: Dispensa R

34 CAPITOLO 5. IMPORTAZIONE ED ESPORTAZIONE DI DATI

Page 35: Dispensa R

Capitolo 6

Distribuzioni di probabilita

La Statistica modella i dati empirici come interazione di componenti sistemati-che (segnale) e componenti erratiche (errore), quest’ultime interpretate comedeterminazioni di opportune distribuzioni di probabilita. Largamente usatenelle applicazioni sono le distribuzioni binomiale e di Poisson nel caso discreto(dati di conteggio), la normale, l’uniforme e l’esponenziale nel caso continuo(dati derivanti da misurazioni). R comprende una ricca biblioteca di funzioni ingrado di gestire tutte le distribuzioni univariate di impiego corrente. Inoltre lafunzione sample() simula il campionamento casuale, con o senza reimmissione,da una popolazione finita.

6.1 Distribuzioni di probabilita

I nomi delle funzioni associati alle distribuzioni di probabilita sono formatida una parola-chiave che riecheggia la corrispondente distribuzione (norm perla Normale, binom per la Binomiale) con un prefisso che descrive la specificaproprieta della distribuzione. I prefissi sono

• d: funzione di densita (distribuzioni continue) o di probabilita (distribuzionidiscrete),

• p: funzione di ripartizione,

• q: quantili,

• r: generazione di campioni pseudo-casuali.

I parametri delle distribuzioni di probabilita appaiono come opzioni dellafunzione. Cosı, per ottenere i valori della densita normale standard corrispon-denti al numero reale −1.5, si usera la funzione dnorm(-1.5, mean=0, sd=1).Analogamente, per calcolare il quantile d’ordine 0.9 della Binomiale di parametrin = 80, p = 0.6, si usera la funzione qbinom(0.9, size=80, prob=0.6).

La Tabella 6.1 descrive le principali distribuzioni di probabilita fornite da R.Vediamo alcune semplici applicazioni della distribuzione Normale standard.

35

Page 36: Dispensa R

36 CAPITOLO 6. DISTRIBUZIONI DI PROBABILITA

Distribuzione Nome R ParametriBeta beta shape1, shape2Binomiale binom size, probCauchy cauchy location, scaleChi quadrato chisq df, ncpEsponenziale exp rateF di Snedecor f df1, df2, ncpGamma gamma shape, scaleGeometrica geom probIperg hyper m, n, kNormale norm mean, sdPoisson pois lambdat di Student t df, ncpUniforme unif min, max

Tabella 6.1: Distribuzioni di Probabilita Univariate.

> round(dnorm(-3:3,mean=0,sd=1),4) # funzione di densita’

[1] 0.0044 0.0540 0.2420 0.3989 0.2420 0.0540 0.0044

> round(pnorm(-3:3,mean=0,sd=1),4) # funzione di ripartizione

[1] 0.0013 0.0228 0.1587 0.5000 0.8413 0.9772 0.9987

> round(qnorm(seq(0,1,by=0.1),mean=0,sd=1),2) # decili

[1] -Inf -1.28 -0.84 -0.52 -0.25 0.00 0.25 0.52 0.84 1.28 Inf

> camp <- rnorm(100,mean=0,sd=1) # campione di 100 elementi

# quanti dati nell’intervallo (-1, 1)?

> length(camp[(camp>-1) & (camp<1)])

[1] 71

# quanti dati sono esterni all’intervallo (-3, 3)?

> length(camp[(camp<-3) |(camp>3)])

[1] 0

Passiamo ora a considerare alcuni tipici problemi riguardanti la distribuzioneBinomiale.

> round(dbinom(48:52,size=100,prob=0.5),3) # funzione di probabilita’

[1] 0.074 0.078 0.080 0.078 0.074

> round(pbinom(48:52,size=100,prob=0.5),3) # funzione di ripartizione

[1] 0.382 0.460 0.540 0.618 0.691

> qbinom(seq(0,1,by=0.2),size=100,prob=0.5) # quintili

[1] 0 46 49 51 54 100

> camp <- rbinom(100,size=10000,prob=0.5) # campione di 100 elementi

> length(camp[(camp/10000>0.49) & (camp/10000<0.51)])

[1] 98

La funzione stem() fornisce la presentazione a ramo e foglie di un campionenumerico univariato, che aiuta a visualizzare le caratteristiche dei dati. Nell’e-

Page 37: Dispensa R

6.2. CAMPIONAMENTO 37

sempio seguente confrontiamo due campioni estratti da una normale standarde da una t di Student con cinque gradi di liberta.

> camp1 <- rnorm(100,mean=0,sd=1); camp2 <- rt(100,df=5)

> stem(camp1,scale=0.5)

The decimal point is at the |

-2 |0

-1 |9555554221111

-0 |9999987777665444444333221111111100

0 |000111112222223334444445556677888899999

1 |02345577799

2 |12

> stem(camp2)

The decimal point is at the |

-2 |61

-1 |98666533210000

-0 |998877766554444333222222110000

0 |001122333334444556666677778888999

1 |00011123456679

2 |0122

3 |69

4 |4

In accordo con i risultati teorici, i dati provenienti dalla distribuzione t hannolo stesso posizionamento ma appaiono piu dispersi di quelli provenienti dallanormale.

6.2 Campionamento

La funzione sample() interviene in tutti i problemi in cui si richiede l’es-trazione di un campione casuale da una popolazione finita. La forma generalee sample(x, opzioni) in cui x e un vettore (numerico, logico o alfanumerico)che descrive la popolazione da campionare e le opzioni specificano il disegnocampionario. Esse sono

• size: numerosita del campione,

• replace: variabile logica con modalita TRUE oppure FALSE a seconda chele estrazioni siano con o senza reimmissione,

• prob: vettore di probabilita che descrivono le probabilita di estrazionedelle unita della popolazione (l’opzione default e che le probabilita sianocostanti).

Supponiamo ad esempio di voler estrarre un campione di 20 unita, senza rein-serimento, dalla popolazione degli 8101 comuni italiani. Se il data frame comuni

contiene la lista dei comuni, ordinata alfabeticamente, e i dati corrispondenti,la funzione appropriata e

Page 38: Dispensa R

38 CAPITOLO 6. DISTRIBUZIONI DI PROBABILITA

camp <- sample(1:8101, size=20, replace=FALSE)

Se le probabilita di inserimento nel campione, anziche uguali per tutti icomuni, devono essere proporzionali al peso demografico, la specifica sara

> camp <- sample(1:8101, size=20, replace=FALSE,

+ prob=comuni$Pop/sum(comuni$Pop))

> sort(camp)

[1] 171 1760 1859 1986 3303 3359 3378 3591 4100 4322

[11] 4406 4654 4989 5396 5557 6231 7085 7648 7668 8049

> comuni$Nome[sort(camp)]

[1] Orbassano Arese Milano

[4] Calusco d’Adda Fara Vicentino San Vito di Leguzzano

[7] Vicenza Venezia Villanova d’Albenga

[10] Montecchio Emilia Castel Maggiore Sesto Fiorentino

[13] Ancona Roma Cagnano Amiterno

[16] Qualiano Castelsilano Catania

[19] Paterno’ Quartu Sant’Elena

Per simulare un campione di 10 lanci di una moneta regolare, la funzioneappropriata e

> camp <- sample(c(’’C’’, ’’T’’), size=10, replace=TRUE)

Il numero di teste osservato nel campione si ottiene mediante

> length(camp[camp==’’T’’])

[1] 6

Se la moneta e truccata e la probabilita di osservare testa e pari a 0.4, ilcampione si otterra con

> sample(c(’’C’’, ’’T’’), size=10, replace=TRUE, prob=c(0.4, 0.6))

Una specificazione equivalente puo essere

> sample(c(’’C’’,’’C’’,’’T’’,’’T’’,’’T’’), size=10, replace=TRUE)

In alcuni problemi statistici si richiede l’uso di permutazioni casuali di uncollettivo di oggetti. Ad esempio, una permutazione casuale dei numeri da 1 a10 viene fornita da

> sample(1:10,size=10,replace=FALSE)

[1] 6 3 9 10 4 8 1 2 5 7

Analogamente, per scegliere a caso una matrice di permutazione1 nello spaziodi tutte le matrici di permutazione d’ordine 4 possiamo procedere come segue.

1Una matrice di permutazione e una matrice quadrata d’ordine n, avente in ogni riga e inogni colonna un elemento pari a uno ed n − 1 elementi uguali a zero.

Page 39: Dispensa R

6.2. CAMPIONAMENTO 39

> id4 <- matrix(0,4,4)+diag(rep(1,4)) # matrice identica d’ordine 4

> perm <- id4[,sample(1:dim(id4)[1],size=dim(id4)[1],

+ replace=FALSE)]

> perm

[,1] [,2] [,3] [,4]

[1,] 1 0 0 0

[2,] 0 0 0 1

[3,] 0 1 0 0

[4,] 0 0 1 0

Page 40: Dispensa R

40 CAPITOLO 6. DISTRIBUZIONI DI PROBABILITA

Page 41: Dispensa R

Capitolo 7

Un primo sguardo ai grafici

Rappresentazioni grafiche appropriate sono una risorsa preziosa non solo du-rante l’analisi ed interpretazione dei dati ma anche in sede di presentazionedei risultati. Nell’ambiente di R sono disponibili sia funzioni in grado di ge-stire un’ampia gamma di presentazioni grafiche diverse che funzioni dedicate adiagrammi particolari. Rientra nella prima classe la funzione plot(), mentrehist() e forse l’esempio piu importante della seconda. Altre funzioni control-lano primitive grafiche come punto, linea, rettangolo, poligono, testo. In ognicaso il sistema prevede molteplici opzioni che assicurano un controllo completodel risultato finale.

I grafici sono visualizzati in una finestra ausiliaria e possono essere archiviatiin una varieta di formati (metafile, postscript, pdf, jpeg) usando il menu File

della console.

7.1 La funzione plot()

Lo strumento piu generale per rappresentare graficamente gli oggetti e la fun-zione plot(). La forma generale e plot(x,opzioni)oppure plot(x,y,opzioni)in cui x, y sono appropriati oggetti R e le opzioni definiscono l’aspetto finale delgrafico. Le opzioni principali sono

• type: determina il tipo di grafico, a scelta tra

’’p’’ (points), punti (default),

’’l’’ (lines), linee,

’’b’’ (both), punti e linee,

’’h’’ (histogram), linee verticali,

’’s’’, ’’S’’ (steps), linee orizzontali e verticali,

’’n’’ (none), sopprime la rappresentazione grafica;

• xlim, ylim: campo di variazione degli assi;

41

Page 42: Dispensa R

42 CAPITOLO 7. UN PRIMO SGUARDO AI GRAFICI

• xlab, ylab: titoli per gli assi;

• main, sub: titolo (principale e secondario) del grafico;

• add: variabile logica con modalita TRUE, FALSE; se uguale a TRUE sovrap-pone il risultato al grafico eventualmente presente nella finestra.

L’applicazione piu semplice e il diagramma di funzioni descrivibili mediantesemplici espressioni matematiche, come la cubica x3 o la funzione esponenziale.Per sovrapporre i diagrammi basta usare l’opzione add=TRUE.

> plot(function(x) x^3, from=-3, to=5,

+ xlab=’’x’’, ylab=’’Valore della funzione’’,

+ main=’’Diagrammi di funzioni’’)

> plot(exp, from=-3, to=5, add=TRUE)

−2 0 2 4

050

100

Diagrammi di funzioni

x

Val

ore

della

funz

ione

Figura 7.1: Diagrammi di funzioni con plot().

Le applicazioni statistiche richiedono i diagrammi delle funzioni di densita odi ripartizione di particolari distribuzioni. Nell’esempio seguente confrontiamo le

Page 43: Dispensa R

7.1. LA FUNZIONE PLOT() 43

funzioni di densita delle distribuzioni Normali con medie rispettivamente ugualia 0 e 1 e deviazioni standard uguali a 1 e 1.5.

> plot(dnorm, from=-5, to=5,

+ xlab=’’x’’, ylab=’’Funzione di densita’’’,

+ main=’’Confronto N(0,1),N(1,1.5)’’)

> plot(function(x) dnorm(x,mean=1,sd=1.5), from=-5,to=5, add=TRUE)

−4 −2 0 2 4

0.0

0.1

0.2

0.3

0.4

Confronto N(0,1),N(1,1.5)

x

Fun

zion

e di

den

sità

Figura 7.2: Funzioni di densita gaussiane.

Per le distribuzioni discrete, come la Binomiale, e opportuno specificarel’insieme dei punti con probabilita positiva.

> bin1 <- function(x) dbinom(x,size=10,prob=0.5)

> plot(0:10,bin1(0:10),type=’’h’’,xlab=’’Numero di Successi’’,

+ ylab=’’Probabilita’’’,main = ’’Binomiale(n = 10, p = 0.5)’’,

+ lwd=2)

Nel comando plot(), 0:10 e bin1(0:10) sono i vettori delle ascisse e delleordinate dei punti da rappresentare. Nell’esempio seguente sovrapponiamo le

Page 44: Dispensa R

44 CAPITOLO 7. UN PRIMO SGUARDO AI GRAFICI

0 2 4 6 8 10

0.00

0.05

0.10

0.15

0.20

0.25

Binomiale(n = 10, p = 0.5)

Numero di Successi

Pro

babi

lità

Figura 7.3: Funzione di probabilita binomiale.

funzioni di ripartizione della Binomiale di parametri n = 10, p = 0.5 e dellaNormale di parametri µ = 5, σ =

√2.5. Il parametro grafico lwd (line width)

controlla lo spessore delle linee mentre col controlla il colore degli elementi delgrafico.

> bin2 <- function(x) pbinom(x,size=10,prob=0.5)

> norm2 <- function(x) pnorm(x,mean=5,sd=sqrt(2.5))

> plot(0:10,bin2(0:10),type=’’s’’,lwd=2,

+ xlab=’’Numero di Successi’’,ylab=’’F. di Ripartizione’’,

+ main = ’’Confronto Binomiale(n = 10, p = 0.5), N(5, sqrt(2.5))’’)

> plot(norm2,0,10,add=TRUE,col=’’red’’,lwd=2)

7.2 Le primitive grafiche

Nell’ambiente di R sono disponibili molte funzioni che permettono di inserire inun grafico punti, segmenti, stringhe di testo ed altri elementi grafici. Le funzionipiu utili sono

Page 45: Dispensa R

7.2. LE PRIMITIVE GRAFICHE 45

0 2 4 6 8 10

0.0

0.2

0.4

0.6

0.8

1.0

Confronto Binomiale(n = 10, p = 0.5), N(5, sqrt(2.5))

Numero di Successi

F. d

i Rip

artiz

ione

Figura 7.4: Funzioni di ripartizione binomiale e normale.

• points(x,y): punti con ascisse e ordinate specificate nei vettori x ed y,rispettivamente;

• lines(x,y): linea spezzata congiungente i punti con ascisse e ordinatespecificate nei vettori x ed y, rispettivamente;

• rect(x1,y1,x2,y2): rettangolo di cui (x1, y1) e (x2, y2) sono i verticiopposti in basso a sinistra e in alto a destra;

• polygon(x,y): poligono con vertici definiti dai vettori x (ascisse) ed y(ordinate);

• text(x,y,labels): testo definito dall’opzione labels nelle posizioni spec-ificate dai vettori x (ascisse) ed y (ordinate).

Come illustrazione mostriamo la costruzione dell’ottagono regolare.

> x <- cos((0:7)*pi/4); > y <- sin((0:7)*pi/4)

> par1 <- par()

Page 46: Dispensa R

46 CAPITOLO 7. UN PRIMO SGUARDO AI GRAFICI

> par(pty=’’s’’)

> plot(x,y,type=’’p’’,xaxt=’’n’’,yaxt=’’n’’,pch=20,

+ xlab=’’’’,ylab=’’’’)

> points(0,0,pch=20)

> lines(x,y)

> lines(x[c(1,length(x))],y[c(1,length(y))])

> text(x,y,labels=LETTERS[1:8],pos=4)

> text(0,0,labels=’’O’’,pos=4)

> par(par1)

A

B

C

D

E

F

G

H

O

Figura 7.5: Ottagono regolare.

Nell’esempio precedente vengono modificati alcuni parametri grafici correnti.Il comando par1 <- par() salva nella variabile par1 i valori di default deiparametri grafici contenuti in par, in modo da poterli ripristinare alla fine. LaTabella 7.1 elenca i parametri grafici d’uso piu comune.

Nell’ultimo esempio combiniamo primitive grafiche e numeri pseudo-casualiin modo da ottenere cerchi di centro, raggio e colore casuali.

> plot(x<-rnorm(100),y<-rnorm(100), type=’’n’’, xaxt=’’n’’,yaxt=’’n’’,

Page 47: Dispensa R

7.2. LE PRIMITIVE GRAFICHE 47

Parametro Risultatocex fattore di riduzione o ingrandimento di caratteri e simboli

rispetto allo standard (variabile numerica, ad esempiocex=0.8)

col colore (variabile alfanumerica, ad esempio col=’’red’’)lty stile delle linee (variabile alfanumerica, con modalita

’’solid’’, ’’dotted’’, ’’dashed’’, ’’dotdash’’,’’blank’’)

lwd spessore delle linee (variabile numerica con valori interi,default uguale a 1, ad esempio lwd=2)

pch simbolo per la rappresentazione dei punti (variabilenumerica, pch=1:25, o alfanumerica definita da un singolocarattere, ad esempio pch=’’*’’)

pty forma del grafico (quadrato, pty=’’s’’ o di dimensionemassima, pty=’’m’’)

xaxt xaxt=’’n’’ sopprime l’asse xyaxt yaxt=’’n’’ sopprime l’asse y

Tabella 7.1: Alcuni parametri grafici.

+ xlab=’’’’, ylab=’’’’)

> points(x,y, pch=19,cex=(abs(x)+abs(y))/2,

+ col=grey((abs(x)+abs(y))/(1+abs(x)+abs(y))))

Page 48: Dispensa R

48 CAPITOLO 7. UN PRIMO SGUARDO AI GRAFICI

Figura 7.6: Cerchi casuali.

Page 49: Dispensa R

Capitolo 8

Analisi iniziale dei dati

Il processo di apprendimento dai dati empirici (siano essi ottenuti medianteindagini osservazionali o rilevazioni pianificate) richiede operazioni di sintesied ordinamento mediante distribuzioni di frequenza, indici riassuntivi e presen-tazioni grafiche. R mette a disposizione numerosi strumenti in grado di agevolareil lavoro dell’analista in questa fase preliminare.

Le distribuzioni di frequenza, univariate o multivariate, sono gestite dallafunzione table(). Nel caso particolare di una singola variabile numerica epreferibile usare la funzione hist() che produce sia la distribuzione di frequenzain classi che il corrispondente istogramma.

Per quanto riguarda le statistiche riassuntive, la funzione d’impiego piu ge-nerale e summary(), con risultati diversi a seconda dell’oggetto a cui e applicata.Nel caso di un data frame restituisce una tabella contenente la distribuzione difrequenza delle variabili qualitative e, per le variabili numeriche, minimo, mas-simo, quartili e media aritmetica. La funzione ecdf() fornisce la funzione diripartizione empirica mentre quantile() esegue il calcolo dei quantili campi-onari. Le funzioni mean(), var() e sd() producono media, varianza e deviazionestandard, mentre cor() restituisce il coefficiente di correlazione lineare di datinumerici bivariati.

Per quanto riguarda le presentazioni grafiche, oltre al gia ricordato istogram-ma, sono facilmente ottenibili diagrammi a rettangoli distanziati con barplot(),presentazioni a ramo e foglie con stem() e diagrammi scatola e baffi con boxplot().Diagrammi di dispersione per dati numerici bivariati si ottengono medianteplot(). Un elenco dei principali diagrammi statistici e riportato nella Tabella8.1.

8.1 Tabelle di frequenza

Dedichiamo questa sezione alle tabelle di frequenza univariate e bivariate utiliz-zando i dati rilevati dalla Banca d’Italia nell’indagine campionaria I bilanci delle

famiglie italiane nell’anno 2002. A partire da questo archivio abbiamo formato il

49

Page 50: Dispensa R

50 CAPITOLO 8. ANALISI INIZIALE DEI DATI

Funzione Diagrammabarplot() diagramma a rettangoli distanziatiboxplot() diagramma scatola-bafficoplot() diagramma di dispersione di una coppia di variabili,

subordinatamente ad una terza variabilehist() istogrammapairs() matrice dei diagrammi di dispersione a coppie

di un insieme di variabiliplot() diagramma di dispersioneqqnorm() diagramma quantile-quantile in ipotesi di normalitaqqplot() diagramma quantile-quantile

Tabella 8.1: Principali diagrammi statistici.

data frame fam02 contenente, per ognuna delle n = 8011 famiglie del campione,l’area territoriale (area, variabile categoriale con cinque modalita corrispondentialle ripartizioni territoriali ISTAT), il numero di componenti (ncomp, variabilenumerica discreta) ed il reddito familiare (red, variabile numerica continua ).

Ricaviamo innanzitutto la distribuzione delle famiglie secondo l’area territo-riale.

> disarea <- table(fam02$area,dnn=’’Area Territoriale’’)

> disarea

Area Territoriale

N-O N-E Centro Sud Isole

2079 1602 1665 1713 952

> round(disarea/sum(disarea),3) # frequenze relative

Area Territoriale

N-O N-E Centro Sud Isole

0.260 0.200 0.208 0.214 0.119

La presentazione grafica e il classico diagramma a rettangoli distanziati, facil-mente ottenibile con barplot().

> barplot(as.vector(100*disarea/sum(disarea)),

+ xlab=’’Area Territoriale’’,ylab=’’Frequenza %’’,col=’’lightgrey’’,

+ names.arg=c(’’N-O’’,’’N-E’’,’’Centro’’,’’Sud’’,’’Isole’’),

+ main=’’Ripartizione delle Famiglie per Area Territoriale’’)

Per valutare l’effetto dell’area territoriale sul numero di componenti dellefamiglie serve la distribuzione congiunta delle due variabili.

> tab1 <- table(fam02$area,fam02$ncomp,dnn=c(’’Area’’,

+ ’’Numero di Componenti’’))

> tab1

Numero di Componenti

Area 1 2 3 4 5 6 7 8

Page 51: Dispensa R

8.1. TABELLE DI FREQUENZA 51

N−O N−E Centro Sud Isole

Ripartizione delle Famiglie per Area Territoriale

Area Territoriale

Fre

quen

za %

05

1015

2025

Figura 8.1: Campione Banca d’Italia: distribuzione territoriale delle famiglie.

N-O 498 671 513 318 64 14 0 1

N-E 370 514 368 267 61 14 6 2

Centro 373 448 371 357 93 19 3 1

Sud 339 421 303 430 175 40 4 1

Isole 192 238 196 227 77 16 4 2

Le funzioni rowSums(), colSums() calcolano le somme di riga e di colonnadella tabella di contingenza, cioe le distribuzioni marginali delle due variabili. Ledistribuzioni subordinate del numero di componenti per ogni area territoriale siottengono facilmente dividendo la tabella di contingenza per le somme di riga, opiu semplicemente mediante la funzione prop.table(, margin=1) come vienemostrato nell’esempio.

> rowSums(tab1)

N-O N-E Centro Sud Isole

2079 1602 1665 1713 952

> colSums(tab1)

1 2 3 4 5 6 7 8

Page 52: Dispensa R

52 CAPITOLO 8. ANALISI INIZIALE DEI DATI

1772 2292 1751 1599 470 103 17 7

> round(prop.table(tab1,margin=1),3)

Numero di Componenti

Area 1 2 3 4 5 6 7 8

N-O 0.240 0.323 0.247 0.153 0.031 0.007 0.000 0.000

N-E 0.231 0.321 0.230 0.167 0.038 0.009 0.004 0.001

Centro 0.224 0.269 0.223 0.214 0.056 0.011 0.002 0.001

Sud 0.198 0.246 0.177 0.251 0.102 0.023 0.002 0.001

Isole 0.202 0.250 0.206 0.238 0.081 0.017 0.004 0.002

Le distribuzioni subordinate dell’area territoriale, per ogni fissato valore delnumero di componenti, si otterrebbero in modo analogo, dividendo la tabella perle somme di colonna oppure mediante la funzione prop.table(, margin=2).

La tabella delle distribuzioni subordinate mette in luce differenze non tra-scurabili tra le aree territoriali, per quanto riguarda la dimensione delle famiglie.Il risultato e meglio evidenziato dalla presentazione grafica con barplot().

> barplot(100*t(prop.table(tab1,margin=1)),beside=FALSE,

+ legend.text=TRUE, col=’’grey(0:8/8)’’,xlim=c(0,8),

+ xlab=’’Area Territoriale’’,ylab=’’Frequenza %’’,

+ main=’’Area Territoriale e Dimensione delle Famiglie’’)

L’opzione beside determina l’aspetto finale del grafico; beside=TRUE as-socia ad ogni colonna della tabella un gruppo di rettangoli affiancati, men-tre beside=FALSE li sovrappone. Nel nostro esempio ogni rettangolo descriveuna particolare distribuzione subordinata, con divisioni interne corrispondentialle diverse modalita (numero di componenti delle famiglie). Data la norma-lizzazione delle distribuzioni, i cinque rettangoli hanno esattamente la stessaaltezza.

La funzione summary(), applicata ad una tabella di contingenza, fornisce lastatistica chi-quadrato ed il p-value del test d’indipendenza delle variabili.

> summary(tab1)

Number of cases in table: 8011

Number of factors: 2

Test for independence of all factors:

Chisq = 265.94, df = 28, p-value = 1.289e-40

Chi-squared approximation may be incorrect

Quando una o piu variabili sono di tipo continuo, e necessario operare pre-liminarmente una suddivisione in classi. Un criterio conveniente e di usare comeestremi delle classi quantili scelti opportunamente. Illustriamo il procedimen-to con i dati del reddito familiare. Per determinare i quantili campionari ciserviamo della funzione quantile() avente i seguenti argomenti

• x: vettore numerico dei dati,

• probs: ordine del quantile (o dei quantili); probs=0(1) fornisce il datominimo (massimo),

Page 53: Dispensa R

8.1. TABELLE DI FREQUENZA 53

N−O N−E Centro Sud Isole

87654321

Area Territoriale e Dimensione delle Famiglie

Area Territoriale

Freq

uenz

a %

020

4060

8010

0

Figura 8.2: Campione Banca d’Italia: numero di componenti delle famiglie perarea territoriale.

• na.rm: trattamento dei dati NaN e NA (na.rm=TRUE li esclude),

• names: names=TRUE/FALSE include (non include) i descrittori dei risultati.

L’esempio mostra il calcolo dei quantili del reddito (migliaia di euro).

> round(quantile(fam02$red/1000,probs=seq(0,1,by=0.2),na.rm=TRUE),1)

0% 20% 40% 60% 80% 100%

0.0 13.0 19.6 27.5 39.4 461.2

Passiamo ora a considerare la distribuzione congiunta dell’area territoriale e delreddito.

> tab2<-table(fam02$area,cut(fam02$red/1000,

+ quantile(fam02$red/1000,seq(0,1,by=0.2)),include.lowest=TRUE),

+ dnn=c(’’Area’’,’’Reddito Familiare (x 1000)’’))

> tab2

Reddito Familiare (x 1000)

Page 54: Dispensa R

54 CAPITOLO 8. ANALISI INIZIALE DEI DATI

Area [0,13] (13,19.6] (19.6,27.5] (27.5,39.4] (39.4,461]

N-O 270 362 433 494 520

N-E 195 260 333 370 444

Centro 231 338 352 381 363

Sud 595 413 304 226 175

Isole 312 229 180 131 100

La funzione cut() opera la divisione in classi dei dati reddituali usando comeestremi delle classi i quintili del reddito; l’opzione include.lowest richiedel’inclusione nella prima classe del dato minimo, in questo caso zero.

La dipendenza del reddito dall’area territoriale emerge chiaramente dallatabella delle distribuzioni subordinate e dal grafico corrispondente.

> round(prop.table(tab2,margin=1),3)

Reddito Familiare (x 1000)

Area [0,13] (13,19.6] (19.6,27.5] (27.5,39.4] (39.4,461]

N-O 0.130 0.174 0.208 0.238 0.250

N-E 0.122 0.162 0.208 0.231 0.277

Centro 0.139 0.203 0.211 0.229 0.218

Sud 0.347 0.241 0.177 0.132 0.102

Isole 0.328 0.241 0.189 0.138 0.105

> barplot(100*t(prop.table(tab2,margin=1),3)),beside=FALSE,col=grey(1:5/5),

+ legend.text=TRUE,xlim=c(0,9),

+ xlab=’’Area Territoriale’’,ylab=’’Frequenza %’’,

+ main=’’Area Territoriale e Reddito delle Famiglie’’)

8.2 Istogrammi

Stabilire la tipologia distributiva di una variabile numerica e un problema fre-quente che viene trattato con strumenti diversi, a seconda della natura deidati disponibili. Nella fase iniziale di un’indagine e opportuno utilizzare dia-grammi distribuzionali, in grado di far emergere caratteristiche globali delladistribuzione come posizionamento e dispersione, simmetria o asimmetria, uni-modalita o multimodalita, dati anomali e specifiche tipologie quali la legge nor-male, esponenziale o uniforme. Istogrammi, presentazioni a ramo e foglie ediagrammi scatola-baffi sono gli strumenti piu usati.

La funzione R per l’istogramma e hist(). Gli argomenti principali sono

• x: vettore numerico dei dati,

• breaks: descrizione delle classi; la specifica puo essere il loro numerooppure il vettore numerico degli estremi,

• freq: variabile logica; TRUE produce la rappresentazione delle frequenzeassolute, FALSE la rappresentazione della densita di frequenza,

Page 55: Dispensa R

8.2. ISTOGRAMMI 55

N−O N−E Sud Isole

(39.4,461](27.5,39.4](19.6,27.5](13,19.6][0,13]

Area Territoriale e Reddito delle Famiglie

Area Territoriale

Freq

uenz

a %

020

4060

8010

0

Figura 8.3: Campione Banca d’Italia: reddito familiare per area territoriale.

• plot: variabile logica; TRUE produce l’istogramma, FALSE una lista con-tenente estremi e punti medi delle classi e i corrispondenti valori dellafrequenza assoluta e della densita di frequenza.

Illustriamo l’uso di hist() con i dati reddituali delle famiglie.

> hist(fam02$red/1000,breaks=c(seq(0,80,by=5),465),freq=False,

+ include.lowest=TRUE,xlim=c(0,100),col=’’grey’’,

+ xlab=’’Reddito Familiare (x 1000)’’,ylab=’’Densit\‘{a} di Frequenza’’,

+ main=’’Reddito delle Famiglie Italiane 2002’’)

Il diagramma copre solo i redditi fino a 100000 euro, i redditi oltre questasoglia hanno comunque una densita trascurabile.

Per ottenere il risultato analitico basta specificare plot=FALSE.

> redclas <- hist(fam02$red/1000,breaks=c(seq(0,200,by=5),465),

+ include.lowest=TRUE,freq=FALSE,plot=FALSE)

> redclas$counts

[1] 174 720 1224 1173 1053 ...

Page 56: Dispensa R

56 CAPITOLO 8. ANALISI INIZIALE DEI DATI

> round(redclas$density,3)

[1] 0.004 0.018 0.031 0.029 0.026 ...

La lista redclas contiene i descrittori delle classi di reddito; in particolarele frequenze assolute (counts) e le densita (density).

L’istogramma dei redditi suggerisce una tipologia distributiva di tipo log-normale. L’ipotesi puo essere controllata in modo informale sovrapponendoall’istogramma empirico la densita lognormale con parametri stimati sulla basedei dati.

> m <- mean(log(fam02$red[fam02$red>0]/1000))

> s <- sd(log(fam02$red[fam02$red>0]/1000))

> plot(redteor <- function(x) dlnorm(x,m,s),0,500,add=TRUE,

+ col=’’red’’,lwd=2)

Reddito delle Famiglie Italiane 2002

Reddito Familiare (x 1000)

Den

sità

di F

requ

enza

0 20 40 60 80 100

0.00

00.

005

0.01

00.

015

0.02

00.

025

0.03

00.

035

Figura 8.4: Campione Banca d’Italia: distribuzione del reddito familiare coninterpolante lognormale.

Il grafico quantile-quantile mostra un buon adattamento del modello fino a40-50000 euro, mentre per i redditi piu elevati la discrepanza diventa via via piupronunciata.

Page 57: Dispensa R

8.2. ISTOGRAMMI 57

> plot(quantile(fam02$red/1000,seq(0,1,by=0.005)),

+ qlnorm(seq(0,1,by=0.005),m,s),type=’’p’’,

+ xlab=’’Quantili dei Redditi’’,ylab=’’Quantili Distr. Lognormale’’,

+ main=’’Approssimazione Lognormale’’,xlim=c(0,80),ylim=c(0,80))

> lines(c(-10,120),c(-10,120),col=’’red’’,lwd=2)

0 20 40 60 80

020

4060

80

Approssimazione Lognormale

Quantili dei Redditi

Qua

ntili

Dis

tr. L

ogno

rmal

e

Figura 8.5: Campione Banca d’Italia: quantili del reddito empirici e basati sulmodello lognormale.

Un controllo piu preciso dell’approssimazione lognormale viene effettuato datest statistici funzionali come il test di Kolmogorov-Smirnov a cui corrispondela funzione, ks.test().

> ks.test(fam02$red,y=’’plnorm’’,alternative=’’two.sided’’)

Warning message:

cannot compute correct p-values with ties in:

+ ks.test(fam02$red2.Y, y = ’’plnorm’’, alternative = ’’two.sided’’)

One-sample Kolmogorov-Smirnov test

data: fam02$red

D = 0.997, p-value = < 2.2e-16

Page 58: Dispensa R

58 CAPITOLO 8. ANALISI INIZIALE DEI DATI

alternative hypothesis: two.sided

Il p-value prossimo a zero (si noti che il risultato e approssimato a causadi valori ripetuti nei dati) conferma che lo scostamento tra i dati osservati deiredditi familiari ed il modello lognormale e rilevante e non puo essere attribuitosolo all’errore di campionamento.

Con lo stesso strumento possiamo controllare le differenze tra le aree ter-ritoriali. I dati suggeriscono ad esempio che le famiglie del nord-est siano piuricche di quelle del nord-ovest. Tecnicamente, questo equivale ad ipotizzare chela distribuzione del reddito nel nord-ovest sia stocasticamente minore1 di quelladel nord-est.

> ks.test(fam02$red[fam02$area == 1]/1000,

+ y=fam02$red[fam02$area == 2]/1000,

+ alternative=’’greater’’)

Two-sample Kolmogorov-Smirnov test

data: fam02$red[fam02$area == 1]/1000 and

fam02$red[fam02$area == 2]/1000

D^+ = 0.0354, p-value = 0.1036

alternative hypothesis: greater

In questo caso il p-value attorno al 10% lascia aperta la possibilita che ledifferenze osservate tra le due aree siano dovute all’errore di campionamento.

8.3 Diagrammi scatola-baffi

Il diagramma scatola-baffi offre una descrizione della distribuzione statisticaassai piu compatta dell’istogramma, essendo basata essenzialmente sui quartili.La funzione boxplot() ha i seguenti parametri

• x: vettore numerico dei dati; la specificazione puo anche essere una collezionedi vettori x, y, z, una lista di piu vettori o una formula del tipo x~f, nelqual caso viene prodotto un grafico per ogni singolo vettore o per ognimodalita del fattore f,

• range: variabile numerica che controlla l’estensione dei baffi (default:range=1.5),

• notch: variabile logica; la specificazione notch=TRUE visualizza un inter-vallo di confidenza per la mediana della distribuzione,

• plot: variabile logica; plot=FALSE visualizza al posto del diagramma lecorrispondenti statistiche di sintesi.

1Date due variabili X, Y con funzioni di ripartizione FX(t), FY (t), X e stocasticamenteminore di Y se, per ogni numero reale t, FX(t) ≥ FY (t).

Page 59: Dispensa R

8.3. DIAGRAMMI SCATOLA-BAFFI 59

Come hist(), la funzione consente l’uso dei parametri grafici di plot().

Gli esempi utilizzano il data frame laurea contenente caratteristiche di uncampione di 462 laureati in Economia a Ca’ Foscari. Vediamo la distribuzionedel voto di laurea.

> boxplot(laurea$votolaurea,horizontal=TRUE,xlab=’’Voto di Laurea’’,

+ main=’’Laureati in Economia’’,col=’’grey’’,boxwex=0.6)

80 85 90 95 100 105 110

Laureati in Economia

Voto di Laurea

Figura 8.6: Voto di laurea in Economia.

Mettiamo ora a confronto il voto di diploma dei maschi e delle femmine,utilizzando il fattore genere.

> table(laurea$genere)

F M

279 183

> boxplot(laurea$votodip~laurea$genere,horizontal=TRUE,notch=TRUE,

+ xlab=’’Voto di Diploma’’,col=’’grey’’,boxwex=0.6,

+ main=’’Laureati in Economia’’)

Page 60: Dispensa R

60 CAPITOLO 8. ANALISI INIZIALE DEI DATI

FM

60 70 80 90 100

Laureati in Economia

Voto di Diploma

Figura 8.7: Voto di diploma dei laureati in Economia.

L’opzione plot=FALSE produce una lista con componenti stats (quartilidelle distribuzioni), n (numerosita dei gruppi), conf (estremi degli intervalli diconfidenza), out (eventuali dati anomali).

> boxplot(laurea$votodip~laurea$genere,notch=TRUE,plot=FALSE)

$stats

[,1] [,2]

[1,] 60.00000 60

[2,] 76.66667 70

[3,] 86.00000 80

[4,] 94.50000 91

[5,] 100.00000 100

$n

[1] 279 183

$conf

[,1] [,2]

[1,] 84.3131 77.54726

Page 61: Dispensa R

8.4. INDICI DI SINTESI 61

[2,] 87.6869 82.45274

$out

numeric(0)

8.4 Indici di sintesi

La sintesi dei dati mediante indici analitici puo avvalersi di funzioni di sistema,come quantile() o summary(), oppure utilizzare funzioni definite dall’utente.

Consideriamo ancora i dati reddituali delle famiglie ed applichiamo la fun-zione summary() che offre un riepilogo della distribuzione comprendente, oltreai dati minimo e massimo, i quartili e la media aritmetica.

> summary(fam02$red/1000)

Min. 1st Qu. Median Mean 3rd Qu. Max.

0.00 14.50 23.22 28.23 35.73 461.20

Gli indici di dispersione usualmente associati alla media e alla mediana sonola deviazione standard e la deviazione assoluta mediana2 (o mad, da median ab-

solute deviation), ottenibili rispettivamente mediante le funzioni sd() e mad().E bene ricordare che la versione R della deviazione standard e basata sulla va-rianza campionaria corretta s2

n,c =∑

i(xi − xn)2/(n − 1). Per evitare problemidovuti a dati mancanti, e opportuno usare l’opzione na.rm=TRUE.

> round(sd(fam02$red/1000,na.rm=TRUE),2)

[1] 22.22

> round(mad(fam02$red/1000,na.rm=TRUE,constant=1),2)

[1] 9.94

Nel caso dei dati reddituali, data la forte asimmetria della distribuzione, lasintesi piu significativa e un opportuno insieme di quantili, ad esempio i decili.

> round(quantile(fam02$red/1000,c(seq(0,0.9,by=0.1),0.95,0.99,1),

+ na.rm=TRUE),2)

0% 10% 20% 30% 40% 50% 60% 70% 80%

0.00 9.60 13.02 16.07 19.60 23.22 27.45 32.74 39.39

90% 95% 99% 100%

51.00 64.23 103.88 461.25

Lo stesso risultato e facilmente ottenibile per ogni modalita di specificatifattori di stratificazione, mediante la funzione tapply(). Nel caso del reddi-to, come abbiamo gia visto, un fattore di stratificazione importante e l’areaterritoriale.

> quantili <- tapply(fam02$red2/1000,fam02$area,

+ function(x) round(quantile(x,c(seq(0,0.9,by=0.1),0.95,0.99,1),

2Definita come la mediana delle deviazioni assolute dalla mediana.

Page 62: Dispensa R

62 CAPITOLO 8. ANALISI INIZIALE DEI DATI

0 20 40 60 80 100

020

4060

8010

012

0

Curva Quantilica del Reddito Familiare

Ordine quantilico

Qua

ntile

(x

1000

)

Nord−Ovest

Nord−Est

Centro

Sud

Isole

Figura 8.8: Campione Banca d’Italia: quantili del reddito nelle aree territoriali.

+ na.rm=TRUE),2))

$Nord-Ovest

0% 10% 20% 30% 40% 50% 60% 70% 80%

0.00 12.10 15.65 19.34 23.13 26.85 31.31 36.19 43.48

90% 95% 99% 100%

55.58 69.54 107.34 386.61

.....

$Isole

0% 10% 20% 30% 40% 50% 60% 70% 80%

0.00 7.20 9.76 12.54 14.78 17.24 21.36 25.04 30.32

90% 95% 99% 100%

39.78 51.25 81.13 177.02

Il confronto delle aree territoriali risulta piu agevole per mezzo di un grafico.

> plot(c(seq(0,90,by=10),95,99),quantili[[1]][-13],type=’’b’’,lwd=2,

+ xlim=c(0,100),ylim=c(0,130),

+ xlab=’’Ordine quantilico’’,ylab=’’Quantile (x 1000)’’,

Page 63: Dispensa R

8.5. ANALISI DELLA CONCENTRAZIONE 63

+ main=’’Curva Quantilica del Reddito Familiare’’)

> points(c(seq(0,90,by=10),95,99),quantili[[2]][-13],type=’’b’’,

+ lty=’’dotted’’,lwd=2)

...

Dal grafico emerge con chiarezza la differenza tra famiglie del centro-nord edel mezzogiorno.

8.5 Analisi della concentrazione

Un tema classico della letteratura economica e la concentrazione del reddito.Gli strumenti analitici tradizionali sono la curva di Lorenz ed il rapporto diconcentrazione R di Gini. La curva di Lorenz mostra l’andamento della quotacumulata di reddito q detenuta dalla frazione p dei redditieri piu poveri, alvariare di p nell’intervallo [0, 1].

> q <- cumsum(sort(fam02$red))/sum(fam02$red)

> p <- (1:length(fam02$red))/length(fam02$red)

> plot(p,q,type=’’l’’,lwd=2,

+ xlab=’’Frequenza Cumulata Famiglie’’,ylab=’’Quota Cumulata Reddito’’,

+ main=’’Curva di Lorenz Reddito Familiare 2002’’)

> lines(c(0,1),c(0,1),type=’’l’’,lwd=2)

Il rapporto di concentrazione misura lo scostamento relativo della curva diLorenz dalla retta di equidistribuzione ed e facilmente ottenibile dai vettori p,q.

> erre <- sum(p-q)/(sum(p)-1)

> erre

[1] 0.3596116

Page 64: Dispensa R

64 CAPITOLO 8. ANALISI INIZIALE DEI DATI

0.0 0.2 0.4 0.6 0.8 1.0

0.0

0.2

0.4

0.6

0.8

1.0

Curva di Lorenz Reddito Familiare 2002

Frequenza Cumulata Famiglie

Quo

ta C

umul

ata

Red

dito

Figura 8.9: Campione Banca d’Italia: curva di concentrazione di Lorenz.

Page 65: Dispensa R

Capitolo 9

Visualizzare datimultivariati

L’analisi di data frame unita × variabili contenenti sia variabili numeriche chevariabili non numeriche presenta problemi aggiuntivi rispetto al caso univariato,dovuti in particolare alla interdipendenza delle variabili ed alla possibile nonomogeneita delle unita rilevate. Illustriamo l’argomento con dati del censimento2001 relativi ad eta e stato civile dei residenti ed alla dimensione delle famiglie.Le unita di rilevazione sono i 1112 comuni italiani con piu di 10000 abitanti. Levariabili numeriche sono

• Pop: numero di residenti,

• Inv : indice di invecchiamento (%),

• Mas : rapporto di mascolinita (%),

• Vec: indice di vecchiaia (%),

• Dig : indice di dipendenza dei giovani (%),

• Dia: indice di dipendenza degli anziani (%),

• Ric: indice di ricambio (%),

• Fam1 : famiglie con un solo componente (%),

• Fam5 : famiglie con cinque componenti o piu (%),

• Con: persone coniugate (%),

• Sep: persone separate legalmente o divorziate (%).

Le variabili di stratificazione sono l’area territoriale e la popolazione.

65

Page 66: Dispensa R

66 CAPITOLO 9. VISUALIZZARE DATI MULTIVARIATI

9.1 Correlazione lineare

Le matrici di covarianza e di correlazione sono gli strumenti piu semplici perindividuare le relazioni di interdipendenza di variabili numeriche. Due sono lelimitazioni di cui si deve tener conto. Covarianze e correlazioni sono attendibiliquando le relazioni sono, almeno approssimativamente, lineari. Inoltre, campio-ni non omogenei e dati anomali possono alterare in modo sensibile i risultatinumerici.

Le funzioni cov() e cor() producono, rispettivamente, la matrice di co-varianza e la matrice di correlazione. I dati possono essere forniti sotto formadi un unico data frame x, oppure sotto forma di una coppia di vettori o dataframe numerici x, y. Il parametro use controlla il trattamento dei dati mancantioffrendo le seguenti opzioni

• use=’’all’’: se ci sono dati mancanti, viene visualizzato un messaggiod’errore e la matrice non e calcolata,

• use=’’complete’’: tutte le unita con dati mancanti sono eliminate,

• use=’’pairwise’’: nel calcolo degli elementi delle matrici si consideranotutte le unita con dati completi sulle due variabili di volta in volta in gioco;la matrice che cosı si ottiene puo non essere semidefinita positiva.

Ecco i risultati relativi al data frame cens01.

> round(cor(cens01[,5:15],use=’’all’’),2)

Pop Inv Mas Vec Dig Dia Ric Fam1 Fam5 Con Sep

Pop 1.00 0.08 -0.20 0.09 -0.07 0.08 -0.06 0.14 -0.06 -0.17 0.16

Inv 0.08 1.00 -0.67 0.96 -0.72 1.00 -0.86 0.72 -0.65 0.23 0.47

Mas -0.20 -0.67 1.00 -0.65 0.44 -0.68 0.54 -0.61 0.40 0.18 -0.41

Vec 0.09 0.96 -0.65 1.00 -0.81 0.94 -0.82 0.71 -0.70 0.23 0.60

Dig -0.07 -0.72 0.44 -0.81 1.00 -0.65 0.85 -0.58 0.86 -0.36 -0.73

Dia 0.08 1.00 -0.68 0.94 -0.65 1.00 -0.82 0.71 -0.60 0.20 0.42

Ric -0.06 -0.86 0.54 -0.82 0.85 -0.82 1.00 -0.66 0.78 -0.34 -0.51

Fam1 0.14 0.72 -0.61 0.71 -0.58 0.71 -0.66 1.00 -0.70 -0.15 0.61

Fam5 -0.06 -0.65 0.40 -0.70 0.86 -0.60 0.78 -0.70 1.00 -0.41 -0.76

Con -0.17 0.23 0.18 0.23 -0.36 0.20 -0.34 -0.15 -0.41 1.00 0.11

Sep 0.16 0.47 -0.41 0.60 -0.73 0.42 -0.51 0.61 -0.76 0.11 1.00

Il risultato mette in luce una fitta rete di interrelazioni lineari, sia concor-di che discordi, alcune molto prossime al caso di perfetta dipendenza lineare.Questo suggerisce che le variabili osservate sono ridondanti. Si discostano daquesto schema il rapporto di mascolinita, la percentuale di coniugati e soprat-tutto il numero dei residenti. Per rappresentare graficamente la struttura dellamatrice di correlazione si puo utilizzare il dendrogramma prodotto da un meto-do di aggregazione gerarchica delle variabili. La funzione hclust() adempiea questo compito dando ampie possibilita di scelta del criterio di aggregazione(legame singolo, medio o completo, metodo di Ward). Nell’esempio seguente,

Page 67: Dispensa R

9.2. DIAGRAMMI DI DISPERSIONE 67

basato sul legame medio, la dissimilarita dij della generica coppia di variabili e

calcolata mediante la relazione dij =√

2(1− rij), in cui rij e il coefficiente dicorrelazione lineare.

mcor <- cor(cens01[,5:15])

mdist <- sqrt(2*(1-mcor))

dendro <- hclust(as.dist(mdist), method=’’average’’)

plot(dendro, main=’’Censimento 2001: comuni oltre 10000 abitanti’’, sub=’’’’,

+ xlab=’’Dendrogramma della matrice di correlazione (legame medio)’’,

+ ylab=’’Dissimilarit\‘{a} sqrt(2*(1 - r))’’)

Mas

Ric

Dig

Fam

5

Pop

Con

Sep

Fam

1

Vec

Inv

Dia

0.0

0.5

1.0

1.5

Censimento 2001: comuni oltre 10000 abitanti

Dendrogramma della matrice di correlazione (legame medio)

Dis

sim

ilarit

à sq

rt(2

*(1

− r

))

Figura 9.1: Dendrogramma delle variabili socio-demografiche.

9.2 Diagrammi di dispersione

Il metodo piu usato per visualizzare dati multivariati si basa sui diagrammi didispersione delle variabili numeriche, ottenibili in modo molto semplice con lafunzione plot(). Se le variabili hanno unita di misura e/o ordine di grandezza

Page 68: Dispensa R

68 CAPITOLO 9. VISUALIZZARE DATI MULTIVARIATI

diversi, e opportuno eliminare questa potenziale distorsione mediante trasfor-mazioni preliminari, come la standardizzazione1. La funzione scale() puo es-sere utilizzata per eseguire la standardizzazione o trasformazioni analoghe. L’ef-fetto delle eventuali variabili di stratificazione e evidenziabile attraverso i colorio i simboli usati per i punti. Vediamo ad esempio il diagramma di dispersionedelle variabili Fam1 e Sep.

cens01_st <- scale(cens01[,5:15], center=TRUE, scale=TRUE)

> plot((cens01_st[,c(8,11)],

+ xlab=’’Famiglie con un solo componente (U. St.)’’,

+ ylab=’’Separati/e e divorziati/e (U. St.)’’,

+ main=’’Censimento 2001 - Comuni Oltre 10000 Abitanti’’,

+ xlim=c(-3,4),ylim=c(-3,4),pch=as.character(demo10$Area5),

+ cex=0.6,col=gray((cens01$Area5-1)/8))

Il risultato mette in luce che nei comuni meridionali vi e mediamente unaminore incidenza sia di famiglie con un solo componente che di separazioni edivorzi. Le due variabili esibiscono un legame lineare diretto piuttosto stretto.

Meritano di essere ricordate due varianti del diagramma di dispersione. Laprima e la funzione pairs() che produce la matrice dei diagrammi di disper-sione di un insieme di variabili numeriche, un tentativo di scoprire le proprietadella distribuzione multivariata attraverso l’osservazione di tutte le componentibivariate. Il risultato andrebbe letto in parallelo con le matrici di covarianzae di correlazione. La seconda e coplot() che fornisce i diagrammi di disper-sione di una coppia di variabili di riferimento, X ed Y , subordinatamente allemodalita di (al massimo due) variabili concomitanti Z1 e Z2. La versione basee coplot(y|z1*z2).

9.3 Componenti principali

Nell’analisi multivariata assumono grande rilevanza i metodi di compressionedei dati, primo tra tutti quello basato sulle componenti principali. Si trattaessenzialmente di una rotazione del sistema di riferimento cartesiano definitodalle variabili osservate in cui le variabili associate agli assi ruotati sono combi-nazioni lineari delle variabili osservate. Le combinazioni lineari sono determinatein modo da concentrare l’informazione statistica in un sottospazio di dimensioneridotta. La proiezione dei dati in questo sottospazio consente spesso di cogliereproprieta salienti della distribuzione multivariata. In R questa trasformazionee gestita da varie funzioni. Illustriamo di seguito la funzione princomp(). Iparametri principali sono

• x: matrice o data frame numerico dei dati da analizzare,

1Data una variabile X con media µ e deviazione standard σ > 0, la corrispondente variabilestandardizzata si ottiene mediante la trasformazione lineare (X − µ)/σ ed ha media nulla edeviazione standard unitaria.

Page 69: Dispensa R

9.3. COMPONENTI PRINCIPALI 69

1

11

11

1 1

11

11

1

1

1

1

1

11

1

1

11

11

1

1

1

1

1

1

1 1

1 1

1

1

1

1

1

1

1

1

1

1

1

1

1

11

1111

1

11

1

11

1

11

1

1

11

1

1 1

1

1

1

1

1 11

1

1 1

1

1

1

1

11

11

1

1

11

1

1

1

1

1

1

1

1

1

11

1

1

1

1

1

11

11

11

1

1

11

1

1

1

1

1

1

1

1

1

1

11

1

1

1 1 1

1

1

1

1

1

1

1 1

1

1

1

1 11

1

1

1

1

1

1

1

11

1

1

1 1

1

1

1

1

1

1

1

1 1

1

1 1

1

1

1 1

1

1

11

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1 1

11

111

1

1

1

1

1

1

11

1

1 1

1

1

11

1 1

11

1

1

1

1 1

1

2

2

2

2

2

2

2

2

2

2 2

2

22 2

2

2

22

2 2

2

222

2

2

2

22 2

2

2

2

2

2

2

2

22

222

2

2

2

22

2

2

2

22

22

2

2

2

2

2

2

2

2

2

2

2

2

2

22

2

22

2

2

2

2

2

2

2

2

2

2 22 2

22

2

2

2

22

2

2

2

22

22

2

2

2

2

22

2

2

22

22

2

2

2

22

2

2

2

2

2

2

2

2 2

2

2

2 2

2

22

222

22

2

1

1

1

11

1

1

1

11

1

1

1

1

1

1

1

1

1

1

1

1

1

1

22

2

2

2

2

22

2

2 2

2

2

2

2

2

2

2

2

2

2

2

2 22

2 2

22

2

22

2

2

22

2

2

2

2

22

2

2

2

2

2

2

22

2

2

22

22

2 22

2

2

2

2

22

22

2

2

2

2

22

2

2

2

22

2

2

3

33

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

33

33

33

3 3

3

3

3

3

3

3

3

33

333

3

33

3

33

3

3

3

33

3

33

33

3

3

33

3

3

3

3

3

3

3

3

3 3

3 333

3

3

3

3

3

3

3

3

3

33

33

3 3

3

3

3

3

3

3

3

3

3

3

3 3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

33

33

33

33

3

3

3

333

3

3

3

3

3

3

33

3

3

3

3

3

3

3

3

3 3

3

3

3 33

33

3

3

3

3

33

3

3

3

3 3

3

3

3

3

3

33

3

3

3

33

3

33

3

3

3

3

33

3

3

3

3

3

3

3

3

3

4

4

4

4

4

4

4

4

44

4

44

4

4

4

4

4

4

4

4

44

4

4

4

4

44

4

44

4

4

4

44

44

4

4

4

4

4

4

4

4

4

4

4

4

4

444

4

4

44

44

4

4 4

4

4

4

4

4

4

4 4 44

44

4

4

44

4

4

4

44

4 44

4

4

4

4

4

4

4

44

4

4

4

4

44

4

4

4

44

44

4

4

4

4

4

4

4

4

44

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

444

4

4

4

4

4

4

4

4

4

4

4

44

4

4

4 4

4

4 4 4

4

44

4

4

4

4

44

4 4

4

4

4

44

4

44 4 4

4

4

4

4

44

4

4

4

4

44

4

4

44

4

4

4

44

4

4

44

44

4

4

4

4

4

44

4

4

4

44

4

4

4

44

4

4

4

4

4

4

44

4

4

4 4

44

4

4

4

4

4

4

4

4 4

4

4

4444

4

44

44

4

44 4

4

4

4

44

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

44

4

4

4

4

4

44

4

4

4

4

4

44

4

4

4

4

4

4

4 4

4

5

55

5

5

5 5 5

55

5

5

5

5

55 5

5

5

5 5

5

5

5 5

5

5

5

5

5

55

5

5

5

55

5

5

5

5

5

5

5

5

5

55

5

5

5

5

5 5

5

5

5

5

55

5

5

55

5

5

5

5 5

5

55

5

5

5

5

5 5

5

5

5

5

5

55

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

55

5

5

5

5

5

555

5

5

5

5

5

55

5

5

5

5

5

55

5

555

5

555

5 5

−3 −2 −1 0 1 2 3 4

−3

−2

−1

01

23

4

Censimento 2001 − Comuni Oltre 10000 Abitanti

Famiglie con un solo componente (U. St.)

Sep

arat

i/e e

div

orzi

ati/e

(U

. St.)

1: Nord−Ovest

2: Nord−Est

3: Centro

4: Sud

5: Isole

Figura 9.2: Frazione di famiglie con un solo componente e frazione di separatie divorziati.

• cor: variabile logica che controlla la trasformazione preliminare dei dati,scostamento dalla media (cor=FALSE) oppure standardizzazione (cor=TRUE),

• scores: variabile logica per calcolare le coordinate delle unita nel sistemadi riferimento ruotato (default scores=TRUE).

Il risultato della funzione princomp() e una lista contenente gli elementi dibase per interpretare le componenti principali, in particolare

• sdev: deviazioni standard delle componenti principali, coincidenti con leradici quadrate degli autovalori della matrice di covarianza (cor=FALSE)o di correlazione (cor=TRUE),

• loadings: coefficienti delle trasformazioni lineari che consentono di ri-cavare le componenti principali dalle variabili osservate, coincidenti congli autovettori della matrice di covarianza (cor=FALSE) o di correlazione(cor=TRUE),

Page 70: Dispensa R

70 CAPITOLO 9. VISUALIZZARE DATI MULTIVARIATI

• scores: coordinate delle unita nel sistema di riferimento ruotato.

La funzione summary(), applicata alla lista prodotta da princomp(), vi-sualizza la frazione della varianza totale assorbita dai sottospazi generati dallaprima componente principale, dalle prime due componenti, dalle prime tre ecosı via, un elemento essenziale per operare la scelta del modello descrittivo deidati.

Riportiamo di seguito i risultati relativi al data frame cens01, privato dellavariabile Pop.

cp <- princomp(cens01[,6:15],cor=TRUE,scores=TRUE)

> summary(cp)

Importance of components:

Comp.1 Comp.2 Comp.3 Comp.4

Standard deviation 2.5646105 1.1905983 0.9722325 0.61304703

Proportion of Variance 0.6577227 0.1417524 0.0945236 0.03758267

Cumulative Proportion 0.6577227 0.7994752 0.8939988 0.93158143

...

Le prime tre componenti assorbono cumulativamente quasi il 90% della va-rianza totale, un segnale della possibilita di rappresentare i dati in uno spaziodi dimensione ridotta rispetto alla situazione iniziale.

I coefficienti delle trasformazioni forniscono indicazioni sul significato dellecomponenti principali. La prima componente, che assorbe da sola quasi il 66%della varianza totale, e interpretabile come un indicatore socio-demografico com-plesso che contrappone situazioni caratterizzate da valori elevati delle variabilirapporto di mascolinita, indice di dipendenza giovanile, indice di ricambio, in-cidenza di famiglie numerose a situazioni caratterizzate invece da valori elevatidelle variabili indice di invecchiamento, rapporto di mascolinita, indice di vec-chiaia, indice di dipendenza degli anziani, incidenza di famiglie con un solocomponente. La seconda componente dipende principalmente dalla frazione diconiugati/e sulla popolazione complessiva, la terza componente dalla frazione diseparati/e e divorziati/e. Gli spazi bianchi nella tabella seguente corrispondonoa valori trascurabili.

> cp$loadings

Loadings:

Comp.1 Comp.2 Comp.3 Comp.4

Inv -0.364 0.329

Mas 0.266 -0.441 -0.105 -0.718

Vec -0.369 0.172

Dig 0.342 0.237 0.189

Dia -0.351 0.126 0.377 -0.105

Ric 0.355 0.111 -0.145 0.177

Fam1 -0.314 0.296 -0.243 -0.530

Fam5 0.332 0.259 0.322 0.116

Con -0.743 0.289 0.198

Sep -0.274 -0.637 0.302

Page 71: Dispensa R

9.3. COMPONENTI PRINCIPALI 71

Il diagramma di dispersione dei 1112 comuni nello spazio delle prime trecomponenti opera una sintesi radicale dei dati osservati, con una perdita d’in-formazione sopportabile. Il grafico mostrato di seguito e basato sulle componentistandardizzate. L’area territoriale e evidenziata mediante toni di grigio variabilida molto scuro (comuni del nord-ovest) a molto chiaro (isole).

> cp_st <- scale(cp$scores, center=TRUE, scale=TRUE)

> pairs(cp_st[,1:3],

+ labels=c(’’Comp1 (66\%)’’, ’’Comp2 (14\%)’’, ’’Comp3 (9\%)’’),

+ main=’’Censimento 2001 - Comuni Oltre 10000 Abitanti’’,

+ xlim=c(-3.95,3.6),ylim=c(-3.95,3.6),

+ pch=20,col=gray((cens01$Area5-1)/8),row1attop=F)

−4 −2 0 2 −4 −2 0 2

−4

−2

02

Comp3 (9%)

−4

−2

02

Comp2 (14%)

Comp1 (66%)

−4 −2 0 2

−4

−2

02

Censimento 2001 − Comuni Oltre 10000 Abitanti

Figura 9.3: Diagramma di dispersione delle componenti principali standardiz-zate.

Un’ulteriore applicazione delle componenti principali e il biplot, la rappresen-tazione approssimata, sullo stesso grafico, delle unita statistiche e delle variabili.La qualita dell’approssimazione e tanto maggiore quanto piu elevata risulta lafrazione della varianza totale assorbita dalle prime due componenti principali.

Page 72: Dispensa R

72 CAPITOLO 9. VISUALIZZARE DATI MULTIVARIATI

> biplot.princomp(cp,choices=1:2,pc.biplot=T,

+ xlabs=as.character(demo10$Area5),cex=c(0.5,0.7))

−3 −2 −1 0 1 2 3

−3

−2

−1

01

23

Comp.1

Com

p.2

1

1

11

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

11

1

1

1

1

1

1

1

11

1

1

1

1

11

1

1

1

1

1

1

11

1

1

1

1

1

1

1

1

1

1

1

1

1

11

1

1

1 1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

11

1

1

1

1

1

1

1

1

1

1

1

1

11

11

1

1

1

1

1

1

1

1

11

1

1

11 1

1

11

1

1

11

1

11

1

1

11

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

11

1

11

1

1

1

11

11

1

11

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

11

1

1

1

1

1

11

1

1

1

1

1

1

1

11

1

1

1

1

1

1

1

1

11

1

1

11

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

2

2

2

2

2

2

2

2

2

22

2

2

2

2

2

22

2

2

22

2

2

2

2

2

2

2

2

2

2

2

2

2

22

2

2

2

2

2

2

2

2

2

2

2

2

222

2

2

2

22

2

2

2 2

2

2

2

2

22

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

22

2

2

22

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

22

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

2

22

2

2

2

2

1

1

1

1 1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

122

2

2

2

2

2

2

2

2

2

22 2

2

2

22

2

2

2

2

2

2

2

2

2

2

2

2

2

2

22

2

2

2

2

2

2

22

2

2

22

2

222

22

2

2

22

2

2

2

2

2

2

2

2

2

2

2

2

2

2 2

2

2

2

2

2

2

22

2

3

3

3

3

3

3

3

3

3

3

33

3

3

3

3

3

33

33

3

3

3

33

3

3

3

3

3

3

3

3

33 3

3

3

3

3

3

3

3 3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3 33

3

3

3

3

3 3

3

3

33

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

33

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

33 3

33

3

3

3

3

3

333

33

3

3

33

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

33

3

3

3

3

3

3

3

3

3

3

33

3 3

3

3

3

3

3

3

3

33

3

4

4

44

4

4

4

44

4

4

4

4

4

4

4

4

4

4

4

44

4

4

4

4 4

4

4

4

4

4

4

4

4

4

4

4

4

4

44

4

44

4

4

44

4

4

44

4

4

44

4

4

4

4

4

4

44

4

4

4

4

44

44

4

4

4

44

4

44

4

4

44

4

4 44 4

4

4

4

4

4

44

4

44

44

4

4

4

4

4

4

4

4

44

4

4

4

4

4

4

44

4

4

4

4

4

4

4

4

4

4

4

44

44

4

4

4

4

4

4

4

4

4

4

4

4

44

4

4

44

44

4

4

4

4

4

4

4

44

44

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

44

4

4

44

44

4

444

4

4 4 4

4

44

4

4

4

4

44

44

4

44

44

44

4

4

4

4

4

44

4

4

4

4

4

4

4

4

4

4

4

4

4

4

4

44

4

44

4

44

4

4

4

4

4

4

4

4

44

4

4

4

4

44

4

4

4

4

4

4

4

4

4

4

4

44

4

4

4

4

4

4

44

4

44

4

4

4

4

4

44

4

4

4

44

4

4

4

4

4

4

5

5

55

5

5

5

5

5

5

5

5

5

5

5

55

5

5

5

5

5

5

55 5

5

5

5

5

5

55

5

5

5

5

5 5

5

5

5

5

5

5

5

5 5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5

5 5

5

5

5

5

55

5

5

5

5

55

5

55

5 5

5

5

5

5 5

5

5

5

55

5

5

5

5

5

5

5

5

5

5 5

5

5

5

5

5 5

5

5

5

5

5

5

5

5

5

5

5 5

5

5

5

5

55

−1.0 −0.5 0.0 0.5 1.0

−1.

0−

0.5

0.0

0.5

1.0

Inv

Mas

Vec

Dig

Dia Ric

Fam1Fam5

Con

Sep

Figura 9.4: Biplot dei comuni e delle variabili socio-demografiche.

In accordo con le caratteristiche della matrice di correlazione, le variabili Mas

e Con appaiono isolate, mentre Inv, Vec, Dia, Fam1 e Dig, Ric, Fam5 formanodue gruppi ben separati associati, rispettivamente, ai comuni del centro-nord edel sud-isole.

Qual e la qualita della rappresentazione dei dati nello spazio ridotto delleprime due-tre componenti? Abbiamo gia visto che le prime tre componentiassorbono complessivamente quasi il 90% della varianza totale. Insieme a questoindice globale e utile esaminare la qualita della rappresentazione delle singoleunita. Le componenti del vettore qual, che otteniamo di seguito, fornisconol’errore quadratico di ogni comune rispetto alla rappresentazione nello spaziodelle prime tre componenti.

> qual<-diag(cp$scores[,4:10]%*%t(cp$scores[,4:10]))

> boxplot(uniqual~cens01$Area5,col=’’gray’’,horizontal=T,

+ xlab=’’Errore Quadratico’’,ylab=’’Area Territoriale’’,

Page 73: Dispensa R

9.3. COMPONENTI PRINCIPALI 73

+ names=c(’’N-O’’,’’N-E’’,’’C’’,’’S’’,’’I’’),

+ main=’’Censimento 2001 - Comuni Oltre 10000 Abitanti’’)

N−

ON

−E

CS

I

0 5 10 15 20

Censimento 2001 − Comuni Oltre 10000 Abitanti

Errore Quadratico

Are

a T

errit

oria

le

Figura 9.5: Errore di approssimazione dei dati socio-demografici dei comuni.

Il grafico suggerisce che alcuni comuni hanno rappresentazioni particolar-mente scadenti. Ecco l’elenco dei comuni con un errore quadratico superiore a5.

> as.character(cens01$Nome[uniqual>5])

[1] ’’Maniago’’ ’’Portomaggiore’’ ’’Russi’’

[4] ’’Celano’’ ’’Casalnuovo di Napoli’’ ’’Casandrino’’

[7] ’’Crispano’’ ’’Forio’’ ’’Giugliano in Campania’’

[10] ’’Ischia’’ ’’Melito di Napoli’’ ’’Qualiano’’

[13] ’’Quarto’’ ’’Volla’’ ’’Rosarno’’

[16] ’’Sant’Agata li Battiati’’ ’’Siniscola’’

Page 74: Dispensa R

74 CAPITOLO 9. VISUALIZZARE DATI MULTIVARIATI

Page 75: Dispensa R

Capitolo 10

Modelli lineari

Un problema molto frequente e la modellazione della relazione di dipendenza diuna variabile Y da un insieme di variabili esplicative X1, . . . , Xp. In alcuni casila forma funzionale della relazione e nota (ad esempio, lineare) ed e richiestala stima dei parametri che la caratterizzano sulla base di dati campionari. Inaltri casi, anche la forma della relazione deve essere stimata. Tra i molteplicistrumenti offerti da R, consideriamo la funzione coplot(), che consente di vi-sualizzare le caratteristiche delle distribuzioni subordinate Y |Xj , e la funzionelm(), dedicata alla stima di modelli lineari. Per quanto riguarda i dati, ri-prendiamo l’archivio dei bilanci familiari nel 2002 e studiamo la relazione trala spesa per consumi ed il reddito, senza dimenticare fattori di stratificazionecome il numero di componenti della famiglia, il numero di percettori di reddito,l’eta media dei componenti e l’area territoriale.

Dopo una preliminare trasformazione logaritmica, il diagramma di disper-sione del reddito e dei consumi familiari pro capite suggerisce una relazionelineare. Il coefficiente di correlazione e prossimo a 0.75.

> plot(log(fam02$red/fam02$ncomp),log(fam02$cons/fam02$ncomp),

+ xlab=’’LogReddito familiare pro capite’’,

+ ylab=’’LogConsumo familiare pro capite’’,

+ main=’’Reddito e consumo delle famiglie italiane 2002’’,

+ col=grey((as.numeric(fam02$area)-1)/5),pch=20)

> cor(log(fam02$red/fam02$ncomp),log(fam02$cons/fam02$ncomp))

[1] 0.756895

Per valutare la relazione con le variabili di stratificazione risulta assai utilela funzione coplot() che visualizza i diagrammi di dispersione di redditi econsumi, subordinatamente alle combinazioni dei livelli di (al massimo) duevariabili concomitanti. Nel grafico sottostante mostriamo i risultati relativiall’area territoriale ed all’eta media del nucleo familiare.

> intarea=1:5

> intperc<-matrix(c(0.5,1.5,1.5,2.5,2.5,6.5),ncol=2,byrow=TRUE)

75

Page 76: Dispensa R

76 CAPITOLO 10. MODELLI LINEARI

4 6 8 10 12

56

78

910

11

Reddito e consumo delle famiglie italiane 2002

LogReddito familiare pro capite

LogC

onsu

mo

fam

iliar

e pr

o ca

pite

Figura 10.1: Redditi e consumi familiari pro capite (scala logaritmica).

> coplot(log(fam02$cons/fam02$ncomp)~

+ log(fam02$red/fam02$ncomp)|fam02$area*fam02$nperc,

+ given.values=list(intarea,intperc),

+ xlab=c(’’LogReddito familiare pro capite’’,’’Area territoriale’’),

+ ylab=c(’’LogConsumo familiare pro capite’’,

+ ’’Numero di percettori di reddito’’),

+ pch=20)

Mentre l’importanza dell’area territoriale emerge con chiarezza, il ruolo delnumero dei percettori di reddito appare incerto. In maniera analoga si puoesplorare l’influenza del numero dei componenti e dell’eta media del nucleofamiliare.

Occupiamoci ora della stima di un modello lineare avente i logconsumi fami-liari pro capite come variabile dipendente, i logredditi familiari pro capite comevariabile esplicativa principale ed infine il numero di componenti, il numero dipercettori, l’eta media e l’area territoriale come variabili esplicative secondarie.L’area territoriale e introdotta nel modello sotto la forma di variabile indicatore

Page 77: Dispensa R

77

56

78

911

4 6 8 12 4 6 8 12

56

78

911

4 6 8 12

56

78

911

4 6 8 12 4 6 8 12

LogReddito familiare pro capite

LogC

onsu

mo

fam

iliar

e pr

o ca

pite

12

34

5

Area territoriale

12

34

56

Num

ero

di p

erce

ttori

di r

eddi

to

Figura 10.2: Influenza delle variabili di stratificazione sulla relazione redditoconsumo.

che assume il valore 0 o 1 a seconda che la famiglia sia residente nel centro-nordo nel mezzogiorno.

> model <- lm(log(cons$ncomp)~log(red/ncomp)+ncomp+nperc+etam+iarea,

+ data=fam02)

> summary(model)

Call:

lm(formula = log(fam02$cons/fam02$ncomp) ~log(fam02$red/fam02$ncomp) +

fam02$ncomp + fam02$nperc + fam02$etam + fam02$iarea)

Residuals:

Min 1Q Median 3Q Max

-3.144305 -0.191671 -0.000763 0.189830 2.206919

Coefficients:

Estimate Std. Error t value Pr(>|t|)

(Intercept) 4.2158902 0.0755899 55.773 <2e-16 ***

Page 78: Dispensa R

78 CAPITOLO 10. MODELLI LINEARI

log(fam02$red/fam02$ncomp) 0.5759524 0.0074395 77.418 <2e-16 ***

fam02$ncomp -0.1193122 0.0053709 -22.215 <2e-16 ***

fam02$nperc -0.0572438 0.0066220 -8.645 <2e-16 ***

fam02$etam -0.0026015 0.0002816 -9.240 <2e-16 ***

fam02$iarea -0.1330600 0.0091447 -14.550 <2e-16 ***

------

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.3491 on 7978 degrees of freedom

Multiple R-Squared: 0.6451, Adjusted R-squared: 0.6448

F-statistic: 2900 on 5 and 7978 DF, p-value: < 2.2e-16

In base al coefficiente di determinazione multipla, il modello stimato sem-bra piuttosto buono. Tuttavia il segno negativo dei coefficienti di numero dicomponenti, numero di percettori ed eta media suscita qualche perplessita. Ilsegno negativo del coefficiente della variabile associata all’area territoriale ri-flette invece le caratteristiche dei dati: passando da iarea = 0 (centro-nord) aiarea = 1 (mezzogiorno), a parita delle altre variabili, si ottiene una diminuzionedei logconsumi procapite.

Page 79: Dispensa R

Bibliografia

[1] S. M. Iacus and G. Masarotto. Laboratorio di Statistica con R. McGraw-Hill,Milano, 2nd edition, 2007.

[2] R. Ihaka and R. Gentleman. R: a language for data analysis and graphics.Journal of Computational and Graphical Statistics, 5:299–314, 1996.

[3] R Development Core Team. R: A language and environment for statisticalcomputing, 2006. ISBN 3-900051-07-0.

79

Page 80: Dispensa R

Indice analitico

arrotondamentoround(), 26tabella di funzioni, 26

assistenzain linea, ?funzione, 12interattiva, help.start(), 12

banca daticensimento della popolazione 2001,

67indagine Banca d’Italia sui bilanci

familiari, 51

campionamentocon probabilita di estrazione va-

riabili, sample(), 40sample(), 39

ciclofor(), 23

commento, 12concentrazione

curva di Lorenz, 65rapporto di concentrazione di Gi-

ni, 65costante

alfabetica maiuscola, LETTERS,29

alfabetica minuscola, letters, 29logica, TRUE, FALSE, 13numerica indefinita, NaN, 15, 22numerica, INF, 15numerica, pi, 24

data framecostruzione, data.frame(), 20costruzione, read.table(), 33definizione, 19

scrittura su supporto esterno, write.table(),34

data, date(), 12dato mancante

codifica, NA, 30eliminazione, na.omit(), 31

matrice di correlazione, 68media aritmetica, 31ordinamento, 31

presenza, is.na(), 30deviazione standard

sd(), 63distribuzione di frequenza

confronto grafico, boxplot(), 61

diagramma a rettangoli distanziati,barplot(), 52

diagramma scatola-baffi, boxplot(),60

distribuzione marginale, rowSums(),colSums(), 53

distribuzione subordinata, barplot(),54

distribuzione subordinata, prop.table(),53, 54

indici di sintesi, summary(), 51istogramma, hist(), 56

quantile, quantile(), 54tabella bivariata, table(), 52tabella univariata, hist(), 57

tabella univariata, table(), 52tabella, table(), 51

test chi-quadrato d’indipendenza,summary(), 54

unita standard, scale(), 70distribuzione di probabilita

Binomiale, 38

80

Page 81: Dispensa R

INDICE ANALITICO 81

grafico densita gaussiana, plot(),45

grafico funzione di ripartizione, plot(),46

grafico probabilita binomiali, plot(),45

Normale, 37presentazione di dati campionari,

stem(), 38t di Student, 39tabella di distribuzioni, 37univariata, 37

distribuzione multivariataaggregazione gerarchica delle va-

riabili, hclust(), 68biplot(), 73componente principale, princomp(),

70diagramma di dispersione, plot(),

70matrice dei diagrammi di disper-

sione, pairs(), 73matrice di correlazione, 68matrice di covarianza, 68

elencodi oggetti attivi, ls(), 17

esecuzionecondizionale, if (cond), 22condizionale, if(cond) else, 22

factormedie parziali nelle classi definite

dai livelli, tapply(), 21fattore

costruzione, factor(), 20definizione, 20funzione applicata alle classi defi-

nite dai livelli, tapply(), 20funzione

calcolo di numeri di Fibonacci, 22definizione, 21delle componenti di un vettore, 25di matrice, 26grafico, plot(), 44

per il calcolo della media geomet-rica, 22

tabella di funzioni, 21

graficocoplot(), 70di funzione, plot(), 44diagramma a rettangoli distanziati,

barplot(), 51diagramma di dispersione, plot(),

69istogramma, hist(), 51matrice dei diagrammi di disper-

sione, pairs(), 70opzione, plot(), 43plot(), 43primitiva grafica, 46

letturadi archivio esterno, read.table(),

33di archivio esterno, scan(), 34

listacostruzione, list(), 21costruzione, scan(), 34definizione, 21estrazione di elementi, [[ ]], 27

matricecostruzione, matrix(), 19costruzione, rbind(), cbind(), 27definizione, 19di correlazione, 68di covarianza, 68diagonale, diag(), 26dimensioni, dim(), 19estrazione di elementi, [ ], 27prodotto righe per colonne, 27scrittura su supporto esterno, write.table(),

35tabella di funzioni, 26traccia, sum(), 26

media aritmeticaassistenza in linea, 12con dati mancanti, 31medie parziali, tapply(), 21

Page 82: Dispensa R

82 INDICE ANALITICO

modalitadi oggetti, conversione, 23di oggetti, mode(), 17

numerodi elementi di un oggetto, length(),

17

operatorearitmetico, 13assegnazione, 14di confronto binario, 13logico, 13

ordinamentosort(), 31

rimozionedi oggetti, rm(), 17

scritturasu supporto esterno, write.table(),

34stringhe di caratteri, 29

composizione, paste(), 29divisione, strsplit(), 29estrazione di sottostringhe, substring(),

30lettere maiuscole dell’alfabeto, LET-

TERS, 29lettere minuscole dell’alfabeto, let-

ters, 29lunghezza, nchar(), 29maiuscolo, toupper(), 29minuscolo, tolower(), 29modifica, gsub(), 30ricerca di sottostringhe, grep(), 30ricerca di sottostringhe, regexpr(),

30struttura

di oggetti, str(), 17

tabelladi funzioni, 21di funzioni per l’arrotondamento,

26diagrammi statistici, 51operatori, 14

opzioni di read.table(), 33test statistico

Kolmogorov-Smirnov, ks.test(), 59test chi-quadrato d’indipendenza,

summary(), 54

vettorecombinazione lineare, 25costruzione, c(), 18costruzione, operatore :, 18costruzione, rep(), 18costruzione, seq(), 18definizione, 17estrazione di elementi, [ ], 27, 29funzione applicata componente per

componente, 25trasformazione affine, 25