O avanço das tecnologias e o surgimento das redes sociais, smartphones e tablets, tornam os videogames ainda mais populares e acessíveis a diversos públicos. O número de jogadores em todo o mundo ainda está aumentando e ultrapassará três bilhões até 2023. O mercado global de videogames deve gerar cerca de $159,3 bilhões em 2020, com um aumento anual de +9,3% (NewZoo 2020).
Para ter sucesso neste mercado competitivo, um desenvolvedor de jogos precisa saber os motivos que levam os clientes a jogar um determinado jogo e entender como manter seus jogadores envolvidos. Com a popularização da internet obter essas informações se tornou mais fácil, jogadores podem expressar sua opinião de forma livre, fornecendo feedbacks e análises que podem ser acessados por meio de redes sociais e plataformas de jogos.
Os reviews de jogos são uma fonte rica de opiniões e sentimentos do usuário, dando a outros jogadores uma ideia sobre o que esperar do jogo e influenciando de forma significativa a decisão de compra (Livingston, Nacke, and Mandryk 2011). Conforme relatado na literatura, os sentimentos expressos pelos usuários sobre diferentes aspectos do jogo têm forte correlação com a aceitação do jogo pelo usuário (A. Vieira and Brandão 2019; Strååt and Verhagen 2017), isto é, o quão satisfeito o usuário está com o jogo.
Neste contexto, abordagens de análise de sentimento foram recentemente adotadas para avaliar a aceitação de videogames pelos usuários (A. Vieira and Brandão 2019; A. de C. Vieira and Brandão 2019; Chaves 2019). A Análise de Sentimentos (AS) é um processo automatizado que usa Inteligência Artificial para analisar documentos textuais e identificar sentimentos e opiniões. Por meio de abordagens AS, é possível explorar os reviews de jogos automaticamente, identificando as taxas de aceitação do usuário contidas nessas análises. Quando um comentário expressa sentimentos e opiniões positivas, isso significa que o jogo é bem aceito. Os reviews negativos permitem que a equipe de desenvolvimento de jogos saiba quais são considerados, por alguns usuários, os pontos mais fracos de um jogo, orientando futuras decisões de design de jogos e melhorias.
Neste trabalho, a aceitação de quatro jogos da Steam é analisada, através de diferentes técnicas de Processamento de Linguagem Natural e Análise de Sentimentos. É analisada ainda a influência de determinados reviews na decisão de compra e a retenção de usuários em cada jogo. Como resultados, seremos capazes de levantar diferentes informações sobre o desempenho dos jogos com seu público e entender que aspectos dos jogos refletem esse desempenho.
Para este projeto, alguns pacotes precisaram ser instalados e importados, esses pacotes e os motivos para sua utilização são listados abaixo.
dplyr
- Manipulação avançada de estruturas de dados como Dataframes;DT
- Visualização de dados em tabelas de forma mais prática e dinâmica;rmarkdown
- Utilizado para geração do relatório;syuzhet
- Análise de sentimentos em documentos textuais;textreuse
e tm
- Processamento de texto;wordcloud
- Geração de nuvens de palavras.O conjunto de dados adotado neste trabalho é composto por reviews de jogos extraídas da Steam usando sua API Web. Esses reviews, todos em inglês, expressam o que os jogadores pensam e como se sentem sobre os jogos. Além dos comentários do review em si, são extraídas ainda outras informações relacionadas ao review e ao usuário, essas informações podem ser vistas abaixo:
O conjunto de dados está disponível em um repositório público, sem nenhum processamento, para dar aos pesquisadores a liberdade de escolher quais etapas de pré-processamento são mais adequadas às suas pesquisas.
A base de dados está disposta em um arquivo CSV, onde cada linha equivale a um comentário. Esse csv é lido a partir do comando read.csv
e carregadas em um dataframe.
dataset = as.data.frame(read.csv("/home/larissa/workspace/analise-dados-steam/steam_reviews.csv"))
dataset$review <- as.character(dataset$review)
dataset$raw <- dataset$review
Para fins de melhor visualização da análise, e diminuição do custo computacional da execução da análise, alguns jogos foram selecionados, onde apenas os reviews desses serão analisados. Os jogos selecionados podem ser vistos na tabela abaixo
jogos_qt = arrange(aggregate(review~title, FUN=length, data=dataset), desc(review))[5:8,]
names = as.vector(jogos_qt[,"title"])
data = dataset[dataset$title %in% names,]
datatable(jogos_qt)
A base de dados carregada é composta por 434891 reviews, onde 44767 foram selecionados para este trabalho. A base de dados pode ser vista na tabela abaixo. Para fins de melhor visualização, os comentários com mais de 200 caracteres foram filtrados.
datatable(filter(data, nchar(review) < 200))
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html
Uma das etapas mais fundamentais na classificação de textos é o pré-processamento dos documentos textuais, que inclui a limpeza dos dados textuais, que removerá informações irrelevantes e quaisquer outros ruídos que possam piorar o entendimento e análise dos documentos. Para ilustrar cada etapa do préprocessamento, um comentário significativo foi selecionado para demonstrar o efeito de cada um dos passos executados:
review | |
---|---|
219 | 1 Hooked a few pigs. 2 Repeated. 10/10 whould hook again.But serously its an really fun game that has a lot of replayability and ways to inprove. Strongly recommend this game.PS I WAS IN BETA |
Neste trabalho, as seguintes etapas foram realizadas para o pré-processamento dos dados.
Uma abordagem básica no pré-processamento de textos e de grande impacto, foi adotada neste trabalho: a conversão de todas as letras maiúsculas dos documentos em minúsculas. Essa conversão elimina o problema de termos que, apesar de iguais, são considerados diferentes por algoritmos, como “jogo” e “Jogo”.
data$review <- sapply(data$review, tolower)
review | |
---|---|
219 | 1 hooked a few pigs. 2 repeated. 10/10 whould hook again.but serously its an really fun game that has a lot of replayability and ways to inprove. strongly recommend this game.ps i was in beta |
Todos os caracteres especiais dos documentos foram removidos, como pontuação, símbolos e dígitos. No nosso contexto, esses caracteres não são significativos e não indicam polaridade de sentimentos, sendo totalmente descartáveis. Além disso, espaços em brancos desnecessários também são removidos.
removeNumPunct <- function(x){
x = gsub("[^[:alnum:]]", " ",x)
return (stripWhitespace(x))
}
data$review <- sapply(data$review, removePunctuation)
data$review <- sapply(data$review, removeNumbers)
data$review <- sapply(data$review, removeNumPunct)
review | |
---|---|
219 | hooked a few pigs repeated whould hook againbut serously its an really fun game that has a lot of replayability and ways to inprove strongly recommend this gameps i was in beta |
Stop words são palavras consideradas pouco significativas, que ocorrem com alta frequência em um documento (Kaur and Buttar 2018), como conjunções, determinantes e preposições. A frequência desses termos podem dificultar a análise dos documentos, sendo, por isso, removidos.
data$review <- sapply(data$review, removeWords, words=stopwords('english'))
data$review <- sapply(data$review, stripWhitespace)
review | |
---|---|
219 | hooked pigs repeated whould hook againbut serously really fun game lot replayability ways inprove strongly recommend gameps beta |
Por fim, a base de dados já processada conta com um total de 44767 documentos e 72105 palavras únicas, contendo dados mais representativos, o que facilitará significativamente a análise dos mesmos.
Através dos dados contidos na base de dados, podemos obter algumas informações referentes a aceitação dos jogos analisados pelos usuários. Para melhor visualização, nos gráficos os jogos serão representados por uma string de identificação (ID). O mapeamento entre os jogos e o ID pode ser visto na tabela abaixo.
#Retorna um dataframe com o número de recomendações positivas e negativas de cada jogo
get_polaridade <- function(data){
recomendacao <- count(group_by(data, title), recommendation)
recomendacao <- spread(recomendacao, key=recommendation, value=n)
return(recomendacao)
}
recomendacao = get_polaridade(data)
title = as.character(unlist(recomendacao["title"]))
jogos_id = paste("Jogo ",c(1:length(title)))
data.frame(Jogo=title, ID=jogos_id)
Jogo | ID |
---|---|
ASTRONEER | Jogo 1 |
Dead by Daylight | Jogo 2 |
MONSTER HUNTER: WORLD | Jogo 3 |
The Elder Scrolls V: Skyrim Special Edition | Jogo 4 |
Na figura, podemos ter uma visão geral do número de reviews positivos e negativos para cada jogo. Esses números são importantes para entender se há aceitação do jogo pelo seu público.
classes = c("Positivo", "Negativo")
colors = c("#B100AD", "#48AEAC")
#Separa os reviews positivos e negativos
pos = as.integer(unlist(recomendacao["Recommended"]))
neg = as.integer(unlist(recomendacao["Not Recommended"]))
#Remove NAs
pos[is.na(pos)] <- 0
neg[is.na(neg)] <- 0
#Constrói Matriz
Values <- matrix(c(pos, neg), nrow = 2, ncol = length(pos), byrow = TRUE)
#Plota Valores
plot = barplot(Values, beside=T, col=colors, names.arg = jogos_id,
main="Número de Reviews Positivos e Negativos por Jogo", ylim=c(0,20000))
#Adiciona texto e legenda
text(plot, Values + 2000, Values)
legend("topright",legend=classes, pch=15, col=colors)
Para todos os jogos analisados o número de reviews positivos é significativamente maior que o número de reviews negativos. Isso demonstra que o número de jogadores ao qual os jogos teve uma boa aceitação é maior que o os que não tiveram, chegando a conclusão de que os jogos foram bem aceitos pelo seu público.
Alguns jogos (Jogo 2 e Jogo 3) alcançaram um número expresssivamente maior de reviews positivos. Apesar disso, não podemos concluir ainda que que esses jogos tiveram uma maior aceitação em comparação com os demais jogos, tendo em vista que esses valores são proporcionais a quantidade de reviews, logo jogos com mais reviews, provavelmente terão maior número de reviews positivos. A proporção de reviews positivos pode ser uma medida mais útil para avaliar e comparar a aceitação dos jogos, a proporção de reviews positivos em cada jogo pode ser visto no gráfico abaixo.
#Calcula Proporção
prop_pos = pos/(pos+neg)
barplot(prop_pos, beside=T,names.arg=jogos_id, col=rainbow(length(pos)), ylim=c(0,1),
main="Proporção de Reviews Positivos por Jogo")
Através do gráfico, podemos observar como, apesar de ter relativamente menos reviews positivos, o Jogo 1 (ASTRONEER) teve uma maior aceitação entre o público.
Através das horas jogadas pelo jogador, é possível entender se há a retenção dos jogadores em cada jogo. As horas jogadas pelo jogador foram dividas em intervalos afim de entender se os jogos conseguem manter seus jogadores, o que é diretamente ligado com a aceitação do jogo, tendo em vista que o usuário tende a não se engajar por muito tempo em produtos ao qual não aceita. No gráfico, é possível observar os intervalos de horas jogadas para cada jogo, uma escala logarítima foi adotada para melhor visualização.
colunas <- c("até 100", "até 500","até 1000", "até 5000", "Acima de 5000")
tempo <- function(hour_played){
if(hour_played <= 100){
return (colunas[1])
}else if(hour_played > 100 & hour_played <= 500){
return (colunas[2])
}else if(hour_played > 500 & hour_played <= 1000) {
return (colunas[3])
}else if(hour_played > 1000 & hour_played <= 5000){
return (colunas[4])
}else if(hour_played > 5000){
return (colunas[5])
}
}
data <- mutate(data, hour=lapply(data$hour_played, FUN=tempo))
tempo_intervalo <- count(group_by(data, hour), title)
tempo_intervalo <- spread(tempo_intervalo, key=hour, value=n)
Values = matrix(as.matrix(tempo_intervalo[,2:6]), nrow = ncol(tempo_intervalo)-1, ncol = length(pos), byrow = TRUE)
barplot(Values, beside=T, names.arg = jogos_id, col=rainbow(ncol(tempo_intervalo)-1),
main="Horas Jogadas por Jogador", log="y")
legend("topright",legend=colunas, pch=15, col=rainbow(ncol(tempo_intervalo)-1))
Através do gráfico, podemos observar como todos os jogos tiveram uma boa retenção de usuário, onde em todos os casos, os intervalos “Até 1000” e “Até 5000” tiveram a maior frequência. Os Jogos 1 e 4 ainda obtiveram, relativamente, uma maior retenção, tendo em vista que a frequência dos menores intervalos (“Até 100” e “Até 500”), foi expressivamente menor, enquanto nos demais jogos houve um certo equilíbrio.
Reviews são um dos maiores parâmetros para possíveis compradores decidirem comprar ou não um produto, tendo uma alta influência sobre os jogadores. Através do atributo “helpful”, analisaremos o que caracteriza os reviews que influenciam os jogadores ou os reviews “úteis”. Esses reviews podem ser consideradas fontes mais ricas para compreender o comportamento do usuário e suas escolhas, além de refletirem melhor a opinião dos usuários sobre o produto.
#Filtrando e selecionando os documentos textuais de cada classe
helpful_raw = select(filter(data, helpful>=100), raw)
not_helpful_raw = select(filter(data, helpful<100),raw)
info <- c("Quantidade de Reviews", "Média de Palavras por Review", "Média de Sentenças por Reviews", "Proporção de Reviews Curtos", "Proporção de Reviews Longos")
#Calcula Média de Palavras por Documento
helpful_raw <- mutate(helpful_raw, w_tokens=lapply(helpful_raw$raw, FUN=tokenize_words))
not_helpful_raw <- mutate(not_helpful_raw, w_tokens=lapply(not_helpful_raw$raw, FUN=tokenize_words))
helpful_raw <- mutate(helpful_raw, nw_tokens =lapply(helpful_raw$w_tokens, FUN=length))
not_helpful_raw <- mutate(not_helpful_raw, nw_tokens =lapply(not_helpful_raw$w_tokens, FUN=length))
helpful_raw$nw_tokens <- as.numeric(helpful_raw$nw_tokens)
not_helpful_raw$nw_tokens <- as.numeric(not_helpful_raw$nw_tokens)
#Quantidade de Comentários Curtos e Longos
helpful_curtos <- (nrow(helpful_raw[helpful_raw$nw_tokens<5,]) / nrow(helpful_raw)) * 100
helpful_longos <- (nrow(helpful_raw[helpful_raw$nw_tokens>20,]) / nrow(helpful_raw)) * 100
not_helpful_curtos <- (nrow(not_helpful_raw[not_helpful_raw$nw_tokens<5,]) / nrow(not_helpful_raw)) * 100
not_helpful_longos <- (nrow(not_helpful_raw[not_helpful_raw$nw_tokens>20,]) / nrow(not_helpful_raw)) * 100
#Calcula Média de Sentenças por Documento
helpful_raw <- mutate(helpful_raw, s_tokens=lapply(helpful_raw$raw, FUN=tokenize_sentences))
not_helpful_raw <- mutate(not_helpful_raw, s_tokens=lapply(not_helpful_raw$raw, FUN=tokenize_sentences))
helpful_raw <- mutate(helpful_raw, ns_tokens =lapply(helpful_raw$s_tokens, FUN=length))
not_helpful_raw <- mutate(not_helpful_raw, ns_tokens =lapply(not_helpful_raw$s_tokens, FUN=length))
helpful_raw$ns_tokens <- as.numeric(helpful_raw$ns_tokens)
not_helpful_raw$ns_tokens <- as.numeric(not_helpful_raw$ns_tokens)
#Constrói Matriz
helpful_info <- as.integer(c(nrow(helpful_raw), mean(helpful_raw$nw_tokens), mean(helpful_raw$ns_tokens), helpful_curtos, helpful_longos))
not_helpful_info <- as.integer(c(nrow(not_helpful_raw), mean(not_helpful_raw$nw_tokens), mean(not_helpful_raw$ns_tokens), not_helpful_curtos, not_helpful_longos))
Values <- matrix(c(helpful_info, not_helpful_info), nrow = 2, ncol = length(info), byrow = TRUE)
tb <- data.frame(Informação=info, Útil=helpful_info, Inútil=not_helpful_info)
knitr::kable(tb, position="center")
Informação | Útil | Inútil |
---|---|---|
Quantidade de Reviews | 52 | 44715 |
Média de Palavras por Review | 306 | 60 |
Média de Sentenças por Reviews | 14 | 3 |
Proporção de Reviews Curtos | 0 | 17 |
Proporção de Reviews Longos | 80 | 50 |
Através da tabela podemos observar como os reviews úteis alcançaram uma maior média de palavras e sentenças por review, além de apresentarem quase 80% de reviews longos e 0% de reviews curtos, enquanto os reviews não úteis apresentaram apenas 50% de reviews longos e 17% de reviews curtos, isso implica que reviews longos e mais detalhados apresentam uma maior chance de influenciar a compra ou não compra do produto.
Nesta seção, analisaremos de forma mais detalhada o desempenho de cada jogo.
Nos gráficos abaixo, são exibidos o número de reviews positivos e negativos ao longo dos anos. Através deles, é possível observar como o desempenho dos jogos variou e entender como as mudanças, ou a falta delas, pode ter afetado a aceitação do jogo pelos usuários. Os valores do ano de 2019 foram desconsiderados, tendo em vista que a coleta dos dados se deu no início desse ano.
get_year <- function(date){
date <- as.Date(date,'%Y-%m-%d')
year <- as.numeric(format(date,'%Y'))
return (year)
}
date_plot <- function(data){
titulo = data$title[1]
data$year = as.integer(lapply(data$date_posted, get_year))
recomendacao <- count(group_by(data, year), recommendation)
recomendacao <- spread(recomendacao, key=recommendation, value=n)
pos = as.integer(unlist(recomendacao["Recommended"]))
neg = as.integer(unlist(recomendacao["Not Recommended"]))
tam = length(pos)-1
Values <- matrix(c(pos[1:tam], neg[1:tam]), nrow = 2, ncol = tam, byrow = TRUE)
par(cex=0.75)
plot = barplot(Values, beside=T, col=colors, names.arg = recomendacao$year[1:tam],
main=paste("Reviews do Jogo ", titulo, "ao Longo dos Anos"))
legend("topright",legend=c("Positivo", "Negativo"), pch=15, col=colors)
}
O jogo ASTRONEER teve uma alta em seu número de reviews e de reviews positivos em 2017, porém após isso houve uma queda significativa, o que indica que há uma necessidade de uma análise mais profunda para entender que pontos podem ter resultado na queda.
date_plot(data[data$title==names[3],])
O jogo Dead by Daylight apresentou um bom desempenho ao longo do tempo, onde tanto o número de reviews no geral, quanto o número de reviews positivos tiveram um crescimento expressivo, mostrando que a aceitação do jogo está cada vez melhor.
date_plot(data[data$title==names[1],])
Não foi possível fazer a análise, pois o jogo foi lançado recentemente.
date_plot(data[data$title==names[2],])
O jogo The Elder Scrolls V: Skyrim Special Edition, que como foi destacado nas análises anteriores, já possuia uma aceitação relativamente baixa, teve um grande decaimento na aceitação, onde oem 2018 o jogo foi fortemente rejeitado pelos jogadores, tendo um número de reviews negativos expressivamente maior que positivos.
date_plot(data[data$title==names[4],])
Para analisar mais detalhadamente os tópicos discutidos pelos usuários, os bigramas mais frequentes em cada classe são exibidos na Figura abaixo. Através na nuvem de palavras gerada podemos observar pontos pertinentes (tanto positivos, quanto negativos) analisados pelos jogadores.
cloud_plot <- function(data){
data_pos_string <- paste(data[data$recommendation == "Recommended", "review"], sep = " ", collapse = " ")
data_neg_string <- paste(data[data$recommendation == "Not Recommended", "review"], sep = " ", collapse = " ")
#Tokenizando
BigramTokenizer <- function(x){
return(unlist(lapply(ngrams(words(x), 2), paste, collapse = " "), use.names = FALSE))
}
#Criando Matriz de Termos do Documento
corpus_data <- removeNumPunct(c(data_pos_string, data_neg_string))
corpus <- VCorpus(VectorSource(corpus_data))
tdm <- TermDocumentMatrix(corpus, control = list(tokenize = BigramTokenizer))
tdm_clean <- as.matrix(removeSparseTerms(tdm, 0.8))
colnames(tdm_clean) <- classes
#Gerando nuvem de palavras
par(cex=0.75)
comparison.cloud(tdm_clean,max.words=300,random.order=FALSE,scale=c(2,.3), title.size=1.4)
}
A possibilidade de exploração do mundo (“exploration game”, “space exploration”, “open world” e “like minecraft”) foi o principal ponto positivo destacado pelos jogadores sobre o jogo ASTRONEER. Enquanto nos reviews negativos, os termos de privacidade parecem preocupar os jogadores (“privacy policy”, “additional terms” e “terms condition”).
cloud_plot(data[data$title==names[3],])
Através dos tópicos levantados sobre o jogo Dead by Daylight, podemos observar como um dos principais tópicos positivos levantados pelos jogadores, é a possibilidade de jogar com amigos, isso pode ser visto a partir de termos como “friends good”, “friends game”, “playing friends” e “especially friends”. Entre os pontos negativos, encontram-se reclamações sobre bugs do jogo (“game breaking” “gamefailed join” “join gamefailed”) e a dificuldade do jogo (“win hard”, “unbalanced game”, “broken game” e “pay win”)
cloud_plot(data[data$title==names[1],])
Alguns dos principais tópicos positivos levantados pelos jogadores sobre o jogo MONSTER HUNTER: WORLD foram relacionados ao contéudo grátis oferecido pelo jogo (“free dlc” e “free content”), aparência (“looks great” e “game beautiful”) e variedade de armas (“weapon types”, “weapons armor” e “different weapon”). O maior problema demonstrou ser os bugs do jogo (“disconnect disconnect”, “communication error”, “error mw”, “mw error”, “error code”).
cloud_plot(data[data$title==names[2],])
Os principais tópicos positivos levantados pelo jogadores de The Elder Scrolls V: Skyrim Special Edition são os conteúdos gratuitos oferecidos pelo jogo (“received free”, “free best”, “free upgrade”, “free one” e “free looks”) e os bons gráficos dos jogos (“better graphics”, “updated graphics” e “graphics update”). Já nos pontos negativos, os mods pagos se destacam (“paid mods”).
cloud_plot(data[data$title==names[4],])
Apesar da polaridade do sentimento (positivo x negativo) dizer muito sobre o que os usuários pensam e sentem, é necessário uma análise mais detalhada para entender que sentimentos em específico estão dentro desses reviews. Para entender melhor o que os usuários expressão nesses comentários, iremos usar o pacote syuzhet
para analisar a proporção dos sentimentos contidos nas classes da base de dados.
sentiment_plot <- function(data)
{
sentimentos_labels <- c("Raiva", "Antecipação", "Nojo", "Medo", "Alegria", "Tristeza", "Surpresa","Confiança", "Negativo", "Positivo")
titulo = data$title[1]
s <- get_nrc_sentiment(data$review, language="english")
s <- as.integer((colSums(s)/sum(s))*100)
par(cex=0.75)
plot = barplot(s[1:8],las=2,col=rainbow(10), name=sentimentos_labels[1:8],
main=paste("Sentimentos Expressos nos Reviews do Jogo ", titulo),
ylab="Número de Sentenças")
text(plot,s[1:8]-2,s[1:8])
}
O jogo teve um ótimo desempenho em relação aos sentimentos expressos pelos jogadores. Sentimentos positivos são altamente frequentes, enquanto sentimentos negativos são quase inexistentes.
sentiment_plot(data[data$title==names[3],])
## Warning: `filter_()` is deprecated as of dplyr 0.7.0.
## Please use `filter()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
## Warning: `group_by_()` is deprecated as of dplyr 0.7.0.
## Please use `group_by()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
## Warning: `data_frame()` is deprecated as of tibble 1.1.0.
## Please use `tibble()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
O jogo apresentou um alto número de sentimentos positivos como antecipação, alegria e confiança. Apresentou também, em número menor, porém ainda expressivo, sentimentos negativos como raiva e nojo. A existência do sentimento medo assume um novo contexto, tendo em vista que se trata de um jogo de terror, podendo ser considerado então um sentimento positivo.
sentiment_plot(data[data$title==names[1],])
O jogo apresentou um alto número de sentimentos positivos como antecipação, alegria e confiança. Sentimentos negativos como raiva e nojo, estão em menor número. O sentimento de medo tem grande presença, porém esse sentimento assume um novo contexto, tendo em vista que se trata de um jogo de terror, podendo ser considerado então um sentimento positivo.
sentiment_plot(data[data$title==names[2],])
O jogo apresentou um alto número de sentimentos positivos como antecipação, alegria e confiança. Apresentou também, em número menor, porém ainda expressivo, sentimentos negativos como raiva, nojo e tristeza.
sentiment_plot(data[data$title==names[4],])
Neste trabalho, através de uma base de dados da Steam, avaliamos a aceitação de jogos. Quatro jogos foram selecionados para uma análise detalhada do desempenho com seus jogadores: ASTRONEER, Dead by Daylight, MONSTER HUNTER: WORLD e The Elder Scrolls V: Skyrim Special Edition.
Através de uma análise geral no número de reviews positivos e negativos dos quatro jogos, podemos ver que de modo geral todos eles foram bem aceitos pelo público. Apesar de alguns jogos alcançarem um número expressivamente maior de reviews positivos, foi necessária uma análise da proporção desses reviews para chegar a conclusão de que o jogo ASTRONEER obteve uma maior aceitação, este mesmo jogo também foi responsável pela maior retenção de jogadores, tendo em vista que o número de usuário que passaram muitas horas jogando é expressivamente maior que os que passaram poucas horas.
Analisando cada jogo em específico, podemos chegar em mais algumas conclusões sobre seus desempenhos:
Apesar de uma queda no seu desempenho no ano de 2018, o jogo ainda apresenta um alto número de reviews, mais especificamente positivos.
Um dos pontos mais valorizados pelos jogadores é o fato do jogo ter um mundo aberto que permite exploração. Os termos de privacidade no entanto demonstraram ser um ponto negativo para os jogadores.
O jogo teve um ótimo desempenho em relação aos sentimentos expressos pelos jogadores. Onde houve uma grande proporção de sentimentos psoitivos (antecipação, alegria e confiança), e um número muito pequeno de sentimentos negativos (se destacando medo e tristeza.
Dead by Daylight:
Ao longo dos anos, o desempenho do jogo foi crescente, aumentando tanto o número de reviews no geral, quanto o número de reviews positivos, indicando que o jogo está cada vez mais atraindo e agradando os jogadores.
Os usuários apreciam muito como o jogo pode ser divertido para jogar com amigos, porém acreditam que a dificuldade do jogo é muito alta, e bugs são frequentes.
Apesar de haver um número relativamente alto de sentimentos negativos expressos no review (principalmente raiva e tristeza), o número de sentimentos positivos se sobressaiu (se destacando a antecipação). Apesar do sentimento medo ser muito frequente, esse sentimento assume um contexto positivo, tendo em vista que se trata de um jogo de terror.
MONSTER HUNTER: WORLD:
Devido ao pouco tempo de lançamento do jogo, não foi pessível analisar a evolução do desempenho do mesmo.
Apesar dos jogadores reclamarem de muitos bugs, alguns pontos positivos foram levantados, como a diversidade de armas, os contéudos disponibilizados de forma gratuita e a aparência do jogo.
Mesmo com alguns pontos positivos, o desempenho em relação aos sentimentos expressos foi baixo, onde, apesar dos sentimentos positivos serem predominantes, sentimentos de polaridade negativa apareceram com alta frequência.
The Elder Scrolls V: Skyrim Special Edition:
O jogo apresentou o pior desemenho entre os jogos analisados, onde com o tempo o número de jogadores e de avaliações cairam significativamente, chegando a reijeição em 2018.
Apesar da queda de desempenho, o jogo recebeu alguns elogios devido aos contéudos disponibilizados de forma gratuita e a qualidade dos gráficos.
Além disso, de modo geral, os sentimentos de polaridade positiva (antecipação, alegria e confiança) foram predominantes, existindo porém uma alta frequência nos sentimentos negativos (medo, raiva e nojo).
Podemos concluir que de modo geral, o jogo ASTRONEER obteve um melhor desempenho entre o seu público, apesar de ter sido um jogo menos popular que os demais.
Através da análise podemos encontrar os principais acertos e erros de cada jogo, o que pode ser útil para desenvolvedores e empresas da área entenderem como melhorar a aceitação de seus produtos.
Apesar da análise da evolução do desempenho ao longo dos anos ser útil, ela precisa ser melhorada. É necessário entender em que períodos ocorreram mudanças no jogo para que essa análise seja melhor interpretada. Além disso, as núvens de palavras podem ser aperfeiçoadas, através da adoção de métodos estatísticos para seleção de palavras mais significativas. Essas melhorias devem ser adotadas em trabalhos futuros.
Chaves, Francisco Miguel Duarte Pinheiro Ramos. 2019. “Video Game Success and Consumer Acceptance: A Sentiment Classification of Gamer Reviews.” PhD thesis.
Kaur, Jashanjot, and P Kaur Buttar. 2018. “A Systematic Review on Stopword Removal Algorithms.” Int. J. Futur. Revolut. Comput. Sci. Commun. Eng 4 (4).
Livingston, Ian, Lennart Nacke, and Regan Mandryk. 2011. “The Impact of Negative Game Reviews and User Comments on Player Experience.” Proceedings - Sandbox 2011: ACM SIGGRAPH Video Game, August. https://doi.org/10.1145/2037692.2037697.
NewZoo. 2020. “Global Games Market Report.” https://newzoo.com/insights/trend-reports/newzoo-global-esports-market-report-2020-light-version/.
Strååt, Björn, and Harko Verhagen. 2017. “Using User Created Game Reviews for Sentiment Analysis: A Method for Researching User Attitudes.” In GHITALY@ Chitaly.
Vieira, Augusto, and Wladmir Brandão. 2019. “Evaluating Acceptance of Video Games Using Convolutional Neural Networks for Sentiment Analysis of User Reviews.” In Proceedings of the 30th Acm Conference on Hypertext and Social Media, 273–74.
Vieira, Augusto de Castro, and Wladmir Cardoso Brandão. 2019. “GA-Eval: A Neural Network Based Approach to Evaluate Video Games Acceptance.” In Proceedings of the 18th Brazilian Symposium on Computer Games and Digital Entertainment, 595–98. SBGAMES’19. Rio de Janeiro, Brazil.