The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.
This article demonstrates practical data analysis examples using pixr to explore PIX adoption and usage patterns in Brazil.
Analyze which types of PIX keys are most popular:
# Get keys data and aggregate by type
keys <- get_pix_keys(date = "2025-12-01")
# Summarize by key type
key_summary <- get_pix_keys_by_type(date = "2025-12-01")
# Calculate percentages
key_summary <- key_summary |>
mutate(
percentage = total_keys / sum(total_keys) * 100
)
# Visualize
ggplot(key_summary, aes(x = reorder(TipoChave, -total_keys), y = total_keys / 1e6, fill = NaturezaUsuario)) +
geom_col(position = "stack") +
scale_y_continuous(labels = scales::number_format(suffix = "M")) +
scale_fill_manual(values = c("PF" = "#008060", "PJ" = "#1e88e5")) +
labs(
title = "PIX Keys by Type",
subtitle = "December 2025",
x = "Key Type",
y = "Total Keys (Millions)",
fill = "User Type",
caption = "Source: Brazilian Central Bank Open Data"
) +
theme(legend.position = "bottom")Analyze PIX usage patterns across Brazilian regions:
# Get transactions by region
# Note: database uses YYYYMM format
region_data <- get_pix_transactions_by_region(database = "202512")
# Visualize total value by region
region_data |>
mutate(
total_value_billions = (vl_pagador_pf + vl_pagador_pj) / 1e9
) |>
ggplot(aes(x = reorder(Regiao, total_value_billions), y = total_value_billions)) +
geom_col(fill = "#008060") +
coord_flip() +
scale_y_continuous(labels = scales::number_format(prefix = "R$ ", suffix = "B")) +
labs(
title = "PIX Transaction Volume by Region",
subtitle = "December 2025",
x = NULL,
y = "Transaction Value (Billions BRL)",
caption = "Source: Brazilian Central Bank Open Data"
)# Get transactions by state
state_data <- get_pix_transactions_by_state(database = "202512")
# Top 10 states by transaction count
state_data |>
mutate(
total_count = qt_pagador_pf + qt_pagador_pj
) |>
slice_head(n = 10) |>
mutate(Estado = forcats::fct_reorder(Estado, total_count)) |>
ggplot(aes(x = total_count / 1e6, y = Estado)) +
geom_col(fill = "#1e88e5") +
scale_x_continuous(labels = scales::number_format(suffix = "M")) +
labs(
title = "Top 10 States by PIX Transaction Count",
subtitle = "December 2025",
x = "Transactions (Millions)",
y = NULL,
caption = "Source: Brazilian Central Bank Open Data"
)Analyze transactions by nature (P2P, P2B, B2B, etc.):
# Get summary by transaction nature
nature_summary <- get_pix_summary(database = "202509", group_by = "NATUREZA")
# Visualize
nature_summary |>
ggplot(aes(x = reorder(NATUREZA, -total_value), y = total_value / 1e12)) +
geom_col(fill = "#008060") +
geom_text(
aes(label = sprintf("R$ %.1fT", total_value / 1e12)),
vjust = -0.5, size = 3
) +
scale_y_continuous(
labels = scales::number_format(prefix = "R$ ", suffix = "T"),
expand = expansion(mult = c(0, 0.15))
) +
labs(
title = "PIX Transaction Value by Nature",
subtitle = "September 2025 - P2P: Person to Person, P2B: Person to Business, etc.",
x = "Transaction Nature",
y = "Total Value (Trillions BRL)",
caption = "Source: Brazilian Central Bank Open Data"
)Use OData filters to analyze specific states:
# Get transactions for Maranhão only using filter
maranhao <- get_pix_transactions_by_municipality(
database = "202512",
filter = "Estado eq 'MARANHÃO'",
orderby = "VL_PagadorPF desc"
)
# Top 10 municipalities by value
maranhao |>
slice_head(n = 10) |>
ggplot(aes(x = reorder(Municipio, VL_PagadorPF), y = VL_PagadorPF / 1e6)) +
geom_col(fill = "#008060") +
coord_flip() +
scale_y_continuous(labels = scales::number_format(prefix = "R$ ", suffix = "M")) +
labs(
title = "Top 10 Municipalities in Maranhão by PIX Value",
subtitle = "December 2025 - Individual payers",
x = NULL,
y = "Transaction Value (Millions BRL)",
caption = "Source: Brazilian Central Bank Open Data"
)# Get Northeast transactions using filter
nordeste <- get_pix_transaction_stats(
database = "202509",
filter = "PAG_REGIAO eq 'NORDESTE'"
) |>
summarise(
total_value = sum(VALOR, na.rm = TRUE),
total_count = sum(QUANTIDADE, na.rm = TRUE)
) |>
mutate(region = "NORDESTE")
# Get Southeast transactions
sudeste <- get_pix_transaction_stats(
database = "202509",
filter = "PAG_REGIAO eq 'SUDESTE'"
) |>
summarise(
total_value = sum(VALOR, na.rm = TRUE),
total_count = sum(QUANTIDADE, na.rm = TRUE)
) |>
mutate(region = "SUDESTE")
# Combine and compare
comparison <- bind_rows(nordeste, sudeste)
comparison |>
pivot_longer(c(total_value, total_count), names_to = "metric", values_to = "value") |>
ggplot(aes(x = region, y = value, fill = metric)) +
geom_col(position = "dodge") +
facet_wrap(~metric, scales = "free_y") +
labs(
title = "Northeast vs Southeast PIX Comparison",
subtitle = "September 2025",
x = NULL,
y = NULL
)# Get P2P transactions
p2p <- get_pix_transaction_stats(
database = "202509",
filter = "NATUREZA eq 'P2P'"
) |>
group_by(PAG_REGIAO) |>
summarise(value = sum(VALOR, na.rm = TRUE)) |>
mutate(type = "P2P")
# Get P2B transactions
p2b <- get_pix_transaction_stats(
database = "202509",
filter = "NATUREZA eq 'P2B'"
) |>
group_by(PAG_REGIAO) |>
summarise(value = sum(VALOR, na.rm = TRUE)) |>
mutate(type = "P2B")
# Combine
combined <- bind_rows(p2p, p2b)
# Visualize
ggplot(combined, aes(x = PAG_REGIAO, y = value / 1e12, fill = type)) +
geom_col(position = "dodge") +
scale_fill_manual(values = c("P2P" = "#008060", "P2B" = "#1e88e5")) +
scale_y_continuous(labels = scales::number_format(prefix = "R$ ", suffix = "T")) +
labs(
title = "P2P vs P2B Transactions by Region",
subtitle = "September 2025",
x = "Payer Region",
y = "Transaction Value (Trillions BRL)",
fill = "Transaction Type",
caption = "Source: Brazilian Central Bank Open Data"
) +
theme(legend.position = "bottom")Fetch data for multiple months and analyze trends:
# Get Q3 2025 data
q3_data <- get_pix_transaction_stats_multi(
databases = c("202507", "202508", "202509")
)
# Aggregate by month and nature
monthly_nature <- q3_data |>
group_by(AnoMes, NATUREZA) |>
summarise(
total_value = sum(VALOR, na.rm = TRUE),
.groups = "drop"
)
# Visualize trends
ggplot(monthly_nature, aes(x = factor(AnoMes), y = total_value / 1e12, fill = NATUREZA)) +
geom_col(position = "stack") +
scale_y_continuous(labels = scales::number_format(prefix = "R$ ", suffix = "T")) +
labs(
title = "PIX Transaction Value by Nature - Q3 2025",
x = "Month",
y = "Transaction Value (Trillions BRL)",
fill = "Nature",
caption = "Source: Brazilian Central Bank Open Data"
) +
theme(legend.position = "bottom")Analyze how PIX transactions are initiated:
# Get summary by initiation method
method_summary <- get_pix_summary(database = "202509", group_by = "FORMAINICIACAO")
# Add labels
method_labels <- c(
"DICT" = "PIX Key",
"QRDN" = "Dynamic QR",
"QRES" = "Static QR",
"MANU" = "Manual",
"INIC" = "Initiator"
)
method_summary |>
mutate(
method_label = method_labels[FORMAINICIACAO],
percentage = total_count / sum(total_count) * 100
) |>
ggplot(aes(x = reorder(method_label, -total_count), y = total_count / 1e9)) +
geom_col(fill = "#008060") +
geom_text(
aes(label = sprintf("%.1f%%", percentage)),
vjust = -0.5, size = 3
) +
scale_y_continuous(
labels = scales::number_format(suffix = "B"),
expand = expansion(mult = c(0, 0.15))
) +
labs(
title = "PIX Transactions by Initiation Method",
subtitle = "September 2025",
x = "Initiation Method",
y = "Transaction Count (Billions)",
caption = "Source: Brazilian Central Bank Open Data"
)Generate a comprehensive summary report:
# Function to create a PIX summary for a given month
create_pix_summary <- function(database, date) {
# Keys data
keys <- get_pix_keys(date = date, verbose = FALSE)
keys_summary <- keys |>
summarise(
total_keys = sum(qtdChaves, na.rm = TRUE),
n_institutions = n_distinct(ISPB)
)
# Transaction stats
stats <- get_pix_summary(database = database, group_by = "NATUREZA", verbose = FALSE)
stats_total <- stats |>
summarise(
total_value = sum(total_value),
total_count = sum(total_count)
)
# State data
state <- get_pix_transactions_by_state(database = database, verbose = FALSE)
top_state <- state |>
mutate(total = vl_pagador_pf + vl_pagador_pj) |>
slice_max(total, n = 1) |>
pull(Estado)
list(
period = database,
total_keys = keys_summary$total_keys,
n_institutions = keys_summary$n_institutions,
transaction_count = stats_total$total_count,
transaction_value = stats_total$total_value,
avg_transaction = stats_total$total_value / stats_total$total_count,
top_state = top_state
)
}
# Generate summary for September 2025
summary_sep_2025 <- create_pix_summary(
database = "202509",
date = "2025-09-01"
)
# Print formatted summary
cat(sprintf(
"
=== PIX Summary Report: %s ===
📊 Keys & Participants
- Total registered keys: %s
- Active institutions: %d
💳 Transactions
- Monthly count: %s
- Monthly value: %s
- Average transaction: %s
🗺️ Regional
- Most active state: %s
",
summary_sep_2025$period,
format(summary_sep_2025$total_keys, big.mark = ","),
summary_sep_2025$n_institutions,
format(summary_sep_2025$transaction_count, big.mark = ","),
format_brl(summary_sep_2025$transaction_value),
format_brl(summary_sep_2025$avg_transaction),
summary_sep_2025$top_state
))Export data for use in other tools:
# Get comprehensive dataset
keys <- get_pix_keys(date = "2025-12-01")
# Export to CSV
write.csv(keys, "pix_keys_202512.csv", row.names = FALSE)
# Export to Excel (requires writexl package)
# writexl::write_xlsx(keys, "pix_keys_202512.xlsx")
# Export multiple sheets
# writexl::write_xlsx(
# list(
# keys = keys,
# stats = get_pix_transaction_stats(database = "202512"),
# states = get_pix_transactions_by_state(database = "202512")
# ),
# "pix_data_202512.xlsx"
# )# 1. Use column selection to reduce memory usage
small_data <- get_pix_keys(
date = "2025-12-01",
columns = c("Nome", "TipoChave", "qtdChaves"),
verbose = FALSE
)
# 2. Use filters to reduce data transfer
filtered <- get_pix_transactions_by_municipality(
database = "202512",
filter = "Estado eq 'SÃO PAULO'",
verbose = FALSE
)
# 3. Process multiple months efficiently
process_quarter <- function(year, quarter) {
months <- switch(quarter,
"Q1" = c("01", "02", "03"),
"Q2" = c("04", "05", "06"),
"Q3" = c("07", "08", "09"),
"Q4" = c("10", "11", "12")
)
databases <- paste0(year, months)
get_pix_transaction_stats_multi(databases)
}
# Get Q3 2025 data
# q3_2025 <- process_quarter(2025, "Q3")These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.