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).
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.
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.
| 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 |
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)A tabela abaixo mostra 5 exemplos dos registros de estabelecimentos. Note que as colunas com attributes possuem vários valores nulos.
| 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.
Já a tabela abaixo mostra 5 exemplos dos registros dos reviews dos clientes.
| 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.
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 |
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.
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))
mapNesta 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')
figNa 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.")| 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)")| 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.")| 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.
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_reviewDesvio padrão: 0.016698
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()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.
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