Sei sulla pagina 1di 39

Struttura del corso

1. Introduzione
2. Le basi di dati
3. Le analisi di dati
4. Le presentazioni delle analisi

Perché studiare informatica? Perché l’economia, la nanza d’impresa, la statistica e la nanza dei
mercati richiedono l’utilizzo di sistemi informatici.
Economia e nanza d’impresa → elaborazione di bilanci e scelta tra progetti nanziari
Economia dei mercati → previsioni di variabili economico- nanziarie e prezzaggio di opzioni
Statistica → sintesi dei dati e campionamento

Basi di dati (database relazionali) → elaborazione (excel o programmi R) → risultati (diapositive)

“Storia dell’informatica” e informazioni utili all’apprendimento


Informatica: scienza che ha come oggetto l’informazione per quanto riguarda la sua
acquisizione, elaborazione, memorizzazione, trasmissione e presentazione mediante strumenti
elettronici.

Dati (testi, immagini, numeri, …) → elaborazione (calcolatore) → informazione (dati arricchiti,


che possono venire ulteriormente elaborati).

L’informatica ha una lunga storia alle sue spalle


1. La pascalina (Blaise Pascal, 1642): macchina di calcolo
2. Telaio di Jacquard (Joseph-Marie Jacquard, 1801): primo telaio programmabile grazie alle
bande perforate
3. Macchina analitica (Charles Babbage, 1842): primo computer della storia, con schede
perforate e unità di calcolo.
4. Z1 (Konrad Zuse, 1937): primo calcolatore meccanico
5. Z2 (Konrad Zuse, 1941): primo computer moderno con rappresentazione binaria
6. Colossus (UK 1943): primo calcolatore elettronico basato su valvole e rappresentazione
decimale dei numeri
7. ENIAC (USA 1946): primo calcolatore moderno (serviva per calcolare le traiettorie dei proiettili)
8. Perottina (Olivetti, 1964): primo computer da tavolo programmabile con schede magnetiche
9. IBM 5100: primo vero personal computer con input trasmissibili tramite la tastiera
10. Apple LISA: primo computer con mouse e tastiera

Meccanica -> elettromeccanica -> elettronica

UNITÀ DI MISURA
PREFISSI UTILI
Capacità: Bit (b) → può assumere solo gli stati di 0 e 1 Kilo (K): 1’000
Byte (B) → sequenza composta da 8 bit (es: 10001011) Mega (M): 1’000’000
Giga (G): 1’000’000’000
Velocità di elaborazione: Hertz (Hz) → numero di operazioni al secondo
Tera (T): 1’000’000’000’000
Velocità di trasmissione: Baud (b/s) → numero di bit al secondo
Risoluzione gra ca: Pixel (px) → numero di puntini da cui è composta
l’immagine

TIPI DI COMPUTER MODERNI


• Personal computer (uso personale)
→ tablet
→ nettop (pc da tavolo minimale)
→ netbook (pc portatile minimale)

1
fi
fi
fi
fi
fi
fi
→ notebook
→ desktop

• Workstation (uso professionale)


• Mainframe (gestione di grandi istituzioni
• Supercomputer (centri di ricerca)

Calcolatore moderno
Un calcolatore moderno è uno strumento elettronico in cui i dati sono in formato digitale in
formato binario* e che risolve problemi tramite l’esecuzione di una serie di determinate istruzioni.
Si può scomporre in hardware e software.
*Formato binario: sequenza di 0 e 1, noti come BIT. Fa parte del formato digitale in quanto questo
codi ca tutti gli stati che può assumere un’entità (es: oggetto, immagine, suono, …) utilizzando
numeri a base binaria. Tutti i le sono salvati in questa maniera, soprattutto quelli testuali.
Digitale: “le informazioni sono convertite in un insieme nito e numerabile di casi”

Hardware
Componente sica, contiene tutte le componenti interne (CPU, memoria, scheda madre, …)
connesse tramite BUS e le componenti esterne (mouse, tastiera, ..).
Le principali porte che ha sono: Jack per l’audio, HDMI e VGA per il video, USB per i dati,
Ethernet per la rete e Obsolete per il mouse, la tastiera e la stampante.

Un calcolatore moderno ha un’architettura abbastanza semplice, spiegata dal modello di Von


Neumann, formata da un CPU che comunica reversibilmente con la memoria (anch’essa prevista
nel modello) e che riceve input generando output.
• CPU (central processing unit - processore): prende istruzioni dalla memoria ed esegue
operazioni algebriche, logiche e di scrittura. Utilizza i registri per immagazzinare
temporaneamente le informazioni. È formato da CU (control unit, che legge memoria ed
esegue), ALU (unità logica e aritmetica, che esegue operazioni) e registri, ovvero delle locazioni
di memoria molto veloci.
Se due CPU sono integrate nello stesso microchip si parla di processore “dual core”, se sono
quattro di processore “quad code”.
Un calcolatore con architettura a 64 bit ha una CPU i cui registri contengono 64 bit.
• Input e output: tramite mouse, tastiera, schermo, hard disk, …
• Tastiera/schermo/mouse: interazione utente-macchina
• Cd/dvd drive: lettura dischi
• Stampante
• Modem/router: collegamento ad internet e alla rete
• Hard disk: unità di memoria di massa, suddiviso in le (aggregato di dati) e directory
(contenitore in cui sono immagazzinati i dati). Grazie a dei permessi RWX l’utente può
rispettivamente leggere, scrivere ed eseguire.
• BUS: consente la trasmissione di dati da un’unità all’altra
• Memoria: componenti per la memorizzazione dei dati, si suddivide in RAM e ROM.
Memoria RAM: è una memoria volatile che archivia temporaneamente i le su cui si sta
lavorando
Memoria ROM: è una memoria non volatile che archivia i le in maniera permanente
• Scheda madre: circuito stampato che gestisce la comunicazione tra le componenti
• GPU (schede gra che): coprocessore ad alto numero di core che svolge operazioni gra che e
calcoli matematici.

2
fi
fi
fi
fi
fi
fi
fi
fi
fi
Tutto ciò è basato sul principio di “quantum computing”, che poggia sull’idea di sovrapposizione
di stati, che consente l’esecuzione di operazioni in parallelo che riducono il tempo di calcolo.

Software
Insieme di procedure nalizzate al funzionamento dell’hardware, ed è composto da sistema
operativo, Firmware e programmi applicativi.
Le fasi fondamentali del suo sviluppo sono: ideazione algoritmo per la risoluzione di un
problema, rappresentazione con diagramma di usso e implementazione tramite linguaggio di
programmazione.

Ricorda che il costruttore di computer si occupa di componenti siche, rmware e driver, mentre il
sistema operativo e gli applicativi sono compito di altre imprese (tranne Apple che produce tutto).
• Firmware: programmi inclusi direttamente nei componenti dell’hardware, che periodicamente
vengono aggiornati dalla casa madre. Un esempio di rmware è bios, il programma di
funzionamento della scheda madre.
• Programmi applicativi: programmi che utilizzano quanto messo a disposizione dal sistema
operativo per risolvere un determinato problema. Molti programmi applicativi vengono creati per
un apposito sistema operativo, e perciò bisogna installare dei “driver” (come per esempio la
Java virtual machine) che permettono un dialogo tra una periferica e il sistema operativo.
• Sistema operativo: consente di eseguire le operazioni di base del calcolatore, come la lettura e
la scrittura periferica. I suoi compiti sono dunque quello di: gestire l’hardware, allocare le risorse
per programmi in esecuzione tramite processi e archiviare tutto sulla memoria secondaria
tramite il lesystem.
Processo attivo: programma (visibile o in background) in esecuzione sulla CPU, caricato sulla
memoria RAM all’avvio del computer (in caso non ci sia più spazio questo tramite uno swap su
disco si sposta sull’hard disk).
Filesystem: insieme di programmi (di molte tipologie) volti alla gestione della memoria di massa di
le e directory.
Un sistema operativo può essere:
1) Multi utente → accesso contemporaneo da parte di diversi utenti alla stessa macchina
2) Multi tasking → utilizzo contemporaneo da parte di diversi programmi della CPU

ESEMPI DI SISTEMI OPERATIVI


1. MS-DOS: È stato il primo sistema operativo, è composto da una sola interfaccia testuale
utilizzabile tramite dei comandi ed è di tipo mono utente e mono tasking.
2. WINDOWS: È una famiglia di sistemi operativi prodotti da microsoft, nasce dall’evoluzione di
MS-DOS a cui vengono aggiunti il multi tasking e la multi utenza.
3. WINDOWS CONSOLE: Nelle versioni nuove di microsoft è presente una console* che propone
di e ettuare alcune operazioni tramite i comandi testuali di MS-DOS, in quanto ritenuti più
comodi poiché salvabili in un unico le di testo (batch le) eseguibile sequenzialmente.
*console/terminale: strumento software che consente di interagire col sistema operativo tramite
comandi testuali.
4. UNIX: Sistema operativo multi utente e multi tasking inizialmente studiato per le università.
5. GNU/LINUX: Sistema operativo competo di interfaccia gra ca e compilatori. È un software
libero in quanto chiunque può usarlo per il proprio scopo personale; in questo caso difatti è
stato copiato su diverse distribuzioni (es: android).
Software libero ≠ software proprietario
6. MAC OS X: È il sistema operativo di Apple, e ne esiste una versione per iPhone e iPad nota
come iOS. È instancabile solo su hardware Apple.

3
fi
ff
fi
fi
fi
fl
fi
fi
fi
fi
fi
Memorizzazione dati
Ogni conformazione viene sempre registrata dal computer come termini binari: una sequenza di n
bit permette di mappare un insieme di 2n combinazioni possibili (elementi), leggibili tramite le varie
convenzioni mappatura (es: ASCII*, ASCII esteso, ..).
*il codice ASCII non é ovviamente l’unico metodo per mappare i termini binari, in quanto esistono
anche altre convenzioni, come gli Unicode.
Bisogna ricordare che questo avviene solo per i le di testo, e non per esempio per i pdf, che può
essere letto solo tramite l’utilizzo di un software in grado di estrarre dalla sequenza di bit delle
informazioni.
→ scrittura del testo → salvataggio tramite convenzione (encoding) → memorizzazione sul disco
(ogni carattere equivale ad una sequenza binaria di 8 bit) → ispezione esadecimale (le sequenze
vengono compattate).

Convenzioni di mappatura: tabelle che associano le sequenze di bit a un carattere speci co.
Questo non avviene però per i numeri da calcolo perché non è ottimale.
Rappresentazione di informazioni numeriche: dato che non esiste una mappatura per questo,
una quantità è rappresentabile tramite un sistema di numerazione, suddiviso in metodi non
posizionali (la posizione del simbolo non indica un diverso valore, come i numeri romani) e metodi
posizionali (la posizione del simbolo implica un diverso valore, come i numeri decimali arabi
oppure la rappresentazione binaria).
NB: è possibile che spesso i numeri nella codi cazione vengano scritti in base binaria → 219 in
base 10, n=3 (2 x 102 + 1 x 101 + 9 x 100)

I decimali vengono rappresentati con una virgola mobile, ovvero con il oating point, che serve
per rappresentare con pochi bit un alto numero di cifre negative e positive (S=1 segno negativo,
S=0 segno positivo).
Valore decimale = -1S x Mantissa x Baseesponente (forma normalizzata con primo numero decimale
diverso da zero)
Il salvataggio su disco richiede quindi la memorizzazione di Segno, Mantissa ed esponente (la
base invece è sempre 2).
In base alla precisone che si sceglie, i calcoli hanno una sensibilità maggiore: la precisione oat (7
cifre decimali) richiede 32 bit, la precisone double (15 cifre decimali) richiede 64 bit.

L’ALGEBRA DI BOOLE
L’algebra di Boole aveva come scopo la matematizzazione della logica umana, ed è alla base
della rappresentazione binaria in quanto codi cava tutto secondo la condizione di vero (1) e falso
(0). Da qui nasce la funzione booleana dei computer.

Operazioni e programmazione del processore (programmare = Coding)


Coding = scrivere un codice sorgente secondo le regole sintattiche del linguaggio di
programmazione scelto, per poi sottoporlo (sulla base del tipo di linguaggio) a un compilatore/
interprete/pseudo-compilatore.

Un processore è dotato di un “instruction set” che costituisce l’insieme di operazioni che può
eseguire, codi cate dal produttore nel linguaggio macchina (sequenze binarie) programmato
secondo l’architettura del processore. Esistono tanti linguaggi quante le architetture del
processore.
Questi linguaggi sono spesso associati ad un linguaggio assembly* del processore (più intuitivo),
convertiti in codice binario da un programma assembler. Se si tratta di linguaggi ad alto livello
(come il C, il Fortran e il Java, più simili al linguaggio umano), il programma che li converte si
chiama compilatore o interprete. Questi linguaggi producono quindi dei codici binari eseguibili
solo sul, tipo di piattaforma su cui é stato compilato.

4
fi
fi
fi
fi
fl
fi
fl
*Linguaggio assembly: insieme di istituzioni fornite dal costruttore del processore per operarne il
controllo.

L’utente scrive un testo (codice sorgente*) assembly, C, … e lo trasforma in codice binario tramite
un programma apposito assembler, compilatore, … (dato che il computer accetta solo il
linguaggio macchina binario), creando un nuovo le binario “eseguibile”.
*il codice sorgente è un algoritmo risolutivo tradotto in linguaggio macchina da un compilatore. È
quindi un insieme di istruzioni.
*un compilatore é un software che trasforma uno o più codici sorgenti in codice binario

Un algoritmo è costituito da una sequenza di semplici istruzioni e serve alla risoluzione di un


problema. Questo è rappresentabile tramite dei diagrammi di usso, costituiti da un insieme di
forme (i blocchi) collegati sequenzialmente da frecce, ciascuna associata a determinate azioni. Un
diagramma di usso é quindi la rappresentazione gra ca delle istruzioni previste da un algoritmo.
Es: Rombo = blocchi di decisione
Ovale = blocchi di inizio/ ne algoritmo
Parallelepipedo obliquo = blocchi di lettura e scrittura
Rettangolo = blocchi di elaborazione

Linguaggi di programmazione
Un linguaggio di programmazione è uno strumento che consente all’utente di far eseguire una
serie di compiti al calcolatore, ed è composto da un insieme di parole chiave e delle regole di
sintassi, che determinano come devono essere concatenate le parole chiave nelle istruzioni.
L’implementazione costituisce la codi ca di un certo linguaggio di programmazione in algoritmo.
Problema → identi cazione/realizzazione dell’algoritmo → formalizzazione tramite diagramma di
usso → implementazione dell’algoritmo tramite uno speci co linguaggio di programmazione.

Comandi importanti nei linguaggi di programmazione


• OR: restituisce VERO se almeno uno dei due termini é VERO
• AND: restituisce VERO se entrami i termini sono VERI

Strumenti di analisi
Le analisi dei dati sono condotte utilizzando uno o più strumenti in maniera strategica. Ci sono
quindi i linguaggi compilati, i linguaggi interpretati e i fogli di calcolo che comunicano tra loro
informazioni ricevute dal database.

CATEGORIE
Linguaggi compilati (es: Fortran)
Il codice sorgente viene compilato (tradotto in codice binario) per poter essere seguito ogni volta
senza l’ausilio di altri strumenti. È molto e ciente e veloce, anche se necessita di essere
ricompilato per essere eseguito su altre piattaforme. Non è troppo comodo in quanto ha una lenta
curva di apprendimento, ha una sintassi complessa e manca di interazione.
↳ codi ca → compilazione → esecuzione → correzione → ricompilazione → esecuzione → ..
Linguaggi interpretati
Il codice sorgente viene tradotto (interpretato) ogni volta che deve essere eseguito, tramite un
interprete (elemento che se presente permette di eseguire il codice sorgente su tutte le
piattaforme). Questo tipo di linguaggio non è quindi autosu ciente, ed è più lento rispetto a
quello compilato, malgrado abbia una curva di apprendimento più rapida e la possibilità di
interazione. Il suo vantaggio é che ha un utilizzo interattivo dell’interprete.
↳ l’utente che riceve il sorgente deve possedere anche l’interprete.
↳ scrittura di parte del codice e suo test interattivo → correzione → aggiunta di nuovo codice →
test → …
↳ R É UN LINGUAGGIO INTERPRETATO

5
fl
fi
fl
fi
fi
fi
ffi
fi
fi
fi
ffi
fl
Linguaggi pseudo-compilati
Questa tipologia di linguaggio presenta un compromesso tra linguaggio compilato e
linguaggio interpretato.
Il codice sorgente viene compilato in un bytecode* intermedio tra l’utente e il codice binario ogni
volta che il programma viene lanciato. Il suo obiettivo è quello di renderlo compatibile con il
maggior numero possibile di piattaforme (che devono possedere tutte una virtual machine) e di
rendere veloce il passaggio bytecode-codice macchina.
↳ codice compilato intermedio bytecode → viene eseguito da una virtual machine → questa
compila ogni volta il bytecode
Molto spesso questa tecnica è in realtà utilizzata anche dagli altri linguaggi: i compilati possono
anche compilare un bytecode intermedio (es: Java), e gli interpretati possono produrre bytecode
intermedi (es: R, Phyton).
*bytecode: un le che contiene un codice sorgente trasformato in un formato intermedio
Linguaggi di scripting
I linguaggi di scripting comprendono quelli puramente interpretati e quelli che consentono un’alta
interazione (e che eventualmente possono produrre bytecode). Sono molto rapidi, motivo per il
quale vengono spesso preferiti ai linguaggi compilati in quanto rapidamente si portano a termine
progetti utilizzando poche risorse.
Ognuno di questi ha una nalità di erente, che spazia dallo sviluppo web (javascript) al calcolo
scienti co (gauss, S).

CLASSI
Linguaggi imperativi procedurali
Il codice è suddiviso in blocchi di codice, che si suddividono in procedure e funzioni, richiamabili
più volte. Le procedure agiscono modi cando dei dati che risiedono nella memoria, inserendoli
nell’unità di memoria soggetta a sovrascrittura (variabile). Permettono la riutilizzabilità del codice.
Linguaggi imperativi a oggetti
In aggiunta a procedure e funzioni, l’utente può creare anche delle classi, chiamate “oggetti”,
ovvero un nuovo tipo di dato che racchiude all’interno molti “dati membro della classe” e molte
funzioni “metodi” che gli elaborano. Si tratta quindi di una serie di oggetti tra loro interrelati.
Linguaggi funzionali
Questi sono i più sicuri in quanto non modi cano il contenuto della memoria, dato che operano in
cloud. Le funzioni possono essere in questo caso trattate come dati, quindi accettano input e
restituiscono output modi cati (dati e funzioni).
Linguaggi per calcolo scienti co
Nell’ambito delle scienze i linguaggi più importanti sono:
Il Fortran, nato appositamente per i calcoli, con sintassi grezza, compilatore
Il C (e C++), più generico, compilatore
Il Gauss, per l’econometria, non comunicativo, di scripting
Il Matlab, l’evoluzione del Gauss, per l’ingegneria, di scripting
l’R, per la statistica, di scripting
Il Make, che esegue le azioni elencate dall’utente in un make le che contiene una rete di target e
dipendenze, eseguendo una ricompilazione selettiva dei sorgenti modi cati.
Nel calcolo scienti co è importante sapere implementare linguaggi di scripting e compilatori, e
saper applicare il paradigma a oggetti diversi attraverso un linguaggio object-oriented. Di base
però quello che si utilizza di più è il linguaggio di scripting, perché:
• È più immediato
• Ha una copertura ampia nell’ambito scienti co
• Integra codici compilati
• Interagisce
• Integra fogli di calcolo

6
fi
fi
fi
fi
fi
fi
ff
fi
fi
fi
fi
fi
Il linguaggio “R”
Storia
Nasce attorno al 1975-1976 con il nome di “linguaggio S” (nasce da linguaggio S e linguaggio
Scheme), con l’idea che fosse più interattivo rispetto al Fortran. Nel tempo di evolve, diventando
un linguaggio di scripting per le applicazioni statistiche, facile da usare per via della sua linea di
comando e dell’eseguibilità di le di testo con comandi.

Caratteristiche
Si struttura in core (funzionalità di base preinstallate) e pacchetti (estensioni di funzionalità a
svariati campi). Può essere utilizzato da un terminale, tramite Rstudio (un editor integrato) o nella
propria interfaccia gra ca.
È open-source (non protetto da copyright e facilmente modi cabile) e freeware (gratuito), ed è
disponibile per svariate piattaforme.
I suoi principali utilizzi sono: la statistica, l’econometria, le scienze sociali, le scienze, l’economia e
la nanza, tutti gestiti dalla sua capacità di dialogare con strumenti esterni come excel e codici
nativi.

7
fi
fi
fi
fi
Gestione di Rstudio
-Console di R (dove scrivi) -Environment (dove vengono elencati gli oggetti)
-Console di R (risultati) -Files presenti nel disco (es: per aprirli)

Il le di lavoro si chiama “codice sorgente”, e ne puoi aprire diversi nello stesso momento.

Metodi di interazione con R:


1. Imputazione di prompt → comandi eseguiti immediatamente
2. Processo di script → costruzione di un le testo che viene poi caricato ed eseguito
completamente → source(“nome le”)

Informazioni importanti
• In R le maiuscole e le minuscole hanno valori di erenti (non mischiarle!) → R É CASE SENSITIVE
• Le singole istruzioni vengono separate dall’andare a capo oppure da un punto e virgola
• Gli oggetti vengono separati da una virgola, da uno spazio, da un punto e virgola o da una
tabulazione.

Comandi importanti
Ctrl + S Salva il lavoro

Ctrl + Enter Esegui ciò che é evidenziato (equivale al “run”)

\n Andare a capo (se lo metti per esempio in qualcosa che ti deve far vedere
i risultati, te li mette tutti uno a capo all’altro)
\t Tabulazione (se lo metti per esempio in qualcosa che ti deve far vedere i
risultati, te li mette tutti uno distanti dall’altro di una tabulazione)

Impostare working directory


La working directory é il punto in cui Rstudio salva il le di lavoro, quindi la directory in cui R legge
e scrive se l’utente non speci ca in quale directory lavorare.
Il workspace é la memoria di lavoro in cui R salva gli oggetti creati dall’utente.

setwd(‘M:/‘) Salva il le nel disco M (il nostro spazio di lavoro)

getwd() Ti dice in che disco si trova il le

Gestione workspace
Il workspace é l’area in cui R memorizza gli oggetti che vengono salvati

ls() Avere la lista degli oggetti salvati

rm(nomeoggetto) Cancella l’oggetto inserito tra le parentesi

rm(list = ls()) Cancella tutti gli oggetti

save(list = ls(all=TRUE), le = Salvare sul disco la lista di tutti gli oggetti in un le


“nome le.RData”)

1
fi
fi
fi
fi
fi
fi
fi
fi
ff
fi
fi
save(list = c(‘nomeoggetto1’, Salvare sul disco uno o più oggetti in un le
‘nomeoggetto2’), le = “nome le.RData”)
load(“nome le.RData”) Carica nella workspace tutti gli oggetti che sono
stati salvati nel le

Oggetti scalari
Gli oggetti che si possono creare in Rstudio sono: numeri, valori logici (true/false), stringhe (parole
o frasi racchiuse in virgolette semplici o doppie) o valori speciali (es: NA)

I modi (o tipi) in R sono il tipo di contenuto che i vari oggetti possono inglobare: numeri, stringhe,
logici, numeri complessi e valori mancanti (NA).

nomeoggetto <- oggetto Associa un oggetto ad un nome


Es: numero <- 10.2
Es: saluto <- “ciao” (ricorda le virgolette per le frasi)
Es: dato mancante <- NA (not available)
print(nomeoggetto) Visualizzare a schermo gli elementi dentro all’oggetto

cat(‘frase \n ’, ‘valore1 ’, valore2, ’) Associa alla frase la relazione: “valore1 : valore2”

Operazioni con scalari


OPERAZIONI ARITMETICHE: Rstudio può essere usato come calcolatrice scienti ca
Poniamo che a e b siano due numeri reali, quindi che:
a <- 10
b <- 20
Nb: questo lo si può fare anche inserendo direttamente i numeri senza assegnare loro un nome
Nb: per incatenare più operazioni basta usare le parentesi

a+b Somma

a-b Sottrazione

a*b Moltiplicazione

a/b Divisione

a^b Elevato

sqrt (a) Radice quadrata

abs(a) Valore assoluto

exp(a) Esponenziale

log(a) Logaritmo naturale

sin(a) Funzioni trigonometriche

y = funzione Scrivere funzione (con l’ausilio delle parentesi) e


Print(y) poi visualizzarne il risultato

2
fi
fi
fi
fi
fi
fi
nomefunzione <-function(capitale, interesse, Capitalizzazione composta
tempo) {capitale * (1+interesse)^tempo}

→ nomefunzione(valorecapitale, Per le funzioni con più variabili devi inserire tutti i


valoreinteresse, valoretempo) valori delle variabili

Vettori
I vettori sono degli insiemi di valori dello stesso tipo (numeri, testi, valori booleani (true/false), …),
dentro ai quali ci possono essere che dei valori non conosciuti di tipo NA.

nomevettore <- c(elemento1, elemento2, … ) Creazione di un vettore


Nb: si può creare sia con degli oggetti già
salvati che con dei nuovi oggetti (ricorda, per le
frasi vanno messe le virgolette)

I vettori numerici possono essere di vari tipi: composizione manuale, valore costante e sequenza
progressiva.
nomevettore <- c(numero1, numero2, …) Composizione manuale immettendo tutti i
valori che vogliamo
nomevettore <- array(data = n, dim = d) Valore costante: ripetono lo stesso valore “n”
un numero di volte pari a “d”
nomevettore <- rep(x = n, d)
nomevettore <- seq(from = a, to = b, by = c) Una sequenza crescente o decrescente che
parte da “a” e termina a “b” con un incremento
costante pari a “c”. Se la sequenza dev’essere
decrescente, il numero “c” avrà un valore
negativo.

nomevettore <- a:b Quando l’incremento “c” equivale a 1, si può


usare questo comodo comando. Non bisogna
esplicitare il segno perché il comando capirà
da solo se é una sequenza crescente o
decrescente.

Possono anche generare dei numeri casuali, che possono avere diverse proprietà.
Distribuzione normale
nomevettore <- rnorm(n = a, mean = b, sd = c) Crea un vettore che genera “a” numeri presi
più frequentemente vicino alla media “b” e
meno frequentemente vicino al grado di
dispersione “c”.
Minore é il parametro del grado di
dispersione e più frequentemente i valori
saranno presi vicini alla media.
Distribuzione uniforme
nomevettore <- runif(n = a, min = b, max = c) Crea un vettore che genera “a” numeri presi
entro gli estremi “b” e “c”
hist(nomevettore) Crea un gra co in cui si possono
visualizzare tutti i valori

3
fi
print(nomevettore[d:f]) Visualizza solo i valori compresi tra “d” e “f”.
Te li mette in ordine crescente o
decrescente a dipendenza di quale si mette
per primo.
Ricorda: d e f non sono due valori, sono il
numero di valori che si vuole visualizzare
(es: visualizza dal terzo al settimo valore).
nomevettore <- round(x = nomevettore, digits = n) Arrotonda i decimali all’ennesimo numero
dopo la virgola.

PORZIONI DI VETTORI
Poniamo di avere un vettore numerico a composizione manuale che presenta più valori
nomevettore[n] Fa visualizzare solo l’n termine
(Es: n = 3, si visualizza solo il terzo valore che
viene inserito dentro al vettore)
nomevettore[n:p] Fa visualizzare i termini compresi tra “n” e “p”.
Ricorda: n e p non sono due valori, sono il
numero di tali.
(Es: n = 3, p = 5, si visualizzano il terzo
termine, il quarto termine e il quinto termine)
nomevettore[c(n,p,q)] Fa visualizzare termini disgiunti.
(Es: n = 3, p = 5, q = 8, si visualizzano il terzo
termine, il quinto termine e l’ottavo termine)
nomevettore[-n] Fa visualizzare tutti i termini tranne l’ennesimo

nomevettore[-c(n,p)] Fa visualizzare tutti i termini tranne alcuni


disgiunti
nomevettore[n] <- f Cambia l’ennesimo termine in modo che il
valore f sostituisca il valore precedente
nomevettore[c(n,p)] <- c(f,e) Cambia i termini “n” e “p” in modo che i valori f
ed e sostituiscano quelli precedenti
nomevettore <- nomevettore[n:p] Accorcia il vettore in modo che sia solo
compreso tra il termine n e il termine p
nomevettore[c(1, length(nomevettore))] Restituisce il primo e l’ultimo elemento del
vettore

LUNGHEZZA VETTORE
lenght(nomevettore) Visualizza quanti elementi ha (lunghezza
vettore)
nomevettore[lenght(nomevettore)] Visualizza l’ultimo elemento del vettore

CONCATENAZIONE DI VALORI
Poniamo di avere due vettori e di voler concatenare i loro elementi
nomevettorede nitivo <- c(nomevettore1, nomevettore2) Concatena i risultati dei due vettori
in modo che vengano visualizzati
Usare sia “c” che “cat” prima quelli del primo vettore e in
seguito quelli del secondo

4
fi
OPERAZIONI CON VETTORI
Per eseguirli non devono esserci valori mancanti, se no il risultato sarà sempre NA
mean(nomevettore) Media dei valori contenuti nel vettore

min(nomevettore) Indica il valore minimo contenuto nel vettore

max(nomevettore) Indica il valore massimo contenuto nel vettore

mean(nomevettore, na.rm = TRUE) Media dei valori contenuti nel vettore in modo
che vengano eliminati i valori mancanti
min(nomevettore, na.rm = TRUE) Indica il valore minimo contenuto nel vettore in
modo che vengano eliminati i valori mancanti
max(nomevettore, na.rm = TRUE) Indica il valore massimo contenuto nel vettore
in modo che vengano eliminati i valori
mancanti
log(nomevettore) Calcola il logaritmo naturale per ogni elemento
(Si può fare con ogni funzione scienti ca: exp,
sqrt, …)

Quando due vettori hanno la stessa lunghezza, si possono eseguire anche operazioni aritmetiche.
In caso questi non abbiano la stessa lunghezza, quello più corto viene esteso iniziando di nuovo
la sequenza partendo dal primo termine.
nomevettore1 + n Somma a tutti gli elementi del vettore il
numero “n”
nomevettore1 + nomevettore2 Somma i valori dei due vettori
(l’ennesimo termine di uno con
l’ennesimo termine dell’altro)
esempio: nomevettore1 - mean(nomevettore2) Si possono fare anche calcoli molto più
esempio: nomevettore2 /max (nomevettore1) complessi a piacimento

Un factor è un vettore i cui elementi assumono un numero ben distinto e nito di modalità, le
quali possono eventualmente mantenere fra essere una relazione ordinale. La loro intrinseca
natura li associa a dati nominali sconnessi contenuti nelle liste (x <- factor(c(nomelista)) e ordinati
(x <- ordered(c(nomelista)).

Matrici
Sono formate solo da numeri, ordinati su righe e colonne.
nomematrice <- matrix(data, nrow = … , ncol = Creazione di una matrice
…, byrow = TRUE/FALSE nrow = numero di righe
ncol = numero di colonne
byrow = ordine con cui viene riempita la
matrice (di default prima la prima colonna, poi
la seconda, …)

x [i, j] Seleziona l’elemento alla riga i e colonna j

x [, j] Seleziona tutta la colonna j


x [i, ] seleziona tutta la riga i;

x [c(h,k),] seleziona le righe h e k;

5
fi
fi
x [h:k,] seleziona le righe da h a k.

OPERAZIONI CON MATRICI


Per eseguirli non devono esserci valori mancanti, se no il risultato sarà sempre NA
x+y Addizione
x-y Sottrazione
x*y Moltiplicazione
x/y Divisione
x%*%y Prodotto matriciale
t(x) Trasposizione
solve(x) Inversione
det(x) Determinante

Liste e data frame


Una lista é un oggetto i cui elementi, che possono essere di tipologia diversa tra loro, hanno
ciascuno un nome.

Creazione di una lista


nomelista <- list(elemento1, elemento2, …) Gli elementi non devono per forza esistere,
però solitamente gli si nomina durante la
nomelista <- list(nomelemento1 = elemento1, creazione.
nomelemento2 = elemento2, … ) Quando una lista contiene un’altra lista, la si
crea direttamente all’interno della prima.
nomelista$nomelemento Estrarre un elemento dalla lista

nomelista[[‘nomelemento’]]
nomelista$nomenuovoelemento <- elemento Aggiunge nuovo elemento alla lista

nomelista$sezione <- list(nomelementonuovo1 Aggiunge gli elementi nuovi alla lista in modo
= elementonuovo1, nomelementonuovo2 = che questi siano sotto una nuova sezione
elementonuovo2, …)
Sono visualizzabili sempre con il nome della
lista
nomelista$sezione$nomelemento <- NULL Elimina l’elemento dalla lista

TRASFORMAZIONE DI UNA LISTA IN UN VETTORE


Se gli oggetti sono dello stesso tipo scalare, é possibile trasformare la lista in un vettore
nomevettore <- unlist(nomelista) Creazione di un vettore partendo dalla lista
In caso ci serva una sezione particolare
bisogna inserire anche “$sezione”

mean(unlist(nomelista)) É utile per esempio per calcolare la media dei


valori contenuti nella lista

Data frame: liste in cui gli elementi sono dei vettori della stessa lunghezza e i cui nomi
costituiscono i nomi delle colonne.

6
In un data frame ogni colonna deve avere avere valori dello stesso tipo e ciascuna colonna può
assumere tipi di dato di erenti dalle altre.
È possibile evitare di digitare la radice dell’oggetto tramite il comando attach(nomedataframe). In
modo diverso, opera il comando detach.
Ogni riga del data frame coincide spesso con una unità statistica e, in quanto tale, può essere
associata ad un nome: si usa il comando rownames. Il comando colnames permette di ride nire i
nomi delle colonne del data frame.

nomelista <- data.frame(nomelemento1 = Supponiamo di avere dei settori che


nomevettore1, nomelemento2 = nomevettore2, …) trattano tutti lo stesso argomento: ha senso
raggrupparli in un’unica lista
NB: i vettori possono essere creati anche subito:
Il risultato sarà la creazione di una matrice
nomelista <- data.frame( in cui sono raggruppati tutti i dati
nomevettore1 = c(elemento 1, …)
nomevettore2 = c(elemento 2, …)
nomevettore3 = c(elemento 3, …)
)
nomelista[n, c(nomelemento1, nomelemento2) Questo comando serve per estrarre delle
informazioni sull’ennesimo termine

nomelista <- data.frame(nomelemento1 = Inserendo l’ennesimo vettore che voglio


nomevettore1, nomelemento2 = nomevettore2, …, inserire nella matrice con il comando row
row.names = nomevettoren) names sarò facilitata a cercare l’elemento
desiderato, in quanto (ponendo che “m” sia
un valore contenuto nel vettore
“nomevettoren”:
nomelista[’n’,] → fa visualizzare tutto ciò ch
é collegato a questo elemento

nomelista$nomevettoren Fa visualizzare tutti gli elementi del vettore n

nomelista[,’nomevettoren’] Fa visualizzare tutti gli elementi del vettore n

nomelista[,f] Fa visualizzare tutti gli elementi del vettore n in base al


numero di colonna (f) in cui sono visualizzati nella matrice
nomelista(‘nomeoggetto’) Estrae un elemento dalla lista

nomelista[n, ‘nomelemento’] Estrarre la colonna “nomelemento” per la riga n

OPERAZIONI CON LISTE


Per eseguirli non devono esserci valori mancanti, se no il risultato sarà sempre NA
mean(nomelista) Media dei valori contenuti nella lista

min(nomelista) Indica il valore minimo contenuto nella lista

max(nomelista) Indica il valore massimo contenuto nella lista

mean(nomelista, na.rm = TRUE) Media dei valori contenuti nella lista in modo
che vengano eliminati i valori mancanti
min(nomelista, na.rm = TRUE) Indica il valore minimo contenuto nella lista in
modo che vengano eliminati i valori mancanti
max(nomelista, na.rm = TRUE) Indica il valore massimo contenuto nella lista in
modo che vengano eliminati i valori mancanti

7
ff
fi
Strutture di controllo e operatori logici
OPERATORI DI CONFRONTO
1. a scalare e b scalare (scalare booleano)
2. a vettore e b vettore (vettore booleano)
3. a scalare e b vettore (vettore booleano)
4. a vettore e b scalare (vettore booleano)

a == b a é uguale a b

a != b a é diverso da b

a>b a é maggiore di b

a<b a é minore di b

a >= b a é maggiore o uguale a b

a <= b a é minore o uguale a b


I risultati che si ottengono sono quindi TRUE se il confronto é vero e FALSE se il confronto é falso.

Confronto tra scalari


x <- 2; y <- 2; z <- 3 Quando si stamperà il risultato di
nomerisultato <- x == y (o altre operazioni) “nomerisultato” si otterrà o TRUE o FALSE
Confronto tra vettore e scalare
voti <- c(6.5, 4.5, 5, 7, 8.5) Il vettore “voti” viene comparato con il
promossi <- voti >= 6 numero 6 tramite l’operatore di confronto
Print(promossi) “>=“. Quando la comparazione é giusta il
## TRUE FALSE FALSE TRUE TRUE risultato nella lista sarà TRUE, se no FALSE
Confronto tra vettori
nomevettore1 <- c(elemento1.1, elemento1.2, ..) Quando si stamperà il risultato farà il
nomevettore2 <- c(elemento2.1, elemento2.2, ..) paragone tra gli elementi dei due vettori
nomevettore1 > nomevettore2 (elemento1.1 con elemento 2.1, …)

OPERATORI LOGICI
Si basano sui valori booleani, che possono assumere le con gurazioni TRUE e FALSE.
AND: restituisce TRUE se tutti i termini sono TRUE
OR: restituisce TRUE se almeno uno dei termini é TRUE
NOT: converte TRUE in FALSE e viceversa

In caso di vettori e scalari i simboli cambiano


Scalari Esempio:
AND: && voto <- 9
OR: || promosso_con_riserva <- (voto >= 5) && (voto < 6)
NOT: ! print(promosso_con_riserva): FALSE
Vettori Esempio:
AND: & voti <- c(6.5, 4.5, 5, 7, 8.5)
OR: | promosso_con_riserva <- (voti >= 5) & (voti < 6)
NOT: ! ## FALSE FALSE TRUE FALSE FALSE TRUE

STRUTTURE DI CONTROLLO
Speci cano l’ordine e la ripetitività delle istruzioni, e sono necessarie se si vogliono creare
programmi complessi e articolati.

8
fi
fi
- Ciclo For
Ciclo con indice su vettore Fa in modo che la variabile i, che assume valori
nomevettore <- c(elemento1, elemento2, …) interi a partire da quello indicato (in questo
for(i in 1:lenght)){ caso l’1), una volta stampato il vettore indichi
cat(‘nomevettore[‘,i,’] = ‘, nomevettore[i], ‘\n’) un numero in relazione alla posizione
} dell’elemento dentro al vettore
Es:
## nomevettore[7] = elemento7
Ciclo su elementi di vettore In questo caso la variabile v assume a turno il
nomevettore <- c(elemento1, elemento2, …) valore di ciascun elemento dal primo all’ultimo,
for(v in nomevettore){ in modo che si possa calcolare più
cat(‘v = ‘, v, ‘\t’, v >= xo, ‘\n’) velocemente la relazione tra v e xo decisa
}
Ciclo su elementi di lista Questo comando concatena un comando
nomelista <- list(elemento1, elemento2, …) (come per esempio la media) agli elementi
For(elementox in nomelista){ selezionati della lista
cat(‘nomeazione’, elementox, ‘ operatore ’,
comando, ‘\n’)
}

- Esecuzione condizionata
Si usa per scegliere se eseguire o meno una porzione di codice a seguito di un risultato logico
TRUE/FALSE.
IF: SE CIÒ CHE LO SEGUE É VERO, LUI ESEGUE
Esempio:
Studente <- list(matr=123, voti=c(6.5, 7.5, 9)) In questo caso stampando ‘studente’ non
media <- mean(studente$voti) uscirà fuori il commento. Se però la sua media
if(media >= 9){ fosse veramente sopra o uguale al nove, allora
studente$commento <- ‘studente eccellente’ } uscirebbe anche il commento.

IF ELSE: SE CIÒ CHE SEGUE IF É VERO, LUI ESEGUIRÀ QUELLO, SE É FALSO ESEGUIRÀ QUELLO
DOPO ELSE
Esempio:
Studente <- list(matr=123, voti=c(6.5, 7.5, 9)) In questo caso stampando ‘studente’ non
media <- mean(studente$voti) uscirà il commento ‘studente eccellente’ in
if(media >= 9){ quanto la media non é del 9. Il comando
studente$commento <- ‘studente eccellente’ eseguirà quindi ciò che si trova dolo ‘else’,
} else { stampando ‘studente non eccellente’.
studente$commento <- ‘studente non eccellente’ }

ELSE IF
Se “if” viene veri cato, gli “else” ed “else if” successivi vengono
saltati.
Se “if” non viene veri cato, allora si passa a controllare se il
successivo “else if” possa essere veri cato.
Se “else if” é veri cato allora viene eseguito lui e i seguenti
passaggi vengono cancellati.
Se “else if” non é veri cato si passa al successivo blocco “else”.
IF → ELSE IF → ELSE
Nb: questi termini devono stare sempre sulla riga della parentesi
gra a che ha chiuso il comando precedente. Di anco a loro
vengono aperte le parentesi gra e che contengono i comandi
per i quali valgono le loro condizioni.

9
ff
fi
fi
fi
fi
ff
fi
fi
- Ciclo condizionato
È un ciclo iterativo che viene ripetuto nché un’a ermazione é falsa. Usa il comando “while”.
Esempio:
n <- 0; N <- 5 In questo caso il ciclo viene ripetuto no a
while(n <= N){ quando n é minore/uguale a 5. Quando termina
cat(’n = ‘, n, ‘\n’) il ciclo, Rstudio passa ad eseguire ciò che c’é
N <- n + 1 scritto nella riga successiva.
}
## ciclo terminato n = 6

- Uscita anticipata da ciclo


next: passa all’iterazione successiva
break: esce completamente dal ciclo iterativo
Esempio:
for(i in 1:10){ In questo caso il ciclo salta la stampa del
if(i == 5) next numero i = 5 e termina dopo aver stampati i = 7
cat(i, ‘\n’)
If(i == 7) break
}

Funzioni
Un oggetto di tipo funzione in R consente di riutilizzare il codice, richiamando la funzione ogni
volta che serve.
Quando si intende restituire più di un risultato da una funzione, si restituisce un oggetto di tipo
lista i cui elementi contengono i risultati.
• Hanno precedenza le variabili de nite nel corpo della funzione → insieme ai comandi
• Se R non trova una variabile la cerca negli argomenti della funzione
• In caso non ci siano, R la cercherà tra gli argomenti presenti nel workspace
• In caso di insuccesso comparirà ERROR
nomefunzione <- function(x, y){ De nizione della funzione
Istruzioni con x e y Nb: se al posto di x o y metto un numero, in
} caso non speci co la di erenza, il valore sarà
sempre quello dato.
nomefunzione <- function(x,y){
y <- operazioni
x <- operazioni
return(list(nomeoperazione1 = x,
nomeoperazione2 = y)
nomerisultato <- nomefunzione(xo,yo) Utilizzare la funzione: tre metodi (speci cando i
nomerisultato <- nomefunzione(x = xo ,y = yo) nomi e potendoli anche invertire oppure
nomerisultato <- nomefunzione(y = yo, x = xo) normalmente seguendo l’ordine)

Input vettore, output lista


nomefunzione <- function(nomevettore){ Una funzione accetta come input un vettore e
list(nomeoggetto1 = comando1, nomeoggetto2 calcola vari comandi su ognuno degli elementi,
= comando2, …) restituendo in ne una lista con i risultati
}

Input lista, output lista


nomefunzione <- function(x, y){ Una funzione accetta come input un vettore e
list(nomeoggetto1 = comando, calcola vari comandi su ognuno degli elementi,
nomeoggetto2 = comando2, …) restituendo in ne una lista con i risultati
}

10
fi
fi
fi
fi
ff
fi
fi
fi
fi
ff
Input vettore e lista, output lista che contiene vettori
nomefunzione <- function(nomevettore, Una funzione stampa in ne due vettori
nomelista){ contenenti i risultati provenienti dai comandi
comandi per la creazione di due vettori (es: inseriti, che combinano il vettore e la lista
vettore - lista)
}

Esempio di funzione importante


nomefunzione <- function(x,y){ Fa la somma di tutti i comandi per tutti i numeri
sum(comandi) inseriti nel vettore applicato:
} nomefunzione( x = c(…), y = c(…) )

Si può applicare anche con il Ciclo For:


s <- 0
for( i in 1:length(x){
s <- s + (comandi)
}

LA PASSEGGIATA CASUALE
PasseggiataCasuale <- function(start, N, graf = FLASE, …){
v <- array(data = NA, dim = N)
v[1] <- start
for(i in 2:N{
v[i] <- v[i-1]+rnorm(mean = 0, sd = 1)
}
if(graf == TRUE){
plot.ts(v, …)
}

FIBONACCI
bonacci <- function(N){
if(N <= 2){
return(NULL)
F <- array(data = NA, dim = N)
F[1] <- 0, F[2] <- 1
for(i in 3:N)
F[i] <- F[i-1]+F[i-2]
}
return(F)
}

Grafici di base
col = colore scritto in inglese → colors() e vedi tutti quelli a disposizione
main= titolo del gra co
xlab = nome etichetta asse delle x
ylab = nome etichetta asse delle y
xlim = intervallo sulla scala delle x (es: xlim= c(0,5))
ylim = intervallo sulla scala delle y (es: ylim= c(0,5))
type = p (punti), l (linee), b (punti e linee)
grid(lwd = n) = aggiunge una griglia con spessore n
abline(h = …, v = …, a = …., b = …) → con h = altezza della linea orizzontale, v = posizione linea
verticale, a/b = altezza e pendenza linea obliqua

11
fi
fi
fi
• plot(x = nomevettore1, y = nomevettore2, …) → gra co a dispersione, coppie di ordinate su un
piano cartesiano
• plot(x, …) → gra co a dispersione in cui x = 1:length(y)

SERIE STORICA
Parte tutto dalla funzione cumsum, che fa la somma di un vettore
Serie singola
nome <- cumsum(rnorm(1000))
plot.ts(nome) → stampa il gra co

Serie multiple
plot.ts(cbind(nomevettore1, nomevettore2), plot.type = ‘single’) → genera dei gra ci, uno per ogni
vettore, a cui si deve a ancare una legenda:
legend(x = puntodinizio, y = max(cbind(nomevettore1, nomevettore2), legend = c(“x”, “y”), col =
c(“blue”, “red”), …)
Serie multiple con piani separati
plot.ts(cbind(nomevettore1, nomevettore2), plot.type = ‘multiple’) → genera dei gra ci, uno per
ogni vettore, in due piani cartesiani separati

FREQUENZE
Factor
nomevettore <- factor(elemento1, elemento2, …)
plot(x = nomevettore) → stampa un istogramma con tutti gli elementi ripetuti, mostrano quale
viene ripetuto di più nel vettore
Ordered
nomevettore <- ordered(elemento1, elemento2, …), levels = c(nomi degli elementi che si ripetono)
plot(x = nomevettore) → stampa un istogramma con tutti gli elementi ripetuti, mostrano quale
viene ripetuto di più nel vettore
Dati continui
Con dati quantitativi si creano delle frequenze delle varie classi e si conteggiano, impostando la
funzione hist con freq = TRUE
nomevettore <- vettore1
hist <- (x = nomevettore, freq = TRUE, …)
Dati continui istogramma
Se ogni frequenza viene divisa per l’ampiezza della classe si ottiene un istogramma, impostando
con freq = FALSE

GRAFICO FUNZIONE
curve(nomefunzione(argomenti)) → crea una curva che rappresenta la funzione

GRAFICI MULTIPLI
par(mfrow=c(1,2)) → le due cifre indicano il numero di righe e colonne di un certo pannello entro
cui alloggiare i gra ci
plot(funzione1)
hist(funzione2) → crea due gra ci, un istogramma e uno normale
12
fi
ffi
fi
fi
fi
fi
fi
fi
LA FUNZIONE HIST
Questa funzione genera un gra co delle frequenze osservate in un certo vettore.
• freq: se TRUE calcola le frequenze, se no calcola le densità di frequenza
• breaks: intervalli
• right: se TRUE genera intervalli chiusi a destra, se no a sinistra
• col: colore del gra co
• main: titolo del gra co
• ylab: etichetta asse verticale
• xlab: etichetta asse orizzontale

Esempio: hist(x = vettore che si vuole inserire*, col = “nomecoloreininglese”, main =


“nomegra co”, ylab = “nomeasse”, xlab = “nomeasse”)
*o si mette un vettore già esistente o lo si crea direttamente lì

Esempio: in questo caso il gra co lo genero se graf = TRUE/FALSE


Inserire anche “type” → “l” se vuoi una linea,
nomefunzione <- function(x, y, m, n, graf = TRUE/FALSE){ Stampa il gra co di una funzione
r <- norm(…, …, …) solo se questo é importato su una
if(graf == TRUE/FALSE) cosa diversa da quella già
hist(…, …) oppure plot.ts(…, …) impostata prima di default.
}

nomefunzione(x = …, y = …, graf = …, ….)

LA FUNZIONE PLOT
plot(vettore/lista/funzione) → stampa il gra co (funziona esattamente come hist)

Grafici non di base (solo domande di teoria su questo)


GGPLOT2
• A dispersione → nomegra co <- ggplot(mtcars, aes(x=wt, y=mpg) +
geom_point +
theme(legend.position=‘none’)
• Gra co frequenze → nomegra co <- ggpolt (data=nomedataframe, aes(x=contenutod.frame)
geom_histogram( ll=“nomecolore”, alpha = n) +
ggtitle(‘nomegra co’)+
theme_minimal()
• Gra co Serie Storica → nomegra co <- ggplot(nomedataframe, aes(x = cont1, y = cont2)
geomline()+

DYGRAPHS
Serve per rappresentare le serie storiche con gra ci interattivi.
nomegra co <- xts(comandi da inserire)

PLOTLY
Crea gra ci interattivi
nomegra co <- plot_ly(comandi da inserire)
ggplotly(nomegra co creato con ggplot) → per renderlo interattivo

Le funzioni di ordine superiore


Una funzione di ordine superiore é una funzione che accetta come input un’altra funzione o che
ne emette una come output.

13
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
fi
• apply <- data.frame e matrici
apply(X = nomedataframe, MARGIN = n, FUN = MARGIN= se 1 esegue la funzione lungo le righe, se
funzionechesivuole, na.rm = TRUE) 2 esegue la funzione lungo le colonne

FUN= funzione che si vuole eseguire, es: mean,


oppure una più complessa creata sul momento,
oppure un’altra già esistente creata da noi

• lapply <- liste (restituisce liste) → se si mette poi sapply da lista il risultato diventa vettore
lapply(X = nomelista, FUN = funzionechesivuole FUN= funzione che si vuole eseguire, es: mean/
length, oppure una più complessa creata sul
momento, oppure un’altra già esistente creata da
noi

• vapply <- vettori / liste (restituisce vettori)


vapply(X = nomevettore/nomelista, FUN = FUN.VALUE= sceglie che cosa si vuole come
funzionechesivuole, FUN.VALUE = …, …) risultato:
- character(1) per stringhe
- logical(1) per booleani
- numeric(1) per numeri

…= altri argomenti da inserire se si vuole

Analisi numerica
DERIVATE
nomederivata <- (f, x, delta = le-04, …)
xp <- x + delta
yp <- x - delta
derivata1 <- (f(xp, …) - f(xm, …))/(2*delta)
derivata2 <- (f(xp, …) - 2 * f(x, …) + f(xm, …)) / (delta^2)
list(prima = derivata1, seconda = derivata2)
Con: f = f(x)
x = numero reale scalare in cui trovare la derivata
delta = intorno della funzione (di default 0.0001)
…: ulteriore argomenti da passare ad f(x)
Applicare poi per qualsiasi f e x → nomederivata(f, punto)
Punto di massimo/minimo
nomepunto <- optimize(f = nomefunzione, interval = c(n,m), maximum = TRUE)
(Per controllare poi applichiamo la derivata al punto e vediamo se la prima derivata é nulla e la
seconda é negativa).
In caso di minimo impostiamo maximum come FALSE e veri chiamo che la seconda derivata sia
positiva.

Gra co derivata
In questa esercitazione intendiamo creare una funzione volta a
1. Tracciare il gra co di una funzione f(x)
2. Calcolare in ogni suo punto la pendenza (funzione derivata prima)
3. Calcolare in ogni suo punto la concavità/convessità (funzione derivata seconda)
• f’(x)>0 pendenza positiva, f’(x)<0 pendenza negativa, f’(x)=0 funzione piatta
• f“(x)>0 funzione convessa (forma a U), f”(x) funzione concava (forma a U rovesciata), f"(x)=0
assenza di concavità/convessità (funzione localmente lineare)

14
fi
fi
fi
chart_Funzione_Derivate<-function(f, inf, sup, incr=0.01, results=FALSE, ...){
# Asse delle x
x <- seq(from = inf, to = sup, by = incr)
N <- length(x)
# Vettori vuoti della stessa lunghezza del vettore x
# abbreviazione per imposatre tre variabili su uno stesso valore
y <- yder1 <- yder2 <- array(NA, N)

# Riempie i vettori y, yder1, yder2


for(i in 1:N){
y[i] <- f(x[i], ...)
yder <- derivate(f, x[i], ...) # Calcola derivate (Nota: yder è una list)
yder1[i] <- yder$prima # estrae derivata prima
yder2[i] <- yder$seconda # estrae derivata seconda
}
# Pannello per contenere molti gra ci
par(mfrow = c(2,2))
plot(x, y, type='l', lwd=2, col='blue', main='Funzione', ylab='',xlab='')
grid(lwd=2); abline(h=0,v=0,lwd=2)
plot(x, yder1, type='l', lwd=2, col='blue', main='Derivata Prima', ylab='',xlab='')
grid(lwd=2); abline(h=0,v=0,lwd=2)
plot(x, yder2, type='l', lwd=2, col='blue', main='Derivata Seconda', ylab='',xlab='')
grid(lwd=2); abline(h=0,v=0,lwd=2)
par(mfrow = c(1,1)) # Ripristina un gra co per pannello
# Restituisce risultati se richiesto
if(results==TRUE){
return(list(f=y, der1=d1, der2=d2))
}
}

RADICI E OTTIMO DI FUNZIONE


Il metodo Newton-Raphson é un algoritmo che consente di azzerare, minimizzare e massimizzare
le funzioni.
Radice di funzione: f / f’ no a quando la funzione di avvicina abbastanza a zero
Ottimo di funzione: f’ / f’’ no a quando la derivata prima é su cientemente vicina allo zero

derivate <- function(f, x, delta = 1e-04, ...) {


xp <- x + delta
xm <- x - delta
d1 <- (f(xp, ...) - f(xm, ...))/(2 * delta)
d2 <- (f(xp, ...) - 2 * f(x, ...) + f(xm, ...))/(delta^2)
list(prima = d1, seconda = d2)
}

NewtonRaphson <- function(f, start, ftol = 1e-05, maxiter = 100, print = FALSE, obj = 'opt', ...) {
# f: funzione obiettivo (f:R->R)
# start: valore iniziale in cui valutare la funzione f
# ftol: regola di convergenza
# maxiter: nr massimo di iterazioni
# print: stampa a schermo l'evoluzione della ricerca della soluzione
# obj: 'root' azzera la funzione. opt per funzioni da minimizzare/massimizzare
# ...: argomenti da passare alla funzione 'f'
xold <- start; fold <- f(xold, ...); i <- 1 # Valori iniziali
change <- ftol * 2; converge <- FALSE # Assicura non-convergenza all'inizio
if (print == TRUE) cat("Iter: ", 0, " x = ", xold, " f = ", fold, "\n")
# Iterazioni (criterio convergenza ftol)

15
fi
fi
fi
fi
ffi
while (change > ftol) {
der <- derivate(f, xold, ...) # Derivate prima e seconda (di erenze nite)
# Nuova x
if (obj == "root") {
xnew <- xold - fold/der$prima
change <- abs(fold)
} else {
xnew <- xold - der$prima/der$seconda
change <- abs(der$prima)
}
fnew <- f(xnew, ...) # Nuova f(x)
if (print == TRUE) {
cat("Iter: ", i, " x = ", xnew, " f = ", fnew, "\n")
}
xold <- xnew; fold <- fnew; i <- i + 1 # Prepara iterazione successiva
# Esce dal ciclo se non converge entro maxiter iterazioni
if(i >= maxiter){
break
}
}
if (change <= ftol) {
converge <- TRUE
}
list(x = xnew, f = fnew, conv = converge)
}
NB: questo si può ottimizzare con la funzione recall, che permette di avere un codice più
compatto e più chiaro.
Utilizzare la funzione
opt <- NewtonRaphson(FunzioneCosto, start = 10, ftol = 1e-05, maxiter = 100, print = TRUE,
obj = "opt", cf = 230, cu = 10)

OTTIMO DI FUNZIONE - NUMERI CASUALI


Quando la funzione obiettivo presenta irregolarità oppure quando si vogliono evitare trappole
legate ai minimi locali, é bene utilizzare questo tipo di algoritmo.
1. La funzione viene valutata in un punto xi
2. Viene generato un punto casuale xi+1 nell’interno di xi
3. Se nel nuovo punto la funzione é minore viene accettato lo spostamento a xi+1, altrimenti si
rimane nel punto precedente
4. Riparte la ricerca causale attorno a xi+1

Si trovi il punto in cui “funz” raggiunge il minimo utilizzando MinimizeRandom (con start=5,
move=0.1, iter=300).
RandOpt <- function(f, start, move, iter = 100, ...) {
xold <- start; fold <- f(xold, ...)
for (i in 1:iter) {
# Regola di spostamento casuale da xold a xnew
spost <- rnorm(1, mean = 0, sd = move)
xnew <- xold + spost
# Valuta la funzione 'f' nel nuovo punto
fnew <- f(xnew, ...)
# Accetta o ri uta il passo
if (fnew < fold) {
xold <- xnew
fold <- fnew
}
16
fi
ff
fi
Utilizzare la funzione ris <- RandOpt(funz, 5, move = 0.1, iter = 300)
funz <- function(x) { print(ris)
x^2 + 3 * x
}
INTEGRALI - METODO DUE PUNTI (INTEGRALI DEFINITI DA A A B)
INTEGRALEPUNTIMEDI <- function(f, interv, N, graf = FALSE, …){
a <- interv[1]; b <- interv[2]
I <- seq(a, b, length.out = (N + 1)) Con:
puntimedi <- (I[-N]+I[-1])/2 f = funzione f(x)
s <- 0 interv = estremi per l’integrazione
for (i in 1:N){ N = nr. Intervalli
s <- s + abs(f(puntimedi[i])) graf = stampa il gra co di f(x)
int = integrale de nito
nomeintegrale <- (b-a)/N*s
med = insieme di punto medi
if(graf = TRUE) amp = ampiezza media degli intervalli
curve(f(x,…), from = interv[1], to = interv[2], …)
grid(lwd=3)
ampMedia <- mean(I[-1]-I[-N])
list(int = nomeintegrale, med = puntimedi, amp = ampMedia

E poi: nomerisultato <- INTEGRALEPUNTIMEDI( f = f, interv = c(n,m), N = o, graf = TRUE)


NB: n, m, o → numeri scalari prede niti dal problema

INTEGRALI - METODO MONTECARLO (INTEGRALI INDEFINITI)


Per calcolare un’integrale complicata:
1. Generare molti valori casuali uniformi nell’intervallo compreso tra limite superiore e limite
inferiore.
2. Per ognuno di questi punti calcolare la corrispondente y = f(x)
3. Calcolare la media di tutti i valori y ottenuti (valor medio)
4. Moltiplicare tale media per (limite superiore - limite inferiore)

integraleMC<-function(f, inf, sup, N, ...){


fx <- array(data = NA, dim = N)
for(i in 1:N){
x <- runif(n = 1, min = inf, max = sup)
fx[i] <- f(x, ...)
}
mean(fx) * (sup-inf)
}
normdens<-function(x, m=0,s=1){
1/sqrt(2*pi*s^2) * exp(-(x-m)^2/(2*s^2))
}
integrale <- integraleMC(f = normdens, inf=-.5, sup=1.5, N=1000000, m=2, s=1)

RADICE QUADRATA - METODO BABILONESI


Nomefunzione <- function(x, rq=x, tol=0.00001, N=100){
rqnew<-(rq+x/rq)/2
if( abs(rq-rqnew) < tol | N == 0) return(rqnew)
else Recall(x = x, rq = rqnew, tol=tol, N = N-1)
}21

sqrtBab<-function(x, tol=0.00001, N=100){ (CONNESSO CON NEWTON-RAPHSON)


rqold <- x Perché per calcolare \(\sqrt{z}\) si tratta di trovare
for(i in 1:N){ la radice della seguente funzione obiettivo:
rq <- (rqold + x/rqold) / 2
if(abs(rq-rqold)<=tol){break} \[f(x) = x^2 - z \]
rqold <- rq
} 17
rq
fi
fi
fi
Pacchetti (importante solo saperli caricare, non li useremo)
L’organizzazione del codice diventa più facile se questo viene separato in piccole unità, in modo
che sia facile riutilizzarlo e ci sia una maggiore chiarezza strutturale.
Questo si può e ettuare creando pacchetti.
L’ordine di caricamento dei pacchetti é determinante, quello più recente oscura le funzioni dei
precedenti che hanno lo stesso nome.
Es: sia il pacchetto “a” che il pacchetto “b” utilizzano la funzione “c”.
x <- c(vari numeri) → c(x) utilizzerà il pacchetto “b” che é l’ultimo ad essere stato installato

install.packages(‘nomepacchetto’) Installa pacchetti cercandoli sul web

nomepacchetto::nomefunzione Per utilizzare tutti i pacchetti che vengono installati con


R, dato che certi non vengono caricati sempre in modo
da non rallentare l’utilizzo di Rstudio
sessioninfo() Elenca tutti i pacchetti installati e caricati e il loro stato

Il pacchetto compiler* permette di creare una versione ottimizzata di una funzione rendendone
l’esecuzione più facile. È installato di default, ma non caricato, e viene richiamato solo quando
viene scritto il suo nome (namespace).
La presenza del namespace serve ad evitare che vengano confuse due funzioni con lo stesso
nome appartenenti a due pacchetti diversi, e a rendere esplicito il pacchetto a cui fa riferimento
una funzione.
*non crea un codice binario, ma un bytecode

cmpfun() Funzione con compiler

f_non_compilata <- function(x){x^2} Creazione di una funzione normale

f_compilata <- compiler:: cmpfun(f_non_compilata) Associazione di una funzione normale ad


una eseguita con compiler (esplicitato)
x <- 5 Concatenazione dei risultati della
x1 <- f_non_compilata funzione compilata e della funzione non
x2 <- f_compilata compilata

cat(‘Risultato: \n Non compilata = ‘, x1, ‘\n’,


‘Compilata = ‘, x2, ‘\n’)

library(nomepacchetto) Carica tutte le funzionalità di un pacchetto, e consente di non dover


esplicitare il namespace ad ogni utilizzo.
Grazie a questa la funzione di prima sarebbe:
f_compilata <- cmpfun(f_non_compilata)

Salvataggio
Tutto ciò che viene fatto su Rstudio può essere salvato su un le di testo, in modo che quanto é
stato fatto possa venire replicato in qualsiasi istante.
Si può quindi eseguire anche l’operazione inversa, importando i dati presenti in un le su Rstudio
Ciò che viene fatto dai pacchetti si può fare anche suddividendo il codice in vari sorgenti.

Poniamo di avere un le di testo, da aprire con notepad, da importare in Rstudio


Source(‘M:/nome le’) Carica i dati presenti nel le in Rstudio

18
ff
fi
fi
fi
fi
fi
IMPORTARE ED ESPORTARE DATI
data() Elenca tutti i dataset disponibili

data(nomedataset) Carica solo uno dei dataset disponibili

print(nomedataset) Visualizza i dati all’interno del dataset selezionato

nomelistaoggetti <- read.csv( le = ‘M:/ Salva un le presente nel disco M in cui vengono
nome le.csv’, header = TRUE, sep = ‘,’) elencati degli oggetti. Questi saranno visualizzati
tramite il comando print(nomelistaoggetti), separati da
una virgola e con la prima linea di intestazione visibile.
header = TRUE Visualizzi la prima linea di interazione

header = FALSE Non visualizzi la prima linea di intersezione


write.table(x= nomelistaoggetti, le = Salva gli oggetti in un nuovo le dopo che il vecchio
‘nomelistaoggettinuova.csv’, sep = ‘,’) le é stato modi cato
save.image(“nomeoggetto.RData”) / Serve a salvare il contenuto del workspace su
save(“nomeoggetto.RData”) / le .RData e scaricarlo successivamente coi comandi
load(“nomeoggetto.RData”) load

APPROFONDIMENTI E AIUTO
Per aiuto si possono scrivere nella console di sotto dei comandi che ti aiuteranno:
• ?read.table
• ?read.csv
• ?write.table
• ?write.csv
Oppure nella casetta nell’angolo in basso a destra (cercando i pacchetti o immettendo le parole
chiave in “search engine”)

19
fi
fi
fi
fi
fi
fi
fi
fi
Programmazione oggetti
In questo tipo di programmazione l’utente ha la facoltà di de nire un nuovo tipo di dato in
aggiunta alle tipologie già presenti in R.

class(nomeoggetto) Ti indica di che classe fa parte l’oggetto (es:


data.frame / lista / …)

In R vi sono tre principali possibilità di mettere in atto la programmazione orientata agli oggetti:
• S3 → il più facile da utilizzare
• S4 → consente il multiple dispatch
• R6 → Replica il linguaggio Java e C++

CREAZIONE OGGETTI
nomestirnga <- structure(“parola”, class = “stringa”) Creazione di una stringa

nomenumero <- structure(n, class = “stringa”) Creazione di un numero

nomefunzione <- function(x,y){UseMethod(“nomefunzione”) Si creano due tipi di funzione basati su


due componenti di erenti.
nomefunzione.nomestringa <- function(x,y){
paste(x,y, sep = “,”)
Se l’attribuzione class = vettore, si
}
con gura una gerarchia secondo la quale
nomefunzione.nomenumero <- function(x,y){ alcune funzioni operano in modo identico
x+y ad un livello e in modo diverso a più
} livelli.

NB: l’ordine con cui R ricerca le funzioni


procede da sinistra verso destra lungo
l’attributo class.

attributes(nomeoggetto) Creazione di attributi: completato la


descrizione del contenuto di determinati
Se si tratta di una lista per esempio indica tutti i suoi
oggetti.
contenuti.

attr(nomeoggetto, “nomediunattributo”) Estrae un attributo

attr(nomeoggetto, “nomediunattributo”) <- c(“nomelemento1, Sostituisce un attributo con altri attributi


nomelemento2, …)

attr(nomeoggetto, “nomediunattributo”) <- “nomeattributo” Aggiunge un attributo nuovo

nomeoggeto <- structure(list(…, …) Aggiunge un insieme di attributi

1
fi
ff
fi
Database relazionali
Il dato é l’elemento base in informatica, ed é suscettibile di elaborazione allo scopo di ottenere
delle informazioni. Quando la mole di dati presenti é elevata, questi devono essere strutturati e
organizzati.

Obiettivi di questa parte di corso:


• Avere idee chiare sulla provenienza dei dati
• Avere conoscenza di ciò che accade dietro alle quinte mentre si accede ad un servizio che
poggia us dati immessi, come per esempio un sito web.

Come funziona
L’informatico progetta e mantiene una base dati, l’economista (o altri statistici) la utilizza. Nello
stesso momento l’utente medio accede ad un social oppure ad un sito web, accedendo quindi al
server della base dati tramite l’immissione di nuovi dati (es: nome utente) o tramite l’interrogazione
(es: ricerca).

Database: insieme organizzato di informazioni, rappresentanti un fatto o un processo. Può essere


sico oppure elettronico (un software, noto come DataBaseManagementSystem).
Di DataBaseManagementSystem ne esistono parecchi, come MS Access, MySql e Oracle, ma il
principio che ci sta dietro é sempre lo stesso: tutti utilizzano il linguaggio SQL* per la creazione, la
modi ca e l’estrazione dati.
*Il linguaggio SQL, nato attorno agli anni ‘70, é costituito da parecchie componenti:
• DDL → comandi per la costruzione e la strutturazione di tabelle
• DML → comandi per l’aggiunta / eliminazione / modi ca di dati presenti nelle tabelle
• DCL → comandi per la gestione dei permessi di accesso al database
• QL → comandi per l’interrogazione del database

I data base elettronici inizialmente vengono sostituiti come semplici le di testo. Poi diventano:
• OLTP, aggiornati in tempo reale → DataBase gerarchici, DataBase reticolari, A oggetti,
DataBase relazionali che garantiscono meglio di tutti l’integrità dei dati
• OLAP, non aggiornati in tempo reale per via della grossa mole di dati che spostano →
DataBase senza una struttura rigida nell’organizzazione dati (NoSQL), utilizzato spesso per le
sintesi statistiche.
NB: ne seguirà un approfondimento

Perché usare database:


• Ottimizzazione dello spazio e velocità
• Facilità di interrogazioni complesse
• Consistenza, integrità e sicurezza dei dati

Un esempio in cui vengono utilizzati molto é l’archiviazione,


grazie ai quali si può risparmiare un sacco di spazio Modello relazionale
evitando di ripetere determinate informazioni. 1. Progettazione concettuale,
creazione delle tabelle e delle
Questo é possibile per esempio grazie alla scomposizione
loro relazioni
delle informazioni, che permette di evitare inutili ripetizioni 2. Immissione di dati nelle tabelle
suddividendo i dati in più tabelle, che vengono poi 3. Utilizzo di tali dati
connesse tramite delle relazioni basate su delle chiavi di
congiunzione.

Relazioni: associazione tra due o più tabelle, derivanti da una relazione tra chiave primaria (unica)
e chiave esterna (o unica o con ripetizioni).
Chiave primaria: é una colonna, o un insieme di colonne, che identi cano univocamente una riga
nella tabella. Il suo valore non può essere mai vuoto (principio di integrità), non ci devono essere
né dati mancanti né dati duplicati.

1
fi
fi
fi
fi
fi
Chiave esterna: é una colonna, o un insieme di colonne, i cui valori sono gli stessi della chiave
primaria di un’altra tabella. Se non trova una controparte, la chiave esterna deve essere impostata
su NULL. In ogni colonna non possono esserci celle vuote e non possono essere cancellate le
righe (per evitare di perdere il riferimento alla chiave primaria).

Tabelle
Righe = records
Colonne = campi
• Ogni campo deve avere un nome univoco
• I dati contenuti in un campo non possono essere scomponibili
• Nello stesso campo vano valori dello stesso tipo
• Ogni record é univoca: non deve avere altri duplicati

Normalizzazione
La normalizzazione del database consiste nella suddivisione corretta delle informazioni tra le
tabelle. Questa permette di avere più chiarezza interpretativa della struttura dei dati, e riduce le
ridondante presenti nelle tabelle.
L’importante però é stare attenti a non normalizzare troppo, in quanto una frammentazione
eccessiva complicherebbe la fase di interrogazione.
Prima forma normale
In corrispondenza ad ogni tabella dev’essere presente un singolo valore, mai un elenco. Non é
quindi possibile mettere due elementi in una sola cella.
Seconda forma normale
Ogni colonna non-chiave dipende completamente dall’intera chiave primaria, anche quando essa
é costituita da più colonne. Elementi che non sono correlati con tutti gli altri non possono quindi
far parte di una determinata tabella.
Terza forma normale
Le colonne non-chiave devono essere indipendenti, in quanto possono essere modi cate senza
che vadano ad in uire sulle altre.

Comandi
CREATE TABLE nome_tabella ( Crea una tabella con:
Nome_campo1 dominio [vincolo]
Nome_campo2 dominio [vincolo] Vincolo: NOT NULL / UNIQUE / DEFAULT /
… PRIMARY KEY
PRIMARY KEY (Nome_campo1,
Nome_campo2, …) Dominio: TEXT / INTEGRER / REAL / NONE /
FOREIGN KEY (Nome_campo1, CURRENCY / GUIDE / …
Nome_campo2, …) REFERENCES (Dipendono da SQLite oppure da MS Access)
Tabella (Nome_campo1,
Nome_campo2, …)
UNIQUE (Nome_campo1, Nome_campo2, …)
Esempio con MS access Esempio con SQLite

“REFERENCES” Induce la creazione di links tra tabelle

2
fl
fi
CREATE TABLE materie ( Relazione “uno a uno”
ID_materia INTEGER PRIMARY KEY Quando la chiave esterna é unica, allora fra le
AUTOINCREMENT, tabelle si instaura una relazione “uno a uno”.
Denominazione TEXT, )

CREATE TABLE prof (


ID_prof INTEGER,
Cognome TEXT,
Nome TEXT,
PRIMARY KEY (ID_prof),
FOREIGN KEY (ID_prof) REFERENCES
materie(ID_materia)
CREATE TABLE prof ( Relazione “uno a molti”
ID_prof INTEGER, Quando la chiave esterna non é unica, allora fra le
Cognome TEXT, tabelle si instaura una relazione “uno a molti”.
Nome TEXT,
PRIMARY KEY (ID_prof)
)

CREATE TABLE incarico (


ID_prof INTEGER,
ID_materia INTEGER,
PRIMARY KEY(ID_prof, ID_materia),
FOREIGN KEY(ID_prof, REFERENCES
prof(ID_prof)
)
Esempio: esiste una tabella che prende sia un Relazione “molti a molti”
elemento della prima che un elemento della Richiede l’interposizione di una tabella-ponte tra le
seconda e li connette. due tabelle, per permettere che vi siano due campi
non unici.

PRIORITÀ DI ESECUZIONE
1. Join
2. Where
3. Group by
4. Select
5. Having

SELECT [ALL | DISTINCT | TOP] list_ colonne Query: comando generale


FROM lista_tabelle Select = prendi una determinata colonna FROM
[ WHERE espressione condizionale] una tabella WHERE nomecolonna = nomelemento
[ GROUP BY lista_colonne HAVING condizione ]
[ ORDERED BY lista_colonne ] Distinct: quando in SELECT due variabili hanno
[ DISTINCT ] due variabili una parte uguale, allora si usa questo in modo da
[ HAVING ] (variabile) operatorematematico n non avere ripetizioni
By: viene applicata solo SELECT per suddividere i
risultati in diversi gruppi distinti
Di solito é: GROUP BY
Having: viene utilizzato per ltrare i risultati e
visualizzare solo quelli che soddisfano le richieste
che lo seguono (é molto simile alla clausola
WHERE)

3
fi
SELECT studenti.matricola, studenti.cognome, Query = Natural Join
studenti.nome, esami.voto Estraiamo dati provenienti da due tabelle:
FROM studenti FROM studenti e INNER JOIN esami.
INNER JOIN esami L’ON serve a legare le due tabelle tramite la
ON studenti.matricola = esami.matricola chiave esterna.
SELECT studenti.matricola, studenti.cognome, Query = Left Join
studenti.nome, esami.voto Tutti i record della tabella studenti, anche se non
FROM studenti trovano un corrispettivo nella tabella esami,
LEFT JOIN esami vengono presi.
ON studenti.matricola = esami.matricola
SELECT studenti.matricola, studenti.cognome, Query = Right Join
studenti.nome, esami.voto Tutti i record della tabella studenti, anche se non
FROM studenti trovano un corrispettivo nella tabella esami,
RIGHT JOIN esami vengono presi.
ON studenti.matricola = esami.matricola
SELECT studenti.matricola, studenti.cognome, Query = Multiple Join
… Si congiungono due tabelle
FORM Il risultato della join al punto precedente si
(Esami LEFT JOIN materie ON esami.ID_materia congiunge con un’altra tabella
= materie.ID_materia) Ecc…
RIGHT JOIN
Studenti ON studenti.matricola =
esami.matricola

Operazioni con tabelle


Date due tabelle A e B, possiamo e ettuare varie operazioni:
• Unione: tutte le righe di A e di B → A union B
• Di erenza: A-B → tutte le righe di A meno quelle in comune con B → A - B
• Intersezione: tutte le righe in comune tra A e B → A intersec B
• Prodotto cartesiano: A x B (tutte le combinazioni possibili) → A x B
• Proiezione: selezione di un sottoinsieme di colonne di una tabella
• Selezione: sottoinsieme di righe di una tabella
• Congiunzione: sottoinsieme di un prodotto cartesiano → JOIN
• equi join → equi join D.K = E.K (mantiene le righe del prodotto in cui vi é lo stesso valore
sulle colonne D.K e E.K.
• join naturale → join naturale D.K = E.K (elimina la colonna E.K in quanto ridondante)
• left join → left join D.K = E.K (come il join naturale ma in più mantiene tutte le righe della
colonna a sinistra)
• right join → right join D.K = E.K (come il join naturale ma in più mantiene tutte le righe della
colonna a destra)
• + / - / * / / / SUM / COUNT (SELECT COUNT (*) AS N FROM STUDENT) / MIN / MAX / AVG
media) / VAR / STEDV

Progettazione e utilizzo di database


Esempio: bisogna memorizzare i dati relativi ai diversi articoli che compaiono su varie riviste di
una casa editrice, per: argomento, autore (che possono essere misti), rivista di pubblicazione con
anno e mese.
Entità Relazioni
Argomento Articolo un autore può scrivere più articoli …
Autore Rivista un argomento può essere trattato da più articoli …
4
ff
ff
Si creano poi le tabelle
contenenti tutti i dati. Queste
vanno create in ordine
cronologico in quanto quelle
contenenti le chiavi esterne di
altre dovranno essere già
create.
Per cambiare i dati si possono
modi care o direttamente dalle
tabelle oppure eseguendo dei
comandi appositi in SQL:
Es: INSERT INTO nome_tabella
elenca tutti i campi
Es: DELETE FROM
nome_tabella WHERE
nome_campo = nomelemento
elimina un elemento

OLAP
I database relazionali presi in considerazione sono orientati alla registrazione dei dati e
all’estrazione di parti di essi.
Attività di routine:
• Memorizzazione delle proprie giacenze
• Inserimento nuovi acquisti
• Esecuzione quotidiana di interrogazioni per rilevare la soglia di giacenza
• Interrogazione durante un acquisto online della disponibilità di qualcosa

Possono essere per esempio utilizzati per l’analisi dati e l’u cio statistiche, utilizzati quindi per
scopo conoscitivo oppure per scopo decisionale.
L’u cio statistiche fa parte della direzione alta di un’azienda, e basandosi su questi dati può per
esempio applicare delle iniziative pubblicitarie, delle iniziative mirate e di erenziate sui pro li dei
clienti oppure può direttamente operare sui mercati nanziari sulla base delle previsioni delle
vendite.
Ovviamente però non bisogna dimenticare che i database relazionali non sono orientati alle
analisi, in quanto non consentono di estrarre relazioni multidimensionali* presenti nei dati e
mancano di interattività**.
*Relazioni multidimensionali: relazioni di causa e di e etto tra le varianti rilevate e presenti nel
database
**Interattività: possibilità di vedere la variazione dei risultati al variare di alcuni parametri

La soluzione a questo problema é l’OLAP, un insieme di tecniche software che consentono di


operare su grandi mole di dati, potendo fornirne così dei risultati a supporto delle decisioni.
OLAP é volto quindi a consentire di individuare le relazioni che intercorrono tra le dimensioni e le
misure, tramite l’interattività.
Come sono fatti i dati:
• Dimensioni (possibili aspetti lungo cui un dato può essere analizzato)
• Livelli (struttura gerarchica)
• Misure (campi a continuato numerico)
• Membri (possibili con gurazioni che ciascuna variabile può assumere)

Cubo OLAP: i dati per un certo problema vengono salvati addirittura in cubi tridimensionali.
Operazione sui cubi: SLICING (restrizione della vista del cubo lungo un sottoinsieme di una certa
dimensione), DICING (creazione di sotto-cubi), DRILL DOWN (visione delle relazioni dettagliate),
ROLL UP (ascesa di uno o più livelli di dettagli) e AGGREGATION (una o più dimensioni vengono
collassate).
5
ffi
fi
fi
fi
ff
ffi
ff
fi
Data Warehouse
OLAP si inserisce in un contesto più grande e ampio, il Data Warehouse, che costituisce l’insieme
di dati di un’organizzazione, a ancato da tecniche la cui nalità é l’identi cazione di relazioni
multidimensionali a ni decisionali.
I dati vengono perciò raccolti da fonti varie, e vengono resi disponibili solo per la lettura venendo
salvati su dei datamart, ai quali si può applicare la tecnica OLAP.
Le analisi del DW sono condotte navigando attraverso il cubo OLAP oppure applicando tecniche
di data mining e di business intelligence.

Soluzioni possibili:
• MOLAP: dati e aggregazioni salvati in un database OLAP → usato quando ö’aggiornamento dei
dati non é molto frequente
• ROLAP: dati e aggregazioni salvati in un database relazionale → usato quando le analisi
vengono svolte raramente. È la più frequente, e i dati vengono suddivisi in tabelle dei fatti (che
presentano chiavi esterne) e tabelle delle dimensioni (che presentano chiavi primarie).
• HOLAP: i dati sono salvati in un database relazionale e le aggregazioni in un database OLAP →
usato quando le analisi sono frequenti

I database relazionali di tipo OLAP presentano però un problema: lo scambio di informazioni,


ovvero la condivisione di dati tra applicativi diversi e tra terminali di erenti.
Il formato ideale di interscambio é il testo, e per questo motivo si é deciso di fruttare al meglio un
le di testo per contenere un base-dati. Sono stati quindi inventati i linguaggi di tipo MARKUP.

Un linguaggio markup lavora con dei le di testo, avendo lo scopo di dare un senso a porzioni
del documento identi cando, con speciali elementi, i marcatori, ovvero alcune porzioni speci che
del testo.
Chi compone il le “marcato”? L’utente utilizzando un editor di testi oppure compiendo una serie
di azioni tramite software che traduce le azioni in un le di testo marcato.

Vantaggi del formato testo


Il documento può essere visionato da chiunque possegga un editor testi
Il documento é accessibile a lungo nel tempo poiché il formato non subisce variazioni
Il documento é leggibile da tutti i diversi sistemi operativi
Il formato binario invece non può essere letto da chi non ne conosce l’endcoding, ed é perciò più
scomodo (malgrado però compatti il volume del testo).

Linguaggio di markup procedurale


Un linguaggio di markup procedurale indica anche le procedure necessarie per ottenere la
rappresentazione visiva del documento marcato, che vengono implementate in un compilatore.
Testo marcato → compilatore → output

Linguaggio di markup descrittivo


Un linguaggio di markup descrittivo si preoccupa solo di dare una struttura al documento di testo,
delegando la rappresentazione visiva ad un altro software.

HTML
HTML appartiene alla categoria dei linguaggi di tipo markup, quindi dei linguaggi descrittivi, ed é
costituito da un insieme prede nito di tag che aiutano a descrivere la rappresentazione gra ca del
contenuto del documento di testo, in modo che questa venga delegata successivamente al
browser web.
Si può vedere grazie a questo il codice sorgente di ogni sit web (view → source)

XML
XML é un markup meta language, descrive il contenuto ma non si preoccupa di indicare la
rappresentazione gra ca.

6
fi
fi
fi
fi
fi
ffi
fi
fi
fi
fi
ff
fi
fi
fi
Può essere inteso come una base dati di tipo gerarchico, in quanto é basato su tag e attributi
de niti dall’utente (sulla base del problema l’utente decide quali tag e attributi utilizzare). L’utente
può quindi decidere quali dati sono più importanti di altri.
Grazie a queste sue caratteristiche, XML permette di attribuire un signi cato semantico al testo,
funzione che tra l’altro permette di e ettuare le ricerche web mirate.
<nometag NomeAttributo1 = “valore” NomeAttributo2 = “valore” >
Contenuto dell’elemento
</nometag>

Utilizzi di XML:
- É un formato aperto, quindi qualsiasi applicazione può leggerlo.
- Attraverso azioni semplici é possibile rappresentare un le XML in vari formati.
- Viene utilizzato come database “light”, essendo veloce e occupando poco spazio.
- Nel web XML viene utilizzato per de nire nuovi linguaggi.
- Si a anca bene a OpenO ce e OpenDocument (per documenti, fogli di calcolo, …)
- In economia e in nanza viene utilizzati per trasferire notizie, descrivere prodotti nanziari,
e ettuare bilanci e comunicare in modo interbancario.

Regole per i tag


- XML é case sensitive → le maiuscole e le minuscole sono di erenti
- La prima riga indica la versione di XML in uso
- La prima riga speci ca la codi ca ISO per la corretta interpretazione dati
- I tag possono iniziare con numeri
- I tag non possono contenere spazi
- I tag vuoti sono: <nometag/>
- I caratteri speciali hanno un modo loro di essere scritti (es: &lt = <)
- I commenti sono: <!—commento—>
Regole per gli attributi
- Il loro contenuto é tra virgolette
- Contengono informazioni a supporto dei dati veri e propri
Regole per i documenti
- Dev’esserci un tag di tipo “root”
- I tag devono essere sempre chiusi
- I tag devono essere coerenti tra loro
- I tag devono essere annidati
correttamente
- I valori degli attributi devono essere
sempre tra virgolette
- Bisogna seguire le regole di XML
Schema oppure del DTD

7
ff
fi
ffi
fi
fi
ffi
fi
fi
ff
fi
ff
fi
fi
Il linguaggio XML può essere interpretato sia da un browser web che contiene un parere XML sia
da altri programmi, scritti in un linguaggio in grado di accedere al DOM o che implementa librerie
SAX.
DOM: é un modello di oggetti che permette di e ettuare una serie di operazioni sui documenti
XML.
DTD: é un le di testo che de nisce la struttura e il tipo di contenuto presente in un le XML.

8
fi
fi
ff
fi
Excel
In excel possono essere inseriti nelle celle: testi, date, numeri e formule. Possono essere invece
incollati sul foglio di lavoro anche: gra ci, immagini, caselle di testo, caselle di equation editor, ...
È possibile cambiare esplicitamente il tipo di dato inserito in una casella selezionando la cella e
schiacciando “formato cella”.
Una cartella di lavoro é un le excel, in cui si sono più fogli di lavoro, ognuno dei quali può
essere modi cato tramite il tasto destro del mouse.

Celle
Ogni cella può essere contraddistinta da un numero e una lettera (A1)oppure da due lettere e due
numeri (R1C1). Di default é impostato sul metodo A1, ma lo si può cambiare nelle opzioni.
Un insieme di celle adiacenti si chiama “vettore”, e può essere sia formato da solo righe (es:
B2:D2) oppure da sole colonne (es: B2:B4). Tutta la colonna B si indica con B:B, tutta la riga 2 si
indica con 2:2.
Un range rettangolare é formato sia da righe che da colonne, e parte dalla prima in alto a sinistra
no all’ultima in basso a destra (es: B2:D5).
Si può fare riferimento a celle esterne al foglio di lavoro.
• Se la cella si trova in un altro foglio di lavoro: nomefoglio!nomecasella (es: Foglio1!A1). Questo si
può per esempio utilizzare per sommare due caselle, come con Foglio1!A1 + Foglio2!A1 che
inserisce nella casella A1 del foglio 3 la somma delle due.
• Se la cella si trova invece in un’altra cartella di lavoro, la formula diventa:
[nomecertelladilavoro.xlsx] nomefoglio!nomecasella.
Per sempli care il lavoro delle formule le celle possono essere rinominate in “formule” e poi in
“de ne names”. In quel caso le celle nelle formule verranno chiamate semplicemente con il loro
nome.

File → options →
1. formulas → workbook
calculation “automatic” e
working with formulas tutte
tranne “R1C1 referente
style”
2. Costumize Ribbon →
attivare “developer”

Developer
Una volta scaricato il developer si può schiacciare su “visual basic” per aprire l’editor di codice
VBA, in cui programmare Excel. Una cartella di lavoro che contiene un VBA dev’essere salvato
come “nome le.xlsm”.
Oltre a questo, si può anche schiacciare su “record macro”, che permette di registrare e
codi care in VBA una serie di azioni che vengono eseguite nell’ambito Excel.

1
fi
fi
fi
fi
fi
fi
fi
fi
Formule
Gli elementi delle formule possono essere digitati manualmente oppure essere contenuti in altre
celle (es: B2 + C1). Se una cella contiene una formula che dipende da altre celle, quando presente
il ricalcolo automatico, quando queste cambiano cambia anche lei di conseguenza.
Le formule possibili si trovano nello scompartimento “formule”, dal quale si possono prendere
direttamente e usare a discrezione nel proprio documento.

Funzioni
Esistono in excel le funzioni, che sono delle trasformazioni “da molti a uno”. Le possiamo trovare
nel tab “formule”:
• Finanziarie
• Data / ora
• Matematiche
• Statistiche
• Ricerca e riferimento
• Database
• Testo
• Logiche
• Informative
• Ingegneristiche
Una funzione accetta zero, uno o più argomenti, separati da una virgola oppure da un punto e
virgola, e restituisce o uno scalare oppure un vettore (che occupa più celle).
Risultato scalare: si seleziona la cella e si schiaccia “=” per poi premere il tasto di invio sulla
tastiera.
Risultato vettoriale: si seleziona l’insieme di celle e si schiaccia “=” per poi premere
“ctrl+maiuscolo+invio”.
Se si fa riferimento in una funzione a più celle, se sono adiacenti le si inserisce come vettori, se
non lo sono le si separa o con la virgola o con il punto e virgola. È possibile inoltre mischiare e
inserire due matrici o due vettori separati da una virgola o da un punto e virgola.

Replicare formule
Una formula può essere applicata a celle adiacenti, basta trascinare il mouse sul bordino della
cella e aspettare che esca una croce nera. Quando esce si trascina lungo tutta la regione entro cui
si replica la formula.
Se lo si vuole fare lontano, bisogna prima copiare con l’uguale la prima casella e poi iniziare.
Se una parte della formula deve rimanere invariata, si blocca una parte della formula inserendo il
simbolo “$”.
• $A1 blocca la riga (sempre ssa sulla riga A)
• A$1 blocca la colonna (sempre ssa sulla colonna 1)
• $A$1 tutta la cella rimane bloccata

Creare una sequenza di valori


Se si mettono due valori in due celle accanto e si esegue lo stesso procedimento con la croce
nera si creerà una sequenza data dall’incremento valore2-valore1.

Formule a risultato vettoriale


Costituiscono un’alternativa al trascinamento, e si formano inserendo nelle formule dei vettori
invece che delle singole celle. In questo caso il risultato sarà un vettore della stella lunghezza
degli altri due (che, nota bene, dovranno essere uguali). Es: =C1:C4 + D1:D4

FUNZIONI PRINCIPALI
Funzioni matematiche in inglese: + / - / * / ^ / SIN / COS / TAN / LN / LOG / LOG10 / EXP /
SQRT / FACT / ABS / SUM / PRODUCT / ROUND / INT / RAND (numero casuale estratti da
distribuzione uniforme) / RANDBETWEEN (numeri interi in un intervallo)
Funzioni matematiche in italiano: + / - / * / ^ / SIN / COS / TAN / LN / LOG / LOG10 / EXP /
RADQ / FATTORIALE / ASS / SOMMA / PRODOTTO / ARROTONDA / INT / CASUALE (numero
casuale estratti da distribuzione uniforme) / CASUALE.TRA (numeri interi in un intervallo)

2
fi
fi
Funzioni descrittive univariate in inglese: AVERGE / COUNT / MAX / MIN
Funzioni descrittive univariate in italiano: MEDIA / CONTA.NUMERI / MAX / MIN

Funzioni logiche in inglese: AND / OR / IF / NOT / TRUE / FALSE


Funzioni logiche in italiano: E / O / SE / NON / VERO / FALSO

Funzioni di testo in inglese: CONCATENATE (&) / EXACT / LEFT / RIGHT / LEN


Funzioni di testo in italiano: CONCATENA (&) / IDENTICO / SINISTRA / DESTRA / LUNGHEZZA

Funzioni di data in inglese: TODAY / WEEKDAY / DAY / MONTH / HOUR / MINUTE / SECOND /
EDATE / sottrazione tra date / somma tra date
Funzioni di data in italiano: OGGI / GIORNO.SETTIMANA (1 = domenica, 7 = sabato) /
DATA.MESE (avanza e retrocede di tot mesi) / GIORNO / ANNO / ORA / MINUTO / SECONDO
Attenzione: le date all’interno di excel sono espresse come un numero decimale che conta dal 1
gennaio del 1990 quanto é passato.

Errori
In caso di errore delle funzioni potrebbe uscire:
• #DIV/0! → divisone per zero impossibile
• #NAME? → formula con testo sbagliato
• #VALUE! → tipo di argomento errato
• #REF! → riferimento a cella inesistente, per esempio se si é eliminata una colonna

Analisi dati (tabella pivot)


Una tabella pivot é un oggetto incollato su un foglio di lavoro, in cui sono raggruppati dei dati,
suddivisi per dimensioni (es: tempo, …) e per misure (es: prezzo, …).
Per inserirla bisogna andare in “inserisci” e poi schiacciare “tabella pivot”. Si possono selezionare
dei dati tramite un range che contiene le intestazioni delle colonne oppure tramite direttamente un
le excel; che si possono poi inserire in un qualsiasi foglio di testo (es: Foglio1!$G$2).

Posizionatore campi
Se si seleziona il “posizionatore campi”, le opzioni ti permettono di decidere tra: dimensione
colonna-riga, dimensione colonna oppure misura.

Tabella univariata delle frequenze


Scegliendo in questo comando si possono scegliere dei campi da aggiungere al rapporto,
inserendo una delle varie opzioni come quella di conteggio, utile per l’analisi dei dati.
Se oltretutto si sceglie la percentuale, nella tabella pivot si visualizzerà l’analisi in percentuale.

Tabella bivariata delle frequenze


Scegliendo invece due campi da aggiungere al rapporto al posto che uno, uno di questi sarà nelle
righe e l’altro costituirà le colonne (a dipendenza di quello che si sceglie). In questo modo si
creeranno delle frequenze congiunte e condizionate.

Tabella univariata delle medie


Oltre a questi comandi, é possibile inserire anche altri comandi nelle “misure”, come la media e la
somma. In questo caso si potrebbe ottenere una tabella che ti indica il rapporto tra le colonne e le
righe.

Tabella bivariata delle medie


Stessa cosa accade per le tabelle bivariate delle frequenze, che mette in relazione ancora più dati.

3
fi
Operazioni su dimensioni
Lungo ogni dimensione di possono ordinare i valori in modo crescente o decrescente oppure
eliminare dalla vista alcuni valori. Per far ciò basta selezionare il corrispondente menu a discesa
indicato dalla freccia che guarda verso il basso e schiacciare su “altre opzioni di ordinamento”.

Gra co pivot
Oltre a ciò, si può anche formare un gra co pivot schiacciando su “strumenti tabella pivot” e
“opzioni”.

4
fi
fi

Potrebbero piacerti anche