Capítulo 3 Descrevendo variáveis qualitativas
Variáveis qualitativas podem ser categóricas não-ordenadas ou categóricas ordenadas. A descrição de variáveis desta natureza se dá por meio da contagem e da representação dos níveis destas variáveis por meio da contagem total, pelos valores relativos ou percentuais.
Carregue o pacote tidyverse
e importe novamente a base de dados Reservatorios_Parana_parcial.csv
.
# Carrega pacotes
library(tidyverse)
# Importa base de dados
= read_delim('Reservatorios_Parana_parcial.csv',
res delim = ',',
locale = locale(decimal_mark = '.',
encoding = 'latin1'))
Na tabela, temos 3 variáveis categóricas: Reservatorio
, Bacia
e Trofia
. A primeira identifica cada reservatório pelo seu nome. A segunda é uma variável categórica não-ordenada (nível de mensuração nominal) e a terceira uma variável categórica ordenada (nível de mensuração ordinal).
3.1 Representação em tabelas de frequência
Como discutimos no capítulo 1, se uma variável é descrita no nível de mensuração nominal, como é o caso de Bacia
, nossa única ação possível é a contagem da frequência com que cada um dos níveis aparece na variável. Essa contagem pode ser obtda por meio de uma tabela de frequências.
= res %>%
fbacia group_by(Bacia) %>%
summarise(Frequencia = n())
fbacia
Bacia | Frequencia |
---|---|
Iguacu | 13 |
Ivai | 2 |
Litoranea | 4 |
Paranapanema | 7 |
Piriqui | 2 |
Tibagi | 3 |
O resultado mostra que existem 13 reservatórios na tabela pertancentes à bacia do rio 13, 2 à bacia do rio 2 e assim por diante.
As linhas da tabela estão organizadas em ordem alfabética. Como esata é uma variável não-ordenada, isto em sí não é um problerma. No entanto, para facilitar a visualização, podemos ordená-las de modo decrescente como função do número de reservatórios por bacia:
= fbacia %>%
fbacia arrange(desc(Frequencia))
fbacia
Bacia | Frequencia |
---|---|
Iguacu | 13 |
Paranapanema | 7 |
Litoranea | 4 |
Tibagi | 3 |
Ivai | 2 |
Piriqui | 2 |
Podemos olhar também para a frequência relativa do número de reservatórios por bacia.
= fbacia %>%
fbacia_rel mutate(Freq_relativa = Frequencia / sum(Frequencia))
fbacia_rel
Bacia | Frequencia | Freq_relativa |
---|---|---|
Iguacu | 13 | 0.4193548 |
Paranapanema | 7 | 0.2258065 |
Litoranea | 4 | 0.1290323 |
Tibagi | 3 | 0.0967742 |
Ivai | 2 | 0.0645161 |
Piriqui | 2 | 0.0645161 |
A característica da frequência relativa, é que o somatório da coluna deve ser igual a \(1\), enquanto a frequência numérica tem o somatório igual ao número de linhas na tabela.
## # A tibble: 1 × 2
## Frequencia Freq_relativa
## <int> <dbl>
## 1 31 1
3.2 Tabelas de frequência para variáveis categóricas ordenadas
A característica da variável Trofia
difere da anterior unicamente por ser uma variável categórica ordenada que no caso, expressa o grau de eutrofização dos reservatórios. Neste sentido, a única mudança na representação da variável se deve ao fato de que existe uma sequência natural para representar os níveis. Podemos indicar que uma determinada variável é categórica ordenada fazendo uma pequena alteração na base de dados.
Se montarmos uma tabela de frequência da variável trofia, teremos as linhas organizadas em ordem alfabética:
= res %>%
ftrofia group_by(Trofia) %>%
summarise(Frequencia = n())
ftrofia
Trofia | Frequencia |
---|---|
Eutrófico | 2 |
Mesotrófico | 3 |
Oligotrófico | 24 |
NA | 2 |
Se desejarmos que as colunas apareçam como função do nível de Eutrofização, devemos primeiro transformar a variável bacia em um fator ordenado que é o modo como o R interpreta uma variável categórica ordenada.
Use o comando:
glimpse(res)
## Rows: 31
## Columns: 11
## $ Reservatorio <chr> "Cavernoso", "Curucaca", "Foz do Areia", "Irai", "JMF", …
## $ Bacia <chr> "Iguacu", "Iguacu", "Iguacu", "Iguacu", "Iguacu", "Iguac…
## $ Fechamento <dbl> 1965, 1982, 1980, 2000, 1970, 1996, 1978, 1979, 1998, 19…
## $ Area <dbl> 2.90, 2.00, 139.00, 15.00, 0.45, 3.40, 14.00, 3.30, 124.…
## $ Trofia <chr> "Oligotrófico", "Oligotrófico", "Oligotrófico", "Eutrófi…
## $ pH <dbl> 7.4, 7.0, 7.3, 6.9, 7.3, 7.1, 8.8, 7.1, 7.3, 6.5, 8.6, 9…
## $ Condutividade <dbl> 33.1, 32.4, 35.5, 50.2, 40.2, 23.7, 125.6, 22.8, 39.6, 2…
## $ Alcalinidade <dbl> 139.80, 125.70, 97.00, 3.30, 3.70, 152.70, 526.00, 50.67…
## $ P.total <dbl> 7.8, 4.7, 14.3, 53.4, 41.2, 3.3, 15.2, 4.5, 12.1, 11.0, …
## $ Riqueza <dbl> 18, 16, 19, 12, 18, 17, 11, 8, 21, 8, 24, 21, 22, 15, 10…
## $ CPUE <dbl> 9.22, 28.73, 11.59, 30.76, 5.95, 7.75, 7.51, 4.01, 20.83…
para verificar que o R entende a variável Trofia
como um character (<chr>
).
Iremos transformar esta variável para que o R a interprete como uma variável categórica ordenada fazendo:
= res %>%
res mutate(Trofia = factor(Trofia, ordered = TRUE,
levels = c('Oligotrófico', 'Mesotrófico', 'Eutrófico')))
Após aplicarmos este comando, vemos que agora o R reconhece esta variável como do tipo <ord>
:
glimpse(res)
## Rows: 31
## Columns: 11
## $ Reservatorio <chr> "Cavernoso", "Curucaca", "Foz do Areia", "Irai", "JMF", …
## $ Bacia <chr> "Iguacu", "Iguacu", "Iguacu", "Iguacu", "Iguacu", "Iguac…
## $ Fechamento <dbl> 1965, 1982, 1980, 2000, 1970, 1996, 1978, 1979, 1998, 19…
## $ Area <dbl> 2.90, 2.00, 139.00, 15.00, 0.45, 3.40, 14.00, 3.30, 124.…
## $ Trofia <ord> Oligotrófico, Oligotrófico, Oligotrófico, Eutrófico, Mes…
## $ pH <dbl> 7.4, 7.0, 7.3, 6.9, 7.3, 7.1, 8.8, 7.1, 7.3, 6.5, 8.6, 9…
## $ Condutividade <dbl> 33.1, 32.4, 35.5, 50.2, 40.2, 23.7, 125.6, 22.8, 39.6, 2…
## $ Alcalinidade <dbl> 139.80, 125.70, 97.00, 3.30, 3.70, 152.70, 526.00, 50.67…
## $ P.total <dbl> 7.8, 4.7, 14.3, 53.4, 41.2, 3.3, 15.2, 4.5, 12.1, 11.0, …
## $ Riqueza <dbl> 18, 16, 19, 12, 18, 17, 11, 8, 21, 8, 24, 21, 22, 15, 10…
## $ CPUE <dbl> 9.22, 28.73, 11.59, 30.76, 5.95, 7.75, 7.51, 4.01, 20.83…
E se fizermos:
$Trofia res
## [1] Oligotrófico Oligotrófico Oligotrófico Eutrófico Mesotrófico
## [6] Oligotrófico Oligotrófico Oligotrófico Oligotrófico Oligotrófico
## [11] Oligotrófico Oligotrófico Oligotrófico Oligotrófico Mesotrófico
## [16] Oligotrófico Oligotrófico Oligotrófico Mesotrófico Oligotrófico
## [21] Oligotrófico Oligotrófico Oligotrófico <NA> Oligotrófico
## [26] Oligotrófico Eutrófico Oligotrófico Oligotrófico <NA>
## [31] Oligotrófico
## Levels: Oligotrófico < Mesotrófico < Eutrófico
Temos agora a indicação de que: Oligotrófico < Mesotrófico < Eutrófico
, expressando a sequência que definimos para esta variável ordinal.
A partir de agora, se extrairmos uma tabela de frequência relativa, as linhas apareceram na ordem pré-definida.
= res %>%
ftrofia group_by(Trofia) %>%
summarise(Frequencia = n())
ftrofia
Trofia | Frequencia |
---|---|
Oligotrófico | 24 |
Mesotrófico | 3 |
Eutrófico | 2 |
NA | 2 |
Caso você não queira representar os dados faltantes (NA
), é possível utilizar a função drop_na()
para excluir linhas com NA
s.
# Exclui linhas da tabela referentes aos dados faltantes em `Trofia`
= res %>%
ftrofia drop_na(Trofia) %>%
group_by(Trofia) %>%
summarise(Frequencia = n())
ftrofia
Trofia | Frequencia |
---|---|
Oligotrófico | 24 |
Mesotrófico | 3 |
Eutrófico | 2 |
Podemos adicionar uma uma coluna de frequência relativa como fizemos anteriormente.
= ftrofia %>%
ftrofia_rel mutate(Freq_relativa = Frequencia / sum(Frequencia))
ftrofia_rel
Trofia | Frequencia | Freq_relativa |
---|---|---|
Oligotrófico | 24 | 0.8275862 |
Mesotrófico | 3 | 0.1034483 |
Eutrófico | 2 | 0.0689655 |
3.3 Representação gráfica
Variáveis categóricas não-ordenadas ou ordenadas podem ser representadas por gráficos de barras.
Utilizaremos o pacote ggplot2
para representar graficamente as variáveis. O ggplot2
é instalado e habilitado juntamente com o tidyverse
, de modo que neste momento você já o tem habilitado em sua seção do R.
Para uma rápida explicação do ggplot2 veja aqui. Para uma explicação detalhada veja o site oficial (ggplot2) e o livro ggplot2: Elegant Graphics for Data Analysis.
3.3.1 Criando um gráfico no ggplot2
Um gráfico no ggplot2
é feito em camadas que devem ter minimamente: a definição da tabela de dados, a estética gráfica (quais serão as variáveis envolvidas e suas posições no gráficos) e o formato (gráficos de pontos, linhas, barras, etc.). Esta abordagem permite que tenhamos um método consistente para construir diferentes tipos gráficos.
Gráfico de frequência
Um gráfico de barras da variável Bacia
ficaria:
ggplot(data = res) +
aes(x = Bacia) +
geom_bar()
Vamos entender o comando:
ggplot(res)
: define a tabela de dados que será utilizada.aes(x = Bacia)
: define que o eixo \(x\) deste gráfico deverá contém os níveis da variávelBacia
.geom_bar()
: define o tipo gráfico (noggplot2
é denominado de geometria gráfica)
Estes argumentos devem ser inseridos sequencialmente separtados pelo símbolo +
.
O argumento geom_bar()
espera como argumento uma variável qualitativa em um dos eixos e, por padrão, fará a contagem dos níveis dentro da variável e apresentará esta contagem no outro eixo.
Deste modo, poderíamos ter feito o mesmo gráfico de barras indicando que a variável Bacia
seria representada no eixo \(y\) o que resultaria em um gráfico de barras invertido conforme abaixo:
ggplot(data = res) +
aes(y = Bacia) +
geom_bar()
A estética gráfica (comando aes()
) não precisa estar em uma linha separada. Também não é obrigatório escrevermos data = res
. De fato, é mais comun escrevermos esta sequência de argumentos como:
ggplot(res, mapping = aes(x = Bacia)) +
geom_bar()
ou simplesmente:
ggplot(res, aes(x = Bacia)) +
geom_bar()
Finalmente, poderíamos organizar os barras em ordem decrescente como fizemos com as tabelas de frequência, utilizando a função fct_infreq()
:
ggplot(res, aes(x = fct_infreq(Bacia))) +
geom_bar()
ou em ordem crescente revertendo o comando anterior, com a função fct_rev()
.
ggplot(res, aes(x = fct_rev(fct_infreq(Bacia)))) +
geom_bar()
Formatanto a figura
Para tormar a figura mais auto-explicativa, podemos adicionar camadas identificando os eixos e fornecendo, título, subtítulo e outras informações:
ggplot(res, aes(x = Bacia)) +
geom_bar() +
labs(title = 'Reservatórios do Estado do Paraná',
subtitle = 'Reservatórios por bacia hidrográfica',
caption = 'Dados obtidos do livro: Biocenoses em Reservatórios',
x = 'Bacia hidrográfica',
y = 'Frequência')
Gráfico de frequência relativa
Utilizando o ggplot2
é simples construir um gráfico de frequência relativa.
ggplot(res, aes(x = Bacia, y = ..prop.., group = 1)) +
geom_bar()
Veja que para isto transformou as contagens em proporções. Se quisermos transformar em percentuais então:
ggplot(res, aes(x = Bacia, y = ..prop.., group = 1)) +
geom_bar() +
scale_y_continuous(labels = scales::percent)
Outras opções para construir um gráfico de barras
As figuras que acabamos de fazer apresentam, do modo gráfico, as mesmas informações das tabelas de frequência vistas no início do capítulo sem que fosse necessário contruir a tabela de frequencia, pois o comando geom_bar()
já realiza esta contagem.
Entretanto, caso já tivéssemos a tabela de frequência também poderíamos utilizá-la diretamente. No início do capítulo, contruímos a tabela fbacia_rel
onde tínhamos 3 colunas: Bacia, Frequencia, Freq_relativa.
Podemos construir gráficos de barras das tabelas Frequencia
ou Freq_relativa
da seguinte forma:
ggplot(fbacia_rel, aes(x = Bacia, y = Frequencia)) +
geom_bar(stat = 'identity')
e
ggplot(fbacia_rel, aes(x = Bacia, y = Freq_relativa)) +
geom_bar(stat = 'identity')
Para utilizar diretamente uma tabela de frequências, devemos oferecer a variável do eixo \(x\), do eixo \(y\) e no comando geom_bar()
adicionar o argumento stat = 'identity'
. Feito isso, o comando utiliza diretamente os números disponíveis em cada linha da coluna Frequencia
.
Gráfico de frequência para variáveis categóricas ordenadas
Para variáveis categóricas ordenadas valem os mesmos comandos apresentados acima. Usamos a função geom_bar()
para construir os gráficos de barras. A diferença é que antes da construção, é necessário que a variável em questão tenha sido transformada para um fator ordenado.
Lembrando o que fizemos no início do capítulo, esta transformação pode ser feita para a variável Trofia
com os comandos:
= res %>%
res mutate(Trofia = factor(Trofia, ordered = TRUE,
levels = c('Oligotrófico', 'Mesotrófico', 'Eutrófico')))
Feito isto, o comando geom_bar()
vai organizar os níveis de acordo com a sequência definida:
ggplot(res, aes(x = Trofia)) +
geom_bar()
E caso seja necessário retirar reservatórios com dados faltantes em Trofia
, podemos fazer:
%>%
res drop_na(Trofia) %>%
ggplot(aes(x = Trofia)) +
geom_bar()
No comando acima, a tabela de dados não entra dentro do comando ggplot()
, ela é inicialmente processada e usamos o operador %>%
para inserir o resultado do processamento no comnado gráfico. Esta é outra maneira de combinar capacidade de processamento de dados e apresentação gráfica com o conjunto de pacotes em tidyverse
.