Sei sulla pagina 1di 7

#===========================

# Esercizio 1
#===========================

# Si considerino i seguenti livelli di soddisfazione degli utenti per un servizio


di spedizioni: "per nulla", "poco", "abbastanza", "molto", "completamente".

# - Creare un vettore **`L`** contenente i possibili valori del livello di


soddisfazione;
# - Generare un campione **`X`** con 80 livelli di soddisfazione estratti (con
ripetizione) dal vettore **`L`** (a tal fine utilizzare il comando **`sample`** con
l'opzione **`replace=T`**)
# - condurre un'analisi statistica descrittiva sul campione **`X`** utilizzando
tutti gli strumenti analitici e grafici utilizzabili fra quelli discussi durante il
corso

set.seed(12345)

L <- c("per nulla", "poco", "abbastanza", "molto", "completamente")


# estraggo il campione X
X <- sample(L, 100, replace=TRUE)
X <- factor(X, levels=L, ordered=TRUE)
str(X)

# genero la tabella delle frequenze assolute


Xtab <- table(X)
Xtab

summary(X)
boxplot(X)

# eseguo un plot delle frequenze assolute


plot(Xtab)
# si evince dal grafico che la moda è "poco"
pie(Xtab) # con frequenza assolute vicine il grafico a torta è poco intellegibile

# accetta come argomento un vettore


calcola_moda = function(x) {
t <- table(x)
# in questo modo ottengo solo l'etichetta o le
# ethichette corrispondenti al/ai valori massimi
labels(which(t == max(t)))
}

calcola_moda(X)

# Si tratta di una variabile qualitativa ordinale => ha senso guardare la mediana

# un modo di determinare la mediana è interpretare il vettore delle osservazioni


come un vettore numerico
# 1-> classe 1; 2-> classe 2; 3-> classe 3; ...

# potete avere un'intuizione di come sfruttare questa idea utilizzando questi


comandi
as.numeric(X)
sort(as.numeric(X))

#utilizzo la funzione median per il calcolo della mediana


mediana <- median(as.numeric(X))
mediana
# in questo caso la mediana corrisponde alla classe 3
# posso risalire all'etichetta della classe con il comando

levels(X)[mediana]

#===========================
# Esercizio 2
#===========================

# Vengono effettuati dei campionamenti di acqua da un certo numero di sorgenti e


per ciascun campione
# vengono rilevate le concentrazioni (in mg/l) di tre sostanze: A, B e C. I dati
delle concentrazioni delle tre sostanze sono riportati nel file
**`concentrazioni.txt`**.

# - importare il file **`concentrazioni.txt`** (disponibile nella cartella


**`dataSets`**) nel dataframe **`concentrazioni_df`**
# - determinare la distribuzione in classi delle concentrazioni delle tre sostanze
considerando i seguenti intervalli:
# * $(20, 35], (35, 50], (50, 65], (65, 80]$ per la sostanza A
# * $(20, 25], (25, 30], (30, 35], (35, 40]$ per la sostanza B
# * $(10, 20], (20, 30], (30, 40]$ per la sostanza C
# - a partire dalla distribuzione in classi determinare moda, media, varianza e
mediana per la concentrazione della sostanza A
# - realizzare un grafico della distribuzione empirica della concentrazione della
sostanza A a partire dalla distribuzione in classi
# - facendo riferimento alle classi definite sopra, confrontare la dipendenza delle
concentrazioni delle sostanze A e B con quella delle concentrazioni delle sostanze
A e C

#----------------------------

# importo i dati nel dataframe


concentrazioni_df<- read.table("./dataSets/concentrazioni.txt") # il percorso deve
essere quello della cartella in cui avete salvato il file
names(concentrazioni_df) #visualizzo i nomi delle colonne del dataframe
#concentrazioni_df
str(concentrazioni_df) #per avere un'idea di che cosa contenga il dataframe

# definisco gli intervalli in cui raggruppare in classi le concentrazioni delle tre


sostanze
intervalli_A <- c(20, 35, 50, 65, 80)
intervalli_B <- c(20, 25, 30, 35, 40)
intervalli_C <- c(10, 20, 30, 40)

# costruisco gli array della distribuzione in classi per ciascuna delle tre
sostanze
A_classi <- cut(concentrazioni_df$A, intervalli_A)
B_classi <- cut(concentrazioni_df$B, intervalli_B)
C_classi <- cut(concentrazioni_df$C, intervalli_C)

# analisi descrittiva della concentrazione della sostanza A


# utilizzo un approccio alternativo a quello visto a lezione che, tuttavia, può
essere comunque utilizzato

# costruisco un oggetto di tipo istogramma


hA <- hist(concentrazioni_df$A, breaks=intervalli_A, plot=FALSE)
str(hA)
plot(hA) #

# dermino la moda: la moda è la classe con la massima densità di frequenza


which(hA$density == max(hA$density))
# la classe con la massima densità di frequenza è la 3
# ovvero l'intervallo (50, 65]
# questo era evidente anche dal plot dell'istogramma
# notate che in questo caso tutti gli intervalli hanno la stessa lunghezza e nel
plot dell'istogramma compaiono (di default), in ordinata, le frequenze assolute;
con intervalli tutti della stessa ampiezza frequenze e densità di frequenza di
ciascuna classe sono direttamente proporzionali: infatti, chiamando d_i la densità
di frequenza dell'i-esima classe, f_i la freqeunza assoluta dell'i-esima classe,
l_i la lunghezza dell'intervallo i-esimo ed n il numero totale di osservazioni si
ha d_i = (f_i/n)/l_i, ma in questo caso gli l_i sono tutti uguali
# qualora si fosse voluta la densità di frequenza in ascissa si sarebbe potuto
utilizzare il comando plot(hA, freq=FALSE)

#determino i punti medi degli intervalli


xi <- hA$mids
xi

#costruisco un array in cui, per ciascuna classe, le osservazioni sono tutte


"concentrate" nel punto medio dell'intervallo

A_classes_counts <- hA$counts #in alternativa avrei potuto utilizzare


table(A_classi)
A_mids <- rep(xi, A_classes_counts)
A_mids

# calcolo il valor medio di A (a partire dalla distribuzione in classi)


mu_A = mean(A_mids)
mu_A

# calcolo della varianza (distorta) di A (a partire dalla distribuzione in classi)

n <- length(A_mids)
var_A = var(A_mids) * (n-1)/n
var_A

# per calcolare la mediana ho bisogno della funzione di ripartizione empirica


# costruisco la funzione di ripartizione empirica
# innaanzi tutto calcolo le frequenze relative a partire da quelle assolute

# frequenze assolute
tabA <- table(A_classi)
tabA

# frequenze relative
fA <- tabA/sum(tabA)
fA

# la funzione di ripartizione empirica è la cumulata delle frequenze relative


FA <- cumsum(fA)
FA

# cerco la classe per cui FA "attraversa" il valore 1/2 (ovvero la classe a cui
appartiene la mediana)

i_star <- min(which(FA > 1/2))


i_star

# densità di frequenza della classe della mediana (la leggo dall'istogramma)


h_i_star = hA$density[i_star]
h_i_star

medianaA <- intervalli_A[i_star] + ((0.5 - FA[i_star - 1])/h_i_star)


medianaA

# la funzione di ripartizione empirica vale ZERO fino all'estremo sinistro


# del primo intervallo => aggiungo ad FA il valore ZERO come primo valore
FA <- c(0, FA)
FA

# ora posso effettuare il plot


plot(intervalli_A, FA, type='b')
lines(c(medianaA, medianaA, 0), c(0, 0.5, 0.5), lty=2, col="red")
abline(h=0)
plot(ecdf(concentrazioni_df$A), add=TRUE)
median(concentrazioni_df$A)
# dipendenza delle concentrazioni delle sostanza

# costruisco una tabella di contingenza per le concentrazioni della sostanza A e


della sostanza B

# ESERCIZIO DA PROVARE A FARE IN AUTONOMIA: data una matrice, con h righe e k


colonne, "trasformarla" in una tabella di contingenza per una distribuzine in
classi...

# costruisco le tabelle di contingenza


tabAB <- table(A_classi, B_classi)
tabAC <- table(A_classi, C_classi)

str(tabAB)
str(summary(tabAB))
attributes(summary(tabAB))
summary(tabAB)$n.vars
summary(tabAB)$n.cases
summary(tabAB)$statistic
summary(tabAC)$parameter

# per determinare il "grado di dipendenza" delle variabili aleatorie caclolo il


valore della statistica chi_quadro e lo confronto con il valore massimo che tale
statistica può assumere

# definisco delle funzioni per determinare il valore della statistica chi_quadro e


il valore massimo che tale statistica può assumere in funzione del numero delle
classi e del numero totale di osservazioni

# il parametro t deve essere una tabella di contingenza


compute_chi_max <- function(t) {
N <- sum(t) # numero totale di osservazioni
h <- dim(t)[1] # numero di classi della variabile 1
k <- dim(t)[2] # numero di classi della variabile 2

return(N * min(h-1, k-1))


}

# il parametro t deve essere una tabella di contingenza


compute_relative_chi <- function(t){
chi_max <- compute_chi_max(t)

t_summary <- summary(t)

chi_stat <- t_summary$statistic

return(chi_stat/chi_max)
}

Xtilde_AB <- compute_relative_chi(tabAB)


Xtilde_AB

# ripeto la stessa analisi per la concentrazione delle sostanze A e C


# costruisco la tabella di contingenza per le concentrazioni delle sostanze
# A e C

tabAC <- table(A_classi, C_classi)


tabAC

Xtilde_AC <- compute_relative_chi(tabAC)


Xtilde_AC

# la dipendenza fra la concentrazione delle sostanze A e C è molto maggiore


# rispetto a quella delle sostanze A e B
# il valore della statistica chi_tilde per le sostanze A e B è molto basso, mentre
nel caso delle sostanze A e C questa è piuttosto elevata (superiore a 0.4)

#===========================
# Esercizio 3
#===========================

# Si considerino una serie di valori **`X`** generata con il comando


**`round(runif(0, -20, 20), 2)`**
# ed una serie di valori **`Y`** generati con il comando **`round((X + rnorm(20, 0,
1))^2, 2)`**.

# - condurre una regressione lineare per la Y (in funzione della X)


# - fare un grafico delle osservazioni e della retta di regressione
# - discutere la bontà di adattamento ed effettuare, se si ritiene sensato, una
previsione per il valore della Y in corrispondenza X=-2;

# Si consideri una serie di valori valori **`Z <- sqrt(Y)*sign(X)`**

# - ripetere la stessa analisi di regressione lineare per la **`Z`** in funzione


della **`X`**

set.seed(12345)

# analisi di regressione per le variabili X e Y (Y in funzione di X)


# genero il vettore X
X <- round(runif(20, -5, 5), 2)
X
# genero il vettore Y
Y <- round((X + rnorm(20, 0, 1))^2, 2)
#Y <- exp(-X) * exp(rnorm(20, 0, .1))
Y

# grafico delle osservazioni


plot(X, Y)

# stima dei parametri per un modello lineare


mYX <- lm(Y~X)
summary(mYX)
plot(X, Y)
abline(mYX)

# grafico dei residui in funzione dei valori delle osservazioni della variabile X
plot(X, mYX$residuals)
abline(h=0)

# i residui non sembrano essere distribuiti casualmente intorno allo zero; i valori
negativi dei residui sono concentrati nella parte centrale dell'intervallo di
variazione della X (valori assoluti della X "piccoli"), mentre i valori positivi si
trovano agli estremi dell'intervallo (valori assoluti della X "grandi")

# il modello lineare non sembra appropriato...

# per valutare la bontà di adattamento da un punto di vista quantititativo,


guardiamo il quadrato del coefficiente di correlazione fra X e Y
cor(X, Y)^2

# il valore del quadrato del coefficiente di correlazione è molto vicino allo zero
=> il modello lineare non sembra essere un buon modello per spiegare la relazione
fra Y e X

# in questo contesto non sembra sensato utilizzare il modello per fare una
previsione

# ripeto la stessa analisi per le variabili X e Z

# genero il vettore Z
Z <- sqrt(Y)*sign(X)
plot(X, Z)

# stima dei parametri per la retta Z = a + bX


mZX <- lm(Z~X)
summary(mZX)

plot(X, Z)
abline(mZX)

# grafico dei residui in funzione dei valori delle osservazioni della variabile X
plot(X, mZX$residuals)
abline(h=0)
# i residui non sembrano avere un andamento sistematico in funzione della variabile
X, ma sembrano distribuiti "casualmente" intorno allo zero
# per valutare la bontà di adattamento da un punto di vista quantititativo,
guardiamo il quadrato del coefficiente di correlazione fra X e Z
cor(X, Z)^2
# il valore è molto elevato (> 0.7) => il modello lineare sembra essere un buon
modello; in questo contesto è sensato utilizzare il modello per effettuare una
previsione per il valore della Y in corrispondenza di un valore della X all'interno
dell'intervallo di variazione del campione

# determino il campo di variazione della X


summary(X)

# il punto X = -2 è compreso nell'intervallo di variazione del campione (-4.99,


4.9)
predict(mZX, data.frame(X=-2))

Potrebbero piacerti anche