# Esercizio 1 # Siano dati i seguenti nominativi di donatori di sangue ed i corrispondenti gruppi # sanguigni (GS): estrarre dai seguenti vettori 100 campioni baseNomi <- c("Luca","Mario", "Tommaso", "Marco", "Gianni", "Pino", "Alessia", "Francesca", "Anna", "Stefania", "Viola", "Cristina") baseCognomi <- c("Rossi", "Neri", "Bianchi", "Verdi", "Brambilla", "Ferrari", "Russo", "Esposito", "Romani", "Marino", "Colombo", "Conti", "Gallo", "Greco") baseGruppi <- c("0", "A", "B", "AB") Nomi <- sample(baseNomi, 200, replace = TRUE) GS <- sample(baseGruppi, 200, replace = TRUE) Cognomi <- sample(baseCognomi, 200, replace = TRUE) # inserire nomi, cognomi e GS in un dataframe con colonne etichettate dati <- data.frame(Nomi, Cognomi, GS) # 1.1 Rappresentare i gruppi sanguigni in una tabella delle frequenze (assolute) table(GS) # 1.2 Rappresentare i gruppi sanguigni in una tabella delle frequenze relative prop.table(table(GS)) # 1.3 Restituire i nomi ed i cognomi delle persone che hanno gruppo sanguigno B subset(dati, GS %in% "B")[, c("Nomi", "Cognomi")] # 1.4 Restituire i cognomi delle persone che hanno gruppo sanguigno B e che si chiamano Cristina subset(dati, GS %in% "B" & Nomi %in% "Cristina")[, "Cognomi"] # Esercizio 2 # 2.2 Importare il dataset creando un dataframe (INSERIRE IL PATH CORRETTO!!!) auto <- read.csv(file = "dataset/mtcars.csv") # 2.3 Visualizzare la struttura del dataset str(auto) # 2.4 Visualizzare le prime 6 righe del dataset head(auto, n = 6) # 2.5 Convertire i pesi (wt) da libbre a chilogrammi e sovrascrivere il dataframe # (attenzione i valori iniziali sono 1000 lb) auto$wt <- auto$wt * 0.453 *1000 # 2.6 Stampare la riga dell’auto più pesante subset(auto, wt %in% max(wt)) # 2.7 Calcolare la tabella delle frequenze assolute del numero dei cilindri (cyl) table(auto$cyl) # Determinare le auto che hanno 4 cilindri e più di 70 cavalli (hp) # e stamparne modello (model) e peso (wt) (provate sia con subset che con []) subset(auto, cyl == 4 & hp > 70)[, c("model", "wt")] auto[auto$cyl == 4 & auto$hp > 70,][, c("model", "wt")] # Esercizio 3 # 3.2 Importare il dataset creando un dataframe e controllarne la struttura # (INSERIRE IL PATH CORRETTO!!!) atleta <- read.csv(file = "dataset/atleti.csv") str(atleta) # 3.3 I dati dei pesi soddisfano le tre condizioni necessarie affinché siano approsimativamente normali? # Salvo in un vettore la colonna dei pesi pesi <- atleta$peso # Il primo passo per controllare che soddisfino le condizioni è calcolare # media e deviaione standard dei pesi mediaPesi <- mean (pesi) devStrPesi <- sd (pesi) # Calcolo il numero di elementi all'interno degli intervalli, li divido per la lunghezza totale # e moltiplico per 100 per avere una percentuale length (pesi[pesi > (mediaPesi - devStrPesi) & pesi < (mediaPesi + devStrPesi)]) /length(pesi) * 100 length (pesi[pesi > (mediaPesi - 2 * devStrPesi) & pesi < (mediaPesi + 2 * devStrPesi)]) /length(pesi) * 100 length (pesi[pesi > (mediaPesi - 3 * devStrPesi) & pesi < (mediaPesi + 3 * devStrPesi)]) /length(pesi) * 100 # 3.4 I dati dell'età sono simmetrici intorno al valore medio? eta <- atleta$eta mu <- mean(eta) table(eta) table(eta[eta < trunc(mu)]) # tabella delle frequenze dei valori a sinistra della media table(eta[eta > trunc(mu)]) # tabella delle frequenze dei valori a destra della media # Si nota subito che a destra della media ci sono molti più valori che a sinistra, cosa che # fa sospettare una distribuzione non simmetrica # Si nota inoltre che per valori di età simmetrici rispetto alla media (21 e 23, 20 e 24, etc.) # le frequenze assolute sono significativamente diverse. Un modo evoluto per vederlo è il seguente # (se le prossime 3 righe vi risultano ostiche, tranquilli, non eravate tenuti a pensarci) ramoSinistro <- table(eta[eta < trunc(mu)]) # parte di sinistra della tabella delle frequenze ramoDestro <- table(eta[eta > trunc(mu)])[1:length(ramoSinistro)] # parte di destra tagliando i valori senza uno speculare a sinistra ramoSinistro[length(ramoSinistro):1]-ramoDestro # differenza tra i valori simmetrici rispetto alla media # Se la distribuzione fosse simmetrica il vettore nella riga precedente dovrebbe contenere # tanti 0 e tutti numeri vicini allo 0. Così non è, dunque la distribuzione dei dati di eta # non è simmetrica # Un altro modo possibile per vederlo è quello di confrontare la mediana con # il punto medio dell'intervallo [min(eta), max(eta)] mean(range(eta)) median(eta) # i valori sono diversi; essendo la mediana significativamente minore # la distribuzione dei dati è più spostata a sinistra