Histograma

Um histograma agrupa os dados em classes (bins) e conta a frequência das observações dentro de cada classe. O uso mais comum do histograma é para visualizar a forma da distribuição dos dados. Vamos ver alguns exemplos de como construir histogramas usando o ggplot2.

ggplot2

A estrutura de um gráfico do ggplot2 parte de três elementos básicos: (1) a base de dados, isto é, um objeto data.frame; (2) um mapeamento de variáveis, feito com auxílio da função aes(); (3) a escolha da forma do gráfico, feito com as funções geom. O ggplot2 funciona adicionando camadas sobre um gráfico inicial. Começamos com a função ggplot() e vamos adicionando geoms, funções auxiliares que especificam a forma do gráfico. Neste post vamos aprender a usar o geom_histogram().

É importante notar que há também uma função alternativa ao ggplot(): o qplot() cuja sintaxe guarda muita semelhança com a função plot() que vem embutida no R. Apesar da função qplot() não ser tão flexível ela às vezes é muito conveniente.

Vamos ver na prática como tudo isto funciona. Primeiro temos que carregar o pacote ggplot2 (caso não tenha insataldo o pacote use o comando install.packages("ggplot2")).

library(ggplot2)

Vamos aproveitar uma base que já está embutida no R, denominada swiss. Estes dados advêm de um estudo sobre a redução da taxa de fertilidade na Suécia. Cada linha contém informações de uma província da Suécia. Abaixo segue uma tabela com as dez primeiras observações desta base.

Fertility Agriculture Examination Education Catholic Infant.Mortality
Courtelary 80.2 17.0 15 12 9.96 22.2
Delemont 83.1 45.1 6 9 84.84 22.2
Franches-Mnt 92.5 39.7 5 5 93.40 20.2
Moutier 85.8 36.5 12 7 33.77 20.3
Neuveville 76.9 43.5 17 15 5.16 20.6
Porrentruy 76.1 35.3 9 7 90.57 26.6
Broye 83.8 70.2 16 7 92.85 23.6
Glane 92.4 67.8 14 8 97.16 24.9
Gruyere 82.4 53.3 12 7 97.67 21.0
Sarine 82.9 45.2 16 13 91.38 24.4

Vamos fazer um histograma da mortalidade infantil das diferentes províncias.

Relembrando, os três elementos que precisamos informar:

  1. A base de dados que queremos usar.
  2. O conjunto de variáveis que queremos visualizar.
  3. Qual a forma do gráfico.

A sintaxe padrão de um histograma é da forma: ggplot( data = base_de_dados, aes(x = variável) ) + geom_histogram()

Como mencionado acima, o data.frame que estamos utilizando é o swiss. A variável que queremos mapear é Infant.Mortality (mortalidade infantil). O código final segue abaixo:

ggplot(data = swiss, aes(x = Infant.Mortality)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Note que o ggplot2 escolhe automaticamente o tamanho dos retângulos (as bandas). A escolha do tamanho ideal dos intervalos pode ser bastante complicada: intervalos grandes diminuem o ruído das observações mas podem agregar demais os dados; intervalos muito pequenos podem acabar sendo específicos demais e derrotando o valor do gráfico, já que queremos agregar os dados para encontrar padrões. Podemos especificar os intervalos definindo tanto o número de retângulos como o tamanho de cada retângulo usando os argumentos bin e binwidth respectivamente.

ggplot(data = swiss, aes(x = Infant.Mortality)) +
  geom_histogram(bin = 8) # 8 retângulos
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = swiss, aes(x = Catholic)) +
  geom_histogram(binwidth = 10) # Cada retângulo tem comprimento 10

Distribuição de dados

O histograma também é muito utilizado em análises exploratórias preliminares de bases de dados. O pacote abaixo carrega uma base de dados do (IMDB)[www.imdb.com] com informações sobre vários filmes. No IMDB cada usuário cadastrado pode atribuir uma nota de 1 a 10 para qualquer filme cadastrado. Como será a distribuição dos votos dos usuários?

library(ggplot2movies)

ggplot(data = movies, aes(x = rating)) +
  geom_histogram(binwidth = 0.1)

Dados simulados (distribuição normal)

Um uso bastante comum de histogramas é de visualizar a forma da distribuição dos dados. Podemos estar interessados em verificar se os dados parecem seguir alguma distribuição como a normal, por exemplo. Abaixo fazemos um exemplo simulado. Primeiro sorteamos 1000 valores a partir de uma distribuição normal com média 5 e desvio-padrão unitário. Depois colocamos guardamos estes valores num data.frame sob o nome var_x para que seja possível usar a função ggplot().

x <- rnorm(n = 1000, mean = 5, sd = 1)
d <- data.frame(var_x = x)
ggplot(data = d, aes(var_x)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Como mencionado acima, a escolha do geom troca o tipo de gráfico que é gerado. No caso deste exemplo, pode ser interessante plotar a densidade dos dados diretamente. Podemos fazer isto usando geom_density().

ggplot(data = d, aes(var_x)) +
  geom_density()

Econometria (normalidade dos resíduos)

Em geral, é desejável que os resíduos de uma regressão se comportem segundo uma disribuição normal. Uma maneira visual de tentar verificar isto é usando um histograma. Abaixo fazemos uma regressão linear usando os dados da base swiss mencionada anteriormente. Indicando cada uma das províncias por \(i\), a equação do modelo é:

\[\begin{equation} \text{Fertilidade}_{i} = \beta_{0} + \beta_{1}\text{Catolico}_{i} + \beta_{2}\text{Agricultura}_{i} + \beta_{3}\text{Educacao}_{i} + u_{i} \end{equation}\]

onde Católico indica o percentual de católicos na província; Agricultura, o percentual de homens que fazem trabalho agrícola; Educação, o percentual de habitantes com educação superior ao nível básico.

fit <- lm(Fertility ~ Catholic + Agriculture + Education, data = swiss)
Resultados da regressão
Dependent variable:
Fertility
Catholic 0.145***
(0.030)
Agriculture -0.203***
(0.071)
Education -1.072***
(0.156)
Constant 86.225***
(4.735)
Observations 47
R2 0.642
Adjusted R2 0.617
Residual Std. Error 7.728 (df = 43)
F Statistic 25.732*** (df = 3; 43)
Note: p<0.1; p<0.05; p<0.01

Aqui teríamos que guardar os dados dos resíduos da regessão num data.frame para poder usar a função ggplot2(). Para evitar este incômodo podemos usar a função qplot().

residuos <- resid(fit)
qplot(x = residuos, geom = 'histogram') + stat_bin(bins = 10)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Outros tipo de gráficos (ggplot2)

Fundamentos: