Abbiamo già visto le funzioni che R ci mette a disposizione per le analisi univariate. Oggi parliamo invece di analisi bivariate (o, più in generale, multivariate).
Riassumiamo i comandi che ci consentono di generare e manipolare le tabelle di contingenza.
table(...)
: riassume i dati multivariati nello stesso modo in cui fa con i dati univariati, calcolando la tabella di contingenza. Questa sarà un array di dimensione n, dove n è il numero di attributi dell'insieme di dati. Ogni parametro di input è un vettore con lo stesso numero di elementi, pari al numero di istanze dell'insieme di dati.Consideriamo il set di dati orestudio composto da due attributi, smokes e amount. Ogni istanza rappresenta una persona, di cui memorizziamo il numero di ore di studio e il fatto se fuma oppure no.
> orestudio=data.frame(smokes=c("Y","N","N","Y","N","Y","Y","Y","N","Y"),amount=c(1,2,2,3,3,1,2,1,3,2)) > attach(orestudio) > t=table(smokes,amount) > t amount smokes 1 2 3 N 0 2 2 Y 3 2 1
prop.table(x, margin=NULL)
: prende la tabella di contingenza x, espressa in termini di frequenze assolute, e calcola una corrispondente tabelle in termini di frequenze relative. È possibile anche calcolare le frequenze marginali, specificando in margin la dimensione (1 per le frequenze di riga, 2 per quelle di colonna, etc..).
> prop.table(t) amount smokes 1 2 3 N 0.0 0.2 0.2 Y 0.3 0.2 0.1 > prop.table(t,1) amount smokes 1 2 3 N 0.0000000 0.5000000 0.5000000 Y 0.5000000 0.3333333 0.1666667
Il sistema R mette a disposizione alcune semplici funzioni per il calcolo di indici statistici per dati multivariati.
cov(x, ..., use="all.obs")
: calcola la matrice di covarianza tra le colonne della matrice x (stimatore consistente). Il parametro use
può assumere i seguenti valori: all.obs
se si utilizzano tutte le istanze, complete.obs
se si utilizzano le istanze che non hanno valori NA, pairwise.complete.obs
se per ognuno degli elementi della matrice di covarianza si considerano tutte le istanze che non hanno valori NA negli attributi coinvolti.cov(x, y, ..., use="all.obs")
: calcola la covarianza tra i vettori x ed y.cor(x, ..., use="all.obs")
: come cov
ma calcola la matrice dei coefficienti di correlazione invece che la matrice delle covarianze.chisq.test(x,y,correct=TRUE)
: determina il valore di χ² per i vettori x e y. Normalmente viene effettuata una correzione di continuità. Se si vogliono ottenere risultati identici a quelli del corso, impostare correct=FALSE
. Il risultato è una lista di classe htest
.Si consideri il set di dati weather.nominal.csv e si calcoli il guadagno di informazione dell'attributo outlook
usando play
come attributo classe. Riutilizzare a tale scopo le funzioni entropia
o entropia.data
definite negli esercizi precedenti.
Automatizzare la procedura seguita per lo svolgimento dell'esercizio 1, e scrivere una funzione infogain(class, attr)
che calcoli il guadagno di informazione di attr
rispetto a class
. Ad esempio:
> v=c("a","a","b","c","a") > a=c(0,0,1,1,0) > infogain(v,a) [1] 0.9709506 > w=read.csv("weather.nominal.csv") > infogain(w$outlook,w$play) [1] 0.2467498
La soluzione 2 è ottenuta generalizzando la soluzione dell'esercizio precedente. La soluzione 1 è, invece, una soluzione alternativa allo stesso esercizio.
Il comando più utilizzato per la visualizzazione grafica di distribuzioni multivariate è plot
.
plot(x, y, ...)
: se x è y sono vettori numerici, visualizza un diagramma di dispersione. Se y è assente, allora è come se x fosse la sequenza 1:length(y).
.
plot(df, ...)
: se df è un dataframe, visualizza un grafico Esempio:
plot(iris$Sepal.Length,iris$Petal.Length)
visualizza un diagramma di dispersione per due attributi del set di dati iris
, mentre plot(iris) visualizza un pannello con tutti i possibili diagrammi di dispersione per gli attributi dello stesso insieme di dati.
Il comando plot
è in realtà molto flessibile, e i vari parametri opzionali consentono facilmente di ottenere diagrammi adatti agli scopi più disparati: diagrammi per serie storiche, diagrammi cartesiani per attributi numerici discreti, etc.. Tra le opzioni aggiuntive molto utilizzate citiamo:
type
: specifica come visualizzare il diagramma di dispersione. Alcune opzioni sono: "p"
visualizza solo dei punti, "l"
visualizza delle linee che collegano i punti del diagramma, "b"
visualizza sia i punti che le linee, "h"
visualizza delle linee verticali che vanno dal punto da visualizzare fino all'asse x.col
: il colore da usare per i puntipch
: l'aspetto grafico del punto. Può essere un carattere o un intero (che identitifica uno dei simboli predefiniti)I parametri col
e pch
possono anche accettare vettori: in tal caso, ogni punto del grafico sarà colorato e/o rappresentato sullo schermo a seconda di quanto specificato nel corrispondente elemento di col
e pch
.
Esempio:x=seq(-10,10,0.1)
plot(x,x*x-x,type="l") visualizza il grafico della funzione x^2-x.
Alcune funzioni molto utili, che non creano un nuovo grafico ma aggiungono il loro output ad un grafico già aperto, sono le seguenti:
points(x)
: simile a plot
, ma disegna i punti su un grafico già aperto;lines(x)
: simile a points(x)
, ma disegna delle linee che uniscono i punti indicati, piuttosto che i punti stessi (equivale a points
con l'opzione type="l"
);legend(x, y, legend, ...)
: visualizza una legenda sul grafico, alle coordinate (x,y). Il parametro legend
è un vettore di etichette per la legenda. Normalmente si utilizzano anche i seguenti parametri:
pch
: come per plot
, visualizza un simbolo accanto all'etichetta;col
: come per plot
, seleziona il colore dell'etichetta;fill
: visualizza un quadratino del colore indicato accanto all'etichetta.Esempio:x=seq(-10,10,0.1)
plot(x,x*x-x,type="l",ylab="")
points(x,x*x+3,type="l",col="red")
legend(-2,90,c("x*x-x","x*x+3"),col=c(1,2),fill=c(1,2)) visualizza contemporaneamente il grafico delle funzioni x^2-x e x^2+3 (il primo nero, il secondo rosso) con una corrispondente legenda.
Si consideri il dataset iris
. Si visualizzi un diagramma di dispersione per gli attributi Sepal.Length e Sepal.Width, colorando in maniera diversa i punti corrispondenti ai tre tipi di iris. Si utilizzi a questo scopo la funzione as.integer(x)
che, dato un oggetto di tipo factor (ad esempio, un attributo categoriale di un data frame) restituisce un array di interi (un intero diverso per ognuna delle possibili modalità).
Soluzione: plot(iris$Sepal.Length, iris$Sepal.Width, col=as.integer(iris$Species))
Visualizzare il grafo riassuntivo di tutti i possibili scatter plot tra gli attributi del dataset iris, colorando come sopra i punti sulla base del tipo di iris. Qual è lo scatter plot in cui le varie specie sono più separate?