O Rio de Janeiro é um dos destinos turísticos mais procurados do mundo, apresentando um mercado de aluguel de curta temporada dinâmico e heterogêneo. Para anfitriões e investidores, definir o preço correto de uma diária (pricing) é um desafio complexo que envolve variáveis como localização, amenidades oferecidas e sazonalidade. Da mesma forma, turistas buscam entender quais fatores realmente impactam o custo final da estadia. O problema central deste projeto é identificar os determinantes de preço no ecossistema do Airbnb carioca, respondendo à pergunta: Quais características estruturais e de serviço mais influenciam a valorização de um imóvel no Rio de Janeiro?
Os dados utilizados nesta análise provêm do portal Inside Airbnb, uma fonte independente e não comercial de dados públicos. O dataset refere-se à coleta realizada em 26 de setembro de 2025, contendo informações detalhadas sobre listagens, anfitriões e disponibilidade na cidade do Rio de Janeiro.
A abordagem metodológica segue o fluxo padrão de Ciência de Dados (CRISP-DM adaptado):
amenities).Esta análise servirá como ferramenta de inteligência de mercado. Para anfitriões, fornece evidências sobre quais investimentos (ex: instalar ar-condicionado ou piscina) trazem maior retorno financeiro. Para turistas, ajuda a identificar padrões de custo-benefício, permitindo decisões de reserva mais informadas.
Abaixo temos as bibliotecas da linguagem R utilizadas para viabilizar esta análise:
| Pacote | Utilidade no Projeto |
|---|---|
tidyverse |
Conjunto fundamental para manipulação de dados
(dplyr) e visualização (ggplot2). |
jsonlite |
Essencial para realizar o parsing da coluna de amenidades que está em formato JSON. |
stringr |
Manipulação de strings, usado para limpar símbolos de moeda e categorizar textos. |
purrr |
Programação funcional para iterar sobre as listas de amenidades. |
knitr |
Geração e formatação do relatório final. |
Importamos o dataset bruto, garantindo que strings não sejam convertidas automaticamente em fatores para facilitar a manipulação textual.
listings <- read.csv("listings.csv", stringsAsFactors = FALSE)
A variável bathrooms possuia muitos valores NA’s (4433),
por isso escolhemos a bathrooms_text e iremos extrair os
dados da mesma
# Seleção de colunas estratégicas
listings_clean <- listings %>%
select(
# Identificação e Texto
id, name, description,
# Anfitrião
host_id, host_total_listings_count, host_identity_verified,
host_is_superhost, host_since,
# Localização
neighbourhood_cleansed, latitude, longitude,
# Características do Imóvel
room_type, accommodates, bathrooms_text, bedrooms, beds, amenities,
# Preço e Regras
price, minimum_nights, maximum_nights,
# Reviews
number_of_reviews, review_scores_rating, last_review
)
# Verifique o tamanho
dim(listings_clean)
## [1] 43068 23
bathrooms_textlistings_clean <- listings_clean %>%
mutate(
# 1. Tenta extrair o primeiro número que aparecer (ex: "1.5" de "1.5 baths")
bathrooms_new = as.numeric(str_extract(bathrooms_text, "[0-9\\.]+")),
# 2. Correção de casos especiais (Text Mining)
bathrooms_final = case_when(
# Se estiver escrito "Half-bath" (Lavabo) e não tiver número, vale 0.5
is.na(bathrooms_new) & str_detect(tolower(bathrooms_text), "half-bath") ~ 0.5,
# Se achou o número no passo 1, usa ele
!is.na(bathrooms_new) ~ bathrooms_new,
# Se não achou nada, fica como NA
TRUE ~ NA_real_
)
) %>%
# Remove a coluna de texto antiga e a temporária, mantendo só a limpa
select(-bathrooms_text, -bathrooms_new) %>%
rename(bathrooms = bathrooms_final) # Renomeia para o nome padrão 'bathrooms'
# Verificação Rápida
# Vamos ver se deu certo (tem que aparecer números, não texto)
summary(listings_clean$bathrooms)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.000 1.000 1.000 1.483 2.000 16.000 53
listings_clean %>% count(bathrooms, sort = TRUE)
## bathrooms n
## 1 1.0 27294
## 2 2.0 8323
## 3 1.5 2158
## 4 3.0 1734
## 5 2.5 1136
## 6 3.5 430
## 7 4.0 430
## 8 0.0 340
## 9 0.5 310
## 10 5.0 195
## 11 4.5 171
## 12 6.0 139
## 13 5.5 88
## 14 7.0 79
## 15 8.0 55
## 16 6.5 53
## 17 NA 53
## 18 11.0 20
## 19 7.5 16
## 20 10.0 12
## 21 9.0 11
## 22 8.5 7
## 23 12.0 4
## 24 10.5 3
## 25 16.0 3
## 26 9.5 1
## 27 11.5 1
## 28 12.5 1
## 29 15.5 1
unique(listings_clean$bathrooms)
## [1] 1.5 2.0 1.0 3.0 4.0 7.0 6.0 5.0 2.5 3.5 4.5 0.0 9.0 0.5 6.5
## [16] 5.5 NA 8.0 7.5 8.5 10.0 15.5 12.0 11.0 16.0 11.5 9.5 10.5 12.5
priceA variável price foi importada originalmente como texto
(ex: "$1,200.00"). Para utilizá-la em cálculos
estatísticos, é necessário remover símbolos monetários e converte-la
para numérico. Antes de aplicar a limpeza definitiva, realizamos um
diagnóstico para mensurar a perda de dados (conversões que resultam em
NA ou zeros).
# 1. Simular a limpeza para identificar os problemas
diagnostico_precos <- listings %>%
select(id, price) %>%
mutate(
price_limpo = str_remove_all(price, "[\\$,]"), # Remove $ e vírgula
price_num = as.numeric(price_limpo) # Converte para numérico
)
# 2. Contar a perda total (NAs + Zeros)
perda <- diagnostico_precos %>%
summarise(
total_linhas = n(),
qtd_na = sum(is.na(price_num)),
qtd_zeros = sum(price_num == 0, na.rm = TRUE),
total_perdido = qtd_na + qtd_zeros,
porcentagem_perda = (total_perdido / total_linhas) * 100
)
print(perda)
## total_linhas qtd_na qtd_zeros total_perdido porcentagem_perda
## 1 43068 4398 0 4398 10.21176
Considerando que a perda de dados é de apenas 10.21%, o que é um pouco irrelevante frente ao total e que o preço é nossa variável alvo, optamos por remover observações inválidas.
listings_clean <- listings %>%
mutate(price = as.numeric(str_remove_all(price, "[\\$,]"))) %>%
filter(!is.na(price) & price > 0)
O mercado imobiliário do Rio de Janeiro é marcado por extrema desigualdade. Uma análise preliminar da distribuição de preços revela a presença de valores extremos (outliers) que distorcem a visualização e a média.
listings_clean %>%
ggplot(aes(y = price)) +
geom_boxplot(fill = "skyblue", outlier.color = "red", outlier.shape = 1) +
labs(
title = "Distribuição dos Preços (Dados Brutos)",
subtitle = "Presença de outliers extremos distorce a escala",
y = "Preço da Diária (R$)"
) +
theme_minimal()
Observa-se valores superiores a R$ 100.000,00, prováveis erros de cadastro. Para manter a análise focada no mercado real de turismo (incluindo o segmento de luxo, mas excluindo erros), aplicamos um filtro manual (Thresholding) limitando as diárias a R$ 5.000,00.
listings_clean <- listings_clean %>%
filter(price <= 5000)
# Visualização pós-filtro
listings_clean %>%
ggplot(aes(y = price)) +
geom_boxplot(fill = "skyblue") +
labs(
title = "Distribuição dos Preços (Filtro R$ 5.000)",
y = "Preço da Diária (R$)"
) +
theme_minimal()
Nota Metodológica: Consideramos utilizar o método estatístico do Intervalo Interquartil (IQR), que sugeriu um corte no valor deR$ 1.110. No entanto, descartamos essa abordagem pois ela eliminaria propriedades legítimas de alto padrão (coberturas em Copacabana e Ipanema), que são cruciais para nossa análise.
amenitiesA coluna amenities contém listas em formato JSON não
estruturado com mais de 7.000 variações textuais. Para transformar esses
dados em variáveis úteis para análise, realizamos um processo de:
# 1. Criação do dicionário de amenidades únicas
amenities <- listings_clean %>%
select(amenities) %>%
mutate(lista_convertida = purrr::map(amenities, function(x) {
# Tratamento de erro simples caso não seja JSON válido
tryCatch({
parsed <- jsonlite::fromJSON(as.character(x))
return(as.character(unlist(parsed)))
}, error = function(e) return(NA))
})) %>%
filter(!is.na(lista_convertida)) %>%
unnest(lista_convertida) %>%
select(amenity = lista_convertida) %>%
distinct()
Aplicando a categorização baseada em palavras-chave:
categorized_amenities <- amenities %>%
mutate(
amenity_lower = tolower(amenity),
category = case_when(
# Cozinha
str_detect(amenity_lower, "kitchen|stove|oven|baking|bread maker|dining table|dishwasher|trash|fridge|refrigerator|freezer|coffee|nespresso|tea|kettle") ~ "cozinha",
# Climatização
str_detect(amenity_lower, "split|ac unit|air conditioning|ar condicionado|midea|gree|consul|lg|samsung|springer|carrier|toshiba|fan|ventilador|ceiling|aquecedor|heating|heater") ~ "climatizacao",
# Exercício
str_detect(amenity_lower, "gym|exercise|bikes|kayak|boat|resort access") ~ "exercicio",
# piscina
str_detect(amenity_lower, "pool|hot tub|sauna") ~ "piscina",
# Internet
str_detect(amenity_lower, "wifi|ethernet") ~ "internet",
# Lazer
str_detect(amenity_lower, "game|ping pong|bowling|climbing") ~ "jogos",
str_detect(amenity_lower, "books|piano") ~ "relax",
str_detect(amenity_lower, "record player|tv|sound") ~ "entretenimento",
# Família
str_detect(amenity_lower, "baby|crib|high chair|changing table|children") ~ "familia",
# Banheiro
str_detect(amenity_lower, "conditioner|shampoo|soap|shower gel|essentials|hair dryer|bidet|hot water") ~ "banheiro",
# Estrutura
str_detect(amenity_lower, "ev charger|parking|garage|carport") ~ "estacionamento",
str_detect(amenity_lower, "balcony|garden|backyard|grill|hammock") ~ "area_externa",
# Localização
str_detect(amenity_lower, "view|beach|mar|water|lake") ~ "vista_e_localizacao",
# Lavanderia
str_detect(amenity_lower, "washer|dryer|drying rack") ~ "Lavanderia",
# Cuidado com Roupas
str_detect(amenity_lower, "iron|hangers|storage") ~ "Roupas",
# Serviços
str_detect(amenity_lower, "luggage|cleaning|breakfast|housekeeping") ~ "servicos",
# Segurança
str_detect(amenity_lower, "smoke|fire|first aid|carbon monoxide|safe|lock|key|security") ~ "seguranca",
TRUE ~ "Outros"
)
) %>% select(amenity, category)
# Top 10 categorias
categorized_amenities %>% count(category, sort = TRUE) %>% head(10) %>% kable()
| category | n |
|---|---|
| entretenimento | 2076 |
| cozinha | 1575 |
| banheiro | 1202 |
| internet | 589 |
| servicos | 396 |
| piscina | 305 |
| climatizacao | 80 |
| estacionamento | 79 |
| exercicio | 65 |
| familia | 53 |
Por fim, realizamos a pivotagem para integrar essas novas variáveis ao dataset principal.
# Definição das categorias estratégicas
categorias_importantes <- c(
"banheiro","cozinha","climatizacao","exercicio","piscina","internet","entretenimento","familia","relax","estacionamento","vista_e_localizacao","seguranca"
)
listings_dummies <- listings_clean %>%
select(id, amenities) %>%
mutate(amenities = str_remove_all(amenities, '\\[|\\]|\\"|\\\\')) %>%
separate_rows(amenities, sep = ",") %>%
mutate(amenities = str_trim(amenities)) %>%
filter(amenities != "") %>%
left_join(categorized_amenities, by = c("amenities" = "amenity")) %>%
filter(!is.na(category)) %>%
mutate(category_final = case_when(
category %in% categorias_importantes ~ category,
TRUE ~ NA_character_
)) %>%
filter(!is.na(category_final)) %>%
# Criação das variáveis binárias
distinct(id, category_final) %>%
mutate(tem_item = 1) %>%
pivot_wider(
names_from = category_final,
values_from = tem_item,
values_fill = 0
)
# Junção final
listings_completo <- listings_clean %>%
left_join(listings_dummies, by = "id") %>%
mutate(across(all_of(categorias_importantes), ~replace_na(., 0)))
O dataset final listings_completo encontra-se limpo, com
preços numéricos tratados, variáveis principais selecionadas e
enriquecido com 13 novas variáveis binárias indicando a presença de
amenidades chave.
Aqui nós vamos analisar os bairros mais populares no Airbnb.
# Selecionar os 20 bairros mais populares
top_bairros <- listings_completo %>%
count(neighbourhood_cleansed, sort = TRUE) %>%
top_n(20, n) %>%
pull(neighbourhood_cleansed)
listings_completo %>%
filter(neighbourhood_cleansed %in% top_bairros) %>%
filter(price <= 5000) %>% # Filtro visual
ggplot(aes(x = reorder(neighbourhood_cleansed, price, FUN = median), y = price)) +
geom_boxplot(fill = "steelblue", alpha = 0.7) +
scale_y_log10(labels = scales::dollar_format(prefix = "R$")) +
coord_flip() + # Vira o gráfico para ler os nomes
labs(
title = "Distribuição de Preços nos 20 Bairros Mais Populares",
x = "",
y = "Preço (Escala Log)"
) +
theme_minimal()
Ao analisar os 20 bairros mais populares do Rio de Janeiro (nessa
listagem), o gráfico nos mostra claramente como o valor da diária muda
dependendo da região:
Os Bairros Mais Caros: No topo da lista estão São Conrado, Lagoa, Leblon e Ipanema. A linha preta no meio das caixas (a mediana) está bem à direita, indicando que o preço “padrão” para se hospedar nessas áreas é naturalmente mais alto.
Muita Variedade (Copacabana e Barra): Em bairros como Barra da Tijuca e Copacabana, as caixas azuis são mais “compridas”. Isso significa que esses bairros atendem a todos os bolsos: existem muitas opções baratas, mas também muitas opções caras no mesmo lugar.
Opções Econômicas: Na parte inferior do gráfico, vemos o Centro, Tijuca e Catete como as opções mais acessíveis, com os preços médios mais baixos da lista.
Imóveis de Luxo em Todo Lugar: Os pontos pretos isolados à direita das caixas (outliers) mostram que, mesmo em bairros mais simples ou turísticos, existem imóveis de luxo que cobram valores muito acima da média local.
Agora vamos fazer uma visualização em mapa, onde o tamanho e cor dos círculos são baseados no preço médio do bairro
Vamos analisar o valor dos imóveis de acordo com as notas recebidas
library(lubridate)
# Filtro de qualidade: Imóveis ativos e avaliados
listings_avaliados <- listings_completo %>%
filter(
number_of_reviews >= 3,
!is.na(last_review),
last_review >= as.Date("2024-01-01"), # Apenas reviews recentes
)
listings_avaliados %>%
ggplot(aes(x = review_scores_rating, y = price)) +
geom_point(alpha = 0.3, color = "darkgray") +
geom_smooth(method = "gam", color = "blue") +
scale_y_log10(labels = scales::dollar_format(prefix = "R$")) +
labs(
title = "Correlação: Nota da Avaliação vs. Preço",
subtitle = "Filtro: Imóveis com >3 reviews",
x = "Nota (0 a 5)",
y = "Preço (Log)"
) +
theme_minimal()
Ao cruzar a nota média das avaliações
(review_scores_rating) com o preço da diária, o gráfico de
dispersão nos revela três comportamentos importantes do mercado:
Concentração de Notas Altas: A grande maioria dos imóveis está “espremida” no lado direito do gráfico, com notas entre 4,5 e 5,0. Isso mostra que é muito raro encontrar acomodações mal avaliadas na plataforma; a maioria das experiências é considerada positiva.
Nota não define Preço: A linha azul (tendência) permanece praticamente reta na maior parte do gráfico. Isso indica que ter uma nota maior não faz o preço subir automaticamente. Um imóvel com nota 4,0 tem, em média, uma faixa de preço muito parecida com um de nota 4,8.
Variedade de Preços na Nota Máxima: Ao olharmos para os imóveis com nota 5,0, vemos uma enorme variação vertical: existem desde opções super baratas (perto de R$ 100) até opções de luxo (acima de R$ 3.000).
Agora vamos ver a diferença dos tipos de quarto
# Tipo de quarto
room_type_plot <- listings_completo %>%
filter(price <= 5000) %>%
ggplot(aes(x = room_type, y = price, fill = room_type)) +
geom_boxplot() +
scale_y_log10() +
labs(title = "Impacto: Tipo de Quarto", x = "", y = "") +
theme_minimal() + theme(legend.position = "none", axis.text.x = element_text(angle = 45, hjust = 1))
print(room_type_plot)
O gráfico confirma a lógica de que “quanto mais privacidade, maior o preço”, mas traz um detalhe interessante sobre quartos de hotel:
Quartos de Hotel no Topo: A categoria “Hotel room” (caixa verde) apresenta a maior mediana de preço. Isso indica que, na média, ficar em um quarto de hotel listado no Airbnb sai mais caro do que alugar um apartamento inteiro comum.
A Grande Variação das Casas Inteiras: A categoria “Entire home/apt” (caixa vermelha) vem em segundo lugar no preço, mas note como a caixa e as linhas verticais são compridas. Isso mostra que esse grupo é muito misturado: engloba desde “kitnets” baratas até mansões caríssimas.
Opções Econômicas:Como esperado, “Private room” (quarto privado) e “Shared room” (quarto compartilhado) são as opções mais baratas. O quarto compartilhado (caixa roxa) é, isoladamente, a opção de menor custo da plataforma.
Primeiro vamos ver a relação entre número de banheiros e preço
O gráfico confirma que a quantidade de banheiros é um dos indicadores mais confiáveis de preço e padrão do imóvel:
A “Escada” de Valor: Existe uma relação positiva muito clara: a cada banheiro adicional, o preço mediano (linha preta no meio da caixa) sobe um degrau. Diferente da nota de avaliação, que não afetava muito o preço, aqui a correlação é visível e direta.
O Salto de Patamar: Note a diferença de altura entre as caixas de 1 banheiro e 3 banheiros. Enquanto imóveis com 1 banheiro têm mediana próxima a R$ 250,00, os de 3 banheiros saltam para quase R$ 1.000,00. Isso indica que banheiros extras geralmente estão associados a apartamentos muito maiores e luxuosos.
Indício de Tamanho: A variável “banheiros” funciona como um ótimo “proxy” (representante) para o tamanho total do imóvel. Dificilmente um imóvel pequeno tem 4 banheiros; portanto, ao filtrar por banheiros, indiretamente estamos filtrando por mansões e grandes apartamentos de temporada.
Agora vamos criar uma função para plotar os gráficos de
relação entre preço e a presença de uma amenity na sua
descrição
# Função para plotar amenidades binárias automaticamente
plot_amenity <- function(data, coluna, titulo) {
data %>%
ggplot(aes(x = factor(.data[[coluna]]), y = price, fill = factor(.data[[coluna]]))) +
geom_boxplot(fill="lightblue") +
scale_y_log10(labels = scales::dollar_format(prefix = "R$")) +
scale_x_discrete(labels = c("0" = "Não", "1" = "Sim")) +
labs(title = titulo, x = "", y = "Preço (Log)") +
theme_minimal() +
theme(legend.position = "none")
}
Este gráfico compara os preços das acomodações que têm piscina (“Sim”) com as que não têm (“Não”). A diferença visual é imediata e nos mostra que:
Valorização Clara: A caixa azul da direita (“Sim”) está posicionada bem acima da esquerda. Isso significa que, em geral, ter uma piscina aumenta significativamente o preço da diária. A linha preta central (mediana) mostra que o preço “padrão” de um imóvel com piscina é quase o dobro de um sem.
O “Piso” de Preço é Mais Alto: Note que a parte inferior da caixa da direita começa em um valor muito mais alto. Isso indica que é difícil encontrar acomodações muito baratas que tenham piscina; esse item estabelece um patamar mínimo de preço mais elevado.
Maior Variação de Preços: A caixa e as linhas verticais dos imóveis com piscina são mais longas. Isso sugere que, dentro da categoria “com piscina”, existe uma variedade enorme de luxo: desde prédios comuns com piscina compartilhada até mansões exclusivas com valores altíssimos.
O gráfico compara imóveis que possuem atributos de localização privilegiada (como “vista para o mar” ou “beira-mar”) com os demais. A análise visual nos mostra que:
O Preço da Paisagem: A caixa da direita (“Sim”) está posicionada mais acima do que a da esquerda (“Não”). A linha preta central (mediana) confirma que imóveis com vista ou localização privilegiada cobram, em média, diárias mais caras.
Difícil de achar “barato” com vista: Observe a parte de baixo das caixas. O “piso” de preço (o valor mínimo comum) dos imóveis com vista é mais alto. Isso indica que a vista funciona como um filtro natural: é muito raro encontrar uma acomodação “beira-mar” que seja extremamente econômica.
Muita Sobreposição: Apesar da valorização, existe muita sobreposição entre as duas caixas. Isso acontece porque muitos imóveis de luxo no Rio de Janeiro (no Leblon ou Ipanema, por exemplo) são caríssimos mesmo sem ter vista direta para o mar (ficando na quadra de trás ou ruas internas), o que eleva a média do grupo “Não”.
O gráfico nos mostra que, no Rio de Janeiro, o ar condicionado e/oyu
ventilador funcionam mais como um item essencial do que como um artigo
de luxo:
Valorização Moderada: A caixa da direita (“Sim”) está um pouco acima da esquerda (“Não”), e a linha preta (mediana) é ligeiramente mais alta. Isso indica que imóveis com ar condicionado são, sim, mais caros, mas a diferença não é tão gigantesca quanto a que vimos na Piscina ou na Vista.
Item de “Sobrevivência”: Como o Rio é uma cidade muito quente, o ar condicionado é quase obrigatório para qualquer imóvel mediano. Por isso, a caixa “Sim” é muito grande e abrange desde apartamentos simples até os de luxo.
O “Barato” sai quente: A principal diferença está na parte de baixo do gráfico. É possível encontrar imóveis sem ar condicionado por preços muito baixos (veja como a linha da esquerda desce mais). Já para ter ar condicionado, existe um preço mínimo que o turista precisa pagar.
O gráfico mostra que a comodidade de ter onde estacionar é um diferencial que encarece a diária, refletindo a dificuldade de estacionamento em áreas turísticas do Rio:
Diferença de Preço: A mediana (linha preta central) dos imóveis com garagem (“Sim”) é visivelmente superior à dos imóveis sem vaga. Isso confirma que o turista está disposto a pagar mais pela segurança e conveniência de guardar o carro.
Fator de “Piso”: Observe a parte inferior das caixas: imóveis com vaga de garagem raramente são muito baratos. A presença da vaga geralmente eleva o preço mínimo da locação, afastando o imóvel da categoria “super econômica”.
Valorização em Áreas Densas: Considerando que muitos bairros turísticos (como Copacabana) têm alta densidade e poucas vagas na rua, um imóvel que oferece garagem privativa ganha uma vantagem competitiva grande, justificando o preço maior observado no gráfico.
O gráfico revela que, diferente da piscina ou da vista, a cozinha não é um grande diferencial de luxo, mas sim uma comodidade padrão:
Diferença Muito Pequena: As duas caixas (“Não” e “Sim”) estão praticamente na mesma altura. A linha preta central (mediana) dos imóveis com cozinha é apenas levemente superior. Isso mostra que ter uma cozinha não faz o preço da diária disparar.
Item Básico, não de Luxo: A cozinha é esperada na maioria dos apartamentos inteiros (que são a maior parte do Airbnb). Por ser algo tão comum, ela não gera uma valorização extra significativa, ao contrário de itens raros como piscina.
O “Fundo do Poço” é mais baixo sem cozinha: A única diferença visível é na parte de baixo do gráfico. Os imóveis sem cozinha (provavelmente quartos simples ou de hotel) conseguem chegar a preços mínimos mais baixos do que os imóveis equipados.
O gráfico nos mostra que, no Rio de Janeiro, o ar condicionado funciona mais como um item essencial do que como um artigo de luxo:
Valorização Moderada: A caixa da direita (“Sim”) está um pouco acima da esquerda (“Não”), e a linha preta (mediana) é ligeiramente mais alta. Isso indica que imóveis com ar condicionado são, sim, mais caros, mas a diferença não é tão gigantesca quanto a que vimos na Piscina ou na Vista.
Item de “Sobrevivência”: Como o Rio é uma cidade muito quente, o ar condicionado é quase obrigatório para qualquer imóvel mediano. Por isso, a caixa “Sim” é muito grande e abrange desde apartamentos simples até os de luxo.
O “Barato” sai quente: A principal diferença está na parte de baixo do gráfico. É possível encontrar imóveis sem ar condicionado por preços muito baixos (veja como a linha da esquerda desce mais). Já para ter ar condicionado, existe um preço mínimo que o turista precisa pagar.
O objetivo central deste estudo foi desmistificar a composição de preços do Airbnb no Rio de Janeiro, respondendo à pergunta: “O que realmente valoriza uma diária na Cidade Maravilhosa?”. Através da limpeza e análise de dados de milhares de listagens, foi possível traçar uma hierarquia clara de valor.
A análise confirmou que o mercado carioca é fortemente segregado. A localização (Bairro) atua como o primeiro e mais forte discriminador de preço. Um imóvel “médio” no Leblon ou Ipanema custa invariavelmente mais que um imóvel de topo de linha na Tijuca ou Centro.
Além da localização, identificamos três categorias de influenciadores de preço:
Os Multiplicadores de Valor (Luxo): Atributos como Piscina, Vista/Beira-mar e Quantidade de Banheiros mostraram as correlações mais fortes com preços elevados. A variável “Banheiros”, em especial, provou ser um excelente proxy (indicador indireto) para o tamanho e padrão do imóvel: a cada banheiro adicional, o imóvel salta para uma nova faixa de preço.
Os Itens de Sobrevivência (Essenciais): Ar Condicionado e Internet comportam-se como itens obrigatórios. Sua presença não garante um preço de luxo (a mediana sobe pouco), mas sua ausência rebaixa o imóvel para as faixas de preço mais baixas. No clima do Rio de Janeiro, o ar condicionado é o divisor de águas entre o mercado “econômico” e o “padrão”.
O Paradoxo das Avaliações: Descobrimos que não existe correlação linear forte entre Nota e Preço. O mercado apresenta um viés de positividade (a maioria das notas é alta). Portanto, ter nota 5,0 é uma condição necessária para competitividade, mas não é suficiente para cobrar caro.
Esta análise representa um recorte temporal (Cross-sectional) referente a setembro de 2025. Portanto, ela não captura a sazonalidade crítica do Rio de Janeiro (Carnaval e Réveillon), onde a dinâmica de preços pode se alterar drasticamente.
Além disso, o corte manual de preços acima de R$ 5.000,00, embora
necessário para a visualização estatística, pode ter excluído o nicho de
“ultra-luxo” (mansões de celebridades). Para trabalhos futuros,
sugere-se uma análise de sentimentos nos textos dos comentários
(reviews) para entender se aspectos qualitativos (como a
simpatia do anfitrião) influenciam a taxa de ocupação, já que o preço
parece ser ditado majoritariamente pela estrutura física.