O crescimento do comércio eletrônico transformou a forma como consumidores pesquisam e escolhem produtos. Atualmente, avaliações publicadas por outros usuários exercem grande influência no processo de decisão de compra, funcionando como uma importante fonte de informação sobre qualidade, desempenho e satisfação com determinado produto.
No entanto, nem todas as avaliações possuem o mesmo valor para os consumidores. Algumas recebem diversos votos indicando que foram úteis, enquanto outras praticamente não recebem atenção. Dessa forma, surge a seguinte questão: quais características tornam uma avaliação mais útil para outros usuários?
Responder essa pergunta é relevante tanto para consumidores, que podem identificar comentários mais informativos, quanto para empresas e plataformas de comércio eletrônico, que podem aprimorar sistemas de recomendação e destaque de avaliações.
O objetivo deste projeto é analisar o conjunto de dados Amazon Fine Food Reviews Dataset para investigar possíveis fatores relacionados à utilidade das avaliações publicadas pelos usuários.
A análise busca identificar padrões envolvendo características como:
O conjunto de dados utilizado foi o Amazon Fine Food Reviews Dataset, disponibilizado publicamente no Kaggle.
O dataset contém avaliações de produtos alimentícios comercializados na Amazon entre os anos de 1999 e 2012, reunindo informações sobre usuários, produtos, notas atribuídas, votos de utilidade, resumos e textos completos das avaliações.
Ao todo, o conjunto de dados possui 568.454 avaliações distribuídas em 10 variáveis originais, permitindo análises exploratórias bastante abrangentes.
A metodologia utilizada nesta entrega parcial foi dividida em quatro etapas principais:
Essa abordagem permite deixar o conjunto de dados preparado para análises mais aprofundadas na etapa final do projeto.
Para realizar a análise foram utilizados pacotes do ecossistema R voltados para manipulação, visualização e apresentação de dados.
O pacote tidyverse foi utilizado para limpeza, transformação e manipulação dos dados. O pacote lubridate auxiliou no tratamento das datas extraídas dos registros originais. O pacote readr foi utilizado para importação eficiente do arquivo CSV contendo mais de meio milhão de registros.
Além disso, foram utilizados os pacotes knitr para geração de tabelas no relatório, DT para construção de tabelas interativas e plotly para criação de visualizações interativas.
pacotes <- tibble(
Pacote = c("tidyverse", "lubridate", "readr", "knitr", "DT", "plotly"),
Finalidade = c(
"Manipulação, limpeza e visualização dos dados",
"Tratamento e extração de informações de datas",
"Importação eficiente de arquivos CSV",
"Criação de tabelas no relatório",
"Criação de tabelas interativas",
"Criação de gráficos interativos"
)
)
kable(pacotes, caption = "Pacotes utilizados no projeto")
| Pacote | Finalidade |
|---|---|
| tidyverse | Manipulação, limpeza e visualização dos dados |
| lubridate | Tratamento e extração de informações de datas |
| readr | Importação eficiente de arquivos CSV |
| knitr | Criação de tabelas no relatório |
| DT | Criação de tabelas interativas |
| plotly | Criação de gráficos interativos |
Os dados foram obtidos no Kaggle por meio do conjunto Amazon Fine Food Reviews Dataset.
Fonte original: https://www.kaggle.com/datasets/snap/amazon-fine-food-reviews
O conjunto reúne avaliações reais feitas por consumidores da Amazon sobre produtos alimentícios comercializados na plataforma. A base contém informações referentes ao período de 1999 a 2012 e foi originalmente disponibilizada para pesquisas relacionadas à análise de comportamento do consumidor e mineração de texto.
reviews_original <- read_csv(
"Reviews.csv",
show_col_types = FALSE
)
dim(reviews_original)
## [1] 568454 10
O resultado acima confirma que o dataset foi importado corretamente, contendo 568.454 registros e 10 variáveis.
glimpse(reviews_original)
## Rows: 568,454
## Columns: 10
## $ Id <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, …
## $ ProductId <chr> "B001E4KFG0", "B00813GRG4", "B000LQOCH0", "B000…
## $ UserId <chr> "A3SGXH7AUHU8GW", "A1D87F6ZCVE5NK", "ABXLMWJIXX…
## $ ProfileName <chr> "delmartian", "dll pa", "Natalia Corres \"Natal…
## $ HelpfulnessNumerator <dbl> 1, 0, 1, 3, 0, 0, 0, 0, 1, 0, 1, 4, 1, 2, 4, 4,…
## $ HelpfulnessDenominator <dbl> 1, 0, 1, 3, 0, 0, 0, 0, 1, 0, 1, 4, 1, 2, 5, 5,…
## $ Score <dbl> 5, 1, 4, 2, 5, 4, 5, 5, 5, 5, 5, 5, 1, 4, 5, 5,…
## $ Time <dbl> 1303862400, 1346976000, 1219017600, 1307923200,…
## $ Summary <chr> "Good Quality Dog Food", "Not as Advertised", "…
## $ Text <chr> "I have bought several of the Vitality canned d…
variaveis_originais <- tibble(
Variavel = c(
"Id",
"ProductId",
"UserId",
"ProfileName",
"HelpfulnessNumerator",
"HelpfulnessDenominator",
"Score",
"Time",
"Summary",
"Text"
),
Descricao = c(
"Identificador único da avaliação",
"Identificador do produto avaliado",
"Identificador do usuário",
"Nome do perfil do usuário",
"Quantidade de votos indicando que a avaliação foi útil",
"Quantidade total de votos recebidos pela avaliação",
"Nota atribuída ao produto, variando de 1 a 5",
"Data da avaliação em formato Unix timestamp",
"Resumo curto da avaliação",
"Texto completo da avaliação"
)
)
kable(variaveis_originais, caption = "Descrição das variáveis originais")
| Variavel | Descricao |
|---|---|
| Id | Identificador único da avaliação |
| ProductId | Identificador do produto avaliado |
| UserId | Identificador do usuário |
| ProfileName | Nome do perfil do usuário |
| HelpfulnessNumerator | Quantidade de votos indicando que a avaliação foi útil |
| HelpfulnessDenominator | Quantidade total de votos recebidos pela avaliação |
| Score | Nota atribuída ao produto, variando de 1 a 5 |
| Time | Data da avaliação em formato Unix timestamp |
| Summary | Resumo curto da avaliação |
| Text | Texto completo da avaliação |
A presença simultânea de dados numéricos, textuais e temporais torna esse conjunto de dados interessante para análises exploratórias.
valores_ausentes <- reviews_original %>%
summarise(across(everything(), ~ sum(is.na(.)))) %>%
pivot_longer(
cols = everything(),
names_to = "Variavel",
values_to = "Quantidade_NA"
)
kable(valores_ausentes, caption = "Quantidade de valores ausentes por variável")
| Variavel | Quantidade_NA |
|---|---|
| Id | 0 |
| ProductId | 0 |
| UserId | 0 |
| ProfileName | 4 |
| HelpfulnessNumerator | 0 |
| HelpfulnessDenominator | 0 |
| Score | 0 |
| Time | 0 |
| Summary | 0 |
| Text | 0 |
A verificação de valores ausentes é importante para identificar possíveis problemas antes das análises. Valores ausentes podem afetar cálculos de médias, contagens, gráficos e interpretações.
reviews <- reviews_original %>%
distinct()
linhas_removidas <- nrow(reviews_original) - nrow(reviews)
linhas_removidas
## [1] 0
A remoção de duplicatas foi realizada para evitar que registros repetidos influenciassem os resultados da análise.
A variável Time estava originalmente em formato Unix
timestamp. Para facilitar a análise temporal, essa variável foi
convertida para data, e também foram criadas as variáveis
Ano e Mes.
reviews <- reviews %>%
mutate(
Data = as.Date(as.POSIXct(Time, origin = "1970-01-01")),
Ano = year(Data),
Mes = month(Data)
)
Foram criadas novas variáveis para enriquecer a análise e permitir observar características que não estavam diretamente disponíveis no dataset original.
reviews <- reviews %>%
mutate(
tamanho_review = nchar(Text),
tamanho_resumo = nchar(Summary),
helpful_rate = ifelse(
HelpfulnessDenominator == 0,
0,
HelpfulnessNumerator / HelpfulnessDenominator
),
classificacao_nota = case_when(
Score >= 4 ~ "Positiva",
Score == 3 ~ "Neutra",
Score <= 2 ~ "Negativa"
),
review_util = ifelse(helpful_rate >= 0.5, "Útil", "Não útil")
)
novas_variaveis <- tibble(
Variavel = c(
"Data",
"Ano",
"Mes",
"tamanho_review",
"tamanho_resumo",
"helpful_rate",
"classificacao_nota",
"review_util"
),
Descricao = c(
"Data da avaliação convertida a partir do timestamp original",
"Ano em que a avaliação foi publicada",
"Mês em que a avaliação foi publicada",
"Quantidade de caracteres no texto completo da avaliação",
"Quantidade de caracteres no resumo da avaliação",
"Proporção de votos úteis em relação ao total de votos recebidos",
"Classificação da nota como positiva, neutra ou negativa",
"Classificação da avaliação como útil ou não útil"
)
)
kable(novas_variaveis, caption = "Variáveis criadas durante o pré-processamento")
| Variavel | Descricao |
|---|---|
| Data | Data da avaliação convertida a partir do timestamp original |
| Ano | Ano em que a avaliação foi publicada |
| Mes | Mês em que a avaliação foi publicada |
| tamanho_review | Quantidade de caracteres no texto completo da avaliação |
| tamanho_resumo | Quantidade de caracteres no resumo da avaliação |
| helpful_rate | Proporção de votos úteis em relação ao total de votos recebidos |
| classificacao_nota | Classificação da nota como positiva, neutra ou negativa |
| review_util | Classificação da avaliação como útil ou não útil |
reviews_limpo <- reviews %>%
select(
Id,
ProductId,
UserId,
ProfileName,
Score,
HelpfulnessNumerator,
HelpfulnessDenominator,
helpful_rate,
review_util,
classificacao_nota,
Summary,
Text,
tamanho_review,
tamanho_resumo,
Data,
Ano,
Mes
)
Para evitar imprimir uma tabela muito grande, abaixo é apresentada apenas uma amostra de 10 registros do conjunto de dados após o pré-processamento.
set.seed(123)
reviews_limpo %>%
sample_n(10) %>%
select(
Score,
helpful_rate,
review_util,
classificacao_nota,
tamanho_review,
Data,
Summary
) %>%
kable(caption = "Amostra do conjunto de dados após o pré-processamento")
| Score | helpful_rate | review_util | classificacao_nota | tamanho_review | Data | Summary |
|---|---|---|---|---|---|---|
| 1 | 0.4583333 | Não útil | Negativa | 340 | 2010-08-18 | Beware: 8 oz only!!! |
| 5 | 0.8333333 | Útil | Positiva | 264 | 2009-06-18 | Gluten free and Great tasting |
| 5 | 1.0000000 | Útil | Positiva | 213 | 2010-10-03 | Bev |
| 5 | 0.0000000 | Não útil | Positiva | 117 | 2012-04-20 | good |
| 2 | 0.0000000 | Não útil | Negativa | 196 | 2012-03-13 | Salty and with bones |
| 5 | 0.0000000 | Não útil | Positiva | 528 | 2012-01-29 | Tasty, crunchy and healthy |
| 5 | 1.0000000 | Útil | Positiva | 328 | 2009-04-03 | Great healthy treats for the kids |
| 1 | 0.6666667 | Útil | Negativa | 1960 | 2010-09-19 | Changed the ingredients to now include meat products! ZERO STARS |
| 5 | 0.0000000 | Não útil | Positiva | 199 | 2011-05-17 | Surprisingly good |
| 4 | 0.0000000 | Não útil | Positiva | 888 | 2012-01-29 | Spicy, limey, popchips. |
resumo_geral <- reviews_limpo %>%
summarise(
total_reviews = n(),
nota_media = mean(Score, na.rm = TRUE),
tamanho_medio_review = mean(tamanho_review, na.rm = TRUE),
tamanho_mediano_review = median(tamanho_review, na.rm = TRUE),
taxa_media_utilidade = mean(helpful_rate, na.rm = TRUE),
ano_inicial = min(Ano, na.rm = TRUE),
ano_final = max(Ano, na.rm = TRUE)
)
kable(resumo_geral, caption = "Resumo geral do dataset após o pré-processamento")
| total_reviews | nota_media | tamanho_medio_review | tamanho_mediano_review | taxa_media_utilidade | ano_inicial | ano_final |
|---|---|---|---|---|---|---|
| 568454 | 4.183199 | 436.2221 | 302 | 0.4078619 | 1999 | 2012 |
Após o processo de preparação, o conjunto de dados passou a conter informações adicionais que facilitam a identificação de padrões relacionados à utilidade das avaliações. As variáveis derivadas possibilitam comparar grupos de avaliações, observar tendências temporais e analisar o comportamento dos usuários de maneira mais detalhada.
grafico_notas <- reviews_limpo %>%
count(Score) %>%
ggplot(aes(x = factor(Score), y = n)) +
geom_col() +
labs(
title = "Distribuição das notas das avaliações",
x = "Nota",
y = "Quantidade de avaliações"
)
grafico_notas
A primeira análise realizada buscou compreender como as notas estão distribuídas dentro do conjunto de dados. Observa-se uma forte concentração de avaliações com nota máxima, indicando que a maior parte dos consumidores avaliou os produtos de forma positiva.
Essa característica sugere um viés positivo nas avaliações presentes na base de dados.
reviews_limpo %>%
count(classificacao_nota) %>%
ggplot(aes(x = classificacao_nota, y = n)) +
geom_col() +
labs(
title = "Classificação das avaliações",
x = "Classificação",
y = "Quantidade de avaliações"
)
A maior parte das avaliações é classificada como positiva. Isso reforça a ideia observada no gráfico anterior: no dataset analisado, os consumidores tendem a atribuir notas altas aos produtos avaliados.
reviews_limpo %>%
count(Ano) %>%
ggplot(aes(x = Ano, y = n)) +
geom_line() +
geom_point() +
labs(
title = "Quantidade de avaliações por ano",
x = "Ano",
y = "Quantidade de avaliações"
)
Ao analisar a quantidade de avaliações por ano, observa-se um crescimento expressivo da participação dos usuários ao longo do período analisado.
A partir de 2007 ocorre um aumento acelerado no número de avaliações registradas, alcançando os maiores valores próximos ao final do conjunto de dados. Esse comportamento acompanha o crescimento do comércio eletrônico e da popularização das plataformas de avaliação online.
set.seed(123)
amostra_grafico <- reviews_limpo %>%
sample_n(5000)
ggplot(
amostra_grafico,
aes(x = tamanho_review, y = helpful_rate)
) +
geom_point(alpha = 0.3) +
labs(
title = "Relação entre tamanho da review e taxa de utilidade",
x = "Tamanho da review em caracteres",
y = "Taxa de utilidade"
)
Uma das hipóteses iniciais deste projeto é que avaliações mais detalhadas tendem a ser consideradas mais úteis pelos usuários.
Embora existam avaliações curtas consideradas úteis, os resultados iniciais indicam que comentários mais completos podem fornecer informações mais relevantes para outros consumidores. Essa relação será investigada com mais profundidade na entrega final.
reviews_limpo %>%
group_by(review_util) %>%
summarise(
tamanho_medio = mean(tamanho_review, na.rm = TRUE),
.groups = "drop"
) %>%
ggplot(aes(x = review_util, y = tamanho_medio)) +
geom_col() +
labs(
title = "Tamanho médio das reviews por classificação de utilidade",
x = "Classificação da review",
y = "Tamanho médio em caracteres"
)
Essa análise inicial compara diretamente o tamanho médio das avaliações consideradas úteis e não úteis. Caso as avaliações úteis apresentem tamanho médio maior, isso pode indicar que comentários mais detalhados contribuem para a percepção de utilidade por parte dos usuários.
reviews_limpo %>%
group_by(review_util) %>%
summarise(
nota_media = mean(Score, na.rm = TRUE),
.groups = "drop"
) %>%
ggplot(aes(x = review_util, y = nota_media)) +
geom_col() +
labs(
title = "Nota média das reviews úteis e não úteis",
x = "Classificação da review",
y = "Nota média"
)
Esse gráfico permite observar se avaliações consideradas úteis tendem a receber notas mais altas ou mais baixas. Isso é relevante porque uma review útil não necessariamente é uma review positiva; avaliações críticas também podem ser úteis quando apresentam informações detalhadas sobre problemas do produto.
reviews_limpo %>%
group_by(Score) %>%
summarise(
media_utilidade = mean(helpful_rate, na.rm = TRUE),
.groups = "drop"
) %>%
ggplot(aes(x = factor(Score), y = media_utilidade)) +
geom_col() +
labs(
title = "Taxa média de utilidade por nota",
x = "Nota",
y = "Taxa média de utilidade"
)
Essa análise mostra como a utilidade média varia de acordo com a nota atribuída. O objetivo é observar, de forma preliminar, se avaliações muito positivas, neutras ou negativas recebem maior reconhecimento de utilidade por outros usuários.
set.seed(123)
reviews_limpo %>%
select(
Score,
helpful_rate,
review_util,
classificacao_nota,
tamanho_review,
Data,
Summary
) %>%
sample_n(100) %>%
datatable(
caption = "Amostra interativa das avaliações pré-processadas",
options = list(pageLength = 10)
)
A tabela interativa permite explorar uma amostra das avaliações de maneira mais dinâmica, observando simultaneamente nota, taxa de utilidade, tamanho da review, data e resumo.
dados_ano <- reviews_limpo %>%
count(Ano)
grafico_interativo_ano <- ggplot(
dados_ano,
aes(x = Ano, y = n)
) +
geom_line() +
geom_point() +
labs(
title = "Quantidade de avaliações por ano",
x = "Ano",
y = "Quantidade"
)
ggplotly(grafico_interativo_ano)
O gráfico interativo facilita a exploração do crescimento das avaliações ao longo dos anos, permitindo visualizar os valores de cada ponto com mais facilidade.
Nesta entrega parcial, o foco foi a importação, compreensão, limpeza e preparação do conjunto de dados, além da realização de algumas análises exploratórias iniciais.
As etapas realizadas até aqui permitem afirmar que o projeto já possui uma base estruturada para análises mais aprofundadas na versão final. O conjunto de dados foi importado corretamente, suas variáveis principais foram compreendidas, a variável temporal foi convertida, novas variáveis foram criadas e foram produzidos primeiros gráficos e tabelas para explorar os dados.
Na próxima etapa, serão exploradas análises mais específicas sobre a relação entre características textuais das avaliações e sua utilidade percebida pelos usuários. Entre as possibilidades para a versão final estão a análise de frequência de palavras, comparação mais detalhada entre reviews úteis e não úteis, análise de correlação entre tamanho da review e taxa de utilidade, além da investigação mais profunda dos textos das avaliações.
Este projeto tem como objetivo investigar fatores relacionados à utilidade das avaliações presentes no conjunto Amazon Fine Food Reviews Dataset.
A proposta central é compreender quais características podem contribuir para que uma avaliação seja considerada mais útil por outros consumidores.
Até esta entrega parcial, a análise foi conduzida por meio de técnicas de preparação de dados, criação de variáveis derivadas e análise exploratória inicial utilizando gráficos e tabelas.
Essas etapas permitiram transformar os dados originais em informações mais adequadas para interpretação e geração de insights.
Os resultados preliminares obtidos indicam que:
Para a versão final do projeto, será necessário aprofundar a análise da utilidade das avaliações. Isso poderá ser feito por meio de análises textuais, comparação entre grupos, correlação entre variáveis e exploração mais detalhada das reviews consideradas úteis.
Como continuação, também poderá ser aplicada análise de sentimentos ou mineração de texto para compreender melhor quais palavras, expressões e características textuais aparecem com maior frequência em avaliações úteis.