Il dataset utilizzato “vgsales” è stato preso dal sito kaggle.com e rappresenta le vendite di videogiochi nel mondo, aggiornate al 26/10/2016.
Carichiamo il database, vediamone le dimensioni e la forma
# setto la working directory
setwd("~/Università/Specialistica/DM4BD (tesina)/vgsales")
# Carico il dataset vgsales
vgsales <- read.csv(file="Dataset/vgsales.csv", header= T, sep =",")
dim(vgsales)
## [1] 16598 11
head(vgsales)
## Rank Name Platform Year Genre Publisher
## 1 1 Wii Sports Wii 2006 Sports Nintendo
## 2 2 Super Mario Bros. NES 1985 Platform Nintendo
## 3 3 Mario Kart Wii Wii 2008 Racing Nintendo
## 4 4 Wii Sports Resort Wii 2009 Sports Nintendo
## 5 5 Pokemon Red/Pokemon Blue GB 1996 Role-Playing Nintendo
## 6 6 Tetris GB 1989 Puzzle Nintendo
## NA_Sales EU_Sales JP_Sales Other_Sales Global_Sales
## 1 41.49 29.02 3.77 8.46 82.74
## 2 29.08 3.58 6.81 0.77 40.24
## 3 15.85 12.88 3.79 3.31 35.82
## 4 15.75 11.01 3.28 2.96 33.00
## 5 11.27 8.89 10.22 1.00 31.37
## 6 23.20 2.26 4.22 0.58 30.26
vg logo .png
Vediamo che cosa rappresentano le variabili
names(vgsales)
## [1] "Rank" "Name" "Platform" "Year"
## [5] "Genre" "Publisher" "NA_Sales" "EU_Sales"
## [9] "JP_Sales" "Other_Sales" "Global_Sales"
Nell’ordine con cui si presentano abbiamo:
Siccome ogni colonna è una variabile, ogni colonna è una variabile e contiene dei valori singoli e inoltre ogni osservazione forma una riga, affermiamo che stiamo operando su dei \(\textbf{Tidy data}\), perciò non serviranno operazioni di tidyng. Andremo solamente a controllare eventuali valori mancanti \(\textit{NA}\) (not available) e valori impossibili da un punto di vista logico.
Carico le library
library(plotly)
library(gridExtra)
library(PerformanceAnalytics)
library(corrplot)
library(plotly)
library(sqldf)
library(ggplotify)
library(ggthemes)
library(ggplot2)
library(tidyverse)
library(knitr)
library(DT)
Per rispondere alla domanda utilizziamo anche plot.ly:
q<-vgsales %>%
group_by(Year,Platform) %>%
summarize(total = sum(Global_Sales)) %>%
ggplot(aes(x = Year, y = total, fill = Platform))+
geom_col(position="stack")+
labs(y = "Vendite in mln €", x= "Anno") +
theme(axis.text.x = element_text(angle = 90))
ggplotly(q, width = 800, height = 600)
Notiamo che l’\(\textbf{Anno}\) assume i valori \(\textit{2017,2020}\) che sono logicamente impossibili in quanto le osservazioni sulle vendite sono datate fine 2016, e \(\textit{N/A}\) ossia un valore non disponibile. Vediamoli più nel dettaglio:
table(vgsales$Year)
##
## 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994
## 9 46 36 17 14 14 21 16 15 17 16 41 43 60 121
## 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
## 219 263 289 379 338 349 482 829 775 763 941 1008 1202 1428 1431
## 2010 2011 2012 2013 2014 2015 2016 2017 2020 N/A
## 1259 1139 657 546 582 614 344 3 1 271
Nella variabile di tipo factor troviamo: sono 271 $ $, 3 \(\rightarrow \textit{2017}\) e solo 1 \(\rightarrow \textit{2020}\). Optiamo per eliminare le tuple contenenti tali valori che sono in tutto \(\frac{271+3+1}{16598}\) corrispondenti all’\(1.65\%\) del totale.
# eliminiamo livelli
vgsales<-vgsales[(vgsales$Year != "N/A") & (vgsales$Year != "2017") & (vgsales$Year != "2020"),]
vgsales$Year<-factor(vgsales$Year)
levels(vgsales$Year)
## [1] "1980" "1981" "1982" "1983" "1984" "1985" "1986" "1987" "1988" "1989"
## [11] "1990" "1991" "1992" "1993" "1994" "1995" "1996" "1997" "1998" "1999"
## [21] "2000" "2001" "2002" "2003" "2004" "2005" "2006" "2007" "2008" "2009"
## [31] "2010" "2011" "2012" "2013" "2014" "2015" "2016"
Riplottando il grafico otteniamo:
#migliore piattaforma per ciascun anno
miglior_piattaforma <-vgsales %>%
group_by(Platform,Year) %>%
summarise(Ricavi = sum(Global_Sales)) %>%
ggplot(aes(Year, Ricavi, fill=Platform ))+ geom_bar(stat="identity") +
labs( x = "anno", y = "Vendite (mln €)", title="Piattaforme per anno")+
theme(axis.text.x = element_text(angle = 90))
ggplotly(miglior_piattaforma, width = 800, height = 600)
In questo grafico a parte osservare che il mercato era in netta crescita fino al 2008, risulta difficile effettuare un confronto fra piattaforme perciò cambiamo tipo di grafico:
# migliore piattaforma per ciascun anno (alternativa)
miglior_piattaforma1 <-vgsales %>%
group_by(Year, Platform) %>%
summarise(totale=sum(Global_Sales))%>%
top_n(n=1)%>%
ggplot(aes(Year, totale, fill=Platform ))+
geom_point(shape = 19, size = 4, stroke = 0.2) +
labs( x = "anno", y = "Vendite (mln €)", title="La piattaforma di maggior successo per anno")+
theme(axis.text.x = element_text(angle = 90))
ggplotly(miglior_piattaforma1, width = 800, height = 600)
In sintesi:
2600 | GB | NES | PS | PS2 | PS3 | PS4 | SNES | Wii | X360 |
---|---|---|---|---|---|---|---|---|---|
3 | 1 | 6 | 6 | 5 | 3 | 5 | 5 | 4 | 1 |
La piattaforma che ha avuto più successo, nel senso di essere stata prima nei vari anni, è anzi sono a pari merito \(\textit{NES}\) e \(\textit{PS}\).
Cerchiamo dunque il genere di videogiochi più venduto nel mondo:
#genere di maggior successo (mondo)
top_genre<-vgsales%>%
group_by(Genre)%>%
summarise(sum = sum(Global_Sales)) %>%
ggplot(aes(Genre, sum, fill=Genre))+ geom_bar(stat="identity") +
theme(axis.text.x = element_text(angle = 90)) +
labs(x = "Genere", y = "Vendite (mln €)", title="Genere di maggior successo al mondo") +
theme(legend.position="none") # legenda ridondante
ggplotly(top_genre, width = 800, height = 600)
Dal 1980 ad 2017 il genere di videogiochi che ha più successo è senza dubbio quello dell’Azione.
Vediamo ora il genere di videogiochi più venduto fra le 4 zone geografiche che partizionano il mondo:
# zone geografiche
top_genre1<- vgsales %>%
gather("Zona", "Ricavi", c("NA_Sales", "EU_Sales", "JP_Sales", "Other_Sales")) %>%
group_by(Zona,Genre) %>%
summarise(Vendite = sum(Ricavi)) %>%
ggplot(aes(x = Zona, y = Vendite, group = Zona, fill = Genre)) +
geom_col(position = "stack") + ggtitle("I generi più venduti per zona geografica")
top_genre1
Rendiamo più leggibile il grafico andando a selezione i 5 generi più venduti per ogni zona geografica, usando la funzione di dplyr \(\textit{top_n(n= 5)}\):
#5 generi più venduti per zona geografica
top_genre2<- vgsales %>%
gather("Zona", "Ricavi", c("NA_Sales", "EU_Sales", "JP_Sales", "Other_Sales")) %>%
group_by(Zona, Genre) %>%
summarise(Vendite = sum(Ricavi)) %>%
top_n(n= 5) %>%
ggplot(aes(x = Zona, y = Vendite, group = Zona, fill = Genre)) +
geom_col() + ggtitle("I primi 5 generi più venduti per zona geografica")
top_genre2
Dunque abbiamo:
# tabella del grafico
vgsales %>%
gather("Zona", "Ricavi", c("NA_Sales", "EU_Sales", "JP_Sales", "Other_Sales")) %>%
group_by(Zona, Genre) %>%
summarise(Vendite = sum(Ricavi)) %>%
top_n(n= 5)%>%
top_n(n=1)%>%
datatable()
Nei 4 luoghi del mondo per ben 3 volte il genere Azione è campione di incassi. Visto il risultato precedente, è abbastanza naturale questo risultato.
Costruiamo un istogramma:
best_genere_anno <- vgsales %>%
group_by(Year, Genre) %>%
summarise(vendite = sum(Global_Sales)) %>%
top_n(1)
grafico<-ggplot(best_genere_anno, aes(Year, vendite, fill = Genre)) +
geom_bar(stat = "identity") +
labs( x = "Anno", y = "Vendite (mln €)", title="Genere più venduto per anno")+
theme(axis.text.x = element_text(angle = 90))
ggplotly(grafico, width = 800, height = 600)
Quasi ininterrottamente negli ultimi 16 anni il genere Azione è stato il primo posto nelle vendite. È seguito dal genere Platform e dal genere Racing (per numero di primi posti).
Cominciamo costruendo un istogramma:
d<-vgsales%>%
group_by(Year, Genre)%>%
summarise(sum = sum(Global_Sales))%>%
ggplot(mapping = aes(x = Year, y = sum))+
geom_bar(stat="identity") +
(aes(x=Year, y=sum, col = Genre)) +
theme(axis.text.x = element_text(angle = 90)) +
labs( x = "anno", y = "Vendite (mln €)")
ggplotly(d, width = 800, height = 600)
Non è molto efficace. Plottiamo allora la serie storica degli istogrammi per ciascun genere di videogioco:
# serie storica istogrammi Genere
d<-vgsales%>%
ggplot(mapping=aes(x = Genre, y = Global_Sales, fill = Genre))+
geom_col(position="stack")+
facet_wrap(~Year)+
labs(title="Serie storica per ciascun genere di videogioco", y = "Vendite", fill = "Genere")+
theme(legend.position = "bottom")+
theme(axis.text.x = element_blank(),
axis.ticks = element_blank())
ggplotly(d, width = 800, height = 600)
Poiché questi istogrammi solo utili solo qualora le vendite di un certo genere superino di gran lunga le altre (es. nel 1985 e 1988), optiamo per:
# Year è interger
vgsales$Year=as.numeric(as.character(vgsales$Year))
vgsales%>%
group_by(Year,Genre)%>%
summarise(ricavi=sum(Global_Sales))%>%
plot_ly(x=~Year,
y=~ricavi,
frame=~Genre,
#text = ~Publisher,
fill = 'tozeroy',
color=~ Genre) %>%
animation_opts(800, redraw = FALSE)%>%
animation_button(x = 1, xanchor = "right", y = 0, yanchor = "bottom") %>%
animation_slider(
currentvalue = list(prefix = "YEAR ", font = list(color="red")))
# reimpostiamo Year come factor
vgsales$Year=as.factor(vgsales$Year)
Attraverso questo grafico interattivo, possiamo confrontare anno per anno i ricavi per ciascun genere di videogiochi. Possiamo rispondere che in via approssimativa fino a al 1995 circa solamente una volta o due i ricavi dei vari genere hanno sfondato il tetto dei 20 mln. Poi il divario fra i generi è aumentato, con l’eccezione del 2016.
Per mostrarlo utilizzo il comando sqldf che permette di scrivere in linguaggio SQL, e il solito plot.ly:
glob_piatt<- sqldf("SELECT Year,
sum(NA_Sales) as N_A,
sum(EU_Sales) as UE,
sum(JP_Sales) as JP,
sum(Other_Sales) as Rimanenti,
sum(Global_Sales) as Totali
from vgsales group by Year order by Year")
# le riordino in funzione dell'area così da vederle meglio
plot_ly(y=glob_piatt$Totali,x=glob_piatt$Year, type='scatter', name='Totali',fill='tozeroy')%>%
add_trace(y=glob_piatt$N_A,x=glob_piatt$Year,name='N_A',fill='tozeroy')%>%
add_trace(y=glob_piatt$UE,x=glob_piatt$Year,fill='tozeroy',mode = 'none',name='UE')%>%
add_trace(y=glob_piatt$JP,x=glob_piatt$Year,name='JP',fill='tozeroy')%>%
add_trace(y=glob_piatt$Rimanenti,x=glob_piatt$Year,name='Rimanenti',fill='tozeroy')%>%
layout(title = "Vendite per zona geografica ")
Senza ombra di dubbio in America nel 2008.
Troviamo la risposta nel grafico seguente, a cui abbiamo rimosso, per mero fine estetico, la legenda:
# individuo gioco più venduto in ciascun anno
miglior_gioco <-vgsales %>%
group_by(Year) %>%
filter(Global_Sales== max(Global_Sales)) %>%
ggplot(aes(Year, Global_Sales, fill=Name))+ geom_point(shape = 19, size = 4, stroke = 0.2) +
labs( x = "Anno", y = "Vendite (mln €)", title="Gioco di maggior successo per anno")+
theme(axis.text.x = element_text(angle = 90)) +theme(legend.position="none")
ggplotly(miglior_gioco, width = 800, height = 600)
Qui i colori non denotato l’appartenenza ad un genere o una società. Anche in questo caso la risposta appare evidente. Osserviamo che il record lo detiene il gioco \(\textit{Wii}\) nel 2006.
Facciamo ora un’osservazione: potremmo aspettarci che a parità di anno il gioco più venduto dovrebbe ‘girare’ su un tipo di piattaforma che si colloca al primo posto, in quanto a ricavi, rispetto alle concorrenti. In effetti ciò accade sovente in questi decenni, ma non sempre. Vediamo quando ciò non avviene.
Per raggiungere lo scopo costruiremo dei sottografici di plot.ly, (riutilizziamo un grafico appena creato) e ricalcheremo il codice dell’ultimo grafico modificando unicamente il parametro \(\textit{fill}\) ponendolo uguale a ‘\(platform\)’ così da colorare \(\textbf{tutte}\) le palline sulla base della loro piattaforma. Lo scopo di tutto ciò è permettere un agevole confronto avendo ora un criterio di confronto coerente fra i 2 plot:
# sovrapposizione grafici
miglior_gioco_new <-vgsales %>%
group_by(Year) %>%
filter(Global_Sales== max(Global_Sales)) %>%
ggplot(aes(Year, Global_Sales, fill=Platform))+ geom_point(shape = 19, size = 4, stroke = 0.2) +
labs( x = "anno", y = "Vendite giochi (mln €)", title="Piattaforma e Gioco a confronto")+
theme(axis.text.x = element_text(angle = 90)) +theme(legend.position="none")
ggploty2<-ggplotly(miglior_gioco_new, width = 800, height = 600)
# ora utilizzo il package "ggplotify"
miglior_piattaforma1 <-vgsales %>%
group_by(Year, Platform) %>%
summarise(totale=sum(Global_Sales))%>%
top_n(n=1)%>%
ggplot(aes(Year, totale, fill=Platform ))+
geom_point(shape = 19, size = 4, stroke = 0.2) +
labs( x = "Anno", y = "Vendite per piattaforma (mln €)")+
theme(axis.text.x = element_text(angle = 90))
ggploty1<-ggplotly(miglior_piattaforma1, width = 800, height = 600)
p1<-subplot(ggploty1,titleY = TRUE)
p2<-subplot(ggploty2,titleY = TRUE)
subplot(hide_legend(p1), hide_legend(p2), nrows = 2, shareX = TRUE, shareY=TRUE, which_layout = "merge")
Il grafico lo leggiamo in verticale: scelto un anno qualsiasi, se le 2 palline riferite a quell’anno presentano colori diversi, allora la piattaforma che ha performato meglio in termini di vendite non è la stessa che ha venduto il gioco più ‘gettonato’ in quello stesso anno.
Ad esempio: \(\textit{Super Mario Bros.}\) è stato il gioco più venduto nel 1985 (40.24 mln di €) e ‘girava’ sulla piattaforma \(\textit{NES}\) (Nintendo Entertainment System). Ebbene la \(\textit{NES}\) risulta la Piattaforma più popolare nel 1985, con un ricavo complessivo di 53.44 mln di euro.
Ma: \(\textit{Pokemon Red/Pokemon Blue}\) è stato il gioco più venduto nel 1996, ma girava su \(\text{GB}\) (GameBoy) e non sulla \(\text{PS}\) che risulta la più popolare in quell’anno con un ricavo complessivo di 94.68 mln di euro. Lo stesso avviene anche nel 1998, 1999, e in altri anni ancora.
E’ possibile verificare quanto affermato inserendo 1996 nel textbox e ordinare per Year e Ricavi ottenendo come gioco più venduto Pokeon.
#ricavi max per gioco
tabella <- vgsales %>%
group_by(Platform, Name, Year) %>%
summarize(Ricavi = max(Global_Sales))
datatable(tabella)
Infine inserendo 1996 nel textbox notiamo che il PS è la piattaforma più gettonata in quest’anno.
#ricavi max per piattaforma
tabella1 <- vgsales %>%
group_by(Platform, Year) %>%
summarize(ricavi = sum(Global_Sales))
datatable(tabella1)
Selezioniamo le 10 (numero arbitrario ma ragionevole oltre che funzionale ad una comoda visualizzazione) aziende più forti del mercato e vediamo se c’è una più performante delle altre:
#10 aziende più fortiordinate per fatturato
top10<- vgsales %>%
group_by(Publisher)%>%
summarize(sum=sum(Global_Sales)) %>%
top_n(n= 10) %>%
arrange(desc(sum))
aziende_top10<-as.character(top10$Publisher)
datatable(top10)
Si, con un forte distacco dalle altre la Nintendo è la più forte azienda sul mercato.
Scegliamo le migliori 10 per la richiesta che valga per ogni anno questo dominio, quindi complessivamente è ragionevole ritenere che le aziende in gioco avranno ricavi fra i più elevati. Vediamo dunque come evolve nel tempo l’andamento dei ricavi delle 10 migliori aziende.
# filtra fra le 10 aziende top
# senza group = 1 non funziona
pippo<-vgsales %>%
filter(Publisher %in% aziende_top10) %>%
group_by(Publisher, Year) %>%
summarize(sum = sum(Global_Sales)) %>%
ggplot(aes(x=Year, y= sum, color= Publisher,group = 1)) + geom_line(size = 1.3)+
geom_point(alpha = 0.5, pch = 21)+
labs( x = "Anno", y = "Vendite (mln €)", title="L'azienda di maggior successo per anno")+
theme(axis.text.x = element_text(angle = 90))
ggplotly(pippo,width = 800, height = 600)
Con qualche eccezione negli anni dal \(2001-2003\) e \(2010-2011\) la Nintendo ha detiene questo primato.
Per rispondere, osserviamo come evolvono i ricavi delle 10 aziende più performanti (quelle di cui sopra), suddivisi per genere:
# ricavi nel tempo per azienda, suddivisi per genere
vgsales%>%
filter(Publisher %in% aziende_top10) %>%
plot_ly(x=~Year,
y=~log(Global_Sales),
text = ~Publisher,
color = ~Publisher,
size=~Global_Sales,
frame = ~Genre,
type="scatter",
mode="markers") %>%
animation_opts(1000, easing = "elastic", redraw = FALSE) %>%
animation_button(x = 1, xanchor = "right", y = 0, yanchor = "bottom") %>%
animation_slider(
currentvalue = list(prefix = "Anno ", font = list(color="red"))
) %>%
layout(showlegend=FALSE)
Per realizzare il grafico abbiamo rimosso la legenda così da vederlo più nel dettaglio, mentre la trasformazione logaritmica aiuta ad evidenziare meglio il fenomeno.La risposta anche in questo caso si chiarifica osservando il grafico. La Nintendo sembra prevalere sulle altre.
ris_colonne<- sapply(vgsales,is.numeric)
matrix_corr<-cor(vgsales[,ris_colonne])
graph_corr<-corrplot(matrix_corr, method="ellipse",diag = FALSE,order = "hclust",mar=c(0,0,1,0), type = "lower",title = "Correlazioni fra variabili variabili numeriche del dataset")
No, sono correlati positivamente. Inoltre sono presenti forti correlazioni fra Vendite totali e Vendite in Nord america e in Europa: è intuitivo, visto che le 3 variabli sommate danno le vendite totali nel mondo. La correlazione maggiore riguarda le vendite in Europa e quelli totali.
Le domande che ci siamo posti vertevano su diversi tipi di questioni: di piattaforma, genere, incassi per zona geografica e nel tempo, società che realizzavano i più alti guadagni. Non sono state riscontrate particolari anomalie o incoerenze logiche nei risultati ottenuti.
Natuaralmente ’analisi effettuata può svilupparsi ulteriormente appronfondendo diversi aspetti come ad esempio scoprire quali sono i fattori più importanti che determinano il volume delle vendite dei giochi (modelli di regressione), paragonare i fatturati delle aziende per zona geografica nel tempo, oppure prevedere le vendite in un mercato conoscendo le vendite in altri mercati e così via.
Con speriamo con questo lavoro abbiamo incoriosito e stuzzicato il lettore un po’ più esperto a proseguire questa indagine.
Non ho particolari talenti, sono soltanto appassionatamente curioso. - Albert Einstein
Grazie per l’attezione