# CARTELLA DI LAVORO
setwd('D:/Documents/BDA_esercitazioni/lab1') getwd()
# CARICA UNA LIBRERIA DI DATASET PRE-INSTALLATA
library(datasets)
# SOMMARIO DATI
help(datasets) #SPIEGA
library(help = "datasets")
head(iris) # MOSTRA LE PRIME SEI RIGHE DEL DATASET
summary(iris) # RIASSUME LE PRINCIPALI STATISTICHE
DESCRITTIVE
plot(iris) # SCATTERPLOT, analisi descrittivo-visiva
# CLEAR PACKAGES
detach("package:datasets", unload = TRUE)
# CLEAR PLOTS
dev.off()
# INIZIA CON LA PULIZIA DEL WORKSPACE
rm(list = ls())
# CREARE DEGLI OGGETTI, CHE VERRANNO VISUALIZZATI NEL WORKSPACE IN ALTO A
DESTRA
x = 2
# R DEDUCE LE CARATTERISTICHE DELL'OGGETTO DALL'INIZIALIZZAZIONE.
class(x)
typeof(x)
# CAMBIARE IL TIPO DELLA VARIABILE (non sempre è possibile)
int_x = as.integer(x)
# FUNZIONI BASE con x = 2
y = exp(x)
(z = sin(x)) # VISUALIZZO IL RISULTATO
t = atan(x)
q = log(x)
w = y + z + t
e = exp(1)
pi_greco = pi
# VALORI SPECIALI
x = NA # NOTAVAIABLE (E.G. DATI MANCANTI) genera altri NA
(y = log(x)) # Si propagano
x = NAN # NOTANUMBER (E.G. OPERAZIONI MATEMATICHE NON
BEN DEFINITE)
(y = log(-1))
x = Inf # VALORI OTTENUTI TRAMITE OPERAZIONI MATEMATICHE
DEFINITE AL LIMITE
log(0) o 1/0
# OPERATORI LOGICI:
== uguale
> strettamente maggiore
< strettamente minore
>= maggiore o uguale
<= minore o uguale
!= diverso
# OPERATORI BOOLEANI
& and
| or
! not
%in% # INCLUSIONE INSIEMISTICA
Es:
X=100
(b=x>99) restituisce b con valore true
# CARATTERI E STRINGHE IN UN UNICO TIPO: CHARACTER
c1 = "a"
stringa1 = "Ciao"
stringa2 = "Come stai?"
# LE STRINGHE SI POSSONO CONCATENARE MA NON SOMMARE (stringa1 + stringa2)
paste(stringa1, stringa2, sep = " ") # concatena CON SPAZIO
paste(stringa1, stringa2, sep = "") # SENZA spazio
sequenze ordinate di oggetti dello stesso tipo, non colonna o riga hanno
# VETTORI:
un solo indice.
# PER CREARLI DIVERSI MODI
(v1 = c(0.5,1,2,4,3.7,1)) #CONCATENA
(v2 = seq(from = 0, to = 1, by = 0.1)) # Punti equispaziati con passo 0.1, da
0 a 1
(v3 = seq(from = 0, to = 1, length.out = 5)) # 5 punti equispaziati tra 0 e 1
(v4 = rep(x = 1, times = 5)) # un vettore lungo 5 in cui ripeto
l'elemento 1: 11111
(v5 = rep(x = c(1,2), times = 5)) # vettore con elementi di un vettore ripetuti
5 volte 1212121212
# QUANTO È LUNGO UN VETTORE (numero oggetti)?
length(v1)
# SOMMA E PRODOTTO (SOTTRAZIONE E DIVISIONE) N.B. non sto cambiando il vettore
di partenza
v4+4, 4*v4, v4/4, v3+v4, v3*v4, v3/v4
# SE I VETTORI HANNO DIMENSIONI DIVERSE elementi di + corto ripartono dall'inizio,
viene segnalato
Es: V1= 0 1 2 3 1 V2= 4 5 2
v1+v2 4 6 4 7 6
v1*v2 0 5 4 12 5
# PRODOTTO SCALARE (somma prodotti elementi corrispondenti, risultato scalare)
v3%*%v4 # Se le dimensioni sono diverse, fallisce
# ESTRARRE/MODIFICARE GLI ELEMENTI DEL VETTORE
v1[1] # Primo elemento
v1[1:3] # Da 1 a 3 (primo, sec, terzo)
v1[c(1,3,5)] # primo, terzo e quinto el
v1[-1] # Tutti gli elementi tranne il primo
v1[-c(1,3,5)] # Tutti gli elementi tranne primo, terzo e quinto
v1[v1>2] # Estraggo gli elementi maggiori di 2 v1>2 restituisce vett di
booleani, true se verifica condiz
# FUNZIONI UTILI
(s = sum(v1)) # Somma tutti gli elementi del vettore
(p = prod(v1)) # Prodotto di tutti gli elementi
(d = diff(v1)) # Vettore generato con la regola d[i] = v[i+1] - v[i]
(cs = cumsum(v1)) # Somme cumulate, cs[i] = sum(v1[1:i])
# TUTTE LE FUNZIONI SONO APPLICABILI a ciascun ELEMENTO
(sin(v1)) (exp(v1))
# Qualunque tipo si può mettere in un vettore, per es si può creare un vettore di
stringhe, ma operazioni non valgono
v_str = rep("ciao",20)
# MATRICI SONO COLLEZIONI 2-DIMENSIONALI DI VARIABILI, COME UNA
SUCCESSIONE DI VETTORI TUTTI DELLA STESSA LUNGHEZZA E CON DATI DELLO
STESSO TIPO.
m1 <- matrix(c(T, T, F, F, T, F), nrow = 2) T T F
F T F
m2 <- matrix(c("a", "b”, "c", "d"), nrow = 2, byrow = T) “a” “b”
“c” “d”
m1 = cbind(c(1,2,3),c(4,5,6),c(7,8,9)) # Costruita per colonne
m2 = rbind(c(1,2,3,4),c(5,6,7,8),c(9,10,11,12)) # Per Righe
m3 = matrix(data = 2, nrow = 4, ncol = 3) # ricicla i valori lungo
righe (tutti 2) fa warning
m4_col = matrix(data = c(1,2,3), nrow = 3,ncol = 10) # lungo le colonne
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 1 1 1 1 1 1
[2,] 2 2 2 2 2 2 2 2 2 2
[3,] 3 3 3 3 3 3 3 3 3 3
m4 = matrix(data = c(1,2,3), nrow = 4,ncol = 10, byrow = T) # riciclare lungo le
colonne e anche le righe
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 2 3 1 2 3 1 2 3 1
[2,] 2 3 1 2 3 1 2 3 1 2
[3,] 3 1 2 3 1 2 3 1 2 3
[4,] 1 2 3 1 2 3 1 2 3 1
(d2 = dim(m2)) # Un vettore di due interi, non
funziona sui vettori
d2[1] # Numero di righe
d2[2] # Numero di colonne
# OPERAZIONI con matrici
m1 + 1
m1*2
m1 + c(1,2,3) # Somma vettore ai vett (default col) della matr, se le dim non
sono compatibili ricicla
m1 + m1 # Stessa dimensione: componente per componente
m1 + m2 # Dimensione diversa: ERRORE
m1*m1 # matrice con prodotti componente per componente
m1*m2 # dim diversa: ERRORE
m1[2,3] # seleziono elemento in seconda riga, terza colonna
m1[,3] # Terza colonna (tutte le righe)
m1%*%m1 # per ogni elemento sommo prodotto elementi corrispondenti di riga
e col con quegli indici
deve essere mxn %*% nxp = mxp, altrimenti errore
t(m2) # Matrice trasposta (scambia righe e col)
(inv_m = solve(m)) # Inversa di matrice quadrata non singolare, moltiplicate
restituiscono mat identità
det(m) # Determinante di una matrice quadrata
D = eigen(m) # restituisce autovalori e autovettori
# LISTE GENERICHE SUCCESSIONI DI OGGETTI DI DIVERSO TIPO. ELEMENTI, DETTI
CAMPI, HANNO UN NOME
# CREARE UNA LISTA CON CAMPI
mylist = list(nome = "Marco", cognome = "Rossi", voti = c(20,22,30,NA), materie =
c("analisi","chimica","fisica","probabilità"))
# ESTRARRE
mylist$cognome #nome lista, dollaro, nome campo
mylist[1] restituisce Marco
#OPPURE creo vettori e ne faccio una lista. Campi non hanno nomi, solo numeri
associati
o1 <- "Marco"
o2 <- "Rossi"
o3 <- c(20,22,30,NA)
o4 <- c("analisi","chimica","fisica","probabilità.")
list1 <- list(o1, o2, o3,o4) # Di default i campi sono dati da numeri
list1[2] # Così vedo il secondo campo, ma non vi accedo
list1[[2]] # Così accedo al secondo campo
# Posso aggiungere dopo i nomi ai campi
names(list1) = c("nome","cognome","voti","materie")
# SALVATAGGIO DI TUTTI I DATI NEL WORKSPACE
save.image("./Output/workspacelab1.rdata")
# ELIMINARE TUTTO
rm(list = ls())
# RICARICARE CIÒ CHE HO SALVATO
load("./Output/workspacelab1.rdata")
# DATA FRAMES lista di vettori della stessa lunghezza, ma che possono avere tipi
diversi.
vNumeric = c(1, 2, 3) vCharacter = c("a", "b", "c") vLogical = c(T, F,
T)
dfa = cbind(vNumeric, vCharacter, vLogical) # crea una matrice, dati tutti
convertiti ad un comune tipo meno generico possibile, in
questo caso stringa con “” data frame
df = data.frame(vNumeric, vCharacter, vLogical) # Il invece mantiene i
tipi dati in input.
#esempio
esame=data.frame(matricola = as.character( c( 45020, 45679, 46789, 43126, 42345,
47568, 45674 )), voti_S = c( 30, 19, 29, NA, 25, 26, 27 ), voti_O = c( 3, 3, 1, NA, 3, 2,
NA ), voti_TOT = c( 30, 22, 30, NA, 28, 28, 27 ))
matricola voti_S voti_O voti_TOT
1 45020 30 3 30 ogni colonna rappresenta una
variabile
2 45679 19 3 22
3 46789 29 1 30
4 43126 NA NA NA
5 42345 25 3 28
6 47568 26 2 28
7 45674 27 NA 27
# MANIPOLIAMO
esame$matricola # come per le liste (45020, 45679, 46789, 43126, 42345, 47568,
45674)
esame[,2] # come per le matrici (30, 19, 29, NA, 25, 26, 27)
esame[1:3,1:3] # (prima, sec, terza riga e col)
esame[esame$voti_S < 27,] # tutte le colonne per righe che soddisfano, virgola
è importante
# RIASSUNTO DELLE CARATTERISTICHE DEL DATA FRAME
str(esame) summary(esame)
# IMPORTARE DATAFRAME DA FILE ESTERNI
dati = read.csv("appendiceA.txt", sep = " ", header = T) header T significa che
colonne hanno nome
#oppure
dati = read.table("appendiceA.txt", header = T)
# VEDIAMO LE PRIME E ULTIME RIGHE
head(dati)
tail(dati)
# VISUALIZZIAMO I NOMI DELLE RIGHE
names(dati)
# FUNZIONI STATISTICHE DI BASE APPLICATE A DATI NUMERICI
# INDICI DI POSIZIONE:
min(dati$Peso)
max(dati$Peso)
mean(dati$Peso)
median(dati$Peso)
quantile(dati$Peso, c(0.25,0.5,0.75))
# INDICI DI DISPERSIONE
var(dati$Peso)
oppure a mano: 1/(length(dati$Peso) - 1) * sum((dati$Peso -
mean(dati$Peso))^2)
sd(dati$Peso) #dev std campionaria
IQR(dati$Peso) # range interquartile (distanza tra il primo e il terzo
quartile)
# ISTOGRAMMA mostra distribuzione. Costruzione:
- si divide il range dei dati in classi (intervalli);
- calcolo per ogni classe frequenze assolute e relative e densità=(frequenza relativa)/
(ampiezza classe);
- per ogni classe si disegnano dei rettangoli di area pari alla frequenza relativa della
classe considerata (ovvero di altezza pari alla densità). Se rappresentato con l'altezza
uguale alle frequenze assolute, è coerente solo se le classi hanno tutte la stessa
ampiezza.
#esempio Frequenze
hist( dati$Peso, prob = F )
abline(v= median(dati$Peso), col = 'red')
abline(v= mean(dati$Peso), col = 'green')
#es Densità
hist( dati$Peso, prob = T )
abline(v= median(dati$Peso), col = 'red')
abline(v= mean(dati$Peso), col = 'green')
# non esiste un numero di classi giusto, ce n’è uno std per R ma posso modificare.
Valuto robustezza in base a quanto cambia grafico con numero classi
hist( dati$Peso, prob = TRUE, breaks = 15, col = 'orange', main = 'Istogramma del
Peso', xlab = 'Peso', ylab = 'Densita' ) con
densità rettangoli più bassi
# BOXPLOT strumento grafico utile per identificare eventuali asimmetrie della
distribuzione e/o valori estremi (outlier). Per costruire:
- valori della variabile su una retta verticale;
- rettangolo con basi inferiore e superiore poste rispettivamente al primo e al terzo
quartile (Q1 e Q3), conterrà il 50% centrale delle osservazioni;
- all'interno del rettangolo si traccia una linea all'altezza della mediana;
- limite superiore a Q3 + 1.5*IQR e si traccia un baffo che collega la base superiore
del rettangolo all'osservazione più alta all'interno del limite superiore; baffo + lungo è
coda + pronunciata
- si limite inferiore uguale a Q1 - 1.5*IQR e si traccia un baffo che collega la base
inferiore del rettangolo all'osservazione più bassa contenuta all'interno del limite
superiore;
- eventuali valori maggiori del limite superiore o minori di quello inferiore vengono
segnati con un cerchio
e chiamati outliers (superiori o inferiori).
# baffi con lunghezza simile e mediana quasi centrale indica distribuzione più
simmetrica
# es
x11()
boxplot( dati$Peso, main = 'Boxplot del Peso' , col = "forestgreen")
# PER DISATTIVARE E CHIUDERE TUTTI I DEVICE GRAFICI E REIMPOSTARE IL DEFAULT:
graphics.off()
# METTERE PIÙ PLOT NELLO STESSO DEVICE
x11()
par(mfrow = c(1,3)) # device 1x3, c'è spazio per 3 grafici
for( i in 2:4)
hist(dati[,i], main = names(dati)[i], xlab = names(dati)[i], prob = T, col = i)
graphics.off() dev.off()
# TUTTO SULLA STESSA SCALA, DEVO SPECIFICARE YLIM.
hist(dati[,i], main = names(dati)[i], xlab = names(dati)[i], prob = T, col = i, ylim =
c(0,0.04))
# VARIABILI CATEGORICHE, per es la colonna specificante il "Sesso", è variabile
categorica e dicotomica. Rimane categorica indipendentemente da etichette usate per
codificare (numeri) sue categorie.
# BARPLOT, grafico a barre con frequenze assolute e/o relative (Non ci interessa la
larghezza della base dei rettangoli!)
# Calcolo le frequenze assolute e relative
f_ass = table( dati$Sesso )
f_rel = f_ass / length( dati$Sesso )
# Metodo alternativo
f_rel2 = prop.table( f_ass )
x11()
par(mfrow = c(1,2))
barplot( f_ass, col = c( 'pink', 'lightblue' ), ylab = 'F. ass' )
barplot( f_rel, col = c( 'pink', 'lightblue' ), ylab = 'F. rel' )
# GRAFICO A TORTA
x11()
pie(f_ass, col = c( 'pink', 'lightblue' ))
# es dati categorici con PIÙ DI 2 CLASSI (120 persone in una classe e ognuno la
provincia di provenienza)
# RIORDINIAMO IN MANIERA RANDOM I DATI
prov_data = sample(prov_data)
# Diciamo a R che abbiamo una variabile categorica, ne individua i valori possibili (es:
maschio, femmina).
prov_data=factor(prov_data)
# Calcoliamo le frequenze assolute e relative
(num = table(prov_data))
(table(prov_data)/length(prov_data))
# DIAGRAMMA A BARRE E A TORTA
x11()
barplot(table(prov_data)/length(prov_data), col = "gold")
x11()
pie(table(prov_data))
# CALCOLO DELLA MODA
num == max(num) # Vettore di booleani
num[num == max(num)] # Restituisce il true
# PACCHETTI, righe di codice che definiscono comandi per fare cose complesse con
poco sforzo.
# LOAD, usiamo il pacchetto "pacman" come manager degli altri. PACCHETTO
"tidyverse" ("tidyr") PER USARE E MANIPOLARE I DATA FRAMES (es):
pacman::p_load(pacman, tidyverse, babynames, ggrepel)
dati <- babynames
# ESTRAZIONE SOTTOINSIEME COLONNE
sel_1 <- dati %>% select(name,year) # specificandone il nome
dati %>% select(-year) # Tutte le colonne tranne "year"
dati %>% select(contains("e")) # Tutte le colonne il cui nome
contiene la lettera "e"
dati %>% select(ends_with("e"))
dati %>% select(starts_with("y"))
# FILTRARE RIGHE
nome <- dati %>% filter(name == "Anna") # estrae le RIGHE che soddisfano la
condizione
solo_maschi <- dati %>% filter (sex == "M")
numerosi <- dati %>% filter ( n >= 1000)
maschi_numerosi_e_femmine_rare <- dati %>% filter((sex == "M" & n >= 1000) | (sex
== "F" & n <= 10))
nomi_selezionati <- dati %>% filter( name %in% c("Anna", "Andrea"))
# RIORDINARE
dati_ordinati = dati %>% arrange(n) # Ordine crescente secondo "n"
dati_ordinati = dati %>% arrange(desc(n)) # Ordine decrescente
dati %>% arrange(n, year) # Ordina secondo "n", poi risolve i pareggi secondo "year"
# COMBINARE TUTTI I COMANDI (sempre meglio mettere select() alla fine)
sub_data<- dati %>% filter(year %in% 2000:2012)%>% arrange(n,year) %>%
select(name, n)
# ESTRAZIONE DAL DATA FRAME DI UNA SERIE DI
CARATTERISTICHE/statistiche del dataset.
# esempio: serve il numero, il massimo, e la media per anno dei bambini chiamati
Giovanni
dati %>% filter( name == "Giovanni") %>% summarise(total = sum(n), max =
max(n), mean = mean(n))
# Ogni funzione che restituisce uno scalare può essere utilizzata
# RAGGRUPPARE I VALORI DEL DATA FRAME SECONDO I VALORI DI ALCUNE
COLONNE.
by_name <- dati %>% group_by(name)
# Nota: summarise() annulla l'ultimo raggruppamento. Se si desidera annullarli tutti,
usare ungroup().
# esempio: troviamo il nome più popolare anno per anno, distinguendo tra i sessi
dati %>% group_by(year,sex) %>%
filter(n == max(n)) %>% # filter() agisce separatamente sui gruppi
select(name, year,sex) %>%
ungroup()
# AGGIUNGERE COLONNE AD UN DATAFRAME ESISTENTE
# Es: aggiungere al dataset colonna in cui la proporzione dei nomi viene trasformata
in una percentuale.
dati %>% mutate(perc = 100*prop)
# VISUALIZZAZIONE usando pacchetto ggplot. I grafici sono oggetti costruiti strato
per strato a partire da un dataframe. Possono essere salvati come qualunque altra
variabile.
# l'oggetto grafico che prende i dati dal dataframe
initial_plot = ggplot(diamonds_data)
# grafico a barre (categorica): l'argomento "mapping" stabilisce come i dati vengono
manipolati. In questo caso che l'estetica - "aes" - del grafico sia data dalla variabile cut
sull'asse x.
bar1 = initial_plot + geom_bar(mapping = aes(x = cut))
# dividere le barre utilizzando l'informazione nel valore "clarity"
bar2 = initial_plot + geom_bar(mapping = aes(x = cut, fill = clarity)) #fill=clarity
colora i grafici in base al valore
categorico della variabile clarity
# dividere i grafici:
bar3 = initial_plot + geom_bar(mapping = aes(x = cut, fill = clarity), position =
"dodge")
# visualizzare le proporzioni (si perde info su numero)
bar4 = initial_plot + geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")
x11()
plot(bar)
# per istogrammi (quantitativa)
hist1 = initial_plot + geom_histogram(mapping = aes(x = price, fill = cut))
# oppure
dens1 = initial_plot + geom_density(mapping = aes(x = price, col = cut))
# per i boxplot (quantitativa)
box1 = initial_plot + geom_boxplot(mapping = aes(x = clarity, y = price, fill = clarity))
# DISTRIBUZIONE DI PROBABILITÀ su R è identificata da una qualsiasi tra le tre
funzioni seguenti:
(1) Funzione di ripartizione F(t) = P(X <= t)
(2) Funzione Quantile, inversa (generalizzata) di F
(3) Funzione Densità, ovvero f(t) = P(X = t) con X discreta, o f(t) = F'(t) se X continua
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Business Data Analytics
-
Business data analytics
-
Business Intelligence
-
Big Data & Business Analytics, il nuovo motore del successo competitivo
- Risolvere un problema di matematica
- Riassumere un testo
- Tradurre una frase
- E molto altro ancora...
Per termini, condizioni e privacy, visita la relativa pagina.