Una sbirciata agli Academy Awards 🎥 🍿
Programmare è anche un modo per soddisfare la propria curiosità : tante volte qualcuno ha avuto la stessa curiosità prima di noi e se cerchiamo su Google troviamo la risposta, ma altre volte no! Programmare è quindi utile per soddisfare i nostri dubbi, soprattutto quando le informazioni da analizzare sono tante e una ricerca manuale diventa svantaggiosa…
Per esempio, chi di voi non si è mai interessato alla Notte degli Oscar, l’evento annuale più famoso nel mondo del cinema, nel corso del quale vengono assegnati i premi Oscar? ‌
Uno pensa agli Oscar e gli potrebbe venire da chiedersi: ‌
- Chi è l’attore o l’attrice più giovane ad aver vinto un Oscar?
- Nel corso degli anni l’età media degli attori/trici vincitori/trici di premi Oscar si è abbassata?
- I film vincitori di Oscar ottengono dei rating mediamente quanto piĂą alti?
- Quali sono i fattori che aumentano la probabilitĂ di un attore/trice di ricevere un Oscar?
Per rispondere a queste domande possiamo utilizzare il favoloso dataset messo a disposizione da IMDb. Per chi non lo conoscesse, IMDb è il più famoso online dataset contenente informazioni relative a film, serie, videogiochi, etc. Tra le info contenute in IMDb più utilizzate vi sono il cast dei singoli film o il voto medio degli utenti.‌
In questo blog post, utilizziamo questo dataset in combinazione con altri due dataset gratuitamente scaricabili online, questo dataset contenente i vincitori/trici di premi Oscar come migliori attori/trici dal 1929 al 2019, e questo dataset contenente tutte le nomination agli Oscar (sia quindi i candidati vincitori che non). Per l’analisi, abbiamo scelto come linguaggio di programmazione R, tra i linguaggi di programmazione più utilizzati per l’analisi statistica di dati.
Ciak, si gira 🎬
Per prima cosa impostiamo la working directory, ossia la cartella del computer in cui salveremo i dataset scaricati e l’output dell’esercitazione:
rm(list = ls())
setwd('D:/Dati/Profili/m031988/Downloads/')
Lo step successivo consiste nel caricare i packages necessari per l’analisi, ovvero collezioni di funzioni specializzate nell’esecuzione di determinati task (per esempio, visualizzare i dati, fare analisi predittiva, manipolare i dati, etc):
library(readr)
library(data.table)
library(stringr)
library(tidyr)
library(dplyr)
library(ggplot2)
library(ggfortify)
library(rvest)
library(jpeg)
library(randomForest)
require(caTools)
Dopo aver scaricato i dataset necessari e averli salvati nella working directory, li importiamo nella sessione di R che abbiamo aperto:
# dataset contenente il cast completo per ogni film
title_prin <- read_csv("title_prin.csv",col_names = FALSE)
colnames(title_prin) <- paste(c("tconst","ordering","nconst","category","job","characters"))
# dataset contenente le informazioni relative a attori/trici
name_basic <- read_csv("name_basics.csv",col_names = FALSE)
colnames(name_basic) <- paste(c("nconst","primaryName","birthYear","deathYear","primaryProfession","knownForTitles"))
# dataset contenente le informazioni relative ai film
title_basic <- read_csv("title_basics.csv",col_names = FALSE)
colnames(title_basic) <- paste(c("tconst","titleType","primaryTitle","originalTitle","isAdult","startYear","endYear","runtimeMinutes","genres"))
# dataset contenente i rating di ciascun film
title_rating <- read_tsv("title.ratings.tsv.gz")
# dataset contenente i vincitori di premi Oscar come miglior attore/trice (per ciascun attore/trice soltanto il primo Oscar)
oscar <- read.csv("firstoscars.csv")
# dataset contenente le nomination agli Oscar
nominees <- read.csv("the_oscar_award.csv")
Scena 1: l’inquadratura 🖼️
Prima di buttarsi a capofitto nella programmazione è sempre utile dare una sbirciata ai dati, per esempio:
Quali variabili abbiamo nel dataset sugli Oscar?
head(oscar)
## oscar_no oscar_yr award name movie
## 1 75 2003 Best actor Adrien Brody The Pianist
## 2 65 1993 Best actor Al Pacino Scent of a Woman
## 3 30 1958 Best actor Alec Guinness The Bridge On The River Kwai
## 4 28 1956 Best actress Anna Magnani The Rose Tattoo
## 5 35 1963 Best actress Anne Bancroft The Miracle Worker
## 6 64 1992 Best actor Anthony Hopkins The Silence of the Lambs
## age birth_pl birth_date birth_mo birth_d birth_y
## 1 29 New York 1973-04-14 4 14 1973
## 2 52 New York 1940-04-25 4 25 1940
## 3 43 England 1914-04-02 4 2 1914
## 4 47 Italy 1908-03-07 3 7 1908
## 5 31 New York 1931-09-17 9 17 1931
## 6 54 Wales 1937-12-31 12 31 1937
names(oscar)
## [1] "oscar_no" "oscar_yr" "award" "name" "movie"
## [6] "age" "birth_pl" "birth_date" "birth_mo" "birth_d"
## [11] "birth_y"
Scena 2: Manipolazione dei dati 🔢
Per prima cosa selezioniamo all’interno dei dataset caricati le informazioni che ci interessano (subsetting
):
title_prin <- title_prin[title_prin$category=="actor"|title_prin$category=="actress",]
## [1] "year_film" "year_ceremony" "ceremony" "category"
## [5] "name" "film" "winner"
Successivamente uniamo il dataset contenente la lista di attori/trici in ciascun film con il dataset contenente le informazioni personali (per es. data e luogo di nascita) di ciascun attore/trice (merge):
combo <- merge(title_prin,name_basic,all=FALSE)
Prima di unire questo dataset a sua volta con quello sui vincitori/trici di premi Oscar, è necessario rinominare la variabile contenente il nome dell’artista, essendo questa diversa nei due dataset (rename
):
names(combo)
## [1] "nconst" "tconst" "ordering"
## [4] "category" "job" "characters"
## [7] "primaryName" "birthYear" "deathYear"
## [10] "primaryProfession" "knownForTitles"
combo <- combo %>% rename(name = names(.)[7])
names(combo)
## [1] "nconst" "tconst" "ordering"
## [4] "category" "job" "characters"
## [7] "name" "birthYear" "deathYear"
## [10] "primaryProfession" "knownForTitles"
A questo punto uniamo i due dataset in modo da ottenere un unico dataset e ci focalizziamo sui film realizzati da attori/trici aventi vinto nel corso della loro carriera un Academy Award.
L’opzione “all=FALSE” passata al comando merge serve per trattenere nel dataset finale soltanto gli attori/trici presenti in entrambi i dataset iniziali.
combo_oscar <- merge(combo,oscar,all=FALSE)
# quanti attori/trici nel dataset?
nrow(distinct(combo_oscar["name"]))
## [1] 155
Le variabili contenute in un dato dataset possono avere svariati formati: numerico, carattere, logico.
Il comando typeof ci restituisce il formato con cui è salvata una determinata variabile.
Nel nostro caso, il comando sapply effettua questa richiesta per ciascuna variabile contenuta nel nostro dataset combo_oscar:
sapply(combo_oscar, typeof)
## tconst name nconst ordering
## "character" "character" "character" "character"
## category job characters birthYear
## "character" "character" "character" "character"
## deathYear primaryProfession knownForTitles oscar_no
## "character" "character" "character" "character"
## oscar_yr award movie age
## "integer" "character" "character" "integer"
## birth_pl birth_date birth_mo birth_d
## "character" "character" "integer" "integer"
## birth_y titleType primaryTitle originalTitle
## "integer" "character" "character" "character"
## isAdult startYear endYear runtimeMinutes
## "character" "character" "character" "character"
## genres
## "character"
Una variabile non presente nel dataset ma che invece vogliamo conoscere è l’età di un attore/trice in occasione dell’uscita di un determinato film: possiamo ottenerla facilmente, sottraendo l’anno di nascita all’anno di uscita del film. Tuttavia, per fare ciò dobbiamo prima cambiare il formato alla variabile startYear, memorizzata in formato character
:
combo_oscar$startYear <- as.numeric(combo_oscar$startYear)
sapply(combo_oscar, typeof)
combo_oscar$age <- combo_oscar$startYear - combo_oscar$birth_y
# rapido check: quanti sono i valori "mancanti"?
sum(is.na(combo_oscar$age)==TRUE)
Le variabili, oltre a distinguersi per il formato, si è soliti distinguerle anche in base a quanti valori possono assumere: se il numero di valori che una determinata variabile può assumere è finito (o comunque è molto limitato), questa variabile si dice categorica, e possiamo ispezionare quali sono i valori che può assumere con il comando table:
table(combo_oscar$titleType)
##
## movie short tvEpisode tvMiniSeries tvMovie tvSeries
## 7347 812 7340 195 814 325
## tvShort tvSpecial video videoGame
## 18 35 306 31
Uniamo infine le info contenute nel dataset sulle nominations al nostro dataset principale:
combo_oscar_nominees <- merge(combo_oscar,nominees,all.x=TRUE)
Un pacchetto che rende la manipolazione dei dati estremamente più semplice è tidyverse. Tidyverse è una collezione di packages (dplyr, ggplot, etc.) con in comune una logica e grammatica tendenzialmente più semplice e intuitiva di quella sottostante base R (il pacchetto utilizzato per default da R).
Usiamo tidyverse per creare una variabile “dummy” pari a 1 se il film è stato nominato oppure ha vinto, e 0 altrimenti:
combo_oscar_nominees <- combo_oscar_nominees %>% mutate(nominated = ifelse(is.na(winner)==F,1,0))
combo_oscar_nominees <- combo_oscar_nominees %>% mutate(awarded = ifelse(winner=="True",1,0))
table(combo_oscar_nominees$nominated)
##
## 0 1
## 16490 452
table(combo_oscar_nominees$awarded)
##
## 0 1
## 278 174
Sostanzialmente stiamo chiedendo di creare una variabile il cui valore dipende dal valore di una variabile già esistente. Un altro modo per farlo è il seguente:
combo_oscar_nominees$nominated <- 0
combo_oscar_nominees$nominated[is.na(combo_oscar_nominees$winner)==F] <- 1
table(combo_oscar_nominees$nominated)
##
## 0 1
## 16490 452
Un’operazione molto utile quando si analizzano dei dati consiste nel calcolare “statistiche riassuntive” (per es. media, minimo, massimo) per “gruppo”, ossia per ciascun sottoinsieme di osservazioni con determinate caratteristiche.
Per esempio, se vogliamo calcolare l’anno di “debutto”, ossia a quando risale il primo film girato da un determinato attore/trice, calcoleremo una nuova variabile (mutate) il cui valore corrisponde al minimo di startYear calcolato per il sottoinsieme di film girati da ciascun attore/trice:
combo_oscar_nominees <- combo_oscar_nominees %>% group_by(name) %>% mutate(firstmovie = min(startYear,na.rm =TRUE))
Scena 3: Visualizzazione dei dati 📊
Non c’è dubbio che tra il preparare/manipolare i dati e l’analizzarli, la seconda fase è quella più divertente. Iniziamo con il creare un dataset più semplice contenente info solo sugli attori:
cols <- paste(c("name","sex","age_oscar","exp_oscar","birth_y","birth_pl"))
onlyactors <- distinct(combo_oscar_nominees[,cols])
Per prima cosa, possiamo visualizzare l’età degli attori/trici nel momento in cui hanno vinto l’Oscar per genere per mezzo di un istogramma:
hist(as.numeric(unlist(onlyactors[onlyactors$sex=="Donne","age_oscar"])), col=rgb(1,0,0,0.5), xlab="EtĂ ",
ylab="N (numero di attori/trici)", main="EtĂ al momento del primo Oscar" )
hist(as.numeric(unlist(onlyactors[onlyactors$sex=="Uomini","age_oscar"])), col=rgb(0,0,1,0.5), add=T)
legend("topright", legend=c("Donne","Uomini"), col=c(rgb(1,0,0,0.5),
rgb(0,0,1,0.5)), pt.cex=2, pch=15 )

Qual è stato l’attore/trice premiato/a più giovane e a che età ? Ancora una volta possiamo utilizzare tidyverse, in particolare il comando summarize:
#onlyactors %>% group_by(sex) %>% summarise(average = mean(age_oscar))
onlyactors %>% group_by(sex) %>% summarise(youngest = min(age_oscar))
onlyactors <- onlyactors %>% group_by(sex) %>% mutate(youngest = min(age_oscar))
print(onlyactors[onlyactors$youngest==onlyactors$age_oscar,"name"])
print(distinct(combo_oscar_nominees[combo_oscar_nominees$name=="Adrien Brody"|combo_oscar_nominees$name=="Marlee Matlin","movie"]))
Dato che i nostri dati spaziano oltre un secolo di cinematografia, possiamo verificare se in passato era più facile vincere un Oscar da giovani. Calcoliamo dunque l’età media al momento dell’Oscar in base a quando sono nati gli attori/trici, e successivamente ci avvaliamo di ggplot per realizzare un grafico a barre:
df <- onlyactors %>% group_by(sex,cohort) %>% summarise(average_age_oscar = mean(age_oscar))
## `summarise()` regrouping output by 'sex' (override with `.groups` argument)
ggplot(data=df, aes(x=cohort, y=average_age_oscar, fill=sex)) +
geom_bar(stat="identity", position=position_dodge())+
xlab("Anno di nascita")+
ylab("EtĂ al momento del primo Oscar")

Quindi per gli uomini l’età media alla quale si vinceva il primo Oscar è andata calando nel corso degli anni, mentre per le donne è dapprima calata, poi aumentata durante gli anni ’20-’60 e poi successivamente tornata a calare.
Possiamo inoltre ispezionare i paesi da cui provengono gli attori/trici premiati/e con maggiore frequenza:
df <- onlyactors %>% group_by(birth_pl) %>% summarise(count = n())
## `summarise()` ungrouping output (override with `.groups` argument)
df <- df[order(-df$count),]
head(df,10)
## # A tibble: 10 x 2
## birth_pl count
## <chr> <int>
## 1 England 24
## 2 California 20
## 3 New York 20
## 4 Pennsylvania 5
## 5 Illinois 4
## 6 Missouri 4
## 7 Ohio 4
## 8 Texas 4
## 9 Australia 3
## 10 Canada 3
Facciamo a questo punto un passo indietro per ricordarci che nel nostro dataset abbiamo a disposizione tutti, ma proprio tutti, i film, documentari, cortometraggi, etc., realizzati dai nostri vincitori/trici di premio Oscar, non soltanto i film con cui li hanno vinti.
Vediamo dunque per cominciare come se la sono cavata le nostre star durante la carriera. Per esempio, in quale fase della vita sono in media maggiormente “attivi”?
df <- combo_oscar_nominees %>% group_by(sex,age) %>% summarise(count_movie = n())
df <- df[df$age>15 & df$age<85 & is.na(df$age)==F,]
ggplot(data=df, aes(x=age, y=count_movie, fill=sex)) +
geom_bar(stat="identity", position=position_dodge())+
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
xlab("EtĂ ")+
ylab("N (numero di produzioni per anno di etĂ )")

E l’attore/trice in generale più attivo/a nella storia di Hollywood?
df <- combo_oscar_nominees %>% group_by(name) %>% summarise(count_movie = n())
onlyactors <- merge(onlyactors,df)
setorder(setDT(onlyactors %>% group_by(sex) %>% top_n(1, count_movie)), -count_movie)[, head(.SD, 5L), keyby = sex]

Quante di queste produzioni sono film e quanti invece altro (per es. cortometraggi, videogiochi, etc.)?
df <- combo_oscar_nominees %>% group_by(name,titleType) %>% summarise(count_movie_40 = sum(age<40,na.rm=T))
## `summarise()` regrouping output by 'name' (override with `.groups` argument)
df <- df[df$name=="Susan Sarandon"|df$name=="James Stewart",]
ggplot(data=df, aes(x=titleType, y=count_movie_40, fill=name)) +
geom_bar(stat="identity", position=position_dodge())+
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
xlab("EtĂ ")+
ylab("Numero di produzioni")

Susan Sarandon sarà pur l’attrice più “produttiva”, se si contano tutti i tipi di prodotti che attori/trici realizzano, ma qual è l’attrice con il maggior numero di nomination (ehh si, lo sapete già )?
df <- combo_oscar_nominees %>% group_by(name) %>% summarise(count_nomin = sum(nominated))
## `summarise()` ungrouping output (override with `.groups` argument)
onlyactors <- merge(onlyactors,df)
setorder(setDT(onlyactors %>% group_by(sex) %>% top_n(1, count_nomin)), -count_nomin)[, head(.SD, 5L), keyby = sex]
## sex name age_oscar exp_oscar birth_y birth_pl youngest
## 1: Donne Meryl Streep 34 6 1949 New Jersey 22
## 2: Uomini Spencer Tracy 38 8 1900 Wisconsin 30
## cohort count_movie count_nomin
## 1: 1940-1960 114 17
## 2: 1900-1920 78 9
Può essere interessante capire come evolve la produzione di ciascun attore/trice prima e dopo aver vinto un Oscar. Vediamo un attimo.
- Costruiamo un dataset semplificato che riporta l’attività di ciascun artista per ciascun anno della sua carriera utilizzando il già visto utile comando summarise.
- Successivamente costruiamo una variabile che ci dice per ciascun artista e anno, quanti anni mancano/quanti anni sono passati rispetto all’anno dell’Oscar.
- Infine, calcoliamo in media per uomini e donne il numero di produzioni che hanno realizzato cinque anni prima di vincere l’Oscar, quattro, …, l’anno prima, e poi ancora, l’anno dopo, …, e così via.
df <- combo_oscar_nominees %>% group_by(name,startYear) %>% summarise(count_movie = n(),count_nomin = sum(nominated), sexnum= mean(sexnum), oscar_yr = mean(oscar_yr))
## `summarise()` regrouping output by 'name' (override with `.groups` argument)
df$newtime <- df$startYear - df$oscar_yr
df <- df[df$newtime >=-5 & df$newtime<=5 & is.na(df$newtime)==F,]
df <- df %>% group_by(sexnum,newtime) %>% summarise(count_movie = mean(count_movie),count_nomin = mean(count_nomin))
## `summarise()` regrouping output by 'sexnum' (override with `.groups` argument)
df$sex <- c("Uomini")
df$sex[df$sexnum==2] <- c("Donne")
ggplot(data=df, aes(x=newtime, y=count_movie, fill=sex)) +
geom_bar(stat="identity", position=position_dodge())+
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))+
scale_x_continuous(name="Anni rispetto al (primo) Oscar", limits=c(-5, 5))
## Warning: Removed 2 rows containing missing values (geom_bar).

Uno si aspetterebbe di osservare un aumento della produzione cinematografica proprio a ridosso del premio Oscar, e successivamente una riduzione (come a dire, gli artisti si godono un po’ di meritato riposo dopo aver vinto l’Oscar), seguita magari da una ripresa in termini di intensità nella produzione cinematografica. Dai dati si vede tuttavia che se è vero che post-Oscar gli artisti diventano per qualche anno “meno attivi”, è altrettanto vero che questa riduzione di attività si osserva già qualche anno prima di vincerel’Oscar.
Ora, IMDb è soprattutto un dataset di recensioni. Diamo dunque un’occhiata anche a quelle. Per prima cosa, si dice spesso che gli appassionati di videogiochi tendono a essere più generosi con le loro recensioni: è vero? La risposta è: tendenzialmente si.
combo_oscar_nominees_rat <- merge(combo_oscar_nominees,title_rating,all.x=TRUE)
combo_oscar_nominees_rat %>% group_by(titleType) %>% summarise(averagereview = mean(averageRating,na.rm=T),countreview=mean(numVotes,na.rm=T))
df <- combo_oscar_nominees_rat %>% group_by(titleType,startYear) %>% summarise(averagereview = mean(averageRating,na.rm=T),countreview=mean(numVotes,na.rm=T))
Un altro aspetto da non sottovalutare è il fatto che le recensioni su IMDb sono diventate un fenomeno di massa soltanto in tempi relativamente recenti:
df <- ts(df[df$titleType=="movie" & df$startYear<=2020,paste(c("averagereview","countreview"))],start=1905)
autoplot(df)
## Warning: Removed 2 row(s) containing missing values (geom_path).

Dal grafico in alto tuttavia si vede come seppure il numero di recensioni sia aumentato, la recensione media è rimasta costante.
Avendo a disposizione la recensione “media” per ciascun film, possiamo infine calcolare di quanto sono più alte le recensioni nel caso di film che hanno vinto una nomination o Oscar:
combo_oscar_nominees_rat$winner[is.na(combo_oscar_nominees_rat$winner)==T] <- c("Not nominated")
combo_oscar_nominees_rat$nominatedlabel <- c("Not nominated")
combo_oscar_nominees_rat$nominatedlabel[combo_oscar_nominees_rat$nominated==1] <- c("Nominated")
combo_oscar_nominees_rat %>% group_by(sex,nominatedlabel) %>% summarise(averagereview = mean(averageRating,na.rm=T),countreview=mean(numVotes,na.rm=T))
combo_oscar_nominees_rat %>% group_by(sex,winner) %>% summarise(averagereview = mean(averageRating,na.rm=T),countreview=mean(numVotes,na.rm=T))
Scena 4: Analisi di previsione đź”®
La parte conclusiva della nostra analisi consiste nell’implementazione di un semplice esercizio di previsione. In particolar modo, siamo interessati a prevedere la probabilità di vincere un premio Oscar sulla base delle informazioni a disposizione su ciascun attore/trice e film.
Ci avvaliamo di una random forest, ossia di una tecnica di machine learning che senza entrare troppo nel dettaglio sostanzialmente ha come obiettivo quello di raggruppare i dati in gruppi quanto più dissimili tra di loro (e simili internamente) ai fini di formulare una previsione (più semplice all’interno di gruppi maggiormente omogenei).
Selezioniamo le variabili che ci interessano e che vogliamo utilizzare per “prevedere” l’outcome (ossia, awarded=1 se il film in questione ha vinto l’Oscar, e 0 viceversa):
# df <- combo_oscar_nominees_rat
# df <- subset(combo_oscar_nominees_rat,select=c("name","awarded","age","exp","sexnum","startYear","movie","genres","womanalreadywinner","manalreadywinner","cohort","birth_pl","counter","counter_movie","counter_nomin","productivity","averageRating"))
df <- na.omit(df)
df$awarded <- as.factor(df$awarded)
vars <- c("awarded","age","exp","movie","womanalreadywinner","manalreadywinner","cohort","country","counter","counter_movie","counter_nomin","productivity","averageRating","drama","comedy","crime")
dfwomen <- df[df$sexnum==2,vars]
dfmen <- df[df$sexnum==1,vars]
sapply(dfwomen,typeof)
## awarded age exp movie
## "integer" "double" "double" "double"
## womanalreadywinner manalreadywinner cohort country
## "double" "double" "character" "character"
## counter counter_movie counter_nomin productivity
## "double" "double" "double" "double"
## averageRating drama comedy crime
## "double" "double" "double" "double"
Facciamo girare l’algoritmo su due subset del dataset, uno per gli attori e uno per le attrici:
sample <- sample.split(dfwomen$awarded, SplitRatio = .75)
train <- subset(dfwomen, sample == TRUE)
test <- subset(dfwomen, sample == FALSE)
rfwomen <- randomForest(
awarded ~ .,
data=train,
importance = TRUE
)
E visualizziamo i risultati. L’errore di previsione è circa il 3%, di poco inferiore per gli uomini che per le donne.
Le variabili che influenzano maggiormente l’accuratezza del modello sono molto simili tra uomini e donne. Queste sono il numero di nomination ricevute fino a quel momento (counter_nomin), il numero di film girati fino a quel momento (counter_movie) e il rating ricevuto dal film.
Per le donne l’esperienza, ossia il numero di anni in attività , sembra contare di più dell’età , mentre per gli uomini conta più l’età . Infine la tipologia di film (se una commedia, un film drammatico o un giallo) aiuta maggiormente a prevedere la probabilità per gli uomini di vincere un Oscar che non per le donne.
print(rfwomen)
##
## Call:
## randomForest(formula = awarded ~ ., data = train, importance = TRUE)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 3.12%
## Confusion matrix:
## 0 1 class.error
## 0 1609 2 0.001241465
## 1 50 5 0.909090909
varImpPlot(rfwomen,n.var=15,type=1)

print(rfmen)
##
## Call:
## randomForest(formula = awarded ~ ., data = train, importance = TRUE)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 2.29%
## Confusion matrix:
## 0 1 class.error
## 0 2293 1 0.0004359198
## 1 53 6 0.8983050847
varImpPlot(rfmen,n.var=15,type=1)

Ci sono alcune cose che potevamo indovinare, anche senza analizzare i dati, altre, invece, che decisamente non ci aspettavamo! L’analisi empirica dei dati è sempre il modo migliore per espandere la propria conoscenza, perché spesso ci rivela cose che non conoscevamo, o per le quali avevamo un’aspettativa opposta!
Il sequel 🥚
Il tempo a disposizione è terminato.‌
Abbiamo visto e imparato tanti concetti che ci hanno permesso di compiere i primi passi nel mondo della programmazione e dei dati.‌
Ma la strada è ancora lunga e le cose da scoprire tante.‌
Cosa puoi fare ora?‌
Cerca su internet esempi e tutorial con cui potrai continuare il tuo viaggio alla scoperta di R e della data science per esplorare ulteriormente questo dataset o scoprirne di nuovi.‌
Happy coding! 🚀