# R Lab 1: Distanze e dissimilarità library(ggplot2) library(cluster) # Esempio con dati simulati: 2 variabili # FreqAway=numero medio (mensile) di pasti consumati fuori casa/famiglia # Home=spesa per i pasti consumati a casa (annuale)/famiglia # dimensione per un insieme di n=100 x 2 FoodS<-read.csv("food_spending.csv", header=TRUE) head(FoodS) dim(FoodS) ggplot(FoodS, aes(FreqAway, Home)) + geom_point() #------------------------------------------------------------ ### 1. Calculo matrice delle distanze #------------------------------------------------------------ ?dist D.<- dist(FoodS) # distanza Euclidea str(D.) head(D.) # costruzione matrice da oggetto "dist" Dmat<-as.matrix(D.) Dmat[1:5, 1:5] # selezione 5x5 range(Dmat) #View(Dmat) summary(Dmat) # funzione daisy del pacchetto "cluster" ?daisy dist1<-daisy(FoodS) # default options --> distanza Euclidea; str(dist1) # dissimilarity object as.matrix(dist1)[1:5, 1:5] apply(FoodS, 2, var) apply(FoodS, 2, mean) #------------------------------------------------------------ # Standardizzazione #------------------------------------------------------------ # utilizzando daisy() dist2<-daisy(FoodS, stand = TRUE) as.matrix(dist2)[1:5, 1:5] # cosa produce "stand = TRUE"? # valori standardizzati per ciascuna delle 2 variabili # sottraendo la media e dividendo per la deviazione media assoluta # OPTIONAL # FoodS2<-matrix(NA, nrow=nrow(FoodS), ncol=2) for (j in 1:ncol(FoodS)){ FoodS2[,j]=(FoodS[,j]-mean(FoodS[,j],na.rm=TRUE))/ mean(abs(FoodS[,j]-mean(FoodS[,j],na.rm=TRUE)))} head(FoodS2) as.matrix(dist(FoodS2)) # dist(FoodS2) da' lo stesso risultato di dist2 stopifnot(dist(FoodS2)==dist2) ############## # Esercizio: # Si ottenga la matrice di dissimilarità per FoodS utilizzando la distanza di Manhattan nella # funzione dist(). Si confronti il risultato con la matrice ottenuta mediante la standardizzazione preventiva # dei dati effettuata con la funzione scale(). Md<-dist(FoodS, method = "manhattan") summary(Md) ?scale scFoodS<-scale(FoodS) #centered, scaled matrix (x-mu)/sd Md2<-dist(scFoodS, method = "manhattan") summary(Md2) par(mfrow=c(1,2)) hist(Md) hist(Md2) #------------------------------------------------------------ # Distanza di Gower per dati di tipo misto #------------------------------------------------------------ # claims data set ("claims.csv") # “litig”: contestazione (categoriale) # “soft_injury”: lesioni dei tessuti molli (categoriale) # “emergency_tr”: intervento di cure d'emergenza (categoriale) # “NumTreat”: number of medical treatments (numerica) d<-read.csv(file="claims.csv", header = TRUE) head(d) # re-code factors d$litig<-as.factor(d$litig) d$soft_injury<-as.factor(d$soft_injury) d$emergency_tr<-as.factor(d$emergency_tr) head(d) #save(d, file = "claims2.RData") ### R lab 1: 29.04.2026 load("claims2.RData") str(d) #?levels table(d$litig) prop.table(table(d$litig)) barplot(prop.table(table(d$litig)), ylim=c(0,1), col=2) # matrice delle distanze di Gower ?daisy diss<-as.matrix(daisy(d, metric = "gower")) diss[1:5, 1:5] dim(diss) range(diss) which(diss==max(diss), arr.ind=TRUE)[1,] d[c(656, 69), ]