(Wickham et al. 2019), (Sievert et al. 2021)

AIRBNB: uma análise econômico-social

Acesso à base de dados:

[Kaggle] (https://www.kaggle.com/code/allanbruno/helping-regular-people-price-listings-on-airbnb/input)

Introdução

O Airbnb é um site de hospedagem no qual as pessoas podem alugar uma acomodação para outros viajantes. Os “hosts”, como são chamados os que detém o imóvel ou parte dele, se cadastram no site e fornecem informações da sua acomodação, como o endereço, experiências oferecidas, tipo de propriedade, fotos do local, dentre outras informações pertinentes para que um anúncio seja gerado com as informações e o preço. Assim, os “guests”, que são os hóspedes, podem esolher a acomodação que mais lhe agrada e, ao final da experiência, avaliam o ambiente e o dono ou funcionários da hospedagem. Existem vários tipos de imóveis, que vão desde um quarto em uma casa ou apartamento, até uma residência inteira em bairros de luxo. Os anfitriões estabelecem o preço de sua acomodação a partir de uma análise comparativa com outras hospedagens de mesmo padrão e eles podem fazer algumas exigências ou concessões, como cobrar uma taxa extra para limpeza, definir preços diferentes para determinados períodos do ano, dar descontos para estadias mais longas, limitar o tempo de hospedagem, entre outros. A plataforma online conta com mais de 400 milhões de pessoas cadastradas no mundo todo e mais de 7 milhões de acomodações. Em 2016, o Rio de Janeiro foi o quarto destino em número de anúncios do Airbnb no mundo, ficando atrás somente de Paris, Londres e Nova Iorque (Ramos, 2017). Neste trabalho, iremos analisar uma base de dados do airbnb do Rio de Janeiro no ano de 2019 e extrair algumas dessas informações para entender quais características são mais valorizadas pelos hospedes, qual a influência da reputação dos anfitriões no preço, quais são as características mais valorizadas pelos clientes, e diversas outras verificações que são pertinentes para um estudo economico e social desse tipo de plataforma. Esta análise pode fornecer insights valiosos sobre a dinâmica do mercado de hospedagem e seu impacto na sociedade.

Base de Dados

Os dados aqui apresentados foram coletados da plataforma Kagle. O arquivo é composto por 25 planilhas, sendo cada uma pertencente a um determinado mês dos anos de 2018 a 2020, sendo 2019 o único que possui planilhas de todos os meses. Cada planilha conta com cerca de 98 colunas e mais de 89000 linhas.

Limpeza e Filtragem de Dados:

Por ser uma base de dados extensa e com muitas informações desnecessárias para o projeto, foi feita uma análise de cada arquivo e selecionado apenas os mais importantes para esta aplicação e corrijido os seus nomes para automatizar os demais processos. Para a análise deste trabalho, filtramos apenas arquivos dos meses referentes ao ano de 2019. Todos os arquivos de 2019 foram reunidos em apenas uma planilha e colunas que não agregariam ao projeto foram excluídas, reduzindo para 55 o número de colunas e 422036 o número de linhas. Além disso, as colunas que continham os preços estavam como tipo String devido ao símbolo de ‘$’, o que dificultaria uma análise posterior e, por isso, excluimos o símbolo e transformamos os valores em Float. Segue abaixo os códigos utilizados nesse processo.

Vamos primeiro importar as bases de dados que estão dentro da pasta dataset em Projeto2VA e juntar em um só arquivo. Vamos usar o tibble pra armazenar e manipular os dados de tabelas (pertence ao tidyverse) Para não precisar importar uma por vez, vamos criar um laço que percorra a pasta e pegue todos. Criaremos uma coluna com a informação do nome do mês composto apenas pelas 3 primeiras letras, visto que o nome tem inconsistências na pasta. E outra coluna com os anos para não perder essas informações quando justarmos os df. O list.files vai listar todos os arquivos da pasta Vamos usar o bind_rows para concatenar todos os arquivos.

library(tidyverse)

meses <- c(‘jan’ = 1, ‘fev’ = 2, ‘mar’ = 3, ‘abr’ = 4, ‘mai’ = 5, ‘jun’ = 6, ‘jul’ = 7, ‘ago’ = 8, ‘set’ = 9, ‘out’ = 10, ‘nov’ = 11, ‘dez’ = 12)

caminho_bases <- “dataset2” arquivos <- list.files(caminho_bases, full.names = TRUE)

base_airbnb <- tibble()

for (arquivo in arquivos) { nome_arquivo <- basename(arquivo) nome_mes <- substr(nome_arquivo, 1, 3) mes <- meses[[nome_mes]]

#ano <- as.integer(gsub(“.csv”, ““, substr(nome_arquivo, 5, 8)))

df <- read_csv(arquivo) #df <- df %>% mutate(ano = ano, mes = mes) df <- df %>% mutate(mes = mes) base_airbnb <- bind_rows(base_airbnb, df) }

write_csv(base_airbnb, “C:\Users\Clariele\Desktop\Mestrado UFRPE\Computação para Análise de Dados\Projeto2VA\arquivo_combinado.csv”)

Excluindo colunas desnecessárias para a análise e gerando um novo arquivo.

Definir o caminho completo para o arquivo

caminho_arquivo <- “C:/Users/Clariele/Desktop/Mestrado UFRPE/Computação para Análise de Dados/Projeto2VA/arquivo_combinado.csv”

Ler o arquivo CSV para um dataframe

arquivo_combinado <- read_csv(caminho_arquivo)

Mostrar as colunas atuais do dataframe

View(arquivo_combinado) print(colnames(arquivo_combinado))

Colunas a serem excluídas:

colunas_para_excluir <- c(‘id’,‘listing_url’, ‘scrape_id’, ‘last_scraped’, ‘summary’, ‘space’, ‘description’, ‘neighborhood_overview’, ‘notes’, ‘transit’, ‘access’, ‘interaction’, ‘house_rules’, ‘thumbnail_url’, ‘medium_url’, ‘picture_url’, ‘xl_picture_url’, ‘host_id’, ‘host_url’, ‘host_name’, ‘host_since’, ‘host_name’, ‘host_since’, ‘host_location’, ‘host_about’, ‘host_picture_url’, ‘host_thumbnail_url’, ‘host_neighbourhood’, ‘host_has_profile_pic’, ‘city’, ‘zipcode’, ‘smart_location’, ‘state’, ‘country_code’, ‘country’, ‘is_location_exact’, ‘calendar_updated’, ‘has_availability’, ‘availability_30’, ‘availability_60’, ‘availability_365’, ‘availability_90’, ‘calendar_last_scraped’, ‘last_review’, ‘first_review’, ‘last_review’, ‘jurisdiction_names’, ‘license’, ‘require_guest_profile_picture’, ‘require_guest_phone_verification’, ‘neighbourhood_group_cleansed’, ‘market’, ‘neighbourhood_cleansed’, ‘host_acceptance_rate’, ‘host_listings_count’, ‘host_verifications’, ‘reviews_per_month’)

Excluir as colunas do dataframe arquivo_combinado

arquivo_combinado <- arquivo_combinado %>% select(-any_of(colunas_para_excluir))

Salvando o dataframe atualizado de volta para um arquivo CSV

write_csv(arquivo_combinado, caminho_arquivo)

Mostrando quantos valores vazios tem em cada coluna

na_counts <- colSums(is.na(base_airbnb)) print(na_counts)

Mostrando o tipo de dado de cada coluna. Se tiver algo errado, vamos arrumar:

tipos_dados <- sapply(base_airbnb, class) print(tipos_dados)

As colunas que contém preço estão sendo lidas como “character”, pois usam o $ e “,” como separador. Vamos tratar essas colunas:

colunas <- c(‘price’, ‘weekly_price’, ‘monthly_price’, ‘security_deposit’, ‘cleaning_fee’, ‘extra_people’)

Vamos retirar o símbolo $ e “,” e transformar para valor númerico.

base_airbnb <- base_airbnb %>% mutate(across(all_of(colunas), ~ as.numeric(str_replace_all(str_replace_all(., “\$”, ““),”,“,”“))))

Vamos visualizar o resultado:

str(base_airbnb)

write_csv(base_airbnb, caminho_arquivo)

Pacotes Utilizados

A seguir, vamos importar todos os pacotes que utilizaremos no projeto.

library(dplyr)
library(ggplot2)
library(readr)
library(tidyr)
library(stringr)
library(gridExtra)
library(plotly)
library(data.table)
library(knitr)

Segue a tabela com os pacotes que foram utilizados para o projeto e suas respectivas aplicações.

tabela <- data.table('ESTRUTURA DE DADOS' = c('tibble', 'dplyr', 'stringr', 'readr', 'ggplot2', 'plotly', 'gridExtra', 'data.table', 'knitr'), 'APLICAÇÃO' = c('Armazenamento e manipulação de dados de tabelas', 'Manipulação e transformação de dados', 'Manipulação de strings', 'Leitura de arquivos de texto', 'Geração de gráficos', 'Geração de gráficos', 'Arranjo de gráficos', 'Criação de Tabela', 'Formatação de tabela'))

print(kable(tabela, format = "pipe", align = c('l', 'l')))
## 
## 
## |ESTRUTURA DE DADOS |APLICAÇÃO                                       |
## |:------------------|:-----------------------------------------------|
## |tibble             |Armazenamento e manipulação de dados de tabelas |
## |dplyr              |Manipulação e transformação de dados            |
## |stringr            |Manipulação de strings                          |
## |readr              |Leitura de arquivos de texto                    |
## |ggplot2            |Geração de gráficos                             |
## |plotly             |Geração de gráficos                             |
## |gridExtra          |Arranjo de gráficos                             |
## |data.table         |Criação de Tabela                               |
## |knitr              |Formatação de tabela                            |

Análise dos Dados

Iremos agora explorar os dados já obtidos e tratados anteriormente. Veremos que, a partir deles, é possível realizar diversas análises que podem proporcionar uma melhoria no atendimento ao cliente, aumento do lucro ou redução de desperdício, e outras características que vão depender do tipo de dados que são recolhidos. Com os dados aqui coletados, é possível analisar questões como:

  • Quais serviços oferecidos são o diferencial de um superhost?

  • Quais serviços básicos costumam ser oferecidos pelos hosts?

  • Quanto costumam cobrar pelos serviços extras?

  • Quais características do imóvel são mais valorizadas pelos hospedes?

  • Quais localidades cobram mais caro pela hospedagem?

    As respostas dessas perguntas podem ajudar um host a se tornar um superhost ou realizar cobranças devidas pelos serviços oferecidos, de modo que ele poderá aumentar seu lucro e fazer novos negócios que sejam interessantes para os hospedes.

Superhost

Para se tornar um superhost, o dono da hospedagem precisa atender a critérios como excelência do serviço confirmada pela avaliação dos hospedes; baixa taxa de cancelamento; alta taxa de resposta; e ter realizado mais de 10 estadias ou completado 100 noites em pelo menos 3 reservas nos últimos 12 meses. Os superhosts possuem algumas vantagens na plataforma, como maior visibilidade com um destaque nas pesquisas que aumentam a chance de uma nova reserva; distintivo de superhost, que aparece em seu perfil e sinaliza aos clientes que aquele anfitrião é de confiança; suporte prioritário na plataforma, o ajudando a resolver problemas mais rápido e facilmente; convite para eventos exclusivos do Airbnb; entre outras vantagens. Sendo assim, é de grande interesse para quem está oferecendo o serviço, se tornar um superhost e aqui analisaremos os dados que podem ajudar quem está na busca de se tornar um superhos na plataforma Airbnb. Para começar, vejamos na tabela abaixo a quantidade de Reviews que os hosts e superhosts possuem.

caminho_arquivo <- "C:/Users/Clariele/Desktop/Mestrado UFRPE/arquivo_combinado_2.csv"

base_airbnb <- read_csv(caminho_arquivo)

#Gráfico em barras com a média da taxa de resposta para os superhosts

base_airbnb_3 <- base_airbnb %>% 
  filter(!is.na(host_is_superhost)) %>% 
  filter(!is.na(number_of_reviews))

base_airbnb_3 <- base_airbnb_3 %>% 
  mutate(host_is_superhost = ifelse(host_is_superhost == 0, "superhost", "host"))

review_counts <- base_airbnb_3 %>% 
  group_by(host_is_superhost) %>% 
  summarise(total_reviews = sum(number_of_reviews, na.rm = TRUE))

plot_ly(
  type = 'table',
  header = list(
    values = c('Host Type', 'Total Reviews'),
    align = 'center',
    line = list(width = 1, color = 'darkblue'),
    fill = list(color = 'skyblue'),
    font = list(family = 'Arial', size = 14, color = 'white')
  ),
  cells = list(
    values = rbind(review_counts$host_is_superhost, review_counts$total_reviews),
    align = 'center',
    line = list(color = 'darkblue', width = 1),
    fill = list(color = c('white', 'white')),
    font = list(family = 'Arial', size = 12, color = c('darkblue'))
  )
)

Superhosts possuem, aproximadamente, 4.6% a mais de número de reviews. Não é um valor de destaque. Vejamos a seguir o tempo de resposta deles para avaliar sua importância.

Tempo de Resposta

dados_superhost <- base_airbnb %>% filter(host_is_superhost == TRUE) %>% filter(host_response_time != "N/A")

plot1 <- ggplot(dados_superhost, aes(x = host_response_time)) +
  geom_bar(fill = 'darkorange') +
  theme_minimal() +
  labs(title = "Superhosts", x = "Tempo de Resposta", y = "Quantidade") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

#Gráfico em barras com a média da taxa de resposta para os não-superhosts
  
dados_nao_superhost <- base_airbnb %>% filter(host_is_superhost == FALSE)
dados_nao_superhost <- dados_nao_superhost %>% filter(host_response_time != "N/A")

plot2 <- ggplot(dados_nao_superhost, aes(x = host_response_time)) +
  geom_bar(fill = "steelblue") +
  theme_minimal() +
  labs(title = "Não Superhosts", x = "Tempo de Resposta", y = "Quantidade") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

grid.arrange(plot1, plot2, nrow=1, ncol=2)

A partir dos gráficos, podemos perceber que aproximadamente 70% dos Superhosts respondem as solicitações dos seus clientes em menos de 1h e nenhum deles demora mais de um dia para responder. Os anfitriões que não são superhosts, por sua vez, costumam demorar mais para responder, embora aproximadamente 30% deles responda em menos de 1h, existe uma taxa significativa que deixa seus clientes esperando resposta por mais de um dia. Essa espera pode fazer com que o hóspede desista da reserva e procure um outro anfitrião, levando a perda de receita e possíveis comentários negativos que dificultam futuras reservas.

Também é possível notar que, apesar de ser um fator importante, não é a única característica que leva um anfitrião a se tornar um Superhost, visto que mais de 60000 anfitriões responde rapidamente, mas não possuem o selo. Portanto, é preciso levar em consideraçãao outras características que são importantes para essa validação.

Descontos na Hospedagem Semanal

Alguns hosts costumam oferecer um desconto na hospedagem caso a reserva seja de pelo menos uma semana. Esse desconto facilita para quem precisa se hospedar por mais tempo e, ao mesmo tempo, reduz o esforço de busca de novo hóspede para quem oferece a estadia. Nem todos os anfitriões oferecem esse desconto, então estes foram retirados da análise.

#Calculando a porcentagem de desconto na reserva semanal

base_airbnb_filtered <- base_airbnb %>% filter(!is.na(price) & !is.na(weekly_price))
base_airbnb_filtered <- base_airbnb_filtered %>% mutate(difference_week_percent = (((price * 7) - weekly_price)/(price * 7))*100)
base_airbnb_filtered <- base_airbnb_filtered %>% filter(difference_week_percent >= 0)

#Contando quantas vezes cada faixa de valor de desconto aparece na base de dados:

count_m5 <- base_airbnb_filtered %>%
  filter(difference_week_percent <= 5) %>%
  summarize(count = n())

count_m10 <- base_airbnb_filtered %>%
  filter(difference_week_percent > 5 & difference_week_percent <= 10) %>%
  summarize(count = n())

count_m15 <- base_airbnb_filtered %>%
  filter(difference_week_percent > 10 & difference_week_percent <= 15) %>%
  summarize(count = n())

count_m20 <- base_airbnb_filtered %>%
  filter(difference_week_percent > 15 & difference_week_percent <= 20) %>%
  summarize(count = n())

#Fazendo um gráfico de pizza para mostrar qual faixa de valor é mais recorrente:
counts <- data.frame(
  category = c("<= 5%", "> 5% & <= 10%", "> 10% & <= 15%", "> 15% & <= 20%"),
  count = c(count_m5$count, count_m10$count, count_m15$count, count_m20$count)
)

ggplot(counts, aes(x = "", y = count, fill = category)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar("y", start = 0) +
  theme_void() +
  labs(title = "Quantidade de hosts que oferece desconto na hospedagem semanal", fill = "Faixa de Desconto") +
  theme(legend.title = element_text(face = "bold", size = 12)) +
  geom_text(aes(label = count), position = position_stack(vjust = 0.5))

A partir do gráfico de setores mostrado acima, podemos perceber que mais da metade dos hosts que oferecem desconto costuma cobrar pelo menos 10% mais barato pela hospedagem quando reservada por uma semana. E quase 15% deles oferece mais de 15% de desconto nesse tipo de hospedagem. Sendo assim, o hóspede pode procurar por esses estabelecimentos para que se instale por mais dias e gastando menos.

Cobranças Extras

Taxa de Limpeza

Alguns hosts costumam cobrar uma taxa extra para a limpeza do local de hospedagem. Esse valor costuma variar de acordo com o tipo de hospedagem, seja hotel, quarto compartilhado, casa ou apartamento. Nesta seção, vamos mostrar o preço médio que cada tipo de hospedagem costuma cobrar por essa taxa de limpeza. Nesse momento, não estamos levando em consideração outros fatores que também impactam nesse valor, como a localização da hospedagem, por exemplo. O gráfico foi gerado levando em consideração apenas a média do preço de cada tipo de hospedagem, conforme o código a seguir.

#Excluindo transformando a coluna de cleaning_fee em valores numéricos e excluido valores NA

base_airbnb_fee <- base_airbnb %>% filter(cleaning_fee != "NA") %>% filter(room_type != "NA")

# Cálculo do preço preço médio por tipo de quarto
average_cleaning_fee <- aggregate(cleaning_fee ~ room_type, base_airbnb, mean)

# Gráfico em barras do preço médio da taxa de limpeza por tipo de quarto
ggplot(average_cleaning_fee, aes(x = room_type, y = cleaning_fee)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  labs(title = "Preço Médio da Taxa de Limpeza por Tipo de Quarto",
       x = "Tipo de Quarto",
       y = "Preço Médio ($)") +
  theme_minimal()

A partir do gráfico, é possível perceber que a taxa de limpeza cobrada pelo quarto de hotel e pelo quarto privado em casa/apartamento são similares, enquanto os quartos compartilhados costumam cobrar menos por esse serviço. Essa relação, no entanto, não é proporcional a quantidade de pessoas que podem se hospedar no quarto, visto que a diferença de preço da taxa do quarto privado e compartilhado não chega a 1/3 do seu valor. Já para o espaço completo individual (casa ou apartamento), a taxa costuma ser bem mais alta do que as demais, custando em média mais de R$175.

Taxa por Pessoa Extra

As hospedagens costumam limitar a quantidade de pessoas que pode pernoitar no local. Caso o cliente necessite colocar uma pessoa a mais, alguns locais permitem esse feito desde que pague um valor a mais por esse novo hóspede. Vamos calcular a média de valor que cada tipo de hospedagem costuma cobrar por isso. Novamente, não vamos levar em consideração nenhum outro fator além do preço e tipo de quarto.

# Cálculo do preço preço médio por tipo de quarto
average_extra_people <- aggregate(extra_people ~ room_type, base_airbnb, mean)

# Gráfico em barras do preço médio por pessoa extra por tipo de quarto
ggplot(average_extra_people, aes(x = room_type, y = extra_people)) +
  geom_bar(stat = "identity", fill = "purple") +
  labs(title = "Preço Médio por Pessoa Extra por Tipo de Quarto",
       x = "Tipo de Quarto",
       y = "Preço Médio ($)") +
  theme_minimal()

O gráfico nos mostra que o quarto compartilhado chega a cobrar, em média, quase o dobro que um quarto de hotel por um hóspede extra, o que pode ser um empecilho para o hóspede quando houver essa necessidade.

Preço

Ao se hospedar em um local, o cliente pode fazer diversas avaliações, como avaliação da limpeza, da segurança, comunicação com o host, entre outras. Neste momento, vamos avaliar a pontuação que os hóspedes forneceram para as hospedagens separando por categoria de preço.

base_airbnb_loc <- base_airbnb %>% 
  filter(!is.na(price)) %>% 
  filter(!is.na(review_scores_location))

# Criar a categoria de preço por faixa de valores
base_airbnb_loc$price_category <- cut(base_airbnb_loc$price, 
                                      breaks = c(0, 100, 250, 500, 1000), 
                                      labels = c("A: $0-$100", "B: $100-$250", "C: $250-$500", "D: $500-$1000"))

score_counts <- base_airbnb_loc %>% 
  group_by(price_category, review_scores_location) %>% 
  summarise(count = n())

plot_ly(score_counts, 
        x = ~review_scores_location, 
        y = ~count, 
        color = ~price_category,
        colors = "Set1",  
        type = 'scatter', 
        mode = 'lines+markers',
        line = list(width = 1)) %>%
  layout(title = "Quantidade de Review Scores Location por Categoria de Preço",
         xaxis = list(title = "Review Scores Location"),
         yaxis = list(title = "Quantidade"),
         legend = list(title = list(text = "Categoria de Preço")))

Pelo gráfico, podemos concluir que as hospedagens recebem, em média, uma pontuação entre 7 e 10, independente da sua faixa de preço. No entanto, as de categoria B (com preço entre $100 e $250) possuem um número maior de avaliações com pontuação entre 9 e 10, chegando a ser quase o dobro da categoria C e o quádruplo das demais.

Conclusão

As análises possíveis para o banco de dados aqui estudados vai muito além do que foi abordado neste traballho. Aqui foi feito um compilado de algumas interpretações dos dados para demonstrar como é possível extrair insights com as informações fornecidas e como isso pode ser importante em um contexto de estratégico. Foram utilizados 4 tipos de gráficos ao longo desse projeto, sendo eles: gráfico de barras, de setores, linhas e tabela.

Referências

Sievert, Carson, Chris Parmer, Toby Hocking, Scott Chamberlain, Karthik Ram, Marianne Corvellec, Pedro Despouy, and Maintainer Carson Sievert. 2021. “Package ???plotly???” R Foundation for Statistical Computing, Vienna. Available in: Https://Cran. R-Project. Org/Package= Plotly (Accessed 10 August 2023).
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the Tidyverse.” Journal of Open Source Software 4 (43): 1686.