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 è tidyverseTidyverse Ă¨ 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]
photo credits: Wikimedia / Pxfuel

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! 🚀