pd_analise_exploratoria_dados

1. Introdução e Escolha da Base de Dados

A base de dados escolhida para este projeto é o dataset Life Expectancy (WHO) - 2025, obtido no Kaggle.

Motivo da Escolha: Fiz questão de, neste trabalho, buscar uma base de dados real e que nos permitisse insights interessantes e relevantes para a atualidade. Experiências anteriores com bases sintéticas mostraram que nem sempre é possível este tipo de análise quando os dados não são reais. Desta forma, este dataset foi selecionado por apresentar uma estrutura rica para análise, atendendo os requisitos do projeto por possuir mais de 4 variáveis numéricas de interesse e presença de dados faltantes, permitindo a prática de técnicas de imputação.

Resultados Esperados: Espera-se identificar quais fatores possuem maior correlação com a expectativa de vida e verificar como essas variáveis se distribuem através dos países, além de tratar as lacunas nos dados para garantir uma análise robusta. A análise visa fornecer insights sobre os determinantes da expectativa de vida.

2. Importação das bibliotecas e preparação dos dados

# Carregamento de bibliotecas
library(tidyverse)   
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.2     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(summarytools) 

Anexando pacote: 'summarytools'

O seguinte objeto é mascarado por 'package:tibble':

    view
library(ggpubr)       
library(mice)         
Registered S3 method overwritten by 'lme4':
  method           from
  na.action.merMod car 

Anexando pacote: 'mice'

O seguinte objeto é mascarado por 'package:stats':

    filter

Os seguintes objetos são mascarados por 'package:base':

    cbind, rbind
library(gtsummary)    
library(corrplot)    
corrplot 0.95 loaded
# Leitura dos dados do arquivo CSV 
df <- read.csv("data/Life_expectancy_2025.csv")

# Padronizando nomes de colunas (substituindo espaços por underscores)
names(df) <- make.names(names(df))

str(df)
'data.frame':   193 obs. of  22 variables:
 $ Country                        : chr  "Afghanistan" "Albania" "Algeria" "Angola" ...
 $ Status                         : chr  "Developing" "Developing" "Developing" "Developing" ...
 $ Year                           : int  2025 2025 2025 2025 2025 2025 2025 2025 2025 2025 ...
 $ Life.expectancy                : num  58.2 75.2 73.6 49 75.1 ...
 $ Adult.Mortality                : num  269.1 45.1 108.2 328.6 127.5 ...
 $ infant.deaths                  : num  78.25 0.688 20.312 83.75 0 ...
 $ Alcohol                        : num  0.0144 4.8487 0.4067 5.7407 7.9493 ...
 $ percentage.expenditure         : num  35 193 236 102 1002 ...
 $ Hepatitis.B                    : num  64.6 98 78 70.2 98.3 ...
 $ Measles                        : num  2362.2 53.4 1943.9 3561.3 0 ...
 $ BMI                            : num  15.5 49.1 48.7 18 38.4 ...
 $ under.five.deaths              : num  107.562 0.938 23.5 132.625 0 ...
 $ Polio                          : num  48.4 98.1 91.8 46.1 96.9 ...
 $ Total.expenditure              : num  8.25 5.95 4.6 3.92 4.79 ...
 $ Diphtheria                     : num  52.3 98.1 91.9 47.7 98.3 ...
 $ HIV.AIDS                       : num  0.1 0.1 0.1 2.369 0.125 ...
 $ GDP                            : num  340 2120 2848 1975 9759 ...
 $ Population                     : num  33831764 696912 21649827 10147099 91818 ...
 $ thinness.1.19.years            : num  16.58 1.62 6.09 6.19 3.42 ...
 $ thinness.5.9.years             : num  15.58 1.7 5.97 6.67 3.38 ...
 $ Income.composition.of.resources: num  0.415 0.71 0.695 0.458 0.489 ...
 $ Schooling                      : num  8.21 12.14 12.71 8.04 8.84 ...
summary(df)
   Country             Status               Year      Life.expectancy
 Length:193         Length:193         Min.   :2025   Min.   :46.11  
 Class :character   Class :character   1st Qu.:2025   1st Qu.:62.48  
 Mode  :character   Mode  :character   Median :2025   Median :72.49  
                                       Mean   :2025   Mean   :69.22  
                                       3rd Qu.:2025   3rd Qu.:75.11  
                                       Max.   :2025   Max.   :82.54  
                                                      NA's   :10     
 Adult.Mortality  infant.deaths         Alcohol        percentage.expenditure
 Min.   : 18.75   Min.   :   0.000   Min.   : 0.0100   Min.   :   0.00       
 1st Qu.: 80.41   1st Qu.:   0.000   1st Qu.: 0.9697   1st Qu.:  26.12       
 Median :146.56   Median :   2.562   Median : 3.5053   Median : 139.16       
 Mean   :164.80   Mean   :  28.832   Mean   : 4.4399   Mean   : 708.81       
 3rd Qu.:219.59   3rd Qu.:  20.750   3rd Qu.: 7.4430   3rd Qu.: 508.49       
 Max.   :550.06   Max.   :1366.688   Max.   :13.4973   Max.   :9801.81       
 NA's   :10                          NA's   :2                               
  Hepatitis.B       Measles               BMI        under.five.deaths
 Min.   : 8.00   Min.   :    0.000   Min.   : 5.20   Min.   :   0.00  
 1st Qu.:67.45   1st Qu.:    3.312   1st Qu.:20.93   1st Qu.:   0.00  
 Median :83.23   Median :  130.625   Median :43.91   Median :   3.25  
 Mean   :78.52   Mean   : 2302.060   Mean   :39.55   Mean   :  39.99  
 3rd Qu.:94.56   3rd Qu.: 1497.188   3rd Qu.:52.36   3rd Qu.:  24.88  
 Max.   :99.00   Max.   :65857.938   Max.   :87.30   Max.   :1812.50  
 NA's   :9                           NA's   :4                        
     Polio       Total.expenditure   Diphtheria       HIV.AIDS      
 Min.   : 9.00   Min.   : 1.647    Min.   : 9.00   Min.   : 0.1000  
 1st Qu.:71.75   1st Qu.: 4.675    1st Qu.:72.38   1st Qu.: 0.1000  
 Median :88.00   Median : 5.962    Median :88.19   Median : 0.1000  
 Mean   :82.43   Mean   : 6.028    Mean   :82.23   Mean   : 1.6623  
 3rd Qu.:96.00   3rd Qu.: 7.080    3rd Qu.:96.00   3rd Qu.: 0.8187  
 Max.   :99.00   Max.   :17.240    Max.   :99.00   Max.   :32.9438  
                 NA's   :2                                          
      GDP            Population        thinness.1.19.years thinness.5.9.years
 Min.   :  136.2   Min.   :      292   Min.   : 0.100      Min.   : 0.100    
 1st Qu.:  868.0   1st Qu.:   660051   1st Qu.: 1.619      1st Qu.: 1.562    
 Median : 3042.6   Median :  3743167   Median : 3.444      Median : 3.487    
 Mean   : 7761.7   Mean   : 14913268   Mean   : 4.683      Mean   : 4.711    
 3rd Qu.: 7927.1   3rd Qu.: 11370431   3rd Qu.: 7.106      3rd Qu.: 6.987    
 Max.   :57362.9   Max.   :421467691   Max.   :27.100      Max.   :27.944    
 NA's   :10        NA's   :1           NA's   :4           NA's   :4         
 Income.composition.of.resources   Schooling     
 Min.   :0.1317                  Min.   : 0.000  
 1st Qu.:0.4809                  1st Qu.: 9.944  
 Median :0.6612                  Median :12.334  
 Mean   :0.6295                  Mean   :11.894  
 3rd Qu.:0.7634                  3rd Qu.:14.069  
 Max.   :0.9314                  Max.   :20.038  
 NA's   :17                      NA's   :13      

Em especial, pretendo focar em variáveis estruturais gerais, e não diretamente relacionadas à “tempo de vida”, desta forma, variáveis como infant.deaths, adult.mortality, thinness.1.19.years e as doenças individualmente não vão ser analisádas neste relatório.

3. Análise Univariada: Descrição Estatística

# Selecionando variáveis de interesse para a análise
vars_interesse <- df %>% 
  select(
    Life.expectancy,
    Alcohol,
    percentage.expenditure,
    BMI,
    Total.expenditure,
    GDP,
    Population,
    Income.composition.of.resources,
    Schooling
  )

# Descrição estatística usando summarytools::descr
descr(vars_interesse)
Descriptive Statistics  
vars_interesse  
N: 193  

                    Alcohol      BMI        GDP   Income.composition.of.resources   Life.expectancy
----------------- --------- -------- ---------- --------------------------------- -----------------
             Mean      4.44    39.55    7761.75                              0.63             69.22
          Std.Dev      3.88    17.60   11379.52                              0.18              9.19
              Min      0.01     5.20     136.18                              0.13             46.11
               Q1      0.95    20.92     837.92                              0.48             62.38
           Median      3.51    43.91    3042.60                              0.66             72.49
               Q3      7.47    52.36    7951.82                              0.76             75.16
              Max     13.50    87.30   57362.87                              0.93             82.54
              MAD      4.43    17.67    3569.44                              0.21              8.90
              IQR      6.47    31.43    7059.16                              0.28             12.63
               CV      0.87     0.45       1.47                              0.29              0.13
         Skewness      0.59     0.10       2.22                             -0.44             -0.58
      SE.Skewness      0.18     0.18       0.18                              0.18              0.18
         Kurtosis     -0.90    -0.74       4.83                             -0.64             -0.64
          N.Valid    191.00   189.00     183.00                            176.00            183.00
                N    193.00   193.00     193.00                            193.00            193.00
        Pct.Valid     98.96    97.93      94.82                             91.19             94.82

Table: Table continues below

 

                    percentage.expenditure     Population   Schooling   Total.expenditure
----------------- ------------------------ -------------- ----------- -------------------
             Mean                   708.81    14913267.79       11.89                6.03
          Std.Dev                  1449.45    41750148.38        3.34                2.21
              Min                     0.00         292.00        0.00                1.65
               Q1                    26.12      656769.00        9.93                4.67
           Median                   139.16     3743166.84       12.33                5.96
               Q3                   508.49    11376807.91       14.08                7.09
              Max                  9801.81   421467690.94       20.04               17.24
              MAD                   206.31     5067139.42        3.01                1.85
              IQR                   482.37    10710379.92        4.12                2.41
               CV                     2.04           2.80        0.28                0.37
         Skewness                     3.26           7.08       -0.67                1.62
      SE.Skewness                     0.17           0.18        0.18                0.18
         Kurtosis                    12.28          59.27        1.11                6.31
          N.Valid                   193.00         192.00      180.00              191.00
                N                   193.00         193.00      193.00              193.00
        Pct.Valid                   100.00          99.48       93.26               98.96
# Tabela descritiva formatada
tbl_summary(vars_interesse) %>% 
  add_n() %>% 
  modify_header(label = "**Variável**") %>% 
  modify_spanning_header(c(stat_0) ~ "**Estatísticas Descritivas**")
Variável N
Estatísticas Descritivas
N = 1931
Life.expectancy 183 72 (62, 75)
    Unknown
10
Alcohol 191 3.5 (0.9, 7.5)
    Unknown
2
percentage.expenditure 193 139 (26, 508)
BMI 189 44 (21, 52)
    Unknown
4
Total.expenditure 191 5.96 (4.67, 7.09)
    Unknown
2
GDP 183 3,043 (838, 7,952)
    Unknown
10
Population 192 3,743,167 (656,769, 11,376,808)
    Unknown
1
Income.composition.of.resources 176 0.66 (0.48, 0.76)
    Unknown
17
Schooling 180 12.3 (9.9, 14.1)
    Unknown
13
1 Median (Q1, Q3)

A partir destes dados podemos que a nossa base é altamente heterogênea, com a expectativa de vida variando de 46 até 82 anos (com desvio padrão de 9). Outra variável que chama especialmente a atenção é o GDP (PIB), que vai desde 136 até 57362, possuindo uma média de 7761 e desvio padrão de 11375. População também possui variações bastante significativas como essas.

4. Análise Bivariada: Correlação e Matriz de Espalhamento

Com esta análise buscamos observar a relação entre pares de variáveis, para identificar padrões de correlações no nosso dataset.

# Criando a matriz de espalhamento para as variáveis de interesse
pairs(
  vars_interesse,
  main = "Matriz de Espalhamento das Variáveis de Interesse",
  pch = 35,
  cex = 0.1,
  col = rgb(0, 0, 1, 0.25),
  cex.labels = 0.8,
  lower.panel = panel.smooth
)

# Calculando a matriz de correlação
cor_matrix <- cor(vars_interesse, use = "pairwise.complete.obs")
print(round(cor_matrix, 2))
                                Life.expectancy Alcohol percentage.expenditure
Life.expectancy                            1.00    0.46                   0.52
Alcohol                                    0.46    1.00                   0.47
percentage.expenditure                     0.52    0.47                   1.00
BMI                                        0.72    0.30                   0.30
Total.expenditure                          0.29    0.30                   0.19
GDP                                        0.60    0.52                   0.80
Population                                -0.01   -0.02                  -0.08
Income.composition.of.resources            0.82    0.55                   0.57
Schooling                                  0.79    0.61                   0.52
                                  BMI Total.expenditure  GDP Population
Life.expectancy                  0.72              0.29 0.60      -0.01
Alcohol                          0.30              0.30 0.52      -0.02
percentage.expenditure           0.30              0.19 0.80      -0.08
BMI                              1.00              0.42 0.38      -0.11
Total.expenditure                0.42              1.00 0.26       0.06
GDP                              0.38              0.26 1.00       0.12
Population                      -0.11              0.06 0.12       1.00
Income.composition.of.resources  0.66              0.27 0.65      -0.02
Schooling                        0.49              0.09 0.57      -0.05
                                Income.composition.of.resources Schooling
Life.expectancy                                            0.82      0.79
Alcohol                                                    0.55      0.61
percentage.expenditure                                     0.57      0.52
BMI                                                        0.66      0.49
Total.expenditure                                          0.27      0.09
GDP                                                        0.65      0.57
Population                                                -0.02     -0.05
Income.composition.of.resources                            1.00      0.86
Schooling                                                  0.86      1.00
# Visualizando a matriz de correlação com corrplot
corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  tl.col = "black",
  tl.srt = 45,
  tl.cex = 0.7,
  addCoef.col = "black",
  number.cex = 0.5
)

Apesar do número de variáveis dificultar um pouco a avaliação visual da matriz de espalhamento, é possível identificar que algumas variáveis apresentam associação positiva mais forte com a expectativa de vida. Os casos mais evidentes são BMI, Income.composition.of.resources e Schooling, que também aparecem com os maiores coeficientes de correlação positiva na matriz de correlação. Em especial, Income.composition.of.resources e Schooling se destacam por apresentarem relações quase lineares com a expectativa de vida. Já variáveis como GDP e percentage.expenditure também apresentam correlação positiva moderada, mas, pela matriz de espalhamento, essa relação parece menos uniforme e mais influenciada pelos países com valores mais elevados. Por outro lado, Population praticamente não apresenta associação com a expectativa de vida, enquanto Total.expenditure mostra apenas uma relação fraca. Assim, os resultados sugerem que fatores ligados ao desenvolvimento humano e à educação parecem estar mais fortemente associados à expectativa de vida do que variáveis econômicas isoladas ou o tamanho da população.

5. Normalidade das Variáveis

Nesta etapa analisaremos a distribuição individual de cada variável, com o objetivo de verificar se elas apresentam comportamento próximo de uma distribuição normal. A distribuição normal, também chamada de Gaussiana, é uma distribuição contínua e simétrica em torno da média, na qual aproximadamente 68% dos valores se encontram dentro de um desvio padrão da média, e 95% dentro de dois desvios padrão. Devido ao seu formato característico em forma de sino, ela também é conhecida como bell curve.

Para essa análise serão utilizados histogramas, que permitem observar visualmente o formato da distribuição dos dados e identificar possíveis assimetrias ou caudas mais longas em uma das extremidades. Além disso, utilizaremos Q-Q plots, que comparam os quantis observados nos dados com os quantis esperados de uma distribuição normal, permitindo avaliar visualmente o quanto cada variável se aproxima desse padrão.

# Loop para gerar histogramas e Q-Q plots
for (var in names(vars_interesse)) {
  
  # Histograma
  p1 <- ggplot(vars_interesse, aes_string(x = var)) +
    geom_histogram(aes(y = after_stat(density)),
                   bins = 30,
                   fill = "skyblue",
                   color = "black") +
    geom_density(color = "red", linewidth = 1, na.rm = TRUE) +
    labs(title = paste("Histograma de", var),
         x = var,
         y = "Densidade") +
    theme_minimal()
  print(p1)
  
  # Q-Q Plot
  p2 <- ggqqplot(vars_interesse,
                 x = var,
                 title = paste("Q-Q Plot de", var),
                 xlab = "Quantis Teóricos",
                 ylab = "Quantis da Amostra")
  print(p2)
}
Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
ℹ Please use tidy evaluation idioms with `aes()`.
ℹ See also `vignette("ggplot2-in-packages")` for more information.
Warning: Removed 10 rows containing non-finite outside the scale range
(`stat_bin()`).

Warning: Removed 10 rows containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 10 rows containing non-finite outside the scale range
(`stat_qq_line()`).
Removed 10 rows containing non-finite outside the scale range
(`stat_qq_line()`).

Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_bin()`).

Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_qq_line()`).
Removed 2 rows containing non-finite outside the scale range
(`stat_qq_line()`).

Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_bin()`).

Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_qq_line()`).
Removed 4 rows containing non-finite outside the scale range
(`stat_qq_line()`).

Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_bin()`).

Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 2 rows containing non-finite outside the scale range
(`stat_qq_line()`).
Removed 2 rows containing non-finite outside the scale range
(`stat_qq_line()`).

Warning: Removed 10 rows containing non-finite outside the scale range
(`stat_bin()`).

Warning: Removed 10 rows containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 10 rows containing non-finite outside the scale range
(`stat_qq_line()`).
Removed 10 rows containing non-finite outside the scale range
(`stat_qq_line()`).

Warning: Removed 1 row containing non-finite outside the scale range
(`stat_bin()`).

Warning: Removed 1 row containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 1 row containing non-finite outside the scale range (`stat_qq_line()`).
Removed 1 row containing non-finite outside the scale range (`stat_qq_line()`).

Warning: Removed 17 rows containing non-finite outside the scale range
(`stat_bin()`).

Warning: Removed 17 rows containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 17 rows containing non-finite outside the scale range
(`stat_qq_line()`).
Removed 17 rows containing non-finite outside the scale range
(`stat_qq_line()`).

Warning: Removed 13 rows containing non-finite outside the scale range
(`stat_bin()`).

Warning: Removed 13 rows containing non-finite outside the scale range
(`stat_qq()`).
Warning: Removed 13 rows containing non-finite outside the scale range
(`stat_qq_line()`).
Removed 13 rows containing non-finite outside the scale range
(`stat_qq_line()`).

Análise da Normalidade das Variáveis

A normalidade das variáveis foi avaliada por meio da inspeção visual dos histogramas com curva de densidade e dos Q-Q plots. Os histogramas permitem observar o formato geral da distribuição dos dados, enquanto os Q-Q plots comparam os quantis observados com os quantis esperados de uma distribuição normal. Quando os pontos seguem aproximadamente a linha de referência no Q-Q plot, há evidência de comportamento próximo à normalidade; desvios sistemáticos indicam afastamentos dessa distribuição.

Life.expectancy

O histograma da variável Life.expectancy mostra maior concentração de valores na faixa entre aproximadamente 70 e 75 anos, com menor frequência de valores mais baixos. A distribuição é pouco simetrica, com uma calda maior à esquerda, indicando que poucos países possuem expectativa de vida significativamente menor que a maioria. No Q-Q plot, os pontos acompanham relativamente bem a linha de referência na região central, mas há desvios nas extremidades. Isso indica que a variável apresenta aproximação à normalidade no centro da distribuição, porém com desvios nas caudas.

Alcohol

A variável Alcohol apresenta também uma assimetria O histograma mostra maior concentração de observações em níveis mais baixos de consumo de álcool, indicando muitos países onde não há quase nenhum consumo, com alguns valores mais elevados formando uma cauda à direita. No Q-Q plot, novamente os pontos seguem a linha de referência na região central, mas apresentam desvios nos quantis inferiores e superiores.

percentage.expenditure

O histograma da variável percentage.expenditure revela até aqui a maior assimetria. A maior parte dos países apresenta valores relativamente baixos de gasto percentual, enquanto poucos países possuem valores extremamente elevados, produzindo uma longa cauda. O Q-Q plot confirma esse comportamento, com grande afastamento dos pontos da linha de referência nos quantis superiores. Essa variável apresenta clara violação da normalidade.

BMI

A variável BMI apresenta uma distribuição bimodal, com dois picos visíveis no histograma. Isso indica a presença de dois grupos distintos de países com níveis diferentes de índice de massa corporal médio, uns com índice por volta de 20 e outros por volta de 55. No Q-Q plot, observa-se que os pontos se afastam da linha de referência em várias regiões da distribuição, refletindo esse comportamento multimodal. Portanto, a variável não segue uma distribuição normal.

Total.expenditure

O histograma da variável Total.expenditure apresenta distribuição relativamente concentrada em torno de valores intermediários, com leve assimetria positiva. No Q-Q plot, os pontos seguem a linha de referência na região central, se mantendo dentro da faixa cinza exceto nos valores muito mais altos. Dessa forma, apenas os outliers extremos impedem que a variável seja considerada normal.

GDP

A variável GDP apresenta forte assimetria positiva, característica comum em indicadores econômicos globais. O histograma mostra grande concentração de países com valores mais baixos de PIB per capita e poucos países com valores muito elevados, gerando uma longa cauda à direita. No Q-Q plot, os pontos se afastam significativamente da linha de referência, especialmente nos quantis superiores, indicando claro desvio da normalidade.

Population

A variável Population apresenta assimetria positiva extrema, puxado por países super populosos como China e Índia. O histograma mostra que a maioria dos países possui populações relativamente menores, enquanto poucos países apresentam populações extremamente elevadas, produzindo uma cauda muito longa à direita. O Q-Q plot evidencia forte desvio da linha de referência em grande parte da distribuição, indicando que a variável está bastante distante de um comportamento normal.

Income.composition.of.resources

O histograma da variável Income.composition.of.resources apresenta distribuição relativamente concentrada em valores intermediários, com leve assimetria e dois picos. A maior parte das observações encontra-se em uma faixa relativamente estreita da escala. No Q-Q plot, os pontos seguem relativamente próximos da linha de referência na região central, com pequenos desvios nas extremidades. Isso indica uma distribuição relativamente equilibrada, ainda que não perfeitamente normal, com uma influência bimodal

Schooling

A variável Schooling apresenta um histograma com formato relativamente próximo ao de uma distribuição simétrica, com concentração maior de valores na região central. No Q-Q plot, os pontos acompanham razoavelmente bem a linha de referência na maior parte da distribuição, com pequenos desvios nas extremidades. Dessa forma, a variável apresenta comportamento relativamente próximo da normalidade quando comparada às demais variáveis analisadas.

Síntese Geral

De modo geral, observa-se que variáveis relacionadas à escala econômica ou tamanho dos países, como GDP, Population e percentage.expenditure, apresentam forte assimetria positiva, refletindo a desigualdade entre países onde alguns poucos países possuem números muito distantes da maioria. Já variáveis associadas a desenvolvimento humano, como Life.expectancy, Schooling e Income.composition.of.resources, apresentam distribuições mais equilibradas e próximas de um comportamento aproximadamente normz’al, ainda que com alguns desvios nas extremidades.

# Aplicando o teste de Shapiro-Wilk para as variáveis de interesse

shapiro_results <- list()

for (var in names(vars_interesse)) {
  # Remove NAs antes de testar
  data_for_test <- na.omit(vars_interesse[[var]])
  
  if (length(data_for_test) > 3 && length(data_for_test) <= 5000) {
    shapiro_results[[var]] <- shapiro.test(data_for_test)
  } else if (length(data_for_test) > 5000) {
    # Amostra para o teste se o dataset for muito grande
    sample_data <- sample(data_for_test, 5000)
    shapiro_results[[var]] <- shapiro.test(sample_data)
    warning(paste("Shapiro-Wilk aplicado a uma amostra de 5000 para", var, "devido ao tamanho do dataset."))
  } else {
    shapiro_results[[var]] <- "Não foi possível aplicar Shapiro-Wilk (dados insuficientes ou muitos NAs)."
  }
}

# Exibindo os resultados
shapiro_results
$Life.expectancy

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.93706, p-value = 3.652e-07


$Alcohol

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.90492, p-value = 1.011e-09


$percentage.expenditure

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.52959, p-value < 2.2e-16


$BMI

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.93284, p-value = 1.143e-07


$Total.expenditure

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.89019, p-value = 1.252e-10


$GDP

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.67238, p-value < 2.2e-16


$Population

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.33353, p-value < 2.2e-16


$Income.composition.of.resources

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.96349, p-value = 0.0001467


$Schooling

    Shapiro-Wilk normality test

data:  data_for_test
W = 0.97259, p-value = 0.00129

Teste de Normalidade (Shapiro-Wilk)

Para complementar a análise visual realizada por meio dos histogramas e Q-Q plots, foi aplicado o teste de Shapiro-Wilk para avaliar estatisticamente a normalidade das variáveis. Nesse teste, a hipótese nula (H₀) assume que os dados seguem uma distribuição normal. Assim, p-valores menores que 0,05 indicam rejeição da hipótese de normalidade.

Os resultados obtidos mostram que todas as variáveis apresentam p-valores inferiores a 0,05, indicando rejeição da hipótese de normalidade para todas elas.

Esse resultado confirma, em grande parte, as evidências observadas na análise gráfica. Variáveis como percentage.expenditure, GDP e Population apresentaram valores muito baixos do estatístico W e p-valores extremamente pequenos, reforçando a forte assimetria observada nos histogramas e Q-Q plots. Essas variáveis possuem distribuições altamente concentradas em valores menores, com caudas longas à direita, o que as afasta significativamente de uma distribuição normal.

Por outro lado, variáveis como Life.expectancy, BMI, Income.composition.of.resources e Schooling apresentaram valores do estatístico W mais próximos de 1, sugerindo distribuições relativamente mais próximas da normalidade. Ainda assim, os p-valores indicam que essas variáveis também não seguem perfeitamente uma distribuição normal, o que já era sugerido pelos pequenos desvios observados nas caudas dos Q-Q plots.

De modo geral, os resultados do teste de Shapiro-Wilk confirmam a análise visual realizada anteriormente, indicando que, embora algumas variáveis apresentem comportamento aproximadamente simétrico na região central da distribuição, nenhuma delas segue estritamente uma distribuição normal.

6. Qualidade de Dados: Completude e Imputação

Antes de avançar para outras análises, é importante avaliar a qualidade dos dados, e um dos aspectos mais básicos disso é a completude.

Em suas palavras, como é definido completude?

Completude é o quão integros estão os dados de uma base, sem valores faltantes sejam por erros de medição ou processamento, de forma que cada linha do nosso dataset possua todas as variáveis devidamente indicadas em suas colunas, sem dados faltantes ou incoerentes (tipo diferente de dado)

Qual o impacto em uma análise exploratória de dados?

Dados incompletos podem afetar bastante uma análise exploratória de dados, pois nem sempre é possível identificar a natureza destes dados faltantes, ou o fenômeno que causou essas lacunas. Ou seja, caso os dados faltantes possuam algum tipo de viés, como erro em um equipamento de medição quando os dados são muito altos, é possível que nossa análise possua um viés.

Ademais, ainda que estes dados ocorram de forma aleatória, cada dado faltante é uma informação a menos que o nosso dataset possui, diminuindo portando a sua qualidade e aplicabilidade para analisar o fenômeno de interesse. Ao perdermos uma quantia como 20% dos dados por conta de dados faltantes, podemos deixar de obter insights valiosos na nossa análise.

Por fim, os modelos matemáticos estatísticos, gráficos e de machine learning por vezes não conseguem lidar com dados incompletos, de forma que é necessário etapas adicionais de processamento dos dados para viabilizar este tipo de análise, que perde um pouco da sua aplicabilidade

Completude para cada Variável

A seguir, vamos verificar o nível de completude de cada variável utilizada no dataset.

# Calculando a completude (%) para cada variável de interesse
completude <- colMeans(!is.na(vars_interesse)) * 100

completude_df <- data.frame(
  Variavel = names(completude),
  Completude = round(completude, 2)
)

# Exibindo a tabela de completude
knitr::kable(completude_df, caption = "Completude das Variáveis de Interesse (%)")
Completude das Variáveis de Interesse (%)
Variavel Completude
Life.expectancy Life.expectancy 94.82
Alcohol Alcohol 98.96
percentage.expenditure percentage.expenditure 100.00
BMI BMI 97.93
Total.expenditure Total.expenditure 98.96
GDP GDP 94.82
Population Population 99.48
Income.composition.of.resources Income.composition.of.resources 91.19
Schooling Schooling 93.26

Imputação de Dados com MICE

Apesar do dataset apresentar uma boa completude nas variáveis analisadas, algumas delas ainda possuem uma pequena quantidade de valores faltantes. A maioria das variáveis apresenta mais de 94% de dados disponíveis, sendo que percentage.expenditure possui 100% de completude, enquanto Income.composition.of.resources apresenta o menor nível, com aproximadamente 91%. Embora a proporção de dados faltantes seja relativamente pequena, optamos por realizar a imputação para evitar a perda de observações nas etapas seguintes da análise.

Para realizar esse procedimento utilizaremos o pacote mice (Multivariate Imputation by Chained Equations). Esse método é frequentemente preferido à simples remoção de registros ou à substituição por média ou mediana, pois procura preservar a variabilidade dos dados e as relações entre as variáveis, gerando valores imputados de forma mais consistentes com a estrutura observada no conjunto de dados.

Durante a aplicação inicial do método utilizando todas as variáveis selecionadas, foi identificado um problema de singularidade computacional na matriz de predição. Esse problema ocorre quando algumas variáveis apresentam alta colinearidade, isto é, quando duas ou mais variáveis carregam praticamente a mesma informação estatística. No conjunto analisado, por exemplo, observamos correlações muito elevadas entre Schooling e Income.composition.of.resources, bem como entre GDP e percentage.expenditure, o que dificulta a estimação dos modelos internos utilizados pelo algoritmo de imputação.

Para contornar esse problema, foi realizada uma redução do conjunto de variáveis utilizadas no modelo de imputação, mantendo apenas um subconjunto representativo e menos redundante. A seleção final considerou tanto a relevância das variáveis para explicar a expectativa de vida quanto a redução da colinearidade entre elas, resultando nas variáveis Life.expectancy, BMI, GDP, Schooling e Alcohol. Esse conjunto permite capturar diferentes dimensões associadas à expectativa de vida, incluindo fatores socioeconômicos, educacionais, comportamentais e de saúde, ao mesmo tempo em que garante maior estabilidade para o processo de imputação.

Após esse ajuste, o método MICE foi aplicado utilizando o algoritmo Predictive Mean Matching (PMM) com cinco conjuntos imputados (m=5). O método PMM foi escolhido por preservar melhor a distribuição original dos dados, uma vez que os valores imputados são baseados em observações reais semelhantes, em vez de serem apenas estimativas geradas por modelos paramétricos.

O conjunto final de dados utilizado nas análises subsequentes foi obtido a partir do primeiro dataset completo gerado pelo procedimento de imputação.

# Selecionando um subconjunto menor de variáveis para imputação
vars_mice <- vars_interesse %>%
  select(
    Life.expectancy,
    Alcohol,
    BMI,
    GDP,
    Schooling
  )

# Aplicando MICE com PMM
imputed_data <- mice(
  vars_mice,
  m = 5,
  method = "pmm",
  seed = 500,
  printFlag = FALSE
)

# Obtendo o primeiro conjunto imputado
vars_mice_imputed <- complete(imputed_data, 1)

# Verificando se restaram NAs
sum(is.na(vars_mice_imputed))
[1] 0
# Visualizando o resultado
head(vars_mice_imputed)
  Life.expectancy   Alcohol      BMI       GDP Schooling
1        58.19375 0.0143750 15.51875  340.0154   8.21250
2        75.15625 4.8487500 49.06875 2119.7267  12.13750
3        73.61875 0.4066667 48.74375 2847.8534  12.71250
4        49.01875 5.7406667 18.01875 1975.1430   8.04375
5        75.05625 7.9493333 38.42500 9759.3057   8.84375
6        75.15625 7.9666667 54.98125 6998.5751  16.50625
# Criando a matriz de espalhamento para as variáveis de interesse
pairs(
  vars_mice_imputed,
  main = "Matriz de Espalhamento das Variáveis de Interesse",
  pch = 20,
  cex = 0.1,
  col = rgb(0, 0, 1, 0.5),
  cex.labels = 0.8,
  lower.panel = panel.smooth
)

# Calculando a matriz de correlação
cor_matrix <- cor(vars_mice_imputed, use = "pairwise.complete.obs")
print(round(cor_matrix, 2))
                Life.expectancy Alcohol  BMI  GDP Schooling
Life.expectancy            1.00    0.43 0.64 0.59      0.76
Alcohol                    0.43    1.00 0.27 0.52      0.60
BMI                        0.64    0.27 1.00 0.35      0.50
GDP                        0.59    0.52 0.35 1.00      0.57
Schooling                  0.76    0.60 0.50 0.57      1.00
# Visualizando a matriz de correlação com corrplot
corrplot(
  cor_matrix,
  method = "color",
  type = "upper",
  tl.col = "black",
  tl.srt = 45,
  tl.cex = 0.7,
  addCoef.col = "black",
  number.cex = 0.5
)

7. Análise Bivariada: Testes de Hipóteses

Para validar as observações feitas na EDA, realizaremos três testes de hipóteses conforme as categorias solicitadas.

Teste Numérica vs. Numérica: Correlação de Pearson

Vamos testar se existe uma correlação estatisticamente significativa entre a schooling e a Expectativa de Vida.

# Teste de Correlação de Pearson
# H0: Não há correlação linear entre as variáveis (cor = 0)
# H1: Há correlação linear significativa (cor != 0)

cor.test(
  vars_mice_imputed$Life.expectancy,
  vars_mice_imputed$Schooling,
  method = "pearson"
)

    Pearson's product-moment correlation

data:  vars_mice_imputed$Life.expectancy and vars_mice_imputed$Schooling
t = 16.18, df = 191, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.6936418 0.8141857
sample estimates:
      cor 
0.7603868 

O teste de correlação de Pearson entre Life.expectancy e Schooling indica uma correlação positiva forte entre as duas variáveis (r = 0.76). O valor de p extremamente pequeno (p < 2.2e-16) leva à rejeição da hipótese nula de ausência de correlação linear, indicando que a associação observada é estatisticamente significativa. O intervalo de confiança de 95% para a correlação (0.69 a 0.81) reforça que essa relação é consistentemente positiva. Em termos práticos, esse resultado sugere que países com maior nível médio de escolaridade tendem a apresentar maior expectativa de vida, indicando que fatores educacionais estão fortemente associados ao desenvolvimento humano e às condições de saúde da população.

Teste Numérica vs. Categórica (2 classes): Teste T

Vamos comparar a Expectativa de Vida entre países desenvolvidos e em desenvolvimento.

# Recriando um dataframe com Status + variáveis imputadas
df_imputed <- df %>%
  select(Status) %>%
  bind_cols(vars_mice_imputed)

# Garantindo que Status seja um fator
df_imputed$Status <- as.factor(df_imputed$Status)

# Teste t de Student para amostras independentes
# H0: As médias de expectativa de vida são iguais entre os grupos
# H1: As médias são diferentes
t.test(Life.expectancy ~ Status, data = df_imputed)

    Welch Two Sample t-test

data:  Life.expectancy by Status
t = 13.341, df = 129.93, p-value < 2.2e-16
alternative hypothesis: true difference in means between group Developed and group Developing is not equal to 0
95 percent confidence interval:
 10.04783 13.54686
sample estimates:
 mean in group Developed mean in group Developing 
                79.19785                 67.40050 

O teste t de Welch foi aplicado para comparar a expectativa de vida média entre países classificados como Developed e Developing. Os resultados mostram uma diferença estatisticamente significativa entre os grupos (t = 13.34, p < 2.2e-16). A média de expectativa de vida nos países desenvolvidos é aproximadamente 79.2 anos, enquanto nos países em desenvolvimento é cerca de 67.4 anos. O intervalo de confiança de 95% para a diferença entre as médias (aproximadamente 10.05 a 13.55 anos) indica que a diferença é substancial. Esse resultado evidencia um gap significativo de expectativa de vida entre os dois grupos, refletindo diferenças estruturais relacionadas a renda, acesso a serviços de saúde, educação e condições gerais de vida.

Teste Numérica vs. Categórica (mais de 2 classes): ANOVA

Para testar mais de duas classes, como não há variável categórica deste tipo no nosso dataset, vamos categorizar o GDP em tercis (Baixo, Médio e Alto) e ver se a Expectativa de Vida varia entre eles.

# Criando variável categórica de PIB com 3 níveis
vars_mice_imputed <- vars_mice_imputed %>% 
  mutate(
    GDP_Group = cut(
      GDP,
      breaks = quantile(GDP, probs = c(0, 1/3, 2/3, 1), na.rm = TRUE),
      labels = c("Baixo", "Médio", "Alto"),
      include.lowest = TRUE
    )
  )

# ANOVA de um fator
# H0: As médias de expectativa de vida são iguais nos três níveis de PIB
# H1: Pelo menos uma média é diferente

res_anova <- aov(Life.expectancy ~ GDP_Group, data = vars_mice_imputed)

summary(res_anova)
             Df Sum Sq Mean Sq F value Pr(>F)    
GDP_Group     2   8975    4487   124.6 <2e-16 ***
Residuals   190   6845      36                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

A análise de variância (ANOVA) foi utilizada para avaliar se a expectativa de vida difere entre três grupos de países definidos pelo nível de PIB (Baixo, Médio e Alto). O teste apresentou resultado altamente significativo (F = 124.6, p < 2e-16), indicando rejeição da hipótese nula de igualdade entre as médias. Isso significa que pelo menos um dos grupos de PIB possui expectativa de vida média diferente dos demais. O valor elevado do estatístico F sugere que a variação entre os grupos de PIB é muito maior do que a variação interna dentro de cada grupo. Esse resultado reforça a ideia de que fatores econômicos agregados, como o nível de riqueza dos países, estão fortemente associados às diferenças observadas na expectativa de vida.