Apresentação

A matriz ´state.x77´ faz parte da instalação básica do R. Os dados estão relacionados aos 50 estados norte-americanos, e incluem:

  • estimativa da população,
  • renda per capita,
  • taxa de analfabetismo (em porcentagem da população),
  • expectativa de vida em anos,
  • taxa de homicídios por 100.000 habitantes,
  • porcentagem de diplomados do ensino médio,
  • número médio de dias com temperatura mínima abaixo de zero (1931-1960) na capital ou cidade grande e
  • área de terra em milhas quadradas.

Iniciemos a análise “vendo” os dados.

data(state.x77)

# use help(state.x77) para conhecer os detalhes dos dados
head(state.x77)
##            Population Income Illiteracy Life Exp Murder HS Grad Frost   Area
## Alabama          3615   3624        2.1    69.05   15.1    41.3    20  50708
## Alaska            365   6315        1.5    69.31   11.3    66.7   152 566432
## Arizona          2212   4530        1.8    70.55    7.8    58.1    15 113417
## Arkansas         2110   3378        1.9    70.66   10.1    39.9    65  51945
## California      21198   5114        1.1    71.71   10.3    62.6    20 156361
## Colorado         2541   4884        0.7    72.06    6.8    63.9   166 103766

Vamos criar um data frame e realizar algumas transformações nos dados.

estados <- data.frame(state.x77) 
estados$dens.pop <- estados$Population / estados$Area
media.renda <- mean(estados$Income)
sd.renda <- sd(estados$Income)

# para tornar o dataframe menor
estados <- subset(estados, select = -c(Population, Illiteracy, Murder, HS.Grad, Frost, Area))

# criemos um fator
estados$classe.renda <- factor(ifelse(estados$Income <= (media.renda - sd.renda), 'D',
                                      ifelse(estados$Income > (media.renda + sd.renda), 'A', 'BC')), 
                               levels = c('D', 'BC', 'A'),
                               labels = c('D', 'BC', 'A'),
                               ordered = TRUE)

head(estados)

Resumindo os dados

Um dos primeiros passos que os analistas devem dar, ao trabalhar com um novo conjunto de dados, é rever seu conteúdo e forma.

  • Quantos registros há?
  • Que variáveis existem?
  • De que tipo?
  • Faltam dados?
  • Os dados estão em um intervalo razoável?
  • Que tipo de distribuição eles têm?

Embora seja fundamental a exploração de dados via visualização, obter um resumo estatístico de todo o conjunto de dados é um ótimo primeiro passo para entender o que você tem, e se os dados são válidos e/ou úteis. É desejável que se tenha, ao menos, o seguinte:

  1. Uma contagem de quantas observações (registros) existem.

  2. A quantidade, os nomes e os tipos das variáveis.

  3. Ser capaz de fornecer informações sobre o maior número possível de variáveis (numéricas, categóricas, caracter etc.).

  4. Produzir estatísticas sumárias apropriadas dependendo do tipo de dados. Por exemplo, se um campo numérico for contínuo, é importante saber a média, mas uma “média” de um campo categórico não ordenado não faz sentido.

  5. Lidar com dados faltantes de modo transparente. É importante saber quantas observações estão faltando.

  6. Para dados numéricos, produzir, pelo menos, estes tipos de estatísticas sumárias;

    1. Média
    2. Mediana
    3. Amplitude
    4. Alguma medida de variabilidade, provavelmente o desvio padrão.
    5. Opcionalmente, alguns percentis.
    6. Também opcionalmente, algumas medidas de inclinação (skewness), kurtose etc.
  7. Para dados categóricos, pelo menos esses tipos de estatísticas sumárias:

    1. Quantidade de categorias distintas
    2. Uma lista das categorias – talvez restritas às mais comuns, se houver muitas.
    3. Alguma indicação quanto à distribuição – por exemplo, a categoria mais comum contém 10% ou 99% dos dados?
  8. Opcionalmente ser capaz de resumir por grupo, onde o grupo é tipicamente alguma variável categórica. Por exemplo, talvez seja importante ver um resumo da pontuação média em um teste, dividido por faixa de idade.

  9. Dados de saída em um formato “arrumado” e legível por humanos. É ideal que se possa canalizar os resultados diretamente para ggplot, dplyr ou similares, para algumas gráficos e manipulações simples.

Vamos conhecer várias formas de se obter o resumo dos dados, iniciando com o R básico e seguindo com alguns dos principais pacotes que oferecem esse serviço. Utilizaremos o dataframe estados.

R básico

summary(estados)
##      Income        Life.Exp        dens.pop         classe.renda
##  Min.   :3098   Min.   :67.96   Min.   :0.0006444   D :10       
##  1st Qu.:3993   1st Qu.:70.12   1st Qu.:0.0253352   BC:32       
##  Median :4519   Median :70.67   Median :0.0730154   A : 8       
##  Mean   :4436   Mean   :70.88   Mean   :0.1492245               
##  3rd Qu.:4814   3rd Qu.:71.89   3rd Qu.:0.1442828               
##  Max.   :6315   Max.   :73.60   Max.   :0.9750033
# agrupando por classe.renda, utilizando a função 'by()'
by(estados, estados$classe.renda, summary)
## estados$classe.renda: D
##      Income        Life.Exp        dens.pop        classe.renda
##  Min.   :3098   Min.   :67.96   Min.   :0.009422   D :10       
##  1st Qu.:3559   1st Qu.:68.83   1st Qu.:0.042839   BC: 0       
##  Median :3620   Median :69.79   Median :0.073015   A : 0       
##  Mean   :3572   Mean   :69.49   Mean   :0.064406               
##  3rd Qu.:3679   3rd Qu.:70.27   3rd Qu.:0.085244               
##  Max.   :3821   Max.   :70.66   Max.   :0.100973               
## ------------------------------------------------------------ 
## estados$classe.renda: BC
##      Income        Life.Exp        dens.pop        classe.renda
##  Min.   :3875   Min.   :68.54   Min.   :0.003868   D : 0       
##  1st Qu.:4238   1st Qu.:70.56   1st Qu.:0.024302   BC:32       
##  Median :4544   Median :71.33   Median :0.061277   A : 0       
##  Mean   :4482   Mean   :71.33   Mean   :0.138631               
##  3rd Qu.:4714   3rd Qu.:72.09   3rd Qu.:0.148646               
##  Max.   :4963   Max.   :73.60   Max.   :0.887512               
## ------------------------------------------------------------ 
## estados$classe.renda: A
##      Income        Life.Exp        dens.pop         classe.renda
##  Min.   :5087   Min.   :69.03   Min.   :0.0006444   D :0        
##  1st Qu.:5112   1st Qu.:69.93   1st Qu.:0.0082389   BC:0        
##  Median :5193   Median :70.58   Median :0.1682106   A :8        
##  Mean   :5332   Mean   :70.83   Mean   :0.2976217               
##  3rd Qu.:5311   3rd Qu.:71.90   3rd Qu.:0.4719563               
##  Max.   :6315   Max.   :72.78   Max.   :0.9750033

Pacote Hmisc - função describe

Hmisc::describe(estados)
## estados 
## 
##  4  Variables      50  Observations
## --------------------------------------------------------------------------------
## Income 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##       50        0       50        1     4436    692.7     3570     3623 
##      .25      .50      .75      .90      .95 
##     3993     4519     4814     5118     5271 
## 
## lowest : 3098 3378 3545 3601 3617, highest: 5149 5237 5299 5348 6315
## --------------------------------------------------------------------------------
## Life.Exp 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##       50        0       47        1    70.88    1.537    68.64    69.05 
##      .25      .50      .75      .90      .95 
##    70.12    70.67    71.89    72.58    72.85 
## 
## lowest : 67.96 68.09 68.54 68.76 69.03, highest: 72.60 72.78 72.90 72.96 73.60
## --------------------------------------------------------------------------------
## dens.pop 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##       50        0       50        1   0.1492   0.1914 0.005234 0.009173 
##      .25      .50      .75      .90      .95 
## 0.025335 0.073015 0.144283 0.381797 0.695519 
## 
## lowest : 0.0006443845 0.0038681934 0.0051240839 0.0053690542 0.0089658350
## highest: 0.4167424932 0.6375976964 0.7429082545 0.8875119161 0.9750033240
## --------------------------------------------------------------------------------
## classe.renda 
##        n  missing distinct 
##       50        0        3 
##                          
## Value         D   BC    A
## Frequency    10   32    8
## Proportion 0.20 0.64 0.16
## --------------------------------------------------------------------------------

Pacote pastecs - função stat.desc

pastecs::stat.desc(estados)

Pacote psych - função describeBy

psych::describe(estados)
# use esta função
psych::describeBy(estados, estados$classe.renda)
## 
##  Descriptive statistics by group 
## group: D
##               vars  n    mean     sd  median trimmed    mad     min     max
## Income           1 10 3572.50 202.50 3620.50 3600.75 110.45 3098.00 3821.00
## Life.Exp         2 10   69.49   0.98   69.79   69.54   0.99   67.96   70.66
## dens.pop         3 10    0.06   0.03    0.07    0.07   0.03    0.01    0.10
## classe.renda*    4 10    1.00   0.00    1.00    1.00   0.00    1.00    1.00
##                range  skew kurtosis    se
## Income        723.00 -1.13     0.36 64.04
## Life.Exp        2.70 -0.37    -1.60  0.31
## dens.pop        0.09 -0.46    -1.29  0.01
## classe.renda*   0.00   NaN      NaN  0.00
## ------------------------------------------------------------ 
## group: BC
##               vars  n    mean     sd  median trimmed    mad     min     max
## Income           1 32 4481.53 312.04 4544.00 4495.92 351.38 3875.00 4963.00
## Life.Exp         2 32   71.33   1.14   71.33   71.35   1.14   68.54   73.60
## dens.pop         3 32    0.14   0.20    0.06    0.09   0.07    0.00    0.89
## classe.renda*    4 32    2.00   0.00    2.00    2.00   0.00    2.00    2.00
##                 range  skew kurtosis    se
## Income        1088.00 -0.38    -1.06 55.16
## Life.Exp         5.06 -0.21    -0.42  0.20
## dens.pop         0.88  2.45     5.71  0.04
## classe.renda*    0.00   NaN      NaN  0.00
## ------------------------------------------------------------ 
## group: A
##               vars n    mean     sd  median trimmed    mad     min     max
## Income           1 8 5332.00 408.54 5193.00 5332.00 142.33 5087.00 6315.00
## Life.Exp         2 8   70.83   1.40   70.58   70.83   1.78   69.03   72.78
## dens.pop         3 8    0.30   0.35    0.17    0.30   0.24    0.00    0.98
## classe.renda*    4 8    3.00   0.00    3.00    3.00   0.00    3.00    3.00
##                 range skew kurtosis     se
## Income        1228.00 1.66     1.23 144.44
## Life.Exp         3.75 0.13    -1.74   0.49
## dens.pop         0.97 0.76    -1.05   0.13
## classe.renda*    0.00  NaN      NaN   0.00
# o parâmetro " mat” permite produzir a seguinte matriz 

psych::describeBy(estados, estados$classe.renda, mat = TRUE)

Pacote skimr - função skim - minha preferida

library(skimr)
skim(estados)
Data summary
Name estados
Number of rows 50
Number of columns 4
_______________________
Column type frequency:
factor 1
numeric 3
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
classe.renda 0 1 TRUE 3 BC: 32, D: 10, A: 8

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Income 0 1 4435.80 614.47 3098.00 3992.75 4519.00 4813.50 6315.00 ▃▅▇▂▁
Life.Exp 0 1 70.88 1.34 67.96 70.12 70.67 71.89 73.60 ▃▃▇▅▅
dens.pop 0 1 0.15 0.22 0.00 0.03 0.07 0.14 0.98 ▇▁▁▁▁
# Utilizando o "pipe"
library(dplyr)
group_by(estados, classe.renda) %>%
  skim()
Data summary
Name Piped data
Number of rows 50
Number of columns 4
_______________________
Column type frequency:
numeric 3
________________________
Group variables classe.renda

Variable type: numeric

skim_variable classe.renda n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Income D 0 1 3572.50 202.50 3098.00 3559.00 3620.50 3679.25 3821.00 ▂▂▁▇▅
Income BC 0 1 4481.53 312.04 3875.00 4237.50 4544.00 4713.50 4963.00 ▅▅▅▇▇
Income A 0 1 5332.00 408.54 5087.00 5112.25 5193.00 5311.25 6315.00 ▇▁▁▁▁
Life.Exp D 0 1 69.49 0.98 67.96 68.83 69.79 70.27 70.66 ▅▂▅▅▇
Life.Exp BC 0 1 71.33 1.14 68.54 70.56 71.33 72.09 73.60 ▂▅▆▇▃
Life.Exp A 0 1 70.83 1.40 69.03 69.93 70.58 71.90 72.78 ▇▇▃▃▇
dens.pop D 0 1 0.06 0.03 0.01 0.04 0.07 0.09 0.10 ▂▃▂▃▇
dens.pop BC 0 1 0.14 0.20 0.00 0.02 0.06 0.15 0.89 ▇▁▁▁▁
dens.pop A 0 1 0.30 0.35 0.00 0.01 0.17 0.47 0.98 ▇▂▂▂▂

Pacote summarytools - funções descr e dfSummary

library(summarytools)
summarytools::descr(estados)
## Descriptive Statistics  
## estados  
## N: 50  
## 
##                     dens.pop    Income   Life.Exp
## ----------------- ---------- --------- ----------
##              Mean       0.15   4435.80      70.88
##           Std.Dev       0.22    614.47       1.34
##               Min       0.00   3098.00      67.96
##                Q1       0.02   3983.00      70.11
##            Median       0.07   4519.00      70.67
##                Q3       0.15   4815.00      71.90
##               Max       0.98   6315.00      73.60
##               MAD       0.08    581.18       1.54
##               IQR       0.12    820.75       1.78
##                CV       1.48      0.14       0.02
##          Skewness       2.37      0.20      -0.15
##       SE.Skewness       0.34      0.34       0.34
##          Kurtosis       5.03      0.24      -0.67
##           N.Valid      50.00     50.00      50.00
##         Pct.Valid     100.00    100.00     100.00
# ou utilize
sumario <- dfSummary(estados)
print(sumario)
## Data Frame Summary  
## estados  
## Dimensions: 50 x 4  
## Duplicates: 0  
## 
## ---------------------------------------------------------------------------------------------------------------------
## No   Variable            Stats / Values               Freqs (% of Valid)   Graph                 Valid      Missing  
## ---- ------------------- ---------------------------- -------------------- --------------------- ---------- ---------
## 1    Income              Mean (sd) : 4435.8 (614.5)   50 distinct values         :               50         0        
##      [numeric]           min < med < max:                                        :               (100.0%)   (0.0%)   
##                          3098 < 4519 < 6315                                  : : :                                   
##                          IQR (CV) : 820.8 (0.1)                              : : : :                                 
##                                                                            . : : : :   .                             
## 
## 2    Life.Exp            Mean (sd) : 70.9 (1.3)       47 distinct values         :               50         0        
##      [numeric]           min < med < max:                                        :               (100.0%)   (0.0%)   
##                          68 < 70.7 < 73.6                                        :   .                               
##                          IQR (CV) : 1.8 (0)                                      : : :                               
##                                                                              . : : : :                               
## 
## 3    dens.pop            Mean (sd) : 0.1 (0.2)        50 distinct values   :                     50         0        
##      [numeric]           min < med < max:                                  :                     (100.0%)   (0.0%)   
##                          0 < 0.1 < 1                                       :                                         
##                          IQR (CV) : 0.1 (1.5)                              :                                         
##                                                                            : : .             .                       
## 
## 4    classe.renda        1. D                         10 (20.0%)           IIII                  50         0        
##      [ordered, factor]   2. BC                        32 (64.0%)           IIIIIIIIIIII          (100.0%)   (0.0%)   
##                          3. A                          8 (16.0%)           III                                       
## ---------------------------------------------------------------------------------------------------------------------
estados <- estados[, -ncol(estados)]
cov(estados)
##                Income     Life.Exp    dens.pop
## Income   377573.30612 280.66318367 44.81027029
## Life.Exp    280.66318   1.80202045  0.02701597
## dens.pop     44.81027   0.02701597  0.04884380
cor(estados)
##             Income   Life.Exp   dens.pop
## Income   1.0000000 0.34025534 0.32996828
## Life.Exp 0.3402553 1.00000000 0.09106176
## dens.pop 0.3299683 0.09106176 1.00000000
#install.packages("corrgram")
#install.packages("corrplot")
#install.packages("PerformanceAnalytics")

library(corrgram)
corrgram(estados)

library(corrplot)
# o detalhe

corrplot(cor(estados), method = "shade")

#altere o method para "square", "ellipse", "number", "shade", "color", "pie”

#Alternativamente, uma visão mais interessante:
library(PerformanceAnalytics)
chart.Correlation(estados, histogram = TRUE, pch = 19)

# com todos os dados da matriz state.x77 (menos a Area)

chart.Correlation(state.x77[, -8], histogram = TRUE, pch = 19)

O pacote ExpaDaR

O pacote ExPanDaR permite que se realize a exploração básica dos dados de modo interativo. Tente o comando ExPanD(estados) no console do RStudio.

Os pacotes janitor e DataExplorer

Dentre os muitos pacotes do R que auxiliam o processo limpar e explorar os dados, destacam-se dois (na minha opinião, é claro):

  • janitor: foi construído por Sam Firke, que o define do seguinte modo:

“o pacote janitor tem funções simples para examinar e limpar dados sujos. Foi construído com usuários de R iniciantes e intermediários em mente e é otimizado para ser amigável. Usuários avançados de R já podem fazer tudo coberto aqui, mas com o janitor eles podem fazê-lo mais rápido e guardar o seu tempo para as coisas mais divertidas.”

  • DataExplorer: Boxuan Cui é o desenvolvedor e mantenedor do pacote, que, em seu núcleo, foi projetado para “simplificar e automatizar a análise exploratória de dados”. de acordo com suas palavras:

“A Análise exploratória de dados (EDA) é a fase inicial e importante da análise de dados/modelagem preditiva. Durante esse processo, os analistas darão uma primeira olhada nos dados e, assim, gerarão hipóteses relevantes e decidirão os próximos passos. No entanto, o processo EDA pode ser um incômodo às vezes. Este pacote R visa automatizar a maior parte do manuseio e visualização de dados, para que os usuários possam se concentrar em estudar os dados e extrair insights.”

Exercício

Utilize os pacotes apresentados no item anterior para explorar os dados, iniciando com os dados originais (state.x77) ou qualquer outros de seu interesse.