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:
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)
Um dos primeiros passos que os analistas devem dar, ao trabalhar com um novo conjunto de dados, é rever seu conteúdo e forma.
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:
Uma contagem de quantas observações (registros) existem.
A quantidade, os nomes e os tipos das variáveis.
Ser capaz de fornecer informações sobre o maior número possível de variáveis (numéricas, categóricas, caracter etc.).
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 desordenado não faz sentido.
Lidar com dados faltantes de modo transparente. É importante saber quantas observações estão faltando.
Para dados numéricos, produzir, pelo menos, estes tipos de estatísticas sumárias;
Para dados categóricos, pelo menos esses tipos de estatísticas sumárias:
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.
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.
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
Hmisc - função describeHmisc::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
## --------------------------------------------------------------------------------
psych - função describeBypsych::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)
skimr - função skim - minha preferidalibrary(skimr)
skim(estados)
| 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()
| 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 | ▇▂▂▂▂ |
summarytools - funções descr e dfSummarylibrary(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)
ExpaDaRO 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.
janitor e ExploreDataDentre 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
janitortem 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 ojanitoreles podem fazê-lo mais rápido e guardar o seu tempo para as coisas mais divertidas.”
ExploreData: 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.”
Utilize os pacotes apresentados no item anterior para explorar os dados, iniciando com os dados originais (state.x77) ou qualquer outros de seu interesse.