The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
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[@]dogado.de.
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.
Health stats visible at Monitor.