1 Introdução

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:

  • Limpeza e tratamento
  • Análise Exploratória (EDA) com visualizações
  • Conclusões

2 Bibliotecas Necessárias

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):

  • tidyverse (2.0.0): Meta-pacote que carrega o núcleo do tidy data, incluindo:
    • ggplot2 (4.0.0): Visualização de dados.
    • dplyr (1.1.4): Manipulação de dados.
    • tidyr (1.3.1): Organização de dados (tidy data).
    • readr (2.1.5): Leitura de dados retangulares.
    • purrr (1.1.0): Programação funcional.
    • tibble (3.3.0): Dataframes modernos.
    • stringr (1.5.2): Manipulação de strings.
    • forcats (1.0.1): Manipulação de fatores.
    • lubridate (1.9.4): Manipulação de datas e horas.
  • knitr (1.50): Geração de relatórios dinâmicos.

3 Preparação dos Dados

Esta seção detalha o processo de aquisição, descrição e limpeza dos dados utilizados nesta análise.

3.1 Fonte dos Dados

Os dados foram obtidos do dataset “Steam Games, Reviews, and Rankings”, disponível publicamente. O dataset foi coletado a partir do Kaggle neste link.

3.2 Descrição dos Dados

O dataset original contém três arquivos principais:

  1. games_description.csv: Informações detalhadas sobre os jogos, incluindo descrições, requisitos do sistema e avaliações.
  2. steam_game_reviews.csv: Avaliações dos usuários, incluindo horas jogadas e recomendações.
  3. 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.

3.3 Importação e Limpeza dos Dados

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")

3.3.1 Formato dos dados originais

A estrutura inicial dos dados carregados apresenta diversas colunas que necessitam de formatação ou não serão utilizadas na análise.

glimpse(games_desc)
## 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…
glimpse(reviews)
## 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…
glimpse(rankings)
## 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…

3.3.2 Limpeza: Dataset games_desc

Nesta 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)

3.3.3 Limpeza: Dataset rankings

Ajustamos os tipos de dados e padronizamos a coluna de gênero.

rankings$rank_type <- as.factor(rankings$rank_type)

rankings$genre <- trimws(rankings$genre)
rankings$genre <- tolower(rankings$genre)

rankings$rank <- as.numeric(rankings$rank)

3.3.4 Limpeza: Dataset reviews

Removemos 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)

3.3.5 Formato dos dados após pré-processamento

Abaixo apresentamos a estrutura final dos dados prontos para a análise exploratória.

glimpse(games_desc)
## 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…
glimpse(reviews)
## 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…
glimpse(rankings)
## 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…

4 Análise Exploratória

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.

4.1 Distribuição dos Gêneros de Jogos

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.

4.2 Principais Desenvolvedores

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.

4.3 Principais Publishers (Publicadoras)

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.

4.4 Relação: Horas Jogadas vs. Recomendação

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.

4.5 Distribuição das Avaliações (Overall Rating)

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.

4.6 O Impacto do Humor nas Reviews

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.

4.7 Extensão do Texto do Review vs. Utilidade

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.

4.8 Gêneros nos Rankings de Vendas

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.

5 Conclusão

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:

  1. Cultura da Comunidade e Profundidade: A correlação positiva entre reviews “Funny” e “Helpful” mostra o valor do entretenimento. Porém, a análise de extensão de texto revelou que a Steam é um espaço para leitores ávidos: reviews extremamente longos tendem a ter uma performance de utilidade superior, contrariando a tendência de “TL;DR” (Too Long; Didn’t Read) da internet em geral. Jogadores buscam e premiam análises aprofundadas.
  2. Viés de Positividade: A concentração de avaliações em categorias positivas (como “Very Positive”) sugere que jogos de baixa qualidade tendem a cair na obscuridade rapidamente, não acumulando avaliações suficientes para figurarem nas categorias mais baixas com frequência estatística relevante.
  3. Modos de Jogo vs. Gêneros: A predominância das tags “Singleplayer” e “Multiplayer” mostra que a forma como se joga é tão definidora quanto o gênero temático.
  4. Força das Grandes Publicadoras: Contrariando a ideia de que a Steam é apenas um mar de jogos indie, a análise de desenvolvedores e publishers revelou a presença massiva de gigantes como Sega, Valve, EA e Capcom no topo das listas de quantidade de títulos.
  5. O Poder da Estratégia: Enquanto jogos de ação são comuns, são os gêneros de Estratégia e Simulação que demonstram uma resiliência impressionante nos rankings de top sellers e engajamento.

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.