A indústria de jogos digitais tem crescido exponencialmente nas últimas décadas. A plataforma Steam, da Valve, é uma das principais vitrines para jogos de PC no mundo.
Esta análise tem como objetivo explorar o dataset “Steam Games, Reviews, and Rankings”, disponível no Kaggle. Investigaremos padrões de lançamento ao longo dos anos, a distribuição de preços e quais desenvolvedoras possuem maior presença na plataforma.
O fluxo de trabalho seguirá as etapas de:
Para garantir a reprodutibilidade desta análise, listamos abaixo as bibliotecas utilizadas e suas respectivas versões, baseadas no ambiente de execução (R versão 4.5.1):
Esta seção detalha o processo de aquisição, descrição e limpeza dos dados utilizados nesta análise.
Os dados foram obtidos do dataset “Steam Games, Reviews, and Rankings”, disponível publicamente. O dataset foi coletado a partir do Kaggle neste link.
O dataset original contém três arquivos principais:
games_description.csv: Informações
detalhadas sobre os jogos, incluindo descrições, requisitos do sistema e
avaliações.steam_game_reviews.csv: Avaliações dos
usuários, incluindo horas jogadas e recomendações.games_ranking.csv: Rankings dos jogos
por gênero, baseados em vendas, receita e avaliações.O dataset original possui mais de 990.000 linhas de dados, apresentando algumas peculiaridades como valores ausentes e exclusão de jogos com conteúdo restrito.
Primeiramente, realizamos a leitura dos arquivos CSV originais.
games_desc <- read.csv("dataset/games_description.csv")
reviews <- read.csv("dataset/steam_game_reviews.csv")
rankings <- read.csv("dataset/games_ranking.csv")A estrutura inicial dos dados carregados apresenta diversas colunas que necessitam de formatação ou não serão utilizadas na análise.
## Rows: 290
## Columns: 13
## $ name <chr> "Black Myth: Wukong", "Counter…
## $ short_description <chr> "Black Myth: Wukong is an acti…
## $ long_description <chr> "About This Game\n\t\t\t\t\t\t…
## $ genres <chr> "['Mythology', 'Action RPG', '…
## $ minimum_system_requirement <chr> "['Requires a 64-bit processor…
## $ recommend_system_requirement <chr> "['Requires a 64-bit processor…
## $ release_date <chr> "19 Aug, 2024", "21 Aug, 2012"…
## $ developer <chr> "['Game Science']", "['Valve']…
## $ publisher <chr> "['Game Science']", "['Valve']…
## $ overall_player_rating <chr> "Overwhelmingly Positive", "Ve…
## $ number_of_reviews_from_purchased_people <chr> "(654,820)", "(8,313,603)", "(…
## $ number_of_english_reviews <chr> "51,931", "2,258,990", "51,920…
## $ link <chr> "https://store.steampowered.co…
## Rows: 992,153
## Columns: 8
## $ review <chr> "The game itself is also super fun. The PvP and the cam…
## $ hours_played <chr> "39.9", "91.5", "43.3", "16.8", "24.0", "73.8", "26.0",…
## $ helpful <chr> "1,152", "712", "492", "661", "557", "1,090", "1,615", …
## $ funny <chr> "13", "116", "33", "15", "4", "13", "18", "2", "13", "6…
## $ recommendation <chr> "Recommended", "Recommended", "Recommended", "Recommend…
## $ date <chr> "14 September", "13 September", "14 September", "14 Sep…
## $ game_name <chr> "Warhammer 40,000: Space Marine 2", "Warhammer 40,000: …
## $ username <chr> "Sentinowl\n224 products in account", "userpig\n248 pro…
## Rows: 672
## Columns: 4
## $ game_name <chr> "Counter-Strike 2", "Warhammer 40,000: Space Marine 2", "Cyb…
## $ genre <chr> "Action", "Action", "Action", "Action", "Action", "Action", …
## $ rank_type <chr> "Sales", "Sales", "Sales", "Sales", "Sales", "Sales", "Sales…
## $ rank <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…
games_descNesta etapa, removemos colunas desnecessárias para a análise, filtramos jogos com avaliações inconsistentes e limpamos os caracteres especiais das colunas de texto.
# Remover colunas desnecessárias
games_desc <- games_desc %>%
select(-minimum_system_requirement, -recommend_system_requirement, -link,
-release_date, -number_of_english_reviews, -number_of_reviews_from_purchased_people)
# Remover jogos com pouquíssimos reviews (onde o valor é descritivo e não uma categoria)
games_desc <- games_desc[!grepl("user reviews", games_desc$overall_player_rating), ]
# Renomear coluna para manter padrão
games_desc <- games_desc %>%
rename(game_name = name)
# Converter rating para fator
games_desc$overall_player_rating <- as.factor(games_desc$overall_player_rating)
# Limpeza de caracteres especiais ([ ] e ') e separação de gêneros
games_desc <- games_desc %>%
mutate(
genres = str_replace_all(genres, "\\[|\\]|'", ""),
developer = str_replace_all(developer, "\\[|\\]|'", ""),
publisher = str_replace_all(publisher, "\\[|\\]|'", "")
) %>%
separate_rows(genres, sep = ",") %>%
rename(genre = genres)
# Padronização de texto (espaços e minúsculas)
games_desc$genre <- trimws(games_desc$genre)
games_desc$genre <- tolower(games_desc$genre)
games_desc$developer <- trimws(games_desc$developer)
games_desc$developer <- tolower(games_desc$developer)
games_desc$publisher <- trimws(games_desc$publisher)
games_desc$publisher <- tolower(games_desc$publisher)rankingsAjustamos os tipos de dados e padronizamos a coluna de gênero.
reviewsRemovemos dados nulos e colunas de data, além de tratar as colunas numéricas que continham vírgulas e converter recomendações para fator.
# Remover coluna de data
reviews <- reviews %>%
select(-date)
# Remover linhas onde o review é nulo (aplicado duas vezes para garantir integridade)
reviews <- reviews %>%
filter(!is.na(review)) %>%
filter(!is.na(review))
# Tratamento das colunas
reviews$recommendation <- as.factor(reviews$recommendation)
# Limpeza e conversão de Hours Played
reviews$hours_played <- trimws(reviews$hours_played)
reviews$hours_played <- gsub(",", "", reviews$hours_played)
reviews$hours_played <- as.numeric(reviews$hours_played)
# Limpeza e conversão de Funny
reviews$funny <- trimws(reviews$funny)
reviews$funny <- gsub(",", "", reviews$funny)
reviews$funny <- as.numeric(reviews$funny)
# Limpeza e conversão de Helpful
reviews$helpful <- trimws(reviews$helpful)
reviews$helpful <- gsub(",", "", reviews$helpful)
reviews$helpful <- as.numeric(reviews$helpful)Abaixo apresentamos a estrutura final dos dados prontos para a análise exploratória.
## Rows: 5,427
## Columns: 7
## $ game_name <chr> "Black Myth: Wukong", "Black Myth: Wukong", "Bla…
## $ short_description <chr> "Black Myth: Wukong is an action RPG rooted in C…
## $ long_description <chr> "About This Game\n\t\t\t\t\t\t\tBlack Myth: Wuko…
## $ genre <chr> "mythology", "action rpg", "action", "rpg", "sou…
## $ developer <chr> "game science", "game science", "game science", …
## $ publisher <chr> "game science", "game science", "game science", …
## $ overall_player_rating <fct> Overwhelmingly Positive, Overwhelmingly Positive…
## Rows: 992,150
## Columns: 7
## $ review <chr> "The game itself is also super fun. The PvP and the cam…
## $ hours_played <dbl> 39.9, 91.5, 43.3, 16.8, 24.0, 73.8, 26.0, 47.9, 46.0, 6…
## $ helpful <dbl> 1152, 712, 492, 661, 557, 1090, 1615, 355, 678, 755, 29…
## $ funny <dbl> 13, 116, 33, 15, 4, 13, 18, 2, 13, 63, 35, 7, 104, 419,…
## $ recommendation <fct> Recommended, Recommended, Recommended, Recommended, Rec…
## $ game_name <chr> "Warhammer 40,000: Space Marine 2", "Warhammer 40,000: …
## $ username <chr> "Sentinowl\n224 products in account", "userpig\n248 pro…
## Rows: 672
## Columns: 4
## $ game_name <chr> "Counter-Strike 2", "Warhammer 40,000: Space Marine 2", "Cyb…
## $ genre <chr> "action", "action", "action", "action", "action", "action", …
## $ rank_type <fct> Sales, Sales, Sales, Sales, Sales, Sales, Sales, Sales, Sale…
## $ rank <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 1…
Nesta seção, investigamos as relações entre as variáveis tratadas para responder a perguntas sobre a popularidade de gêneros, o comportamento dos jogadores em relação ao tempo de jogo e a distribuição das avaliações na plataforma.
Como um jogo pode possuir múltiplos gêneros (devido ao uso de
separate_rows na etapa de limpeza), analisamos quais
categorias são mais prevalentes na Steam.
# Contagem dos 15 gêneros mais comuns
top_genres <- games_desc %>%
filter(!is.na(genre) & genre != "") %>%
count(genre, sort = TRUE) %>%
head(15)
# Visualização
ggplot(top_genres, aes(x = reorder(genre, n), y = n)) +
geom_col(fill = "#2c3e50") +
coord_flip() +
labs(title = "Top 15 Gêneros Mais Comuns na Steam",
x = "Gênero",
y = "Quantidade de Jogos",
caption = "Fonte: Dataset Steam Games") +
theme_minimal() +
theme(plot.title = element_text(face = "bold", size = 14))Análise: Ao observar o gráfico de distribuição, notamos um fato interessante sobre a categorização na Steam: as tags mais frequentes referem-se a modos de jogo e não necessariamente a gêneros temáticos. “Singleplayer” lidera com folga, seguido por “Multiplayer”. Entre os gêneros propriamente ditos, “Action” é o mais comum, seguido de “Simulation” e “Adventure”. Diferente de análises que focam puramente em “Indie” (que aparece apenas na 13ª posição neste gráfico específico), os dados mostram que a característica definidora da maioria dos jogos na plataforma é a experiência para um único jogador.
Identificamos quais desenvolvedores possuem o maior número de títulos cadastrados no dataset.
# Filtrando desenvolvedores vazios e contando
top_devs <- games_desc %>%
filter(developer != "" & !is.na(developer)) %>%
count(developer, sort = TRUE) %>%
head(10)
ggplot(top_devs, aes(x = reorder(developer, n), y = n)) +
geom_col(fill = "#18bc9c") +
coord_flip() +
labs(title = "Top 10 Desenvolvedores por Número de Jogos",
x = "Desenvolvedor",
y = "Quantidade de Títulos") +
theme_minimal()Análise: A lista de desenvolvedores com mais títulos é liderada pela própria dona da plataforma, Valve, seguida pela gigante japonesa Capcom e pela especialista em jogos de corrida Milestone s.r.l.. É notável a presença de grandes estúdios de jogos AAA e AA, como FromSoftware, CD Projekt Red e Bethesda Game Studios, indicando que este dataset possui uma forte representatividade de títulos de alto orçamento e grande aclamação crítica, ao contrário de datasets que capturam apenas a cauda longa de jogos independentes.
Além dos desenvolvedores, é interessante analisar quem são as maiores publicadoras na plataforma. Muitas vezes, um desenvolvedor cria o jogo, mas uma grande Publisher é responsável pela distribuição.
# Filtrando publishers vazios e contando
top_pubs <- games_desc %>%
filter(publisher != "" & !is.na(publisher)) %>%
count(publisher, sort = TRUE) %>%
head(10)
ggplot(top_pubs, aes(x = reorder(publisher, n), y = n)) +
geom_col(fill = "#8e44ad") +
coord_flip() +
labs(title = "Top 10 Publicadoras por Número de Jogos",
x = "Publisher",
y = "Quantidade de Títulos") +
theme_minimal()Análise: No topo das publicadoras, temos a Sega dominando em quantidade de títulos, seguida pela Electronic Arts e Xbox Game Studios. Este gráfico ilustra a convergência das antigas “Guerras de Console” para o PC: tanto Sega quanto Microsoft (Xbox) e grandes publishers terceiras como Activision e 2K mantêm bibliotecas massivas na Steam. A presença da Paradox Interactive em 4º lugar reforça a força do nicho de jogos de estratégia no PC.
Existe uma correlação entre o tempo investido em um jogo e a
recomendação positiva do usuário? Utilizamos os dados da tabela
reviews.
# Filtrando outliers extremos para visualização e aplicando escala logarítmica
reviews %>%
filter(hours_played > 0) %>%
ggplot(aes(x = recommendation, y = hours_played, fill = recommendation)) +
geom_boxplot(alpha = 0.7, show.legend = FALSE) +
scale_y_log10(labels = scales::comma) +
scale_fill_manual(values = c("#e74c3c", "#2980b9")) +
labs(title = "Distribuição de Horas Jogadas por Recomendação",
subtitle = "Escala Logarítmica no Eixo Y",
x = "Recomendação (Recommended)",
y = "Horas Jogadas (Log)") +
theme_minimal()Análise: O boxplot (em escala logarítmica) mostra que, embora a mediana de horas jogadas seja ligeiramente superior para quem recomenda o jogo (Recommended), a sobreposição entre as caixas é imensa. É crucial notar a presença significativa de outliers e a extensão da caixa vermelha (Not Recommended): há muitos usuários com mais de 100 ou até 1.000 horas de jogo que não recomendam o título. Isso sugere que o tempo de jogo não é um preditor garantido de satisfação; jogadores podem gastar muito tempo em jogos competitivos ou de serviço (GaaS) e ainda assim avaliá-los negativamente.
Analisamos como os jogos são classificados qualitativamente na loja (ex: “Very Positive”, “Mixed”).
# Limpeza rápida para remover categorias com pouquíssimos dados para o plot
games_desc %>%
filter(!is.na(overall_player_rating)) %>%
group_by(overall_player_rating) %>%
filter(n() > 50) %>% # Filtro para remover categorias raras/erros de parsing
ungroup() %>%
count(overall_player_rating) %>%
ggplot(aes(x = reorder(overall_player_rating, n), y = n)) +
geom_segment(aes(xend = overall_player_rating, yend = 0), color = "gray") +
geom_point(size = 4, color = "#d35400") +
coord_flip() +
labs(title = "Classificação Geral dos Jogadores (Lollipop Chart)",
x = "Classificação",
y = "Contagem") +
theme_minimal()Análise: O gráfico demonstra uma clara tendência positiva nas avaliações da Steam. A categoria mais frequente é “Very Positive”, seguida por “Overwhelmingly Positive” e “Mostly Positive”. Categorias neutras (“Mixed”) ou negativas (“Mostly Negative”) aparecem com frequência drasticamente menor. Isso pode indicar um viés de sobrevivência: jogos ruins vendem pouco e não atingem o limiar de avaliações necessário para aparecerem nesta análise com frequência, enquanto os jogos que compõem a maior parte do tráfego da loja são os bem avaliados.
Verificamos se reviews marcadas como “Funny” (Engraçadas) pelos usuários tendem a ser mais úteis (“Helpful”).
# Amostragem para evitar overplotting se o dataset for muito grande
set.seed(123)
reviews_sample <- reviews %>%
sample_n(min(10000, nrow(reviews))) %>%
filter(funny > 0 & helpful > 0)
ggplot(reviews_sample, aes(x = funny, y = helpful)) +
geom_point(alpha = 0.5, color = "purple") +
geom_smooth(method = "lm", color = "black", se = FALSE) +
scale_x_log10() +
scale_y_log10() +
labs(title = "Correlação entre Reviews Engraçadas e Úteis",
x = "Votos de 'Funny' (Log)",
y = "Votos de 'Helpful' (Log)") +
theme_minimal()Análise: O gráfico de dispersão com escala logarítmica revela uma correlação positiva clara. Reviews que recebem muitos votos de “Funny” tendem a acumular também votos de “Helpful”. A linha de tendência ascendente confirma que, na cultura da comunidade Steam, o humor é frequentemente recompensado com visibilidade e utilidade percebida. Não são apenas análises técnicas sérias que ganham destaque; piadas e memes (“copypastas”) bem colocados também impulsionam o engajamento da review.
Será que escrever mais resulta em uma análise considerada mais útil pela comunidade? Vamos analisar o tamanho (número de caracteres) do texto da review.
# Adicionar coluna de tamanho do texto
reviews_text <- reviews %>%
mutate(review_len = str_length(review)) %>%
filter(review_len > 0 & helpful > 0) %>%
sample_n(min(5000, n())) # Amostragem para performance
ggplot(reviews_text, aes(x = review_len, y = helpful)) +
geom_point(alpha = 0.3, color = "#2c3e50") +
scale_x_log10() +
scale_y_log10() +
geom_smooth(method = "gam", color = "#e67e22") +
labs(title = "Tamanho do Review (Caracteres) vs. Utilidade (Helpful)",
subtitle = "Existe um tamanho ideal para um review útil?",
x = "Tamanho do Texto (Log)",
y = "Votos de 'Helpful' (Log)") +
theme_minimal()Análise: O gráfico revela um comportamento fascinante da comunidade Steam em forma de “U” ou crescimento sustentado. 1. Reviews Curtos: Têm utilidade próxima de zero. Frases soltas raramente ajudam na decisão de compra. 2. Crescimento Rápido: A utilidade dispara conforme o texto ganha corpo, atingindo um patamar de “boa utilidade” em tamanhos médios. 3. O Fenômeno dos “Mega-Reviews”: Diferente de outras redes sociais onde a atenção é curta, a linha de tendência volta a subir (ou se mantém alta) na extremidade direita (textos extremamente longos). Isso indica que a comunidade valoriza análises profundas, detalhadas e exaustivas. O esforço de escrever um “editorial” sobre o jogo é recompensado com mais votos de utilidade do que reviews de tamanho médio.
Utilizando o dataset rankings, podemos observar quais
gêneros aparecem com mais frequência nas listas de “Top Sellers” e
outros rankings da plataforma.
# Analisando a frequência de gêneros no dataset de Rankings
rankings_summary <- rankings %>%
filter(!is.na(genre) & genre != "") %>%
count(genre, sort = TRUE) %>%
head(12)
ggplot(rankings_summary, aes(x = reorder(genre, n), y = n, fill = n)) +
geom_bar(stat = "identity") +
coord_flip() +
scale_fill_gradient(low = "#3498db", high = "#2c3e50") +
labs(title = "Gêneros Mais Recorrentes nos Rankings Globais",
x = "Gênero",
y = "Frequência nos Rankings",
fill = "Freq") +
theme_minimal()Análise: A análise dos rankings globais apresenta um cenário diferente da contagem bruta de jogos. Aqui, “Strategy” (Estratégia), “Sports & Racing” e “Simulation” ocupam o topo, com praticamente a mesma frequência. Surpreendentemente, “Action” aparece apenas na quarta posição, e “Role-playing” (RPG) em quinto. Isso sugere que, embora jogos de ação sejam numerosos, jogos de estratégia e simulação possuem uma “cauda longa” de vendas e engajamento mais forte, mantendo-se relevantes nos rankings por mais tempo.
Através da limpeza, tratamento e análise exploratória dos dados da Steam, foi possível corrigir percepções comuns e traçar um perfil baseado em dados sobre a plataforma:
Esta análise fornece uma visão atualizada do ecossistema Steam, destacando a importância de grandes estúdios e a preferência sólida dos jogadores por experiências singleplayer de alta qualidade.