2022-09-01

Aiuto e Pacchetti

# aiuto sulla funzione log
?log
  • R è provvisto di una serie di packages (pacchetti), alcuni caricati di default
# installare e aggiornare un pacchetto (da fare solo una volta)
install.packages("igraph")

# caricare un pacchetto
library(igraph)

# aggiornare tutti i pacchetti disponibili
update.packages()

Operatori e Funzioni

  • aritmetici: somma (+), sottrazione (-), prodotto (*), divisione (/), divisione intera (%/%), modulo (%%), esponente (^)
  • comparazione: uguaglianza (==), non uguaglianza (!=), minore (<), maggiore (>), minore uguale (<=), maggiore uguale (>=)
  • operatori logici: congiunzione (&), disgiunzione (|), negazione (!), disgiunzione esclusive (xor)
  • indici statistici: media (mean), massimo (max), minimo (mean), … vedi formulario

Valori Speciali

  • il valore NA (not available) è usato per rappresentare valori mancanti
  • il valore NULL è l’oggetto nullo
  • il valore Inf rappresenta il valore infinito
  • il valore NaN (not a number) è il risultato di una computazione che non ha senso

Variabili

potete usare le variabili per memorizzare valori. Ci sono 3 modi per assegnare delle variabili in R:

x = 42  # standard
x <- 42 # ragioni storiche
42 -> x # raramente usato

# stampa x
x
## [1] 42
# stampa struttura di x (valore + tipo)
str(x)
##  num 42

Tipi di Base

R ha 4 tipi di base:

# double (double-precision number)
x = 108.801
typeof(x)
## [1] "double"
# integer (integer number)
x = 108L
typeof(x)
## [1] "integer"
# character (stringa di caratteri)
x = "108L"
typeof(x)
## [1] "character"
# logical (Booleano,TRUE oppure FALSE)
x = TRUE
typeof(x)
## [1] "logical"

Strutture Dati

R include le seguenti strutture dati:

  • vettori atomici
  • liste
  • matrici
  • dataframe

Vettori Atomici

un vettore è una sequenza di elementi con lo stesso tipo. Gli indici partono da 1 (e non da 0 come in altri linguaggi)

# creare un vettore
c(1, 3, 5, 7)
## [1] 1 3 5 7
# concatenare vettori
c(c(1, 3), c(5, 7))
## [1] 1 3 5 7
# somma elemento per elemento
c(1, 2, 3, 4) + c(10, 20, 30, 40)
## [1] 11 22 33 44

Liste

una lista è una sequenza di elementi che possono avere tipi diversi.

# creazione
l = list(thing = "hat", size = 8.25, female = TRUE)

# stampa
l
## $thing
## [1] "hat"
## 
## $size
## [1] 8.25
## 
## $female
## [1] TRUE
str(l)
## List of 3
##  $ thing : chr "hat"
##  $ size  : num 8.25
##  $ female: logi TRUE
# accedere a elemento
l$thing
## [1] "hat"
l[[1]]
## [1] "hat"
# sottolista
l[c("thing", "size")]
## $thing
## [1] "hat"
## 
## $size
## [1] 8.25
l[c(1, 2)]
## $thing
## [1] "hat"
## 
## $size
## [1] 8.25

Matrici

una matrice è un vettore a 2 dimensioni, che contiene veottori dello stesso tipo e dimensione

# definizione
M = matrix(data = 1:9, ncol = 3)
M
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
nrow(M)
## [1] 3
ncol(M)
## [1] 3
dim(M)
## [1] 3 3

Accedere agli elementi di una Matrice

M
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
# elemento in riga 1 e colonna 2
M[1, 2]
## [1] 4
# prima riga
M[1, ]
## [1] 1 4 7
# prima colonna
M[ ,1]
## [1] 1 2 3
# sotto-matrice
M[1:2, 1:2]
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
# diagonale
diag(M)
## [1] 1 5 9

Dataframe

un dataframe è una lista di vettori (chiamati colonne). Un dataframe è come una tabella di un database

  • ogni colonna ha un nome e contiene elementi dello stesso tipo
  • colonne diverse hanno la stessa lunghezza ma possono contere elementi di diverso tipo
name = c("John", "Samuel", "Uma", "Bruce", "Tim")
age = c(23, 31, 17, 41, 25)
married = c(TRUE, FALSE, FALSE, TRUE, TRUE)

pulp = data.frame(name, age, married)
pulp
##     name age married
## 1   John  23    TRUE
## 2 Samuel  31   FALSE
## 3    Uma  17   FALSE
## 4  Bruce  41    TRUE
## 5    Tim  25    TRUE

Accedere agli elementi

# prima riga
pulp[1, ]
##   name age married
## 1 John  23    TRUE
# prima colonna
# matrix style
pulp[ ,1]
## [1] "John"   "Samuel" "Uma"    "Bruce"  "Tim"
pulp[, "name"]
## [1] "John"   "Samuel" "Uma"    "Bruce"  "Tim"
# list style
pulp$name 
## [1] "John"   "Samuel" "Uma"    "Bruce"  "Tim"
pulp[[1]]
## [1] "John"   "Samuel" "Uma"    "Bruce"  "Tim"
# filtri
pulp[pulp$name == "Uma", ]
##   name age married
## 3  Uma  17   FALSE
pulp[pulp$age < 18, ]
##   name age married
## 3  Uma  17   FALSE
pulp[married == TRUE, "name"]
## [1] "John"  "Bruce" "Tim"

I grafici in R: ggplot

ggplot2 è un sistema dichiarativo per creare grafici. Bisogna fornire:

  • i dati,
  • le primitive grafiche da usare,
  • configurare i parametri estetici, La libreria si occupa del resto.

template per ggplot2

i grafici in ggplot assumono la seguente forma:

ggplot(data = <DATAFRAME>) + 
  <GEOMETRIC OBJECT>(mapping = aes(<MAPPINGS>))
  1. dataframe contiene le variabli che vogliamo mostrare
  2. geometric object definisce il tipo di grafico che vogliamo mostrare (scatterplot, barplot, boxplot, etc.)
  3. aesthetic mapping associa il dataframe ai fattori estetici che vogliamo mostrare, ad esempio dimesione, colore, posizioni x e y, etc.

Il dataset di Vendite di Videogiochi

lavoreremo con un dataset che contiene le seguenti variabili:

  • Rank - posizione per numero di vendite
  • Name - nome del gioco
  • Platform - piattaforma (i.e. PC, PS4, etc.)
  • Year - anno di rilascio
  • Genre - genere
  • Publisher - editore
  • NA_Sales - vendite in Nord America (in milioni)
  • EU_Sales - vendite in Europa (in milioni)
  • JP_Sales - vendite in Giappone (in milioni)
  • Other_Sales - vendite nel resto del mondo (in milioni)
  • Global_Sales - totale delle vendite (modiale)

I Dati

Visualizziamo i Diversi Generi

library(ggplot2)

df = read.csv("data/vgsales.csv")
ggplot(data = df) +
  geom_bar(mapping = aes(x = Genre)) + theme_bw() 

Visualizziamo i Videogiochi Usciti nei Diversi Anni

ggplot(data = df) +
  geom_bar(mapping = aes(x = Year)) + 
  theme(axis.text.x = element_text(angle = 45))

Visualizziamo la Media delle Vendite per Anno

library(dplyr, warn.conflicts = FALSE)
ddf = df %>%
  group_by(Year) %>%
  summarise(Aggregated = mean(Global_Sales))

ddf
## # A tibble: 40 × 2
##    Year  Aggregated
##    <chr>      <dbl>
##  1 1980       1.26 
##  2 1981       0.778
##  3 1982       0.802
##  4 1983       0.988
##  5 1984       3.60 
##  6 1985       3.85 
##  7 1986       1.77 
##  8 1987       1.36 
##  9 1988       3.15 
## 10 1989       4.32 
## # … with 30 more rows
ggplot(data = ddf, aes(x = Year, y = Aggregated)) + 
  theme(axis.text.x = element_text(angle = 45)) + 
  geom_point()

Vediamo la Correlazione delle Vendite con Anno

ggplot(data = df, aes(x = Year, y = Global_Sales)) + 
  theme(axis.text.x = element_text(angle = 45)) + 
  geom_point()

Vediamo la Correlazione delle Vendite EU e le vendite NA

ggplot(data = df, aes(x = EU_Sales, y = NA_Sales)) + 
  theme(axis.text.x = element_text(angle = 45)) + 
  geom_point()

Vediamo quali giochi sono outlier

df[(df$EU_Sales <= 5) & (df$NA_Sales >= 20),c('Name','NA_Sales','EU_Sales')]
##                 Name NA_Sales EU_Sales
## 2  Super Mario Bros.    29.08     3.58
## 6             Tetris    23.20     2.26
## 10         Duck Hunt    26.93     0.63

Facciamo un Word Cloud con i Titoli

#install.packages(c('tm', 'wordcloud'))
library(tm) # per filtrare 
library(wordcloud)
text = df[, "Name"]
text = tolower(text)
docs <- Corpus(VectorSource(text))
docs <- docs %>%
  tm_map(removeNumbers) %>%
  tm_map(removePunctuation) %>%
  tm_map(stripWhitespace) %>%
  tm_map(removeWords, stopwords("english"))

dtm <- TermDocumentMatrix(docs) 
matrix <- as.matrix(dtm) 
words <- sort(rowSums(matrix),decreasing=TRUE) 
ddf <- data.frame(word = names(words),freq=words)

set.seed(1234) # for reproducibility 
wordcloud(words = ddf$word, freq = ddf$freq, min.freq = 1,           
          max.words=500, random.order=FALSE, rot.per=0.35,            
          colors=brewer.pal(8, "Dark2"))

Visualizziamo una Mappa con le Vendite di NA e JP

library(dplyr)
library(maps)

df = read.csv("data/vgsales.csv") 
mean_NA = mean(df[, "NA_Sales"])
mean_Japan = mean(df[, "JP_Sales"])

myList <- list(region = c('USA', 'Japan'), value = c(mean_NA, mean_Japan))
ddf <- as.data.frame(myList)
ddf
##   region      value
## 1    USA 0.26466743
## 2  Japan 0.07778166
world <- map_data("world")
#world

world %>%
  merge(ddf, by.x = "region", by.y = "region", all.x = T) %>%
  arrange(group, order) %>%
  ggplot(aes(x = long, y = lat, group = group, fill = value)) + geom_polygon()

Esercizi

  • provate ora a replicare i nostri risultati
  • sperimentate con il dataset dei videogiochi
  • cosa succede se voglio correlare le vendite EU con quelle Globali? È corretto?
  • come posso vedere le vendite massime dei videogiochi nel corso degli anni?
  • ponentevi delle domande “interessanti” e provate a rispondere