Capítulo 2 Leitura, limpeza e organização dos dados
Neste capítulo os conceitos serão abordados através de exemplos práticos. Para isso usaremos a base de dados do ENEM 2015, disponível pelo site do INEP 6. Esta base contém informações por escola.
Questões interessantes que podemos tentar responder a partir desta base de dados:
Quais as principais características das escolas que influenciam, positivamente ou negativamente, no resultado dos seus alunos no ENEM?
Quais as características das escolas que indicam menor taxa de participação no ENEM?
Dada uma escola qualquer, qual a probabilidade da nota média dos seus alunos em todas as provas ser maior que 500?
Responder essas perguntas pode ser importante para tomadas de decisão sobre como usar os recursos nas escolas, tanto recursos públicos quanto particulares.
2.1 Como ler os dados no R
A primeira etapa sempre será verificar se o diretório corrente é aquele que você está trabalhando, onde foi salvo o arquivo com dados a serem lidos. Para isso, o comando
verifica o diretório corrente. Caso queira alterar o diretório corrente, use
É preciso que o diretório corrente do R
seja o mesmo onde estão salvos
o script.R
e a base de dados.
A base de dados está salva no formato csv no arquivo
MICRODADOS_ENEM_ESCOLA_2015.csv
. O primeiro passo é a leitura desta
base dentro do Programa R (R Core Team 2022). Para trabalhar com os dados, vamos
instalar o pacote tidyverse
(Wickham et al. 2019), que na sua instalação também
instala os pacotes dplyr
(Wickham et al. 2022) e readr
(Wickham, Hester, and Bryan 2022).
Para leitura da base pode-se usar as funções read_csv
, read_csv2
ou
read_delim
, todas retornam um objeto fo tipo tibble
. Em particupar,
a última delas possibilita escolher o caractere para separação das
colunas, com a definição do argumento delim
, e para separação de casas
decimais, a partir do decimal_mark
. Como a base está com as colunas
separadas por ;
e a casa decimal por ,
, será usada a função
read_csv2
para a sua leitura.
É importante ressaltar que, geralmente, junto com uma base pública é
disponibilizado um arquivo de dicionário. É nele que estão as
explicações de cada variável da base. Para a base
MICRODADOS_ENEM_ESCOLA_2015.csv
o arquivo dicionário é
Dicionário_Microdados_Enem_Escola.xlsx
.
2.2 Classificação das variáveis da base
2.2.1 Quanto ao seu tipo
O primeiro passo, em qualquer análise de dados, é entender cada variável da base. Para isso elas serão classificadas entre as seguintes possibilidades:
Classificação | Descrição |
---|---|
Identificação | Aquelas cuja única função é identificar a unidade amostral (linha). Esta variável assume um valor diferente para cada linha da base. |
Quantitativa | Aquelas que atribuem à cada unidade amostral uma característica de quantidade. |
Qualitativa | Aquelas que atribuem a cada unidade amostral uma característica, que pode ser de diferentes naturezas: textual, lógica ou até mesmo numérica. Mas sempre indica uma categoria e não uma quantidade. |
Vejamos uma rápida apresentação de cada variável a partir da função
glimpse
.
## Rows: 15,598
## Columns: 27
## $ NU_ANO <dbl> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 20…
## $ CO_UF_ESCOLA <dbl> 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, …
## $ SG_UF_ESCOLA <chr> "RO", "RO", "RO", "RO", "RO", "RO", "RO", "R…
## $ CO_MUNICIPIO_ESCOLA <dbl> 1100205, 1100205, 1100205, 1100205, 1100205,…
## $ NO_MUNICIPIO_ESCOLA <chr> "Porto Velho", "Porto Velho", "Porto Velho",…
## $ CO_ESCOLA_EDUCACENSO <dbl> 11000058, 11000171, 11000198, 11000244, 1100…
## $ NO_ESCOLA_EDUCACENSO <chr> "CENTRO DE ENSINO CLASSE A", "CENTRO EDUCACI…
## $ TP_DEPENDENCIA_ADM_ESCOLA <dbl> 4, 4, 4, 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, 4,…
## $ TP_LOCALIZACAO_ESCOLA <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,…
## $ NU_MATRICULAS <dbl> 137, 20, 39, 55, 26, 97, 44, 34, 75, 41, 24,…
## $ NU_PARTICIPANTES_NEC_ESP <dbl> 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,…
## $ NU_PARTICIPANTES <dbl> 130, 17, 37, 49, 23, 96, 38, 29, 59, 22, 21,…
## $ NU_TAXA_PARTICIPACAO <dbl> 94.89, 85.00, 94.87, 89.09, 88.46, 98.97, 86…
## $ NU_MEDIA_CN <dbl> 591.64, 458.46, 529.05, 508.74, 523.38, 505.…
## $ NU_MEDIA_CH <dbl> 652.34, 533.51, 583.87, 586.45, 591.66, 582.…
## $ NU_MEDIA_LP <dbl> 604.53, 472.62, 547.11, 531.35, 563.45, 527.…
## $ NU_MEDIA_MT <dbl> 627.66, 459.72, 507.22, 529.87, 528.93, 492.…
## $ NU_MEDIA_RED <dbl> 732.00, 507.82, 652.43, 591.84, 583.48, 580.…
## $ NU_MEDIA_OBJ <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ NU_MEDIA_TOT <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ INSE <chr> "Grupo 6", "Grupo 4", "Grupo 5", "Grupo 5", …
## $ PC_FORMACAO_DOCENTE <dbl> 67.5, 58.3, 67.7, 56.0, 72.7, 53.6, 73.9, 46…
## $ NU_TAXA_PERMANENCIA <dbl> 78.46, 70.59, 40.54, 81.63, 52.17, 85.42, 63…
## $ NU_TAXA_APROVACAO <dbl> 96.1, 94.6, 90.1, 88.7, 84.5, 89.2, 73.9, 88…
## $ NU_TAXA_REPROVACAO <dbl> 3.9, 5.4, 9.9, 10.5, 13.1, 10.8, 22.2, 9.9, …
## $ NU_TAXA_ABANDONO <dbl> 0.0, 0.0, 0.0, 0.8, 2.4, 0.0, 3.9, 1.4, 0.3,…
## $ PORTE_ESCOLA <chr> "Maior que 90 alunos", "De 1 a 30 alunos", "…
Nesta base as variáveis podem ser identificadas de acordo com a tabela a seguir.
Classificação | Variáveis |
Identificação | CO_ESCOLA_EDUCACENSO , NO_ESCOLA_EDUCACENSO |
Quantitativas | NU_MATRICULAS , NU_PARTICIPANTES_NEC_ESP , NU_PARTICIPANTES , NU_TAXA_PERMANENCIA , NU_TAXA_APROVACAO , NU_TAXA_REPROVACAO , NU_TAXA_ABANDONO , PC_FORMACAO_DOCENTE , NU_TAXA_PARTICIPACAO , NU_MEDIA_CN , NU_MEDIA_CH , NU_MEDIA_LP , NU_MEDIA_MT , NU_MEDIA_RED , NU_MEDIA_OBJ , NU_MEDIA_TOT |
Qualitativas | NU_MATRICULAS , NU_PARTICIPANTES_NEC_ESP , NU_PARTICIPANTES , NU_TAXA_PERMANENCIA , NU_TAXA_APROVACAO , NU_TAXA_REPROVACAO , NU_TAXA_ABANDONO , C_FORMACAO_DOCENTE , NU_TAXA_PARTICIPACAO , NU_MEDIA_CN , NU_MEDIA_OBJ , NU_MEDIA_TOT , NU_MEDIA_CH , NU_MEDIA_LP , NU_MEDIA_MT , NU_MEDIA_RED |
O CO_ESCOLA_EDUCACENSO
, apesar de ser representada por um número, é
uma variável que indica uma identidade e não uma quantidade. Por isso é
importante que o R
não reconheça esta variável como um número. Veja na
segunda coluna da saída da função glimpse
, na linha referente à
variável CO_ESCOLA_EDUCACENSO
, aparece <dbl>
, o que indica que o R
entendeu que esta variável como um double. Em breve este problema será
resolvido.
As variáveis quantitativas foram todas corretamente lidas como double.
Já as variáveis qualitativa, algumas delas, como
TP_DEPENDENCIA_ADM_ESCOLA
, por exemplo, por terem a sua categoria
representada por um número foram erradamente lidas pelo R
como um
double.
Veja mais um problema na base.
## [1] "Porto Velho" "Porto Velho" "Porto Velho"
## [4] "Porto Velho" "Porto Velho" "Porto Velho"
## [7] "Porto Velho" "Porto Velho" "Porto Velho"
## [10] "Porto Velho" "Porto Velho" "Porto Velho"
## [13] "Porto Velho" "Porto Velho" "Porto Velho"
## [16] "Porto Velho" "Porto Velho" "Porto Velho"
## [19] "Porto Velho" "Porto Velho" "Porto Velho"
## [22] "Porto Velho" "Porto Velho" "Porto Velho"
## [25] "Porto Velho" "Porto Velho" "Porto Velho"
## [28] "Porto Velho" "Porto Velho" "Porto Velho"
## [31] "Porto Velho" "Porto Velho" "Porto Velho"
## [34] "Porto Velho" "Porto Velho" "Nova Mamor\xe9"
## [37] "Nova Mamor\xe9" "Buritis" "Candeias do Jamari"
## [40] "Itapu\xe3 do Oeste" "Costa Marques" "Guajar\xe1-Mirim"
## [43] "Guajar\xe1-Mirim" "Guajar\xe1-Mirim" "Guajar\xe1-Mirim"
## [46] "Guajar\xe1-Mirim" "Guajar\xe1-Mirim" "Guajar\xe1-Mirim"
## [49] "Ariquemes" "Ariquemes"
Variáveis com texto em protuguês muitas vezes têm acentos e caracteres especiais, precisamos verificar se estes foram lidos corretamente. Caso não tenha sido lido, mudamos o encoding na função de leitura da base e este problema será resolvido.
base = read_csv2(file="MICRODADOS_ENEM_ESCOLA_2015.csv",
locale = locale(encoding = "latin1"))
base$NO_MUNICIPIO_ESCOLA[1:50]
Agora só falta corrigir o tipo das variáveis. Vamos fazer com que todas
as variáveis de identificação sejam do tipo "character"
e todas as
variáveis qualitativas para o tipo factor
.
base$NU_ANO = factor(base$NU_ANO)
base$CO_UF_ESCOLA = factor(base$CO_UF_ESCOLA)
base$SG_UF_ESCOLA = factor(base$SG_UF_ESCOLA)
base$CO_MUNICIPIO_ESCOLA = factor(base$CO_MUNICIPIO_ESCOLA)
base$NO_MUNICIPIO_ESCOLA = factor(base$NO_MUNICIPIO_ESCOLA)
base$TP_DEPENDENCIA_ADM_ESCOLA = factor(base$TP_DEPENDENCIA_ADM_ESCOLA,
levels = c(1,2,3,4),
labels = c("Federal", "Estadual" ,"Municipal","Privada")
)
base$TP_LOCALIZACAO_ESCOLA = factor(base$TP_LOCALIZACAO_ESCOLA,
levels = c(1,2),
labels = c("Urbana", "Rural")
)
base$INSE = factor(base$INSE)
base$PORTE_ESCOLA = factor(base$PORTE_ESCOLA)
glimpse(base)
## Rows: 15,598
## Columns: 27
## $ NU_ANO <fct> 2015, 2015, 2015, 2015, 2015, 2015, 2015, 20…
## $ CO_UF_ESCOLA <fct> 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, …
## $ SG_UF_ESCOLA <fct> RO, RO, RO, RO, RO, RO, RO, RO, RO, RO, RO, …
## $ CO_MUNICIPIO_ESCOLA <fct> 1100205, 1100205, 1100205, 1100205, 1100205,…
## $ NO_MUNICIPIO_ESCOLA <fct> Porto Velho, Porto Velho, Porto Velho, Porto…
## $ CO_ESCOLA_EDUCACENSO <chr> "11000058", "11000171", "11000198", "1100024…
## $ NO_ESCOLA_EDUCACENSO <chr> "CENTRO DE ENSINO CLASSE A", "CENTRO EDUCACI…
## $ TP_DEPENDENCIA_ADM_ESCOLA <fct> Privada, Privada, Privada, Privada, Privada,…
## $ TP_LOCALIZACAO_ESCOLA <fct> Urbana, Urbana, Urbana, Urbana, Urbana, Urba…
## $ NU_MATRICULAS <dbl> 137, 20, 39, 55, 26, 97, 44, 34, 75, 41, 24,…
## $ NU_PARTICIPANTES_NEC_ESP <dbl> 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,…
## $ NU_PARTICIPANTES <dbl> 130, 17, 37, 49, 23, 96, 38, 29, 59, 22, 21,…
## $ NU_TAXA_PARTICIPACAO <dbl> 94.89, 85.00, 94.87, 89.09, 88.46, 98.97, 86…
## $ NU_MEDIA_CN <dbl> 591.64, 458.46, 529.05, 508.74, 523.38, 505.…
## $ NU_MEDIA_CH <dbl> 652.34, 533.51, 583.87, 586.45, 591.66, 582.…
## $ NU_MEDIA_LP <dbl> 604.53, 472.62, 547.11, 531.35, 563.45, 527.…
## $ NU_MEDIA_MT <dbl> 627.66, 459.72, 507.22, 529.87, 528.93, 492.…
## $ NU_MEDIA_RED <dbl> 732.00, 507.82, 652.43, 591.84, 583.48, 580.…
## $ NU_MEDIA_OBJ <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ NU_MEDIA_TOT <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ INSE <fct> Grupo 6, Grupo 4, Grupo 5, Grupo 5, Grupo 5,…
## $ PC_FORMACAO_DOCENTE <dbl> 67.5, 58.3, 67.7, 56.0, 72.7, 53.6, 73.9, 46…
## $ NU_TAXA_PERMANENCIA <dbl> 78.46, 70.59, 40.54, 81.63, 52.17, 85.42, 63…
## $ NU_TAXA_APROVACAO <dbl> 96.1, 94.6, 90.1, 88.7, 84.5, 89.2, 73.9, 88…
## $ NU_TAXA_REPROVACAO <dbl> 3.9, 5.4, 9.9, 10.5, 13.1, 10.8, 22.2, 9.9, …
## $ NU_TAXA_ABANDONO <dbl> 0.0, 0.0, 0.0, 0.8, 2.4, 0.0, 3.9, 1.4, 0.3,…
## $ PORTE_ESCOLA <fct> Maior que 90 alunos, De 1 a 30 alunos, De 31…
2.2.2 Quanto ao seu objetivo
Outra classificação interessante de ser feita entre as variáveis,
diferentes das de identificação, é definir quais variáveis são
determinísticas e quais são aleatórias. Veja que algumas das variáveis
são facilmente observadas antes mesmo da prova do ENEM, por exemplo, o
número de alunos matriculados ("NU_MATRICULAS"
) e o porte da escola
("PORTE_ESCOLA"
). Estas são variáveis que de alguma maneira
caracterizam as escolas.
Outras variáveis já são aleatórias, que depende do desempenho dos alunos no ENEM, como as notas das escolas no ENEM. Estas são aquelas que pretendemos explicar em termos das que conhecemos. Será que uma escola grande tem mais chance de ter uma boa nota no ENEM quando comparada com uma escola pequena, ou seria o contrário? Como será a influência da taxa de abandono de uma escola com o seu desempenho no ENEM?
Costumamos chamar as variáveis determinísticas de covariáveis, ou variáveis independentes. Já as aleatórias, chamamos de variável de interesse, variável alvo ou desfecho.
Classificação | Variáveis |
---|---|
Covariáveis | “NU_ANO”, “NU_MATRICULAS”, “NU_PARTICIPANTES_NEC_ESP”, “NU_TAXA_PERMANENCIA”, “NU_TAXA_APROVACAO”, “NU_TAXA_REPROVACAO”, “NU_TAXA_ABANDONO”, “PC_FORMACAO_DOCENTE”, “CO_UF_ESCOLA”, “SG_UF_ESCOLA”, “CO_MUNICIPIO_ESCOLA”, “NO_MUNICIPIO_ESCOLA”, “TP_DEPENDENCIA_ADM_ESCOLA”, “TP_LOCALIZACAO_ESCOLA”, “INSE” e “PORTE_ESCOLA” |
Variáveis alvo | “NU_PARTICIPANTES”, “NU_TAXA_PARTICIPACAO”, “NU_MEDIA_CN”, “NU_MEDIA_LP”, “NU_MEDIA_MT”, “NU_MEDIA_RED”, “NU_MEDIA_OBJ” e “NU_MEDIA_TOT” |
2.3 Separação da base em treino e de teste
Em qualquer problema de Aprendizado de Máquinas é adequado separar a base de dados em duas partes: base de treino e base de teste. A base de treino é composta pela maioria das linhas da base original, geralmente em torno de 70% ou 80%, e é a partir dela que faremos todas as análises estatísticas. A base de teste , a menor parte, em torno de 20% ou 30%, será usada apenas para avaliar o desempenho dos modelos fora da base de treinamento. Dessa maneira é possível mensurar se o modelo está de fato aprendendo ou se está ocorrendo sobreajuste.
No pacote caret
(Kuhn 2022) existe a função createDataPartition
que
realiza a partição da base. Essa função retorna uma seleção aleatória
dos índices da base de tamanho indicada pelo argumento de entrada p
.
O código acima somente carrega o pacote e define o valor da semente pelo
comendo set.seed
. Isso é recomendado fazer sempre que o código tiver
alguma seleção aleatória, pois assim é possível replicar o código como
da primeira vez se for necessário.
N = nrow(base) #numero de linhas da base
indices_treino = createDataPartition(1:N,p=0.75)[[1]]
base_treino = base |> slice(indices_treino)
base_teste = base |> slice(-indices_treino)
Vamos verificar se a partição realizada respeitou 75% para base de treino e 25% para a base de teste.
n_treino = dim(base_treino)[1]
n_teste = dim(base_teste)[1]
#verificando a proporcao entre as bases
(n_treino/(n_treino+n_teste))
## [1] 0.7500962
## [1] 0.2499038
Toda análise realizada a partir de agora será feita considerando os dados da base de treino.
2.4 Limpeza da base de dados
Antes de ajustar/treinar qualquer modelo precisamos analisar com cuidado a base de dados para garantir que não teremos problemas futuros. Os principais passos dessa análise de dados são:
breve análise a partir da função
summary
;procurar dados faltantes;
procurar covariáveis com variância quase zero (ou zero);
procurar covariáveis com alta correlação.
2.4.1 Dados faltantes
É preciso verificar se a base possui dados faltantes. Caso afirmativo, teremos que tomar uma decisão: eliminar a linha (escola), eliminar a coluna (variável) ou imputar valores para as entradas com dados faltantes.
A função summary
mostra se alguma variável está toda
preenchida com `NA.
## NU_ANO CO_UF_ESCOLA SG_UF_ESCOLA CO_MUNICIPIO_ESCOLA
## 2015:11700 35 :2495 SP :2495 3550308: 510
## 31 :1279 MG :1279 3304557: 362
## 33 :1076 RJ :1076 2304400: 219
## 43 : 858 RS : 858 5300108: 149
## 23 : 632 CE : 632 3106200: 136
## 41 : 524 PR : 524 2927408: 121
## (Other):4836 (Other):4836 (Other):10203
## NO_MUNICIPIO_ESCOLA CO_ESCOLA_EDUCACENSO NO_ESCOLA_EDUCACENSO
## São Paulo : 510 Length:11700 Length:11700
## Rio de Janeiro: 362 Class :character Class :character
## Fortaleza : 219 Mode :character Mode :character
## Brasília : 149
## Belo Horizonte: 136
## Salvador : 121
## (Other) :10203
## TP_DEPENDENCIA_ADM_ESCOLA TP_LOCALIZACAO_ESCOLA NU_MATRICULAS
## Federal : 247 Urbana:11277 Min. : 10.00
## Estadual :6629 Rural : 423 1st Qu.: 29.00
## Municipal: 79 Median : 58.00
## Privada :4745 Mean : 85.92
## 3rd Qu.:113.00
## Max. :835.00
##
## NU_PARTICIPANTES_NEC_ESP NU_PARTICIPANTES NU_TAXA_PARTICIPACAO NU_MEDIA_CN
## Min. : 0.0000 Min. : 10.00 Min. : 50.00 Min. :388.6
## 1st Qu.: 0.0000 1st Qu.: 23.00 1st Qu.: 62.31 1st Qu.:456.5
## Median : 0.0000 Median : 42.00 Median : 76.92 Median :476.6
## Mean : 0.5626 Mean : 62.84 Mean : 76.16 Mean :490.8
## 3rd Qu.: 1.0000 3rd Qu.: 80.00 3rd Qu.: 90.38 3rd Qu.:519.0
## Max. :27.0000 Max. :658.00 Max. :100.00 Max. :720.4
##
## NU_MEDIA_CH NU_MEDIA_LP NU_MEDIA_MT NU_MEDIA_RED NU_MEDIA_OBJ
## Min. :460.9 Min. :397.1 Min. :372.4 Min. :345.0 Mode:logical
## 1st Qu.:537.3 1st Qu.:484.4 1st Qu.:442.9 1st Qu.:508.4 NA's:11700
## Median :559.0 Median :509.7 Median :471.3 Median :547.2
## Mean :566.8 Mean :515.4 Mean :492.4 Mean :564.0
## 3rd Qu.:594.1 3rd Qu.:545.3 3rd Qu.:527.8 3rd Qu.:609.6
## Max. :709.2 Max. :649.9 Max. :845.7 Max. :920.0
##
## NU_MEDIA_TOT INSE PC_FORMACAO_DOCENTE NU_TAXA_PERMANENCIA
## Mode:logical Grupo 1: 753 Min. : 0.00 Min. : 0.00
## NA's:11700 Grupo 2:1030 1st Qu.: 49.70 1st Qu.: 69.23
## Grupo 3:3578 Median : 62.00 Median : 80.47
## Grupo 4:2856 Mean : 60.44 Mean : 75.98
## Grupo 5:2464 3rd Qu.: 73.10 3rd Qu.: 88.89
## Grupo 6:1018 Max. :100.00 Max. :100.00
## NA's : 1 NA's :14
## NU_TAXA_APROVACAO NU_TAXA_REPROVACAO NU_TAXA_ABANDONO
## Min. : 38.9 Min. : 0.000 Min. : 0.000
## 1st Qu.: 80.8 1st Qu.: 2.800 1st Qu.: 0.000
## Median : 90.5 Median : 6.700 Median : 0.900
## Mean : 87.4 Mean : 8.822 Mean : 3.776
## 3rd Qu.: 96.2 3rd Qu.:12.700 3rd Qu.: 6.000
## Max. :100.0 Max. :60.200 Max. :51.600
## NA's :65 NA's :65 NA's :65
## PORTE_ESCOLA
## De 1 a 30 alunos :3147
## De 31 a 60 alunos :2893
## De 61 a 90 alunos :1827
## Maior que 90 alunos:3833
##
##
##
Podemos identificar que as variábeis NU_MEDIA_OBJ
e NU_MEDIA_TOT
estão com todos os valores como NA
. Nesse, as duas variáveis serão retiradas da base.
Mas será aque ainda existem dados faltantes?
## # A tibble: 25 × 3
## variable n_miss pct_miss
## <chr> <int> <dbl>
## 1 NU_TAXA_APROVACAO 65 0.556
## 2 NU_TAXA_REPROVACAO 65 0.556
## 3 NU_TAXA_ABANDONO 65 0.556
## 4 PC_FORMACAO_DOCENTE 14 0.120
## 5 INSE 1 0.00855
## 6 NU_ANO 0 0
## 7 CO_UF_ESCOLA 0 0
## 8 SG_UF_ESCOLA 0 0
## 9 CO_MUNICIPIO_ESCOLA 0 0
## 10 NO_MUNICIPIO_ESCOLA 0 0
## # … with 15 more rows
## # ℹ Use `print(n = ...)` to see more rows
2.4.1.1 Dados faltantes para a variável de interesse
Caso seja encontrada alguma linha da base, para o nosso exemplo alguma escola, com dados faltantes para uma das varáveis de interesse, as linhas correspondentes devem ser eliminadas, uma vez que não pode-se imputar valores para ela.
Observando novamente a saída do comando summary
percebemos que as únicas variáveis de interesse com dados faltantes eram NU_MEDIA_OBJ
e NU_MEDIA_TOT
, que já foram retiradas da base. Assim não temos dados faltantes em nenhuma variável de interesse depois da última alteração.
2.4.1.2 Dados faltantes para as covariáveis
Analisando os gráficos apresentados nesta seção podemos perceber que as
variáveis NU_TAXA_APROVACAO
, NU_TAXA_REPROVACAO
e nem para
NU_TAXA_ABANDONO
têm valores faltantes para as mesmas linhas da base
de dados, ou seja, para as mesmas escolas. Se excluirmos essas escolas
da base de treino, o método criado não terá capacidade de analisar
outras escolas, da base de teste, com as mesmas informações faltantes.
Uma alternativa, que pouco muda o ajuste do modelo e permite que ele
seja usado mesmo quando existem valores faltantes na base, é imputar
valores para os dados faltantes. Em geral usa-se a média, no caso das
variáveis quantitativas, ou a moda, no caso das variáveis qualitativas.
Se fosse uma variável qualitativa com muitos valores faltantes, ainda
existe a possibilidade de se criar uma nova categoria, como por exemplo
"não respondeu"
.
Segue as linhas de comando para imputação dos valores faltantes.
Primeiro as variáveis quantitativas e por último a única variável
qualitativa com valores faltantes, INSE
.
base_treino = base_treino |>
mutate(NU_TAXA_APROVACAO = replace_na(NU_TAXA_APROVACAO, mean(NU_TAXA_APROVACAO, na.rm = TRUE)),
NU_TAXA_REPROVACAO = replace_na(NU_TAXA_REPROVACAO, mean(NU_TAXA_REPROVACAO, na.rm = TRUE)),
NU_TAXA_ABANDONO = replace_na(NU_TAXA_ABANDONO, mean(NU_TAXA_ABANDONO, na.rm = TRUE)),
PC_FORMACAO_DOCENTE = replace_na(PC_FORMACAO_DOCENTE, mean(PC_FORMACAO_DOCENTE, na.rm = TRUE))
)
moda = names(table(base_treino$INSE))[which.max(table(base_treino$INSE))]
base_treino = base_treino |> mutate(INSE = replace_na(INSE,moda))
Verificando que não há mais dados faltantes.
## # A tibble: 25 × 3
## variable n_miss pct_miss
## <chr> <int> <dbl>
## 1 NU_ANO 0 0
## 2 CO_UF_ESCOLA 0 0
## 3 SG_UF_ESCOLA 0 0
## 4 CO_MUNICIPIO_ESCOLA 0 0
## 5 NO_MUNICIPIO_ESCOLA 0 0
## 6 CO_ESCOLA_EDUCACENSO 0 0
## 7 NO_ESCOLA_EDUCACENSO 0 0
## 8 TP_DEPENDENCIA_ADM_ESCOLA 0 0
## 9 TP_LOCALIZACAO_ESCOLA 0 0
## 10 NU_MATRICULAS 0 0
## # … with 15 more rows
## # ℹ Use `print(n = ...)` to see more rows
2.4.2 Covariáveis com variância (quase) zero
Para procurar as variáveis com variância (quase) zero vamos analisar a
variabilidade de cada variável. Nesse momento é importante tratar de
forma diferente as variáveis quantitativas das qualitativas, por isso
foram criados os objetos qualitativas
e quantitativas
, que guardam
os nomes das covariáveis quantitativas e qualitativas. Ele facilitará o
código a seguir.
A variabilidade das variáveis quantitativas será dada pela variância
amostral, que pode ser encontrada a partir do comando var
.
## NU_MATRICULAS NU_PARTICIPANTES_NEC_ESP NU_PARTICIPANTES
## 7118.322823 1.829308 3858.560551
## NU_TAXA_PARTICIPACAO NU_MEDIA_CN NU_MEDIA_CH
## 236.777373 2227.860448 1595.884448
## NU_MEDIA_LP NU_MEDIA_MT NU_MEDIA_RED
## 1732.500132 4716.964468 6029.947170
## PC_FORMACAO_DOCENTE NU_TAXA_PERMANENCIA NU_TAXA_APROVACAO
## 297.007113 390.706286 119.106033
## NU_TAXA_REPROVACAO NU_TAXA_ABANDONO
## 62.774436 30.303195
Nenhuma variável quantitativa com variância nula.
Agora o caso das variáveis qualitativas. Para medir a variabilidade destas variáveis vamos contar a quantidade de categorias que cada uma delas apresenta. Só será descartada aquelas que apresentarem apenas uma categoria.
## NU_ANO CO_UF_ESCOLA SG_UF_ESCOLA CO_MUNICIPIO_ESCOLA
## 2015:11700 35 :2495 SP :2495 3550308: 510
## 31 :1279 MG :1279 3304557: 362
## 33 :1076 RJ :1076 2304400: 219
## 43 : 858 RS : 858 5300108: 149
## 23 : 632 CE : 632 3106200: 136
## 41 : 524 PR : 524 2927408: 121
## (Other):4836 (Other):4836 (Other):10203
## NO_MUNICIPIO_ESCOLA TP_DEPENDENCIA_ADM_ESCOLA TP_LOCALIZACAO_ESCOLA
## São Paulo : 510 Federal : 247 Urbana:11277
## Rio de Janeiro: 362 Estadual :6629 Rural : 423
## Fortaleza : 219 Municipal: 79
## Brasília : 149 Privada :4745
## Belo Horizonte: 136
## Salvador : 121
## (Other) :10203
## INSE PORTE_ESCOLA
## Grupo 1: 753 De 1 a 30 alunos :3147
## Grupo 2:1030 De 31 a 60 alunos :2893
## Grupo 3:3579 De 61 a 90 alunos :1827
## Grupo 4:2856 Maior que 90 alunos:3833
## Grupo 5:2464
## Grupo 6:1018
##
Veja que a variável NU_ANO
apresenta uma única categoria. Todas as
observações são referentes ao mesmo ano. Dessa forma esta variável não
agrega informação e será retirada da base.
2.4.3 Análise de Multicolinearidade
A Análise de Multicolinearidade é o processo de seleção de variáveis para garantir que as covariáveis da base não apresentam alta correlação entre si. Esse processo consiste em procurar variáveis altamente correlacionadas e, no caso destas existirem, escolher algumas para ficarem na base e outras para saírem, de forma que a base final não contenha covariáveis com correlação maior que 80%.
A principal questão nesta etapa é como medir a associação entre as
covariáveis. O cálculo da correlação amostral, a partir da função cor
do R, só deve ser feito entre variáveis quantitativas. Entre pares de
variáveis qualitativas e entre uma variável qualitativa e outra
quantitativa é preciso utilizar outra medida de associação, como será
visto mais pra frente.
2.4.3.1 Entre pares de covariáveis quantitativas
Primeiro a análise das associações entre as variáveis quantitativas,
duas a duas. A medida de associação utilizada será a correlação, a
partir da função cor
. As variáveis de interesse não serão consideradas
nesta etapa.
mat_cor = base_treino |>
select(where(is.numeric)) |>
select(-c(NU_TAXA_PARTICIPACAO,
NU_PARTICIPANTES,
NU_MEDIA_CN,
NU_MEDIA_LP,
NU_MEDIA_MT,
NU_MEDIA_RED,
NU_MEDIA_CH)) |>
cor()
mat_cor
## NU_MATRICULAS NU_PARTICIPANTES_NEC_ESP
## NU_MATRICULAS 1.000000000 0.40071034
## NU_PARTICIPANTES_NEC_ESP 0.400710336 1.00000000
## PC_FORMACAO_DOCENTE 0.152880742 0.06447547
## NU_TAXA_PERMANENCIA -0.006362418 0.01192405
## NU_TAXA_APROVACAO -0.283616144 -0.18180816
## NU_TAXA_REPROVACAO 0.228583994 0.15421657
## NU_TAXA_ABANDONO 0.233283453 0.13848074
## PC_FORMACAO_DOCENTE NU_TAXA_PERMANENCIA
## NU_MATRICULAS 0.152880742 -0.0063624179
## NU_PARTICIPANTES_NEC_ESP 0.064475474 0.0119240509
## PC_FORMACAO_DOCENTE 1.000000000 0.0290660572
## NU_TAXA_PERMANENCIA 0.029066057 1.0000000000
## NU_TAXA_APROVACAO -0.005119007 0.0050907666
## NU_TAXA_REPROVACAO 0.048549624 -0.0063308905
## NU_TAXA_ABANDONO -0.059728155 -0.0009807009
## NU_TAXA_APROVACAO NU_TAXA_REPROVACAO NU_TAXA_ABANDONO
## NU_MATRICULAS -0.283616144 0.22858399 0.2332834533
## NU_PARTICIPANTES_NEC_ESP -0.181808162 0.15421657 0.1384807443
## PC_FORMACAO_DOCENTE -0.005119007 0.04854962 -0.0597281554
## NU_TAXA_PERMANENCIA 0.005090767 -0.00633089 -0.0009807009
## NU_TAXA_APROVACAO 1.000000000 -0.87648766 -0.7210265409
## NU_TAXA_REPROVACAO -0.876487660 1.00000000 0.2983883659
## NU_TAXA_ABANDONO -0.721026541 0.29838837 1.0000000000
Uma maneira gráfica de visualizar essas correlações, e ainda ganhar uma
análise descritiva de brinde, é a partir do comando ggpairs
.
library(GGally)
base_treino |>
select(where(is.numeric)) |>
select(-c(NU_TAXA_PARTICIPACAO,
NU_PARTICIPANTES,
NU_MEDIA_CN,
NU_MEDIA_LP,
NU_MEDIA_MT,
NU_MEDIA_RED,
NU_MEDIA_CH)) |>
ggpairs()
O resultado indica uma forte correlação entre NU_TAXA_APROVACAO
e NU_TAXA_REPROVACAO
,
NU_TAXA_APROVACAO
e NU_TAXA_ABANDONO
. veja queNU_TAXA_REPROVACAO
e NU_TAXA_ABANDONO
não apresentam grande correlação entre elas. Por esse motivo será descartada da base a variávei NU_TAXA_APROVACAO
.
2.4.3.2 Entre pares de covariáveis qualitativas
Para mensurar a associação entre duas variáveis qualitativas será usado o Coeficiente de Contingência Modificado. Primeiro serão feitas as contas para um par específico de covariáveis e depois a conta será generalizada para todos os pares.
Considere as covariáveis qualitativas TP_LOCALIZACAO_ESCOLA
e
PORTE_ESCOLA
. Antes da apresentação do coeficiente de contingência,
veja a tabela de contingência para essas duas variáveis.
De 1 a 30 alunos | De 31 a 60 alunos | TOTAL | Maior que 90 alunos | TOTAL | |
---|---|---|---|---|---|
Urbana | 2976 | 2767 | 1763 | 3771 | 11277 |
Rural | 171 | 126 | 64 | 62 | 423 |
3147 | 2893 | 1827 | 3833 | 11700 |
Vamos chamar de valor observado para a \(i\) da primeira variável e a categoria \(j\) da segunda variável o número que indica quantos indivíduos da base satisfazem tanto a categoria \(i\) quando a categoria \(j\), representado por \(O_{i,j}\). Este valor está na tabela acima, por exemplo, 2970 escolas da base de treino estão na zona rural e têm porte entre 1 e 30 alunos no último ano do ensino médio.
Se as covariáveis são independentes espera-se encontrar em cada célula \((i,j)\) a proporção em relação a todos os valores da categoria \(i\) igual a proporção que todos os valores da categoria \(j\) representam para toda a amostra, que será chamado de \(E_{i,j}\).
\[ E_{i,j} = \text{total linha i} \times \dfrac{ \text{total coluna j}}{\text{total da tabela}} \]
Por exemplo, o valor esperado para a célula \((1,1)\) da tabela é:
\[ E_{1,1} = 3.145 \times \dfrac{11.286}{11.700} = 3.033,715 \] Já o valor observado para a célula \((1,1)\) é \(O_{1,1} = 2.970,00\).
As frequências esperadas são comparadas com as observadas e a partir desta comparação é calculada uma estatística, chamada de Qui-Quadrado, \(\chi^2\), definida por:
\[ \chi^2 = \sum_{i=1}^L \sum_{j=1}^C \dfrac{(O_{i,j} - E_{i,j})^2}{E_{i,j}} \]
Quanto maior for o valor de \(\chi^2\), maior será o grau de associação
entre as variáveis. O valor da estatística qui-quadrado pode ser
encontrada pela função chisq.test
.
## X-squared
## 78.37618
O Coeficiente de Contingência Modificado, definido a seguir, varia de zero (completa independência) até 1 (associação perfeita).
\[ C^\star = \sqrt{\dfrac{\chi^2}{\chi^2 + N}}\sqrt{\dfrac{k}{k-1}} \]
sendo \(\chi^2\) a estatística Qui-Quadrado, \(N\) é o número total de observações da tabela de contingências, \(k\) é o menor número entre o número de linhas e colunas da tabela de contingências.
## X-squared
## 0.1153624
O resultado indica que as variáveis TP_LOCALIZACAO_ESCOLA
e
PORTE_ESCOLA
apresentam baixa associação. O gráfico de barras empilhadas destas duas variáveis é uma forma de vizualizar a relação entre elas.
par(mfrow=c(1,2))
base_treino |>
select(TP_LOCALIZACAO_ESCOLA,PORTE_ESCOLA) |>
table() |>
prop.table(margin = 2) |> cbind(a="") |>
barplot(col=c("#7D786A","#74CE7F","white"),
main ="Localização da escola por porte",
names.arg = c("[1,30]","[31,60]","[61,90]","+90",""),
las = 2
)
legend("right",
horiz = FALSE,
legend = levels(base_treino$TP_LOCALIZACAO_ESCOLA),
fill = c("#7D786A","#74CE7F"))
base_treino |>
select(PORTE_ESCOLA,TP_LOCALIZACAO_ESCOLA) |>
table() |>
prop.table(margin = 2) |> cbind(a="") |>
barplot(col=c("#E1E1E1","#FBB400","#F17D21","#F15E51","white"),
names.arg = c(levels(base_treino$TP_LOCALIZACAO_ESCOLA),""),
main="Porte da escola por local")
legend("right",c("[1,30]","[31,60]","[61,90]","+90"),
horiz = FALSE,
fill = c("#E1E1E1","#FBB400","#F17D21","#F15E51"))
Repetir o procedimento descrito acima para todo par de variáveis qualitativas pode ser bem custoso e demorado. O código a seguir automatiza esta conta e cria uma matriz com o coeficiente de contingência para todos os possíveis pares de variáveis qualitativas da base.
base_quali = base_treino |> select(where(is.factor))
base_quali = apply(base_quali,
MARGIN = 2,
FUN = "as.character")
n = ncol(base_quali)
mat_coef_cont = matrix(NA,ncol = n,
nrow = n)
colnames(mat_coef_cont) = colnames(base_quali)
rownames(mat_coef_cont) = colnames(base_quali)
N = nrow(base_quali)
for(i in 1:n){
for(j in 1:n){
tabela = table(base_quali[,i],base_quali[,j])
dim(tabela)
aux = chisq.test(tabela, correct = FALSE)
q = aux$statistic
k = min(nrow(tabela),
ncol(tabela))
mat_coef_cont[i,j] = sqrt(q/(q+N))*sqrt(k/(k-1))
}
}
mat_coef_cont
## CO_UF_ESCOLA SG_UF_ESCOLA CO_MUNICIPIO_ESCOLA
## CO_UF_ESCOLA 1.0000000 1.0000000 1.0000000
## SG_UF_ESCOLA 1.0000000 1.0000000 1.0000000
## CO_MUNICIPIO_ESCOLA 1.0000000 1.0000000 1.0000000
## NO_MUNICIPIO_ESCOLA 0.9995445 0.9995445 1.0000000
## TP_DEPENDENCIA_ADM_ESCOLA 0.2982486 0.2982486 0.7830383
## TP_LOCALIZACAO_ESCOLA 0.1410659 0.1410659 0.7757372
## INSE 0.6674883 0.6674883 0.9009905
## PORTE_ESCOLA 0.2594393 0.2594393 0.7856970
## NO_MUNICIPIO_ESCOLA TP_DEPENDENCIA_ADM_ESCOLA
## CO_UF_ESCOLA 0.9995445 0.2982486
## SG_UF_ESCOLA 0.9995445 0.2982486
## CO_MUNICIPIO_ESCOLA 1.0000000 0.7830383
## NO_MUNICIPIO_ESCOLA 1.0000000 0.7740119
## TP_DEPENDENCIA_ADM_ESCOLA 0.7740119 1.0000000
## TP_LOCALIZACAO_ESCOLA 0.7704964 0.2258141
## INSE 0.8958194 0.6443970
## PORTE_ESCOLA 0.7788526 0.5164087
## TP_LOCALIZACAO_ESCOLA INSE PORTE_ESCOLA
## CO_UF_ESCOLA 0.1410659 0.6674883 0.2594393
## SG_UF_ESCOLA 0.1410659 0.6674883 0.2594393
## CO_MUNICIPIO_ESCOLA 0.7757372 0.9009905 0.7856970
## NO_MUNICIPIO_ESCOLA 0.7704964 0.8958194 0.7788526
## TP_DEPENDENCIA_ADM_ESCOLA 0.2258141 0.6443970 0.5164087
## TP_LOCALIZACAO_ESCOLA 1.0000000 0.2461237 0.1153624
## INSE 0.2461237 1.0000000 0.3346274
## PORTE_ESCOLA 0.1153624 0.3346274 1.0000000
Os resultados indicam, como já esperado, uma grande associação entre as
variáveis CO_UF_ESCOLA
, SG_UF_ESCOLA
, CO_MUNICIPIO_ESCOLA
e
NO_MUNICIPIO_ESCOLA
. Estas quatro variáveis caracterizam a localização
da escola. Como são muitas as categorias para os municípios, entre estas
quatro variáveis será mantida apenas a SG_UF_ESCOLA
.
As variáveis qualitativas restantes na base não apresentam associação grande o suficiente para justificar mais alguma retirada.
2.4.3.3 Entre uma covariáveis quantitativa e outra qualitativa
Por fim, as associações entre uma variável quantitativa e outra qualitativa será calculado a partir da medida \(R^2\). Essa medida é obtida da seguinte maneira. Primeiro é calculada a variância amostral da variável quantitativa restrita a cada categoria da variável qualitativa. Considere \(X\) a variável qualitativa e \(Y\) a quantitativa.
\[ \sigma^2_c = Var(Y , X = c) \]
Em seguida é feita a conta da variância média, que é a média das variâncias calculadas acima ponderada pelo número de observações em cada categoria de \(c\).
\[ \sigma^2_{med} = \sum_{c \in C} \dfrac{\sigma^2_c \times n_c}{n}, \]
sendo \(C\) o conjunto com as possíveis categorias de \(X\), \(n_c\) o número de observações com \(X=c\) e \(n\) o número total de observações. O valor de \(R^2\) será
\[ R^2 = 1 - \dfrac{\sigma^2_{med}}{\sigma^2} \]
onde \(\sigma^2\) é a variância da variável quantitativa considerando toda a amostra.
Vejamos como ficaria o valor de \(R^2\) para as variáveis \(X =\)
SG_UF_ESCOLA
e $Y = $ NU_PARTICIPANTES
.
resumo = base_treino |>
group_by(SG_UF_ESCOLA) |>
summarise(variancia = var(NU_PARTICIPANTES),
n = n() #função que contabiliza o número de linhas
)
resumo
## # A tibble: 27 × 3
## SG_UF_ESCOLA variancia n
## <fct> <dbl> <int>
## 1 AC 7308. 40
## 2 AL 3326. 161
## 3 AM 11477. 120
## 4 AP 9402. 44
## 5 BA 3756. 516
## 6 CE 5719. 632
## 7 DF 13988. 149
## 8 ES 4399. 286
## 9 GO 3347. 461
## 10 MA 5521. 247
## # … with 17 more rows
## # ℹ Use `print(n = ...)` to see more rows
Var_med = sum((resumo$variancia*resumo$n))/sum(resumo$n)
R2 = 1 - Var_med/var(base_treino$NU_PARTICIPANTES)
R2
## [1] 0.06398418
Valores baixos de \(R^2\), perto de zero, indicam baixa associação entre
as variáveis. Valores altos de \(R^2\), perto de um, indicam alta
associação. Conclui-se então que as variáveis SG_UF_ESCOLA
e NU_PARTICIPANTES
apresentam baixa associação. O gráfico do boxplot da variável quantitativa para cada categoria da qualitativa é uma possível análise visual a respeito da associação das duas variáveis.
boxplot(
base_treino$NU_PARTICIPANTES ~ base_treino$SG_UF_ESCOLA,
xlab = "UF escolas",
ylab = "Nº Participantes"
)
Assim como foi automatizado o cálculo do coeficiente de contingência, o cálculo do \(R^2\) será automatizado.
names_quali = names(base_treino |> select(where(is.factor)))
index_quali = which(names(base_treino) %in% names_quali )
names_quanti = names(base_treino |> select(where(is.numeric)) |>
select(-c(NU_TAXA_PARTICIPACAO, NU_PARTICIPANTES, NU_MEDIA_CN, NU_MEDIA_LP, NU_MEDIA_MT, NU_MEDIA_RED, NU_MEDIA_CH) ))
index_quanti = which(names(base_treino) %in% names_quanti )
R2_mat = matrix(NA,
nrow = length(index_quali),
ncol = length(index_quanti))
rownames(R2_mat) = names_quali
colnames(R2_mat) = names_quanti
for(l in 1:length(index_quali)){
for(c in 1:length(index_quanti)){
i = index_quali[l]
j = index_quanti[c]
resumo = base_treino |> group_by_at(i) |>
summarise(n=n(),
variancia = var(eval(as.symbol(names(base_treino)[j])))
)
Var_med = sum((resumo$variancia*resumo$n))/sum(resumo$n)
R2_mat[l,c] = 1 - Var_med/var(base_treino[,j])
}
}
R2_mat
## NU_MATRICULAS NU_PARTICIPANTES_NEC_ESP
## SG_UF_ESCOLA 0.049086208 0.052409797
## TP_DEPENDENCIA_ADM_ESCOLA 0.149521403 0.057232094
## TP_LOCALIZACAO_ESCOLA 0.006236224 0.001853315
## INSE 0.058096488 0.017493387
## PORTE_ESCOLA 0.599035395 0.096215392
## PC_FORMACAO_DOCENTE NU_TAXA_PERMANENCIA
## SG_UF_ESCOLA 0.234033134 0.048356114
## TP_DEPENDENCIA_ADM_ESCOLA 0.015142705 0.032986538
## TP_LOCALIZACAO_ESCOLA 0.007723438 0.003363637
## INSE 0.082371015 0.007873919
## PORTE_ESCOLA 0.031177327 0.007327728
## NU_TAXA_REPROVACAO NU_TAXA_ABANDONO
## SG_UF_ESCOLA 0.1256118765 0.1608382436
## TP_DEPENDENCIA_ADM_ESCOLA 0.1516780308 0.2666830599
## TP_LOCALIZACAO_ESCOLA 0.0006946453 0.0007267075
## INSE 0.0848976039 0.2192047992
## PORTE_ESCOLA 0.0657965820 0.0769356917
A matriz acima não apresenta nenhum valor acima de 0,7. Podemos então concluir que a associação entre as variáveis quantitativas e qualitativas, duas a duas, é baixa.
2.5 Uma breve Análise Descritiva
Antes de salvar a base de treino final vale fazer uma breve análise
descritiva. Primeiro a partir da função summary
.
## SG_UF_ESCOLA CO_ESCOLA_EDUCACENSO NO_ESCOLA_EDUCACENSO
## SP :2495 Length:11700 Length:11700
## MG :1279 Class :character Class :character
## RJ :1076 Mode :character Mode :character
## RS : 858
## CE : 632
## PR : 524
## (Other):4836
## TP_DEPENDENCIA_ADM_ESCOLA TP_LOCALIZACAO_ESCOLA NU_MATRICULAS
## Federal : 247 Urbana:11277 Min. : 10.00
## Estadual :6629 Rural : 423 1st Qu.: 29.00
## Municipal: 79 Median : 58.00
## Privada :4745 Mean : 85.92
## 3rd Qu.:113.00
## Max. :835.00
##
## NU_PARTICIPANTES_NEC_ESP NU_PARTICIPANTES NU_TAXA_PARTICIPACAO NU_MEDIA_CN
## Min. : 0.0000 Min. : 10.00 Min. : 50.00 Min. :388.6
## 1st Qu.: 0.0000 1st Qu.: 23.00 1st Qu.: 62.31 1st Qu.:456.5
## Median : 0.0000 Median : 42.00 Median : 76.92 Median :476.6
## Mean : 0.5626 Mean : 62.84 Mean : 76.16 Mean :490.8
## 3rd Qu.: 1.0000 3rd Qu.: 80.00 3rd Qu.: 90.38 3rd Qu.:519.0
## Max. :27.0000 Max. :658.00 Max. :100.00 Max. :720.4
##
## NU_MEDIA_CH NU_MEDIA_LP NU_MEDIA_MT NU_MEDIA_RED INSE
## Min. :460.9 Min. :397.1 Min. :372.4 Min. :345.0 Grupo 1: 753
## 1st Qu.:537.3 1st Qu.:484.4 1st Qu.:442.9 1st Qu.:508.4 Grupo 2:1030
## Median :559.0 Median :509.7 Median :471.3 Median :547.2 Grupo 3:3579
## Mean :566.8 Mean :515.4 Mean :492.4 Mean :564.0 Grupo 4:2856
## 3rd Qu.:594.1 3rd Qu.:545.3 3rd Qu.:527.8 3rd Qu.:609.6 Grupo 5:2464
## Max. :709.2 Max. :649.9 Max. :845.7 Max. :920.0 Grupo 6:1018
##
## PC_FORMACAO_DOCENTE NU_TAXA_PERMANENCIA NU_TAXA_REPROVACAO NU_TAXA_ABANDONO
## Min. : 0.00 Min. : 0.00 Min. : 0.000 Min. : 0.000
## 1st Qu.: 49.70 1st Qu.: 69.23 1st Qu.: 2.900 1st Qu.: 0.000
## Median : 62.00 Median : 80.47 Median : 6.800 Median : 1.000
## Mean : 60.44 Mean : 75.98 Mean : 8.822 Mean : 3.776
## 3rd Qu.: 73.10 3rd Qu.: 88.89 3rd Qu.:12.700 3rd Qu.: 6.000
## Max. :100.00 Max. :100.00 Max. :60.200 Max. :51.600
##
## PORTE_ESCOLA
## De 1 a 30 alunos :3147
## De 31 a 60 alunos :2893
## De 61 a 90 alunos :1827
## Maior que 90 alunos:3833
##
##
##
Outra análise possível é a partir da função ggpairs do pacote GGally (Schloerke et al. 2021). Esta é uma função custosa, pode demorar para rodar. Além disso, ela gera muitos gráficos em uma única janela e se forem usadas muitas variáveis fica pequena demais cada figura. Por esse motivo esta função será rodada apenas para as variáveis quantitativas, que são as variáveis com melhor resultado da função.
2.6 Como salvar a base final
Todo o processo realizado neste capítulo foi bem custoso e resultou em uma base de treino pronta para ser trabalhada. Para garantir que o trabalho realizado não precisará ser repetido, a base final deve ser salva. Assim, quando for necessário utilizar esta base, em algum trabalho, basta carregar a base final salva.