# # 1) instale remotes do CRAN
# install.packages("remotes", repos="https://cran.rstudio.com/")
#
# # 2) instale diretamente do GitHub com opções adicionais
# remotes::install_github(
# "catboost/catboost",
# subdir = "catboost/R-package",
# ref = "master",
# INSTALL_opts = c(
# "--no-multiarch", # evita multi-arch builds
# "--no-test-load", # não carrega testes
# "--no-staged-install" # corrige ‘hard-coded temporary paths’
# )
# )
# Pacotes
library(microdatasus) # Importação e pré-processamento de microdados do DATASUS (SIM, SINASC, SIH, etc.)
library(dplyr) # Manipulação de dados com verbos como filter(), mutate(), group_by(), summarise()
library(lubridate) # Facilita o trabalho com datas (extração de ano, mês, criação de datas, etc.)
library(stringr) # Manipulação de strings com funções consistentes e baseadas em regex
library(ggplot2) # Criação de gráficos com base na gramática dos gráficos (Grammar of Graphics)
library(geobr) # Acesso a dados geográficos oficiais do Brasil (IBGE, TSE) no formato sf
library(sf) # Manipulação de dados espaciais com classes e funções compatíveis com o padrão Simple Features
library(rlang) # Ferramentas de programação avançada, útil em funções tidyverse e manipulação de expressões
library(janitor)
library(gtsummary)
library(scales)
library(knitr)
library(tidyr)
library(mice)
library(Boruta)
library(ranger)
library(vip)
library(yardstick)
library(caret)
library(randomForest)
library(pROC)
library(catboost)
library(finetune)
library(broom)
library(tidymodels)
library(tibble)
library(purrr)
library(viridis)
library(xgboost)
library(ranger)
library(e1071)
library(lightgbm)
library(rsample)
library(precrec)
library(plotly)
library(ahptopsis2n)
library(treesnip)
# Criar pasta de trabalho
# dir.create("dados/sim_2020", recursive = TRUE)Checklist de Projeto de Aprendizado de Máquina
Software: R Core Team (2023). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
Checklist para projetos de aprendizado de máquina:
- Definir o problema e observar o panorama geral.
- Obter os dados.
- Explorar os dados para extrair percepções.
- Preparar os dados para expor melhor os padrões subjacentes aos algoritmos de aprendizado de máquina.
- Explorar diversos modelos e pré-selecionar os melhores.
- Otimizar os modelos e combiná-los em uma solução ótima.
- Apresentar a solução.
- Lançar, monitorar e manter o sistema.
1 Definir o problema e observar o panorama geral.
1.1 Objetivo e aplicação
Prever óbitos por causas cardiovasculares em idosos (≥ 60 anos) usando dados do SIM-DO 2020 de São Paulo. A ideia é apoiar gestores públicos na identificação de grupos de risco e priorização de políticas preventivas.
1.2 Tipo de problema e abordagem
Classificação supervisionada (óbito cardiovascular: sim/não), com dados estáticos (offline). As principais métricas são AUC e sensibilidade, visando reduzir falsos negativos.
1.3 Suposições e limitações
Considera-se que a codificação da causa básica (CID-10) esteja correta e que variáveis sociodemográficas tenham poder preditivo. Pandemia de COVID-19 pode introduzir viés.
2 Obter os dados.
2.1 Preparação do ambiente
2.2 Download dos dados
Resumo geral do dataset
• Total de observações: 349.635 registros
• Total de variáveis: 87 colunas
• Fonte: Provavelmente microdados do SIM (Sistema de Informações sobre Mortalidade) – DATASUS
2.3 Processamento inicial
Datas e tempo
DTOBITO, HORAOBITO, DTNASC, DTATESTADO, DTINVESTIG, DTCADASTRO, DTRECEBIM, DTRECORIGA, DTCADINV, DTCONINV, DTCADINF, DTCONCASO, IDADEminutos, IDADEhoras, IDADEdias, IDADEmeses, IDADEanos, DIFDATA, NUDIASOBCO, NUDIASOBIN, NUDIASINF
⸻
Perfil demográfico
SEXO, IDADE, RACACOR, ESTCIV, ESC, ESC2010, SERIESCFAL, OCUP, NATURAL, CODMUNNATU
⸻
Informações da mãe
IDADEMAE, ESCMAE, ESCMAE2010, SERIESCMAE, QTDFILVIVO, QTDFILMORT, OCUPMAE, ESCMAEAGR1, ESCFALAGR1
⸻
Óbitos fetais, infantis ou maternos
GRAVIDEZ, GESTACAO, SEMAGESTAC, PESO, PARTO, OBITOPARTO, OBITOGRAV, OBITOPUERP, MORTEPARTO
⸻
Assistência e local de ocorrência
LOCOCOR, ASSISTMED, EXAME, CIRURGIA, NECROPSIA, ATESTANTE, CODESTAB, ESTABDESCR, CODMUNOCOR, CIRCOBITO
⸻
Causas e tipo de óbito
TIPOBITO, TPMORTEOCO, CAUSABAS, CAUSABAS_O, CAUSAMAT, ALTCAUSA, LINHAA, LINHAB, LINHAC, LINHAD, LINHAII, ATESTADO, CB_PRE, COMUNSVOIM
⸻
Sistema e codificação
STCODIFICA, CODIFICADO, VERSAOSIST, VERSAOSCB, NUMEROLOTE, TPPOS, ID, CONTADOR
⸻
Local de residência (geográfico)
CODMUNRES, munResStatus, munResTipo, munResNome, munResUf, munResLat, munResLon, munResAlt, munResArea
⸻
Epidemiologia e investigação
FONTE, FONTEINV, FONTES, FONTESINF, TPRESGINFO, TPNIVELINV, STDOEPIDEM, STDONOVA, TPOBITOCOR
2.4 Seleção e limpeza das variáveis
dados_filtrados <- dados_sim_processados %>%
select(ID,
IDADEanos, SEXO, RACACOR, ESTCIV, ESC,
CAUSABAS, DTOBITO,
LOCOCOR, munResNome) %>%
# 1) Converte antes de filtrar
mutate(
IDADEanos = as.numeric(as.character(IDADEanos)),
DTOBITO = as.Date(DTOBITO),
across(where(is.character), as.factor)
) %>%
# 2) Agora sim filtra corretamente idades ≥ 60
filter(IDADEanos >= 60)Variáveis Selecionadas para a Análise
Perfil Demográfico
- IDADEanos: Idade em anos completos (Filtro > 59 anos)
- SEXO: Sexo do indivíduo (Feminino ou Masculino)
- RACACOR: Raça/cor autorreferida
- ESTCIV: Estado civil
- ESC: Escolaridade
Dados do Óbito
- CAUSABAS: Causa básica do óbito (CID-10)
- DTOBITO: Data do óbito
- LOCOCOR: Local de ocorrência do óbito (ex: domicílio, hospital)
Dados Geográficos
- munResNome: Município de residência - ID: Identificador único da linha
2.5 Separação do conjunto de teste
# Separar 20% para teste, sem olhar em !!!
set.seed(123)
amostra_teste <- sample_frac(dados_filtrados, 0.2)
amostra_treino <- anti_join(dados_filtrados, amostra_teste, by = "ID")
colnames(amostra_teste) [1] "ID" "IDADEanos" "SEXO" "RACACOR" "ESTCIV"
[6] "ESC" "CAUSABAS" "DTOBITO" "LOCOCOR" "munResNome"
Para garantir a validação dos modelos sem viés, o conjunto de dados foi dividido em duas partes de forma aleatória, utilizando a função
sample_frac()com semente fixa (set.seed(123)) para reprodutibilidade. Reservou-se 20% dos dados para teste, sem considerar qualquer critério específico de ordenação ou agrupamento. O restante dos dados (80%) foi mantido como conjunto de treino. A separação foi feita com base no identificador único (ID) para evitar duplicidades entre as amostras.
3 Explorar os dados para extrair percepções.
3.1 criando um repositório
3.2 Funções para análisar as variáveis
3.2.1 Função para dados Continuos
# Função para explorar estatísticas de variáveis contínuas
explorar_continuas <- function(x, nome = deparse(substitute(x)), plot = FALSE) {
# Converte os valores para numérico (caso x não seja numérico)
x_num <- as.numeric(x)
# Calcula total de observações e número (e percentagem) de missing
n_total <- length(x_num)
n_missing <- sum(is.na(x_num))
pct_missing <- n_missing / n_total
# Remove os NA para as análises seguintes
x_clean <- na.omit(x_num)
# Conta outliers: valores a mais de 3 sd da média
n_outliers <- sum(abs(x_clean - mean(x_clean)) > 3 * sd(x_clean))
# Monta tabela com estatísticas gerais (contagem, missing, outliers)
tabela_geral <- tibble(
Nome = nome,
Tipo = "numeric",
N_total = n_total,
N_missing = n_missing,
pct_missing = pct_missing,
Nr_outliers = n_outliers
)
# Monta tabela com estatísticas descritivas (média, mediana, quartis, etc.)
tabela_desc <- tibble(
Nome = nome,
Média = mean(x_clean),
Mediana = median(x_clean),
SD = sd(x_clean),
Mínimo = min(x_clean),
`25%` = quantile(x_clean, 0.25),
`75%` = quantile(x_clean, 0.75),
Máximo = max(x_clean)
)
# Exibe as tabelas formatadas
print(knitr::kable(tabela_geral, caption = "Estatísticas Gerais"))
print(knitr::kable(tabela_desc, caption = "Estatísticas Descritivas"))
# Se solicitado, gera e exibe um histograma + densidade + linha da média
if (plot) {
plt <- ggplot(tibble(v = x_clean), aes(x = v)) +
geom_histogram(aes(y = ..density..), bins = 30,
fill = "skyblue", color = "black") + # histograma
geom_density(color = "red", size = 1, alpha = 0.3) + # curva de densidade
geom_vline(xintercept = mean(x_clean), # linha da média
color = "darkblue", linetype = "dashed") +
labs(
title = paste("Distribuição de", nome),
x = nome,
y = "Densidade"
) +
theme_minimal()
print(plt) # exibe o gráfico
}
}• explorar_continuas(): calcula contagem, missing, outliers (>3 SD) e estatísticas (média, mediana, quartis, etc.) de variáveis numéricas; opcionalmente plota histograma+densidade.
3.2.2 Função para dados Categoricos
# Função para explorar variáveis categóricas
explorar_categoricas <- function(x, nome = deparse(substitute(x)), plot = FALSE) {
# Converte x em fator (garante níveis mesmo que x já seja fator)
x_fac <- factor(x)
# Total de observações, incluindo NA
n_total <- length(x_fac)
# Tabela de frequência por categoria, incluindo NA como nível
tb <- table(x_fac, useNA = "ifany")
# Converte a tabela em tibble com Categoria, Frequência e Percentual
df_tb <- tibble(
Categoria = names(tb),
Frequência = as.integer(tb),
Percentual = as.numeric(tb) / sum(!is.na(x_fac))
)
# Cria resumo geral: nome da variável, tipo, total, missing, nº de níveis e categoria mais frequente
resumo <- tibble(
Nome = nome,
Tipo = "factor",
N_total = n_total,
N_missing = sum(is.na(x_fac)),
N_níveis = n_distinct(x_fac),
Nivel_mais_freq = names(tb)[which.max(tb)],
Pct_mais_freq = max(tb) / sum(tb, na.rm = TRUE)
)
# Exibe o resumo geral em formato de tabela
print(knitr::kable(resumo, caption = "Resumo Geral (Categórica)"))
# Exibe a distribuição de frequências por categoria
print(knitr::kable(df_tb, caption = paste("Frequência por categoria de", nome)))
# Se solicitado, plota gráfico de barras da frequência de cada categoria
if (plot) {
plt <- ggplot(df_tb, aes(x = reorder(Categoria, -Frequência), y = Frequência)) +
geom_col(fill = "skyblue") + # barras preenchidas
labs(title = paste("Contagem por categoria de", nome), # título
x = nome, y = "Frequência") + # rótulos de eixo
theme_minimal() + # tema limpo
theme(axis.text.x = element_text(angle = 45, hjust = 1)) # rotaciona rótulos do eixo x
print(plt) # exibe o gráfico
}
}• explorar_categoricas(): resume total, missing, níveis, categoria mais frequente e suas frequências/percentuais; opcionalmente plota gráfico de barras.
3.2.3 Função para dados Temporais
# Função para explorar variáveis temporais (datas)
explorar_temporais <- function(x, nome = deparse(substitute(x)), plot = FALSE) {
# Converte x para Date (garante formato Date)
x_date <- as.Date(x)
# Calcula total de observações e missing
n_total <- length(x_date)
n_missing <- sum(is.na(x_date))
# Remove NA para cálculos de resumo
x_clean <- na.omit(x_date)
# Monta tibble com resumo geral: total, missing, mínimo, máximo e nº de datas únicas
resumo <- tibble(
Nome = nome,
Tipo = "Date",
N_total = n_total,
N_missing = n_missing,
Mínimo = min(x_clean),
Máximo = max(x_clean),
N_unicos = n_distinct(x_clean)
)
# Exibe a tabela de resumo geral
print(knitr::kable(resumo, caption = "Resumo Geral (Data)"))
# Se plot = TRUE, gera gráfico de linha mostrando contagem por data
if (plot) {
# Prepara tibble com contagem de ocorrências por data
df <- tibble(data = x_date) %>%
count(data)
# Plota série temporal de contagem de ocorrências
plt <- ggplot(df, aes(x = data, y = n)) +
geom_line(color = "darkblue") + # linha conectando pontos
labs(
title = paste("Distribuição temporal de", nome),# título dinâmico
x = nome, # rótulo do eixo x
y = "Contagem" # rótulo do eixo y
) +
theme_minimal() # tema limpo e minimalista
# Exibe o gráfico
print(plt)
}
}• explorar_temporais(): converte em Date, informa total, missing, mínimo, máximo e datas únicas; opcionalmente plota série temporal de contagens.
3.3 Análise univariada
CLIQUE NAS OPÇÕES ABAIXO PARA EXPLORAR OS RESULTADOS
Table: Estatísticas Gerais
|Nome |Tipo | N_total| N_missing| pct_missing| Nr_outliers|
|:------------------------------|:-------|-------:|---------:|-----------:|-----------:|
|analise_exploratoria$IDADEanos |numeric | 203717| 0| 0| 40|
Table: Estatísticas Descritivas
|Nome | Média| Mediana| SD| Mínimo| 25%| 75%| Máximo|
|:------------------------------|--------:|-------:|--------:|------:|---:|---:|------:|
|analise_exploratoria$IDADEanos | 77.22446| 77| 10.10486| 60| 69| 85| 115|
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:-------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$SEXO |factor | 203717| 22| 3|Masculino | 0.5081363|
Table: Frequência por categoria de analise_exploratoria$SEXO
|Categoria | Frequência| Percentual|
|:---------|----------:|----------:|
|Feminino | 100179| 0.4918088|
|Masculino | 103516| 0.5081912|
|NA | 22| 0.0001080|
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:----------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$RACACOR |factor | 203717| 3525| 6|Branca | 0.7298998|
Table: Frequência por categoria de analise_exploratoria$RACACOR
|Categoria | Frequência| Percentual|
|:---------|----------:|----------:|
|Amarela | 3503| 0.0174982|
|Branca | 148693| 0.7427520|
|Indígena | 96| 0.0004795|
|Parda | 34674| 0.1732037|
|Preta | 13226| 0.0660666|
|NA | 3525| 0.0176081|
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:---------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$ESTCIV |factor | 203717| 8979| 6|Casado | 0.381814|
Table: Frequência por categoria de analise_exploratoria$ESTCIV
|Categoria | Frequência| Percentual|
|:----------------------|----------:|----------:|
|Casado | 77782| 0.3994187|
|Separado judicialmente | 17580| 0.0902751|
|Solteiro | 24768| 0.1271863|
|União consensual | 3362| 0.0172642|
|Viúvo | 71246| 0.3658557|
|NA | 8979| 0.0461081|
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$ESC |factor | 203717| 30736| 6|4 a 7 anos | 0.2689368|
Table: Frequência por categoria de analise_exploratoria$ESC
|Categoria | Frequência| Percentual|
|:---------------|----------:|----------:|
|1 a 3 anos | 46054| 0.2662373|
|12 anos ou mais | 15211| 0.0879345|
|4 a 7 anos | 54787| 0.3167226|
|8 a 11 anos | 33832| 0.1955822|
|Nenhuma | 23097| 0.1335233|
|NA | 30736| 0.1776843|
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:-----------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$CAUSABAS |factor | 203717| 0| 2396|B342 | 0.1448627|
Table: Frequência por categoria de analise_exploratoria$CAUSABAS
|Categoria | Frequência| Percentual|
|:---------|----------:|----------:|
|A021 | 2| 0.0000098|
|A040 | 2| 0.0000098|
|A044 | 1| 0.0000049|
|A047 | 32| 0.0001571|
|A048 | 6| 0.0000295|
|A049 | 76| 0.0003731|
|A059 | 2| 0.0000098|
|A060 | 3| 0.0000147|
|A061 | 1| 0.0000049|
|A068 | 1| 0.0000049|
|A085 | 7| 0.0000344|
|A09 | 431| 0.0021157|
|A150 | 34| 0.0001669|
|A151 | 3| 0.0000147|
|A152 | 4| 0.0000196|
|A153 | 9| 0.0000442|
|A156 | 3| 0.0000147|
|A157 | 1| 0.0000049|
|A159 | 15| 0.0000736|
|A160 | 5| 0.0000245|
|A161 | 1| 0.0000049|
|A162 | 153| 0.0007510|
|A163 | 1| 0.0000049|
|A165 | 2| 0.0000098|
|A168 | 3| 0.0000147|
|A169 | 19| 0.0000933|
|A170 | 1| 0.0000049|
|A178 | 1| 0.0000049|
|A179 | 1| 0.0000049|
|A183 | 2| 0.0000098|
|A188 | 1| 0.0000049|
|A192 | 1| 0.0000049|
|A199 | 12| 0.0000589|
|A219 | 2| 0.0000098|
|A260 | 1| 0.0000049|
|A270 | 4| 0.0000196|
|A279 | 9| 0.0000442|
|A309 | 6| 0.0000295|
|A310 | 16| 0.0000785|
|A318 | 1| 0.0000049|
|A319 | 3| 0.0000147|
|A321 | 1| 0.0000049|
|A35 | 2| 0.0000098|
|A390 | 1| 0.0000049|
|A392 | 1| 0.0000049|
|A394 | 2| 0.0000098|
|A403 | 3| 0.0000147|
|A409 | 2| 0.0000098|
|A410 | 4| 0.0000196|
|A411 | 3| 0.0000147|
|A412 | 4| 0.0000196|
|A413 | 1| 0.0000049|
|A414 | 1| 0.0000049|
|A415 | 9| 0.0000442|
|A418 | 143| 0.0007020|
|A419 | 2319| 0.0113834|
|A421 | 1| 0.0000049|
|A429 | 4| 0.0000196|
|A449 | 1| 0.0000049|
|A46 | 304| 0.0014923|
|A480 | 3| 0.0000147|
|A482 | 1| 0.0000049|
|A483 | 43| 0.0002111|
|A488 | 1| 0.0000049|
|A490 | 4| 0.0000196|
|A498 | 2| 0.0000098|
|A499 | 33| 0.0001620|
|A521 | 2| 0.0000098|
|A523 | 4| 0.0000196|
|A64 | 1| 0.0000049|
|A70 | 1| 0.0000049|
|A770 | 2| 0.0000098|
|A779 | 2| 0.0000098|
|A810 | 12| 0.0000589|
|A819 | 3| 0.0000147|
|A86 | 15| 0.0000736|
|A872 | 2| 0.0000098|
|A879 | 6| 0.0000295|
|A89 | 1| 0.0000049|
|A90 | 45| 0.0002209|
|A91 | 22| 0.0001080|
|A960 | 1| 0.0000049|
|A985 | 1| 0.0000049|
|B003 | 1| 0.0000049|
|B004 | 21| 0.0001031|
|B020 | 2| 0.0000098|
|B021 | 1| 0.0000049|
|B023 | 1| 0.0000049|
|B027 | 3| 0.0000147|
|B028 | 1| 0.0000049|
|B029 | 17| 0.0000834|
|B159 | 2| 0.0000098|
|B162 | 1| 0.0000049|
|B169 | 7| 0.0000344|
|B171 | 9| 0.0000442|
|B172 | 2| 0.0000098|
|B178 | 2| 0.0000098|
|B181 | 13| 0.0000638|
|B182 | 159| 0.0007805|
|B188 | 4| 0.0000196|
|B189 | 11| 0.0000540|
|B199 | 14| 0.0000687|
|B200 | 17| 0.0000834|
|B201 | 31| 0.0001522|
|B202 | 1| 0.0000049|
|B203 | 11| 0.0000540|
|B204 | 2| 0.0000098|
|B205 | 1| 0.0000049|
|B206 | 8| 0.0000393|
|B207 | 91| 0.0004467|
|B208 | 23| 0.0001129|
|B209 | 7| 0.0000344|
|B212 | 1| 0.0000049|
|B213 | 3| 0.0000147|
|B217 | 5| 0.0000245|
|B218 | 2| 0.0000098|
|B219 | 1| 0.0000049|
|B220 | 1| 0.0000049|
|B222 | 3| 0.0000147|
|B227 | 23| 0.0001129|
|B232 | 1| 0.0000049|
|B238 | 1| 0.0000049|
|B24 | 74| 0.0003632|
|B259 | 2| 0.0000098|
|B268 | 1| 0.0000049|
|B332 | 1| 0.0000049|
|B340 | 4| 0.0000196|
|B341 | 10| 0.0000491|
|B342 | 29511| 0.1448627|
|B344 | 1| 0.0000049|
|B349 | 40| 0.0001964|
|B370 | 1| 0.0000049|
|B372 | 1| 0.0000049|
|B375 | 1| 0.0000049|
|B377 | 11| 0.0000540|
|B378 | 1| 0.0000049|
|B379 | 3| 0.0000147|
|B392 | 1| 0.0000049|
|B402 | 1| 0.0000049|
|B409 | 1| 0.0000049|
|B410 | 1| 0.0000049|
|B417 | 3| 0.0000147|
|B419 | 1| 0.0000049|
|B429 | 1| 0.0000049|
|B432 | 2| 0.0000098|
|B441 | 8| 0.0000393|
|B449 | 1| 0.0000049|
|B450 | 5| 0.0000245|
|B451 | 6| 0.0000295|
|B459 | 4| 0.0000196|
|B465 | 1| 0.0000049|
|B550 | 4| 0.0000196|
|B570 | 32| 0.0001571|
|B571 | 6| 0.0000295|
|B572 | 481| 0.0023611|
|B573 | 86| 0.0004222|
|B574 | 8| 0.0000393|
|B575 | 12| 0.0000589|
|B589 | 2| 0.0000098|
|B59 | 3| 0.0000147|
|B650 | 3| 0.0000147|
|B651 | 14| 0.0000687|
|B659 | 15| 0.0000736|
|B690 | 4| 0.0000196|
|B699 | 1| 0.0000049|
|B748 | 1| 0.0000049|
|B870 | 1| 0.0000049|
|B872 | 1| 0.0000049|
|B879 | 2| 0.0000098|
|B900 | 1| 0.0000049|
|B909 | 17| 0.0000834|
|B91 | 5| 0.0000245|
|B92 | 2| 0.0000098|
|B942 | 5| 0.0000245|
|B948 | 14| 0.0000687|
|B949 | 3| 0.0000147|
|B99 | 2| 0.0000098|
|C001 | 1| 0.0000049|
|C009 | 12| 0.0000589|
|C01 | 50| 0.0002454|
|C020 | 4| 0.0000196|
|C021 | 3| 0.0000147|
|C023 | 1| 0.0000049|
|C028 | 10| 0.0000491|
|C029 | 151| 0.0007412|
|C031 | 1| 0.0000049|
|C039 | 4| 0.0000196|
|C040 | 1| 0.0000049|
|C048 | 2| 0.0000098|
|C049 | 27| 0.0001325|
|C050 | 5| 0.0000245|
|C051 | 7| 0.0000344|
|C052 | 2| 0.0000098|
|C059 | 39| 0.0001914|
|C060 | 2| 0.0000098|
|C062 | 3| 0.0000147|
|C068 | 2| 0.0000098|
|C069 | 116| 0.0005694|
|C07 | 39| 0.0001914|
|C080 | 4| 0.0000196|
|C089 | 10| 0.0000491|
|C090 | 2| 0.0000098|
|C091 | 1| 0.0000049|
|C098 | 2| 0.0000098|
|C099 | 18| 0.0000884|
|C101 | 4| 0.0000196|
|C102 | 6| 0.0000295|
|C108 | 19| 0.0000933|
|C109 | 209| 0.0010259|
|C110 | 1| 0.0000049|
|C111 | 1| 0.0000049|
|C113 | 1| 0.0000049|
|C118 | 1| 0.0000049|
|C119 | 27| 0.0001325|
|C12 | 16| 0.0000785|
|C130 | 1| 0.0000049|
|C132 | 2| 0.0000098|
|C138 | 2| 0.0000098|
|C139 | 44| 0.0002160|
|C140 | 95| 0.0004663|
|C148 | 11| 0.0000540|
|C150 | 15| 0.0000736|
|C151 | 9| 0.0000442|
|C152 | 3| 0.0000147|
|C153 | 1| 0.0000049|
|C154 | 12| 0.0000589|
|C155 | 8| 0.0000393|
|C158 | 35| 0.0001718|
|C159 | 828| 0.0040645|
|C160 | 39| 0.0001914|
|C161 | 8| 0.0000393|
|C162 | 19| 0.0000933|
|C163 | 9| 0.0000442|
|C164 | 1| 0.0000049|
|C165 | 1| 0.0000049|
|C166 | 3| 0.0000147|
|C168 | 62| 0.0003043|
|C169 | 1789| 0.0087818|
|C170 | 95| 0.0004663|
|C171 | 5| 0.0000245|
|C172 | 4| 0.0000196|
|C173 | 2| 0.0000098|
|C178 | 17| 0.0000834|
|C179 | 79| 0.0003878|
|C180 | 73| 0.0003583|
|C181 | 11| 0.0000540|
|C182 | 60| 0.0002945|
|C183 | 3| 0.0000147|
|C184 | 39| 0.0001914|
|C185 | 5| 0.0000245|
|C186 | 27| 0.0001325|
|C187 | 208| 0.0010210|
|C188 | 79| 0.0003878|
|C189 | 1870| 0.0091794|
|C19 | 233| 0.0011437|
|C20 | 917| 0.0045013|
|C210 | 8| 0.0000393|
|C211 | 27| 0.0001325|
|C218 | 77| 0.0003780|
|C220 | 290| 0.0014235|
|C221 | 171| 0.0008394|
|C222 | 1| 0.0000049|
|C224 | 10| 0.0000491|
|C227 | 11| 0.0000540|
|C229 | 1064| 0.0052229|
|C23 | 124| 0.0006087|
|C240 | 101| 0.0004958|
|C241 | 29| 0.0001424|
|C248 | 13| 0.0000638|
|C249 | 253| 0.0012419|
|C250 | 225| 0.0011045|
|C251 | 16| 0.0000785|
|C252 | 11| 0.0000540|
|C253 | 10| 0.0000491|
|C254 | 7| 0.0000344|
|C257 | 13| 0.0000638|
|C258 | 49| 0.0002405|
|C259 | 1776| 0.0087180|
|C260 | 584| 0.0028667|
|C261 | 3| 0.0000147|
|C268 | 16| 0.0000785|
|C269 | 118| 0.0005792|
|C300 | 9| 0.0000442|
|C301 | 4| 0.0000196|
|C310 | 5| 0.0000245|
|C312 | 1| 0.0000049|
|C319 | 9| 0.0000442|
|C320 | 25| 0.0001227|
|C321 | 10| 0.0000491|
|C322 | 2| 0.0000098|
|C323 | 5| 0.0000245|
|C328 | 30| 0.0001473|
|C329 | 584| 0.0028667|
|C33 | 8| 0.0000393|
|C340 | 43| 0.0002111|
|C341 | 24| 0.0001178|
|C342 | 14| 0.0000687|
|C343 | 12| 0.0000589|
|C348 | 117| 0.0005743|
|C349 | 4229| 0.0207592|
|C37 | 10| 0.0000491|
|C380 | 1| 0.0000049|
|C381 | 1| 0.0000049|
|C382 | 1| 0.0000049|
|C383 | 70| 0.0003436|
|C384 | 32| 0.0001571|
|C388 | 5| 0.0000245|
|C390 | 4| 0.0000196|
|C398 | 4| 0.0000196|
|C399 | 9| 0.0000442|
|C400 | 1| 0.0000049|
|C401 | 1| 0.0000049|
|C402 | 4| 0.0000196|
|C403 | 1| 0.0000049|
|C409 | 6| 0.0000295|
|C410 | 9| 0.0000442|
|C411 | 31| 0.0001522|
|C412 | 41| 0.0002013|
|C413 | 4| 0.0000196|
|C414 | 10| 0.0000491|
|C418 | 6| 0.0000295|
|C419 | 95| 0.0004663|
|C431 | 1| 0.0000049|
|C433 | 9| 0.0000442|
|C434 | 6| 0.0000295|
|C435 | 2| 0.0000098|
|C436 | 1| 0.0000049|
|C437 | 4| 0.0000196|
|C438 | 21| 0.0001031|
|C439 | 264| 0.0012959|
|C441 | 1| 0.0000049|
|C442 | 13| 0.0000638|
|C443 | 27| 0.0001325|
|C444 | 22| 0.0001080|
|C445 | 6| 0.0000295|
|C446 | 2| 0.0000098|
|C447 | 3| 0.0000147|
|C448 | 11| 0.0000540|
|C449 | 245| 0.0012026|
|C450 | 12| 0.0000589|
|C451 | 3| 0.0000147|
|C457 | 3| 0.0000147|
|C459 | 11| 0.0000540|
|C460 | 1| 0.0000049|
|C461 | 1| 0.0000049|
|C469 | 7| 0.0000344|
|C470 | 1| 0.0000049|
|C480 | 49| 0.0002405|
|C481 | 8| 0.0000393|
|C482 | 119| 0.0005841|
|C488 | 7| 0.0000344|
|C490 | 6| 0.0000295|
|C491 | 2| 0.0000098|
|C492 | 10| 0.0000491|
|C493 | 5| 0.0000245|
|C494 | 5| 0.0000245|
|C495 | 2| 0.0000098|
|C498 | 2| 0.0000098|
|C499 | 73| 0.0003583|
|C500 | 11| 0.0000540|
|C501 | 9| 0.0000442|
|C505 | 3| 0.0000147|
|C506 | 2| 0.0000098|
|C508 | 114| 0.0005596|
|C509 | 1929| 0.0094690|
|C518 | 3| 0.0000147|
|C519 | 65| 0.0003191|
|C52 | 23| 0.0001129|
|C530 | 2| 0.0000098|
|C538 | 25| 0.0001227|
|C539 | 348| 0.0017083|
|C540 | 3| 0.0000147|
|C541 | 270| 0.0013254|
|C542 | 1| 0.0000049|
|C548 | 4| 0.0000196|
|C549 | 41| 0.0002013|
|C55 | 235| 0.0011536|
|C56 | 512| 0.0025133|
|C574 | 9| 0.0000442|
|C578 | 9| 0.0000442|
|C579 | 17| 0.0000834|
|C602 | 1| 0.0000049|
|C608 | 2| 0.0000098|
|C609 | 37| 0.0001816|
|C61 | 2391| 0.0117369|
|C620 | 2| 0.0000098|
|C629 | 11| 0.0000540|
|C631 | 1| 0.0000049|
|C637 | 1| 0.0000049|
|C639 | 2| 0.0000098|
|C64 | 571| 0.0028029|
|C65 | 15| 0.0000736|
|C66 | 14| 0.0000687|
|C670 | 6| 0.0000295|
|C671 | 1| 0.0000049|
|C672 | 2| 0.0000098|
|C673 | 1| 0.0000049|
|C674 | 2| 0.0000098|
|C675 | 6| 0.0000295|
|C678 | 53| 0.0002602|
|C679 | 886| 0.0043492|
|C680 | 4| 0.0000196|
|C688 | 7| 0.0000344|
|C689 | 40| 0.0001964|
|C690 | 2| 0.0000098|
|C691 | 1| 0.0000049|
|C693 | 7| 0.0000344|
|C694 | 1| 0.0000049|
|C695 | 1| 0.0000049|
|C696 | 9| 0.0000442|
|C698 | 2| 0.0000098|
|C699 | 4| 0.0000196|
|C700 | 9| 0.0000442|
|C709 | 5| 0.0000245|
|C710 | 276| 0.0013548|
|C711 | 7| 0.0000344|
|C712 | 5| 0.0000245|
|C713 | 2| 0.0000098|
|C715 | 2| 0.0000098|
|C716 | 16| 0.0000785|
|C717 | 4| 0.0000196|
|C718 | 21| 0.0001031|
|C719 | 538| 0.0026409|
|C720 | 7| 0.0000344|
|C721 | 1| 0.0000049|
|C725 | 1| 0.0000049|
|C728 | 7| 0.0000344|
|C729 | 119| 0.0005841|
|C73 | 119| 0.0005841|
|C741 | 2| 0.0000098|
|C749 | 28| 0.0001374|
|C750 | 3| 0.0000147|
|C751 | 13| 0.0000638|
|C753 | 2| 0.0000098|
|C754 | 1| 0.0000049|
|C758 | 1| 0.0000049|
|C759 | 7| 0.0000344|
|C760 | 274| 0.0013450|
|C761 | 13| 0.0000638|
|C762 | 177| 0.0008689|
|C763 | 57| 0.0002798|
|C764 | 3| 0.0000147|
|C765 | 10| 0.0000491|
|C767 | 23| 0.0001129|
|C768 | 33| 0.0001620|
|C770 | 3| 0.0000147|
|C772 | 2| 0.0000098|
|C779 | 6| 0.0000295|
|C780 | 96| 0.0004712|
|C781 | 2| 0.0000098|
|C782 | 1| 0.0000049|
|C783 | 6| 0.0000295|
|C784 | 3| 0.0000147|
|C785 | 27| 0.0001325|
|C786 | 31| 0.0001522|
|C787 | 68| 0.0003338|
|C788 | 53| 0.0002602|
|C790 | 24| 0.0001178|
|C791 | 11| 0.0000540|
|C792 | 5| 0.0000245|
|C793 | 25| 0.0001227|
|C794 | 7| 0.0000344|
|C795 | 33| 0.0001620|
|C797 | 3| 0.0000147|
|C798 | 145| 0.0007118|
|C80 | 866| 0.0042510|
|C810 | 2| 0.0000098|
|C812 | 1| 0.0000049|
|C819 | 32| 0.0001571|
|C821 | 2| 0.0000098|
|C822 | 3| 0.0000147|
|C827 | 2| 0.0000098|
|C829 | 12| 0.0000589|
|C830 | 7| 0.0000344|
|C831 | 3| 0.0000147|
|C832 | 1| 0.0000049|
|C833 | 35| 0.0001718|
|C834 | 3| 0.0000147|
|C835 | 3| 0.0000147|
|C836 | 1| 0.0000049|
|C837 | 2| 0.0000098|
|C838 | 3| 0.0000147|
|C839 | 42| 0.0002062|
|C840 | 3| 0.0000147|
|C841 | 2| 0.0000098|
|C844 | 4| 0.0000196|
|C845 | 13| 0.0000638|
|C850 | 2| 0.0000098|
|C851 | 57| 0.0002798|
|C857 | 10| 0.0000491|
|C859 | 348| 0.0017083|
|C880 | 5| 0.0000245|
|C883 | 1| 0.0000049|
|C889 | 1| 0.0000049|
|C900 | 580| 0.0028471|
|C901 | 10| 0.0000491|
|C902 | 13| 0.0000638|
|C910 | 47| 0.0002307|
|C911 | 97| 0.0004762|
|C912 | 2| 0.0000098|
|C913 | 1| 0.0000049|
|C914 | 2| 0.0000098|
|C915 | 1| 0.0000049|
|C917 | 1| 0.0000049|
|C919 | 24| 0.0001178|
|C920 | 272| 0.0013352|
|C921 | 61| 0.0002994|
|C922 | 2| 0.0000098|
|C923 | 3| 0.0000147|
|C924 | 4| 0.0000196|
|C925 | 9| 0.0000442|
|C927 | 12| 0.0000589|
|C929 | 50| 0.0002454|
|C930 | 2| 0.0000098|
|C931 | 4| 0.0000196|
|C939 | 2| 0.0000098|
|C944 | 1| 0.0000049|
|C945 | 20| 0.0000982|
|C947 | 2| 0.0000098|
|C950 | 40| 0.0001964|
|C951 | 8| 0.0000393|
|C957 | 2| 0.0000098|
|C959 | 94| 0.0004614|
|C967 | 1| 0.0000049|
|C969 | 21| 0.0001031|
|C97 | 5| 0.0000245|
|D000 | 1| 0.0000049|
|D001 | 1| 0.0000049|
|D002 | 6| 0.0000295|
|D011 | 1| 0.0000049|
|D012 | 2| 0.0000098|
|D014 | 3| 0.0000147|
|D017 | 1| 0.0000049|
|D019 | 1| 0.0000049|
|D020 | 1| 0.0000049|
|D022 | 2| 0.0000098|
|D029 | 1| 0.0000049|
|D038 | 1| 0.0000049|
|D043 | 2| 0.0000098|
|D049 | 1| 0.0000049|
|D059 | 2| 0.0000098|
|D069 | 1| 0.0000049|
|D070 | 1| 0.0000049|
|D075 | 3| 0.0000147|
|D097 | 2| 0.0000098|
|D099 | 3| 0.0000147|
|D126 | 2| 0.0000098|
|D129 | 2| 0.0000098|
|D132 | 1| 0.0000049|
|D134 | 1| 0.0000049|
|D136 | 1| 0.0000049|
|D137 | 1| 0.0000049|
|D151 | 3| 0.0000147|
|D162 | 1| 0.0000049|
|D169 | 1| 0.0000049|
|D180 | 4| 0.0000196|
|D181 | 2| 0.0000098|
|D190 | 1| 0.0000049|
|D191 | 1| 0.0000049|
|D210 | 1| 0.0000049|
|D219 | 4| 0.0000196|
|D239 | 3| 0.0000147|
|D259 | 1| 0.0000049|
|D269 | 1| 0.0000049|
|D27 | 4| 0.0000196|
|D291 | 5| 0.0000245|
|D299 | 1| 0.0000049|
|D303 | 1| 0.0000049|
|D320 | 14| 0.0000687|
|D321 | 1| 0.0000049|
|D329 | 35| 0.0001718|
|D330 | 5| 0.0000245|
|D331 | 1| 0.0000049|
|D332 | 1| 0.0000049|
|D333 | 2| 0.0000098|
|D339 | 1| 0.0000049|
|D350 | 3| 0.0000147|
|D352 | 6| 0.0000295|
|D361 | 1| 0.0000049|
|D370 | 1| 0.0000049|
|D371 | 9| 0.0000442|
|D372 | 3| 0.0000147|
|D374 | 8| 0.0000393|
|D375 | 4| 0.0000196|
|D376 | 23| 0.0001129|
|D377 | 6| 0.0000295|
|D379 | 4| 0.0000196|
|D380 | 2| 0.0000098|
|D381 | 52| 0.0002553|
|D383 | 8| 0.0000393|
|D386 | 2| 0.0000098|
|D390 | 1| 0.0000049|
|D391 | 11| 0.0000540|
|D399 | 3| 0.0000147|
|D400 | 15| 0.0000736|
|D410 | 5| 0.0000245|
|D413 | 1| 0.0000049|
|D414 | 5| 0.0000245|
|D417 | 1| 0.0000049|
|D419 | 3| 0.0000147|
|D420 | 1| 0.0000049|
|D430 | 8| 0.0000393|
|D431 | 5| 0.0000245|
|D432 | 9| 0.0000442|
|D434 | 1| 0.0000049|
|D437 | 2| 0.0000098|
|D439 | 9| 0.0000442|
|D440 | 2| 0.0000098|
|D441 | 1| 0.0000049|
|D444 | 1| 0.0000049|
|D45 | 7| 0.0000344|
|D460 | 1| 0.0000049|
|D462 | 1| 0.0000049|
|D464 | 9| 0.0000442|
|D467 | 9| 0.0000442|
|D469 | 164| 0.0008050|
|D471 | 39| 0.0001914|
|D472 | 2| 0.0000098|
|D473 | 2| 0.0000098|
|D479 | 27| 0.0001325|
|D483 | 7| 0.0000344|
|D484 | 1| 0.0000049|
|D486 | 4| 0.0000196|
|D487 | 7| 0.0000344|
|D489 | 35| 0.0001718|
|D500 | 5| 0.0000245|
|D508 | 4| 0.0000196|
|D509 | 33| 0.0001620|
|D510 | 2| 0.0000098|
|D519 | 2| 0.0000098|
|D531 | 2| 0.0000098|
|D539 | 26| 0.0001276|
|D551 | 1| 0.0000049|
|D560 | 1| 0.0000049|
|D569 | 2| 0.0000098|
|D570 | 2| 0.0000098|
|D571 | 7| 0.0000344|
|D578 | 1| 0.0000049|
|D589 | 7| 0.0000344|
|D591 | 6| 0.0000295|
|D592 | 1| 0.0000049|
|D593 | 9| 0.0000442|
|D595 | 1| 0.0000049|
|D596 | 1| 0.0000049|
|D599 | 1| 0.0000049|
|D600 | 1| 0.0000049|
|D608 | 1| 0.0000049|
|D609 | 2| 0.0000098|
|D610 | 6| 0.0000295|
|D611 | 1| 0.0000049|
|D612 | 1| 0.0000049|
|D613 | 1| 0.0000049|
|D618 | 4| 0.0000196|
|D619 | 78| 0.0003829|
|D62 | 4| 0.0000196|
|D640 | 2| 0.0000098|
|D644 | 1| 0.0000049|
|D648 | 5| 0.0000245|
|D649 | 182| 0.0008934|
|D65 | 18| 0.0000884|
|D683 | 28| 0.0001374|
|D684 | 2| 0.0000098|
|D688 | 3| 0.0000147|
|D689 | 70| 0.0003436|
|D691 | 2| 0.0000098|
|D692 | 1| 0.0000049|
|D693 | 8| 0.0000393|
|D694 | 3| 0.0000147|
|D695 | 1| 0.0000049|
|D696 | 36| 0.0001767|
|D699 | 4| 0.0000196|
|D70 | 16| 0.0000785|
|D71 | 2| 0.0000098|
|D728 | 4| 0.0000196|
|D729 | 2| 0.0000098|
|D731 | 1| 0.0000049|
|D733 | 2| 0.0000098|
|D735 | 2| 0.0000098|
|D738 | 1| 0.0000049|
|D739 | 3| 0.0000147|
|D752 | 3| 0.0000147|
|D759 | 21| 0.0001031|
|D761 | 1| 0.0000049|
|D762 | 1| 0.0000049|
|D809 | 1| 0.0000049|
|D823 | 2| 0.0000098|
|D848 | 1| 0.0000049|
|D849 | 6| 0.0000295|
|D860 | 2| 0.0000098|
|D862 | 1| 0.0000049|
|D869 | 2| 0.0000098|
|D899 | 1| 0.0000049|
|E030 | 1| 0.0000049|
|E031 | 1| 0.0000049|
|E035 | 6| 0.0000295|
|E038 | 4| 0.0000196|
|E039 | 128| 0.0006283|
|E041 | 1| 0.0000049|
|E042 | 3| 0.0000147|
|E049 | 4| 0.0000196|
|E052 | 1| 0.0000049|
|E055 | 4| 0.0000196|
|E058 | 1| 0.0000049|
|E059 | 8| 0.0000393|
|E063 | 1| 0.0000049|
|E078 | 6| 0.0000295|
|E079 | 4| 0.0000196|
|E100 | 13| 0.0000638|
|E101 | 49| 0.0002405|
|E102 | 93| 0.0004565|
|E103 | 1| 0.0000049|
|E104 | 4| 0.0000196|
|E105 | 88| 0.0004320|
|E106 | 20| 0.0000982|
|E107 | 184| 0.0009032|
|E108 | 65| 0.0003191|
|E109 | 251| 0.0012321|
|E110 | 51| 0.0002503|
|E111 | 29| 0.0001424|
|E112 | 222| 0.0010897|
|E113 | 3| 0.0000147|
|E114 | 10| 0.0000491|
|E115 | 84| 0.0004123|
|E116 | 21| 0.0001031|
|E117 | 128| 0.0006283|
|E118 | 80| 0.0003927|
|E119 | 703| 0.0034509|
|E124 | 1| 0.0000049|
|E126 | 31| 0.0001522|
|E127 | 8| 0.0000393|
|E128 | 1| 0.0000049|
|E131 | 7| 0.0000344|
|E132 | 3| 0.0000147|
|E135 | 2| 0.0000098|
|E136 | 1| 0.0000049|
|E137 | 3| 0.0000147|
|E138 | 2| 0.0000098|
|E139 | 8| 0.0000393|
|E140 | 60| 0.0002945|
|E141 | 190| 0.0009327|
|E142 | 1400| 0.0068723|
|E143 | 1| 0.0000049|
|E144 | 18| 0.0000884|
|E145 | 434| 0.0021304|
|E146 | 36| 0.0001767|
|E147 | 322| 0.0015806|
|E148 | 332| 0.0016297|
|E149 | 4318| 0.0211961|
|E15 | 3| 0.0000147|
|E161 | 7| 0.0000344|
|E162 | 38| 0.0001865|
|E169 | 2| 0.0000098|
|E230 | 2| 0.0000098|
|E232 | 1| 0.0000049|
|E249 | 1| 0.0000049|
|E269 | 1| 0.0000049|
|E271 | 1| 0.0000049|
|E272 | 1| 0.0000049|
|E274 | 6| 0.0000295|
|E279 | 2| 0.0000098|
|E319 | 1| 0.0000049|
|E329 | 1| 0.0000049|
|E40 | 1| 0.0000049|
|E41 | 46| 0.0002258|
|E43 | 124| 0.0006087|
|E440 | 53| 0.0002602|
|E441 | 9| 0.0000442|
|E45 | 1| 0.0000049|
|E46 | 238| 0.0011683|
|E509 | 1| 0.0000049|
|E559 | 1| 0.0000049|
|E638 | 1| 0.0000049|
|E639 | 2| 0.0000098|
|E640 | 3| 0.0000147|
|E649 | 5| 0.0000245|
|E660 | 7| 0.0000344|
|E662 | 9| 0.0000442|
|E668 | 78| 0.0003829|
|E669 | 254| 0.0012468|
|E673 | 1| 0.0000049|
|E709 | 1| 0.0000049|
|E721 | 1| 0.0000049|
|E722 | 3| 0.0000147|
|E723 | 1| 0.0000049|
|E755 | 1| 0.0000049|
|E778 | 1| 0.0000049|
|E780 | 41| 0.0002013|
|E781 | 2| 0.0000098|
|E782 | 12| 0.0000589|
|E784 | 9| 0.0000442|
|E785 | 23| 0.0001129|
|E788 | 134| 0.0006578|
|E789 | 48| 0.0002356|
|E798 | 1| 0.0000049|
|E807 | 1| 0.0000049|
|E830 | 1| 0.0000049|
|E831 | 2| 0.0000098|
|E834 | 1| 0.0000049|
|E835 | 18| 0.0000884|
|E839 | 1| 0.0000049|
|E840 | 22| 0.0001080|
|E849 | 3| 0.0000147|
|E851 | 1| 0.0000049|
|E854 | 15| 0.0000736|
|E858 | 1| 0.0000049|
|E859 | 11| 0.0000540|
|E86 | 222| 0.0010897|
|E870 | 66| 0.0003240|
|E871 | 42| 0.0002062|
|E872 | 34| 0.0001669|
|E873 | 3| 0.0000147|
|E874 | 9| 0.0000442|
|E875 | 24| 0.0001178|
|E876 | 13| 0.0000638|
|E877 | 2| 0.0000098|
|E878 | 143| 0.0007020|
|E880 | 4| 0.0000196|
|E882 | 1| 0.0000049|
|E888 | 4| 0.0000196|
|E889 | 95| 0.0004663|
|F010 | 1| 0.0000049|
|F011 | 1| 0.0000049|
|F013 | 1| 0.0000049|
|F018 | 3| 0.0000147|
|F019 | 86| 0.0004222|
|F03 | 782| 0.0038387|
|F051 | 4| 0.0000196|
|F058 | 3| 0.0000147|
|F059 | 17| 0.0000834|
|F09 | 1| 0.0000049|
|F100 | 5| 0.0000245|
|F101 | 17| 0.0000834|
|F102 | 256| 0.0012566|
|F103 | 6| 0.0000295|
|F104 | 1| 0.0000049|
|F106 | 2| 0.0000098|
|F107 | 10| 0.0000491|
|F108 | 1| 0.0000049|
|F109 | 16| 0.0000785|
|F122 | 1| 0.0000049|
|F142 | 2| 0.0000098|
|F147 | 1| 0.0000049|
|F149 | 2| 0.0000098|
|F171 | 15| 0.0000736|
|F172 | 146| 0.0007167|
|F177 | 1| 0.0000049|
|F178 | 1| 0.0000049|
|F179 | 7| 0.0000344|
|F192 | 1| 0.0000049|
|F197 | 1| 0.0000049|
|F199 | 2| 0.0000098|
|F200 | 4| 0.0000196|
|F205 | 4| 0.0000196|
|F206 | 1| 0.0000049|
|F208 | 1| 0.0000049|
|F209 | 72| 0.0003534|
|F312 | 1| 0.0000049|
|F319 | 8| 0.0000393|
|F320 | 1| 0.0000049|
|F321 | 2| 0.0000098|
|F322 | 6| 0.0000295|
|F328 | 1| 0.0000049|
|F329 | 46| 0.0002258|
|F333 | 1| 0.0000049|
|F338 | 1| 0.0000049|
|F339 | 6| 0.0000295|
|F402 | 1| 0.0000049|
|F410 | 1| 0.0000049|
|F412 | 2| 0.0000098|
|F419 | 2| 0.0000098|
|F422 | 1| 0.0000049|
|F429 | 1| 0.0000049|
|F444 | 1| 0.0000049|
|F453 | 1| 0.0000049|
|F54 | 1| 0.0000049|
|F609 | 1| 0.0000049|
|F700 | 1| 0.0000049|
|F711 | 1| 0.0000049|
|F729 | 1| 0.0000049|
|F799 | 1| 0.0000049|
|F803 | 1| 0.0000049|
|F840 | 1| 0.0000049|
|F99 | 7| 0.0000344|
|G001 | 3| 0.0000147|
|G008 | 2| 0.0000098|
|G009 | 42| 0.0002062|
|G038 | 1| 0.0000049|
|G039 | 12| 0.0000589|
|G040 | 2| 0.0000098|
|G042 | 7| 0.0000344|
|G048 | 2| 0.0000098|
|G049 | 22| 0.0001080|
|G060 | 12| 0.0000589|
|G061 | 1| 0.0000049|
|G062 | 6| 0.0000295|
|G08 | 1| 0.0000049|
|G09 | 14| 0.0000687|
|G10 | 20| 0.0000982|
|G112 | 3| 0.0000147|
|G119 | 5| 0.0000245|
|G120 | 1| 0.0000049|
|G122 | 235| 0.0011536|
|G128 | 4| 0.0000196|
|G129 | 9| 0.0000442|
|G20 | 836| 0.0041037|
|G210 | 3| 0.0000147|
|G211 | 1| 0.0000049|
|G213 | 1| 0.0000049|
|G219 | 2| 0.0000098|
|G231 | 10| 0.0000491|
|G238 | 1| 0.0000049|
|G239 | 1| 0.0000049|
|G241 | 1| 0.0000049|
|G259 | 1| 0.0000049|
|G300 | 26| 0.0001276|
|G301 | 269| 0.0013205|
|G308 | 43| 0.0002111|
|G309 | 4795| 0.0235376|
|G310 | 8| 0.0000393|
|G311 | 261| 0.0012812|
|G312 | 9| 0.0000442|
|G318 | 34| 0.0001669|
|G319 | 186| 0.0009130|
|G35 | 34| 0.0001669|
|G360 | 2| 0.0000098|
|G369 | 1| 0.0000049|
|G372 | 2| 0.0000098|
|G373 | 2| 0.0000098|
|G379 | 6| 0.0000295|
|G400 | 7| 0.0000344|
|G401 | 1| 0.0000049|
|G402 | 5| 0.0000245|
|G403 | 2| 0.0000098|
|G404 | 2| 0.0000098|
|G405 | 4| 0.0000196|
|G406 | 2| 0.0000098|
|G407 | 1| 0.0000049|
|G408 | 5| 0.0000245|
|G409 | 178| 0.0008738|
|G410 | 15| 0.0000736|
|G419 | 18| 0.0000884|
|G450 | 1| 0.0000049|
|G451 | 3| 0.0000147|
|G452 | 1| 0.0000049|
|G458 | 5| 0.0000245|
|G459 | 16| 0.0000785|
|G473 | 1| 0.0000049|
|G589 | 2| 0.0000098|
|G609 | 2| 0.0000098|
|G610 | 24| 0.0001178|
|G619 | 3| 0.0000147|
|G621 | 2| 0.0000098|
|G628 | 2| 0.0000098|
|G629 | 25| 0.0001227|
|G700 | 20| 0.0000982|
|G709 | 5| 0.0000245|
|G710 | 11| 0.0000540|
|G719 | 1| 0.0000049|
|G724 | 1| 0.0000049|
|G729 | 4| 0.0000196|
|G800 | 1| 0.0000049|
|G808 | 1| 0.0000049|
|G809 | 14| 0.0000687|
|G819 | 1| 0.0000049|
|G822 | 7| 0.0000344|
|G825 | 3| 0.0000147|
|G839 | 1| 0.0000049|
|G900 | 1| 0.0000049|
|G901 | 1| 0.0000049|
|G903 | 14| 0.0000687|
|G908 | 1| 0.0000049|
|G909 | 5| 0.0000245|
|G910 | 1| 0.0000049|
|G911 | 10| 0.0000491|
|G912 | 8| 0.0000393|
|G913 | 1| 0.0000049|
|G918 | 3| 0.0000147|
|G919 | 48| 0.0002356|
|G92 | 10| 0.0000491|
|G930 | 4| 0.0000196|
|G931 | 121| 0.0005940|
|G932 | 6| 0.0000295|
|G934 | 33| 0.0001620|
|G935 | 5| 0.0000245|
|G936 | 19| 0.0000933|
|G937 | 1| 0.0000049|
|G938 | 4| 0.0000196|
|G939 | 31| 0.0001522|
|G950 | 1| 0.0000049|
|G952 | 9| 0.0000442|
|G958 | 3| 0.0000147|
|G959 | 6| 0.0000295|
|G960 | 1| 0.0000049|
|G961 | 1| 0.0000049|
|G968 | 1| 0.0000049|
|G969 | 5| 0.0000245|
|G98 | 8| 0.0000393|
|H050 | 1| 0.0000049|
|H440 | 1| 0.0000049|
|H650 | 1| 0.0000049|
|H652 | 1| 0.0000049|
|H653 | 1| 0.0000049|
|H659 | 1| 0.0000049|
|H660 | 2| 0.0000098|
|H700 | 1| 0.0000049|
|H701 | 1| 0.0000049|
|H709 | 7| 0.0000344|
|H748 | 1| 0.0000049|
|I00 | 2| 0.0000098|
|I012 | 1| 0.0000049|
|I018 | 1| 0.0000049|
|I019 | 12| 0.0000589|
|I050 | 21| 0.0001031|
|I051 | 5| 0.0000245|
|I052 | 8| 0.0000393|
|I058 | 14| 0.0000687|
|I059 | 51| 0.0002503|
|I060 | 2| 0.0000098|
|I061 | 1| 0.0000049|
|I062 | 3| 0.0000147|
|I069 | 1| 0.0000049|
|I071 | 2| 0.0000098|
|I078 | 1| 0.0000049|
|I079 | 1| 0.0000049|
|I080 | 21| 0.0001031|
|I081 | 2| 0.0000098|
|I082 | 1| 0.0000049|
|I083 | 11| 0.0000540|
|I089 | 18| 0.0000884|
|I091 | 1| 0.0000049|
|I098 | 1| 0.0000049|
|I099 | 1| 0.0000049|
|I10 | 4132| 0.0202830|
|I110 | 2057| 0.0100973|
|I119 | 997| 0.0048940|
|I120 | 668| 0.0032791|
|I129 | 34| 0.0001669|
|I130 | 25| 0.0001227|
|I131 | 58| 0.0002847|
|I132 | 391| 0.0019193|
|I139 | 42| 0.0002062|
|I159 | 2| 0.0000098|
|I200 | 34| 0.0001669|
|I201 | 2| 0.0000098|
|I208 | 1| 0.0000049|
|I209 | 30| 0.0001473|
|I210 | 102| 0.0005007|
|I211 | 59| 0.0002896|
|I212 | 31| 0.0001522|
|I213 | 82| 0.0004025|
|I214 | 22| 0.0001080|
|I219 | 12911| 0.0633771|
|I220 | 1| 0.0000049|
|I228 | 1| 0.0000049|
|I229 | 11| 0.0000540|
|I241 | 1| 0.0000049|
|I248 | 317| 0.0015561|
|I249 | 298| 0.0014628|
|I250 | 15| 0.0000736|
|I251 | 1000| 0.0049088|
|I253 | 2| 0.0000098|
|I254 | 15| 0.0000736|
|I255 | 955| 0.0046879|
|I256 | 3| 0.0000147|
|I258 | 197| 0.0009670|
|I259 | 550| 0.0026998|
|I260 | 77| 0.0003780|
|I269 | 987| 0.0048450|
|I270 | 48| 0.0002356|
|I272 | 35| 0.0001718|
|I278 | 25| 0.0001227|
|I279 | 56| 0.0002749|
|I280 | 2| 0.0000098|
|I281 | 1| 0.0000049|
|I288 | 2| 0.0000098|
|I301 | 5| 0.0000245|
|I309 | 4| 0.0000196|
|I310 | 1| 0.0000049|
|I311 | 3| 0.0000147|
|I312 | 8| 0.0000393|
|I313 | 22| 0.0001080|
|I318 | 1| 0.0000049|
|I319 | 31| 0.0001522|
|I330 | 67| 0.0003289|
|I339 | 49| 0.0002405|
|I340 | 101| 0.0004958|
|I341 | 12| 0.0000589|
|I342 | 18| 0.0000884|
|I348 | 8| 0.0000393|
|I349 | 29| 0.0001424|
|I350 | 296| 0.0014530|
|I351 | 65| 0.0003191|
|I352 | 16| 0.0000785|
|I358 | 18| 0.0000884|
|I359 | 49| 0.0002405|
|I361 | 4| 0.0000196|
|I369 | 2| 0.0000098|
|I379 | 1| 0.0000049|
|I38 | 129| 0.0006332|
|I400 | 2| 0.0000098|
|I409 | 7| 0.0000344|
|I420 | 807| 0.0039614|
|I421 | 12| 0.0000589|
|I422 | 272| 0.0013352|
|I424 | 1| 0.0000049|
|I425 | 4| 0.0000196|
|I426 | 15| 0.0000736|
|I428 | 57| 0.0002798|
|I429 | 596| 0.0029256|
|I440 | 4| 0.0000196|
|I441 | 10| 0.0000491|
|I442 | 177| 0.0008689|
|I443 | 23| 0.0001129|
|I447 | 6| 0.0000295|
|I451 | 3| 0.0000147|
|I453 | 1| 0.0000049|
|I454 | 2| 0.0000098|
|I458 | 2| 0.0000098|
|I459 | 2| 0.0000098|
|I461 | 272| 0.0013352|
|I470 | 6| 0.0000295|
|I471 | 21| 0.0001031|
|I472 | 32| 0.0001571|
|I479 | 2| 0.0000098|
|I48 | 792| 0.0038877|
|I490 | 96| 0.0004712|
|I492 | 1| 0.0000049|
|I494 | 1| 0.0000049|
|I495 | 6| 0.0000295|
|I498 | 49| 0.0002405|
|I499 | 833| 0.0040890|
|I500 | 2139| 0.0104999|
|I501 | 278| 0.0013646|
|I509 | 2628| 0.0129002|
|I510 | 5| 0.0000245|
|I511 | 3| 0.0000147|
|I513 | 6| 0.0000295|
|I514 | 31| 0.0001522|
|I515 | 25| 0.0001227|
|I516 | 62| 0.0003043|
|I517 | 114| 0.0005596|
|I518 | 17| 0.0000834|
|I519 | 345| 0.0016935|
|I600 | 4| 0.0000196|
|I601 | 9| 0.0000442|
|I602 | 1| 0.0000049|
|I603 | 2| 0.0000098|
|I605 | 1| 0.0000049|
|I606 | 2| 0.0000098|
|I607 | 11| 0.0000540|
|I608 | 13| 0.0000638|
|I609 | 553| 0.0027146|
|I610 | 8| 0.0000393|
|I611 | 8| 0.0000393|
|I612 | 18| 0.0000884|
|I613 | 23| 0.0001129|
|I614 | 23| 0.0001129|
|I615 | 11| 0.0000540|
|I616 | 10| 0.0000491|
|I618 | 146| 0.0007167|
|I619 | 1760| 0.0086394|
|I620 | 179| 0.0008787|
|I621 | 4| 0.0000196|
|I629 | 70| 0.0003436|
|I630 | 13| 0.0000638|
|I631 | 4| 0.0000196|
|I632 | 12| 0.0000589|
|I633 | 21| 0.0001031|
|I634 | 24| 0.0001178|
|I635 | 18| 0.0000884|
|I636 | 3| 0.0000147|
|I638 | 363| 0.0017819|
|I639 | 1996| 0.0097979|
|I64 | 4375| 0.0214759|
|I670 | 6| 0.0000295|
|I671 | 55| 0.0002700|
|I672 | 13| 0.0000638|
|I673 | 1| 0.0000049|
|I674 | 18| 0.0000884|
|I676 | 3| 0.0000147|
|I678 | 1387| 0.0068085|
|I679 | 40| 0.0001964|
|I690 | 41| 0.0002013|
|I691 | 55| 0.0002700|
|I692 | 20| 0.0000982|
|I693 | 654| 0.0032103|
|I694 | 1887| 0.0092628|
|I698 | 183| 0.0008983|
|I700 | 1| 0.0000049|
|I702 | 46| 0.0002258|
|I708 | 8| 0.0000393|
|I709 | 157| 0.0007707|
|I710 | 279| 0.0013695|
|I711 | 114| 0.0005596|
|I712 | 53| 0.0002602|
|I713 | 320| 0.0015708|
|I714 | 144| 0.0007069|
|I715 | 30| 0.0001473|
|I716 | 10| 0.0000491|
|I718 | 155| 0.0007609|
|I719 | 93| 0.0004565|
|I720 | 13| 0.0000638|
|I722 | 4| 0.0000196|
|I723 | 15| 0.0000736|
|I724 | 10| 0.0000491|
|I728 | 14| 0.0000687|
|I729 | 5| 0.0000245|
|I730 | 2| 0.0000098|
|I731 | 4| 0.0000196|
|I738 | 32| 0.0001571|
|I739 | 338| 0.0016592|
|I740 | 14| 0.0000687|
|I741 | 9| 0.0000442|
|I742 | 9| 0.0000442|
|I743 | 114| 0.0005596|
|I744 | 28| 0.0001374|
|I745 | 7| 0.0000344|
|I748 | 13| 0.0000638|
|I749 | 178| 0.0008738|
|I770 | 9| 0.0000442|
|I771 | 48| 0.0002356|
|I772 | 7| 0.0000344|
|I776 | 3| 0.0000147|
|I778 | 4| 0.0000196|
|I779 | 22| 0.0001080|
|I780 | 2| 0.0000098|
|I789 | 1| 0.0000049|
|I800 | 1| 0.0000049|
|I801 | 1| 0.0000049|
|I802 | 212| 0.0010407|
|I803 | 29| 0.0001424|
|I808 | 1| 0.0000049|
|I809 | 3| 0.0000147|
|I81 | 14| 0.0000687|
|I820 | 3| 0.0000147|
|I822 | 1| 0.0000049|
|I823 | 1| 0.0000049|
|I828 | 11| 0.0000540|
|I829 | 46| 0.0002258|
|I830 | 32| 0.0001571|
|I831 | 5| 0.0000245|
|I832 | 24| 0.0001178|
|I839 | 14| 0.0000687|
|I847 | 1| 0.0000049|
|I850 | 69| 0.0003387|
|I859 | 10| 0.0000491|
|I861 | 1| 0.0000049|
|I862 | 1| 0.0000049|
|I864 | 3| 0.0000147|
|I868 | 3| 0.0000147|
|I872 | 47| 0.0002307|
|I878 | 2| 0.0000098|
|I879 | 1| 0.0000049|
|I881 | 1| 0.0000049|
|I890 | 2| 0.0000098|
|I891 | 4| 0.0000196|
|I898 | 2| 0.0000098|
|I899 | 2| 0.0000098|
|I950 | 4| 0.0000196|
|I959 | 12| 0.0000589|
|I99 | 21| 0.0001031|
|J019 | 1| 0.0000049|
|J040 | 1| 0.0000049|
|J041 | 3| 0.0000147|
|J051 | 1| 0.0000049|
|J068 | 1| 0.0000049|
|J069 | 20| 0.0000982|
|J09 | 13| 0.0000638|
|J100 | 13| 0.0000638|
|J101 | 5| 0.0000245|
|J108 | 7| 0.0000344|
|J110 | 56| 0.0002749|
|J111 | 57| 0.0002798|
|J118 | 29| 0.0001424|
|J120 | 2| 0.0000098|
|J128 | 31| 0.0001522|
|J129 | 357| 0.0017524|
|J13 | 6| 0.0000295|
|J150 | 19| 0.0000933|
|J151 | 9| 0.0000442|
|J152 | 8| 0.0000393|
|J154 | 3| 0.0000147|
|J156 | 15| 0.0000736|
|J157 | 2| 0.0000098|
|J158 | 315| 0.0015463|
|J159 | 2304| 0.0113098|
|J160 | 2| 0.0000098|
|J168 | 5| 0.0000245|
|J180 | 2597| 0.0127481|
|J181 | 144| 0.0007069|
|J182 | 8| 0.0000393|
|J188 | 76| 0.0003731|
|J189 | 5065| 0.0248629|
|J210 | 3| 0.0000147|
|J219 | 9| 0.0000442|
|J22 | 39| 0.0001914|
|J329 | 2| 0.0000098|
|J348 | 2| 0.0000098|
|J350 | 2| 0.0000098|
|J352 | 1| 0.0000049|
|J36 | 3| 0.0000147|
|J384 | 1| 0.0000049|
|J386 | 2| 0.0000098|
|J387 | 1| 0.0000049|
|J392 | 1| 0.0000049|
|J398 | 2| 0.0000098|
|J399 | 2| 0.0000098|
|J40 | 30| 0.0001473|
|J410 | 2| 0.0000098|
|J411 | 1| 0.0000049|
|J418 | 1| 0.0000049|
|J42 | 29| 0.0001424|
|J430 | 1| 0.0000049|
|J431 | 7| 0.0000344|
|J432 | 3| 0.0000147|
|J438 | 26| 0.0001276|
|J439 | 558| 0.0027391|
|J440 | 2368| 0.0116240|
|J441 | 526| 0.0025820|
|J448 | 149| 0.0007314|
|J449 | 2215| 0.0108729|
|J450 | 4| 0.0000196|
|J451 | 1| 0.0000049|
|J458 | 3| 0.0000147|
|J459 | 233| 0.0011437|
|J46 | 13| 0.0000638|
|J47 | 18| 0.0000884|
|J60 | 2| 0.0000098|
|J61 | 2| 0.0000098|
|J628 | 13| 0.0000638|
|J638 | 1| 0.0000049|
|J64 | 17| 0.0000834|
|J660 | 1| 0.0000049|
|J672 | 1| 0.0000049|
|J678 | 3| 0.0000147|
|J679 | 11| 0.0000540|
|J680 | 5| 0.0000245|
|J681 | 9| 0.0000442|
|J684 | 1| 0.0000049|
|J689 | 2| 0.0000098|
|J690 | 1081| 0.0053064|
|J691 | 1| 0.0000049|
|J698 | 27| 0.0001325|
|J702 | 1| 0.0000049|
|J708 | 6| 0.0000295|
|J80 | 215| 0.0010554|
|J81 | 204| 0.0010014|
|J82 | 1| 0.0000049|
|J840 | 3| 0.0000147|
|J841 | 411| 0.0020175|
|J848 | 9| 0.0000442|
|J849 | 134| 0.0006578|
|J850 | 1| 0.0000049|
|J851 | 18| 0.0000884|
|J852 | 17| 0.0000834|
|J853 | 2| 0.0000098|
|J860 | 3| 0.0000147|
|J869 | 44| 0.0002160|
|J90 | 196| 0.0009621|
|J930 | 3| 0.0000147|
|J931 | 8| 0.0000393|
|J938 | 6| 0.0000295|
|J939 | 20| 0.0000982|
|J942 | 5| 0.0000245|
|J948 | 2| 0.0000098|
|J949 | 3| 0.0000147|
|J960 | 390| 0.0019144|
|J961 | 21| 0.0001031|
|J969 | 416| 0.0020420|
|J980 | 31| 0.0001522|
|J981 | 10| 0.0000491|
|J982 | 6| 0.0000295|
|J984 | 232| 0.0011388|
|J985 | 19| 0.0000933|
|J988 | 5749| 0.0282205|
|J989 | 75| 0.0003682|
|K120 | 1| 0.0000049|
|K137 | 1| 0.0000049|
|K20 | 9| 0.0000442|
|K210 | 3| 0.0000147|
|K219 | 19| 0.0000933|
|K220 | 7| 0.0000344|
|K221 | 9| 0.0000442|
|K222 | 6| 0.0000295|
|K223 | 3| 0.0000147|
|K224 | 1| 0.0000049|
|K225 | 6| 0.0000295|
|K226 | 4| 0.0000196|
|K227 | 1| 0.0000049|
|K228 | 8| 0.0000393|
|K229 | 11| 0.0000540|
|K250 | 22| 0.0001080|
|K251 | 42| 0.0002062|
|K252 | 16| 0.0000785|
|K253 | 1| 0.0000049|
|K254 | 97| 0.0004762|
|K255 | 83| 0.0004074|
|K256 | 25| 0.0001227|
|K257 | 1| 0.0000049|
|K259 | 48| 0.0002356|
|K260 | 9| 0.0000442|
|K261 | 13| 0.0000638|
|K262 | 2| 0.0000098|
|K264 | 65| 0.0003191|
|K265 | 37| 0.0001816|
|K266 | 10| 0.0000491|
|K267 | 1| 0.0000049|
|K269 | 29| 0.0001424|
|K270 | 3| 0.0000147|
|K271 | 5| 0.0000245|
|K272 | 4| 0.0000196|
|K274 | 31| 0.0001522|
|K275 | 15| 0.0000736|
|K276 | 4| 0.0000196|
|K279 | 11| 0.0000540|
|K280 | 2| 0.0000098|
|K281 | 2| 0.0000098|
|K282 | 1| 0.0000049|
|K284 | 1| 0.0000049|
|K290 | 22| 0.0001080|
|K291 | 1| 0.0000049|
|K292 | 2| 0.0000098|
|K294 | 1| 0.0000049|
|K295 | 6| 0.0000295|
|K296 | 4| 0.0000196|
|K297 | 11| 0.0000540|
|K298 | 1| 0.0000049|
|K299 | 4| 0.0000196|
|K30 | 7| 0.0000344|
|K311 | 5| 0.0000245|
|K312 | 1| 0.0000049|
|K315 | 3| 0.0000147|
|K316 | 3| 0.0000147|
|K318 | 3| 0.0000147|
|K319 | 5| 0.0000245|
|K350 | 33| 0.0001620|
|K351 | 4| 0.0000196|
|K359 | 54| 0.0002651|
|K37 | 9| 0.0000442|
|K389 | 1| 0.0000049|
|K400 | 2| 0.0000098|
|K401 | 3| 0.0000147|
|K402 | 2| 0.0000098|
|K403 | 62| 0.0003043|
|K404 | 22| 0.0001080|
|K409 | 25| 0.0001227|
|K413 | 7| 0.0000344|
|K414 | 4| 0.0000196|
|K419 | 8| 0.0000393|
|K420 | 21| 0.0001031|
|K421 | 10| 0.0000491|
|K429 | 11| 0.0000540|
|K430 | 7| 0.0000344|
|K431 | 9| 0.0000442|
|K439 | 12| 0.0000589|
|K440 | 5| 0.0000245|
|K441 | 1| 0.0000049|
|K449 | 34| 0.0001669|
|K450 | 4| 0.0000196|
|K451 | 2| 0.0000098|
|K458 | 2| 0.0000098|
|K460 | 53| 0.0002602|
|K461 | 24| 0.0001178|
|K469 | 43| 0.0002111|
|K500 | 2| 0.0000098|
|K509 | 29| 0.0001424|
|K510 | 2| 0.0000098|
|K513 | 11| 0.0000540|
|K518 | 2| 0.0000098|
|K519 | 19| 0.0000933|
|K521 | 5| 0.0000245|
|K528 | 3| 0.0000147|
|K529 | 56| 0.0002749|
|K550 | 446| 0.0021893|
|K551 | 9| 0.0000442|
|K552 | 4| 0.0000196|
|K558 | 11| 0.0000540|
|K559 | 62| 0.0003043|
|K560 | 40| 0.0001964|
|K561 | 2| 0.0000098|
|K562 | 75| 0.0003682|
|K563 | 4| 0.0000196|
|K564 | 45| 0.0002209|
|K565 | 43| 0.0002111|
|K566 | 506| 0.0024838|
|K567 | 20| 0.0000982|
|K570 | 15| 0.0000736|
|K571 | 4| 0.0000196|
|K572 | 72| 0.0003534|
|K573 | 43| 0.0002111|
|K574 | 5| 0.0000245|
|K575 | 1| 0.0000049|
|K578 | 95| 0.0004663|
|K579 | 203| 0.0009965|
|K580 | 2| 0.0000098|
|K590 | 24| 0.0001178|
|K591 | 3| 0.0000147|
|K593 | 27| 0.0001325|
|K598 | 1| 0.0000049|
|K599 | 8| 0.0000393|
|K602 | 3| 0.0000147|
|K603 | 1| 0.0000049|
|K604 | 1| 0.0000049|
|K605 | 1| 0.0000049|
|K610 | 8| 0.0000393|
|K612 | 2| 0.0000098|
|K623 | 3| 0.0000147|
|K625 | 1| 0.0000049|
|K626 | 1| 0.0000049|
|K627 | 2| 0.0000098|
|K628 | 1| 0.0000049|
|K629 | 6| 0.0000295|
|K630 | 6| 0.0000295|
|K631 | 133| 0.0006529|
|K632 | 17| 0.0000834|
|K633 | 1| 0.0000049|
|K635 | 2| 0.0000098|
|K638 | 8| 0.0000393|
|K639 | 24| 0.0001178|
|K650 | 69| 0.0003387|
|K658 | 13| 0.0000638|
|K659 | 107| 0.0005252|
|K660 | 13| 0.0000638|
|K661 | 9| 0.0000442|
|K668 | 6| 0.0000295|
|K669 | 4| 0.0000196|
|K700 | 6| 0.0000295|
|K701 | 27| 0.0001325|
|K702 | 5| 0.0000245|
|K703 | 494| 0.0024249|
|K704 | 69| 0.0003387|
|K709 | 79| 0.0003878|
|K710 | 5| 0.0000245|
|K711 | 3| 0.0000147|
|K712 | 1| 0.0000049|
|K716 | 4| 0.0000196|
|K717 | 1| 0.0000049|
|K718 | 1| 0.0000049|
|K719 | 3| 0.0000147|
|K720 | 31| 0.0001522|
|K721 | 42| 0.0002062|
|K729 | 188| 0.0009228|
|K730 | 1| 0.0000049|
|K738 | 1| 0.0000049|
|K739 | 10| 0.0000491|
|K740 | 8| 0.0000393|
|K741 | 1| 0.0000049|
|K742 | 3| 0.0000147|
|K743 | 11| 0.0000540|
|K744 | 4| 0.0000196|
|K745 | 16| 0.0000785|
|K746 | 1212| 0.0059494|
|K750 | 48| 0.0002356|
|K753 | 1| 0.0000049|
|K754 | 8| 0.0000393|
|K759 | 8| 0.0000393|
|K760 | 23| 0.0001129|
|K761 | 1| 0.0000049|
|K763 | 3| 0.0000147|
|K766 | 23| 0.0001129|
|K767 | 77| 0.0003780|
|K768 | 11| 0.0000540|
|K769 | 170| 0.0008345|
|K800 | 47| 0.0002307|
|K801 | 26| 0.0001276|
|K802 | 60| 0.0002945|
|K803 | 60| 0.0002945|
|K804 | 21| 0.0001031|
|K805 | 34| 0.0001669|
|K808 | 16| 0.0000785|
|K810 | 192| 0.0009425|
|K811 | 3| 0.0000147|
|K818 | 5| 0.0000245|
|K819 | 79| 0.0003878|
|K820 | 8| 0.0000393|
|K822 | 1| 0.0000049|
|K823 | 3| 0.0000147|
|K829 | 33| 0.0001620|
|K830 | 207| 0.0010161|
|K831 | 56| 0.0002749|
|K832 | 1| 0.0000049|
|K833 | 4| 0.0000196|
|K838 | 5| 0.0000245|
|K839 | 16| 0.0000785|
|K850 | 40| 0.0001964|
|K851 | 59| 0.0002896|
|K852 | 18| 0.0000884|
|K853 | 1| 0.0000049|
|K858 | 30| 0.0001473|
|K859 | 309| 0.0015168|
|K860 | 3| 0.0000147|
|K861 | 16| 0.0000785|
|K863 | 2| 0.0000098|
|K868 | 6| 0.0000295|
|K869 | 5| 0.0000245|
|K900 | 2| 0.0000098|
|K909 | 2| 0.0000098|
|K920 | 427| 0.0020960|
|K921 | 31| 0.0001522|
|K922 | 583| 0.0028618|
|K928 | 11| 0.0000540|
|K929 | 29| 0.0001424|
|L010 | 1| 0.0000049|
|L011 | 2| 0.0000098|
|L021 | 8| 0.0000393|
|L022 | 10| 0.0000491|
|L023 | 1| 0.0000049|
|L024 | 10| 0.0000491|
|L028 | 5| 0.0000245|
|L029 | 20| 0.0000982|
|L030 | 9| 0.0000442|
|L031 | 53| 0.0002602|
|L032 | 2| 0.0000098|
|L033 | 10| 0.0000491|
|L038 | 11| 0.0000540|
|L039 | 77| 0.0003780|
|L080 | 3| 0.0000147|
|L089 | 397| 0.0019488|
|L100 | 1| 0.0000049|
|L102 | 3| 0.0000147|
|L108 | 3| 0.0000147|
|L109 | 4| 0.0000196|
|L120 | 10| 0.0000491|
|L138 | 1| 0.0000049|
|L139 | 2| 0.0000098|
|L26 | 1| 0.0000049|
|L309 | 1| 0.0000049|
|L409 | 4| 0.0000196|
|L511 | 6| 0.0000295|
|L512 | 7| 0.0000344|
|L518 | 1| 0.0000049|
|L530 | 1| 0.0000049|
|L539 | 3| 0.0000147|
|L89 | 295| 0.0014481|
|L930 | 2| 0.0000098|
|L932 | 1| 0.0000049|
|L958 | 1| 0.0000049|
|L959 | 2| 0.0000098|
|L97 | 37| 0.0001816|
|L984 | 61| 0.0002994|
|L988 | 1| 0.0000049|
|L989 | 27| 0.0001325|
|M000 | 2| 0.0000098|
|M009 | 28| 0.0001374|
|M051 | 1| 0.0000049|
|M052 | 1| 0.0000049|
|M053 | 1| 0.0000049|
|M061 | 1| 0.0000049|
|M068 | 2| 0.0000098|
|M069 | 76| 0.0003731|
|M080 | 1| 0.0000049|
|M100 | 4| 0.0000196|
|M109 | 2| 0.0000098|
|M139 | 5| 0.0000245|
|M160 | 1| 0.0000049|
|M169 | 25| 0.0001227|
|M170 | 1| 0.0000049|
|M171 | 1| 0.0000049|
|M179 | 5| 0.0000245|
|M198 | 3| 0.0000147|
|M199 | 14| 0.0000687|
|M244 | 1| 0.0000049|
|M258 | 4| 0.0000196|
|M259 | 7| 0.0000344|
|M301 | 1| 0.0000049|
|M310 | 1| 0.0000049|
|M311 | 2| 0.0000098|
|M313 | 3| 0.0000147|
|M314 | 1| 0.0000049|
|M315 | 2| 0.0000098|
|M316 | 1| 0.0000049|
|M318 | 5| 0.0000245|
|M319 | 12| 0.0000589|
|M320 | 1| 0.0000049|
|M321 | 32| 0.0001571|
|M329 | 9| 0.0000442|
|M332 | 4| 0.0000196|
|M339 | 1| 0.0000049|
|M340 | 3| 0.0000147|
|M341 | 1| 0.0000049|
|M348 | 11| 0.0000540|
|M349 | 9| 0.0000442|
|M350 | 2| 0.0000098|
|M359 | 4| 0.0000196|
|M402 | 1| 0.0000049|
|M430 | 1| 0.0000049|
|M431 | 1| 0.0000049|
|M45 | 2| 0.0000098|
|M462 | 3| 0.0000147|
|M463 | 1| 0.0000049|
|M464 | 11| 0.0000540|
|M465 | 1| 0.0000049|
|M468 | 4| 0.0000196|
|M469 | 10| 0.0000491|
|M470 | 2| 0.0000098|
|M471 | 1| 0.0000049|
|M472 | 1| 0.0000049|
|M478 | 2| 0.0000098|
|M479 | 4| 0.0000196|
|M480 | 1| 0.0000049|
|M489 | 6| 0.0000295|
|M500 | 1| 0.0000049|
|M501 | 1| 0.0000049|
|M509 | 1| 0.0000049|
|M512 | 2| 0.0000098|
|M519 | 1| 0.0000049|
|M600 | 8| 0.0000393|
|M608 | 3| 0.0000147|
|M609 | 1| 0.0000049|
|M620 | 1| 0.0000049|
|M621 | 1| 0.0000049|
|M622 | 4| 0.0000196|
|M623 | 119| 0.0005841|
|M625 | 42| 0.0002062|
|M628 | 4| 0.0000196|
|M629 | 15| 0.0000736|
|M726 | 20| 0.0000982|
|M729 | 3| 0.0000147|
|M791 | 1| 0.0000049|
|M800 | 1| 0.0000049|
|M802 | 1| 0.0000049|
|M803 | 1| 0.0000049|
|M805 | 2| 0.0000098|
|M808 | 2| 0.0000098|
|M809 | 56| 0.0002749|
|M810 | 2| 0.0000098|
|M813 | 1| 0.0000049|
|M818 | 3| 0.0000147|
|M819 | 9| 0.0000442|
|M841 | 2| 0.0000098|
|M844 | 76| 0.0003731|
|M858 | 1| 0.0000049|
|M859 | 2| 0.0000098|
|M860 | 4| 0.0000196|
|M861 | 3| 0.0000147|
|M862 | 1| 0.0000049|
|M865 | 1| 0.0000049|
|M866 | 6| 0.0000295|
|M868 | 5| 0.0000245|
|M869 | 79| 0.0003878|
|M870 | 2| 0.0000098|
|M879 | 4| 0.0000196|
|M889 | 1| 0.0000049|
|M899 | 1| 0.0000049|
|M940 | 1| 0.0000049|
|N009 | 13| 0.0000638|
|N029 | 3| 0.0000147|
|N038 | 4| 0.0000196|
|N039 | 293| 0.0014383|
|N049 | 6| 0.0000295|
|N059 | 6| 0.0000295|
|N078 | 1| 0.0000049|
|N079 | 1| 0.0000049|
|N10 | 78| 0.0003829|
|N110 | 24| 0.0001178|
|N111 | 27| 0.0001325|
|N118 | 8| 0.0000393|
|N119 | 28| 0.0001374|
|N12 | 273| 0.0013401|
|N132 | 1| 0.0000049|
|N133 | 9| 0.0000442|
|N135 | 3| 0.0000147|
|N136 | 3| 0.0000147|
|N138 | 1| 0.0000049|
|N139 | 2| 0.0000098|
|N141 | 1| 0.0000049|
|N142 | 1| 0.0000049|
|N151 | 12| 0.0000589|
|N159 | 3| 0.0000147|
|N170 | 6| 0.0000295|
|N178 | 12| 0.0000589|
|N179 | 682| 0.0033478|
|N180 | 121| 0.0005940|
|N188 | 39| 0.0001914|
|N189 | 955| 0.0046879|
|N19 | 337| 0.0016543|
|N200 | 39| 0.0001914|
|N201 | 14| 0.0000687|
|N202 | 4| 0.0000196|
|N209 | 13| 0.0000638|
|N211 | 3| 0.0000147|
|N219 | 1| 0.0000049|
|N23 | 1| 0.0000049|
|N259 | 1| 0.0000049|
|N26 | 1| 0.0000049|
|N280 | 1| 0.0000049|
|N281 | 5| 0.0000245|
|N288 | 4| 0.0000196|
|N289 | 101| 0.0004958|
|N300 | 24| 0.0001178|
|N301 | 2| 0.0000098|
|N302 | 2| 0.0000098|
|N308 | 1| 0.0000049|
|N309 | 60| 0.0002945|
|N310 | 1| 0.0000049|
|N318 | 2| 0.0000098|
|N319 | 17| 0.0000834|
|N321 | 7| 0.0000344|
|N322 | 4| 0.0000196|
|N323 | 1| 0.0000049|
|N324 | 3| 0.0000147|
|N328 | 2| 0.0000098|
|N329 | 5| 0.0000245|
|N340 | 4| 0.0000196|
|N341 | 2| 0.0000098|
|N342 | 2| 0.0000098|
|N358 | 2| 0.0000098|
|N359 | 8| 0.0000393|
|N360 | 1| 0.0000049|
|N368 | 1| 0.0000049|
|N369 | 1| 0.0000049|
|N390 | 4853| 0.0238223|
|N391 | 1| 0.0000049|
|N392 | 2| 0.0000098|
|N398 | 16| 0.0000785|
|N399 | 84| 0.0004123|
|N40 | 184| 0.0009032|
|N410 | 2| 0.0000098|
|N411 | 2| 0.0000098|
|N412 | 2| 0.0000098|
|N418 | 2| 0.0000098|
|N419 | 5| 0.0000245|
|N428 | 2| 0.0000098|
|N429 | 6| 0.0000295|
|N450 | 2| 0.0000098|
|N459 | 1| 0.0000049|
|N481 | 1| 0.0000049|
|N485 | 1| 0.0000049|
|N489 | 1| 0.0000049|
|N492 | 4| 0.0000196|
|N498 | 42| 0.0002062|
|N499 | 4| 0.0000196|
|N508 | 1| 0.0000049|
|N61 | 1| 0.0000049|
|N63 | 1| 0.0000049|
|N649 | 1| 0.0000049|
|N719 | 2| 0.0000098|
|N735 | 1| 0.0000049|
|N736 | 1| 0.0000049|
|N738 | 2| 0.0000098|
|N739 | 2| 0.0000098|
|N751 | 1| 0.0000049|
|N760 | 1| 0.0000049|
|N764 | 1| 0.0000049|
|N768 | 7| 0.0000344|
|N809 | 1| 0.0000049|
|N811 | 1| 0.0000049|
|N814 | 2| 0.0000098|
|N819 | 3| 0.0000147|
|N820 | 1| 0.0000049|
|N821 | 1| 0.0000049|
|N823 | 6| 0.0000295|
|N824 | 1| 0.0000049|
|N832 | 3| 0.0000147|
|N921 | 2| 0.0000098|
|N949 | 1| 0.0000049|
|P230 | 1| 0.0000049|
|Q039 | 2| 0.0000098|
|Q068 | 2| 0.0000098|
|Q070 | 1| 0.0000049|
|Q210 | 2| 0.0000098|
|Q211 | 4| 0.0000196|
|Q213 | 2| 0.0000098|
|Q218 | 1| 0.0000049|
|Q230 | 1| 0.0000049|
|Q245 | 3| 0.0000147|
|Q248 | 1| 0.0000049|
|Q249 | 7| 0.0000344|
|Q253 | 2| 0.0000098|
|Q273 | 3| 0.0000147|
|Q282 | 1| 0.0000049|
|Q401 | 1| 0.0000049|
|Q438 | 2| 0.0000098|
|Q440 | 1| 0.0000049|
|Q442 | 1| 0.0000049|
|Q446 | 2| 0.0000098|
|Q600 | 1| 0.0000049|
|Q602 | 1| 0.0000049|
|Q612 | 1| 0.0000049|
|Q613 | 3| 0.0000147|
|Q618 | 2| 0.0000098|
|Q619 | 1| 0.0000049|
|Q638 | 3| 0.0000147|
|Q639 | 1| 0.0000049|
|Q789 | 1| 0.0000049|
|Q850 | 4| 0.0000196|
|Q851 | 1| 0.0000049|
|Q870 | 1| 0.0000049|
|Q874 | 1| 0.0000049|
|Q909 | 17| 0.0000834|
|Q917 | 1| 0.0000049|
|R000 | 2| 0.0000098|
|R001 | 5| 0.0000245|
|R008 | 3| 0.0000147|
|R02 | 2| 0.0000098|
|R042 | 3| 0.0000147|
|R048 | 3| 0.0000147|
|R060 | 4| 0.0000196|
|R072 | 4| 0.0000196|
|R073 | 1| 0.0000049|
|R074 | 4| 0.0000196|
|R090 | 2| 0.0000098|
|R092 | 477| 0.0023415|
|R100 | 83| 0.0004074|
|R104 | 5| 0.0000245|
|R11 | 1| 0.0000049|
|R13 | 1| 0.0000049|
|R161 | 1| 0.0000049|
|R17 | 4| 0.0000196|
|R18 | 1| 0.0000049|
|R190 | 8| 0.0000393|
|R220 | 1| 0.0000049|
|R221 | 3| 0.0000147|
|R229 | 1| 0.0000049|
|R392 | 1| 0.0000049|
|R402 | 3| 0.0000147|
|R509 | 3| 0.0000147|
|R529 | 1| 0.0000049|
|R53 | 2| 0.0000098|
|R54 | 701| 0.0034410|
|R55 | 4| 0.0000196|
|R568 | 8| 0.0000393|
|R570 | 204| 0.0010014|
|R571 | 21| 0.0001031|
|R578 | 24| 0.0001178|
|R579 | 41| 0.0002013|
|R58 | 2| 0.0000098|
|R609 | 2| 0.0000098|
|R630 | 2| 0.0000098|
|R638 | 1| 0.0000049|
|R64 | 63| 0.0003093|
|R680 | 1| 0.0000049|
|R688 | 112| 0.0005498|
|R72 | 1| 0.0000049|
|R739 | 1| 0.0000049|
|R859 | 1| 0.0000049|
|R900 | 1| 0.0000049|
|R92 | 1| 0.0000049|
|R960 | 678| 0.0033281|
|R961 | 87| 0.0004271|
|R98 | 1921| 0.0094297|
|R99 | 4609| 0.0226245|
|V011 | 1| 0.0000049|
|V021 | 61| 0.0002994|
|V029 | 6| 0.0000295|
|V030 | 5| 0.0000245|
|V031 | 40| 0.0001964|
|V039 | 1| 0.0000049|
|V041 | 39| 0.0001914|
|V049 | 4| 0.0000196|
|V051 | 1| 0.0000049|
|V059 | 2| 0.0000098|
|V090 | 4| 0.0000196|
|V092 | 4| 0.0000196|
|V093 | 126| 0.0006185|
|V099 | 21| 0.0001031|
|V120 | 1| 0.0000049|
|V124 | 6| 0.0000295|
|V129 | 1| 0.0000049|
|V134 | 14| 0.0000687|
|V135 | 1| 0.0000049|
|V139 | 7| 0.0000344|
|V144 | 5| 0.0000245|
|V149 | 1| 0.0000049|
|V182 | 1| 0.0000049|
|V184 | 5| 0.0000245|
|V185 | 1| 0.0000049|
|V189 | 6| 0.0000295|
|V193 | 1| 0.0000049|
|V194 | 3| 0.0000147|
|V196 | 3| 0.0000147|
|V198 | 1| 0.0000049|
|V199 | 10| 0.0000491|
|V204 | 1| 0.0000049|
|V224 | 1| 0.0000049|
|V229 | 1| 0.0000049|
|V234 | 6| 0.0000295|
|V235 | 2| 0.0000098|
|V239 | 4| 0.0000196|
|V244 | 8| 0.0000393|
|V245 | 1| 0.0000049|
|V249 | 1| 0.0000049|
|V264 | 1| 0.0000049|
|V274 | 4| 0.0000196|
|V279 | 1| 0.0000049|
|V280 | 1| 0.0000049|
|V284 | 5| 0.0000245|
|V285 | 1| 0.0000049|
|V289 | 2| 0.0000098|
|V294 | 1| 0.0000049|
|V296 | 1| 0.0000049|
|V299 | 12| 0.0000589|
|V301 | 39| 0.0001914|
|V335 | 1| 0.0000049|
|V425 | 1| 0.0000049|
|V433 | 1| 0.0000049|
|V435 | 17| 0.0000834|
|V436 | 6| 0.0000295|
|V439 | 7| 0.0000344|
|V444 | 1| 0.0000049|
|V445 | 9| 0.0000442|
|V446 | 5| 0.0000245|
|V449 | 4| 0.0000196|
|V455 | 1| 0.0000049|
|V456 | 1| 0.0000049|
|V470 | 2| 0.0000098|
|V474 | 1| 0.0000049|
|V475 | 15| 0.0000736|
|V476 | 4| 0.0000196|
|V479 | 2| 0.0000098|
|V480 | 1| 0.0000049|
|V485 | 6| 0.0000295|
|V486 | 1| 0.0000049|
|V489 | 1| 0.0000049|
|V491 | 2| 0.0000098|
|V493 | 1| 0.0000049|
|V494 | 4| 0.0000196|
|V495 | 4| 0.0000196|
|V496 | 3| 0.0000147|
|V498 | 2| 0.0000098|
|V499 | 47| 0.0002307|
|V545 | 2| 0.0000098|
|V594 | 1| 0.0000049|
|V645 | 2| 0.0000098|
|V649 | 2| 0.0000098|
|V675 | 3| 0.0000147|
|V680 | 1| 0.0000049|
|V685 | 5| 0.0000245|
|V693 | 2| 0.0000098|
|V694 | 3| 0.0000147|
|V698 | 1| 0.0000049|
|V699 | 6| 0.0000295|
|V736 | 1| 0.0000049|
|V781 | 1| 0.0000049|
|V800 | 2| 0.0000098|
|V809 | 2| 0.0000098|
|V840 | 1| 0.0000049|
|V841 | 1| 0.0000049|
|V872 | 1| 0.0000049|
|V875 | 1| 0.0000049|
|V877 | 2| 0.0000098|
|V878 | 1| 0.0000049|
|V879 | 1| 0.0000049|
|V880 | 1| 0.0000049|
|V892 | 62| 0.0003043|
|V899 | 18| 0.0000884|
|V918 | 1| 0.0000049|
|V99 | 5| 0.0000245|
|W010 | 164| 0.0008050|
|W011 | 10| 0.0000491|
|W012 | 2| 0.0000098|
|W013 | 1| 0.0000049|
|W014 | 6| 0.0000295|
|W015 | 2| 0.0000098|
|W017 | 1| 0.0000049|
|W018 | 2| 0.0000098|
|W019 | 100| 0.0004909|
|W059 | 2| 0.0000098|
|W060 | 24| 0.0001178|
|W061 | 2| 0.0000098|
|W062 | 3| 0.0000147|
|W069 | 10| 0.0000491|
|W070 | 7| 0.0000344|
|W071 | 1| 0.0000049|
|W072 | 1| 0.0000049|
|W079 | 4| 0.0000196|
|W080 | 4| 0.0000196|
|W082 | 2| 0.0000098|
|W089 | 2| 0.0000098|
|W100 | 41| 0.0002013|
|W101 | 2| 0.0000098|
|W103 | 1| 0.0000049|
|W104 | 1| 0.0000049|
|W105 | 1| 0.0000049|
|W109 | 26| 0.0001276|
|W110 | 3| 0.0000147|
|W119 | 2| 0.0000098|
|W120 | 6| 0.0000295|
|W125 | 1| 0.0000049|
|W126 | 1| 0.0000049|
|W129 | 11| 0.0000540|
|W130 | 38| 0.0001865|
|W134 | 1| 0.0000049|
|W135 | 3| 0.0000147|
|W137 | 1| 0.0000049|
|W138 | 1| 0.0000049|
|W139 | 29| 0.0001424|
|W140 | 1| 0.0000049|
|W149 | 8| 0.0000393|
|W169 | 1| 0.0000049|
|W170 | 20| 0.0000982|
|W171 | 1| 0.0000049|
|W172 | 1| 0.0000049|
|W175 | 2| 0.0000098|
|W176 | 1| 0.0000049|
|W178 | 3| 0.0000147|
|W179 | 30| 0.0001473|
|W180 | 421| 0.0020666|
|W181 | 9| 0.0000442|
|W182 | 5| 0.0000245|
|W184 | 29| 0.0001424|
|W185 | 5| 0.0000245|
|W187 | 1| 0.0000049|
|W188 | 6| 0.0000295|
|W189 | 543| 0.0026655|
|W190 | 143| 0.0007020|
|W191 | 2| 0.0000098|
|W192 | 1| 0.0000049|
|W194 | 11| 0.0000540|
|W195 | 2| 0.0000098|
|W198 | 2| 0.0000098|
|W199 | 332| 0.0016297|
|W200 | 3| 0.0000147|
|W209 | 2| 0.0000098|
|W225 | 1| 0.0000049|
|W229 | 1| 0.0000049|
|W230 | 2| 0.0000098|
|W246 | 1| 0.0000049|
|W307 | 1| 0.0000049|
|W308 | 2| 0.0000098|
|W309 | 1| 0.0000049|
|W311 | 1| 0.0000049|
|W319 | 1| 0.0000049|
|W349 | 1| 0.0000049|
|W360 | 2| 0.0000098|
|W370 | 1| 0.0000049|
|W400 | 1| 0.0000049|
|W409 | 2| 0.0000098|
|W499 | 2| 0.0000098|
|W509 | 1| 0.0000049|
|W540 | 1| 0.0000049|
|W557 | 2| 0.0000098|
|W558 | 1| 0.0000049|
|W559 | 1| 0.0000049|
|W570 | 1| 0.0000049|
|W647 | 1| 0.0000049|
|W670 | 6| 0.0000295|
|W672 | 1| 0.0000049|
|W690 | 3| 0.0000147|
|W697 | 2| 0.0000098|
|W698 | 19| 0.0000933|
|W700 | 1| 0.0000049|
|W707 | 1| 0.0000049|
|W708 | 2| 0.0000098|
|W740 | 3| 0.0000147|
|W744 | 3| 0.0000147|
|W748 | 11| 0.0000540|
|W749 | 12| 0.0000589|
|W780 | 42| 0.0002062|
|W781 | 4| 0.0000196|
|W782 | 1| 0.0000049|
|W784 | 1| 0.0000049|
|W788 | 5| 0.0000245|
|W789 | 111| 0.0005449|
|W790 | 27| 0.0001325|
|W791 | 3| 0.0000147|
|W795 | 1| 0.0000049|
|W799 | 22| 0.0001080|
|W800 | 6| 0.0000295|
|W808 | 1| 0.0000049|
|W809 | 19| 0.0000933|
|W810 | 1| 0.0000049|
|W840 | 8| 0.0000393|
|W842 | 4| 0.0000196|
|W849 | 192| 0.0009425|
|W854 | 1| 0.0000049|
|W860 | 1| 0.0000049|
|W870 | 2| 0.0000098|
|W874 | 1| 0.0000049|
|W878 | 2| 0.0000098|
|W879 | 4| 0.0000196|
|W894 | 1| 0.0000049|
|W939 | 2| 0.0000098|
|W999 | 1| 0.0000049|
|X000 | 2| 0.0000098|
|X001 | 4| 0.0000196|
|X018 | 1| 0.0000049|
|X020 | 1| 0.0000049|
|X040 | 1| 0.0000049|
|X048 | 1| 0.0000049|
|X080 | 3| 0.0000147|
|X081 | 1| 0.0000049|
|X089 | 1| 0.0000049|
|X090 | 13| 0.0000638|
|X091 | 1| 0.0000049|
|X094 | 1| 0.0000049|
|X099 | 22| 0.0001080|
|X120 | 1| 0.0000049|
|X199 | 1| 0.0000049|
|X204 | 1| 0.0000049|
|X208 | 2| 0.0000098|
|X209 | 2| 0.0000098|
|X210 | 1| 0.0000049|
|X217 | 1| 0.0000049|
|X220 | 1| 0.0000049|
|X230 | 1| 0.0000049|
|X237 | 2| 0.0000098|
|X238 | 1| 0.0000049|
|X239 | 3| 0.0000147|
|X314 | 1| 0.0000049|
|X319 | 1| 0.0000049|
|X328 | 1| 0.0000049|
|X360 | 3| 0.0000147|
|X361 | 1| 0.0000049|
|X364 | 1| 0.0000049|
|X369 | 1| 0.0000049|
|X374 | 2| 0.0000098|
|X419 | 2| 0.0000098|
|X429 | 1| 0.0000049|
|X440 | 2| 0.0000098|
|X449 | 7| 0.0000344|
|X460 | 1| 0.0000049|
|X479 | 1| 0.0000049|
|X490 | 1| 0.0000049|
|X494 | 1| 0.0000049|
|X497 | 1| 0.0000049|
|X499 | 2| 0.0000098|
|X501 | 1| 0.0000049|
|X528 | 2| 0.0000098|
|X580 | 1| 0.0000049|
|X588 | 1| 0.0000049|
|X589 | 2| 0.0000098|
|X590 | 203| 0.0009965|
|X594 | 2| 0.0000098|
|X598 | 1| 0.0000049|
|X599 | 134| 0.0006578|
|X610 | 3| 0.0000147|
|X619 | 1| 0.0000049|
|X620 | 1| 0.0000049|
|X629 | 1| 0.0000049|
|X640 | 8| 0.0000393|
|X647 | 1| 0.0000049|
|X649 | 5| 0.0000245|
|X659 | 2| 0.0000098|
|X670 | 1| 0.0000049|
|X680 | 6| 0.0000295|
|X689 | 6| 0.0000295|
|X690 | 3| 0.0000147|
|X699 | 3| 0.0000147|
|X700 | 138| 0.0006774|
|X701 | 1| 0.0000049|
|X702 | 1| 0.0000049|
|X703 | 2| 0.0000098|
|X704 | 9| 0.0000442|
|X705 | 2| 0.0000098|
|X706 | 1| 0.0000049|
|X707 | 2| 0.0000098|
|X708 | 3| 0.0000147|
|X709 | 30| 0.0001473|
|X710 | 1| 0.0000049|
|X718 | 1| 0.0000049|
|X720 | 7| 0.0000344|
|X723 | 1| 0.0000049|
|X728 | 1| 0.0000049|
|X729 | 2| 0.0000098|
|X730 | 1| 0.0000049|
|X740 | 17| 0.0000834|
|X746 | 1| 0.0000049|
|X748 | 1| 0.0000049|
|X749 | 2| 0.0000098|
|X750 | 1| 0.0000049|
|X760 | 5| 0.0000245|
|X780 | 11| 0.0000540|
|X782 | 1| 0.0000049|
|X788 | 1| 0.0000049|
|X789 | 2| 0.0000098|
|X790 | 3| 0.0000147|
|X799 | 1| 0.0000049|
|X800 | 8| 0.0000393|
|X802 | 1| 0.0000049|
|X804 | 2| 0.0000098|
|X805 | 1| 0.0000049|
|X809 | 4| 0.0000196|
|X824 | 1| 0.0000049|
|X829 | 1| 0.0000049|
|X840 | 2| 0.0000098|
|X849 | 2| 0.0000098|
|X900 | 2| 0.0000098|
|X910 | 7| 0.0000344|
|X918 | 1| 0.0000049|
|X919 | 5| 0.0000245|
|X930 | 4| 0.0000196|
|X934 | 2| 0.0000098|
|X935 | 2| 0.0000098|
|X938 | 1| 0.0000049|
|X939 | 3| 0.0000147|
|X950 | 10| 0.0000491|
|X951 | 1| 0.0000049|
|X954 | 8| 0.0000393|
|X955 | 2| 0.0000098|
|X959 | 8| 0.0000393|
|X970 | 1| 0.0000049|
|X974 | 1| 0.0000049|
|X990 | 21| 0.0001031|
|X992 | 1| 0.0000049|
|X994 | 6| 0.0000295|
|X995 | 3| 0.0000147|
|X997 | 1| 0.0000049|
|X998 | 4| 0.0000196|
|X999 | 12| 0.0000589|
|Y000 | 8| 0.0000393|
|Y004 | 6| 0.0000295|
|Y007 | 2| 0.0000098|
|Y009 | 15| 0.0000736|
|Y018 | 1| 0.0000049|
|Y019 | 1| 0.0000049|
|Y034 | 1| 0.0000049|
|Y039 | 2| 0.0000098|
|Y040 | 2| 0.0000098|
|Y044 | 4| 0.0000196|
|Y048 | 1| 0.0000049|
|Y049 | 1| 0.0000049|
|Y069 | 2| 0.0000098|
|Y079 | 2| 0.0000098|
|Y089 | 1| 0.0000049|
|Y090 | 4| 0.0000196|
|Y094 | 2| 0.0000098|
|Y098 | 2| 0.0000098|
|Y099 | 7| 0.0000344|
|Y109 | 2| 0.0000098|
|Y119 | 1| 0.0000049|
|Y129 | 1| 0.0000049|
|Y149 | 7| 0.0000344|
|Y159 | 3| 0.0000147|
|Y176 | 1| 0.0000049|
|Y199 | 6| 0.0000295|
|Y200 | 28| 0.0001374|
|Y204 | 1| 0.0000049|
|Y208 | 2| 0.0000098|
|Y209 | 5| 0.0000245|
|Y210 | 2| 0.0000098|
|Y214 | 2| 0.0000098|
|Y219 | 2| 0.0000098|
|Y240 | 5| 0.0000245|
|Y244 | 3| 0.0000147|
|Y249 | 15| 0.0000736|
|Y260 | 2| 0.0000098|
|Y267 | 1| 0.0000049|
|Y269 | 2| 0.0000098|
|Y280 | 9| 0.0000442|
|Y289 | 4| 0.0000196|
|Y290 | 39| 0.0001914|
|Y291 | 1| 0.0000049|
|Y294 | 10| 0.0000491|
|Y298 | 2| 0.0000098|
|Y299 | 412| 0.0020224|
|Y300 | 4| 0.0000196|
|Y309 | 34| 0.0001669|
|Y319 | 2| 0.0000098|
|Y339 | 5| 0.0000245|
|Y340 | 50| 0.0002454|
|Y342 | 2| 0.0000098|
|Y344 | 9| 0.0000442|
|Y347 | 1| 0.0000049|
|Y348 | 6| 0.0000295|
|Y349 | 420| 0.0020617|
|Y433 | 1| 0.0000049|
|Y434 | 1| 0.0000049|
|Y442 | 11| 0.0000540|
|Y450 | 2| 0.0000098|
|Y453 | 2| 0.0000098|
|Y458 | 1| 0.0000049|
|Y459 | 2| 0.0000098|
|Y471 | 1| 0.0000049|
|Y483 | 1| 0.0000049|
|Y494 | 1| 0.0000049|
|Y495 | 1| 0.0000049|
|Y524 | 1| 0.0000049|
|Y526 | 1| 0.0000049|
|Y579 | 6| 0.0000295|
|Y605 | 1| 0.0000049|
|Y712 | 1| 0.0000049|
|Y792 | 2| 0.0000098|
|Y798 | 1| 0.0000049|
|Y830 | 5| 0.0000245|
|Y831 | 22| 0.0001080|
|Y832 | 11| 0.0000540|
|Y833 | 5| 0.0000245|
|Y834 | 11| 0.0000540|
|Y835 | 18| 0.0000884|
|Y836 | 24| 0.0001178|
|Y838 | 49| 0.0002405|
|Y839 | 59| 0.0002896|
|Y841 | 1| 0.0000049|
|Y844 | 1| 0.0000049|
|Y846 | 2| 0.0000098|
|Y848 | 13| 0.0000638|
|Y849 | 4| 0.0000196|
|Y850 | 4| 0.0000196|
|Y859 | 1| 0.0000049|
|Y86 | 15| 0.0000736|
|Y871 | 3| 0.0000147|
|Y872 | 5| 0.0000245|
|Y880 | 2| 0.0000098|
|Y883 | 8| 0.0000393|
|Y899 | 8| 0.0000393|
Table: Resumo Geral (Data)
|Nome |Tipo | N_total| N_missing|Mínimo |Máximo | N_unicos|
|:----------------------------|:----|-------:|---------:|:----------|:----------|--------:|
|analise_exploratoria$DTOBITO |Date | 203717| 0|2020-01-01 |2020-12-31 | 366|
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:----------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$LOCOCOR |factor | 203717| 48| 6|Hospital | 0.7442678|
Table: Frequência por categoria de analise_exploratoria$LOCOCOR
|Categoria | Frequência| Percentual|
|:------------------------------|----------:|----------:|
|Domicílio | 33958| 0.1667313|
|Hospital | 151620| 0.7444432|
|Outro estabelecimento de saúde | 13533| 0.0664460|
|Outros | 3764| 0.0184810|
|Via pública | 794| 0.0038985|
|NA | 48| 0.0002357|
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:-------------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$munResNome |factor | 203717| 0| 646|São Paulo | 0.2660701|
Table: Frequência por categoria de analise_exploratoria$munResNome
|Categoria | Frequência| Percentual|
|:--------------------------|----------:|----------:|
|Adamantina | 220| 0.0010799|
|Adolfo | 19| 0.0000933|
|Aguaí | 149| 0.0007314|
|Águas da Prata | 57| 0.0002798|
|Águas de Lindóia | 128| 0.0006283|
|Águas de Santa Bárbara | 27| 0.0001325|
|Águas de São Pedro | 24| 0.0001178|
|Agudos | 197| 0.0009670|
|Alambari | 20| 0.0000982|
|Alfredo Marcondes | 31| 0.0001522|
|Altair | 16| 0.0000785|
|Altinópolis | 77| 0.0003780|
|Alto Alegre | 22| 0.0001080|
|Alumínio | 69| 0.0003387|
|Álvares Florence | 27| 0.0001325|
|Álvares Machado | 124| 0.0006087|
|Álvaro de Carvalho | 20| 0.0000982|
|Alvinlândia | 11| 0.0000540|
|Americana | 1048| 0.0051444|
|Américo Brasiliense | 112| 0.0005498|
|Américo de Campos | 48| 0.0002356|
|Amparo | 372| 0.0018261|
|Analândia | 16| 0.0000785|
|Andradina | 350| 0.0017181|
|Angatuba | 120| 0.0005891|
|Anhembi | 35| 0.0001718|
|Anhumas | 14| 0.0000687|
|Aparecida | 168| 0.0008247|
|Aparecida d'Oeste | 39| 0.0001914|
|Apiaí | 124| 0.0006087|
|Araçariguama | 57| 0.0002798|
|Araçatuba | 1144| 0.0056156|
|Araçoiaba da Serra | 175| 0.0008590|
|Aramina | 34| 0.0001669|
|Arandu | 25| 0.0001227|
|Arapeí | 12| 0.0000589|
|Araraquara | 1107| 0.0054340|
|Araras | 586| 0.0028765|
|Arco-Íris | 14| 0.0000687|
|Arealva | 43| 0.0002111|
|Areias | 20| 0.0000982|
|Areiópolis | 40| 0.0001964|
|Ariranha | 44| 0.0002160|
|Artur Nogueira | 184| 0.0009032|
|Arujá | 360| 0.0017672|
|Aspásia | 11| 0.0000540|
|Assis | 533| 0.0026164|
|Atibaia | 715| 0.0035098|
|Auriflama | 84| 0.0004123|
|Avaí | 28| 0.0001374|
|Avanhandava | 41| 0.0002013|
|Avaré | 419| 0.0020568|
|Bady Bassitt | 102| 0.0005007|
|Balbinos | 10| 0.0000491|
|Bálsamo | 68| 0.0003338|
|Bananal | 55| 0.0002700|
|Barão de Antonina | 23| 0.0001129|
|Barbosa | 30| 0.0001473|
|Bariri | 191| 0.0009376|
|Barra Bonita | 186| 0.0009130|
|Barra do Chapéu | 18| 0.0000884|
|Barra do Turvo | 47| 0.0002307|
|Barretos | 724| 0.0035539|
|Barrinha | 118| 0.0005792|
|Barueri | 1219| 0.0059838|
|Bastos | 111| 0.0005449|
|Batatais | 328| 0.0016101|
|Bauru | 1723| 0.0084578|
|Bebedouro | 365| 0.0017917|
|Bento de Abreu | 16| 0.0000785|
|Bernardino de Campos | 69| 0.0003387|
|Bertioga | 195| 0.0009572|
|Bilac | 40| 0.0001964|
|Birigui | 542| 0.0026606|
|Biritiba-Mirim | 148| 0.0007265|
|Boa Esperança do Sul | 53| 0.0002602|
|Bocaina | 63| 0.0003093|
|Bofete | 57| 0.0002798|
|Boituva | 209| 0.0010259|
|Bom Jesus dos Perdões | 84| 0.0004123|
|Bom Sucesso de Itararé | 12| 0.0000589|
|Borá | 5| 0.0000245|
|Boracéia | 19| 0.0000933|
|Borborema | 88| 0.0004320|
|Borebi | 10| 0.0000491|
|Botucatu | 697| 0.0034214|
|Bragança Paulista | 799| 0.0039221|
|Braúna | 29| 0.0001424|
|Brejo Alegre | 15| 0.0000736|
|Brodowski | 133| 0.0006529|
|Brotas | 109| 0.0005351|
|Buri | 82| 0.0004025|
|Buritama | 107| 0.0005252|
|Buritizal | 27| 0.0001325|
|Cabrália Paulista | 24| 0.0001178|
|Cabreúva | 157| 0.0007707|
|Caçapava | 404| 0.0019831|
|Cachoeira Paulista | 146| 0.0007167|
|Caconde | 93| 0.0004565|
|Cafelândia | 108| 0.0005301|
|Caiabu | 25| 0.0001227|
|Caieiras | 350| 0.0017181|
|Caiuá | 24| 0.0001178|
|Cajamar | 243| 0.0011928|
|Cajati | 148| 0.0007265|
|Cajobi | 65| 0.0003191|
|Cajuru | 120| 0.0005891|
|Campina do Monte Alegre | 22| 0.0001080|
|Campinas | 5131| 0.0251869|
|Campo Limpo Paulista | 341| 0.0016739|
|Campos do Jordão | 235| 0.0011536|
|Campos Novos Paulista | 24| 0.0001178|
|Cananéia | 76| 0.0003731|
|Canas | 18| 0.0000884|
|Cândido Mota | 178| 0.0008738|
|Cândido Rodrigues | 19| 0.0000933|
|Canitar | 24| 0.0001178|
|Capão Bonito | 214| 0.0010505|
|Capela do Alto | 93| 0.0004565|
|Capivari | 209| 0.0010259|
|Caraguatatuba | 597| 0.0029305|
|Carapicuíba | 1398| 0.0068625|
|Cardoso | 81| 0.0003976|
|Casa Branca | 175| 0.0008590|
|Cássia dos Coqueiros | 19| 0.0000933|
|Castilho | 108| 0.0005301|
|Catanduva | 743| 0.0036472|
|Catiguá | 34| 0.0001669|
|Cedral | 65| 0.0003191|
|Cerqueira César | 98| 0.0004811|
|Cerquilho | 175| 0.0008590|
|Cesário Lange | 83| 0.0004074|
|Charqueada | 72| 0.0003534|
|Chavantes | 62| 0.0003043|
|Clementina | 28| 0.0001374|
|Colina | 80| 0.0003927|
|Colômbia | 28| 0.0001374|
|Conchal | 125| 0.0006136|
|Conchas | 100| 0.0004909|
|Cordeirópolis | 108| 0.0005301|
|Coroados | 30| 0.0001473|
|Coronel Macedo | 20| 0.0000982|
|Corumbataí | 16| 0.0000785|
|Cosmópolis | 235| 0.0011536|
|Cosmorama | 61| 0.0002994|
|Cotia | 919| 0.0045112|
|Cravinhos | 189| 0.0009278|
|Cristais Paulista | 36| 0.0001767|
|Cruzália | 14| 0.0000687|
|Cruzeiro | 375| 0.0018408|
|Cubatão | 520| 0.0025526|
|Cunha | 93| 0.0004565|
|Descalvado | 174| 0.0008541|
|Diadema | 1537| 0.0075448|
|Dirce Reis | 11| 0.0000540|
|Divinolândia | 76| 0.0003731|
|Dobrada | 28| 0.0001374|
|Dois Córregos | 121| 0.0005940|
|Dolcinópolis | 18| 0.0000884|
|Dourado | 45| 0.0002209|
|Dracena | 281| 0.0013794|
|Duartina | 79| 0.0003878|
|Dumont | 29| 0.0001424|
|Echaporã | 27| 0.0001325|
|Eldorado | 73| 0.0003583|
|Elias Fausto | 65| 0.0003191|
|Elisiário | 25| 0.0001227|
|Embaúba | 15| 0.0000736|
|Embu das Artes | 897| 0.0044032|
|Embu-Guaçu | 312| 0.0015315|
|Emilianópolis | 21| 0.0001031|
|Engenheiro Coelho | 53| 0.0002602|
|Espírito Santo do Pinhal | 241| 0.0011830|
|Espírito Santo do Turvo | 15| 0.0000736|
|Estiva Gerbi | 41| 0.0002013|
|Estrela d'Oeste | 46| 0.0002258|
|Estrela do Norte | 10| 0.0000491|
|Euclides da Cunha Paulista | 40| 0.0001964|
|Fartura | 80| 0.0003927|
|Fernando Prestes | 31| 0.0001522|
|Fernandópolis | 449| 0.0022040|
|Fernão | 11| 0.0000540|
|Ferraz de Vasconcelos | 622| 0.0030533|
|Flora Rica | 16| 0.0000785|
|Floreal | 17| 0.0000834|
|Flórida Paulista | 55| 0.0002700|
|Florínia | 17| 0.0000834|
|Franca | 1580| 0.0077559|
|Francisco Morato | 542| 0.0026606|
|Franco da Rocha | 544| 0.0026704|
|Gabriel Monteiro | 18| 0.0000884|
|Gália | 62| 0.0003043|
|Garça | 237| 0.0011634|
|Gastão Vidigal | 33| 0.0001620|
|Gavião Peixoto | 28| 0.0001374|
|General Salgado | 61| 0.0002994|
|Getulina | 47| 0.0002307|
|Glicério | 28| 0.0001374|
|Guaiçara | 57| 0.0002798|
|Guaimbê | 25| 0.0001227|
|Guaíra | 223| 0.0010947|
|Guapiaçu | 94| 0.0004614|
|Guapiara | 95| 0.0004663|
|Guará | 91| 0.0004467|
|Guaraçaí | 63| 0.0003093|
|Guaraci | 62| 0.0003043|
|Guarani d'Oeste | 15| 0.0000736|
|Guarantã | 35| 0.0001718|
|Guararapes | 163| 0.0008001|
|Guararema | 142| 0.0006970|
|Guaratinguetá | 602| 0.0029551|
|Guareí | 57| 0.0002798|
|Guariba | 159| 0.0007805|
|Guarujá | 1346| 0.0066072|
|Guarulhos | 5068| 0.0248776|
|Guatapará | 28| 0.0001374|
|Guzolândia | 29| 0.0001424|
|Herculândia | 52| 0.0002553|
|Holambra | 42| 0.0002062|
|Hortolândia | 772| 0.0037896|
|Iacanga | 52| 0.0002553|
|Iacri | 27| 0.0001325|
|Iaras | 21| 0.0001031|
|Ibaté | 94| 0.0004614|
|Ibirá | 54| 0.0002651|
|Ibirarema | 42| 0.0002062|
|Ibitinga | 295| 0.0014481|
|Ibiúna | 338| 0.0016592|
|Icém | 35| 0.0001718|
|Iepê | 41| 0.0002013|
|Igaraçu do Tietê | 112| 0.0005498|
|Igarapava | 173| 0.0008492|
|Igaratá | 38| 0.0001865|
|Iguape | 158| 0.0007756|
|Ilha Comprida | 69| 0.0003387|
|Ilha Solteira | 156| 0.0007658|
|Ilhabela | 98| 0.0004811|
|Indaiatuba | 1031| 0.0050609|
|Indiana | 13| 0.0000638|
|Indiaporã | 28| 0.0001374|
|Inúbia Paulista | 18| 0.0000884|
|Ipaussu | 75| 0.0003682|
|Iperó | 96| 0.0004712|
|Ipeúna | 31| 0.0001522|
|Ipiguá | 26| 0.0001276|
|Iporanga | 16| 0.0000785|
|Ipuã | 54| 0.0002651|
|Iracemápolis | 84| 0.0004123|
|Irapuã | 36| 0.0001767|
|Irapuru | 38| 0.0001865|
|Itaberá | 76| 0.0003731|
|Itaí | 102| 0.0005007|
|Itajobi | 97| 0.0004762|
|Itaju | 20| 0.0000982|
|Itanhaém | 577| 0.0028324|
|Itaóca | 21| 0.0001031|
|Itapecerica da Serra | 584| 0.0028667|
|Itapetininga | 739| 0.0036276|
|Itapeva | 436| 0.0021402|
|Itapevi | 731| 0.0035883|
|Itapira | 390| 0.0019144|
|Itapirapuã Paulista | 17| 0.0000834|
|Itápolis | 237| 0.0011634|
|Itaporanga | 88| 0.0004320|
|Itapuí | 53| 0.0002602|
|Itapura | 22| 0.0001080|
|Itaquaquecetuba | 1017| 0.0049922|
|Itararé | 232| 0.0011388|
|Itariri | 70| 0.0003436|
|Itatiba | 470| 0.0023071|
|Itatinga | 63| 0.0003093|
|Itirapina | 55| 0.0002700|
|Itirapuã | 24| 0.0001178|
|Itobi | 30| 0.0001473|
|Itu | 702| 0.0034460|
|Itupeva | 174| 0.0008541|
|Ituverava | 220| 0.0010799|
|Jaborandi | 31| 0.0001522|
|Jaboticabal | 398| 0.0019537|
|Jacareí | 977| 0.0047959|
|Jaci | 28| 0.0001374|
|Jacupiranga | 86| 0.0004222|
|Jaguariúna | 197| 0.0009670|
|Jales | 324| 0.0015904|
|Jambeiro | 30| 0.0001473|
|Jandira | 314| 0.0015414|
|Jardinópolis | 210| 0.0010308|
|Jarinu | 149| 0.0007314|
|Jaú | 727| 0.0035687|
|Jeriquara | 15| 0.0000736|
|Joanópolis | 71| 0.0003485|
|João Ramalho | 11| 0.0000540|
|José Bonifácio | 164| 0.0008050|
|Júlio Mesquita | 14| 0.0000687|
|Jumirim | 13| 0.0000638|
|Jundiaí | 2050| 0.0100630|
|Junqueirópolis | 117| 0.0005743|
|Juquiá | 105| 0.0005154|
|Juquitiba | 131| 0.0006430|
|Lagoinha | 27| 0.0001325|
|Laranjal Paulista | 119| 0.0005841|
|Lavínia | 25| 0.0001227|
|Lavrinhas | 23| 0.0001129|
|Leme | 465| 0.0022826|
|Lençóis Paulista | 287| 0.0014088|
|Limeira | 1389| 0.0068183|
|Lindóia | 35| 0.0001718|
|Lins | 429| 0.0021059|
|Lorena | 413| 0.0020273|
|Lourdes | 20| 0.0000982|
|Louveira | 139| 0.0006823|
|Lucélia | 126| 0.0006185|
|Lucianópolis | 15| 0.0000736|
|Luís Antônio | 48| 0.0002356|
|Luiziânia | 31| 0.0001522|
|Lupércio | 16| 0.0000785|
|Lutécia | 22| 0.0001080|
|Macatuba | 81| 0.0003976|
|Macaubal | 37| 0.0001816|
|Macedônia | 35| 0.0001718|
|Magda | 17| 0.0000834|
|Mairinque | 181| 0.0008885|
|Mairiporã | 355| 0.0017426|
|Manduri | 47| 0.0002307|
|Marabá Paulista | 17| 0.0000834|
|Maracaí | 64| 0.0003142|
|Marapoama | 23| 0.0001129|
|Mariápolis | 28| 0.0001374|
|Marília | 1161| 0.0056991|
|Marinópolis | 13| 0.0000638|
|Martinópolis | 125| 0.0006136|
|Matão | 383| 0.0018801|
|Mauá | 1538| 0.0075497|
|Mendonça | 31| 0.0001522|
|Meridiano | 26| 0.0001276|
|Mesópolis | 5| 0.0000245|
|Miguelópolis | 109| 0.0005351|
|Mineiros do Tietê | 79| 0.0003878|
|Mira Estrela | 16| 0.0000785|
|Miracatu | 95| 0.0004663|
|Mirandópolis | 132| 0.0006480|
|Mirante do Paranapanema | 95| 0.0004663|
|Mirassol | 322| 0.0015806|
|Mirassolândia | 27| 0.0001325|
|Mococa | 375| 0.0018408|
|Mogi das Cruzes | 1883| 0.0092432|
|Mogi Guaçu | 686| 0.0033674|
|Mogi Mirim | 466| 0.0022875|
|Mombuca | 14| 0.0000687|
|Monções | 20| 0.0000982|
|Mongaguá | 345| 0.0016935|
|Monte Alegre do Sul | 41| 0.0002013|
|Monte Alto | 264| 0.0012959|
|Monte Aprazível | 139| 0.0006823|
|Monte Azul Paulista | 91| 0.0004467|
|Monte Castelo | 28| 0.0001374|
|Monte Mor | 228| 0.0011192|
|Monteiro Lobato | 25| 0.0001227|
|Morro Agudo | 124| 0.0006087|
|Morungaba | 60| 0.0002945|
|Motuca | 17| 0.0000834|
|Município ignorado - SP | 33| 0.0001620|
|Murutinga do Sul | 28| 0.0001374|
|Nantes | 6| 0.0000295|
|Narandiba | 21| 0.0001031|
|Natividade da Serra | 29| 0.0001424|
|Nazaré Paulista | 101| 0.0004958|
|Neves Paulista | 57| 0.0002798|
|Nhandeara | 71| 0.0003485|
|Nipoã | 16| 0.0000785|
|Nova Aliança | 40| 0.0001964|
|Nova Campina | 36| 0.0001767|
|Nova Canaã Paulista | 15| 0.0000736|
|Nova Castilho | 4| 0.0000196|
|Nova Europa | 45| 0.0002209|
|Nova Granada | 114| 0.0005596|
|Nova Guataporanga | 14| 0.0000687|
|Nova Independência | 17| 0.0000834|
|Nova Luzitânia | 16| 0.0000785|
|Nova Odessa | 253| 0.0012419|
|Novais | 20| 0.0000982|
|Novo Horizonte | 214| 0.0010505|
|Nuporanga | 43| 0.0002111|
|Ocauçu | 22| 0.0001080|
|Óleo | 7| 0.0000344|
|Olímpia | 335| 0.0016444|
|Onda Verde | 23| 0.0001129|
|Oriente | 39| 0.0001914|
|Orindiúva | 32| 0.0001571|
|Orlândia | 198| 0.0009719|
|Osasco | 3046| 0.0149521|
|Oscar Bressane | 18| 0.0000884|
|Osvaldo Cruz | 206| 0.0010112|
|Ourinhos | 543| 0.0026655|
|Ouro Verde | 43| 0.0002111|
|Ouroeste | 54| 0.0002651|
|Pacaembu | 72| 0.0003534|
|Palestina | 69| 0.0003387|
|Palmares Paulista | 33| 0.0001620|
|Palmeira d'Oeste | 66| 0.0003240|
|Palmital | 126| 0.0006185|
|Panorama | 80| 0.0003927|
|Paraguaçu Paulista | 216| 0.0010603|
|Paraibuna | 85| 0.0004172|
|Paraíso | 27| 0.0001325|
|Paranapanema | 80| 0.0003927|
|Paranapuã | 26| 0.0001276|
|Parapuã | 68| 0.0003338|
|Pardinho | 44| 0.0002160|
|Pariquera-Açu | 88| 0.0004320|
|Parisi | 13| 0.0000638|
|Patrocínio Paulista | 57| 0.0002798|
|Paulicéia | 29| 0.0001424|
|Paulínia | 358| 0.0017573|
|Paulistânia | 9| 0.0000442|
|Paulo de Faria | 43| 0.0002111|
|Pederneiras | 196| 0.0009621|
|Pedra Bela | 22| 0.0001080|
|Pedranópolis | 23| 0.0001129|
|Pedregulho | 90| 0.0004418|
|Pedreira | 190| 0.0009327|
|Pedrinhas Paulista | 7| 0.0000344|
|Pedro de Toledo | 45| 0.0002209|
|Penápolis | 323| 0.0015855|
|Pereira Barreto | 149| 0.0007314|
|Pereiras | 36| 0.0001767|
|Peruíbe | 422| 0.0020715|
|Piacatu | 40| 0.0001964|
|Piedade | 256| 0.0012566|
|Pilar do Sul | 123| 0.0006038|
|Pindamonhangaba | 644| 0.0031612|
|Pindorama | 96| 0.0004712|
|Pinhalzinho | 73| 0.0003583|
|Piquerobi | 23| 0.0001129|
|Piquete | 100| 0.0004909|
|Piracaia | 145| 0.0007118|
|Piracicaba | 1842| 0.0090420|
|Piraju | 167| 0.0008198|
|Pirajuí | 174| 0.0008541|
|Pirangi | 70| 0.0003436|
|Pirapora do Bom Jesus | 44| 0.0002160|
|Pirapozinho | 131| 0.0006430|
|Pirassununga | 421| 0.0020666|
|Piratininga | 74| 0.0003632|
|Pitangueiras | 166| 0.0008149|
|Planalto | 20| 0.0000982|
|Platina | 13| 0.0000638|
|Poá | 488| 0.0023955|
|Poloni | 30| 0.0001473|
|Pompéia | 110| 0.0005400|
|Pongaí | 26| 0.0001276|
|Pontal | 134| 0.0006578|
|Pontalinda | 18| 0.0000884|
|Pontes Gestal | 24| 0.0001178|
|Populina | 27| 0.0001325|
|Porangaba | 57| 0.0002798|
|Porto Feliz | 238| 0.0011683|
|Porto Ferreira | 246| 0.0012076|
|Potim | 64| 0.0003142|
|Potirendaba | 101| 0.0004958|
|Pracinha | 10| 0.0000491|
|Pradópolis | 78| 0.0003829|
|Praia Grande | 1643| 0.0080651|
|Pratânia | 19| 0.0000933|
|Presidente Alves | 24| 0.0001178|
|Presidente Bernardes | 86| 0.0004222|
|Presidente Epitácio | 202| 0.0009916|
|Presidente Prudente | 1162| 0.0057040|
|Presidente Venceslau | 184| 0.0009032|
|Promissão | 195| 0.0009572|
|Quadra | 21| 0.0001031|
|Quatá | 53| 0.0002602|
|Queiroz | 17| 0.0000834|
|Queluz | 51| 0.0002503|
|Quintana | 33| 0.0001620|
|Rafard | 33| 0.0001620|
|Rancharia | 144| 0.0007069|
|Redenção da Serra | 19| 0.0000933|
|Regente Feijó | 97| 0.0004762|
|Reginópolis | 24| 0.0001178|
|Registro | 249| 0.0012223|
|Restinga | 25| 0.0001227|
|Ribeira | 19| 0.0000933|
|Ribeirão Bonito | 62| 0.0003043|
|Ribeirão Branco | 83| 0.0004074|
|Ribeirão Corrente | 13| 0.0000638|
|Ribeirão do Sul | 22| 0.0001080|
|Ribeirão dos Índios | 15| 0.0000736|
|Ribeirão Grande | 37| 0.0001816|
|Ribeirão Pires | 510| 0.0025035|
|Ribeirão Preto | 3383| 0.0166064|
|Rifaina | 30| 0.0001473|
|Rincão | 39| 0.0001914|
|Rinópolis | 53| 0.0002602|
|Rio Claro | 999| 0.0049039|
|Rio das Pedras | 134| 0.0006578|
|Rio Grande da Serra | 152| 0.0007461|
|Riolândia | 45| 0.0002209|
|Riversul | 38| 0.0001865|
|Rosana | 81| 0.0003976|
|Roseira | 43| 0.0002111|
|Rubiácea | 12| 0.0000589|
|Rubinéia | 31| 0.0001522|
|Sabino | 44| 0.0002160|
|Sagres | 9| 0.0000442|
|Sales | 38| 0.0001865|
|Sales Oliveira | 47| 0.0002307|
|Salesópolis | 85| 0.0004172|
|Salmourão | 29| 0.0001424|
|Saltinho | 35| 0.0001718|
|Salto | 518| 0.0025427|
|Salto de Pirapora | 179| 0.0008787|
|Salto Grande | 50| 0.0002454|
|Sandovalina | 24| 0.0001178|
|Santa Adélia | 85| 0.0004172|
|Santa Albertina | 42| 0.0002062|
|Santa Bárbara d'Oeste | 816| 0.0040056|
|Santa Branca | 57| 0.0002798|
|Santa Clara d'Oeste | 11| 0.0000540|
|Santa Cruz da Conceição | 19| 0.0000933|
|Santa Cruz da Esperança | 12| 0.0000589|
|Santa Cruz das Palmeiras | 151| 0.0007412|
|Santa Cruz do Rio Pardo | 208| 0.0010210|
|Santa Ernestina | 17| 0.0000834|
|Santa Fé do Sul | 247| 0.0012125|
|Santa Gertrudes | 95| 0.0004663|
|Santa Isabel | 272| 0.0013352|
|Santa Lúcia | 28| 0.0001374|
|Santa Maria da Serra | 17| 0.0000834|
|Santa Mercedes | 15| 0.0000736|
|Santa Rita d'Oeste | 23| 0.0001129|
|Santa Rita do Passa Quatro | 188| 0.0009228|
|Santa Rosa de Viterbo | 127| 0.0006234|
|Santa Salete | 17| 0.0000834|
|Santana da Ponte Pensa | 9| 0.0000442|
|Santana de Parnaíba | 413| 0.0020273|
|Santo Anastácio | 118| 0.0005792|
|Santo André | 3988| 0.0195762|
|Santo Antônio da Alegria | 47| 0.0002307|
|Santo Antônio de Posse | 88| 0.0004320|
|Santo Antônio do Aracanguá | 49| 0.0002405|
|Santo Antônio do Jardim | 35| 0.0001718|
|Santo Antônio do Pinhal | 31| 0.0001522|
|Santo Expedito | 19| 0.0000933|
|Santópolis do Aguapeí | 29| 0.0001424|
|Santos | 3321| 0.0163020|
|São Bento do Sapucaí | 58| 0.0002847|
|São Bernardo do Campo | 3356| 0.0164738|
|São Caetano do Sul | 1215| 0.0059642|
|São Carlos | 1134| 0.0055665|
|São Francisco | 18| 0.0000884|
|São João da Boa Vista | 492| 0.0024151|
|São João das Duas Pontes | 15| 0.0000736|
|São João de Iracema | 14| 0.0000687|
|São João do Pau d'Alho | 15| 0.0000736|
|São Joaquim da Barra | 232| 0.0011388|
|São José da Bela Vista | 41| 0.0002013|
|São José do Barreiro | 23| 0.0001129|
|São José do Rio Pardo | 324| 0.0015904|
|São José do Rio Preto | 2749| 0.0134942|
|São José dos Campos | 2683| 0.0131702|
|São Lourenço da Serra | 53| 0.0002602|
|São Luís do Paraitinga | 61| 0.0002994|
|São Manuel | 191| 0.0009376|
|São Miguel Arcanjo | 135| 0.0006627|
|São Paulo | 54203| 0.2660701|
|São Pedro | 159| 0.0007805|
|São Pedro do Turvo | 32| 0.0001571|
|São Roque | 377| 0.0018506|
|São Sebastião | 226| 0.0011094|
|São Sebastião da Grama | 65| 0.0003191|
|São Simão | 79| 0.0003878|
|São Vicente | 1805| 0.0088603|
|Sarapuí | 41| 0.0002013|
|Sarutaiá | 24| 0.0001178|
|Sebastianópolis do Sul | 19| 0.0000933|
|Serra Azul | 49| 0.0002405|
|Serra Negra | 163| 0.0008001|
|Serrana | 153| 0.0007510|
|Sertãozinho | 547| 0.0026851|
|Sete Barras | 61| 0.0002994|
|Severínia | 83| 0.0004074|
|Silveiras | 31| 0.0001522|
|Socorro | 244| 0.0011977|
|Sorocaba | 2931| 0.0143876|
|Sud Mennucci | 34| 0.0001669|
|Sumaré | 933| 0.0045799|
|Suzanápolis | 22| 0.0001080|
|Suzano | 1120| 0.0054978|
|Tabapuã | 75| 0.0003682|
|Tabatinga | 80| 0.0003927|
|Taboão da Serra | 995| 0.0048842|
|Taciba | 32| 0.0001571|
|Taguaí | 46| 0.0002258|
|Taiaçu | 36| 0.0001767|
|Taiúva | 30| 0.0001473|
|Tambaú | 130| 0.0006381|
|Tanabi | 168| 0.0008247|
|Tapiraí | 33| 0.0001620|
|Tapiratiba | 54| 0.0002651|
|Taquaral | 15| 0.0000736|
|Taquaritinga | 315| 0.0015463|
|Taquarituba | 112| 0.0005498|
|Taquarivaí | 24| 0.0001178|
|Tarabai | 34| 0.0001669|
|Tarumã | 61| 0.0002994|
|Tatuí | 577| 0.0028324|
|Taubaté | 1351| 0.0066317|
|Tejupá | 19| 0.0000933|
|Teodoro Sampaio | 86| 0.0004222|
|Terra Roxa | 45| 0.0002209|
|Tietê | 186| 0.0009130|
|Timburi | 15| 0.0000736|
|Torre de Pedra | 23| 0.0001129|
|Torrinha | 62| 0.0003043|
|Trabiju | 5| 0.0000245|
|Tremembé | 145| 0.0007118|
|Três Fronteiras | 41| 0.0002013|
|Tuiuti | 33| 0.0001620|
|Tupã | 432| 0.0021206|
|Tupi Paulista | 116| 0.0005694|
|Turiúba | 13| 0.0000638|
|Turmalina | 13| 0.0000638|
|Ubarana | 20| 0.0000982|
|Ubatuba | 294| 0.0014432|
|Ubirajara | 20| 0.0000982|
|Uchoa | 63| 0.0003093|
|União Paulista | 10| 0.0000491|
|Urânia | 54| 0.0002651|
|Uru | 8| 0.0000393|
|Urupês | 67| 0.0003289|
|Valentim Gentil | 74| 0.0003632|
|Valinhos | 576| 0.0028275|
|Valparaíso | 124| 0.0006087|
|Vargem | 38| 0.0001865|
|Vargem Grande do Sul | 203| 0.0009965|
|Vargem Grande Paulista | 183| 0.0008983|
|Várzea Paulista | 306| 0.0015021|
|Vera Cruz | 55| 0.0002700|
|Vinhedo | 317| 0.0015561|
|Viradouro | 91| 0.0004467|
|Vista Alegre do Alto | 26| 0.0001276|
|Vitória Brasil | 8| 0.0000393|
|Votorantim | 483| 0.0023709|
|Votuporanga | 532| 0.0026115|
|Zacarias | 18| 0.0000884|
3.4 Transformações das Variáveis
CLIQUE NAS OPÇÕES ABAIXO PARA EXPLORAR AS VARIÁVEIS TRANSFORMADAS
Transformação do Diagnóstico (CID-10)
Para aprimorar nossa variável-alvo e identificar de forma precisa os eventos cardiorrespiratórios, convertemos o código CID-10 em um indicador binário. Isso garante que o modelo receba uma variável lógica, livre de inconsistências de formatação, e permite separar claramente óbitos por causas do capítulo I (doenças do sistema circulatório) ou por um conjunto específico de códigos, se desejado.
add_cardiac_flag <- function(df,
cause_col = "CAUSABAS",
flag_col = "evento_cardiaco",
pattern = "^I",
specific = NULL) {
# Descrição:
# Adiciona ao data.frame uma coluna booleana indicando
# se o código CID-10 corresponde a um evento cardíaco.
#
# Parâmetros:
# df : tibble/data.frame de entrada
# cause_col : nome da coluna com códigos CID-10 (string)
# flag_col : nome da nova coluna booleana (string)
# pattern : expressão regular para identificar prefixo de códigos (default "^I")
# specific : vetor de códigos exatos (por exemplo, c("I20","I21"));
# se não for NULL, usa essa lista em vez da regex
# 1. Garante que a coluna de códigos seja do tipo character
df <- df %>%
mutate(
!!sym(cause_col) := as.character(.data[[cause_col]])
)
# 2. Cria a coluna de flag:
# - se 'specific' for NULL, usa grepl() com a regex
# - caso contrário, verifica se o código está em 'specific'
df <- df %>%
mutate(
!!sym(flag_col) := if (is.null(specific)) {
grepl(pattern, .data[[cause_col]])
} else {
.data[[cause_col]] %in% specific
}
)
# 3. Retorna o data.frame com a nova coluna de flag
df
}
- Garantir formato correto: converte a coluna de códigos CID-10 em character para evitar inconsistências nas comparações.
- Gerar a flag: cria a nova coluna booleana, aplicando grepl(pattern, …) quando não há vetor specific, ou testando a inclusão no vetor fornecido (… %in% specific).
- Retornar o resultado: devolve o mesmo data frame de entrada, agora enriquecido com a coluna de flag (flag_col) indicando eventos cardíacos.
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:-----------------------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$obito_cardiovascular |factor | 203717| 0| 2|FALSE | 0.7343668|
Table: Frequência por categoria de analise_exploratoria$obito_cardiovascular
|Categoria | Frequência| Percentual|
|:---------|----------:|----------:|
|FALSE | 149603| 0.7343668|
|TRUE | 54114| 0.2656332|
Agregação Temporal por Bimestre
Como existem centenas de datas individuais de óbito, a granularidade diária pode gerar modelos ruidosos e classes pouco representativas em certos dias. Ao converter cada data em seu respectivo bimestre (dois em dois meses), reduzimos a dimensionalidade temporal, mitigamos o desbalanceamento e facilitamos a detecção de padrões de sazonalidade durante o ano.
add_bimestre_col <- function(df, date_col, new_col = "bimestre") {
# Descrição:
# Acrescenta ao data.frame uma coluna categórica com o bimestre
#
# Parâmetros:
# df : tibble/data.frame de entrada
# date_col : nome da coluna de data (não quoted), ex: DTOBITO
# new_col : nome da coluna de saída para o bimestre (string)
# 1. Captura a coluna de data como símbolo para uso com dplyr::mutate()
date_var <- rlang::ensym(date_col)
# 2. Define os rótulos para os seis bimestres do ano
labels <- c("Jan-Feb", "Mar-Apr", "May-Jun",
"Jul-Aug", "Sep-Oct", "Nov-Dec")
# 3. Calcula o bimestre e adiciona a nova coluna
df %>%
mutate(
# extrai o mês, divide por 2, arredonda para cima (1–6)
# e converte em factor com os rótulos definidos
!!new_col := factor(
ceiling(lubridate::month(!!date_var) / 2),
levels = 1:6,
labels = labels
)
)
}
- Capturar a coluna de data: usa rlang::ensym() para transformar o argumento date_col em um símbolo que pode ser referenciado dentro de mutate().
- Definir os rótulos dos bimestres: cria um vetor com seis strings (“Jan-Feb”, “Mar-Apr”, …, “Nov-Dec”) que serão usados como níveis de fator.
- Calcular e adicionar o bimestre: dentro de mutate(), extrai o mês via lubridate::month(), divide por 2, aplica ceiling() para gerar valores de 1 a 6, converte em factor usando os rótulos definidos e atribui o resultado à coluna new_col.
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:-----------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$bimestre |factor | 203717| 0| 6|Jul-Aug | 0.1928754|
Table: Frequência por categoria de analise_exploratoria$bimestre
|Categoria | Frequência| Percentual|
|:---------|----------:|----------:|
|Jan-Feb | 27457| 0.1347801|
|Mar-Apr | 30794| 0.1511607|
|May-Jun | 38106| 0.1870536|
|Jul-Aug | 39292| 0.1928754|
|Sep-Oct | 34828| 0.1709627|
|Nov-Dec | 33240| 0.1631675|
Agrupamento Espacial por Região Intermediária
A divisão por município resulta em centenas de categorias esparsas, o que prejudica a robustez dos modelos. Mapeamos cada município para sua região intermediária IBGE, condensando a variabilidade espacial em poucos grupos significativos. Isso melhora a interpretabilidade, reduz o risco de overfitting e mantém a relevância geográfica para análises territoriais.
add_intermediate_region_col <- function(df,
muni_col = "munResNome",
uf = "SP",
year = 2020,
new_col = "regiao_intermediaria") {
# 1) Baixar shapefile de municípios da UF no ano desejado
muni_sf <- geobr::read_municipality(
code_muni = uf, # filtra apenas o estado (ex: "SP")
year = year, # ano de referência (ex: 2020)
simplified = TRUE # geometria simplificada para rapidez
) %>%
select(code_muni, name_muni) %>% # mantém só código e nome
mutate(name_muni = toupper(name_muni)) # padroniza para maiúsculas
# 2) Baixar shapefile de regiões intermediárias do IBGE
reg_int_sf <- geobr::read_intermediate_region(
year = year, # mesmo ano de referência
simplified = TRUE # geometria simplificada
) %>%
select(name_intermediate) # mantém só o nome da região
# 3) Fazer join espacial entre municípios e regiões intermediárias
muni_join <- sf::st_join(
muni_sf, # layer de municípios
reg_int_sf, # layer de regiões intermediárias
left = TRUE # mantém todos os municípios
)
# 4) Construir lookup de município → região sem geometria
mapping <- muni_join %>%
sf::st_drop_geometry() %>% # remove geometria para virar tibble
select(name_muni, name_intermediate) %>% # mantem pares único
distinct(name_muni, .keep_all = TRUE) # garante um registro por município
# 5) Anexar a coluna de região ao df original e convertê-la em factor
df %>%
mutate(
tmp_muni = toupper(.data[[muni_col]]) # padroniza município do df em maiúsculas
) %>%
left_join(
mapping, # mapeia tmp_muni → name_intermediate
by = c("tmp_muni" = "name_muni")
) %>%
select(-tmp_muni) %>% # remove coluna temporária
mutate(
!!new_col := factor(name_intermediate) # cria coluna fator de região intermediária
) %>%
select(-name_intermediate) # remove coluna auxiliar original
}
- Baixar shapefile de municípios: usa geobr::read_municipality() para obter código e nome dos municípios da UF e ano especificados, padronizando os nomes em maiúsculas.
- Baixar shapefile de regiões intermediárias: utiliza geobr::read_intermediate_region() para carregar as regiões intermediárias do mesmo ano.
- Associar municípios às regiões: realiza um join espacial (sf::st_join) entre o objeto de municípios e o de regiões intermediárias.
- Gerar lookup único: remove a geometria e duplica apenas um par município–região, criando um mapeamento limpo.
- Adicionar coluna ao data frame: padroniza o nome do município no df original, faz um left_join com o lookup e insere a coluna de região intermediária, removendo colunas temporárias ao final.
Table: Resumo Geral (Categórica)
|Nome |Tipo | N_total| N_missing| N_níveis|Nivel_mais_freq | Pct_mais_freq|
|:-----------------------------------------|:------|-------:|---------:|--------:|:---------------|-------------:|
|analise_exploratoria$regiao_intermediaria |factor | 203717| 280| 17|São Paulo | 0.527629|
Table: Frequência por categoria de analise_exploratoria$regiao_intermediaria
|Categoria | Frequência| Percentual|
|:---------------------------|----------:|----------:|
|Araçatuba | 4239| 0.0208369|
|Araraquara | 5153| 0.0253297|
|Bauru | 8638| 0.0424603|
|Campinas | 18114| 0.0890399|
|Marília | 5064| 0.0248922|
|Pouso Alegre | 6042| 0.0296996|
|Presidente Prudente | 4745| 0.0233242|
|Ribeirão Preto | 8586| 0.0422047|
|Rio de Janeiro | 465| 0.0022857|
|São José do Rio Preto | 9262| 0.0455276|
|São José dos Campos | 3630| 0.0178434|
|São Paulo | 107487| 0.5283552|
|Sorocaba | 17703| 0.0870196|
|Uberaba | 1825| 0.0089708|
|Varginha | 2452| 0.0120529|
|Volta Redonda - Barra Mansa | 32| 0.0001573|
|NA | 280| 0.0013763|
3.5 Correlações entre os atributos.
3.5.1 Função: Variáveis Numéricas vs Evento Cardiovascular
# Função única para análise bivariada contínua × binária
# Retorna resumo estendido (incluindo quartis), teste estatístico e boxplot opcional
explorar_bi_cont <- function(df, num_var, target_var,
test = c("t.test", "wilcox.test"),
plot = FALSE) {
# 1. Captura dinâmica dos símbolos tidy
num_sym <- enquo(num_var) # coluna numérica
target_sym <- enquo(target_var) # coluna binária
nome_num <- as_label(num_sym) # nome da variável numérica
nome_targ <- as_label(target_sym) # nome do target bivariado
# 2. Resumo descritivo estendido por grupo do target
resumo <- df %>%
group_by(!!target_sym) %>% # separa FALSE e TRUE
summarise(
n = n(), # total de observações
média = mean(!!num_sym, na.rm = TRUE), # média
mediana = median(!!num_sym, na.rm = TRUE),# mediana
sd = sd(!!num_sym, na.rm = TRUE), # desvio-padrão
mínimo = min(!!num_sym, na.rm = TRUE), # valor mínimo
`25%` = quantile(!!num_sym, 0.25, na.rm = TRUE), # 1.º quartil
`75%` = quantile(!!num_sym, 0.75, na.rm = TRUE), # 3.º quartil
máximo = max(!!num_sym, na.rm = TRUE) # valor máximo
)
# 3. Exibe a tabela de resumo com kable
print(
kable(
resumo,
caption = paste("Resumo de", nome_num, "por", nome_targ)
)
)
# 4. Prepara vetores para o teste de hipótese
x_false <- df %>% filter(! (!!target_sym)) %>% pull(!!num_sym)
x_true <- df %>% filter( (!!target_sym)) %>% pull(!!num_sym)
# 5. Executa o teste escolhido (t.test ou Wilcoxon)
if ("t.test" %in% test) {
tst <- t.test(x_true, x_false) # teste t de Student
teste_nome <- "t.test"
} else {
tst <- wilcox.test(x_true, x_false) # teste de Wilcoxon
teste_nome <- "Wilcoxon"
}
# 6. Imprime estatística e p-valor do teste
cat(sprintf(
"%s (%s vs %s):\n estatística = %.3f, p-valor = %.3g\n\n",
teste_nome, nome_num, nome_targ,
tst$statistic, tst$p.value
))
# 7. Gera boxplot comparativo se solicitado
if (plot) {
df_plot <- df %>%
mutate(
Valor = !!num_sym, # renomeia para plot
Grupo = factor(!!target_sym, # fator para categorias
levels = c(FALSE, TRUE),
labels = c(paste(nome_targ, "= FALSE"),
paste(nome_targ, "= TRUE")))
)
plt <- ggplot(df_plot, aes(x = Grupo, y = Valor, fill = Grupo)) +
geom_boxplot() +
labs(
title = paste("Boxplot de", nome_num, "por", nome_targ),
x = nome_targ,
y = nome_num
) +
theme_minimal() +
theme(legend.position = "none") # sem legenda duplicada
print(plt) # mostra o gráfico
}
# 8. Retorna invisivelmente o resumo, o objeto de teste e o gráfico (se houver)
invisible(list(
resumo = resumo,
teste = tst,
plot = if (plot) plt else NULL
))
}
- Resumo descritivo por grupo
Agrupa os dados por obito_cardiovascular e calcula contagem, média, mediana e desvio-padrão para a variável contínua usando dplyr::group_by() combinado com summarise().
- Teste de hipótese
Compara as duas distribuições (TRUE vs FALSE) por meio do t.test() (ou wilcox.test() se optar por Wilcoxon), extraindo estatística e p-valor para avaliar se há diferença significativa nas médias.
- Boxplot comparativo
Visualiza a dispersão e diferenças entre grupos com ggplot2::geom_boxplot(), onde cada “caixa” mostra mediana, quartis e outliers para cada nível do alvo binário.
3.5.1.1 IDADEanos
explorar_bi_cont(
analise_exploratoria,
IDADEanos,
obito_cardiovascular,
test = "wilcox.test",
plot = TRUE
)
Table: Resumo de IDADEanos por obito_cardiovascular
|obito_cardiovascular | n| média| mediana| sd| mínimo| 25%| 75%| máximo|
|:--------------------|------:|--------:|-------:|--------:|------:|---:|---:|------:|
|FALSE | 149603| 77.09815| 77| 10.12952| 60| 69| 85| 115|
|TRUE | 54114| 77.57366| 78| 10.02818| 60| 69| 85| 113|
Wilcoxon (IDADEanos vs obito_cardiovascular):
estatística = 4162420331.500, p-valor = 1.37e-22
3.5.2 Função: Variáveis Categóricas vs Evento Cardiovascular
# Função única para categoria × target: tabela, χ² e (opcional) gráfico
explorar_bi_categ <- function(df, cat_var, target_var, plot = FALSE) {
# Captura as colunas por enquo para usar dentro do dplyr
cat_sym <- enquo(cat_var) # variável categórica
target_sym <- enquo(target_var) # variável binária (TRUE/FALSE)
nome <- as_label(cat_sym) # nome da variável categórica em string
target_name <- as_label(target_sym) # nome do target em string
# 1) Tabela de contingência N (%) por nível de cat_var vs target_var
ct <- df %>%
tabyl(!!cat_sym, !!target_sym) %>% # monta a tabela cruzada
adorn_percentages("row") %>% # converte em % por linha
adorn_pct_formatting(digits = 1) %>% # formata com 1 casa decimal
adorn_ns() # adiciona contagem N junto ao %
# Exibe a tabela formatada
print(
kable(
ct,
caption = paste("Contingência:", nome, "×", target_name)
)
)
# 2) Teste de associação qui-quadrado
tbl0 <- table( # monta objeto table() bruto
df %>% pull(!!cat_sym),
df %>% pull(!!target_sym)
)
chi <- chisq.test(tbl0) # executa o teste χ²
# Exibe estatística e p-valor do teste
cat(sprintf(
"Teste χ² (%s vs %s): X² = %.2f, df = %d, p = %.3g\n\n",
nome, target_name,
chi$statistic, # valor de χ²
chi$parameter, # graus de liberdade
chi$p.value # p-valor
))
# 3) Gráfico de barras empilhadas em proporção (opcional)
if (plot) {
df_plot <- df %>%
mutate(
Var = as.factor(!!cat_sym), # garante factor
Target = factor(!!target_sym, levels = c(FALSE, TRUE)) # pôr FALSE antes de TRUE
)
plt <- ggplot(df_plot, aes(x = Var, fill = Target)) +
geom_bar(position = "fill") + # barras relativas (100%)
scale_y_continuous(labels = percent_format(accuracy = 1)) + # eixo y em %
labs(
title = paste("Distribuição de", nome, "por", target_name),
x = nome, # rótulo do eixo x
y = "Proporção", # rótulo do eixo y
fill = target_name # legenda
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))# rotaciona rótulos
print(plt) # exibe o gráfico
}
# Retorna invisivelmente a lista com tabela, teste e gráfico (se solicitado)
invisible(list(
table = ct,
test = chi,
plot = if (plot) plt
))
}
- Captura dinâmica
Usamos enquo() para “pegar” a coluna categórica e o target sem precisar citar strings, e as_label() para transformar esses símbolos em nomes legíveis, que vão direto nos títulos e legendas.
- Contingência formatada
Com janitor::tabyl() cruzamos categoria e target, depois aplicamos adorn_percentages(), adorn_pct_formatting() e adorn_ns() para mostrar “N (XX.X%)” de forma imediata — tudo impresso com knitr::kable().
- Associação e gráfico
Rodamos chisq.test() sobre o table() puro para obter χ², gl e p-valor, exibidos numa linha de texto. Se plot = TRUE, construímos um ggplot2 de barras empilhadas em proporção, rotacionando rótulos para melhor leitura.
CLIQUE NAS OPÇÕES ABAIXO PARA EXPLORAR OS RESULTADOS
Table: Contingência: RACACOR × obito_cardiovascular
|RACACOR |FALSE |TRUE |
|:--------|:---------------|:--------------|
|Amarela |76.4% (2,678) |23.6% (825) |
|Branca |73.7% (109,515) |26.3% (39,178) |
|Indígena |81.2% (78) |18.8% (18) |
|Parda |72.3% (25,076) |27.7% (9,598) |
|Preta |72.2% (9,548) |27.8% (3,678) |
|NA |76.8% (2,708) |23.2% (817) |
Teste χ² (RACACOR vs obito_cardiovascular): X² = 55.09, df = 4, p = 3.11e-11
Table: Contingência: SEXO × obito_cardiovascular
|SEXO |FALSE |TRUE |
|:---------|:--------------|:--------------|
|Feminino |72.7% (72,827) |27.3% (27,352) |
|Masculino |74.1% (76,757) |25.9% (26,759) |
|NA |86.4% (19) |13.6% (3) |
Teste χ² (SEXO vs obito_cardiovascular): X² = 55.02, df = 1, p = 1.19e-13
Table: Contingência: ESTCIV × obito_cardiovascular
|ESTCIV |FALSE |TRUE |
|:----------------------|:--------------|:--------------|
|Casado |74.3% (57,796) |25.7% (19,986) |
|Separado judicialmente |73.4% (12,907) |26.6% (4,673) |
|Solteiro |73.4% (18,175) |26.6% (6,593) |
|União consensual |74.2% (2,496) |25.8% (866) |
|Viúvo |72.3% (51,479) |27.7% (19,767) |
|NA |75.2% (6,750) |24.8% (2,229) |
Teste χ² (ESTCIV vs obito_cardiovascular): X² = 81.41, df = 4, p = 8.77e-17
Table: Contingência: ESC × obito_cardiovascular
|ESC |FALSE |TRUE |
|:---------------|:--------------|:--------------|
|1 a 3 anos |73.1% (33,666) |26.9% (12,388) |
|12 anos ou mais |77.6% (11,798) |22.4% (3,413) |
|4 a 7 anos |72.4% (39,660) |27.6% (15,127) |
|8 a 11 anos |74.7% (25,267) |25.3% (8,565) |
|Nenhuma |70.7% (16,333) |29.3% (6,764) |
|NA |74.4% (22,879) |25.6% (7,857) |
Teste χ² (ESC vs obito_cardiovascular): X² = 276.89, df = 4, p = 1.04e-58
Table: Contingência: LOCOCOR × obito_cardiovascular
|LOCOCOR |FALSE |TRUE |
|:------------------------------|:---------------|:--------------|
|Domicílio |61.4% (20,860) |38.6% (13,098) |
|Hospital |77.1% (116,833) |22.9% (34,787) |
|Outro estabelecimento de saúde |65.8% (8,901) |34.2% (4,632) |
|Outros |63.9% (2,404) |36.1% (1,360) |
|Via pública |72.3% (574) |27.7% (220) |
|NA |64.6% (31) |35.4% (17) |
Teste χ² (LOCOCOR vs obito_cardiovascular): X² = 4113.33, df = 4, p = 0
Table: Contingência: bimestre × obito_cardiovascular
|bimestre |FALSE |TRUE |
|:--------|:--------------|:-------------|
|Jan-Feb |67.9% (18,657) |32.1% (8,800) |
|Mar-Apr |72.6% (22,357) |27.4% (8,437) |
|May-Jun |75.9% (28,908) |24.1% (9,198) |
|Jul-Aug |75.2% (29,560) |24.8% (9,732) |
|Sep-Oct |73.3% (25,546) |26.7% (9,282) |
|Nov-Dec |73.9% (24,575) |26.1% (8,665) |
Teste χ² (bimestre vs obito_cardiovascular): X² = 618.86, df = 5, p = 1.7e-131
Table: Contingência: regiao_intermediaria × obito_cardiovascular
|regiao_intermediaria |FALSE |TRUE |
|:---------------------------|:--------------|:--------------|
|Araçatuba |75.7% (3,211) |24.3% (1,028) |
|Araraquara |73.0% (3,764) |27.0% (1,389) |
|Bauru |73.2% (6,327) |26.8% (2,311) |
|Campinas |72.4% (13,123) |27.6% (4,991) |
|Marília |69.8% (3,533) |30.2% (1,531) |
|Pouso Alegre |72.6% (4,389) |27.4% (1,653) |
|Presidente Prudente |72.6% (3,443) |27.4% (1,302) |
|Ribeirão Preto |73.2% (6,287) |26.8% (2,299) |
|Rio de Janeiro |71.2% (331) |28.8% (134) |
|São José do Rio Preto |75.3% (6,972) |24.7% (2,290) |
|São José dos Campos |72.6% (2,634) |27.4% (996) |
|São Paulo |73.7% (79,193) |26.3% (28,294) |
|Sorocaba |73.3% (12,977) |26.7% (4,726) |
|Uberaba |74.7% (1,363) |25.3% (462) |
|Varginha |74.6% (1,829) |25.4% (623) |
|Volta Redonda - Barra Mansa |68.8% (22) |31.2% (10) |
|NA |73.2% (205) |26.8% (75) |
Teste χ² (regiao_intermediaria vs obito_cardiovascular): X² = 85.79, df = 15, p = 6.01e-12
3.5.3 Resumo integrado
# Resumo apenas das variáveis selecionadas
analise_exploratoria %>%
select(
IDADEanos, SEXO, RACACOR, ESTCIV, ESC, LOCOCOR,
obito_cardiovascular, bimestre, regiao_intermediaria
) %>%
tbl_summary(
by = obito_cardiovascular,
statistic = list(
all_continuous() ~ "{mean} ({sd})",
all_categorical() ~ "{n} ({p}%)"
),
digits = all_continuous() ~ 1
) %>%
add_p() %>%
modify_header(label ~ "**Eventos cardiorrespiratórios**") %>%
bold_labels()| Eventos cardiorrespiratórios | TRUE N = 54,1141 |
FALSE N = 149,6031 |
p-value2 |
|---|---|---|---|
| IDADEanos | 77.6 (10.0) | 77.1 (10.1) | <0.001 |
| SEXO | <0.001 | ||
| Feminino | 27,352 (51%) | 72,827 (49%) | |
| Masculino | 26,759 (49%) | 76,757 (51%) | |
| Unknown | 3 | 19 | |
| RACACOR | <0.001 | ||
| Amarela | 825 (1.5%) | 2,678 (1.8%) | |
| Branca | 39,178 (74%) | 109,515 (75%) | |
| Indígena | 18 (<0.1%) | 78 (<0.1%) | |
| Parda | 9,598 (18%) | 25,076 (17%) | |
| Preta | 3,678 (6.9%) | 9,548 (6.5%) | |
| Unknown | 817 | 2,708 | |
| ESTCIV | <0.001 | ||
| Casado | 19,986 (39%) | 57,796 (40%) | |
| Separado judicialmente | 4,673 (9.0%) | 12,907 (9.0%) | |
| Solteiro | 6,593 (13%) | 18,175 (13%) | |
| União consensual | 866 (1.7%) | 2,496 (1.7%) | |
| Viúvo | 19,767 (38%) | 51,479 (36%) | |
| Unknown | 2,229 | 6,750 | |
| ESC | <0.001 | ||
| 1 a 3 anos | 12,388 (27%) | 33,666 (27%) | |
| 12 anos ou mais | 3,413 (7.4%) | 11,798 (9.3%) | |
| 4 a 7 anos | 15,127 (33%) | 39,660 (31%) | |
| 8 a 11 anos | 8,565 (19%) | 25,267 (20%) | |
| Nenhuma | 6,764 (15%) | 16,333 (13%) | |
| Unknown | 7,857 | 22,879 | |
| LOCOCOR | <0.001 | ||
| Domicílio | 13,098 (24%) | 20,860 (14%) | |
| Hospital | 34,787 (64%) | 116,833 (78%) | |
| Outro estabelecimento de saúde | 4,632 (8.6%) | 8,901 (6.0%) | |
| Outros | 1,360 (2.5%) | 2,404 (1.6%) | |
| Via pública | 220 (0.4%) | 574 (0.4%) | |
| Unknown | 17 | 31 | |
| bimestre | <0.001 | ||
| Jan-Feb | 8,800 (16%) | 18,657 (12%) | |
| Mar-Apr | 8,437 (16%) | 22,357 (15%) | |
| May-Jun | 9,198 (17%) | 28,908 (19%) | |
| Jul-Aug | 9,732 (18%) | 29,560 (20%) | |
| Sep-Oct | 9,282 (17%) | 25,546 (17%) | |
| Nov-Dec | 8,665 (16%) | 24,575 (16%) | |
| regiao_intermediaria | <0.001 | ||
| Araçatuba | 1,028 (1.9%) | 3,211 (2.1%) | |
| Araraquara | 1,389 (2.6%) | 3,764 (2.5%) | |
| Bauru | 2,311 (4.3%) | 6,327 (4.2%) | |
| Campinas | 4,991 (9.2%) | 13,123 (8.8%) | |
| Marília | 1,531 (2.8%) | 3,533 (2.4%) | |
| Pouso Alegre | 1,653 (3.1%) | 4,389 (2.9%) | |
| Presidente Prudente | 1,302 (2.4%) | 3,443 (2.3%) | |
| Ribeirão Preto | 2,299 (4.3%) | 6,287 (4.2%) | |
| Rio de Janeiro | 134 (0.2%) | 331 (0.2%) | |
| São José do Rio Preto | 2,290 (4.2%) | 6,972 (4.7%) | |
| São José dos Campos | 996 (1.8%) | 2,634 (1.8%) | |
| São Paulo | 28,294 (52%) | 79,193 (53%) | |
| Sorocaba | 4,726 (8.7%) | 12,977 (8.7%) | |
| Uberaba | 462 (0.9%) | 1,363 (0.9%) | |
| Varginha | 623 (1.2%) | 1,829 (1.2%) | |
| Volta Redonda - Barra Mansa | 10 (<0.1%) | 22 (<0.1%) | |
| Unknown | 75 | 205 | |
| 1 Mean (SD); n (%) | |||
| 2 Wilcoxon rank sum test; Pearson’s Chi-squared test | |||
4 Preparanod os dados para os algoritmos de aprendizado de máquina
4.1 Tratamento dos dados faltantes
4.1.1 Separando o dataset para análise
4.1.2 Avaliação dos dados faltantes
# 1) Vetor de N faltantes
n_miss <- sapply(dados_imputa, function(x) sum(is.na(x)))
# 2) Vetor de % faltantes
pct_miss <- sapply(dados_imputa, function(x) mean(is.na(x)) * 100)
# 3) Monta o tibble final
tabela_missing <- tibble(
Variável = names(n_miss),
`N faltantes` = as.integer(n_miss),
`% faltantes (%)`= round(pct_miss, 1)
)
# 4) Exibe com kable
kable(
tabela_missing,
caption = "Resumo de Missing por Variável em dados_imputa",
align = c("l", "r", "r")
)| Variável | N faltantes | % faltantes (%) |
|---|---|---|
| IDADEanos | 0 | 0.0 |
| RACACOR | 3525 | 1.7 |
| SEXO | 22 | 0.0 |
| ESTCIV | 8979 | 4.4 |
| ESC | 30736 | 15.1 |
| LOCOCOR | 48 | 0.0 |
| obito_cardiovascular | 0 | 0.0 |
| bimestre | 0 | 0.0 |
| regiao_intermediaria | 280 | 0.1 |
4.1.3 Visualizar padrões dos dados faltantes
# Gráfico
invisible(capture.output(
VIM::aggr(
dados_imputa,
col = c("steelblue", "tomato"),
numbers = FALSE, # sem contagens na barra
sortVars = TRUE,
labels = names(dados_imputa),
cex.axis = 0.8,
gap = 3,
ylab = c("Proporção","Número de missing")
)
))
4.1.4 Imputação dos dados faltantes
Optamos por ajustar um modelo de imputação individualizado para cada variável, em vez de aplicar um único método a todo o conjunto, justamente para evitar viés e respeitar a natureza de cada atributo.
• IDADEanos: não imputada, pois não apresenta valores faltantes.
• SEXO e obito_cardiovascular (binária): imputação por regressão logística (logreg), modelo ideal para respostas 0/1.
• RACACOR, ESTCIV, LOCOCOR, regiao_intermediaria (categóricas nominais): regressão polytomous (polyreg), indicada para fatores com múltiplas categorias sem hierarquia.
• ESC (ordinais): modelo de odds proporcionais (polr), que preserva a ordem natural dos níveis de escolaridade.
• bimestre: não imputada, pois está completa.
Dessa forma, cada variável é tratada com o método estatístico mais apropriado, garantindo imputações coerentes e minimizando distorções.
impute_mice_custom <- function(df, m = 5, maxit = 10, seed = 123) {
# 1) Inicializa um mids sem realmente imputar, só para obter métodos e predictorMatrix
init <- mice(df, maxit = 0, printFlag = FALSE)
meth <- init$method
predM <- init$predictorMatrix
# 2) Definir o método de imputação por variável # "" = não imputar; pmm, logreg, polyreg, polr conforme tipo
meth["IDADEanos"] <- "" # sem missing → não imputar
meth["RACACOR"] <- "polyreg" # nominal sem ordem
meth["SEXO"] <- "logreg" # binária
meth["ESTCIV"] <- "polyreg" # nominal sem ordem
meth["ESC"] <- "polr" # ordinal
meth["LOCOCOR"] <- "polyreg" # nominal sem ordem
meth["obito_cardiovascular"] <- "" # sem missing → não imputar
meth["bimestre"] <- "" # sem missing → não imputar
meth["regiao_intermediaria"] <- "polyreg" # nominal sem ordem
# 3) Ajustar a predictorMatrix para não usar a si mesma como preditor
diag(predM) <- 0
# 4) Executar a múltipla imputação
set.seed(seed)
mice_out <- mice(
data = df,
m = m,
maxit = maxit,
method = meth,
predictorMatrix = predM,
seed = seed,
printFlag = FALSE
)
# 5) Extrair o primeiro dataset completo
completed_df <- complete(mice_out, 1)
# 6) Retornar o objeto mids (para diagnóstico e pooling) e o dataset completo
list(
mids = mice_out,
complete = completed_df
)
}
4.1.5 Qualidade das imputações
CLIQUE NAS OPÇÕES ABAIXO PARA EXPLORAR OS RESULTADOS
4.1.6 Adicionando os dados imputados
4.1.7 Visualizar os dados pos imputação
# Gráfico
invisible(capture.output(
VIM::aggr(
dados_completos,
col = c("steelblue", "tomato"),
numbers = FALSE, # sem contagens na barra
sortVars = TRUE,
labels = names(dados_imputa),
cex.axis = 0.8,
gap = 3,
ylab = c("Proporção","Número de missing")
)
))
4.2 Seleção das Features
4.2.1 Separando uma amostra representativa
A função sample_validate() faz, em poucos passos:
- Cria uma amostra (10% por padrão) do seu df, opcionalmente estratificada pela variável-alvo.
- Separa as colunas em contínuas (numéricas) e categóricas (fatores).
- Para cada contínua, executa o teste de Kolmogorov–Smirnov (compara distribuições) e o t-test (compara médias), avaliando se a amostra reflete a base inteira.
- Para cada categórica, monta uma tabela cruzada “completo vs. amostra”, roda o qui-quadrado e calcula o Cramer’s V, indicando se as proporções mudaram.
- Se houver strata, compara também a proporção da classe-alvo (casos vs. controles) entre completo e amostrado.
- Imprime todos esses resultados em tabelas resumidas e retorna invisivelmente a própria amostra e os resumos estatísticos.
sample_validate <- function(df,
strata = NULL,
frac = 0.10,
alpha = 0.05,
seed = NULL) {
#------------------------------------------------------------
# #0) Configura semente (opcional) para reprodutibilidade
#------------------------------------------------------------
if (!is.null(seed)) set.seed(seed)
#------------------------------------------------------------
# #1) Amostragem: estratificada se strata informado, senão aleatória
#------------------------------------------------------------
if (!is.null(strata)) {
# particiona mantendo proporção da variável-alvo
idx <- caret::createDataPartition(df[[strata]], p = frac, list = FALSE)
} else {
# amostra simples sem estratificação
idx <- sample.int(nrow(df), size = floor(frac * nrow(df)))
}
df_samp <- df[idx, ]
#------------------------------------------------------------
# #2) Identificação de variáveis numéricas (contínuas) e fatores
#------------------------------------------------------------
cont_vars <- df %>% select(where(is.numeric)) %>% names()
cat_vars <- df %>% select(where(is.factor)) %>% names()
#------------------------------------------------------------
# #3) Testes para variáveis contínuas: KS test + t-test
#------------------------------------------------------------
cont_res <- lapply(cont_vars, function(var) {
x_full <- df[[var]]
x_smp <- df_samp[[var]]
# KS-test compara distribuições
ks <- tryCatch(ks.test(x_smp, x_full), error = function(e) NULL)
# t-test compara médias
ttp <- tryCatch(t.test(x_smp, x_full), error = function(e) NULL)
tibble::tibble(
variable = var,
mean_full = mean(x_full, na.rm = TRUE),
mean_samp = mean(x_smp, na.rm = TRUE),
sd_full = sd(x_full, na.rm = TRUE),
sd_samp = sd(x_smp, na.rm = TRUE),
p_ks = ifelse(is.null(ks), NA, ks$p.value),
p_ttest = ifelse(is.null(ttp), NA, ttp$p.value),
ks_ok = ifelse(is.null(ks), NA, ks$p.value >= alpha),
ttest_ok = ifelse(is.null(ttp), NA, ttp$p.value >= alpha)
)
}) %>% dplyr::bind_rows()
#------------------------------------------------------------
# #4) Testes para variáveis categóricas: Chi² + Cramer’s V
#------------------------------------------------------------
cat_res <- lapply(cat_vars, function(var) {
tbl_full <- table(df[[var]])
tbl_smp <- table(df_samp[[var]])
# monta matriz 2 x k (full vs samp)
m <- rbind(full = tbl_full, samp = tbl_smp)
chi <- tryCatch(chisq.test(m), error = function(e) NULL)
if (!is.null(chi)) {
# calcula Cramer’s V
n_tot <- sum(m)
phi2 <- chi$statistic / n_tot
k_levels <- ncol(m)
v <- sqrt(as.numeric(phi2) / (k_levels - 1))
p_chi <- chi$p.value
} else {
v <- NA
p_chi <- NA
}
tibble::tibble(
variable = var,
p_chi = p_chi,
cramer_v = v,
chi_ok = ifelse(is.null(chi), NA, p_chi >= alpha)
)
}) %>% dplyr::bind_rows()
#------------------------------------------------------------
# #5) Proporções do target (se strata fornecido)
#------------------------------------------------------------
target_res <- NULL
if (!is.null(strata)) {
prop_full <- prop.table(table(df[[strata]]))
prop_samp <- prop.table(table(df_samp[[strata]]))
target_res <- tibble::tibble(
variable = strata,
prop_full = paste0(round(100 * prop_full, 1), "%"),
prop_samp = paste0(round(100 * prop_samp, 1), "%")
)
}
#------------------------------------------------------------
# #6) Exibir resultados consolidados e retornar lista invisível
#------------------------------------------------------------
cat("\n-- CONTINUOUS VAR TESTS (KS & t-test) --\n")
print(cont_res)
cat("\n-- CATEGORICAL VAR TESTS (Chi² & Cramer’s V) --\n")
print(cat_res)
if (!is.null(target_res)) {
cat("\n-- TARGET PROPORTIONS --\n")
print(target_res)
}
invisible(list(
sample = df_samp,
cont_tests = cont_res,
cat_tests = cat_res,
target = target_res
))
}
4.2.1.1 Qualidade da amostragem
# Guardando os dados
train_df <- dados_completos
# 10% estratificado pelo target “obito_cardiovascular”
res <- sample_validate(
df = train_df,
strata = "obito_cardiovascular",
frac = 0.10,
alpha = 0.05,
seed = 42
)
-- CONTINUOUS VAR TESTS (KS & t-test) --
# A tibble: 1 × 9
variable mean_full mean_samp sd_full sd_samp p_ks p_ttest ks_ok ttest_ok
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> <lgl>
1 IDADEanos 77.2 77.2 10.1 10.1 0.933 0.818 TRUE TRUE
-- CATEGORICAL VAR TESTS (Chi² & Cramer’s V) --
# A tibble: 7 × 4
variable p_chi cramer_v chi_ok
<chr> <dbl> <dbl> <lgl>
1 RACACOR 0.335 0.00226 TRUE
2 SEXO 0.841 0.000423 TRUE
3 ESTCIV 0.834 0.00127 TRUE
4 ESC 0.977 0.000717 TRUE
5 LOCOCOR 0.677 0.00161 TRUE
6 bimestre 0.493 0.00198 TRUE
7 regiao_intermediaria 0.381 0.00218 TRUE
-- TARGET PROPORTIONS --
# A tibble: 2 × 3
variable prop_full prop_samp
<chr> <chr> <chr>
1 obito_cardiovascular 73.4% 73.4%
2 obito_cardiovascular 26.6% 26.6%
4.2.2 Boruta
Boruta é um método de seleção de variáveis construído sobre florestas aleatórias que busca, de maneira rigorosa, descobrir quais preditores têm impacto estatisticamente significativo no alvo. A cada iteração, o algoritmo gera “shadow features” — cópias embaralhadas das variáveis originais — e compara as importâncias obtidas em uma Random Forest. Quando uma variável real demonstra, de forma consistente, importância maior do que todas as shadows, ela é “confirmada”; caso contrário, é “rejeitada”. Esse processo itera até atingir um número máximo de rodadas ou esgotar as decisões sobre cada atributo, garantindo que apenas as variáveis verdadeiramente informativas sejam mantidas.
No código, configuração do Boruta:
• obito_cardiovascular ~ . define que todas as colunas do train_small (exceto o alvo) devem ser testadas como potenciais preditoras.
• data = train_small indica o data frame de treino já pré-processado e sem valores faltantes.
• doTrace = 2 ajusta o grau de verbosidade, mostrando no console o progresso detalhado de cada iteração (quantas variáveis foram confirmadas ou rejeitadas).
• maxRuns = 100 limita o número máximo de ciclos de Random Forest executados, assegurando tempo de processamento controlado mesmo em bases maiores.
4.2.2.1 Plote dos atributos
4.2.2.2 Variaveis finais
[1] "IDADEanos" "ESTCIV" "ESC"
[4] "LOCOCOR" "bimestre" "regiao_intermediaria"
4.2.3 Permutation Importance
Permutation Importance é uma técnica de pós-treinamento que quantifica o quanto cada variável contribui para o desempenho de um modelo. Funciona assim: após treinar o modelo (por exemplo, uma floresta aleatória), “embaralha-se” uma coluna de entrada mantendo todas as outras inalteradas, e avalia-se a queda na métrica (no nosso caso, AUC). Se a permutação de uma variável causar grande degradação no AUC, significa que o modelo dependia fortemente dela — logo, sua importância é alta. Variáveis que, quando embaralhadas, pouco afetam a métrica, têm baixa importância.
4.2.3.1 Conversão do target
- Preparação do alvo: converteram obito_cardiovascular para fator (FALSE/TRUE) para que o ranger retornasse probabilidades por classe.
4.2.3.2 Treinamento do modelo
- Treino do modelo: ajustaram um Random Forest probabilístico com 500 árvores (ranger(…, probability = TRUE)), garantindo tratamento nativo de fatores não ordenados.
4.2.3.3 Iniciando a permutação
- Chamada ao vi_permute: executaram cinco rodadas de permutações em cada variável, usando AUC como métrica de referência e um pred_wrapper que extrai a probabilidade da classe “TRUE”.
# --- 3) Chamar vi_permute para Permutation Importance
set.seed(42)
perm_imp <- vi_permute(
object = rf_model,
feature_names = setdiff(names(train_small), "obito_cardiovascular"),
target = train_small$obito_cardiovascular,
metric = yardstick::roc_auc_vec,
nsim = 5,
train = train_small,
pred_wrapper = function(object, newdata) {
# retorna a probabilidade da classe "TRUE"
preds <- predict(object, data = newdata)$predictions
# em ranger + probability, 'predictions' é matrix com colnames = levels
preds[, "TRUE"]
},
smaller_is_better = FALSE
)
4.2.3.4 Vusalização dos resultados
- Visualização: imprimiram o data-frame com os valores de importância (queda média de AUC e desvio-padrão) e geraram o gráfico com vip::vip(), facilitando a comparação visual entre as features.
# A tibble: 8 × 3
Variable Importance StDev
<chr> <dbl> <dbl>
1 IDADEanos -0.212 0.00286
2 RACACOR -0.0869 0.00196
3 SEXO -0.0921 0.000843
4 ESTCIV -0.135 0.00256
5 ESC -0.153 0.00307
6 LOCOCOR -0.165 0.00256
7 bimestre -0.197 0.00328
8 regiao_intermediaria -0.152 0.00141
5 Escolhendo o melhor modelo
5.1 Validação interna do modelo
5.1.1 Seleção das colunas de interesse
Aqui selecionamos apenas as colunas de interesse (idade, estrato civil, escolaridade, local de óbito, bimestre, região intermediária e o alvo — óbito cardiovascular) e convertemos o target de lógico para inteiro (0/1), pois o CatBoost trabalha internamente com números em problemas de classificação binária. Isso garante que, na hora de criar os Pools, todas as features estejam no formato esperado e que o modelo saiba diferenciar as classes.
# =============================================================================
# 1) PREPARAR O DATASET DE TRABALHO (COMPLETO)
# =============================================================================
df_work <- dados_completos %>%
select(
IDADEanos,
ESTCIV,
ESC,
LOCOCOR,
bimestre,
regiao_intermediaria,
obito_cardiovascular
) %>%
mutate(
# CatBoost e XGBoost esperam 0/1 para classificação binária
obito_cardiovascular = as.integer(obito_cardiovascular)
)
# =============================================================================
# 2) AMOSTRAGEM REDUZIDA (10% estratificado) via sample_validate()
# =============================================================================
# (usa a função sample_validate que você já criou lá em cima)
res_sm <- sample_validate(
df = df_work,
strata = "obito_cardiovascular", # garante mesma proporção de classes
frac = 0.10, # 10% da base
seed = 42
)
-- CONTINUOUS VAR TESTS (KS & t-test) --
# A tibble: 2 × 9
variable mean_full mean_samp sd_full sd_samp p_ks p_ttest ks_ok ttest_ok
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> <lgl>
1 IDADEanos 77.2 77.2 10.1 10.2 0.962 0.963 TRUE TRUE
2 obito_cardio… 0.266 0.265 0.442 0.441 1 0.838 TRUE TRUE
-- CATEGORICAL VAR TESTS (Chi² & Cramer’s V) --
# A tibble: 5 × 4
variable p_chi cramer_v chi_ok
<chr> <dbl> <dbl> <lgl>
1 ESTCIV 0.812 0.00133 TRUE
2 ESC 0.424 0.00208 TRUE
3 LOCOCOR 0.726 0.00151 TRUE
4 bimestre 0.730 0.00158 TRUE
5 regiao_intermediaria 0.803 0.00175 TRUE
-- TARGET PROPORTIONS --
# A tibble: 2 × 3
variable prop_full prop_samp
<chr> <chr> <chr>
1 obito_cardiovascular 73.4% 73.5%
2 obito_cardiovascular 26.6% 26.5%
5.1.2 Separando o dataset de validação
Utilizamos a função personalizada split_dados() para automatizar a separação dos dados em conjuntos de treino e validação, mantendo a integridade do dataset original. Essa função aplica o initial_split() do pacote {rsample}, alocando 80% dos dados para o conjunto de treino/tuning interno e 20% para validação prévia.
O argumento strata = obito_cardiovascular é utilizado internamente na função para garantir que a proporção de eventos (óbito) e não eventos seja mantida em ambos os conjuntos, evitando vieses relacionados ao desbalanceamento da variável de desfecho.
Além disso, a função permite definir um sufixo personalizado, que é incorporado aos nomes dos novos objetos criados no ambiente global, como treino_cat e valid_cat, facilitando a organização e o rastreamento das divisões realizadas para diferentes modelos.
split_dados <- function(df, suffix) {
set.seed(42) # manter reprodutibilidade
# Faz o split estratificado pela variável "obito_cardiovascular"
split_i <- initial_split(df, prop = 0.80, strata = obito_cardiovascular)
treino <- training(split_i)
valid <- testing(split_i)
# Cria objetos com nomes dinâmicos no ambiente global
assign(paste0("treino_", suffix), treino, envir = .GlobalEnv)
assign(paste0("valid_", suffix), valid, envir = .GlobalEnv)
message("Objetos criados: ", paste0("treino_", suffix), " e ", paste0("valid_", suffix))
}
5.2 Modelos
# =============================================================================
# BASELINE — Regressão Logística
# =============================================================================
# 0) Separação dos dados com a função personalizada
split_dados(df_work_smal, "logit") # cria treino_logit e valid_logit
# 1) Defina quais colunas são categóricas e o alvo
cat_feats <- c("ESTCIV", "ESC", "LOCOCOR", "bimestre", "regiao_intermediaria")
label_col <- "obito_cardiovascular"
# 2) Garanta que as categóricas sejam fatores e o target seja fator 0/1
treino_logit <- treino_logit %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
valid_logit <- valid_logit %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
# 3) Ajuste do modelo de regressão logística
logit_model <- glm(
formula = obito_cardiovascular ~ .,
data = treino_logit,
family = binomial(link = "logit")
)
# 4) Geração de previsões de probabilidade no conjunto de validação
logit_preds <- predict(
object = logit_model,
newdata = valid_logit,
type = "response"
)
# 5) Cálculo de métricas de avaliação do modelo
# Garante que truth seja fator com níveis 0 e 1
eval_tbl <- tibble(
truth = factor(valid_logit[[label_col]], levels = c(0, 1)),
pred_prob = logit_preds,
pred_class = factor(ifelse(logit_preds >= 0.5, 1, 0), levels = c(0, 1))
)
# AUC-ROC
auc_roc <- roc(eval_tbl$truth, eval_tbl$pred_prob)$auc
# AUC-PR
pr <- evalmod(scores = eval_tbl$pred_prob, labels = as.numeric(as.character(eval_tbl$truth)))
auc_pr <- auc(pr)$aucs[2] # PRC = linha 2
# Usa apenas funções do yardstick explicitamente
metrics_all <- yardstick::metric_set(
yardstick::accuracy,
yardstick::precision,
yardstick::recall,
yardstick::specificity,
yardstick::f_meas
)
# Avaliação
res <- metrics_all(eval_tbl, truth = truth, estimate = pred_class)
# Brier Score (calculado manualmente)
brier <- mean((eval_tbl$pred_prob - as.numeric(as.character(eval_tbl$truth)))^2)
# Guardar todas as métricas em uma lista
metrics_logit <- list(
auc_roc = auc_roc,
auc_pr = auc_pr,
accuracy = res %>% filter(.metric == "accuracy") %>% pull(.estimate),
precision = res %>% filter(.metric == "precision") %>% pull(.estimate),
recall = res %>% filter(.metric == "recall") %>% pull(.estimate),
specificity = res %>% filter(.metric == "specificity") %>% pull(.estimate),
f1_score = res %>% filter(.metric == "f_meas") %>% pull(.estimate),
brier_score = brier
)
# Mensagem de saída
# message("Métricas — Regressão Logística")
# print(metrics_logit)
Random Forest é um ensemble de várias árvores de decisão treinadas em subconjuntos bootstrap dos dados, onde cada divisão considera apenas um subconjunto aleatório de variáveis. Isso reduz overfitting, lida bem com relações não lineares e ruído, e combina as previsões de todas as árvores por voto majoritário, tornando-o robusto para classificação de eventos raros como óbito cardiovascular.
- Predição com o modelo pré-treinado: Chamamos predict(rf_model, data = valid_i) para gerar, a partir do objeto rf_model (já ajustado sobre o treino interno), as probabilidades de cada observação de pertencer à classe “1” (evento de óbito cardiovascular).
- Extração da coluna de probabilidades: Como o objeto retornado é uma array sem nomes de colunas, acessamos a segunda coluna via [, 2], que corresponde à probabilidade da classe “1” (a primeira coluna seria a probabilidade da classe “0”).
- Cálculo da AUC: Com o vetor de probabilidades (rf_preds) e o vetor de rótulos verdadeiros (valid_i[[label_col]]), usamos o pacote pROC para construir a curva ROC (roc(…)) e extrair sua área sob a curva ($auc).
- Impressão do resultado: Por fim, a AUC é arredondada e exibida com message(), fornecendo um indicador unificado de quão bem o Random Forest separa casos de óbito cardiovascular (classe “1”) de não-óbito (classe “0”) no conjunto de validação interna.
# =============================================================================
# BASELINE — Random Forest (ranger)
# =============================================================================
# 0) Separação dos dados com a função personalizada
split_dados(df_work_smal, "rf") # cria treino_rf e valid_rf
# 1) Definição das variáveis categóricas e da variável alvo
cat_feats <- c("ESTCIV", "ESC", "LOCOCOR", "bimestre", "regiao_intermediaria")
label_col <- "obito_cardiovascular"
# 2) Conversão das variáveis categóricas para fatores
treino_rf <- treino_rf %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
valid_rf <- valid_rf %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
# 3) Cálculo dos pesos de caso para lidar com desbalanceamento
tab <- table(treino_rf[[label_col]])
n_neg <- as.numeric(tab["0"])
n_pos <- as.numeric(tab["1"])
case_wts <- ifelse(treino_rf[[label_col]] == 1, n_neg / n_pos, 1)
# 4) Treinamento do modelo Random Forest com ranger
library(ranger)
set.seed(42)
rf_model <- ranger(
formula = obito_cardiovascular ~ .,
data = treino_rf,
probability = TRUE,
respect.unordered.factors = TRUE,
num.trees = 500,
case.weights = case_wts
)
# 5) Geração de previsões de probabilidade para o conjunto de validação
rf_pred_obj <- predict(rf_model, data = valid_rf)
rf_preds <- rf_pred_obj$predictions[, 2] # prob da classe "1"
# 6) Avaliação do modelo — cálculo de métricas
# Tabela de avaliação com classe real e predição
eval_tbl <- tibble(
truth = factor(valid_rf[[label_col]], levels = c(0, 1)),
pred_prob = rf_preds,
pred_class = factor(ifelse(rf_preds >= 0.5, 1, 0), levels = c(0, 1))
)
# AUC-ROC
auc_roc <- roc(eval_tbl$truth, eval_tbl$pred_prob)$auc
# AUC-PR
pr <- evalmod(scores = eval_tbl$pred_prob, labels = as.numeric(as.character(eval_tbl$truth)))
auc_pr <- auc(pr)$aucs[2]
# Métricas com yardstick
metrics_all <- yardstick::metric_set(
yardstick::accuracy,
yardstick::precision,
yardstick::recall,
yardstick::specificity,
yardstick::f_meas
)
res <- metrics_all(eval_tbl, truth = truth, estimate = pred_class)
# Brier Score (calibração)
brier <- mean((eval_tbl$pred_prob - as.numeric(as.character(eval_tbl$truth)))^2)
# Armazenar métricas em lista nomeada
metrics_rf <- list(
auc_roc = auc_roc,
auc_pr = auc_pr,
accuracy = res %>% filter(.metric == "accuracy") %>% pull(.estimate),
precision = res %>% filter(.metric == "precision") %>% pull(.estimate),
recall = res %>% filter(.metric == "recall") %>% pull(.estimate),
specificity = res %>% filter(.metric == "specificity") %>% pull(.estimate),
f1_score = res %>% filter(.metric == "f_meas") %>% pull(.estimate),
brier_score = brier
)
# 7) Mensagem final com métricas
message("Métricas — Random Forest")
print(metrics_rf)$auc_roc
Area under the curve: 0.5641
$auc_pr
[1] 0.3167895
$accuracy
[1] 0.6117791
$precision
[1] 0.7627371
$recall
[1] 0.684808
$specificity
[1] 0.4092593
$f1_score
[1] 0.7216749
$brier_score
[1] 0.2344599
# =============================================================================
# BASELINE — SVM (RBF) com e1071
# =============================================================================
# 0) Separação dos dados com a função personalizada
split_dados(df_work_smal, "svm") # cria treino_svm e valid_svm
# 1) Definição das variáveis categóricas e da variável alvo
cat_feats <- c("ESTCIV", "ESC", "LOCOCOR", "bimestre", "regiao_intermediaria")
label_col <- "obito_cardiovascular"
# 2) Conversão das variáveis categóricas e alvo em fatores
treino_svm <- treino_svm %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
valid_svm <- valid_svm %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
# 3) Construção da fórmula do modelo com variáveis explícitas
svm_formula <- as.formula(
paste(label_col, "~", paste(c("IDADEanos", cat_feats), collapse = " + "))
)
# 4) Cálculo dos pesos para compensar desbalanceamento
tab <- table(treino_svm[[label_col]])
n_neg <- as.numeric(tab["0"])
n_pos <- as.numeric(tab["1"])
class_wt <- c("0" = 1, "1" = n_neg / n_pos)
# 5) Treinamento do modelo SVM com kernel radial
library(e1071)
set.seed(42)
svm_model <- svm(
formula = svm_formula,
data = treino_svm,
kernel = "radial",
class.weights = class_wt,
probability = TRUE
)
# 6) Geração de probabilidades no conjunto de validação
svm_preds <- predict(svm_model, newdata = valid_svm, probability = TRUE)
svm_probs <- attr(svm_preds, "probabilities")[, "1"] # prob da classe 1
# 7) Avaliação do modelo — cálculo das métricas
# Construção da tabela de avaliação
eval_tbl <- tibble(
truth = factor(valid_svm[[label_col]], levels = c(0, 1)),
pred_prob = svm_probs,
pred_class = factor(ifelse(svm_probs >= 0.5, 1, 0), levels = c(0, 1))
)
# AUC-ROC
auc_roc <- roc(eval_tbl$truth, eval_tbl$pred_prob)$auc
# AUC-PR
pr <- evalmod(scores = eval_tbl$pred_prob, labels = as.numeric(as.character(eval_tbl$truth)))
auc_pr <- auc(pr)$aucs[2]
# Métricas com yardstick
metrics_all <- yardstick::metric_set(
yardstick::accuracy,
yardstick::precision,
yardstick::recall,
yardstick::specificity,
yardstick::f_meas
)
res <- metrics_all(eval_tbl, truth = truth, estimate = pred_class)
# Brier Score
brier <- mean((eval_tbl$pred_prob - as.numeric(as.character(eval_tbl$truth)))^2)
# Guardar todas as métricas em uma lista
metrics_svm <- list(
auc_roc = auc_roc,
auc_pr = auc_pr,
accuracy = res %>% filter(.metric == "accuracy") %>% pull(.estimate),
precision = res %>% filter(.metric == "precision") %>% pull(.estimate),
recall = res %>% filter(.metric == "recall") %>% pull(.estimate),
specificity = res %>% filter(.metric == "specificity") %>% pull(.estimate),
f1_score = res %>% filter(.metric == "f_meas") %>% pull(.estimate),
brier_score = brier
)
# 8) Mensagem final
message("Métricas — SVM (RBF)")
print(metrics_svm)$auc_roc
Area under the curve: 0.5854
$auc_pr
[1] 0.3335325
$accuracy
[1] 0.7349693
$precision
[1] 0.7349693
$recall
[1] 1
$specificity
[1] 0
$f1_score
[1] 0.8472419
$brier_score
[1] 0.1924353
# =============================================================================
# BASELINE — LightGBM
# =============================================================================
# 0) Separação dos dados com a função personalizada
split_dados(df_work_smal, "lgbm") # cria treino_lgbm e valid_lgbm
# 1) Definição das variáveis categóricas e alvo
cat_feats <- c("ESTCIV", "ESC", "LOCOCOR", "bimestre", "regiao_intermediaria")
label_col <- "obito_cardiovascular"
# 2) Preparação: conversão dos fatores para inteiros (LightGBM requer numeric)
treino_lgbm <- treino_lgbm %>%
mutate(
across(all_of(cat_feats), ~ as.integer(as.factor(.))),
!!label_col := as.integer(as.character(.data[[label_col]]))
)
valid_lgbm <- valid_lgbm %>%
mutate(
across(all_of(cat_feats), ~ as.integer(as.factor(.))),
!!label_col := as.integer(as.character(.data[[label_col]]))
)
# 3) Criação de objetos de dataset do LightGBM
library(lightgbm)
# Separar X e y
X_train <- treino_lgbm %>% select(-all_of(label_col)) %>% as.matrix()
y_train <- treino_lgbm[[label_col]]
X_valid <- valid_lgbm %>% select(-all_of(label_col)) %>% as.matrix()
y_valid <- valid_lgbm[[label_col]]
# 4) Cálculo dos pesos para balanceamento de classes
tab <- table(y_train)
n_neg <- as.numeric(tab["0"])
n_pos <- as.numeric(tab["1"])
class_wts <- ifelse(y_train == 1, n_neg / n_pos, 1)
# Dataset LightGBM com pesos
dtrain <- lgb.Dataset(data = X_train, label = y_train, weight = class_wts)
dvalid <- lgb.Dataset(data = X_valid, label = y_valid)
# 5) Treinamento do modelo
params <- list(
objective = "binary",
metric = "auc",
boosting_type = "gbdt",
verbosity = -1
)
set.seed(42)
lgbm_model <- lgb.train(
params = params,
data = dtrain,
nrounds = 100,
valids = list(valid = dvalid),
verbose = 0
)
# 6) Previsão no conjunto de validação
lgbm_preds <- predict(lgbm_model, X_valid)
# 7) Avaliação do modelo com múltiplas métricas
eval_tbl <- tibble(
truth = factor(y_valid, levels = c(0, 1)),
pred_prob = lgbm_preds,
pred_class = factor(ifelse(lgbm_preds >= 0.5, 1, 0), levels = c(0, 1))
)
# AUC-ROC
auc_roc <- roc(eval_tbl$truth, eval_tbl$pred_prob)$auc
# AUC-PR
pr <- evalmod(scores = eval_tbl$pred_prob, labels = as.numeric(as.character(eval_tbl$truth)))
auc_pr <- auc(pr)$aucs[2]
# Métricas de classificação com yardstick
metrics_all <- yardstick::metric_set(
yardstick::accuracy,
yardstick::precision,
yardstick::recall,
yardstick::specificity,
yardstick::f_meas
)
res <- metrics_all(eval_tbl, truth = truth, estimate = pred_class)
# Brier Score
brier <- mean((eval_tbl$pred_prob - as.numeric(as.character(eval_tbl$truth)))^2)
# Lista final de métricas
metrics_lgbm <- list(
auc_roc = auc_roc,
auc_pr = auc_pr,
accuracy = res %>% filter(.metric == "accuracy") %>% pull(.estimate),
precision = res %>% filter(.metric == "precision") %>% pull(.estimate),
recall = res %>% filter(.metric == "recall") %>% pull(.estimate),
specificity = res %>% filter(.metric == "specificity") %>% pull(.estimate),
f1_score = res %>% filter(.metric == "f_meas") %>% pull(.estimate),
brier_score = brier
)
# 8) Saída final
# message("Métricas — LightGBM")
# print(metrics_lgbm)
Construímos um modelo rápido de CatBoost diretamente pelas funções nativas do pacote:
• Transformamos as variáveis categóricas em fatores para que o CatBoost as trate corretamente.
• Criamos dois Pools (pool_tr_i e pool_vl_i), que encapsulam features e labels.
• Montamos uma lista de parâmetros básicos (iterations = 100, depth = 6, learning_rate = 0.1, loss_function = “Logloss”, eval_metric = “AUC”, logging_level = “Silent”) e class_weights = c(1, N_false/N_true) para penalizar mais os eventos raros e equilibrar as classes.
• Chamamos catboost.train() para ajustar o modelo no conjunto de treino e, em seguida, catboost.predict() para gerar probabilidades no conjunto de validação interna.
• Por fim, calculamos a AUC com o pacote pROC, estabelecendo um ponto de comparação inicial antes de qualquer tuning.
# =============================================================================
# BASELINE — CatBoost
# =============================================================================
# 0) Separação dos dados com a função personalizada
split_dados(df_work_smal, "cat") # cria treino_cat e valid_cat
# 1) Definição das variáveis categóricas e da variável alvo
cat_feats <- c("ESTCIV", "ESC", "LOCOCOR", "bimestre", "regiao_intermediaria")
label_col <- "obito_cardiovascular"
# 2) Conversão para fatores
treino_cat <- treino_cat %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
valid_cat <- valid_cat %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
# 3) Criação dos pools de dados para o CatBoost
library(catboost)
pool_tr_cat <- catboost.load_pool(
data = select(treino_cat, -all_of(label_col)),
label = as.numeric(as.character(treino_cat[[label_col]]))
)
pool_vl_cat <- catboost.load_pool(
data = select(valid_cat, -all_of(label_col)),
label = as.numeric(as.character(valid_cat[[label_col]]))
)
# 4) Definição dos pesos de classe para desbalanceamento
tab <- table(treino_cat[[label_col]])
n_neg <- as.numeric(tab["0"])
n_pos <- as.numeric(tab["1"])
class_weights <- c(1, n_neg / n_pos) # classe 0 = 1, classe 1 = peso ajustado
# 5) Parâmetros do modelo
params_cat <- list(
iterations = 100,
depth = 6,
learning_rate = 0.1,
loss_function = "Logloss",
eval_metric = "AUC",
logging_level = "Silent",
class_weights = class_weights
)
# 6) Treinamento do modelo
model_cat <- catboost.train(
learn_pool = pool_tr_cat,
test_pool = NULL,
params = params_cat
)
# 7) Previsão de probabilidade no conjunto de validação
preds_cat <- catboost.predict(
model = model_cat,
pool = pool_vl_cat,
prediction_type = "Probability"
)
# 8) Avaliação do modelo com múltiplas métricas
eval_tbl <- tibble(
truth = factor(valid_cat[[label_col]], levels = c(0, 1)),
pred_prob = preds_cat,
pred_class = factor(ifelse(preds_cat >= 0.5, 1, 0), levels = c(0, 1))
)
# AUC-ROC
auc_roc <- roc(eval_tbl$truth, eval_tbl$pred_prob)$auc
# AUC-PR
pr <- evalmod(scores = eval_tbl$pred_prob, labels = as.numeric(as.character(eval_tbl$truth)))
auc_pr <- auc(pr)$aucs[2]
# Métricas com yardstick
metrics_all <- yardstick::metric_set(
yardstick::accuracy,
yardstick::precision,
yardstick::recall,
yardstick::specificity,
yardstick::f_meas
)
res <- metrics_all(eval_tbl, truth = truth, estimate = pred_class)
# Brier Score
brier <- mean((eval_tbl$pred_prob - as.numeric(as.character(eval_tbl$truth)))^2)
# 9) Armazenar métricas em lista nomeada
metrics_cat <- list(
auc_roc = auc_roc,
auc_pr = auc_pr,
accuracy = res %>% filter(.metric == "accuracy") %>% pull(.estimate),
precision = res %>% filter(.metric == "precision") %>% pull(.estimate),
recall = res %>% filter(.metric == "recall") %>% pull(.estimate),
specificity = res %>% filter(.metric == "specificity") %>% pull(.estimate),
f1_score = res %>% filter(.metric == "f_meas") %>% pull(.estimate),
brier_score = brier
)
# 10) Saída final
# message("Métricas — CatBoost")
# print(metrics_cat)
Para a etapa de baseline, implementou-se um classificador XGBoost de forma “manual”, conforme descrito a seguir. Inicialmente, procedeu-se ao one-hot encoding das variáveis categóricas, assegurando a conversão adequada de fatores em uma matriz esparsa de indicadores binários, requisito para o treinamento do XGBoost. Em seguida, construíram-se os objetos xgb.DMatrix correspondentes aos conjuntos de treino (dtrain) e validação interna (dvalid), cada um contendo as features codificadas e o vetor de rótulos binários.
Os hiperparâmetros iniciais foram fixados em valores comumente empregados para classificação binária:
• objective = “binary:logistic” (função de perda para problemas binários);
• eval_metric = “auc” (métrica de área sob a curva ROC);
• max_depth = 6 (profundidade máxima de cada árvore de decisão);
• eta = 0.1 (taxa de aprendizado);
• nrounds = 100 (número de iterações de boosting);
• scale_pos_weight = (peso aplicado à classe minoritária, para mitigar o viés introduzido pelo desbalanceamento 73,4 % vs. 26,6 % de não-eventos vs. eventos).
O modelo foi ajustado por meio de xgb.train(), utilizando o conjunto de treino e monitorando a performance em dvalid. Após a finalização do treinamento, as probabilidades preditas sobre o conjunto de validação interna foram extraídas com predict(), e a AUC foi calculada utilizando a função roc() do pacote pROC. Este valor de AUC serviu como referência inicial — antes da otimização de hiperparâmetros — para quantificar a capacidade discriminativa do modelo em identificar óbitos por causas cardiovasculares em idosos.
# =============================================================================
# BASELINE — XGBoost
# =============================================================================
# 0) Separação dos dados com a função personalizada
split_dados(df_work_smal, "xgb") # cria treino_xgb e valid_xgb
# 1) Definição das variáveis categóricas e alvo
cat_feats <- c("ESTCIV", "ESC", "LOCOCOR", "bimestre", "regiao_intermediaria")
label_col <- "obito_cardiovascular"
# 2) Garantir que categóricas estejam como fator
treino_xgb <- treino_xgb %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := as.integer(as.character(.data[[label_col]]))
)
valid_xgb <- valid_xgb %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := as.integer(as.character(.data[[label_col]]))
)
# 3) One-hot encoding das variáveis
train_mat <- model.matrix(
~ . - 1,
data = select(treino_xgb, IDADEanos, all_of(cat_feats))
)
valid_mat <- model.matrix(
~ . - 1,
data = select(valid_xgb, IDADEanos, all_of(cat_feats))
)
# 4) Extração do vetor de rótulos
train_label <- treino_xgb[[label_col]]
valid_label <- valid_xgb[[label_col]]
# 5) Cálculo de scale_pos_weight
tab <- table(train_label)
scale_pos_weight <- as.numeric(tab["0"] / tab["1"])
# 6) Criação dos DMatrix com pesos
dtrain <- xgb.DMatrix(
data = train_mat,
label = train_label,
weight = ifelse(train_label == 1, scale_pos_weight, 1)
)
dvalid <- xgb.DMatrix(
data = valid_mat,
label = valid_label
)
# 7) Parâmetros e treino do modelo
params_xgb <- list(
objective = "binary:logistic",
eval_metric = "auc",
max_depth = 6,
eta = 0.1,
scale_pos_weight = scale_pos_weight,
verbosity = 0
)
set.seed(42)
model_xgb <- xgb.train(
params = params_xgb,
data = dtrain,
nrounds = 100,
watchlist = list(val = dvalid),
early_stopping_rounds = 10,
verbose = 0
)
# 8) Previsão no conjunto de validação
preds_xgb <- predict(model_xgb, dvalid)
# 9) Avaliação com múltiplas métricas
eval_tbl <- tibble(
truth = factor(valid_label, levels = c(0, 1)),
pred_prob = preds_xgb,
pred_class = factor(ifelse(preds_xgb >= 0.5, 1, 0), levels = c(0, 1))
)
# AUC-ROC
auc_roc <- roc(eval_tbl$truth, eval_tbl$pred_prob)$auc
# AUC-PR
pr <- evalmod(scores = eval_tbl$pred_prob, labels = as.numeric(as.character(eval_tbl$truth)))
auc_pr <- auc(pr)$aucs[2]
# Métricas com yardstick
metrics_all <- yardstick::metric_set(
yardstick::accuracy,
yardstick::precision,
yardstick::recall,
yardstick::specificity,
yardstick::f_meas
)
res <- metrics_all(eval_tbl, truth = truth, estimate = pred_class)
# Brier Score
brier <- mean((eval_tbl$pred_prob - as.numeric(as.character(eval_tbl$truth)))^2)
# 10) Consolidar métricas
metrics_xgb <- list(
auc_roc = auc_roc,
auc_pr = auc_pr,
accuracy = res %>% filter(.metric == "accuracy") %>% pull(.estimate),
precision = res %>% filter(.metric == "precision") %>% pull(.estimate),
recall = res %>% filter(.metric == "recall") %>% pull(.estimate),
specificity = res %>% filter(.metric == "specificity") %>% pull(.estimate),
f1_score = res %>% filter(.metric == "f_meas") %>% pull(.estimate),
brier_score = brier
)
# 11) Saída final
message("Métricas — XGBoost")
print(metrics_xgb)$auc_roc
Area under the curve: 0.5829
$auc_pr
[1] 0.3253897
$accuracy
[1] 0.2743558
$precision
[1] 0.7638889
$recall
[1] 0.01836394
$specificity
[1] 0.9842593
$f1_score
[1] 0.03586567
$brier_score
[1] 0.3209829
# =============================================================================
# STACKING ENSEMBLE
# =============================================================================
# 0) Separar dados
split_dados(df_work_smal, "stack") # cria treino_stack e valid_stack
# 1) Definir variáveis categóricas e alvo
cat_feats <- c("ESTCIV", "ESC", "LOCOCOR", "bimestre", "regiao_intermediaria")
label_col <- "obito_cardiovascular"
# 2) Pré-processamento
treino_stack <- treino_stack %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
valid_stack <- valid_stack %>%
mutate(
across(all_of(cat_feats), as.factor),
!!label_col := factor(.data[[label_col]], levels = c(0, 1))
)
# ===============================================
# 3) MODELOS BASE: RF, SVM, LGBM
# ===============================================
# >>> Random Forest
tab_rf <- table(treino_stack[[label_col]])
case_wts <- ifelse(treino_stack[[label_col]] == 1, tab_rf["0"]/tab_rf["1"], 1)
rf_model <- ranger(
formula = obito_cardiovascular ~ .,
data = treino_stack,
probability = TRUE,
respect.unordered.factors = TRUE,
num.trees = 500,
case.weights = case_wts
)
rf_preds <- predict(rf_model, data = valid_stack)$predictions[, 2]
# >>> SVM
tab_svm <- table(treino_stack[[label_col]])
class_wt <- c("0" = 1, "1" = as.numeric(tab_svm["0"] / tab_svm["1"]))
svm_model <- svm(
formula = obito_cardiovascular ~ IDADEanos + ESTCIV + ESC + LOCOCOR + bimestre + regiao_intermediaria,
data = treino_stack,
kernel = "radial",
class.weights = class_wt,
probability = TRUE
)
svm_probs <- attr(predict(svm_model, newdata = valid_stack, probability = TRUE), "probabilities")[, "1"]
# >>> LightGBM
treino_lgb <- treino_stack %>%
mutate(across(all_of(cat_feats), ~ as.integer(as.factor(.))), !!label_col := as.integer(as.character(.data[[label_col]])))
valid_lgb <- valid_stack %>%
mutate(across(all_of(cat_feats), ~ as.integer(as.factor(.))), !!label_col := as.integer(as.character(.data[[label_col]])))
X_train <- treino_lgb %>% select(-all_of(label_col)) %>% as.matrix()
y_train <- treino_lgb[[label_col]]
X_valid <- valid_lgb %>% select(-all_of(label_col)) %>% as.matrix()
y_valid <- valid_lgb[[label_col]]
tab_lgb <- table(y_train)
wts_lgb <- ifelse(y_train == 1, tab_lgb["0"] / tab_lgb["1"], 1)
dtrain_lgb <- lgb.Dataset(data = X_train, label = y_train, weight = wts_lgb)
lgb_model <- lgb.train(
params = list(objective = "binary", learning_rate = 0.1, metric = "auc", verbosity = -1),
data = dtrain_lgb,
nrounds = 100
)
lgb_preds <- predict(lgb_model, X_valid)
# ===============================================
# 4) META-MODELO: Regressão logística
# ===============================================
stack_tbl <- tibble(
rf = rf_preds,
svm = svm_probs,
lgb = lgb_preds,
obs = valid_stack[[label_col]]
)
meta_model <- glm(obs ~ rf + svm + lgb, data = stack_tbl, family = binomial)
meta_preds <- predict(meta_model, type = "response")
# ===============================================
# 5) Avaliação
# ===============================================
eval_tbl <- tibble(
truth = factor(stack_tbl$obs, levels = c(0, 1)),
pred_prob = meta_preds,
pred_class = factor(ifelse(meta_preds >= 0.5, 1, 0), levels = c(0, 1))
)
# AUC-ROC
auc_roc <- roc(eval_tbl$truth, eval_tbl$pred_prob)$auc
# AUC-PR
pr <- evalmod(scores = eval_tbl$pred_prob, labels = as.numeric(as.character(eval_tbl$truth)))
auc_pr <- auc(pr)$aucs[2]
# Yardstick
metrics_all <- yardstick::metric_set(
yardstick::accuracy,
yardstick::precision,
yardstick::recall,
yardstick::specificity,
yardstick::f_meas
)
res <- metrics_all(eval_tbl, truth = truth, estimate = pred_class)
# Brier
brier <- mean((eval_tbl$pred_prob - as.numeric(as.character(eval_tbl$truth)))^2)
# Consolidar
metrics_stack <- list(
auc_roc = auc_roc,
auc_pr = auc_pr,
accuracy = res %>% filter(.metric == "accuracy") %>% pull(.estimate),
precision = res %>% filter(.metric == "precision") %>% pull(.estimate),
recall = res %>% filter(.metric == "recall") %>% pull(.estimate),
specificity = res %>% filter(.metric == "specificity") %>% pull(.estimate),
f1_score = res %>% filter(.metric == "f_meas") %>% pull(.estimate),
brier_score = brier
)
# Final
# message("Métricas — Stacking Ensemble")
# print(metrics_stack)
:::
5.3 Resumo dos Modelos
Métricas de Avaliação
AUC-ROC (Área sob a Curva ROC)
• Mede a capacidade do modelo em diferenciar entre classes (óbito vs. não óbito).
• Varia de 0 a 1; quanto mais próximo de 1, melhor.
• Indica a probabilidade do modelo ranquear um positivo acima de um negativo.
AUC-PR (Área sob a Curva Precision-Recall)
• Foca no desempenho quando há desbalanceamento de classes.
• Útil para saber se o modelo consegue manter boa precisão ao detectar casos positivos.
• Quanto mais alto, melhor.
Acurácia
• Proporção de todas as classificações corretas (positivas e negativas) sobre o total.
• Boa quando as classes estão balanceadas, mas pode enganar em desbalanceamentos.
Precisão (Precision)
• Entre os que o modelo disse que eram positivos, quantos estavam realmente certos?
• Alta precisão = poucos falsos positivos.
• Importante quando o erro de alertar à toa é grave.
Recall (Sensibilidade)
• Entre os casos realmente positivos, quantos o modelo acertou?
• Alta recall = poucos falsos negativos.
• Importante quando é grave deixar passar um caso positivo.
Specificity (Especificidade)
• Entre os casos negativos reais, quantos o modelo acertou como negativos?
• Alta especificidade = poucos falsos positivos.
• Complementa o recall.
F1-Score
• Média harmônica entre precisão e recall.
• Útil quando há desbalanceamento, pois equilibra os dois lados da equação.
• Varia de 0 a 1; quanto maior, melhor.
Brier Score
• Mede o erro médio quadrático das probabilidades previstas.
• Varia de 0 a 1; quanto menor, melhor.
• Avalia a calibração do modelo (quão confiável é a probabilidade que ele gera).
# =============================================================================
# TABELA FINAL — COMPARAÇÃO COMPLETA DE MÉTRICAS
# =============================================================================
# 1) Consolidar todas as listas em um único tibble
metrics_df <- tibble::tibble(
Método = c("Random Forest", "XGBoost", "CatBoost", "Regressão Logística", "SVM", "LightGBM", "Stacking Ensemble"),
AUC_ROC = c(metrics_rf$auc_roc, metrics_xgb$auc_roc, metrics_cat$auc_roc, metrics_logit$auc_roc, metrics_svm$auc_roc, metrics_lgbm$auc_roc, metrics_stack$auc_roc),
AUC_PR = c(metrics_rf$auc_pr, metrics_xgb$auc_pr, metrics_cat$auc_pr, metrics_logit$auc_pr, metrics_svm$auc_pr, metrics_lgbm$auc_pr, metrics_stack$auc_pr),
Acurácia = c(metrics_rf$accuracy, metrics_xgb$accuracy, metrics_cat$accuracy, metrics_logit$accuracy, metrics_svm$accuracy, metrics_lgbm$accuracy, metrics_stack$accuracy),
Precisão = c(metrics_rf$precision, metrics_xgb$precision, metrics_cat$precision, metrics_logit$precision, metrics_svm$precision, metrics_lgbm$precision, metrics_stack$precision),
Recall = c(metrics_rf$recall, metrics_xgb$recall, metrics_cat$recall, metrics_logit$recall, metrics_svm$recall, metrics_lgbm$recall, metrics_stack$recall),
Specificity = c(metrics_rf$specificity, metrics_xgb$specificity, metrics_cat$specificity, metrics_logit$specificity, metrics_svm$specificity, metrics_lgbm$specificity, metrics_stack$specificity),
F1_Score = c(metrics_rf$f1_score, metrics_xgb$f1_score, metrics_cat$f1_score, metrics_logit$f1_score, metrics_svm$f1_score, metrics_lgbm$f1_score, metrics_stack$f1_score),
Brier_Score = c(metrics_rf$brier_score, metrics_xgb$brier_score, metrics_cat$brier_score, metrics_logit$brier_score, metrics_svm$brier_score, metrics_lgbm$brier_score, metrics_stack$brier_score)
)
# 2) Ordenar pelo AUC_ROC decrescente
library(knitr)
metrics_df %>%
arrange(desc(AUC_ROC)) %>%
kable(
digits = 4,
caption = "Comparação de métricas entre diferentes modelos"
)| Método | AUC_ROC | AUC_PR | Acurácia | Precisão | Recall | Specificity | F1_Score | Brier_Score |
|---|---|---|---|---|---|---|---|---|
| LightGBM | 0.5997 | 0.3401 | 0.6282 | 0.7784 | 0.6908 | 0.4546 | 0.7320 | 0.2451 |
| CatBoost | 0.5938 | 0.3437 | 0.6290 | 0.7741 | 0.6992 | 0.4343 | 0.7347 | 0.2433 |
| SVM | 0.5854 | 0.3335 | 0.7350 | 0.7350 | 1.0000 | 0.0000 | 0.8472 | 0.1924 |
| XGBoost | 0.5829 | 0.3254 | 0.2744 | 0.7639 | 0.0184 | 0.9843 | 0.0359 | 0.3210 |
| Regressão Logística | 0.5826 | 0.3274 | 0.7347 | 0.7350 | 0.9993 | 0.0009 | 0.8470 | 0.1917 |
| Stacking Ensemble | 0.5789 | 0.3331 | 0.7350 | 0.7350 | 1.0000 | 0.0000 | 0.8472 | 0.1915 |
| Random Forest | 0.5641 | 0.3168 | 0.6118 | 0.7627 | 0.6848 | 0.4093 | 0.7217 | 0.2345 |
# 1) Consolidar em lista simples
scores_all <- list(
rf = rf_preds,
xgb = preds_xgb,
cat = preds_cat,
log = logit_preds,
svm = svm_probs,
lgbm = lgbm_preds,
stack = meta_preds
)
# 2) Nome real dos modelos (nessa ordem)
model_labels <- c(
"Random Forest",
"XGBoost",
"CatBoost",
"Regressão Logística",
"SVM",
"LightGBM",
"Stacking Ensemble"
)
labels_all <- as.numeric(as.character(valid_logit[[label_col]])) # mesmo vetor para todos (mesma validação)
# 3) Construir mmdata com os nomes reais
mm <- mmdata(
scores = scores_all,
labels = rep(list(labels_all), length(scores_all)),
modnames = model_labels
)
# 4) Avaliar
mod_all <- evalmod(mm)
# 5) Fortify
df_all <- fortify(mod_all)
df_roc <- df_all %>% filter(curvetype == "ROC")
df_prc <- df_all %>% filter(curvetype == "PRC")
#### Curva ROC
library(plotly)
plot_roc <- plot_ly()
for (modelo in unique(df_roc$modname)) {
df_mod <- df_roc %>% filter(modname == modelo)
plot_roc <- plot_roc %>%
add_trace(
data = df_mod,
x = ~x, y = ~y,
type = 'scatter', mode = 'lines',
name = modelo,
text = ~paste("Modelo:", modelo,
"<br>FPR:", round(x, 3),
"<br>TPR:", round(y, 3)),
hoverinfo = 'text'
)
}
plot_roc <- plot_roc %>%
layout(
title = "Curva ROC — Comparação de Modelos",
xaxis = list(title = "FPR (False Positive Rate)"),
yaxis = list(title = "TPR (True Positive Rate)"),
legend = list(x = 1.05, y = 1)
)
plot_roc
#### Curva Precision-Recall
plot_prc <- plot_ly()
for (modelo in unique(df_prc$modname)) {
df_mod <- df_prc %>% filter(modname == modelo)
plot_prc <- plot_prc %>%
add_trace(
data = df_mod,
x = ~x, y = ~y,
type = 'scatter', mode = 'lines',
name = modelo,
text = ~paste("Modelo:", modelo,
"<br>Recall:", round(x, 3),
"<br>Precision:", round(y, 3)),
hoverinfo = 'text'
)
}
plot_prc <- plot_prc %>%
layout(
title = "Curva Precision-Recall — Comparação de Modelos",
xaxis = list(title = "Recall"),
yaxis = list(title = "Precisão"),
legend = list(x = 1.05, y = 1)
)
plot_prc
5.4 Escolhendo o melhor modelo
O método híbrido AHP–TOPSIS-2N que usamos combina duas etapas:
- AHP (Analytic Hierarchy Process) – aqui transformamos as oito métricas de performance (AUC-ROC, AUC-PR, Recall, F1-Score, Precisão, Acurácia, Specificity e Brier Score) em pesos relativos por meio de comparações par-a-par (escala 1–9). Assim, critérios mais críticos para o problema (por exemplo, AUC e Recall) receberam peso maior em relação aos demais.
- TOPSIS-2N (Technique for Order of Preference by Similarity to Ideal Solution com dupla normalização) – com os pesos definidos pelo AHP, normalizamos a matriz de decisão duas vezes para reduzir vieses, calculamos a distância de cada modelo à “solução ideal” (melhor em todas as métricas) e classificamos os modelos de acordo com essa proximidade.
Como resultado, cada modelo recebe uma pontuação final que reflete simultaneamente sua capacidade de discriminar (AUCs), capturar casos verdadeiros (Recall/F1), confiança nas predições (Precisão/Acurácia/Specificity) e qualidade da probabilidade (Brier). Modelos com pontuação mais alta estão mais próximos da solução ideal e, portanto, são considerados os melhores para predizer óbito vs. não-óbito.
# =============================================================================
# HYBRID AHP–TOPSIS-2N — Avaliação Multicritério de Modelos
# =============================================================================
# 0) Carregar bibliotecas
library(dplyr)
library(ahptopsis2n)
# =============================================================================
# 1) Função auxiliar: escala AHP {1,3,5,7,9} a partir de pesos absolutos
# =============================================================================
get_ahp_scale <- function(wi, wj) {
# diferença absoluta de prioridade
d <- abs(wi - wj)
# define o valor da escala
s <- if (d == 0) {
1
} else if (d <= 2) {
3
} else if (d <= 4) {
5
} else if (d <= 6) {
7
} else {
9
}
# inverte se wi < wj
if (wi < wj) s <- 1 / s
return(s)
}
# =============================================================================
# 2) Função principal: aplicar AHP–TOPSIS-2N ao tibble de métricas
# =============================================================================
aplicar_ahptopsis2n_modelos <- function(tabela) {
# 2.1) Definir colunas métricas e ordem fixa
cols <- c(
"AUC_ROC", # maximizar
"AUC_PR", # maximizar
"Recall", # maximizar
"F1_Score", # maximizar
"Precisão", # maximizar
"Acurácia", # maximizar
"Specificity",# maximizar
"Brier_Score" # minimizar
)
# 2.2) Extrair e garantir formato numérico
mat_dec <- tabela %>%
select(all_of(cols)) %>%
mutate(across(everything(), as.numeric)) %>%
as.matrix()
rownames(mat_dec) <- tabela$Método
# 2.3) Definir pesos absolutos (prioridades) para cada critério
peso_abs <- c(
AUC_ROC = 9,
AUC_PR = 7,
Recall = 5,
F1_Score = 5,
Precisão = 3,
Acurácia = 3,
Specificity = 3,
Brier_Score = 1
)
# 2.4) Montar matriz de comparação par-a-par (AHP) usando get_ahp_scale()
crit_names <- names(peso_abs)
n <- length(crit_names)
mat_crit <- matrix(NA, n, n,
dimnames = list(crit_names, crit_names))
for (i in seq_len(n)) {
for (j in seq_len(n)) {
mat_crit[i, j] <- get_ahp_scale(peso_abs[crit_names[i]],
peso_abs[crit_names[j]])
}
}
# 2.5) Definir regra de maximização ("max") ou minimização ("min")
# Todos os sete primeiros critérios são maximizar; Brier_Score é minimizar
minmax <- c(rep("max", n - 1), "min")
# 2.6) Executar o método híbrido AHP–TOPSIS-2N
resultado <- ahptopsis2n(
decision = mat_dec,
criteria = mat_crit,
minmax = minmax
)
return(resultado)
}
# =============================================================================
# 3) Preparar o tibble de métricas (metrics_df)
# =============================================================================
# metrics_rf, metrics_xgb, metrics_cat, metrics_logit,
# metrics_svm, metrics_lgbm, metrics_stack
# Cada lista contém: auc_roc, auc_pr, accuracy, precision, recall,
# specificity, f1_score, brier_score
metrics_df <- tibble::tibble(
Método = c("Random Forest", "XGBoost", "CatBoost",
"Regressão Logística", "SVM", "LightGBM", "Stacking Ensemble"),
AUC_ROC = c(metrics_rf$auc_roc, metrics_xgb$auc_roc, metrics_cat$auc_roc,
metrics_logit$auc_roc, metrics_svm$auc_roc, metrics_lgbm$auc_roc, metrics_stack$auc_roc),
AUC_PR = c(metrics_rf$auc_pr, metrics_xgb$auc_pr, metrics_cat$auc_pr,
metrics_logit$auc_pr, metrics_svm$auc_pr, metrics_lgbm$auc_pr, metrics_stack$auc_pr),
Recall = c(metrics_rf$recall, metrics_xgb$recall, metrics_cat$recall,
metrics_logit$recall, metrics_svm$recall, metrics_lgbm$recall, metrics_stack$recall),
F1_Score = c(metrics_rf$f1_score, metrics_xgb$f1_score, metrics_cat$f1_score,
metrics_logit$f1_score, metrics_svm$f1_score, metrics_lgbm$f1_score, metrics_stack$f1_score),
Precisão = c(metrics_rf$precision, metrics_xgb$precision, metrics_cat$precision,
metrics_logit$precision, metrics_svm$precision, metrics_lgbm$precision, metrics_stack$precision),
Acurácia = c(metrics_rf$accuracy, metrics_xgb$accuracy, metrics_cat$accuracy,
metrics_logit$accuracy, metrics_svm$accuracy, metrics_lgbm$accuracy, metrics_stack$accuracy),
Specificity = c(metrics_rf$specificity, metrics_xgb$specificity, metrics_cat$specificity,
metrics_logit$specificity, metrics_svm$specificity, metrics_lgbm$specificity, metrics_stack$specificity),
Brier_Score = c(metrics_rf$brier_score, metrics_xgb$brier_score, metrics_cat$brier_score,
metrics_logit$brier_score, metrics_svm$brier_score, metrics_lgbm$brier_score, metrics_stack$brier_score)
)
# =============================================================================
# 4) Aplicar AHP–TOPSIS-2N e obter resultados
# =============================================================================
resultado_modelos <- aplicar_ahptopsis2n_modelos(metrics_df)# =============================================================================
# 5) Visualizar rankings finais
# =============================================================================
# 5.1) Ranking após a PRIMEIRA normalização
resultado_modelos[[2]] %>%
arrange(ranking) values ranking
LightGBM 0.6825337 1
CatBoost 0.6802258 2
SVM 0.6534691 3
Stacking Ensemble 0.6518980 4
Regressão Logística 0.6518523 5
Random Forest 0.6441308 6
XGBoost 0.3472508 7
6 Etapa de hiperparametrização (Tuning)
7 {r} # # ============================================================================= # # ESQUELETO DE TUNING — LightGBM, CatBoost (auto e manual) e SVM (RBF) # # ============================================================================= # # # 0) Carregar bibliotecas # library(tidymodels) # library(rsample) # library(purrr) # library(catboost) # library(pROC) # set.seed(42) # # # ----------------------------------------------------------------------------- # # 1) Split inicial e 10-fold CV estratificado # # ----------------------------------------------------------------------------- # split_i <- initial_split(df_work_smal, prop = 0.80, strata = obito_cardiovascular) # train_data <- training(split_i) # test_data <- testing(split_i) # # cv_splits <- vfold_cv(train_data, v = 10, strata = obito_cardiovascular) # # # ----------------------------------------------------------------------------- # # 2) Receita de pré-processamento # # ----------------------------------------------------------------------------- # rec <- recipe(obito_cardiovascular ~ ., data = train_data) %>% # step_dummy(all_nominal_predictors()) %>% # step_zv(all_predictors()) %>% # step_normalize(all_numeric_predictors()) # # # ----------------------------------------------------------------------------- # # 3) Specs de modelo (tunáveis) + peso de classe # # ----------------------------------------------------------------------------- # n_neg <- sum(train_data$obito_cardiovascular == 0) # n_pos <- sum(train_data$obito_cardiovascular == 1) # cw <- n_neg / n_pos # # ## 3.1) LightGBM # lgbm_spec <- boost_tree( # trees = tune(), # tree_depth = tune(), # learn_rate = tune(), # min_n = tune() # ) %>% # set_engine( # "lightgbm", # objective = "binary", # scale_pos_weight = cw # ) %>% # set_mode("classification") # # ## 3.2) CatBoost (auto via treesnip se disponível) # # — se usar treesnip, carregue library(treesnip) no topo # cat_spec_auto <- boost_tree( # trees = tune(), # tree_depth = tune(), # learn_rate = tune() # ) %>% # set_engine( # "catboost", # loss_function = "Logloss", # eval_metric = "AUC", # class_weights = c(1, cw) # ) %>% # set_mode("classification") # # ## 3.3) SVM (RBF) # svm_spec <- svm_rbf( # cost = tune(), # rbf_sigma = tune() # ) %>% # set_engine( # "kernlab", # class.weights = c("0" = 1, "1" = cw) # ) %>% # set_mode("classification") # # # ----------------------------------------------------------------------------- # # 4) Workflows # # ----------------------------------------------------------------------------- # wf_lgbm <- workflow() %>% add_model(lgbm_spec) %>% add_recipe(rec) # wf_cat_auto <- workflow() %>% add_model(cat_spec_auto) %>% add_recipe(rec) # wf_svm <- workflow() %>% add_model(svm_spec) %>% add_recipe(rec) # # # ----------------------------------------------------------------------------- # # 5) Grades de busca aleatória (auto) # # ----------------------------------------------------------------------------- # set.seed(101) # grid_lgbm <- lgbm_spec %>% parameters() %>% grid_random(size = 30) # grid_cat <- cat_spec_auto %>% parameters() %>% grid_random(size = 30) # grid_svm <- svm_spec %>% parameters() %>% grid_random(size = 30) # # # ----------------------------------------------------------------------------- # # 6) Tuning automático com CV # # ----------------------------------------------------------------------------- # ctrl <- control_grid(save_pred = TRUE) # # res_lgbm <- tune_grid(wf_lgbm, cv_splits, grid = grid_lgbm, metrics = metric_set(roc_auc, pr_auc), control = ctrl) # res_cat_auto <- tune_grid(wf_cat_auto, cv_splits, grid = grid_cat, metrics = metric_set(roc_auc, pr_auc), control = ctrl) # res_svm <- tune_grid(wf_svm, cv_splits, grid = grid_svm, metrics = metric_set(roc_auc, pr_auc), control = ctrl) # # # Seleção dos melhores (auto) # best_lgbm <- select_best(res_lgbm, "roc_auc") # best_cat_auto<- select_best(res_cat_auto,"roc_auc") # best_svm <- select_best(res_svm, "roc_auc") # # # ----------------------------------------------------------------------------- # # 7) Tuning manual do CatBoost via loop rsample/purrr # # ----------------------------------------------------------------------------- # # 7.1) Definir grid manual # grid_manual <- expand.grid( # depth = c(4, 6, 8), # learning_rate = c(0.01, 0.1), # iterations = c(100, 200) # ) # # # 7.2) Loop sobre cada combinação e folds # results_cat_manual <- grid_manual %>% # pmap_dfr(function(depth, learning_rate, iterations) { # aucs <- map_dbl(cv_splits$splits, function(split) { # tr <- analysis(split); va <- assessment(split) # pool_tr <- catboost.load_pool( # data = tr %>% select(-obito_cardiovascular), # label = tr$obito_cardiovascular # ) # pool_va <- catboost.load_pool( # data = va %>% select(-obito_cardiovascular), # label = va$obito_cardiovascular # ) # model <- catboost.train( # learn_pool = pool_tr, # test_pool = NULL, # params = list( # depth = depth, # learning_rate = learning_rate, # iterations = iterations, # class_weights = c(1, cw), # loss_function = "Logloss", # eval_metric = "AUC", # verbose = FALSE # ) # ) # preds <- catboost.predict(model, pool_va, prediction_type = "Probability") # as.numeric(roc(va$obito_cardiovascular, preds)$auc) # }) # tibble(depth, learning_rate, iterations, auc = mean(aucs)) # }) # # # 7.3) Selecionar melhor combinação manual # best_cat_manual <- results_cat_manual %>% # arrange(desc(auc)) %>% # slice(1) # # # ----------------------------------------------------------------------------- # # 8) Refinamento (exemplo para LightGBM) # # ----------------------------------------------------------------------------- # # refined_grid_lgbm <- grid_latin_hypercube( # # parameters(lgbm_spec) %>% update( # # tree_depth = tree_depth(c(best_lgbm$tree_depth - 2, best_lgbm$tree_depth + 2)), # # learn_rate = learn_rate(c(best_lgbm$learn_rate * 0.5, best_lgbm$learn_rate * 1.5)) # # ), # # size = 20 # # ) # # res_lgbm_refined <- tune_grid(wf_lgbm, cv_splits, grid = refined_grid_lgbm, metrics = metric_set(roc_auc), control = ctrl) # # # ----------------------------------------------------------------------------- # # 9) Ajuste final dos workflows no conjunto completo de treino+validação # # ----------------------------------------------------------------------------- # final_lgbm <- finalize_workflow(wf_lgbm, best_lgbm) %>% fit(data = train_data) # final_cat_auto <- finalize_workflow(wf_cat_auto,best_cat_auto) %>% fit(data = train_data) # final_cat_manual <- { # # sob demanda, treina o modelo CatBoost manual no train_data inteiro # pool_tr_full <- catboost.load_pool( # data = train_data %>% select(-obito_cardiovascular), # label = train_data$obito_cardiovascular # ) # catboost.train( # learn_pool = pool_tr_full, # test_pool = NULL, # params = list( # depth = best_cat_manual$depth, # learning_rate = best_cat_manual$learning_rate, # iterations = best_cat_manual$iterations, # class_weights = c(1, cw), # loss_function = "Logloss", # eval_metric = "AUC", # verbose = FALSE # ) # ) # } # final_svm <- finalize_workflow(wf_svm, best_svm) %>% fit(data = train_data) # # # Pronto — todos os seus modelos estão afinados e prontos para avaliação no test_data! #
8
9
10
11
12
13
14
15 {r} # remotes::install_github("curso-r/treesnip@catboost") #
16
17
18
19
20
21
22
23
24
25 {r} # write.csv(df_work_smal, "dataset_obitos_2020.csv") #
26
27
28
29
30
31
32
33
34
35
36
37
38 ## Execussão do Randon Search
39
#
40 Em vez de percorrer todas as combinações de uma grade fixa, iteramos apenas sobre as 30 configurações amostradas aleatoriamente em rand_list. Para cada conjunto de parâmetros:
#
41
42 > 1. Fundimos os parâmetros fixos de avaliação (Logloss e AUC) com o vetor de parâmetros dinâmico;
43 2. Treinamos um modelo CatBoost via catboost.train(pool_tr_i, NULL, params);
44 3. Geramos previsões probabilísticas em pool_vl_i;.
45 4. Calculamos a AUC no conjunto de validação e empacotamos tudo num tibble.
46
#
47 Usamos purrr::map_dfr() para iterar automaticamente por cada elemento de rand_list e consolidar os resultados em rand_search_res.
#
48
49 {r} # # ============================================================================= # # 5) RODAR O RANDOM SEARCH # # ============================================================================= # set.seed(42) # rand_search_res <- map_dfr( # rand_list, # lista de 30 listas de parâmetros # ~ eval_cat(.x) # sua função que treina + avalia AUC # ) #
50
51
52
53
54 ## Resumo dos resultados
55
56
57
58
59 ### Todos os resultados
60
61
62 {r} # # ============================================================================= # # 6) RESUMO DOS RESULTADOS # # ============================================================================= # # # 6.1) Todas as 30 configurações com suas AUCs # print(rand_search_res) # #
63
64
65
66
67 ### Top 5
68
69 {r} # # 6.2) Top 5 melhores configurações # rand_search_res %>% # arrange(desc(AUC)) %>% # slice_head(n = 5) #
70
71
72
73
74 ### Configuração ótima
75
76 {r} # # 6.3) Extrair a única melhor configuração # best_params <- rand_search_res %>% # filter(AUC == max(AUC, na.rm = TRUE)) %>% # slice_head(n = 1) # print(best_params) #
77
78
79
80
81 ## Visualização
82
#
83 Para entender como cada hiperparâmetro impactou a AUC:
#
84
85 > • Um scatter plot mostra, para cada ponto amostrado, a relação entre learning_rate e iterations, colorido pela AUC e facetado por depth.
86 • Um heatmap mapeia AUC em função de iterations e learning_rate, facilitando a identificação de “zonas quentes” de alta performance para cada profundidade.
87
88
89
90 {r} # # ============================================================================= # # 7) VISUALIZAÇÕES # # ============================================================================= # # # 7.1) AUC por learning_rate × iterations, facetado por depth # ggplot(rand_search_res, aes(x = learning_rate, y = iterations, color = AUC)) + # geom_point(size = 3) + # scale_color_viridis(option = "D") + # facet_wrap(~ depth) + # labs( # title = "Random Search — AUC por Depth", # x = "Learning Rate", # y = "Iterations" # ) + # theme_minimal() #
91
92
93
94
95 {r} # # 7.2) Heatmap de AUC (iterations × learning_rate) por depth # ggplot(rand_search_res, aes(x = factor(iterations), y = factor(round(learning_rate,2)), fill = AUC)) + # geom_tile() + # facet_wrap(~ depth) + # scale_fill_viridis(option = "C") + # labs( # title = "Heatmap de AUC — Iterations × Learning Rate", # x = "Iterations", # y = "Learning Rate" # ) + # theme_minimal() #
96
97
98
99
100
101
102 # Teste final do modelo
103
104 ## Montando o banco de dados para Teste
105
106 {r} # # ----------------------------------------------------------------------------- # # 1) Partimos de amostra_teste (20% hold-out sem olhar) # # ----------------------------------------------------------------------------- # # # 1.1) Carregar as funções de transformação, se ainda não estiverem disponíveis # # source("funcoes/add_cardiac_flag.R") # # source("funcoes/add_bimestre_col.R") # # source("funcoes/add_intermediate_region_col.R") # # # ----------------------------------------------------------------------------- # # 2) Marcar eventos cardíacos (TRUE/FALSE) via add_cardiac_flag() # # ----------------------------------------------------------------------------- # test_df <- amostra_teste %>% # add_cardiac_flag( # cause_col = "CAUSABAS", # flag_col = "obito_cardiovascular", # pattern = "^I" # ) # # # ----------------------------------------------------------------------------- # # 3) Extrair bimestre da data de óbito via add_bimestre_col() # # ----------------------------------------------------------------------------- # test_df <- add_bimestre_col( # test_df, # date_col = "DTOBITO", # new_col = "bimestre" # ) # # # ----------------------------------------------------------------------------- # # 4) Mapear município para região intermediária via add_intermediate_region_col() # # ----------------------------------------------------------------------------- # test_df <- add_intermediate_region_col( # test_df, # muni_col = "munResNome", # uf = "SP", # year = 2020, # new_col = "regiao_intermediaria" # ) # # # ----------------------------------------------------------------------------- # # 5) Selecionar só as variáveis que o modelo vai usar e converter o target # # ----------------------------------------------------------------------------- # test_work <- test_df %>% # select( # IDADEanos, # ESTCIV, # ESC, # LOCOCOR, # bimestre, # regiao_intermediaria, # obito_cardiovascular # ) %>% # mutate( # # converter TRUE/FALSE para 1/0, como no treino # obito_cardiovascular = as.integer(obito_cardiovascular) # ) # # # ----------------------------------------------------------------------------- # # 6) Conferir o novo objeto # # ----------------------------------------------------------------------------- # # str(test_work) # # deve ter 7 colunas numéricas/fator + obito_cardiovascular (0/1) #
107
108 ## Iniciando o modelo final
109
110 ### Preparar o pool de treino completo
111
112 {r} # # 1.1) Recriar df_work com as mesmas transformações do treino_i: # df_full <- df_work # já tem todas as colunas e o target 0/1 # # # 1.2) Garantir fatores nas categóricas # cat_feats <- c("ESTCIV","ESC","LOCOCOR","bimestre","regiao_intermediaria") # df_full <- df_full %>% mutate(across(all_of(cat_feats), as.factor)) # # # 1.3) Criar Pool CatBoost para treino final # pool_full <- catboost.load_pool( # data = select(df_full, -obito_cardiovascular), # label = df_full$obito_cardiovascular # ) #
113
114
115 ### Treinar o nomedo final
116
117 {r} # # 2.1) Usar best_params do Random Search # # (por exemplo: best_params$depth, best_params$learning_rate, etc.) # params_final <- list( # iterations = best_params$iterations, # depth = best_params$depth, # learning_rate = best_params$learning_rate, # l2_leaf_reg = best_params$l2_leaf_reg, # loss_function = "Logloss", # eval_metric = "AUC", # logging_level = "Silent" # ) # # # 2.2) Ajustar o modelo em pool_full # model_final <- catboost.train( # learn_pool = pool_full, # params = params_final # ) #
118
119
120
121 ## Avaliação no Hold-out
122
123 {r} # # 3.1) Construir pool do hold-out # test_pool <- catboost.load_pool( # data = select(test_work, -obito_cardiovascular), # label = test_work$obito_cardiovascular # ) # # # 3.2) Gerar probabilidades preditas # preds_test <- catboost.predict( # model = model_final, # pool = test_pool, # prediction_type = "Probability" # ) # # # 3.3) Calcular as métricas finais # library(pROC) # roc_obj <- roc( # response = test_work$obito_cardiovascular, # predictor = preds_test # ) # auc_test <- auc(roc_obj) # # library(caret) # # converter probs em classes (threshold = 0.5 ou otimizado) # pred_class <- ifelse(preds_test >= 0.5, 1, 0) # # conf_mat <- confusionMatrix( # factor(pred_class, levels=0:1), # factor(test_work$obito_cardiovascular, levels=0:1), # positive = "1" # ) # # # 3.4) Exibir resultados # message("=== Resultados no Hold-out ===") # message("AUC: ", round(auc_test, 4)) # print(conf_mat)
`