# Carregando as bibliotecas necessárias
library(tidyverse)
library(gt)
library(viridis)
# Leitura da base de dados
avocado <- read_csv("avocado.csv") %>%
# Filtro de regiões para reduzir escopo da análise
filter(str_extract(region, ".") == "A") %>%
# Primeira letra maiúscula
mutate(type = str_to_title(type))💸 O que é dispersão de preços?
Dispersão de preços é a variação nos preços praticados para um mesmo produto ou serviço.
Essa variação pode estar associada tanto a fatores intencionais, como arquitetura de preço por canais, políticas comerciais ou mesmo repasses de preço; quanto a fatores não intencionais, como ausência de políticas claras, baixa aderência a processos e mesmo erros operacionais.
Em resumo, nem toda dispersão deve ser vista como um “problema”. Pelo contrário — uma certa variação é saudável e desejável. Ela pode evidenciar a capacidade de adaptação comercial: oferecer melhores condições aos melhores clientes, responder a mudanças no cenário competitivo, executar campanhas promocionais e realizar ajustes táticos.
A pergunta-chave, então, não é se há dispersão — mas sim: o quanto dela está sob controle?
📏 Medindo a Dispersão
Talvez o indicador mais comum em Pricing seja o preço médio — uma medida que pode ser vista como um resumo da dispersão dos preços praticados.
Ele é relevante por diversos motivos:
Simples de calcular e comunicar; Funciona como um proxy para a rentabilidade da operação; Costuma ser um produto direto do processo orçamentário.
No entanto, a média é apenas uma das formas de descrever uma distribuição de preços. Outras medidas, como a mediana (valor central) e a moda (valor mais frequente), também são úteis — especialmente em distribuições assimétricas ou com valores extremos.
Exemplo: a média pode estar influenciada por grandes volumes a descontos muito agressivos, enquanto a mediana pode revelar onde está realmente o “centro” da precificação. Já a moda pode indicar o preço padrão de tabela, ou a faixa onde a maioria das transações ocorre.
No entanto, quando utilizados de forma isolada, estes indicadores podem ocultar importantes nuances da execução comercial — e é justamente no detalhe que, muitas vezes, estão as oportunidades de melhoria.
Existe uma brincadeira na estatística que captura bem estes riscos:
“Bill Gates entra em um bar e, de repente, todos ali se tornam milionários… na média.” Indicação de leitura: When Bill Gates walks into a bar(https://introductorystats.wordpress.com/2011/09/04/when-bill-gates-walks-into-a-bar/).
Embora seja útil para olhar o todo, a média pode esconder disparidades importantes. Amostras com distribuições assimétricas ou presença de valores extremos exigem uma análise mais cuidadosa.
Por isso, além de olhar para onde os preços se concentram, é essencial entender o quanto eles variam. Ou seja, o tamanho da dispersão.
Algumas formas comuns de mensurar isso incluem:
- Amplitude: diferença entre o maior e o menor preço observado;
- Desvio padrão: indica a variação média em torno da média (mais sensível a outliers);
- Coeficiente de variação (CV): desvio padrão dividido pela média — útil para comparar dispersão relativa entre produtos de faixas de preço diferentes.
Essas medidas ajudam a diagnosticar se os preços estão relativamente homogêneos ou se há grande variabilidade dentre os grupos analisados.
🧪 Exemplo prático com R
Neste artigo, vamos construir algumas dessas análises usando R e uma base de dados aberta, disponível no Kaggle , que traz o histórico de preços de vendas de abacates (🥑) em diferentes regiões dos EUA, entre 2013 e 2015.
Para fins ilustrativos, filtrei de forma totalmente arbitrária apenas as regiões cujos nomes começam com a letra A.
# Função para calculo da moda
moda <- function(x) {
modal <- unique(x)
modal[which.max(tabulate(match(x, modal)))]
}
# Calculo medidas descritivas
avocado %>%
group_by(type, region) %>%
summarise(
Media = mean(AveragePrice), # Media
Mediana = median(AveragePrice), # Mediana
Moda = moda(AveragePrice), # Moda
Amplitude = max(AveragePrice) - min(AveragePrice), # Amplitude
Sd = sd(AveragePrice), # Desvio Padrao
CV = Sd / Media, # Coef. de Variação
.groups = "drop"
) %>%
gt() %>%
tab_spanner(
label = "Medidas de Centralidade",
columns = c(Media, Mediana, Moda)
) %>%
tab_spanner(
label = "Medidas de Dispersão",
columns = c(Amplitude, Sd, CV)
) %>%
fmt_number(
columns = everything(),
decimals = 2
) %>%
cols_width(
c(Media, Mediana, Moda, Sd, Amplitude, CV) ~ px(65)
) %>%
cols_align(
align = c("center"),
columns = c(Media, Mediana, Moda, Sd, Amplitude, CV)
)| type | region |
Medidas de Centralidade
|
Medidas de Dispersão
|
||||
|---|---|---|---|---|---|---|---|
| Media | Mediana | Moda | Amplitude | Sd | CV | ||
| Conventional | Albany | 1.35 | 1.35 | 1.28 | 0.95 | 0.21 | 0.16 |
| Conventional | Atlanta | 1.07 | 1.06 | 0.99 | 0.96 | 0.18 | 0.17 |
| Organic | Albany | 1.77 | 1.82 | 1.93 | 0.81 | 0.19 | 0.11 |
| Organic | Atlanta | 1.61 | 1.62 | 1.62 | 2.13 | 0.38 | 0.23 |
🧠 O que conseguimos observar a partir da tabela?
Diferenças regionais de preços: Para ambos os tipos de abacate, Albany pratica preços médios e medianos mais altos do que Atlanta — Avaliar quão significativa é esta diferença pode ser assunto para um outro post ;).
Sinais de assimetria: Em organic Albany, a mediana é maior que a média, sugerindo possível concentração de preços abaixo do centro — um indicativo de descontos pontuais ou práticas específicas.
Dispersão elevada: Organic Atlanta apresenta o maior desvio padrão, amplitude e coeficiente de variação (CV), sinalizando preços mais desorganizados e variáveis. Pode ser um ponto de atenção para investigar causas e revisar políticas.
CV como medida comparativa útil: O coeficiente de variação permite avaliar a dispersão proporcional aos níveis de preço — sendo útil para comparar contextos diferentes, mesmo com faixas de preço distintas.
Além destas medidas, algumas visualizações podem complementar a leitura ao tornar os padrões visíveis de forma intuitiva.
🔍 Visualizando a Dispersão
Uma ferramenta poderosa para comunicar e diagnosticar rapidamente padrões de dispersão de preços — seja entre grupos de clientes, regiões, canais ou qualquer outra segmentação relevante. Uma das formas mais comuns de fazer isso é com o boxplot.
Não é parte do escopo aqui aprofundar na leitura de boxplots, para isto deixo essa recomendação de leitura: Interpretando o boxplot.
Também não entrarei na discussão sobre os filtros ou tratamentos prévios à análise. Essa etapa depende do contexto de cada negócio e deve considerar o conhecimento tácito sobre o mercado, os produtos e os processos envolvidos.
# Gerar Boxplot dispersão de preços
avocado %>%
ggplot(aes(x = region, y = AveragePrice, fill = region)) +
geom_boxplot(alpha = 0.7) +
facet_wrap(~type) +
theme_bw() +
theme(legend.position = "", axis.title.x = element_blank()) +
scale_fill_viridis(discrete = TRUE) +
labs(title = "Dispersão de Preços por Tipo e Região",
subtitle = "Regiões começando com a letra A",
caption = "Fonte: Dataset Avocados (Kaggle)")
🔍 O que conseguimos observar?
Esse tipo de visualização permite identificar, de forma rápida, padrões relevantes na dispersão de preços. No exemplo acima, temos os preços médios praticados para dois tipos de abacate (Conventional e Organic) em duas regiões dos EUA: Albany e Atlanta.
Alguns exemplos de observações que podem ser feitas a partir do gráfico:
Albany apresenta, em geral, preços mais altos do que Atlanta, o que pode ser facilmente percebido pela mediana (linha preta) mais elevada. Essa diferença reflete as particularidades de cada região e minha estratégia para cada uma delas? Dados os custos logísticos, tributários e operacionais, como ficará meu posicionamento na ponta?
Se estivéssemos comparando canais, essa diferença entre grupos equivaleria à relatividade entre canais de venda. O espaçamento entre os preços estaria saudável? Existem clientes com preços muito baixos, que podem gerar atrito entre canais ou inviabilziar o posicionamento da marca?
Há sobreposição de faixas de preço entre Albany e Atlanta. Se estivéssemos comparando segmentos de cliente (e não regiões), isso poderia indicar que clientes com perfis diferentes estão pagando preços semelhantes. Um possível sinal de alerta — principalmente se clientes de menor relevância têm acesso às mesmas condições que grandes contas estratégicas.
O exemplo mais extremo de dispersão aparece nos abacates orgânicos em Atlanta. Variações tão intensas merecem atenção: o que explica tamanha diferença de preços? Existem descontos fora da política? Acúmulo de condições comerciais? Práticas distintas entre vendedores ou canais?
Esse tipo de análise visual permite priorizar investigações. Produtos, regiões ou segmentos com dispersão elevada ou fora do padrão esperado são candidatos naturais para uma análise mais cuidadosa.
⚠️ Limitações do boxplot
Apesar de útil, o boxplot também tem suas limitações — especialmente por não representar o volume de observações nem o perfil interno da distribuição dos dados.
Veja, por exemplo, essa animação: diferentes distribuições podem gerar boxplots idênticos.

Para aprofundar neste assunto, indico também o texto (em inglês): I’ve stopped using boxplots
Para mitigar estes pontos e enriquecer essa análise, um caminho é adicionar os data points e a mediana — isso ajuda bastante na leitura e comparação entre grupos.
📊 Versão enriquecida do gráfico:
avocado %>%
ggplot(aes(x = region, y = AveragePrice, fill = region)) +
geom_boxplot(alpha = 0.7, outlier.colour = NA) +
# Adicionar os data-points
geom_point(shape = 21, size = 3,
position = position_jitter(height = 0, width = 0.2)) +
# Adicionar 'label' com a mediana de cada grupo
geom_label(data = . %>%
group_by(region, type) %>%
summarise(AveragePrice = median(AveragePrice)),
aes(label = AveragePrice), fill = "white") +
facet_wrap(~type) +
theme_bw() +
theme(legend.position = "", axis.title.x = element_blank()) +
scale_fill_viridis(discrete = TRUE) +
labs(title = "Dispersão de Preços por Tipo e Região",
subtitle = "Regiões começando com a letra A",
caption = "Fonte: Dataset Avocados (Kaggle)")
Conclusão
Um certo grau de dispersão é natural — e, quando bem gerido, pode ser estratégico.
O problema surge quando ela é excessiva, aleatória ou mal explicada, o que frequentemente está associado a:
- Falta de políticas claras e governança;
- Ausência de regras bem definidas para exceções;
- Ações não planejadas ou pontuais;
- Erros operacionais ou desalinhamento entre áreas.
Reduzir a dispersão não controlada pode trazer ganhos rápidos: otimização de margem, menos conflitos entre canais e maior percepção de equidade.
Em vez de buscar grandes revoluções na precificação, às vezes o melhor ponto de partida está em ajustar pequenas distorções — silenciosas, mas impactantes.