Checklist de Projeto de Aprendizado de Máquina

Author

Vitor Sain Vallio

Published

June 19, 2025

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:

  1. Definir o problema e observar o panorama geral.
  2. Obter os dados.
  3. Explorar os dados para extrair percepções.
  4. Preparar os dados para expor melhor os padrões subjacentes aos algoritmos de aprendizado de máquina.
  5. Explorar diversos modelos e pré-selecionar os melhores.
  6. Otimizar os modelos e combiná-los em uma solução ótima.
  7. Apresentar a solução.
  8. 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

# # 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)



2.2 Download dos dados

# SIM-DO 2020 – São Paulo
dados_sim <- fetch_datasus(
  year_start = 2020,
  year_end = 2020,
  uf = "SP",
  information_system = "SIM-DO"
)

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

# Processar dados e adicionar ID
dados_sim_processados <- process_sim(dados_sim) %>%
  mutate(ID = row_number())

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

analise_exploratoria <- amostra_treino



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

explorar_continuas(analise_exploratoria$IDADEanos, plot = TRUE)


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|



explorar_categoricas(analise_exploratoria$SEXO, plot = TRUE)


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|



explorar_categoricas(analise_exploratoria$RACACOR, plot = TRUE)


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|



explorar_categoricas(analise_exploratoria$ESTCIV, plot = TRUE)


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|



explorar_categoricas(analise_exploratoria$ESC, plot = TRUE)


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|



explorar_categoricas(analise_exploratoria$CAUSABAS, plot = TRUE)


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|



explorar_temporais(analise_exploratoria$DTOBITO, plot = TRUE)


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|



explorar_categoricas(analise_exploratoria$LOCOCOR, plot = TRUE)


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|



explorar_categoricas(analise_exploratoria$munResNome, plot = TRUE)


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
}
  1. Garantir formato correto: converte a coluna de códigos CID-10 em character para evitar inconsistências nas comparações.
  2. 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).
  3. Retornar o resultado: devolve o mesmo data frame de entrada, agora enriquecido com a coluna de flag (flag_col) indicando eventos cardíacos.



analise_exploratoria <- analise_exploratoria %>%
  add_cardiac_flag(cause_col = "CAUSABAS",
                   flag_col  = "obito_cardiovascular")
explorar_categoricas(analise_exploratoria$obito_cardiovascular, plot = TRUE)


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
      )
    )
}
  1. 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().
  2. 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.
  3. 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. 



analise_exploratoria <- add_bimestre_col(analise_exploratoria, DTOBITO)
explorar_categoricas(analise_exploratoria$bimestre, plot = TRUE)


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
}
  1. 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.
  2. Baixar shapefile de regiões intermediárias: utiliza geobr::read_intermediate_region() para carregar as regiões intermediárias do mesmo ano.
  3. 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.
  4. Gerar lookup único: remove a geometria e duplica apenas um par município–região, criando um mapeamento limpo.
  5. 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.



# Uso com dados de 2020:
analise_exploratoria <- add_intermediate_region_col(
  analise_exploratoria,
  muni_col = "munResNome",
  uf       = "SP",
  year     = 2020,
  new_col  = "regiao_intermediaria"
)
explorar_categoricas(analise_exploratoria$regiao_intermediaria, plot = TRUE)


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
  ))
}
  1. 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().
  2. 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.
  3. 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
  ))
}
  1. 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.
  2. 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().
  3. 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

explorar_bi_categ(analise_exploratoria, RACACOR, obito_cardiovascular, plot = TRUE)


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



explorar_bi_categ(analise_exploratoria, SEXO, obito_cardiovascular, plot = TRUE)


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



explorar_bi_categ(analise_exploratoria, ESTCIV, obito_cardiovascular, plot = TRUE)


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



explorar_bi_categ(analise_exploratoria, ESC, obito_cardiovascular, plot = TRUE)


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



explorar_bi_categ(analise_exploratoria, LOCOCOR, obito_cardiovascular, plot = TRUE)


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



explorar_bi_categ(analise_exploratoria, bimestre, obito_cardiovascular, plot = TRUE)


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



explorar_bi_categ(analise_exploratoria, regiao_intermediaria, obito_cardiovascular, plot = TRUE)


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

dados_imputa <- analise_exploratoria %>%
  select(
    IDADEanos,
    RACACOR,
    SEXO,
    ESTCIV,
    ESC,
    LOCOCOR,
    obito_cardiovascular,
    bimestre,
    regiao_intermediaria,
  )



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")
)
Resumo de Missing por Variável em dados_imputa
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
  )
}
# Chamar a função
res_imputa <- impute_mice_custom(dados_imputa, m = 5, maxit = 10, seed = 42)



4.1.5 Qualidade das imputações

# Diagnóstico de convergência
plot(res_imputa$mids) # traceplots das cadeias



CLIQUE NAS OPÇÕES ABAIXO PARA EXPLORAR OS RESULTADOS

densityplot(res_imputa$mids, ~ SEXO) # distribuição imputada vs observada



densityplot(res_imputa$mids, ~ RACACOR) # distribuição imputada vs observada



densityplot(res_imputa$mids, ~ ESTCIV) # distribuição imputada vs observada



densityplot(res_imputa$mids, ~ ESC) # distribuição imputada vs observada



densityplot(res_imputa$mids, ~ LOCOCOR) # distribuição imputada vs observada

densityplot(res_imputa$mids, ~ regiao_intermediaria) # distribuição imputada vs observada

4.1.6 Adicionando os dados imputados

# Dataset completo
dados_completos <- res_imputa$complete

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:

  1. Cria uma amostra (10% por padrão) do seu df, opcionalmente estratificada pela variável-alvo.
  2. Separa as colunas em contínuas (numéricas) e categóricas (fatores).
  3. 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.
  4. 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.
  5. Se houver strata, compara também a proporção da classe-alvo (casos vs. controles) entre completo e amostrado.
  6. 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.

# vamos extrair o sample validado:
train_small <- res$sample

# 2) Agora sim rode o Boruta

set.seed(42)
boruta_out <- Boruta(
  obito_cardiovascular ~ .,
  data    = train_small,
  doTrace = 2,
  maxRuns = 100
)



4.2.2.1 Plote dos atributos

# 3) Plote e extraia atributos
plot(boruta_out, las = 2, cex.axis = 0.7) 



4.2.2.2 Variaveis finais

final_vars <- getSelectedAttributes(boruta_out, withTentative = FALSE)
print(final_vars)
[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

  1. Preparação do alvo: converteram obito_cardiovascular para fator (FALSE/TRUE) para que o ranger retornasse probabilidades por classe.
# --- 1) Converter o target para factor *antes* de treinar
train_small <- train_small %>%
  mutate(
    obito_cardiovascular = factor(
      obito_cardiovascular,
      levels = c(FALSE, TRUE)
    )
  )



4.2.3.2 Treinamento do modelo

  1. Treino do modelo: ajustaram um Random Forest probabilístico com 500 árvores (ranger(…, probability = TRUE)), garantindo tratamento nativo de fatores não ordenados.
# --- 2) Treinar o Random Forest probabilístico
set.seed(42)
rf_model <- ranger(
  formula                     = obito_cardiovascular ~ .,
  data                        = train_small,
  probability                 = TRUE,
  respect.unordered.factors   = TRUE,
  num.trees                   = 500
)



4.2.3.3 Iniciando a permutação

  1. 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

  1. 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.
# 4) Visualizar os resultados
print(perm_imp)
# 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 



vip::vip(perm_imp) + ggtitle("Permutation Importance (AUC drop)")



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%    
# extrai a amostra validada
df_work_smal <- res_sm$sample



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.

  1. 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).
  2. 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”).
  3. 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).
  4. 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"
  )
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:

  1. 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.
  2. 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
# 5.2) Ranking após a SEGUNDA normalização
resultado_modelos[[3]] %>%
  arrange(ranking)
                       values ranking
LightGBM            0.8903040       1
CatBoost            0.8385020       2
SVM                 0.6251889       3
Regressão Logística 0.5326620       4
Stacking Ensemble   0.5138440       5
XGBoost             0.4367823       6
Random Forest       0.2225371       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

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)

`