Introdução

Introdução ao Dataset

O Yelp dataset é uma base de dados composta por várias informações de diversos estabelecimentos espalhados em 8 regiões metropolitanas distintas nos Estados Unidos e no Canadá das mais variadas categorias de serviços: shoppings, restaurantes, lojas, concessionárias, templos religiosos entre outros. O dataset é composto por 6.990.280 de reviews, 150.346 businesses (negócios, estabelecimentos e lojas) e 200.100 imagens. A primeira versão deste dataset foi lançada numa competição (o site oficial da competição não está mais disponível) em 2014 realizada pela Yelp, uma empresa norte-americana que possui sites e aplicativos voltados para avaliação de multiplos estabelecimentos comerciais. O dataset foi montado com a finalidade de servir para experimentos de NLP e análise de sentimento e foi disponibilizado para a comunidade acadêmica para exploração de outras análises (Dados sobre como se deu a coleta das informações não foram divulgados).

Dataset no Kaggle

Site oficial do Yelp Dataset

Introdução ao Problema

A avaliação dos clientes sobre determinada loja ou estabelecimento é um fator muito importante para medir a qualidade dos seus produtos, serviços e o nível de satisfação dos clientes. Isso permite que as empresas ajustem suas estratégias para melhor atender às necessidades do mercado e, assim, aumentem sua competitividade e fidelização de clientes.

A mudança das estações do ano podem causar variações nos diversos setores comerciais de um país. Isso gera impactos diretos na receita de muitas lojas e estabelecimentos que podem sofrer as consequências de imprevistos orçamentários inerentes a mudança no fluxo de clientes e as diferenças sazonais de oferta e demanda de determinados serviços. Compreender esses padrões sazonais ajuda as empresas a se prepararem melhor para enfrentar desafios econômicos e a aproveitarem oportunidades específicas de cada estação, a fim de agradar os clientes o máximo possível.

A partir da compreensão das avaliações dos clientes com o passar dos anos, é possível auxiliar os estabelecimentos a refletirem sobre as suas decisões financeiras que possam gerar melhores impactos para os seus negócios, seja no aumento dos serviços em determinada época, economia de recursos, criação de planejamentos estratégicos para os mêses do ano, entre outros, de maneira a produzir uma gestão visando a lucratividade de maneira mais eficiente.

Pacotes Utilizados

Aqui estão listados os pacotes utilizados neste projeto. Ao lado estão expostos os motivos para utilização de cada pacote. Estes pacotes são necessários para a visualização e manipulação dos dados do Yelp Dataset.

Tabela de Pacotes R e Seus Motivos
Pacotes Motivo
stringr Utilizado neste projeto para contagem de categorias dos estabelecimentos
DT Utilizado para mostrar os exemplos dos estabelecimentos e dos reviewas
knitr Utilizado para mostrar tabelas
plotly Usado na plotagem do gráfico em Pizza
dplyr Utilizado para manipular, filtrar e juntar tabelas
leaflet Usado na plotagem do mapa com os locais dos estabelecimentos
lubridate Utilizado para manipular as datas dos reviews

Carregando os Dados

Para iniciar o processo de análise de um dataset, é preciso filtrar algumas informações para lidar com os dados de maneira mais concisa. Nesta aba, iremos mostrar o precesso utilizado para carregar e filtrar o Yelp Dataset.

Inicialmente, os dados de estabelecimentos e reviews foram lidos a partir dos seus respectivos arquivos no formato JSON.

file <- "yelp_academic_dataset_business.json"
business <- jsonlite::stream_in(textConnection(readLines(file, n=160000)), flatten = TRUE)

file2 <- "yelp_academic_dataset_review.json"
reviews <- jsonlite::stream_in(textConnection(readLines(file2, n=7000000)), flatten = TRUE)

Tabela de Estabelecimentos

A tabela abaixo mostra 5 exemplos dos registros de estabelecimentos. Note que as colunas com attributes possuem vários valores nulos.

Contagem de Valores Nulos e Strings Vazias por Coluna
NA_and_Empty_Count
business_id 0
name 0
address 5127
city 0
state 0
postal_code 73
latitude 0
longitude 0
stars 0
review_count 0
is_open 0
categories 103
attributes.ByAppointmentOnly 108007
attributes.BusinessAcceptsCreditCards 30581
attributes.BikeParking 77708
attributes.RestaurantsPriceRange2 65032
attributes.CoatCheck 144762
attributes.RestaurantsTakeOut 90489
attributes.RestaurantsDelivery 94064
attributes.Caters 110219
attributes.WiFi 93432
attributes.BusinessParking 59261
attributes.WheelchairAccessible 121393
attributes.HappyHour 135175
attributes.OutdoorSeating 101544
attributes.HasTV 105262
attributes.RestaurantsReservations 105099
attributes.DogsAllowed 132062
attributes.Alcohol 107157
attributes.GoodForKids 96971
attributes.RestaurantsAttire 111091
attributes.Ambience 106067
attributes.RestaurantsTableService 130364
attributes.RestaurantsGoodForGroups 106176
attributes.DriveThru 142586
attributes.NoiseLevel 112353
attributes.GoodForMeal 121259
attributes.BusinessAcceptsBitcoin 132916
attributes.Smoking 145779
attributes.Music 142825
attributes.GoodForDancing 145718
attributes.AcceptsInsurance 144633
attributes.BestNights 144652
attributes.BYOB 145895
attributes.Corkage 146793
attributes.BYOBCorkage 148902
attributes.HairSpecializesIn 149281
attributes.Open24Hours 150307
attributes.RestaurantsCounterService 150327
attributes.AgesAllowed 150217
attributes.DietaryRestrictions 150315
hours.Monday 35872
hours.Tuesday 29715
hours.Wednesday 26575
hours.Thursday 25148
hours.Friday 25347
hours.Saturday 39576
hours.Sunday 69174

Como exibido acima, as colunas de “attributes” e “hours” possuem vários valores nulos. Como elas não farão parte da nossa análise, elas serão removidas da tabela.

business <- business[,1:12]

Tabela de Reviews

Já a tabela abaixo mostra 5 exemplos dos registros dos reviews dos clientes.

Contagem de Valores Nulos e Strings Vazias por Coluna
NA_and_Empty_Count
review_id 0
user_id 0
business_id 0
stars 0
useful 0
funny 0
cool 0
text 0
date 0

Para a nossa análise, como não temos valores nulos e vazios, a tabela de reviews será mantida intacta.

Base de Dados

Formato dos dados:

Após o processo de filtragem dos dados, temos os seguintes atributos nos registros de estabelecimentos do Yelp Dataset com suas respectivas informações:

Atributo Descrição
business_id Id do estabelecimento
name Nome do estabelecimento
address Endereço do estabelecimento
city Cidade do estabelecimento
state Estado do estabelecimento
postal code Código Postal
latitude Posição de Latitude do estabelecimento
longitude Posição de Longitude do estabelecimento
stars Avaliação em estrelas
review_count Quantidade de reviews
is_open Bandeira que indica se o estabelecimento está funcionando ou se foi fechado
categories Categorias as quais o estabelecimento pertence

Já nos registros de reviews, temos as informações dos reviews dos clientes relativos aos estabelecimentos:

Atributo Descrição
review_id Id do Review
user_id Id do usuário que fez o review
business_id Id do estabelecimento alvo do review
stars Número de estrelas da opinião do review
date Data que o review foi escrito
text Texto utilizado no review
useful Indicador de marcação de útil
funny Indicador de marcação de engraçado
cool Indicador de marcação de legal
A tabela abaixo mostra alguns estabelecimentos registrados no dataset do Yelp. para visualização, estão mostradas apenas as 12 primeiras colunas e as 20 primeiras linhas do dataset.
Já a tabela abaixo mostra alguns reviews dos clientes que avaliaram estabelecimentos. Aqui estão listadas todas as colunas do arquivo de reviews.

Análise dos Dados

Estabelecimentos por Estado

Aqui é possível ver a porcentagem de estabelecimentos por estado. Cada cor representa um Estado americano contendo a porcentagem de negócios registrados no dataset.

state_counts <- business %>%
  group_by(state) %>%
  summarise(count = n())

fig <- plot_ly(data=state_counts, labels=~state_counts$state, values=~state_counts$count, type = 'pie')%>% 
  layout(title=list(text = "% Estabelecimentos por Estado"), 
         legend=list(title=list(text='Estados')))
fig

Visualização no mapa

Aqui é possível visualizar o local de cada estabelecimento registrado no dataset no mapa mundi. As posições de cada estabelecimento é baseado nos atributos de latitude e longitude presentes no dataset. As cores de cada estabelecimento reflete o seu número de estrelas dado pelos clientes.

colors <- colorFactor(c("purple", "red", "orange", "black","blue"), domain = unique(business$stars))

map <- leaflet(business, width = "100%") %>%
  addProviderTiles("CartoDB.Positron") %>%
  addCircleMarkers(
    color = ~colors(business$stars),
    stroke = FALSE, fillOpacity = 0.5,
    lat = business$latitude,
    lng = business$longitude,
    clusterOptions = markerClusterOptions(),
    popup = as.character(head_business$name))
map

Categoria mais famosa (Restaurantes)

Nesta análise, estaremos coletando insights sobre os estabelecimentos que pertencem a categoria mais popular do dataset. Ao ordenarmos as categorias presentes em todo o dataset, vemos que a categoria de restaurantes é a mais famosa, seguido da categoria Food, que também envolve estabelecimentos do ramo alimentício. Nesta análise, iremos considerar ambas as categorias como uma só.

all_categories <- business %>%
  mutate(categories=strsplit(categories, ", "))
all_categories <- unlist(all_categories$categories)
all_categories <- table(all_categories)

all_categories_df <- as.data.frame(all_categories)
names(all_categories_df) <- c("Categoria", "Frequencia")

# Ordenar pela frequência em ordem decrescente
all_categories_df <- all_categories_df %>% arrange(desc(Frequencia))

# Mostrar a tabela de ocorrências por palavras
datatable(head(all_categories_df, 5), 
          options = list(pageLength = 5, 
                         autoWidth = TRUE, 
                         order = list(2, 'desc')))

Abaixo nós vemos os Top 5 estados com mais restaurantes na América do Norte (segundo os dados presentes no Yelp Dataset)

restaurants <- business %>% filter(str_detect(str_to_lower(categories), regex("restaurants|food", ignore_case = TRUE)))

state_restaurants_counts <- restaurants %>%
  group_by(state) %>%
  summarise(count = n()) %>%
  arrange(desc(count)) %>%
  head(5)

fig <- plot_ly(x=~state_restaurants_counts$state, y=~state_restaurants_counts$count, type = 'bar', colors = rainbow(5))%>% 
  layout(title=list(text = "% Restaurantes por Estado"), 
         legend=list(title=list(text='Estados')))
fig <- fig %>% layout(xaxis = list(title = 'Estados'), barmode = 'group')
fig <- fig %>% layout(yaxis = list(title = '# de restaurantes'), barmode = 'group')
fig

Top 5 Restaurantes

Na tabela abaixo nós vemos os restaurantes com maiores notas pelos clientes.

restaurants_review <- reviews %>%
  inner_join(restaurants, by = "business_id") %>%
  mutate(ano = year(date), mes = month(date))

restaurants_review %>%
  filter(stars.x >= 4) %>%
  group_by(business_id) %>%
  summarise(Count = n()) %>%
  arrange(desc(Count)) %>%
  head(5) %>% 
inner_join(restaurants, by = "business_id") %>%
select(name, Count) %>%
kable(caption = "Restaurantes com maior quantidade de avaliações com 4 estrelas ou mais.")
Restaurantes com maior quantidade de avaliações com 4 estrelas ou mais.
name Count
Luke 3726
The Stillery 2302
Parc 2300
Jacques-Imo’s Cafe 2059
The Eagle 2042

Já na tabela abaixo vemos os restaurantes mais comentados pelos clientes. Note que muitos deles fazem parte dos que possuem as maiores notas.

restaurants_review %>%
  group_by(business_id) %>%
  summarise(Count = n()) %>%
  arrange(desc(Count)) %>%
  head(5) %>% 
inner_join(restaurants, by = "business_id") %>%
select(name, Count) %>%
kable(caption = "Restaurantes mais populares (mais comentados)")
Restaurantes mais populares (mais comentados)
name Count
Luke 4661
Drago’s Seafood Restaurant 3217
Parc 2884
The Stillery 2618
Jacques-Imo’s Cafe 2449

Como complemento, aqui estão os Dados sobre os restaurantes que recebem constantemente as menores notas.

restaurants_review %>%
  filter(stars.y < 3) %>%
  group_by(business_id) %>%
  summarise(Count = n()) %>%
  arrange(desc(Count)) %>%
  head(5) %>% 
inner_join(restaurants, by = "business_id") %>%
select(name, Count) %>%
kable(caption = "Restaurantes com maior quantidade de avaliações menor que 3 estrelas.")
Restaurantes com maior quantidade de avaliações menor que 3 estrelas.
name Count
Seminole Hard Rock Hotel & Casino Tampa 821
Steak ’n Shake 417
Kitchen Bar 394
Dave & Buster’s 364
Sculley’s Waterfront Restaurant 361

A importância de saber os melhores restaurantes é incentivar os menores restaurantes os pontos de melhoria para que possam usar os estabelecimentos de maior renome ou popularidade como exemplos a serem seguidos.

Variação das Notas por mês

O gráfico em linha abaixo mostra a variação da média das notas dos restaurantes por mês. Isso é importante para saber o que esperar do comportamento de um cliente em determinada época do ano.

month_labels <- c("Jan", "Fev", "Mar", "Abr", "Mai", "Jun", 
                  "Jul", "Ago", "Set", "Out", "Nov", "Dez")

date_res_review <- reviews %>%
  inner_join(restaurants, by = "business_id") %>%
  mutate(ano = year(date), mes = month(date), mes_ano = paste(year(date), month(date), sep = "_")) %>%
  arrange(date)

mes_review <- date_res_review%>%
  group_by(mes) %>%
  summarise(media = mean(stars.x))

graph_date_res_review <- mes_review %>%
  ggplot(aes (x=mes, y=media)) +
  geom_line() +
  scale_x_continuous(breaks = 1:12, labels = month_labels) +
  labs(title = "Media das Notas por Mes",
       x = "Mes",
       y = "Media das Notas") +
  theme_minimal()

graph_date_res_review

Desvio padrão: 0.016698

Tendência de avaliação de restaurantes

A curva a seguir mostra a tendência de avaliação de restaurantes dos últimos anos (2005 até 2020). Essa análise é importante para que as estretégias dos restaurantes possam ser validadas como eficientes na conquista dos seus consumidores.

graph_ano_review <- date_res_review%>%
  group_by(ano) %>%
  summarise(media = mean(stars.x)) %>%
  ggplot(aes (x=ano, y=media, group = 1)) +
  geom_line(color = "blue")
  labs(title = "Media das Notas ao longo dos anos",
       x = "Meses",
       y = "Media das Notas") +
  theme_minimal()
graph_ano_review

Conclusões

Os estados da Pensilvânia e da Flórida são os estados que possuem a maior quantidade de restaurantes, fast-foods e bares, que são os estabelecimentos comerciais mais populares de todo o território Norte Americano (contemplado nos dados do Yelp Dataset). Em relação aos restaurantes mais populares, é válido a análise de restaurantes menores sobre restaurantes como o Luke e o Parc para aumentarem a sua competitividade e sua entrega aos clientes. No geral, as avaliações (em estrelas) por mês dos restaurantes seguem um desvio padrão de aproximadamente 0.01, que indica que as suas notas permanecem parecidas ao longo de um ano. Os meses observados que possuem as piores avaliações foram os meses de Maio, Setembro e Dezembro, com as maiores médias registradas por volta dos meses de Janeiro (Ano novo), Junho e Julho (época de verão na América do Norte). Apesar dos altos e baixos, a tendência de crescimento das avaliações dos estabelecimentos do ramo seguem crescentes desde 2010 até 2020. Isso significa que seus negócios estavam deixando os clientes cada vez mais satisfeitos até o final de 2019. Por fim, considerando as notas dos clientes a longo prazo, a estratégia da maioria dos restaurantes já estavam convergindo para o aumento da satisfação dos clientes. Apesar disso, é válido o estudo de outras estratégias que possam chamar ainda mais a atenção dos clientes se considerar as notas nos meses de Maio, Setembro e de Dezembro. Conseguir resultados cada vez mais satisfatórios nesses meses pode acabar impulsionando ainda mais as notas dos estabelecimentos a longo prazo também.

Referências

Tran et al. (2022) https://www.frbsf.org/wp-content/uploads/sites/4/el2022-23.pdf

Morosan (1995) https://www.uclg.org/sites/default/files/the_role_of_local_governments_in_territorial_economic_development.pdf

Yelp Dataset: Site oficial do Yelp Dataset

Yelp Dataset no Kaggle: Dataset no Kaggle

Morosan, Carmen. 1995. “The Role of Local Government in Promoting Social and Economic Development.”
Tran, Brigitte Roth et al. 2022. “The Impact of Weather on Retail Sales.” FRBSF Economic Letter 2022 (23): 1–5.