vuoi
o PayPal
tutte le volte che vuoi
crescente le varie categorie. Per farlo, inseriamo il vettore nella funzione
ordered() e successivamente stabiliamo i livelli:
taglie_ordinate=ordered(c("large","medium","extra-
large","small","medium","extra-small","extra-large","small","extra-
large","medium"), levels=c("extra-small","small","medium","large","extra-
large")) # --> Levels: extra-small < small < medium < large < extra-large
is.ordered(taglie) # --> FALSE
is.ordered(taglie_ordinate) # --> TRUE
table(taglie) #restituisce la distribuzione delle frequenze assolute
table(taglie)+3 #restituisce la distribuzione delle frequenze assolute con la
maggiorazione scritta
names(table(taglie)) #restituisce i nomi delle categorie
genere=factor(rep(c("F","M"), c(4,4))) #crea un vettore categoriale. la funzione
rep(), fa si che gli elementi del primo sotto-vettore siano ripetuti
rispettivamente tante volte quante sono indicate nel secondo sotto-vettore
altezza=c(165,176,171,177,176,193,180,193)
tabella=data.frame(genere,altezza) #questo comando crea una tabella in cui gli
elementi passati dentro a data.frame() vengono associati
subset(tabella, subset=genere == "M" & altezza > 190) #mi permette di
selezionare certe RIGHE da tabella
subset(tabella, select=altezza) #mi permette di selezionare certe COLONNE da
tabella
#oppure
tabella$altezza
sort(altezza) #ordina in senso crescente il vettore altezza
sort(altezza, decreasing=TRUE) #ordina in senso decrescente il vettore altezza
order(altezza) #mi restituisce le posizioni dei valori ordinati in senso
crescente
o=order(tabella$altezza)
tabella[o,] #mi restituisce la tabella in ordine di altezza
whatsapp=c(76,74,86,34,48,12,48,54,98,108,64,72,28,52,82,88,92,54,106,60)
#campione di 20 osservazioni sul numero di sms inviati il giorno di natale
classi_whatsapp=cut(whatsapp, breaks=c(10,30,50,70,90,110), include.lowest=TRUE)
#creo le classi di valori
f.assolute=table(classi_whatsapp) #frequenze assolute
f.relative=f.assolute/sum(table(classi_whatsapp)) #frequenze relative
f.cumulate=cumsum(f.relative) #frequenze cumulate
distribuzione.frequenze=data.frame(f.assolute,f.relative,f.cumulate) #tabella
della distribuzione di frequenze
hist(whatsapp,freq=FALSE,main="Istogramma") #Istogramma della distribuzione
#esempio analogo al precedente eccetto che per il fatto che le classi hanno
diversa ampiezza
whatsapp=c(76,74,86,34,48,12,48,54,98,108,64,72,28,52,82,88,92,54,106,60)
classi_whatsapp=cut(whatsapp, breaks=c(5,15,30,50,100), include.lowest=TRUE)
estremi=c(5,15,30,50,120)
differenza_estremi=diff(estremi)
densità_frequenza=f.relative/differenza_estremi
hist(whatsapp, breaks=estremi,freq=FALSE,main="Istogramma") #Istogramma
#RIASSUNTO DISPENSA 3
whatsapp = c(76,74,86,34,48,12,48,54,98,108,64,72,28,52,82,88,92,54,106,60)
n=length(whatsapp)
#CALCOLARE LE FREQUENZE ASSOLUTE
table(whatsapp)
#oppure
fi=table(whatsapp)
#CALCOLARE LE FREQUENZE RELATIVE
prop.table(table(whatsapp))
#oppure
pi=fi/n
#CALCOLARE LA MEDIA
mean(whatsapp)
#oppure
media=sum(whatsapp)/n
#CALCOLARE LA MEDIANA
median(whatsapp)
#oppure
posizione.mediana=0.5*(n+1)
mean(sort(whatsapp)[c(floor(posizione.mediana), ceiling(posizione.mediana))])
#CALCOLARE LA MODA
moda=table(whatsapp)[table(whatsapp)==max(table(whatsapp))]
#CALCOLARE IL MASSIMO
max(whatsapp)
#CALCOLARE IL MINIMO
min(whatsapp)
#CALCOLARE I QUARTILI
quantile(whatsapp)
#se voglio un quartile in particolare:
quantile(whatsapp, probs=0.25)
#DIFFERENZA INTERQUARTILE
IQR(whatsapp)
#PER SINTETIZZARE TUTTI GLI INDICI DI POSIZION
summary(whatsapp)
#GRAFICO DELLA DISTRIBUZIONE
boxplot(whatsapp)
#STUDIARE LA SIMMETRIA
median(whatsapp)==mean(whatsapp)
#FALSE --> asimmetria
median(whatsapp)>mean(whatsapp)
#TRUE --> asimmetria negativa
A=c(1,1,1,4,7,7,7)
#MISURA LA DIFFERENZA FRA IL VALORE PIU' GRANDE E QUELLO PIU' PICCOLO
diff(range(A))
#CALCOLARE LA VARIANZA
var(A)
#CALCOLARE LA DEVIAZIONE STANDARD
sd(A)
#fatturato misurato su due campioni di 5 aziende ciascuno; il primo costituito
da 5 multinazionali, il secondo da 5 aziende locali. Calcolare i coefficenti di
variazione e commentare i risultati
multinazionali=c(500,700,380,450,850)
locali=c(30,60,25,10,85)
media.m=mean(multinazionali)
media.l=mean(locali)
deviazionestandard.m=sd(multinazionali)
deviazionestandard.l=sd(locali)
#CALCOLO COEFFICENTE DI VARIAZIONE
cv.m=deviazionestandard.m/abs(media.m) #abs mi restituisce il valore assoluto,
dunque privato di segno
cv.l=deviazionestandard.l/abs(media.l)
cv.m #0.33
cv.l #0.71
#dunque il fatturato della aziende locali è piu varibaile rispetto a quello
delle multinazionali
#azienda di arredamento osserva per 8 settimane due variabili quantitative:
x=viste al sito web, y=preventivi via email per settimana. Rappresentare le due
variabili in modo congiunto, calcolare covarianza e correlazione
x=c(1210,1290,2492,708,902,2798,1115,1485)
y=c(15,17,24,18,14,32,18,23)
#GRAFICO X,Y CONGIUNTO
plot(x,y, xlab="viste", ylab="preventivi", xlim=c(0,3000), ylim=c(0,35))
#CALCOLARE LA COVARIANZA
cov(x,y)
#CALCOLARE LA CORRELAZIONE
cor(x,y) #0.88 --> più è alta, e più le variabili sono correlate fra loro.
[range correlazione: (0,1)]
#RIASSUNTO DISPENSA 4
#COSTRUZIONE DELLA TAVOLA DEI DATI GREZZI
residenza=c("milano","fuori milano","fuori milano","fuori milano","milano",
"fuori milano","fuori milano","milano")
expo=c("si","si","no","no","no","si","si","no")
dati=data.frame(expo,residenza) #crea la tabella dei dati grezzi
#FREQUENZE CONGIUNTE ASSOLUTE
freq.congiunte=table(dati) #crea la tabella a doppia entrata con i valori
assoluti delle osservazioni
freq.congiunte.marginali=addmargins(freq.congiunte) #aggiunge la marginale
table(dati$expo) #restituisce la marginale di expo
table(dati$residenza) #restituisce la marginale di residenza
#FREQUENZE CONGIUNTE RELATIVE
n=sum(freq.congiunte) #totale osservazioni
freq.congiunte.rel=table(dati)/n #crea la tabella a doppia entrata coi valori
relativi
#oppure
prop.table(freq.congiunte)
freq.congiunte.marginali.rel=addmargins(freq.congiunte.rel) #aggiunge la
marginale relativa delle variabili
table(dati$expo)/sum(table(dati$expo)) #restituisce la marginale relativa expo
table(dati$residenza)/sum(table(dati$residenza)) #restituisce la marginale
relativa di residenza
#FREQUENZE CONDIZIONATE
prop.table(freq.congiunte,1) #condizion righe -> expo condiziona la residenza
prop.table(freq.congiunte,2) #condizion colonne ->resi denza condiziona expo
#LETTURA DI FILE IN R
read.table(file="a.txt",header=TRUE) #importo il file in r, il comando header fa
si che la prima riga non sia quella con scritti i nomi delle variabili. Se il
file non viene preso in automatico, usare il comando getwd() per conoscere a
quale cartella sta puntando R e assicurarsi che il file si trovi proprio in
quella cartella
read.csv(file="a.txt",header=TRUE) #per importare un file csv ben codifito
#APPLICARE FUNZIONI A OGGETTI R
mat=matrix(0, nrow=3, ncol=4) #crea una matrice di 3 righe e 4 colonne, composta
di soli "0"
mat[1,] = c(1,2,3,4) #riempo la prima riga
mat[2,] = c(4,5,6,7) #riempo la seconda riga
mat[3,] = c(7,8,9,10) #riempo la terza riga
apply(X=mat, MARGIN = 1, FUN = mean) #la funzione apply permette di applicare
una funzione (in questo caso: 'mean') alle righe/colonne di una matrice o
data.frame (in questo caso 1 --> righe)
apply(X=mat, MARGIN = 2, FUN = mean) #media per colonna
mat2=matrix(1:12, nrow=3, ncol=4, byrow=TRUE) #crea una matrice composta dei
numeri da 1 a 12 ordinati per riga (per questo: byrow=TRUE)
lista=list() #crea lista vuota
lista$matrice = mat2
lista$categoriale = rep(c("A","B"),2)
lista$intera = 1:100
lista$continua = seq(0,1,len=10)
lapply(X=lista, FUN=length) #applico la funzione length() alla mia nuova lista.
Il risultato è dato dalla lunghezza delle varie componenti:
$matrice $categoriale $intera $continua
[1] 12 [1] 4 [1] 100 [1] 10
#R permette di definire proprie funzioni. Ogni funzione deve avere nome e
argomenti. La sintassi è: nome.funzione =
function(argomento1,argomento2,...,argomentoN){corpo della funzione}
#RIASSUNTO DISPENSA 5
sample(1:6) #questa funzione genera numeri casuali. In particolare, costruita
così restituisce una permutazione degli elementi passati dentro alla funzione
lotto=sample(1:90,size=5) #se omessi, di default: size=length(x), replace=FALSE
(ossia estrazioni senza reinserimento --> dipendenti) e prob=1/n
set.seed(1) #essendo numeri generati da un algoritmo, sono 'pseudo-casuali',
dunque prevedibili. Per impostare ad uno stato iniziale il generatore di numeri
usiamo questa funzione
sum(lotto==20) #interrogo R sulla presenza del numero '20' all'interno
dell'estrazione
#voglio studiare empiricamente quante volte esce il numero '6' in 20 campioni di
100 lanci di dadi. Per farlo:
campioni=20
lanci=100
successi=vector(len=campioni) #crea il vettore successi di lunghezza pari al
numero di campioni, nel quale verrà inserito, per ogni campione, il numero di
volte che esce '6'
set.seed(12345) #imposto la generazione di numeri casuali
for (i in 1:20){ #per ogni campione da 1 a 20
prove=sample(1:6,lanci,replace=TRUE) #genera 100 lanci con reinserimento
successi[i]=sum(prove==6) #e inserisci nel vettore successi i risultati
}
gruppo=c("A","B","0","AB") #vogliamo calcolare empiricamente la probabilità che
un donatore sia di gruppo AB
n_simu=100000 #campioni
n=20 #estrazioni per campione
prove=sample(gruppo,n*n_simu,replace=TRUE,prob=c(0.4,0.1,0.45,0.05)) #Simuliamo
n_simu volte l'esperimento di estrarre il gruppo sanguigno da n soggetti.
Facciamo ricorso all'argomento prob, essendo i valori attesi associati ai
singoli esiti diversi
prove=matrix(prove,ncol=20,byrow=TRUE) #organizziamo i risultati in una matrice:
ogni riga corrisponde al risultato di un campionamento
job=function(x) sum(x=="AB") #creiamo una funzione che, dato un vettore, conti
quanti elementi sono pari ad "AB"
successi=apply(prove,1,job) #applichiamo la funzione appena creata alle righe
della matrice
sum(successi==0) #conta il numero di campioni in cui il gruppo "AB&