Declaração do Problema e Relevância
O objetivo deste projeto é analisar os dados de um aplicativo de transporte, como o Uber. Em grandes cidades, a compreensão de padrões de uso, comportamento dos passageiros e variações nos preços das corridas pode oferecer insights valiosos sobre o comportamento do consumidor e ajudar empresas a otimizar suas operações e estratégias de marketing. Com a crescente popularidade dos serviços de transporte por aplicativo, é crucial entender as preferências dos usuários e os padrões de uso. Este estudo é relevante porque pode ajudar a identificar quais tipos de serviços são mais valorizados e quais aspectos podem ser melhorados para aumentar a satisfação do cliente e a eficiência operacional.
Abordagem do Problema e Metodologia
Para abordar este problema, foi utilizado um conjunto de dados disponível publicamente sobre viagens de transporte por aplicativo. O dataset contém informações sobre o tipo de viagem, o dispositivo utilizado pelos passageiros, a pontuação dada aos motoristas e os preços das corridas.
A metodologia incluirá:
Importação e Limpeza de Dados: Importação dos dados brutos, seguida de limpeza para remover inconsistências e preparar o dataset para análise.
Análise Quantitativa: Realização de análises estatísticas para entender a distribuição dos tipos de viagem, a popularidade dos dispositivos utilizados e a pontuação média dos passageiros.
Análise Qualitativa e Correlacional: Exploração das relações entre variáveis, como o preço médio das corridas por tipo de viagem e o impacto dessas variáveis nas avaliações dos motoristas.
Técnicas Propostas
Análise Descritiva: Utilização de gráficos e estatísticas para descrever a distribuição e os padrões no conjunto de dados.
Análise Correlacional: Investigação das relações entre diferentes variáveis, como preço e tipo de viagem, utilizando métodos estatísticos e gráficos de dispersão.
Visualização de Dados: Criação de gráficos e tabelas para a apresentação das descobertas.
Impacto da Análise
Os resultados da análise fornecerão insights valiosos para empresas de transporte, permitindo:
Otimização de Preços: Compreender os padrões de preços e a relação com o tipo de viagem pode ajudar as empresas a ajustar suas tarifas para maximizar a satisfação dos passageiros e a rentabilidade.
Melhoria da Experiência do Usuário: Identificar quais dispositivos são mais utilizados e como eles afetam as avaliações pode orientar melhorias na interface do aplicativo.
Estratégias de Marketing: Conhecer os tipos de viagens mais populares pode ajudar na criação de campanhas de marketing direcionadas e na oferta de promoções.
Para a execução correta do código neste projeto, é essencial a instalação dos pacotes listados a seguir. Sem eles, o código não rodará com sucesso.
| Pacotes | Utilização |
|---|---|
library(stringr) |
Manipular strings e expressões regulares |
library(dplyr) |
Manipular os dados de maneira avançada |
library(tidyr) |
Limpeza de dados |
library(data.table) |
Realizar operações com tabelas |
library(knitr) |
Gerar tabelas no R Markdown |
library(DT) |
Visualizar dados em tabelas |
library(rmarkdown) |
Converter arquivos RMarkdown em formatos variados |
library(plotly) |
Criar gráficos interativos |
library(rmdformats) |
Temas de documentos RMarkdown |
Os dados utilizados neste projeto foram adquiridos pela plataforma Kaggle
Explicação sobre os Dados
Esse conjunto de dados foi obtido por uma startup de mobilidade que opera na cidade de Lima que desejava analisar como estava funcionando o sistema de Uber do Peru. Este Dataset possui 23.111 IDs únicos, que representam cada viagem realizada pelo aplicativo. O valor de cada corrida é calculado com base na distância, tempo estimado de viagem e disponibilidade de carros.
Os dados foram coletados ao longo de 2010, capturando informações detalhadas sobre cada corrida, incluindo identificadores de viagem, usuário, motorista, e táxi, além de dados geográficos, financeiros, e de satisfação.
O dataset original contém 28 variáveis distintas, que incluem detalhes como a localização inicial e final da viagem, o tempo de início e término, o preço, a distância percorrida, e as pontuações dadas por motoristas e passageiros. Uma peculiaridade deste dataset é que todas essas variáveis foram concatenadas em uma única coluna, o que dificulta a manipulação direta.
Além disso, o conjunto de dados apresenta muitos valores ausentes, registrados de maneiras inconsistentes, como células vazias ou com a string “not found”, que devem ser tratados para facilitar a análise. Apesar disso ele fornece um bom ponto de partida para compreender como empresas de carsharing coletam seus dados.
Segue abaixo a importação dos dados e uma pequena visualização deles.
library(dplyr)
library(tidyr)
library(rmarkdown)
uberData <- read.table("C:/Users/Beatriz Figueiredo/Documents/uber_peru_2010.csv", header = TRUE, sep = ";")
#Visualização dos dados
paged_table(uberData[1:5,], list(rows.print = 10))Limpeza dos Dados
A seguir temos o processo de limpeza dos dados, começando por verificar se existem linhas duplicadas no dataset:
## integer(0)
A resposta “integer(0)” indica que não existem linhas duplicadas, portanto, não é necessário realizar tratamento nessa parte. Em seguida, lista o nome das colunas e remove as colunas que não contêm informações relevantes ou que são redundantes:
## [1] "journey_id" "user_id" "driver_id" "taxi_id"
## [5] "icon" "start_type" "start_at" "start_lat"
## [9] "start_lon" "end_at" "end_lat" "end_lon"
## [13] "end_state" "driver_start_lat" "driver_start_lon" "arrived_at"
## [17] "currency" "price" "price_distance" "price_duration"
## [21] "distance" "duration" "cost" "cost_distance"
## [25] "cost_duration" "source" "driver_score" "rider_score"
uberData <- subset(uberData %>% select(-c(taxi_id, driver_score, cost, cost_distance, cost_duration, driver_start_lat, driver_start_lon, currency)))Verifica se existem valores ausentes (NA) e remove-os das colunas principais. Primeiro, se converte as strings vazias em NA para facilitar o tratamento:
# Conversão de strings vazias em NA
uberData <- uberData %>%
mutate(across(where(is.character), ~ na_if(., "")))
# Substituição de zeros por NA nas colunas específicas
uberData <- uberData %>%
mutate(
price = na_if(price, 0),
rider_score = na_if(rider_score, 0),
price_distance = na_if(price_distance, 0),
price_duration = na_if(price_duration, 0)
)
# Verificação dos NAs
index <- which(is.na(uberData$source))
length(index)## [1] 123
Convertemos as colunas qualitativas em fatores:
uberData$icon <- as.factor(uberData$icon)
uberData$start_type <- as.factor(uberData$start_type)
uberData$end_state <- as.factor(uberData$end_state)
uberData$source <- as.factor(uberData$source)Para melhor clareza, converti os valores da coluna distancia de decímetros para metros.
Também converti os valores das colunas de preço que estão em Novo Sol (moeda do Peru) para Reais
uberData$price <- uberData$price/1.49
uberData$price_distance <- uberData$price_distance/1.49
uberData$price_duration <- uberData$price_duration/1.49
uberData$price <- uberData$price/1000
uberData$price_distance <- uberData$price_distance/1000
uberData$price_duration <- uberData$price_duration/1000Conjunto de Dados Final
Vamos verificar como ficou a base de dados agora, após os tratamentos:
Explicação
O que é cada uma das variáveis/colunas da base de dados
| Coluna | Utilização |
|---|---|
journey_id |
Id único referente a cada viagem |
user_id |
Id único referente a passageiro do app |
driver_id |
Id único referente a cada motorista do app |
icon |
Tipo de viagem escolhida |
start_type |
Como a viagem foi iniciada (com atraso, assim que possível ou reservado) |
start_at |
Data e horário de partida |
start_lat |
Latitude de origem da viagem |
start_lon |
Longitude de origem da viagem |
end_at |
Data e horário da chegada |
end_lat |
Latitude de chegada da viagem |
end_lon |
Longitude de chegada da viagem |
end_state |
Status final da corrida |
arrived_at |
Horário que o motorista chegou |
price |
Preço total da viagem |
price_distance |
Preço parcial cobrado pela distância percorrida |
price_duration |
Preço parcial cobrado pela duração da viagem |
distance |
Distância percorrida em decímetros |
duration |
Tempo total gasto na viagem |
source |
Dispositivo do usuário que solicitou a corrida |
rider_score |
Pontuação de 1 a 5 estrelas dada ao passageiro (quanto maior o número, melhor a avaliação do motorista) |
Nessa aba, serão apresentadas informações obtidas por meio de gráficos e análises quantitativas, além de correlações entre variáveis que permitem uma exploração qualitativa dos dados.
Neste tópico, vamos explorar algumas análises quantitativas baseadas nas colunas “icon”, “source” e “riderScore”.
O gráfico abaixo mostra o número de viagens que foi realizado pela Uber classificadas pelo tipo. Podemos observar que o tipo “executive” foi a mais utilizada e a “group” a menos utilizada.
# Calculo do número de viagens por tipo
icon_size <- sort(table(uberData$icon), decreasing = TRUE)
# Cores
icon_colors <- c("executive" = "darkblue", "easy" = "darkgreen", "group" = "darkred")
bar_colors <- icon_colors[names(icon_size)]
# Gráfico de barras
barplot_heights <- barplot(icon_size, names.arg = names(icon_size),
col = bar_colors,
ylim = c(0, max(icon_size) + 2000),
main = "Número de viagens por tipo de viagem",
xlab = "Tipo de Viagem", ylab = "Número de Viagens",
las = 1, cex.names = 0.8)
text(x = barplot_heights, y = icon_size + 500, label = icon_size, cex = 0.8)
legend("topright", inset = .02, legend = names(icon_size),
fill = bar_colors, title = "Tipo de Viagem", cex = 0.8)O gráfico abaixo mostra os tipos de dispositivos utilizados ao pedir uma viagem. Com ele podemos perceber que a maioria utilizou “IPhone” e a minoria usou “Wap”.
if (!require(plotly)) {
install.packages("plotly")
library(plotly)
} else {
library(plotly)
}
if (!require(dplyr)) {
install.packages("dplyr")
library(dplyr)
} else {
library(dplyr)
}
# Conta os dispositivos com mais viagens
source_counts <- uberData %>%
count(source, sort = TRUE)
# Gráfico de pizza com legenda
fig <- plot_ly(source_counts, labels = ~source, values = ~n, type = 'pie') %>%
layout(title = 'Número de viagens por dispositivo utilizado para pedir a viagem',
legend = list(x = 1, y = 0.5))
figCom o gráfico de área abaixo, podemos observar a distribuição das pontuações dadas pelos passageiros. A análise dos dados revela que a nota mais frequentemente atribuída é a “Excelente” (nota 5), conforme evidenciado pela maior área correspondente no gráfico.
aux <- table(uberData$rider_score)
valores <- as.numeric(aux)
nomesDasCategorias <- names(aux)
par(mar = c(5, 5, 4, 5))
# Gráfico de área
plot(1:length(valores), valores,
type = "n",
xlab = "Notas",
ylab = "Quantidade de Avaliações",
main = "Notas dadas aos passageiros",
xaxt = "n",
ylim = c(0, max(valores) * 1.3),
xlim = c(0.8, length(valores) + 0.5))
polygon(c(1:length(valores), length(valores):1),
c(valores, rep(0, length(valores))),
col = rainbow(length(aux)),
border = NA)
axis(1, at = 1:length(valores), labels = c("1", "2", "3", "4", "5"))
text(x = 1:length(valores),
y = valores + max(valores) * 0.1,
labels = valores,
col = "black",
cex = 1.2,
font = 2) A análise correlacional revela as relações entre diferentes variáveis do dataset. Nesta análise, exploraremos correlações entre vários fatores, como:
A média de preço das corridas em relação ao tipo de viagem.
O tipo de dispositivo utilizado para solicitar a viagem e como a viagem foi iniciada
O tempo de viagem e as notas dadas pelos passageiros.
Aqui, analisamos como os diferentes tipos de viagem influenciam no preço médio das corridas.
library(dplyr)
custom_colors <- c("group" = "lightpink",
"executive" = "lightsalmon",
"easy" = "lightgreen")
# Calcular a média de preço por tipo de corrida
corrida <- uberData %>%
group_by(TipodeCorrida = icon) %>%
summarise(Media = mean(price, na.rm = TRUE))
bar_colors <- custom_colors[match(corrida$TipodeCorrida, names(custom_colors))]
# Gráfico de colunas
plot <- barplot(corrida$Media,
main = "Média de preço da corrida por tipo de viagem",
xlab = "Tipo de viagem",
ylab = "Média dos valores",
xlim = c(0, max(corrida$Media) + 10),
horiz = TRUE,
cex.names = 0.8,
names.arg = corrida$TipodeCorrida,
col = bar_colors)
text(x = corrida$Media + 1, y = plot, label = as.character(round(corrida$Media, digits = 2)))
legend("topright", inset = .02,
legend = names(custom_colors),
fill = custom_colors,
title = "Tipo de viagem",
cex = 0.8)Ao observar o gráfico, notamos que as viagens do tipo “group” apresentaram os maiores preços, enquanto as do tipo “easy” tiveram os menores. Vale destacar que, conforme já constatado, o tipo de viagem mais realizado foi o “executive”, enquanto o “group” foi o menos frequente. Isso nos leva a concluir que, embora o número de viagens do tipo “group” tenha sido baixo, as pessoas que escolheram essa opção pagaram mais caro em comparação com aquelas que optaram pelo tipo “executive”.
Nessa aba, analisaremos a relação entre os tipos de dispositivos utilizados para solicitar um Uber e o status de início da viagem, como atrasos, reservas antecipadas, ou solicitações imediatas.
# Filtragem e Contagem dos dados para contar o número de viagens solicitadas
dispositivo_android_asap <- length((uberData %>% filter(source == "Android" & start_type == "asap"))$start_type)
dispositivo_android_delayed <- length((uberData %>% filter(source == "Android" & start_type == "delayed"))$start_type)
dispositivo_android_reserved <- length((uberData %>% filter(source == "Android" & start_type == "reserved"))$start_type)
dispositivo_ipad_asap <- length((uberData %>% filter(source == "iPad" & start_type == "asap"))$start_type)
dispositivo_ipad_delayed <- length((uberData %>% filter(source == "iPad" & start_type == "delayed"))$start_type)
dispositivo_ipad_reserved <- length((uberData %>% filter(source == "iPad" & start_type == "reserved"))$start_type)
dispositivo_iphone_asap <- length((uberData %>% filter(source == "iPhone" & start_type == "asap"))$start_type)
dispositivo_iphone_delayed <- length((uberData %>% filter(source == "iPhone" & start_type == "delayed"))$start_type)
dispositivo_iphone_reserved <- length((uberData %>% filter(source == "iPhone" & start_type == "reserved"))$start_type)
dispositivo_wap_asap <- length((uberData %>% filter(source == "Wap" & start_type == "asap"))$start_type)
dispositivo_wap_delayed <- length((uberData %>% filter(source == "Wap" & start_type == "delayed"))$start_type)
dispositivo_wap_reserved <- length((uberData %>% filter(source == "Wap" & start_type == "reserved"))$start_type)
dispositivo_web_asap <- length((uberData %>% filter(source == "web" & start_type == "asap"))$start_type)
dispositivo_web_delayed <- length((uberData %>% filter(source == "web" & start_type == "delayed"))$start_type)
dispositivo_web_reserved <- length((uberData %>% filter(source == "web" & start_type == "reserved"))$start_type)
# Criação de uma matriz com os valores obtidos
dados <- matrix(c(dispositivo_android_asap,
dispositivo_android_delayed,
dispositivo_android_reserved,
dispositivo_ipad_asap,
dispositivo_ipad_delayed,
dispositivo_ipad_reserved,
dispositivo_iphone_asap,
dispositivo_iphone_delayed,
dispositivo_iphone_reserved,
dispositivo_wap_asap,
dispositivo_wap_delayed,
dispositivo_wap_reserved,
dispositivo_web_asap,
dispositivo_web_delayed,
dispositivo_web_reserved), nrow = 5, ncol = 3)
# Gráfico de barras
plot <- barplot(dados, main = "Tipos de dispositivo e o status de inicio da viagem",
ylim = c(0, 4500),
names.arg = c("Assim que possível","Com atraso","Reservado"),
xlab = "Status de inicio da viagem",
ylab = "Total de viagens",
col = rainbow(5:10),
beside = TRUE)
# Legenda
legend(title = "Tipos de Dispositivos", "topright", inset=.02,
legend = c("Android", "iPad", "iPhone","Wap","Web"),
fill = rainbow(5:10), cex=0.8)
# Vetor auxiliar com todos os valores
aux <- c(dispositivo_android_asap,
dispositivo_android_delayed,
dispositivo_android_reserved,
dispositivo_ipad_asap,
dispositivo_ipad_delayed,
dispositivo_ipad_reserved,
dispositivo_iphone_asap,
dispositivo_iphone_delayed,
dispositivo_iphone_reserved,
dispositivo_wap_asap,
dispositivo_wap_delayed,
dispositivo_wap_reserved,
dispositivo_web_asap,
dispositivo_web_delayed,
dispositivo_web_reserved)
text(x = plot, y = aux + 200,
label = aux)Como podemos observar no gráfico acima, a maioria dos usuários de iPad iniciou suas viagens com atraso. Em contraste, os usuários que utilizaram a web tiveram o menor número de atrasos no início de suas viagens, enquanto nenhum usuário de iPhone experimentou atrasos. Além disso, a maioria das viagens realizadas “assim que possível”, ou seja, com início imediato, foi solicitada através de dispositivos Android. Por fim, vale destacar que nenhum usuário de Android ou Wap fez reservas antecipadas para suas viagens.
Nessa aba, apresentaremos diversos gráficos que relacionam dados de nota e distância, acompanhados de suas respectivas análises.
# Filtra os dados para viagens
distanciato400nota1 <- length((uberData %>% filter(distance <= 400 & rider_score == 1))$distance)
distanciato400nota2 <- length((uberData %>% filter(distance <= 400 & rider_score == 2))$distance)
distanciato400nota3 <- length((uberData %>% filter(distance <= 400 & rider_score == 3))$distance)
distanciato400nota4 <- length((uberData %>% filter(distance <= 400 & rider_score == 4))$distance)
distanciato400nota5 <- length((uberData %>% filter(distance <= 400 & rider_score == 5))$distance)
dadosto400 <- c(distanciato400nota1, distanciato400nota2, distanciato400nota3,
distanciato400nota4, distanciato400nota5)
# Gráfico de barras
plot <- barplot(dadosto400, main="Nota dada ao passageiro em viagens de até 400 metros",
ylab = "Numero de ocorrências",
xlab = "Notas",
names.arg = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"),
cex.names = 0.8,
ylim = c(0,3000),
col = rainbow(5))
text(x = plot, y = dadosto400 + 90, label = dadosto400)
legend(title = "Nota dada ao passageiro", "topleft",inset = .02, legend = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"), fill = rainbow(5), cex =0.8)Analisando o gráfico acima podemos notar que a avaliação dada ao passageiro pelo motorista é majoritariamente boa em distâncias curtas (até 400 metros).
distancia400to1000nota1 <- length((uberData %>% filter(distance > 400 & distance <= 1000 & rider_score == 1))$distance)
distancia400to1000nota2 <- length((uberData %>% filter(distance > 400 & distance <= 1000 & rider_score == 2))$distance)
distancia400to1000nota3 <- length((uberData %>% filter(distance > 400 & distance <= 1000 & rider_score == 3))$distance)
distancia400to1000nota4 <- length((uberData %>% filter(distance > 400 & distance <= 1000 & rider_score == 4))$distance)
distancia400to1000nota5 <- length((uberData %>% filter(distance > 400 & distance <= 1000 & rider_score == 5))$distance)
dados400to1000 <- c(distancia400to1000nota1, distancia400to1000nota2,
distancia400to1000nota3,distancia400to1000nota4, distancia400to1000nota5)
plot <- barplot(dados400to1000, main="Nota dada ao passageiro em viagens de 400 metros a 1000 metros",
ylab = "Numero de ocorrências",
xlab = "Notas",
names.arg = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"),
cex.names = 0.8,
ylim = c(0,5500),
col = rainbow(5))
text(x = plot, y = dados400to1000 + 150, label = dados400to1000)
legend(title = "Nota dada ao passageiro", "topleft",inset = .02, legend = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"), fill = rainbow(5), cex =0.8)Agora, se analisarmos o gráfico acima, constataremos que a maioria das notas ainda são positivas em viagens de 400 distância a 1000 metros de distância, mas também conseguimos detectar um pequeno aumento de notas neutras e negativas, indicando desconforto por parte do motorista.
distancia1000to1500nota1 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1000 & distance <= 1500 & rider_score == 1))$distance)
distancia1000to1500nota2 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1000 & distance <= 1500 & rider_score == 2))$distance)
distancia1000to1500nota3 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1000 & distance <= 1500 & rider_score == 3))$distance)
distancia1000to1500nota4 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1000 & distance <= 1500 & rider_score == 4))$distance)
distancia1000to1500nota5 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1000 & distance <= 1500 & rider_score == 5))$distance)
dados1000to1500 <- c(distancia1000to1500nota1, distancia1000to1500nota2,
distancia1000to1500nota3,distancia1000to1500nota4, distancia1000to1500nota5)
plot <- barplot(dados1000to1500, main="Nota dada ao passageiro em viagens de 1000 metros a 1500 metros",
ylab = "Numero de ocorrências",
xlab = "Notas",
names.arg = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"),
cex.names = 0.8,
ylim = c(0,2000),
col = rainbow(5))
text(x = plot, y = dados1000to1500 + 60, label = dados1000to1500)
legend(title = "Nota dada ao passageiro", "topleft",inset = .02, legend = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"), fill = rainbow(5), cex =0.8)Já no gráfico acima as notas positivas se mantém dominantes, mas conseguimos observar uma regressão das notas negativas.
distancia1500to2000nota1 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1500 & distance <= 2000 & rider_score == 1))$distance)
distancia1500to2000nota2 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1500 & distance <= 2000 & rider_score == 2))$distance)
distancia1500to2000nota3 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1500 & distance <= 2000 & rider_score == 3))$distance)
distancia1500to2000nota4 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1500 & distance <= 2000 & rider_score == 4))$distance)
distancia1500to2000nota5 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 1500 & distance <= 2000 & rider_score == 5))$distance)
dados1500to2000 <- c(distancia1500to2000nota1, distancia1500to2000nota2,
distancia1500to2000nota3,distancia1500to2000nota4, distancia1500to2000nota5)
plot <- barplot(dados1500to2000, main="Nota dada ao passageiro em viagens de 1500 metros a 2000 metros",
ylab = "Numero de ocorrências",
xlab = "Notas",
names.arg = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"),
cex.names = 0.8,
ylim = c(0,1000),
col = rainbow(5))
text(x = plot, y = dados1500to2000 + 30, label = dados1500to2000)
legend(title = "Nota dada ao passageiro", "topleft",inset = .02, legend = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"), fill = rainbow(5), cex =0.8)Apesar de terem sido realizadas poucas viagens de 1500 a 2000 metros, a maior parte das notas continua sendo positiva.
distancia2000upnota1 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 2000 & rider_score == 1))$distance)
distancia2000upnota2 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 2000 & rider_score == 2))$distance)
distancia2000upnota3 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 2000 & rider_score == 3))$distance)
distancia2000upnota4 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 2000 & rider_score == 4))$distance)
distancia2000upnota5 <- length((uberData %>% group_by(rider_score) %>% filter(distance > 2000 & rider_score == 5))$distance)
dados2000up <- c(distancia2000upnota1, distancia2000upnota2,
distancia2000upnota3,distancia2000upnota4, distancia2000upnota5)
plot <- barplot(dados2000up, main="Nota dada ao passageiro em viagens de mais de 2000 metros",
ylab = "Numero de ocorrências",
xlab = "Notas",
names.arg = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"),
cex.names = 0.8,
ylim = c(0, 1000),
col = rainbow(5))
text(x = plot, y = dados2000up + 50, label = dados2000up)
legend(title = "Nota dada ao passageiro", "topleft",inset = .02, legend = c("Ruim (1)","Pouco Ruim (2)","Razoavel (3)","Bom (4)","Excelente (5)"), fill = rainbow(5), cex =0.8)Já nesse último gráfico nenhuma nota negativa foi constatada, apenas neutras e positivas.
Para melhor visualização dos dados, foi criada uma tabela que exibe a distribuição das notas atribuídas pelos passageiros com base na faixa de distância percorrida. As colunas representam as notas, variando de Ruim (1) a Excelente (5), enquanto as linhas mostram as diferentes faixas de distância, para facilitar a interpretação e permitindo uma leitura mais clara e organizada dos dados apresentados.
check_and_install_package <- function(pkg) {
if (!requireNamespace(pkg, quietly = TRUE)) {
install.packages(pkg)
}
library(pkg, character.only = TRUE)
}
tabela_distancia_nota <- data.frame(
"Faixa de Distância" = c("Até 400 metros", "400 a 1000 metros", "1000 a 1500 metros", "1500 a 2000 metros", "Mais de 2000 metros"),
"Ruim (1)" = c(distanciato400nota1, distancia400to1000nota1, distancia1000to1500nota1, distancia1500to2000nota1, distancia2000upnota1),
"Pouco Ruim (2)" = c(distanciato400nota2, distancia400to1000nota2, distancia1000to1500nota2, distancia1500to2000nota2, distancia2000upnota2),
"Razoável (3)" = c(distanciato400nota3, distancia400to1000nota3, distancia1000to1500nota3, distancia1500to2000nota3, distancia2000upnota3),
"Bom (4)" = c(distanciato400nota4, distancia400to1000nota4, distancia1000to1500nota4, distancia1500to2000nota4, distancia2000upnota4),
"Excelente (5)" = c(distanciato400nota5, distancia400to1000nota5, distancia1000to1500nota5, distancia1500to2000nota5, distancia2000upnota5)
)
library(kableExtra)
kable(tabela_distancia_nota, align = "c", caption = "Distribuição de Notas por Faixa de Distância", col.names = c("Faixa de Distância", "Ruim (1)", "Pouco Ruim (2)", "Razoável (3)", "Bom (4)", "Excelente (5)")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = F, position = "center") %>%
column_spec(1, bold = TRUE) %>%
row_spec(0, bold = TRUE, background = "#D3D3D3")| Faixa de Distância | Ruim (1) | Pouco Ruim (2) | Razoável (3) | Bom (4) | Excelente (5) |
|---|---|---|---|---|---|
| Até 400 metros | 6 | 6 | 43 | 242 | 2715 |
| 400 a 1000 metros | 9 | 11 | 70 | 560 | 5258 |
| 1000 a 1500 metros | 3 | 3 | 22 | 189 | 1743 |
| 1500 a 2000 metros | 1 | 1 | 11 | 103 | 918 |
| Mais de 2000 metros | 0 | 0 | 7 | 79 | 809 |
Portanto, podemos concluir que, em geral, os passageiros costumam ter uma boa conduta. No entanto, há uma tendência para que, em viagens de menor distância, os motoristas atribuam notas mais baixas, indicando possíveis desconfortos ou problemas mais frequentes em distâncias menores.
Declaração do Problema Abordado
O objetivo deste projeto foi analisar dados de viagens da Uber para identificar padrões e tendências que pudessem fornecer insights valiosos sobre preços, tipos de dispositivos utilizados, status de início das viagens e as avaliações dos passageiros com base na distância percorrida. A principal motivação foi entender melhor os comportamentos de uso e como diferentes fatores influenciam a experiência do usuário e a precificação das viagens.
Abordagem e Metodologia
Para abordar a declaração do problema, utilizei um conjunto de dados de viagens da Uber com informações coletadas da cidade de Lima, no Peru, em 2010. A análise foi dividida em várias seções, cada uma focada em uma dimensão específica do problema: preços de diferentes tipos de viagens, métodos de solicitação (dispositivos e status de início), e a relação entre a distância percorrida e as notas atribuídas aos passageiros. A metodologia envolveu a manipulação e visualização de dados utilizando ferramentas de programação, como R, para gerar gráficos e tabelas que facilitassem a interpretação dos resultados. As principais técnicas incluíram a segmentação dos dados por tipo de viagem, tipo de dispositivo, status de início e a criação de gráficos de barras para visualização das avaliações de passageiros por distância percorrida.
Insights da Análise
A análise revelou alguns insights importantes:
Preços das Viagens: Viagens do tipo “group” foram as mais caras, embora fossem menos frequentes, enquanto viagens do tipo “easy” apresentaram os menores preços. O tipo “executive” foi o mais popular, sugerindo que, embora o “group” seja caro, não é a escolha preferida dos usuários.
Dispositivos e Início de Viagem: Usuários que utilizam o iPad tiveram o maior número de atrasos no início das viagens. Usuários de Android foram os que mais solicitaram viagens com início imediato, e observou-se que nenhum usuário de Android ou WAP fez reservas antecipadas.
Avaliações de Passageiros: Motoristas tendem a dar notas mais altas para viagens curtas (até 400 metros). À medida que a distância aumenta, notas neutras e negativas começam a surgir, especialmente em viagens entre 400 e 1000 metros. No entanto, as notas negativas quase desaparecem em distâncias superiores a 2000 metros, sugerindo que o desconforto parece estar relacionado a distâncias intermediárias.
Implicações para os Potenciais Clientes
Para potenciais clientes, essas descobertas podem ajudar a otimizar sua experiência de uso do serviço. Por exemplo, aqueles que procuram viagens mais baratas podem preferir o tipo “easy”. Por outro lado, clientes que priorizam conforto em viagens maiores podem se beneficiar do tipo “executive”, uma vez que ele apresenta alta popularidade e preços equilibrados. Em relação aos dispositivos, usuários de iPad podem precisar de maior atenção no gerenciamento de tempo, dado o alto número de atrasos.
Limitações da Análise e Melhorias Futuras
Existem algumas limitações nesta análise. Primeiro, a análise se baseou em um conjunto de dados específico, e os resultados podem não ser representativos de todas as regiões ou períodos de tempo. Segundo, a análise foi principalmente descritiva e não explorou relações causais entre os diferentes fatores.
Para melhorar ou expandir essa análise, seria interessante incorporar modelos preditivos para identificar com maior precisão como variáveis como o tipo de viagem, distância e dispositivo afetam os preços e as avaliações. Outra melhoria seria a inclusão de mais variáveis, como o tempo de espera dos motoristas e o clima, para uma análise mais robusta.
Uma limitação importante desta análise é o fato de que o conjunto de dados utilizado é de 2010. Isso significa que muitas das conclusões tiradas podem não refletir as condições atuais do mercado de transporte por aplicativo, que tem evoluído rapidamente com novas tecnologias e mudanças no comportamento do consumidor. Além disso, aspectos como o crescimento da frota de motoristas, a chegada de novas modalidades de transporte (como bicicletas e scooters), e alterações nas políticas de preços ao longo dos anos não foram considerados. Por isso, utilizar um conjunto de dados mais recente seria fundamental para entender melhor as tendências e comportamentos atuais, especialmente em um mercado tão dinâmico.