library(tidyverse)
library(gridExtra)
Objetivos de aprendizagem:
Para experimentarmos usar as diversas funções estatísticas do R, vamos primeiro carregar um conjunto de dados que vem junto com o pacote ggplot2
. Se você já instalou o pacote tidyverse
então o ggplot2 já foi instalado. Você pode também instalar o pacote
ggplot2isoladamente se desejar. O comando para instalar os pacotes é o
install.packages( )`. Lembre-se de que a instalação de um pacote deve ser sempre feita no console e nunca num R script ou num R Notebook.
Para instalar o pacote tidyverse, use o comando abaixo no console: (recomendado)
install.packages("tidyverse")
.
Caso prefira, instalar o ggplot2 isoladamente, use o comando abaixo no console:
install.packages("ggplot2")
Com os pacote ggplot2
instalado podemos agora usar os datasets que vem junto com esse pacote. para isso é necessário primeiro carregar o pacote ggplot2 na memória do computador, o que é feito com a função
library(ggplot2). Atenção: observe que ao usar a função
library() não precisamos usar as aspas.
Com o pacote ggplot2
estão carregados na memória e podemos usar os datasets que vem junto com esse pacote. Vamos usar o dataset mpg
para nosso treinamento de estatística descritiva no R. O acrônimo mpg
significa Miles Per Gallon - uma medida de quantas milhas um carro pode viajar se você colocar apenas um galão de gasolina ou diesel em seu tanque. (1 galão equivale a 3.79 litros e uma milha equivale a 1.6km).
Esta medida padronizada serve comparar carros com base na sua eficiência. O conjunto de dados mpg
que vem junto com o ggplot2
é um subconjunto dos dados de economia de combustível que a EPA (Enviroment Protection Agency - USA) disponibiliza em http://fueleconomy.gov. O conjunto completo dos dados podem ser obtidos nesse site, no link seguir: http://fueleconomy.gov/feg/download.shtml.
Para facilitar essa aula, vamos usar simplesmente o dataset mpg
que já vem com o ggplot2
. Para carregar esse dataset basta usar o comando abaixo:
data(mpg)
Com a função class( ) podemos verificar que esse dataset é um data frame do R.
class(mpg)
## [1] "tbl_df" "tbl" "data.frame"
Em primeiro lugar, vamos visualizar as primeiras linhas desse dataset com a função `head():
head(mpg)
Com esse comando você pode visualizar a tabela com os dados do dataset mpg
. Podemos também usar o comando str( ) para visualizarmos a estrutura desse data frame, as variáveis e seus tipos:
str(mpg)
## Classes 'tbl_df', 'tbl' and 'data.frame': 234 obs. of 11 variables:
## $ manufacturer: chr "audi" "audi" "audi" "audi" ...
## $ model : chr "a4" "a4" "a4" "a4" ...
## $ displ : num 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ year : int 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cyl : int 4 4 4 4 6 6 6 4 4 4 ...
## $ trans : chr "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ drv : chr "f" "f" "f" "f" ...
## $ cty : int 18 21 20 21 16 18 18 18 16 20 ...
## $ hwy : int 29 29 31 30 26 26 27 26 25 28 ...
## $ fl : chr "p" "p" "p" "p" ...
## $ class : chr "compact" "compact" "compact" "compact" ...
Esse dataset possui 243 linhas (observações) com 11 variáveis, conforme a tabela abaixo:
variável | significado |
---|---|
manufacturer | marca |
model | modelo |
displ | cilindradas |
year | ano de fabricação |
cyl | número de cilindros |
trans | tipo de marcha: automática / manual |
drv | tração: f=frontal, r=traseira, 4=4x4 |
cty | milhas por galão na cidade |
hwy | milhas por galão na estrada |
fl | tipo de combustível: r=regular, p=premium, d=diesel, e=ethanol, c=CNG (gás) |
class | tipo de carro |
A medida mais frequentemente investigada num conjunto de dados é seu centro, ou o ponto no qual as observações tendem a se concentrar. Medidas de tendência central são as estatísticas que descrevem um conjunto de dados pela sua posição central.
Existem várias medidas (estatísticas) que identificam a posição central de um conjunto de dados. As principais estatísticas que resumem um conjunto de dados pela posição central são a média, a mediana e a moda. A média e a mediana são facilmente calculadas no R através das funções mean()
e median()
.
Vamos avaliar a média do consumo dos carros na cidade, lembrando que esses dados estão na variável cty
do dataset mpg
. Lembre-se que para acessar uma variável de um data frame usamos o operador $
da seguinte maneira: nome.do.data.frame$nome.da.variável
.
mean(mpg$cty) # média do consumo na cidade - milhas percoridas por galão
## [1] 16.85897
Vejamos graficamente a posição da média na distribuição dos dados de consumo na cidade:
Podemos ver no gráfico que existem carros que percorrem menos de 10 milhas com um galão e alguns poucos carros que percorrem até 35 milhas com um galão. A distribuição dos dados ao redor da média é assimétrica à direita, pois os valores mais extremos estão à direita.
Vamos verificar agora a média do consumo na estrada:
mean(mpg$hwy)
## [1] 23.44017
A quantidade de milhas percorridas com um galão na estrada é bem maior que na cidade, como seria esperado. Mas a análise visual da distribuição poderá nos mostrar mais informações:
Podemos ver que a média do consumo na estrada é bem maior, ou seja, na estrada os carros percorrem mais milhas que na cidade. Observe também a diferença na forma da distribuição do consumo na estrada: existem dois picos. Essa distribuição é chamada de bimodal devido a isso.
Vamos analisar agora a distribuição das cilindradas dos veículos, calculando inicialmente a média e a mediana. (variável é displ
).
mean(mpg$displ) # media das cilindradas
## [1] 3.471795
median(mpg$displ) # mediana das cilindradas
## [1] 3.3
A mediana é um pouco diferente da média, ligeiramente inferior à média. Se a distribuição desse dados fosse simétrica seria esperado que a média e a mediana fossem iguais, o que não é o caso. Vamos analisar visualmente a distribuição das cilindradas.
Veja que a distribuição é assimétrica à direita, ou seja, tem valores mais extremos à direita. Esses valores aumentam o valor da média. A mediana, por outro lado, é menos afetada por valores extremos. Você pode verificar no gráfico acima que a mediana (azul) é menor que a média (vermelho). Analisar a simetria e dispersão de uma dispersão é assunto do próximo tópico.
Conhecer o ponto central de uma distribuição não é suficiente para descrever completamente como os dados estão distribuídos. Alguns conjuntos de dados podem ter a mesma média e serem bastante diferentes. Veja nos gráficos abaixo alguns exemplos de dados com a mesma média, mas com grande diferença no que se refere à dispersão dos dados ao redor da média.
A necessidade descrever melhor um conjunto de dados tornou necessária a criação de medidas que descrevessem a dispersão dos dados ao redor da média.
A medida mais simples de dispersão dos dados é amplitude (range). A amplitude é a diferença entre o valor máximo e o valor mínimo. Veja no exemplo abaixo uma ilustração visual do significado dessa medida:
Podemos calcular os limites inferior e superior com a função range()
. Essa função mostra os valores máximo e mínimo de um conjunto de dados.
range(conjunto_1)
## [1] 1 8
range(conjunto_2)
## [1] 1 8
A medida da amplitude é simplemente a diferença entre os valores máximo e minimo. Nesse caso a amplitude dos dois conjunto é identica, ou seja, 7 em ambos. Embora os limites sejam idênticos e a amplitude seja a mesma, esses dois conjuntos tem distribuições muito diferentes.
Vamos descobrir quais limites superiores e inferiores da distancia percorrida pelos carros, com um galão de combustível, na cidade, usando a função range:
range(mpg$cty)
## [1] 9 35
Podemos ver que existem carros que percorrem apenas 9 milhas com um galão e outros que percorrem 35 milhas com um galão. Ou seja, a amplitude dessa amostra é de 35-9 = 26 milhas.
Entretanto, essa informação é uma medida muito grosseira, pois a amplitude é calculada usando apenas 2 dados do conjunto, os valores máximo e mínimo.
A amplitude interquartil é uma medida de variabilidade, baseada na divisão de um conjunto de dados em quartis. Os quartis dividem um conjunto de dados ordenados em quatro partes iguais. Os valores que separam partes são chamados de primeiro, segundo e terceiro quartis, e são denotados por Q1, Q2 e Q3, respectivamente. O primeiro quartil (Q1) é o valor abaixo do qual estão 25% dos dados, o segundo quartil (Q2) é o valor abaixo do qual estão 50% do dados e o terceiro quartil (Q3) é o valor abaixo do qual estão 75% dos dados.
A divisão dos conjunto de dados em percentuais é o que se denomina de percentil. Os percentis mais famosos são justamente o 1º quartil ( = percentil 25%), o 2º quartil ( = percentil 50% = mediana), e o 3º quartil (= percentil 75%).
Em estatística é comum usar o termo quantil para se referir ao percentil. A única diferença é que o quando usamos percentil usamos o número em sua forma de porcentagem (percentil 50%) e quando usamos o termo quantil usamos o número em sua forma decimal (quantil 0.5). O R tem uma função denominada quantile()
para que você possa saber o quantil (ou percentil) que desejar.
Vamos calcular os quantis mais importantes, que são o primeiro, segundo e terceiro quartis: Q1, Q2 e Q3 no conjunto de dados da cilindrada dos carros no dataset mpg
.
Q1 <- quantile(mpg$displ, probs = 0.25)
Q2 <- quantile(mpg$displ, probs = 0.50)
Q3 <- quantile(mpg$displ, probs = 0.75)
Q1
## 25%
## 2.4
Q2
## 50%
## 3.3
Q3
## 75%
## 4.6
Podemos ver que o 2º quartil é exatamente a própria mediana. O gráfico abaixo ajuda a visualizar o significado dos quartis.
Na estatística descritiva, a amplitude interquartil (IQR) é uma medida de dispersão estatística, sendo igual à diferença entre o quartil superior (Q3) e quartil inferior (Q1). É também chamada de midspread
ou middle 50%
, ou H-spread
.
\[ IQR = Q3 - Q1. \]
Em outras palavras, a amplitude interquartil (IQR) é 3º quartil
menos o 1º quartil
. Para compreender o que é o IQR observe os seguintes conjuntos de dados:
a <- c(1, 1.2, 1.5, 1.7, 1.8, 1.9, 2.2, 2.3, 2.6, 2.7, 8)
b <- c(1, 2, 2.5, 4, 4.5, 5.5, 6, 6.4, 7, 7.5, 8)
Esses dados tem a mesma amplitude, mas seu IQR é bastante diferente e pode ser visualizado num gráfico de box plot como abaixo
boxplot(a,b,
col="lightblue")
Num boxplot o quadrado representa os 50% dos dados centrais do conjunto, ou seja, os limites das caixas de um boxplot são o 1º e o 3º quartis.
A medida IQR (amplitude interquartil) é mais robusta que a amplitude simples, pois desconsidera os 25% de dados superiores e os 25 inferiores.
Agora vamos criar um grafico de densidade e um boxplot com os dados da cilindrada para visualizarmos essas medidas.
O R tem funções para calcular o percentil que você desejar, mas como é um software estatístico, a função é quantil()
e o não percentil. Para obter o valor correspondente ao quantil desejado, é preciso fornecer como argumento da função o objeto com os dados e o quantil desejado. O resultado é o valor que corresponde àquele quantil.
vamos testar calculando o quantil 0.5, que o mesmo que a mediana, usando os dados das cilindradas:
# calculando o quantil 0.5 = percentil 50%, que é o mesmo que mediana
quantile(mpg$displ, 0.5)
## 50%
## 3.3
# calculando a mediana, para verificarmos que o resultado é o mesmo
median(mpg$displ)
## [1] 3.3
O significado da mediana=3.3: 50% dos carros nesse dataset tem sua cilindrada acima de 3.3 50% dos carros nesse dataset tem sua cilindrada abaixo de 3.3
Como vimos, a amplitude interquartil (IQR) é uma medida mais interessante que a mera amplitude, pois descarta os valores extremos, sendo assim menos sensível a outliers, ou seja, é uma medida considerada mais robusta que a simples amplitude. entretanto, o IQR também sofre do mesmo problema que a amplitude: é um cálculo que só usa dois dados, deixando muitos dados fora da análise.
Precisamos encontrar uma nova medida que represente melhor a dispersão do conjunto de dados, usando todos os dados desse conjunto.
Uma forma de fazer isso é analisar a distância de cada dado em relação à média, somar todas essas distâncias e dividir o valor encontrado pelo número de elementos do conjunto de dados (234 no nosso caso do dataset mpg
). Entretanto, essa simples soma iria resultar sempre em zero, pois esse conjunto de distâncias de cada dado em relação à média iria conter valores positivos e negativos que iriam se cancelar totalmente. Vamos testar isso com o R no conjunto de dados do consumo dos carros na cidade do dataset mpg
.
desvios <- (mpg$cty - mean(mpg$cty))
resultado <- sum(desvios)/234
resultado
## [1] 1.275333e-15
Para visualizarmos esse número da forma usual usamos a função format
format(resultado, scientific = FALSE)
## [1] "0.000000000000001275333"
O resultado dessa conta no R não foi exatamente ZERO devido a problemas de arrendondamento. Mas, teoricamente, se não houvessem erros de arredondamente, o valor seria exatamente sempre ZERO. Logo, essa medida é inútil.
Uma possibilidade alternativa é somarmos os módulos das distâncias, para que os valores não se cancelem, podemos fazer isso no R usando a função abs()
.
resultado2 <- sum(abs(desvios))/234
resultado2
## [1] 3.347359
Entretanto, a operação de módulo (ou valor absoluto) é uma operação matemática com muitas limitações. Existe um outro modo melhor de evitarmos valores negativos nas distancias calculadas: podemos usar o quadrado das distâncias. Essa é a medida conhecida como variância.
resultado3 <- sum((desvios)^2)/234
resultado3
## [1] 18.03567
É preciso, entretanto, fazer uma observação sobre o denominador desse fórmula. Quando calculamos a variância de uma população usando todos os dados da população o denominador é justamente o tamanho dessa população. Entretanto, na maioria das vezes, trabalhamos apenas com uma amostra da população. Uma das principais funções da estatística é fazer inferências sobre a população usando como referência uma amostra. Nesse caso, quando estamos analisando uma amostra, o denominador da variância precisa de um pequeno ajuste, ao invés de n
, o deve ser n-1
. Ou seja, no caso de nossa amostra de 234 carros, usaremos no denominador o valor 233 (234-1).
resultado4 <- sum((desvios)^2)/233
resultado4
## [1] 18.11307
Essa é a medida denominada de variância amostral. E o R tem uma função própria para isso:
var(mpg$cty)
## [1] 18.11307
A variância encontrada foi de 18.11307 milhas ao quadrado.
Veja que o resultado da operação var(mpg$cty)
foi idêntico ao calculado acima passo-a-passo. Ou seja, a fórmula da função var()
utiliza no denominador o valor n-1
. Para calcular a variância populacional deveríamos usar n
no denominador, mas o R não tem essa função.
Para pensar: como você pode fazer para obter o valor da variância populacional a partir da função var()
do R? Podemos encontrar o resultado desejado simplesmente multiplicando o resultado encontrado por \((n-1)/n\)
Dica: escreva uma função chamada varPop!
Solução:
varPop <- function(x){
n <- length(x) # calcula o tamanho da amostra com a função lenght()
var(x)*(n-1)/n # calcula a variância amostral e multiplica por (n-1)/n
}
Vamos testar? Se nossa função estiver correta, ambos os cálculos abaixo deve obter o mesmo resultado que obtivemos acima quando calculamos nossa variancia usando 403 no denominador
varPop(mpg$cty)
## [1] 18.03567
A variância, calculada com a nova fórmula de variância populacional, é de 18.03567 milhas ao quadrado.
Apesar da importância da variância, essa medida tem um pequeno probleminha: ao elevar ao quadrado, a unidade de medida dos dados também foi elevada ao quadrado (milhas ao quadrado). Portanto, se nossa amostra se refere à altura em metros, a unidade da variância é metros ao quadrado, se a unidade de nossa medida são dias, horas, centímetros, a unidade de medida da variância será \(dias^2\), \(horas^2\), \(cm^2\). Essas medidas são de difícil interpretação, daí a necessidade de ajustarmos essas medidas.
O modo mais simples de fazer isso é justamente fazendo a raiz quadrada da variância. Desse modo, a unidade de medida volta a ser a original. A raiz quadrada da variância foi nomeada de desvio padrão, por ser a medida mais usada (padrão) de desvio dos dados, ou seja, de quanto os dados se desviam da medida central (média).
O R tem uma função preparada para o cálculo do desvio padrão: sd
. Lembre-se que na língua inglesa desvio padrão se escreve ‘standard deviation’, daí sd
. Vamos calcular o desvio padrão do consumo dos carros na cidade:
sd(mpg$cty)
## [1] 4.255946
É a medida de dispersão mais comum na estatística, que utiliza em seus cálculos todos os dados. Devido ao fato de uma das etapas do cálculo do desvio padrão envolver a operação de elevar ao quadrado, o desvio padrão será sempre um valor positivo (ou zero). Se todos os valores dos dados forem iguais, o desvio padrão será ZERO. Uma das vantagens do desvio padrão é que a unidade de medida é a mesma dos dados da amostra, ao contrário da variância, na qual a unidade de medida é o quadrado da unidade original.
Ao analisar o desvio padrão, é preciso ter em mente que desvios pequenos indicam que os dados se agrupam em torno da média e desvios grandes indicam que os dados estão dispersos numa grande amplitude. Finalmente, como o cálculo do desvio padrão leva em conta todos os elementos do conjunto de dados, o resultado é que o desvio padrão é sensível aos outliers (valores extremos).
Nesse capítulo estudamos as medidas estatísticas de tendencia central e de dispersão. Vimos também que essas medidas numéricas são melhor compreendidas quando associadas a gráficos que ilustrem o que os números indicam. A próxima etapa da análise descritiva é justamente aprender a criar gráficos que ilustrem os dados.