Uma análise sobre preços no ecommerce brasileiro
Introdução
No mundo em que vivemos hoje a tecnologia nos permite comprar qualquer produto via internet e recebê-lo no conforto de nossos lares. Também através dela, podemos comparar as condições ofertadas por diversos vendedores, de forma a optar por aquela que apresente mais vantagens para nós.
Muitas vezes optamos por aguardar alguns dias a mais para termos um determinado item em mãos, ao invés de nos deslocarmos até a loja física mais próxima de nós.
Nesse cenário, é extremamente importante para as empresas do mundo do ecommerce se manterem competitivas, a fim de atraírem clientes para seus sites e sobreviverem nesse mercado tão acirrado.
Um dos parâmetros mais relevantes na hora da tomada de decisão de compra é o preço que o cliente vai pagar. Sendo assim, realizaremos algumas análises que nos ajudem a avaliar qual empresa está mais atraente aos olhos de seus consumidores.
Os dados que utilizaremos na análise foram coletados a partir de robôs crawlers que acessam os sites de algumas das empresas de ecommerce de maior relevância no Brasil, coletando informações de condições comerciais para departamentos-chave em alguns CEPs importantes.
O dataset utilizado possui mais de 1 milhão de linhas e a fonte garante que os dados foram coletados aleatoriamente. Assim, acreditamos ter uma amostra justa que represente bem o universo a ser analisado. Os nomes das empresas foram ocultados para evitar qualquer problema.
Campos
- Data
- Loja
- ID
- Departamento
- Linha do produto
- UF
- Prazo de entrega
- Valor do frete
- Preço
- parcelas
- juros
Olhando a tabela
Parte 1
df$preco_p = as.numeric(gsub(",",".",df$preco_p))
df$parcelas = as.integer(df$parcelas)
df$prazo = as.integer(df$prazo)
df$frete = as.numeric(gsub(",",".",df$frete))
df$preco= df$preco_p * df$parcelas
kable(head(df[,c(1:4)]), "html") %>%
kable_styling(bootstrap_options = c("striped","condensed", "bordered"), full_width = F) %>%
row_spec(1:6, color = "black")| data | loja | ID | DPTO |
|---|---|---|---|
| 03/06/2020 | D | 55348117 | ELETRONICOS (23) |
| 19/06/2020 | A | 132165827 | PCS (9068) |
| 11/06/2020 | A | 1694349177 | PC GAMER (9094) |
| 17/06/2020 | B | 134240683 | ELETRONICOS (23) |
| 15/06/2020 | B | 134498166 | ELETROPORTÁTEIS (9105) |
| 18/06/2020 | C | 1256176077 | ELETRONICOS (23) |
Parte 2
kable(head(df[,c(5:11)]), "html") %>%
kable_styling(bootstrap_options = c("striped","condensed", "bordered"), full_width = F) %>%
row_spec(1:6, color = "black")| linha | UF | prazo | frete | parcelas | preco_p | juros |
|---|---|---|---|---|---|---|
| 50’’ a 55’’ | PR | 21 | 9.90 | 11 | 205.69 | com juros |
| CHROMEBOOK | BA | 25 | 67.00 | 1 | 1477.00 | sem juros |
| ARMAZENAMENTO | RJ | 28 | 38.52 | 4 | 649.97 | sem juros |
| 44" a 49" ULTRA HD 4K | BA | 23 | 149.90 | 1 | 3999.90 | sem juros |
| FORNOS ELETRICOS | PR | 23 | 72.94 | 1 | 1042.79 | sem juros |
| 44’’ a 49’’ | RJ | 34 | 162.57 | 12 | 400.69 | sem juros |
Explorando os dados
Escolheram-se alguns desafios a serem explorados a partir desse dataset:
Quais empresas são mais competitivas em cada estado? (Usando uma métrica própria)
Em que departamentos as empresas tem um melhor preço? (Podem ocorrer outlier)
Avaliar o preço do frete por departamento.
Fazer um mapa interativo com os registros.
Quais empresas são mais competitivas em cada estado?
Para responder essa pergunta iremos primeiramente criar um novo data frame, acrescentando a coluna preço total (preço + frete). Em seguida iremos agregar os dados e fazer uma média dos preços, já que em datas diferentes (ou até mesmo no dia) o preço pode ter variado para cima ou para baixo.
df2 = df
df2$preco_t = df$preco+df$frete
df2 = df2[,c('loja','ID','DPTO','linha','UF','preco_t')]
df3 = aggregate(df2$preco_t,by=list(loja=df2$loja,ID=df2$ID,DPTO=df2$DPTO,linha=df2$linha,UF=df2$UF),'mean')
colnames(df3)[6] = 'preco_t'
df3$preco_t = format(round(df3$preco_t, 2), nsmall = 2)
kable(head(df3, n=20), "html") %>%
kable_styling(bootstrap_options = c("striped","condensed", "bordered"), full_width = F) %>%
row_spec(1:20, color = "black")| loja | ID | DPTO | linha | UF | preco_t |
|---|---|---|---|---|---|
| A | 122701411 | ELETRONICOS (23) | 32’’ | BA | 1409.60 |
| D | 131495664 | ELETRONICOS (23) | 32’’ | BA | 1173.22 |
| D | 133782691 | ELETRONICOS (23) | 32’’ | BA | 1185.85 |
| A | 133791184 | ELETRONICOS (23) | 32’’ | BA | 1421.51 |
| B | 133791184 | ELETRONICOS (23) | 32’’ | BA | 1277.82 |
| A | 134244705 | ELETRONICOS (23) | 32’’ | BA | 1312.57 |
| D | 134244705 | ELETRONICOS (23) | 32’’ | BA | 1179.65 |
| A | 134322064 | ELETRONICOS (23) | 32’’ | BA | 1457.20 |
| A | 134444782 | ELETRONICOS (23) | 32’’ | BA | 1346.65 |
| D | 134444782 | ELETRONICOS (23) | 32’’ | BA | 1225.94 |
| D | 134450841 | ELETRONICOS (23) | 32’’ | BA | 1215.80 |
| A | 134511851 | ELETRONICOS (23) | 32’’ | BA | 1148.99 |
| D | 134574780 | ELETRONICOS (23) | 32’’ | BA | 2220.44 |
| B | 209359022 | ELETRONICOS (23) | 32’’ | BA | 1237.70 |
| D | 209359022 | ELETRONICOS (23) | 32’’ | BA | 1203.13 |
| A | 1322119303 | ELETRONICOS (23) | 32’’ | BA | 1194.52 |
| D | 1322119303 | ELETRONICOS (23) | 32’’ | BA | 1071.37 |
| A | 1420357840 | ELETRONICOS (23) | 32’’ | BA | 1498.98 |
| B | 1420357840 | ELETRONICOS (23) | 32’’ | BA | 1551.04 |
| B | 1507471178 | ELETRONICOS (23) | 32’’ | BA | 2463.01 |
Ao fazer o processo acima condensamos nosso dataset de mais de 1 milhão de linhas em apenas 6529 linhas. Iremos então transpor a coluna lojas, para que possamos comparar os preços de forma mais simples.
library(tidyr)
df4 = spread(df3,loja,preco_t)
df4$A = as.numeric(df4$A)
df4$B = as.numeric(df4$B)
df4$C = as.numeric(df4$C)
df4$D = as.numeric(df4$D)Adicionando pontuação para cada Loja, por cada produto que possuir o menor preço dentre os demais concorrentes
A = NULL
B = NULL
C = NULL
D = NULL
for (i in seq_along(df4$ID)){
if (is.na(df4$A[i])){
A = rbind(A,0)
} else {
if (df4$A[i] == min(df4[i,5:8], na.rm = T)){
A = rbind(A,1)
} else { A = rbind(A,0)}
}
if (is.na(df4$B[i])){
B = rbind(B,0)
} else {
if (df4$B[i] == min(df4[i,5:8], na.rm = T)){
B = rbind(B,1)
} else { B = rbind(B,0)}
}
if (is.na(df4$C[i])){
C = rbind(C,0)
} else {
if (df4$C[i] == min(df4[i,5:8], na.rm = T)){
C = rbind(C,1)
} else { C = rbind(C,0)}
}
if (is.na(df4$D[i])){
D = rbind(D,0)
} else {
if (df4$D[i] == min(df4[i,5:8], na.rm = T)){
D = rbind(D,1)
} else { D = rbind(D,0)}
}
}Substituindo as colunas preço por sua respectiva pontuação
Finalmente podemos somar as pontuações e agregar por estado, resultando em uma tabela onde podemos facilmente conferir qual empresa tem mais produtos com melhor preço em cada Estado.
A_UF = aggregate(df5$A,by=list(UF=df5$UF),sum)
B_UF = aggregate(df5$B,by=list(UF1=df5$UF),sum)
C_UF = aggregate(df5$C,by=list(UF2=df5$UF),sum)
D_UF = aggregate(df5$D,by=list(UF3=df5$UF),sum)
comp_UF = cbind(A_UF,B_UF,C_UF,D_UF)
comp_UF = subset(comp_UF, select = -c(UF1,UF2,UF3))
colnames(comp_UF) = c('UF','A','B','C','D')
library(kableExtra)
kable(comp_UF, "html") %>%
kable_styling(bootstrap_options = c("striped","condensed", "bordered"), full_width = F) %>%
row_spec(1:NROW(comp_UF), color = "black") | UF | A | B | C | D |
|---|---|---|---|---|
| BA | 150 | 143 | 124 | 292 |
| GO | 168 | 186 | 78 | 253 |
| PR | 108 | 232 | 23 | 311 |
| RJ | 531 | 198 | 65 | 278 |
| RS | 0 | 0 | 155 | 0 |
| SP | 485 | 235 | 19 | 295 |
Em que departamentos as empresas tem um melhor preço?
Foi feita uma função para tornar menos repetitiva a tarefa e assim explorarmos também mais recursos da linguagem R. A função calcula a média de preços de uma loja por departamento e define um limite superior para a probabilidade de X ser maior do que a média somada a um salário mínimo(fev/2020 considerado), sendo X uma variável aleatória definida pela distribuição de preços dos produtos de cada loja.
Ou seja, a probabilidade de que algum produto tenha um preço acima da média por um salário mínimo, é no MÁXIMO a probabilidade fornecida pela desigualdade. O limite é dado pela Desigualdade de Markov, já que a média em cada loja é conhecida, os valores de qualquer produto são sempre positivos e a desigualdade não precisa assumir independência entre os preços.
\[ P(X > k + 1045) \leq \frac{E[X]}{k +1045} \] Também foi criada uma função auxiliar para os estilos. Os produtos que possuem parcelamento com juros foram removidos para facilitar os cálculos, já que não temos conhecimento das taxas.
options(digits = 5)
library(dplyr)
library(kableExtra)
# recebe um dataset e um caracter com as letras "A","B","C" ou "D"
select_loja <- function(dados, loja){
dados %>%
filter(Loja == loja) %>%
filter(Juros == "sem juros") %>%
group_by(DPTO) %>%
transmute(preco = as.numeric(gsub(",",".", Preco)) * parcelas) %>%
summarise(preco_medio = mean(preco), "Markov(X > média+1045)" = mean(preco)/(mean(preco)+1045)) %>%
arrange(desc(preco_medio)) %>%
rename("Departamento" = DPTO, "Preço médio" = preco_medio)
}
tabela_style <- function(tabela){
kable(tabela, "html") %>%
kable_styling(bootstrap_options = c("striped","condensed", "bordered"), full_width = F) %>%
row_spec(1:NROW(tabela), color = "black")
}Empresa A
Na empresa A, apesar do setor de eletrônicos ser o mais caro, parece que os departamentos têm preços bem balanceados se comparados uns aos outros.
| Departamento | Preço médio | Markov(X > média+1045) |
|---|---|---|
| ELETRONICOS (23) | 4249.0 | 0.80261 |
| PCS (9068) | 3981.9 | 0.79212 |
| TELEFONIA (18) | 3452.1 | 0.76763 |
| PC GAMER (9094) | 2501.3 | 0.70533 |
| ELETRODOMESTICOS (9072) | 2392.6 | 0.69601 |
| ELETROPORTÁTEIS (9105) | 1753.6 | 0.62659 |
Empresa B
Na empresa B, o setor de PC Gamer é o mais caro com folga. Tanto o departamento de PC Gamer quanto o de eletrônicos possuem uma alta probabilidade de, no pior dos casos, seus produtos estarem acima da média de preços por um salário mínimo a mais.
| Departamento | Preço médio | Markov(X > média+1045) |
|---|---|---|
| PC GAMER (9094) | 10224.0 | 0.90727 |
| ELETRONICOS (23) | 5788.5 | 0.84708 |
| PCS (9068) | 2965.9 | 0.73946 |
| ELETRODOMESTICOS (9072) | 2771.0 | 0.72615 |
| TELEFONIA (18) | 2185.0 | 0.67647 |
| ELETROPORTÁTEIS (9105) | 1473.8 | 0.58512 |
Empresa C
Já a empresa C, por sua vez possui o melhor preço médio de PC Gamer entre as concorrentes, mas comparando com as outras, não é tão competitiva com seus preços de eletrodomésticos.
| Departamento | Preço médio | Markov(X > média+1045) |
|---|---|---|
| PCS (9068) | 4568.6 | 0.81384 |
| ELETRONICOS (23) | 3889.1 | 0.78821 |
| TELEFONIA (18) | 3412.3 | 0.76555 |
| ELETRODOMESTICOS (9072) | 3102.2 | 0.74802 |
| ELETROPORTÁTEIS (9105) | 1905.6 | 0.64584 |
| PC GAMER (9094) | 1427.0 | 0.57726 |
Empresa D
A empresa D apresenta o preço médio mais elevado no departamento de eletrônicos, inclusive entre as outras concorrentes. Também alcança essa marca para eletroportáteis, o que pode indicar uma característica da loja de vender produtos de mais qualidade nesses dois setores.
| Departamento | Preço médio | Markov(X > média+1045) |
|---|---|---|
| ELETRONICOS (23) | 5239.4 | 0.83372 |
| ELETROPORTÁTEIS (9105) | 4098.3 | 0.79682 |
| TELEFONIA (18) | 3538.5 | 0.77201 |
| PCS (9068) | 3420.3 | 0.76597 |
| ELETRODOMESTICOS (9072) | 2589.8 | 0.71250 |
| PC GAMER (9094) | 1813.2 | 0.63438 |
Melhores fretes por departamento
Quais seriam os melhores fretes por departamento? A média do preço de entrega(frete) foi usada para melhor avaliar essa questão. Na análise abaixo foram exploradas duas abordagens:
- Incluir fretes gratuitos no cálculo das médias.
- Considerar o cálculo das médias sem as gratuidades envolvidas.
A distribuição dos fretes mudou de forma significativa para alguns departamentos e também foram encontrados os melhores preços de entrega.
Foi utilizada a biblioteca dplyr para realizar as transformações necessárias no conjunto de dados e a biblioteca ggplot2 para gerar os gráficos.
Desconsiderando gratuidades
library(ggplot2)
library(dplyr)
options(digits = 4)
fretes_por_dept <- dataset %>%
group_by(DPTO) %>%
transmute(Frete = as.numeric(gsub(",",".", Frete))) %>%
filter(Frete > 0) %>%
summarise(media_frete = mean(Frete))
p <- ggplot(data = fretes_por_dept,aes(x=DPTO, y=media_frete)) +
geom_bar(stat="identity")
p <- p + labs(x = "Departamento", y ="Frete(R$)" ) +
ggtitle("Preço médio do Frete por Departamento") +
coord_flip()
pPercebe-se que o departamento de eletrodomésticos possui o frete médio mais alto, o que pode ser explicado pela natureza dos produtos, por vezes mais pesados e de difícil transporte, mas essa é apenas uma hipótese.
Fretes gratuitos inclusos
library(ggplot2)
options(digits = 4)
fretes_por_dept <- dataset %>%
group_by(DPTO) %>%
transmute(Frete = as.numeric(gsub(",",".", Frete))) %>%
summarise(media_frete = mean(Frete))
p2 <- ggplot(data = fretes_por_dept,aes(x=DPTO, y=media_frete)) +
geom_bar(stat="identity")
p2 <- p2 + labs(x = "Departamento", y ="Frete(R$)" ) + ylim(0,75) + ggtitle("Preço médio do Frete por Departamento(gratuidades inclusas)") + coord_flip()
p2É preciso tomar cuidado ao se observar esse gráfico para não se tomar conclusões precipitadas. Comparando com o primeiro, os números exibidos no eixo X são diferentes, a escala não é a mesma.
Contudo, ao se observar os departamentos de eletrônicos e de eletrodomésticos é evidente que as médias caíram de forma considerável, o que assinala que esses setores possuem uma proporção maior de gratuidades em comparação ao restante.
Portanto, apesar dos preços mais altos, o setor de eletrodoméstico possui mais itens com o frete gratuito do que o de PC gamer.
Comparando as distribuições do Frete por departamento
Com gratuidades
Para observar as análises acima de outra forma, são comparadas as distribuição dos fretes para cada departamento
frete <- dataset %>%
mutate(Frete = as.numeric(gsub(",",".", Frete)))
ggplot(data = frete) +
geom_freqpoly(mapping = aes(Frete, colour = DPTO)) +
xlim(0, 500) +
facet_wrap(~ DPTO, nrow = 2)É um pouco difícil enxergar o que está acontecendo apenas observando este gráfico. Sob uma avaliação desatenta, pode ser dito que o departamento de telefonia é o que possui mais gratuidades, o que não é verdade.
Sem as gratuidades
frete <- dataset %>%
mutate(Frete = as.numeric(gsub(",",".", Frete))) %>%
filter(Frete > 0)
ggplot(data = frete) +
geom_freqpoly(mapping = aes(Frete, colour = DPTO)) +
facet_wrap(~ DPTO, nrow = 2)Comparando ao gráfico anterior, pode-se perceber que na verdade o setor de telefonia possui preços muito baixos, mas não necessariamente gratuidades. O que foi analisado no gráfico de barras pode ser encontrado também na distribuição de frequências: o departamento de eletrodomésticos possui mais gratuidades.
Mudando de escala
Mudando a escala para logarítmica é possível extrair mais informação visual
frete <- dataset %>%
mutate(Frete = as.numeric(gsub(",",".", Frete)))
ggplot(data = frete) +
geom_freqpoly(mapping = aes(x = Frete, y=log(stat(count)), colour = DPTO)) +
facet_wrap(~ DPTO, nrow = 2)frete <- dataset %>%
mutate(Frete = as.numeric(gsub(",",".", Frete))) %>%
filter(Frete > 0)
ggplot(data = frete) +
geom_freqpoly(mapping = aes(x = Frete, y=log(stat(count)), colour = DPTO)) +
facet_wrap(~ DPTO, nrow = 2)Ranqueando os fretes
Fretes mais baratos por departamento
Foram selecionados os três fretes mais baratos de cada departamento para fazer o ranqueamento. Foram excluídos valores repetidos.
library(kableExtra)
table_frete <- dataset %>%
group_by(DPTO) %>%
select(Loja, DPTO, Frete) %>%
transmute(Frete = as.numeric(gsub(",",".", Frete))) %>%
filter(Frete > 0) %>%
distinct(Frete, .keep_all = TRUE) %>%
top_n(n=-3, wt = Frete) %>%
arrange(Frete)
kable(table_frete, "html") %>%
kable_styling(bootstrap_options = c("striped","condensed", "bordered"), full_width = F) %>%
row_spec(1:NROW(table_frete), color = "black")| DPTO | Frete |
|---|---|
| TELEFONIA (18) | 3.13 |
| TELEFONIA (18) | 4.90 |
| ELETROPORTÁTEIS (9105) | 4.90 |
| PCS (9068) | 4.90 |
| TELEFONIA (18) | 4.99 |
| PC GAMER (9094) | 4.99 |
| PCS (9068) | 5.75 |
| PCS (9068) | 6.41 |
| ELETROPORTÁTEIS (9105) | 6.99 |
| ELETRODOMESTICOS (9072) | 6.99 |
| ELETRODOMESTICOS (9072) | 7.90 |
| ELETROPORTÁTEIS (9105) | 7.90 |
| ELETRODOMESTICOS (9072) | 7.99 |
| PC GAMER (9094) | 8.99 |
| ELETRONICOS (23) | 9.90 |
| PC GAMER (9094) | 9.99 |
| ELETRONICOS (23) | 9.99 |
| ELETRONICOS (23) | 10.00 |
Segundo o ranking, o setor de telefonia lidera neste quesito.
Fretes mais caros por departamento
table_frete <- dataset %>%
group_by(DPTO) %>%
select(Loja, DPTO, Frete) %>%
transmute(Frete = as.numeric(gsub(",",".", Frete))) %>%
filter(Frete > 0) %>%
distinct(Frete, .keep_all = TRUE) %>%
top_n(n=3, wt = Frete) %>%
arrange(desc(Frete))
kable(table_frete, "html") %>%
kable_styling(bootstrap_options = c("striped","condensed", "bordered"), full_width = F) %>%
row_spec(1:NROW(table_frete), color = "black")| DPTO | Frete |
|---|---|
| TELEFONIA (18) | 854.5 |
| PC GAMER (9094) | 813.4 |
| ELETRONICOS (23) | 805.9 |
| ELETRONICOS (23) | 802.7 |
| ELETRONICOS (23) | 791.9 |
| ELETRODOMESTICOS (9072) | 777.2 |
| ELETRODOMESTICOS (9072) | 753.3 |
| PC GAMER (9094) | 748.0 |
| ELETRODOMESTICOS (9072) | 741.5 |
| TELEFONIA (18) | 732.1 |
| ELETROPORTÁTEIS (9105) | 700.0 |
| PC GAMER (9094) | 700.0 |
| PCS (9068) | 700.0 |
| TELEFONIA (18) | 700.0 |
| PCS (9068) | 521.9 |
| PCS (9068) | 509.4 |
| ELETROPORTÁTEIS (9105) | 288.4 |
| ELETROPORTÁTEIS (9105) | 285.4 |
Estranhamente o setor de telefonia também está em primeiro entre os mais caros, mas como foi dito anteriormente, o ranking não diz tudo sobre a distribuição, esses valores podem ser discrepantes. Também é interessante destacar a predominância do setor de eletrônicos no topo, que condiz mais com a relidade mostrada pela distribuição. Entretanto, ainda assim deve se tomar cuidado com o tipo de afirmação feita apenas olhando a tabela.
Mapa interativo
O mapa abaixo apresenta os melhores preços do Chromebook por Estado, sendo que o custo do frete foi incluído no valor total. Ele foi feito usando o pacote leaflet, que permite o uso personalizado dos arquivos com dados geográficos(shapefiles) obtidos no site do IBGE e carregados num formato adequado pelo pacote rgdal.
library(magrittr)
library(dplyr)
chromebook <- dataset[dataset$LINHA == 'CHROMEBOOK',]
chromebook <- chromebook[chromebook$parcelas == 1,]
chromebook$Preco <- as.numeric(gsub(",",".",chromebook$Preco))
chromebook$Frete <- as.numeric(gsub(",",".",chromebook$Frete))
by_uf_chromebook <- chromebook %>%
group_by(UF) %>%
arrange(Preco) %>%
top_n(n=-1, wt= Preco) %>%
distinct(Preco, .keep_all = TRUE) %>%
mutate(custo = Preco + Frete)library(leaflet)
library(rgdal)
# carrega a shapefile
shp <- readOGR("mapa\\.", "BR_UF_2019", stringsAsFactors=FALSE, encoding="UTF-8")## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\Eduardo\Downloads\TrabEstatComp\mapa", layer: "BR_UF_2019"
## with 27 features
## It has 4 fields
# tabela com códigos das UFs
ibge <- read.csv("ibge_uf.csv", header=T,sep=",", encoding="UTF-8")[,2:4]
names(ibge) <- c("codigo", "nome_fed", "UF")
df_mapa <- merge(by_uf_chromebook,ibge, by.x = "UF", by.y = "UF")
df_mapa <- merge(shp, df_mapa, by.x = "CD_UF", by.y = "codigo")
proj4string(df_mapa) <- CRS("+proj=longlat +datum=WGS84 +no_defs")
Encoding(df_mapa$nome_fed) <- "UTF-8"
df_mapa$custo[is.na(df_mapa$custo)] <- 0
#cores do mapa
pal <- colorBin("BuPu",domain = NULL,c(0, 1100, 1200, 1250, 1350, 1400 , 1500, 1600))
state_popup <- paste0("<strong>Estado: </strong>",
df_mapa$nome_fed,
"<br><strong>Preço: </strong>",
df_mapa$custo)
leaflet(data = df_mapa) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(fillColor = ~pal(df_mapa$custo),
fillOpacity = 0.8,
color = "#BDBDC3",
weight = 1,
popup = state_popup) %>%
addLegend("bottomright", pal = pal, values = df_mapa$custo,
title = "Melhores preços(+frete) do chromebook por Estado",
opacity = 1)