# Esercizio 1 # 1.1 Scaricare e importare il dataset capelli.csv df <- read.csv("soluzioni/dataset/capelli.csv") # 1.2 Usare le funzioni predefinite di R calcolate # covarianza e correlazione tra la lunghezza e le altre misure. # visualizziamo le prime righe del dataframe per farci un'idea della struttura head (df) # Una soluzione: usare un ciclo for per scorrere le colonne del dataframe for (colonna in names(df)){ print(paste(colonna, "vs lunghezzaCapelli")) print("Covarianza") print(cov(df$lunghezzaCapelli, df[,colonna], use="na.or.complete")) print("Correlazione") print(cor(df$lunghezzaCapelli, df[,colonna], use="na.or.complete")) } # Un'altra soluzione: scrivere i singoli valori # cov(df$lunghezzaCapelli, df$spesaShampoMensile,use="na.or.complete") # cor(df$lunghezzaCapelli, df$spesaShampoMensile,use="na.or.complete") # cov(df$lunghezzaCapelli, df$spesaTaglioMensile,use="na.or.complete") # cor(df$lunghezzaCapelli, df$spesaTaglioMensile,use="na.or.complete") # cov(df$lunghezzaCapelli, df$probFidanzamento,use="na.or.complete") # cor(df$lunghezzaCapelli, df$probFidanzamento,use="na.or.complete") # 1.3 Fare dei grafici a dispersione per confermare la vostra ipotesi for (colonna in names(df)){ plot(df$lunghezzaCapelli, df[,colonna], xlab = "lunghezza" , ylab = colonna) } # Soluzione alternativa # plot(df$lunghezzaCapelli, df$spesaShampoMensile) # plot(df$lunghezzaCapelli, df$spesaTaglioMensile) # plot(df$lunghezzaCapelli, df$probFidanzamento) # 1.4 Fare un boxplot e un istogramma della colonna della spesaShampoMensile, cosa li accomuna? boxplot(df$spesaShampoMensile) hist(df$spesaShampoMensile) # Entrambi i grafici danno una buona idea della distribuzione dei valori, essendo gli stessi dati # ?? facile notare come ci sia corrispondenza tra barre pi?? alte dell'istogramma e la scatola del boxplot # lo stesso si pu?? dire degli outliers, specialmente nel caso dei valori vicini allo zero. # 1.4 Fare un grafico a torta della probabilit?? di fidanzamento dividendo in 3 blocchi i dati in questo modo: # nell'intervallo (0,0.3] uncool # tra (0.3,0.6] normali # tra (0.6,1] cool # Inanzitutto bisogna creare un vettore che divida i dati breaks <- c (0, 0.3, 0.6, 1) # e uno di etichette etichette <- c("uncool", "normali", "cool") # calcoliamo le frequenze degli intervalli freIntervalli <- table(cut (df$probFidanzamento, breaks = breaks, include.lowest = TRUE)) # facciamo il grafico associando le etichette pie(freIntervalli, etichette, col = c("red", "yellow", "green")) #Esercizio 2 # 2.1 Scaricare e importare il dataset df <- read.csv("soluzioni/dataset/daticlassificatore.csv") # 2.2 Visualizzare le prime 6 righe del file head(df) # visualizziamo anche la struttura che non fa mai male str(df) # 2.3 Calcore specificity e sensibility al variare della soglia # Definisco una funzione che mi restituisce le due misure a partire da un dataframe gi?? filtrato measures <- function(df){ tp = nrow(df[df$stima==1 & df$fidanzato==1,]) tn = nrow(df[df$stima==0 & df$fidanzato==0,]) fp = nrow(df[df$stima==1 & df$fidanzato==0,]) fn = nrow(df[df$stima==0 & df$fidanzato==1,]) specificity <- tn / (tn + fp) sensibility <- tp / (tp + fn) return(c(specificity,sensibility)) } # Creo una matrice per associare specificity, sensibility e valore di soglia # la matrice sar?? piena di zeri e man mano che verranno calcolati i valori saranno sostituiti res = matrix(0, ncol = 3, nrow = length(unique(df$soglia))) colnames(res) = c("1-specificity", "sensibility", "soglia") j = 1 for (i in unique(df$soglia)){ trimmed <- df[df$soglia==i,] res[j,] <- c(measures(trimmed), i) j <- j+ 1 } # 2.4 Fare un plot della curva di ROC # tolgo 1 a tutti i valori della colonna della specificit?? e faccio il plot res [,1] <- 1- res[,1] plot(res, type = "l") abline(a=0,b=1, lty=5)