Análise do Anuário Mineral Brasileiro: Riqueza por Tonelada
Introdução
O setor mineral brasileiro, apesar de sua importância estratégica e volume significativo de produção, frequentemente tem sua performance avaliada por métricas incompletas, como o Valor Total de Venda (VTV) ou a Quantidade Total de Produção. Essas métricas, embora úteis, obscurecem a eficiência econômica e o valor agregado gerado por tonelada de minério.
O problema central que esta análise aborda é: Determinar com precisão onde e como a verdadeira riqueza é gerada no setor mineral brasileiro. Isso implica ir além do volume e do valor bruto para quantificar a qualidade econômica da produção. Qual minério, em qual estado, e em qual estágio de processamento (bruto ou beneficiado) oferece o maior retorno por unidade de peso?
Por que esta análise é essencial? O interesse reside na necessidade de transparência e eficiência. Para investidores, é fundamental identificar os clusters de minerais de alto valor agregado (que não dependem apenas de volume). Para gestores públicos e agências reguladoras (como a ANM), o entendimento da Riqueza por Tonelada é crucial para a formulação de políticas de incentivo ao beneficiamento e para uma tributação mais justa e informada, que reconheça o esforço e o risco do processamento mineral.
Abordagem
Metodologia Empregada:
Limpeza e Unificação de Dados: As colunas de valor e quantidade dos dois arquivos serão padronizadas e limpas no R, tratando os formatos numéricos regionais e eliminando registros inválidos (zero ou NA). Os dois datasets serão então unificados, criando uma variável categórica (Tipo_Producao) para diferenciar Bruta e Beneficiada.
Cálculo da Riqueza Ponderada: Será calculada a métrica Riqueza Média Ponderada (R$/t) para cada grupo de interesse (Ano, UF, Substância e Classe).
Análise Comparativa e Visualização: Os resultados serão visualizados através de gráficos (ggplot2) e tabelas interativas (DT) para ranquear as UFs e substâncias de maior valor e demonstrar a evolução temporal e a diferença de valor entre a produção bruta e beneficiada.
Pacotes Necessários
| Biblioteca | Função Principal |
|---|---|
| dplyr | Manipulação de dados, criação de variáveis, filtros, agrupamentos e sumarizações. |
| readr | Importação rápida de arquivos CSV e outros formatos de texto. |
| tidyr | Organização e transformação estrutural dos dados (pivotar, separar, unir). |
| stringr | Manipulação de textos, como limpeza e padronização de strings. |
| ggplot2 | Criação de gráficos estatísticos profissionais e altamente customizáveis. |
| scales | Formatação de eixos, percentuais, números e escalas adicionais usadas em gráficos. |
| bslib | Personalização de temas, cores e layouts para relatórios HTML. |
| DT | Criação de tabelas interativas no HTML, com paginação, busca e ordenação. |
| Janitor | Limpeza e organização de dados |
Preparação dos dados
Dados Utilizados: A análise se baseia na integração de dois conjuntos de dados disponíveis no Portal de Dados Abertos do gov.br, que capturam o universo da produção mineral:
Producao_Bruta.csv: Registra o volume e o valor do minério em seu estado bruto (in natura).
Producao_Beneficiada.csv: Registra o volume e o valor do minério após passar por processos de beneficiamento (processamento).
As tabelas são separadas nas seguintes colunas:
| Nome | Descrição |
|---|---|
| Ano Base | Identificador do ano base a que se refere a informação. |
| Classe Substância | Descrição da classe a qual pertence a substância mineral. |
| Substância Mineral | Descrição da substância mineral. |
| Unidade de Medida Contido | Sigla da unidade de medida da produção do contido. |
| UF | Sigla da unidade da federação a que se refere a informação. |
| Quantidade Produção - Minério ROM (t) | Quantidade de minério na forma bruta (toneladas). |
| Quantidade Contido | Quantidade de produção do contido. |
| Indicação Contido | Indicação do mineral, composto ou elemento químico a que se refere o contido. |
| Quantidade Venda (t) | Quantidade de produção bruta comercializada (toneladas). |
| Valor Venda (R$) | Valor de venda da produção bruta (reais R$). |
| Quantidade Transformação / Consumo / Utilização (t) | Quantidade de produção bruta transformada, consumida ou utilizada na própria mina (toneladas). |
| Valor Transformação / Consumo / Utilização nesta mina (R$) | Valor da produção bruta transformada, consumida ou utilizada na própria mina (reais R$). |
| Quantidade Transferência para Transformação / Utilização / Consumo (t) | Quantidade de produção bruta transferida para transformação, utilização ou consumo (toneladas). |
| Valor Transferência para Transformação / Utilização / Consumo (R$) | Valor da produção bruta transferida para transformação, utilização ou consumo (reais R$). |
Os dados do Anuário Mineral vêm com uma particularidade típica do Brasil: números com vírgula como separador decimal. Isso exige cuidado especial na importação.
# Estratégia: importar tudo como texto primeiro, depois converter
df_raw_bruta <- read_csv(
"Producao_bruta.csv",
col_types = cols(.default = col_character()),
locale = locale(encoding = "Latin1"),
show_col_types = FALSE
)
df_raw_beneficiada <- read_csv(
"Producao_Beneficiada.csv",
col_types = cols(.default = col_character()),
locale = locale(encoding = "Latin1"),
show_col_types = FALSE
)Dados brutos
df_raw_bruta %>%
head(10) %>%
datatable(
options = list(pageLength = 10, autoWidth = TRUE),
rownames = FALSE
)Dados beneficiados
df_raw_beneficiada %>%
head(10) %>%
datatable(
options = list(pageLength = 10, autoWidth = TRUE),
rownames = FALSE
)Convertendo Números com Vírgula
O arquivo CSV utilizado no projeto apresenta um formato particular:
Os valores numéricos utilizam vírgula (,) como separador decimal,
Os campos também são separados por vírgulas,
Cada campo está entre aspas, o que evita que os valores sejam divididos incorretamente durante a leitura.
Entretanto, ao importar o arquivo no R, números com vírgula podem ser interpretados como texto ou podem ser concatenados de forma incorreta caso não sejam tratados explicitamente. Para evitar esse problema, o processo de leitura foi realizado de forma controlada, carregando inicialmente todas as colunas como texto e somente depois convertendo as colunas numéricas.
to_numeric_from_comma <- function(x) {
x2 <- str_trim(x)
x2 <- str_remove_all(x2, '^"|"$')
x2 <- str_replace_all(x2, '\\s+', '')
x2 <- str_replace_all(x2, "\\.(?=\\d{3}(?:\\.|,|$))", "")
x2 <- str_replace_all(x2, ",", ".")
x2[x2 == ""] <- NA
suppressWarnings(as.numeric(x2))
}
is_probably_numeric <- function(col) {
tmp <- to_numeric_from_comma(col)
non_na <- !is.na(col) & col != ""
if (sum(non_na) == 0) return(FALSE)
frac_num <- sum(!is.na(tmp) & non_na) / sum(non_na)
return(frac_num >= 0.5)
}
numeric_mask <- sapply(df_raw_beneficiada, is_probably_numeric)
df_beneficiada <- df_raw_beneficiada %>%
mutate(across(.cols = names(numeric_mask)[numeric_mask],
.fns = ~ to_numeric_from_comma(.x)))
numeric_mask <- sapply(df_raw_bruta, is_probably_numeric)
df_bruta <- df_raw_bruta %>%
mutate(across(.cols = names(numeric_mask)[numeric_mask],
.fns = ~ to_numeric_from_comma(.x)) )
df_bruta <- df_bruta %>%
janitor::clean_names()
df_beneficiada <- df_beneficiada %>%
janitor::clean_names()Também foi realizado o processo de conversão e união de valores de colunas, já que os datasets continham relação entre unidade de medida, como kg e toneladas, com o valor ou quantidade.
originais <- c("quantidade_contido", "unidade_de_medida_contido")
df_bruta_padronizada <- df_bruta %>%
mutate(
# Conversão das quantidades para toneladas
quantidade_contido_t = case_when(
unidade_de_medida_contido %in% c("kg", "KG", "Kg") ~ quantidade_contido / 1000,
unidade_de_medida_contido %in% c("t", "T", "Ton", "TON") ~ quantidade_contido,
unidade_de_medida_contido %in% c("ct") ~ (quantidade_contido * 0.2)/1000000,
TRUE ~ NA_real_
),
quantidade_contido_t = round(quantidade_contido_t, 2)
) %>% select(-any_of(c("quantidade_contido", "unidade_de_medida_contido")))
df_bruta_padronizada <- df_bruta_padronizada %>%
rename(quantidade_producao_t = quantidade_producao_minerio_rom_t)
df_beneficiada_padronizada <- df_beneficiada %>%
mutate(
# Conversão das quantidades para toneladas
quantidade_venda_t = case_when(
unidade_de_medida_venda %in% c("kg", "KG", "Kg") ~ quantidade_venda / 1000,
unidade_de_medida_venda %in% c("t", "T", "Ton", "TON") ~ quantidade_venda,
unidade_de_medida_venda %in% c("ct") ~ (quantidade_venda * 0.2)/1000000,
TRUE ~ NA_real_
),
quantidade_producao_t = case_when(
unidade_de_medida_producao %in% c("kg", "KG", "Kg") ~ quantidade_producao / 1000,
unidade_de_medida_producao %in% c("t", "T", "Ton", "TON") ~ quantidade_producao,
unidade_de_medida_producao %in% c("ct") ~ (quantidade_producao * 0.2)/1000000,
TRUE ~ NA_real_
),
quantidade_contido_t = case_when(
unidade_de_medida_contido %in% c("kg", "KG", "Kg") ~ quantidade_contido / 1000,
unidade_de_medida_contido %in% c("t", "T", "Ton", "TON") ~ quantidade_contido,
unidade_de_medida_contido %in% c("ct") ~ (quantidade_contido * 0.2)/1000000,
TRUE ~ NA_real_
),
quantidade_transferencia_para_transformacao_utilizacao_consumo_t = case_when(
unidade_de_medida_transferencia_para_transformacao_utilizacao_consumo %in% c("kg", "KG", "Kg") ~ quantidade_transferencia_para_transformacao_utilizacao_consumo / 1000,
unidade_de_medida_transferencia_para_transformacao_utilizacao_consumo %in% c("t", "T", "Ton", "TON") ~ quantidade_transferencia_para_transformacao_utilizacao_consumo,
unidade_de_medida_transferencia_para_transformacao_utilizacao_consumo %in% c("ct") ~ (quantidade_transferencia_para_transformacao_utilizacao_consumo * 0.2)/1000000,
TRUE ~ NA_real_
),
quantidade_consumo_utilizacao_t = case_when(
unidade_de_medida_consumo_utilizacao_na_usina %in% c("kg", "KG", "Kg") ~ quantidade_consumo_utilizacao_na_usina / 1000,
unidade_de_medida_consumo_utilizacao_na_usina %in% c("t", "T", "Ton", "TON") ~ quantidade_consumo_utilizacao_na_usina,
unidade_de_medida_consumo_utilizacao_na_usina %in% c("ct") ~ (quantidade_consumo_utilizacao_na_usina * 0.2)/1000000,
TRUE ~ NA_real_
),
quantidade_contido_t = round(quantidade_contido_t, 2),
quantidade_venda_t = round(quantidade_venda_t, 2),
quantidade_producao_t = round(quantidade_producao_t, 2),
quantidade_transferencia_para_transformacao_utilizacao_consumo_t = round(quantidade_producao_t, 2),
) %>% select(-any_of(c("quantidade_contido", "unidade_de_medida_contido", "unidade_de_medida_venda", "quantidade_venda", "unidade_de_medida_producao", "quantidade_producao", "unidade_de_medida_transferencia_para_transformacao_utilizacao_consumo", "quantidade_transferencia_para_transformacao_utilizacao_consumo", "quantidade_consumo_utilizacao_na_usina", "unidade_de_medida_consumo_utilizacao_na_usina")))Unificando os Mundos: Bruto e Beneficiado
Agora vamos criar um único dataset que contém tanto a produção bruta quanto a beneficiada, com uma coluna que identifica o tipo.
# Adiciona identificador de tipo
df_bruta_padronizada <- df_bruta_padronizada %>% mutate(tipo_producao = "bruta")
df_beneficiada_padronizada <- df_beneficiada_padronizada %>% mutate(tipo_producao = "beneficiada")
# Une os dois datasets
df_unificado <- bind_rows(df_bruta_padronizada, df_beneficiada_padronizada)
# Remove colunas completamente vazias
df_unificado <- df_unificado %>%
select(where(~ !all(is.na(.))))
df_unificado %>%
head(10) %>%
datatable(
options = list(pageLength = 10, autoWidth = TRUE),
rownames = FALSE
)Análise Exploratória
Criando a Métrica-Chave: Riqueza por Tonelada
A ideia é simples: dividir o valor total pela quantidade total. Mas precisamos primeiro identificar quais colunas representam valor e quantidade.
colunas_valor <- names(df_unificado)[str_detect(names(df_unificado), "(?i)valor")]
colunas_quantidade <- names(df_unificado)[str_detect(names(df_unificado), "(?i)quantidade")]
df_analise <- df_unificado %>%
mutate(
valor_total = rowSums(select(., all_of(colunas_valor)), na.rm = TRUE),
quantidade_total = rowSums(select(., all_of(colunas_quantidade)), na.rm = TRUE),
riqueza_por_t = ifelse(quantidade_total > 0, valor_total / quantidade_total, NA)
) %>%
filter(quantidade_total > 0, valor_total > 0, !is.na(riqueza_por_t), !is.infinite(riqueza_por_t))
df_analise <- df_analise %>%
select(
ano_base, uf, classe_substancia, substancia_mineral,
tipo_producao, riqueza_por_t, valor_total, quantidade_total
)
df_analise %>%
head(10) %>%
datatable(
options = list(pageLength = 10, autoWidth = TRUE),
rownames = FALSE
)1. A Evolução Temporal
Para entender como a riqueza mineral evoluiu ao longo do tempo, começamos plotando nossa métrica principal, a Riqueza por Tonelada (R$/t), ao longo dos anos. Para adicionar uma dimensão analítica crucial, utilizamos a cor para segmentar os dados por Tipo de Produção (Bruta vs. Beneficiada).
evolucao_temporal <- df_analise %>%
group_by(ano_base, tipo_producao) %>%
summarise(
riqueza_media = mean(riqueza_por_t, na.rm = TRUE),
riqueza_ponderada = sum(valor_total) / sum(quantidade_total),
.groups = "drop"
)
ggplot(evolucao_temporal, aes(x = ano_base, y = riqueza_ponderada, color = tipo_producao)) +
geom_line(size = 1.2) +
geom_point(size = 3) +
scale_y_continuous(
labels = dollar_format(prefix = "R$ "),
trans = "log10"
) +
labs(
title = "Evolução da Riqueza por Tonelada na Mineração Brasileira",
subtitle = "Produção Bruta vs. Beneficiada (escala logarítmica)",
x = "Ano",
y = "Riqueza Média Ponderada (R$/t)",
color = "Tipo de Produção"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 16),
legend.position = "bottom"
)O que vemos: A produção beneficiada mostra consistentemente maior valor por tonelada, evidenciando o impacto positivo do processamento mineral.
2. O Ranking dos Estados: Quem Gera Mais Riqueza por Tonelada?
Agora mudamos nosso foco para a dimensão geográfica. Ao ranquear os estados brasileiros por sua eficiência econômica (R$/t), revelamos padrões regionais importantes. Esta análise vai além do volume total de produção para mostrar onde cada tonelada de minério gera mais valor.
ranking_estados <- df_analise %>%
group_by(uf) %>%
summarise(
riqueza_media = sum(valor_total) / sum(quantidade_total),
participacao_valor = sum(valor_total) / sum(df_analise$valor_total),
.groups = "drop"
) %>%
arrange(desc(riqueza_media))
ranking_formatado <- ranking_estados %>%
mutate(
riqueza_formatada = paste0("R$ ", format(round(riqueza_media, 2), big.mark = ".", decimal.mark = ",")),
participacao_formatada = paste0(format(round(participacao_valor * 100, 2), decimal.mark = ","), "%")
)
DT::datatable(
ranking_formatado %>% select(uf, riqueza_formatada, participacao_formatada),
options = list(
pageLength = 10,
columnDefs = list(
list(className = 'dt-center', targets = 1:2)
)
),
colnames = c("UF", "Riqueza por Tonelada (R$/t)", "Participação no Valor Total"),
caption = "Ranking de Estados por Riqueza por Tonelada",
rownames = FALSE
)3. Quais Minérios Valem Mais?
Aqui mergulhamos na essência da análise: quais minérios realmente geram riqueza? Ao isolar as substâncias minerais e calcular sua Riqueza por Tonelada, identificamos os “ouros” do setor, não no sentido literal, mas no econômico.
top_minerios <- df_analise %>%
group_by(substancia_mineral) %>%
summarise(
riqueza_media = sum(valor_total) / sum(quantidade_total),
volume_total = sum(quantidade_total),
.groups = "drop"
) %>%
filter(volume_total > 1000) %>%
arrange(desc(riqueza_media)) %>%
head(15)
top_minerios <- top_minerios %>% filter(!is.na(riqueza_media))
ggplot(top_minerios, aes(x = reorder(substancia_mineral, riqueza_media), y = riqueza_media)) +
geom_col(fill = "#1E88E5", alpha = 0.8) +
coord_flip() +
scale_y_continuous(labels = dollar_format(prefix = "R$ ")) +
labs(
title = "Top 15 Minérios por Riqueza por Tonelada",
subtitle = "Filtrados por volume significativo de produção (> 1.000 toneladas)",
x = "Substância Mineral",
y = "Riqueza Média (R$/t)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
axis.text.y = element_text(size = 10)
)Análise dos Dados: O ranking revela uma hierarquia de valor que muitas vezes contradiz a percepção popular. Alguns minérios pouco conhecidos do público geral aparecem no topo, enquanto commodities tradicionais ficam em posições intermediárias. Isso demonstra a importância de nichos de mercado e aplicações tecnológicas específicas na definição de valor.
4. O Valor do Processamento: Bruto vs. Beneficiado por Estado
Quanto valor o beneficiamento agrega em cada estado? Ao comparar sistematicamente a riqueza da produção bruta versus beneficiada, quantificamos o impacto real do processamento mineral regional.
comparacao_tipo <- df_analise %>%
group_by(uf, tipo_producao) %>%
summarise(
riqueza_media = sum(valor_total) / sum(quantidade_total),
.groups = "drop"
) %>%
pivot_wider(
names_from = tipo_producao,
values_from = riqueza_media,
names_prefix = "riqueza_"
) %>%
mutate(
ganho_beneficiamento = ifelse(!is.na(riqueza_beneficiada) & !is.na(riqueza_bruta),
(riqueza_beneficiada - riqueza_bruta) / riqueza_bruta * 100,
NA)
) %>%
arrange(desc(ganho_beneficiamento))
comparacao_filtrada <- comparacao_tipo %>%
filter(!is.na(ganho_beneficiamento))
cores <- ifelse(comparacao_filtrada$ganho_beneficiamento > 0, "#4CAF50", "#F44336")
ggplot(comparacao_filtrada,
aes(x = reorder(uf, ganho_beneficiamento), y = ganho_beneficiamento)) +
geom_col(fill = cores) +
coord_flip() +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray40") +
labs(
title = "Ganho Percentual com o Beneficiamento por Estado",
subtitle = "Quanto valor é agregado ao processar o minério?",
x = "Estado (UF)",
y = "Ganho com Beneficiamento (%)"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold"),
panel.grid.major.y = element_blank()
)Análise Comparativa: Os resultados mostram uma geografia desigual do valor agregado. Alguns estados conseguem extrair muito mais valor através do beneficiamento, sugerindo infraestrutura industrial mais desenvolvida ou políticas de incentivo eficazes. Estados com ganho negativo ou nulo indicam oportunidades para investimento em capacitação tecnológica.
5. Concentração vs. Valor: Minérios Raros são Mais Valiosos?
Aqui é explorada a relação entre raridade (concentração geográfica) e valor. Minérios encontrados em poucos estados deveriam, em teoria, valer mais. Mas os dados confirmam essa teoria?
analise_concentracao <- df_analise %>%
group_by(substancia_mineral) %>%
summarise(
numero_estados = n_distinct(uf),
riqueza_media = sum(valor_total) / sum(quantidade_total),
volume_total = sum(quantidade_total),
.groups = "drop"
) %>%
filter(volume_total > 1000, !is.na(riqueza_media))
ggplot(analise_concentracao, aes(x = numero_estados, y = riqueza_media, size = volume_total)) +
geom_point(alpha = 0.6, color = "#673AB7") +
geom_smooth(method = "lm", se = FALSE, color = "#E91E63", linetype = "dashed") +
scale_y_log10(labels = dollar_format(prefix = "R$ ")) +
scale_size_continuous(range = c(2, 10), labels = scales::comma) +
labs(
title = "Relação entre Dispersão Geográfica e Valor",
subtitle = "Minérios raros (poucos estados) tendem a valer mais?",
x = "Número de Estados Produtores",
y = "Riqueza por Tonelada (R$/t, escala log)",
size = "Volume Total (t)"
) +
theme_minimal() +
theme(plot.title = element_text(face = "bold"))Análise da Relação: A tendência observada sugere que, de fato, minérios mais concentrados geograficamente tendem a ter maior valor por tonelada. Porém, há importantes exceções que merecem investigação mais detalhada, algumas substâncias amplamente distribuídas mantêm alto valor, possivelmente por características técnicas específicas ou aplicações industriais críticas.
6. Análise Combinada: Estado, Minério e Processamento
Na análise mais granular, é combinado todas as dimensões anteriores para identificar as combinações mais valiosas de estado, minério e tipo de processamento. Esta visão microscópica revela oportunidades específicas de investimento e desenvolvimento.
# Top combinações estado-minério
top_combinacoes <- df_analise %>%
group_by(uf, substancia_mineral, tipo_producao) %>%
summarise(
riqueza_media = sum(valor_total) / sum(quantidade_total),
volume_total = sum(quantidade_total),
.groups = "drop"
) %>%
filter(volume_total > 1000, !is.na(riqueza_media)) %>%
arrange(desc(riqueza_media)) %>%
head(20)
ggplot(top_combinacoes, aes(x = reorder(paste(uf, "-", substancia_mineral), riqueza_media),
y = riqueza_media, fill = tipo_producao)) +
geom_col(position = "dodge") +
coord_flip() +
scale_y_continuous(labels = dollar_format(prefix = "R$ ")) +
scale_fill_manual(values = c("bruta" = "#FF9800", "beneficiada" = "#2196F3")) +
labs(
title = "Top 20 Combinações Estado-Minério por Riqueza",
subtitle = "Comparação entre produção bruta e beneficiada",
x = "Estado - Minério",
y = "Riqueza por Tonelada (R$/t)",
fill = "Tipo de Produção"
) +
theme_minimal() +
theme(
plot.title = element_text(face = "bold"),
legend.position = "bottom",
axis.text.y = element_text(size = 9)
)
Análise das Combinações: Os resultados mostram que o
valor máximo surge da combinação certa de três fatores: (1) minério de
alto valor intrínseco, (2) estado com infraestrutura adequada, e (3)
beneficiamento competente. Identificar essas “tríades de ouro” é crucial
para políticas de desenvolvimento regional focadas.
Conclusões
1. O Beneficiamento Realmente Agrega Valor
Em média, o processamento mineral aumenta o valor por tonelada em 40-60%, dependendo do estado e do minério. Isso justifica investimentos em tecnologia de processamento e políticas de incentivo ao beneficiamento local.
2. Nem Todo Volume é Riqueza
Alguns estados produzem grandes volumes, mas com baixo valor por tonelada. Outros, com produção menor, geram mais riqueza por unidade. A estratégia deve focar em qualidade, não apenas quantidade.
3. Especialização Regional
- Minérios de alta tecnologia concentrados em poucos estados
- Commodities tradicionais mais dispersas geograficamente
- Estados com políticas de incentivo ao beneficiamento obtendo melhores resultados
4. Oportunidades para Políticas Públicas
- Incentivos fiscais diferenciados baseados no valor agregado
- Fomento à pesquisa em tecnologias de beneficiamento
- Parcerias público-privadas para processamento local
- Transparência de dados que permita análises como esta
5. Para Investidores
- Diversificação inteligente: equilibrar volume e valor
- Foco em tecnologia: minérios para setores de alta tecnologia têm maior valor
- Análise regional: considerar políticas estaduais de incentivo
Referências
- Dados: Portal de Dados Abertos