# Exploração e Visualização de Dados
R

Gilberto Sassi

IME/UFBA - OBEC

# Preparando o ambiente

## Use o editor de texto certo

### Durante o curso

- Usaremos nas aulas: posit.cloud.
- Recomendamos instalar e usar `R` com versão pelo menos `4.1`: cran.r-project.org.
- usaremos o framework (pacote) `tidyverse` e o pacote `datacult`:
  - Instalação: `install.packages("tidyverse")`
  - Instalação: `install.packages("datacult")`

### Na sua casa ou trabalho

- IDE recomendadas: RStudio e VSCode.
  - Caso você queira usar o VSCode, instale a extensão da linguagem `R`: REditorSupport.

## Parênteses 1: guia de estilo no `R`

O nome de um objeto precisa ter um significado. O nome deve indicar e deixar claro o que este objeto é ou faz.

- Use a convenção do `R`:
  - Use apenas letras minúsculas, números e underscore (comece sempre com letras minúsculas).
  - Nomes de objetos precisam ser substantivos e precisam descrever o que este objeto é ou faz (seja conciso, direto e significativo).
  - Evite ao máximo os nomes que já são usados ( buit-in ) do `R`. Por exemplo: `c`.
  - Coloque espaço depois da vírgula.
  - Não coloque espaço antes nem depois de `()`. Exceção: Coloque um espaço antes e depois de `()` quando usar `if`, `for` ou `while`.
  - Coloque espaço entre operadores básicos: `+`, `-`, `*`, `==` e outros. Exceção: `^`.

Para mais detalhes, consulte: guia de estilo do `tidyverse`.

## Parênteses 2: estrutura de diretórios

Mantenha uma estrutura (organização) consistente de diretórios em seus projetos.

- Sugestão de estrutura:
  - `dados`: diretório para armazenar seus conjuntos de dados.
    - `brutos`: dados brutos.
    - `processados`: dados processados.
  - `codigo_fonte`: código fonte do seu projeto.
  - `figuras`: figuras criadas no seu projeto.
  - `output`: outros arquivos que não são figuras.
  - `legado`: arquivos da versão anterior do projeto.
  - `notas`: notas de reuniões e afins.
  - `relatorio` (ou `artigos`): documento final de seu projeto.
  - `documentos`: livros, artigos e qualquer coisa que são referências em seu projeto.

Para mais detalhes, consulte esse guia do curso-r: diretórios e `.Rproj`.

# A linguagem `R`

### A precursora da linguagem `R`: `S`.

- `R` é uma linguagem derivada do `S`.
- `S` foi desenvolvido em `fortran` por John Chambers em 1976 no Bell Labs.
- `S` foi desenvolvido para ser um ambiente de análise estatística.
- Filosofia do `S`: permitir que usuários possam analisar dados usando estatística com pouco conhecimento de programação.

### História da linguagem `R`

- Em 1991, Ross Ihaka e Robert Gentleman criaram o `R` na Nova Zelândia.
- Em 1996, Ross e Robert liberam o `R` sob a licença “GNU General License”, o que tornou o `R` um software livre.
- Em 1997, The Core Group é criado para melhorar e controlar o código fonte do `R`.

## Motivos para usar `R`

- Constante melhoramento e atualização.
- Portabilidade (roda em praticamente todos os sistemas operacionais).
- Grande comunidade de desenvolvedores que adicionam novas capacidades ao R através de pacotes.
- Gráficos de maneira relativamente simples.
- Interatividade.
- Um grande comunidade de usuários (especialmente útil para resolução de problemas).

## Onde estudar fora de aula?

### Livros populares

- Nível 101: zen do R.
- Nível Iniciante: R Tutorial na W3Schools.
- Nível Iniciante: Hands-On Programming with `R`.
- Nível Intermediário: `R` for Data Science.
- Nível Avançado: Advanced `R`.

### Minha sugestão

Depois desse curso, comece por aqui: `R` for Data Science.

## O que você pode fazer quando estiver em apuros?

- consultar a documentação do `R`:

    help(mean)
    ?mean

- Peça ajuda a um programador mais experiente.
- Use ferramentas de busca como o google e duckduckgo.com.

    log("G")

- Na ferramenta de busca, pesquise por
  `Error in log("G"): non-numeric argument to mathematical function`

## Operações básicas

Soma

    1 + 1

    [1] 2

Substração

    2 - 1

    [1] 1

Multiplicação

    3 * 3

    [1] 9

Divisão

    3 / 2

    [1] 1.5

Potenciação

    2^3

    [1] 8

## Operações básicas
Exercício

Qual o resultado das seguintes operações?

1. \(5,32 + 7,99\)
2. \(5,55 - 10\)
3. \(3,33 \cdot 5,12\)
4. \(\frac{1}{4,55}\)
5. \(5^{1,23}\)

## Pacotes na linguagem `R`

- códigos criados pela comunidade
- disponibilizados principalmente na plataforma cran.r-project.org

### Instalação

    install.packages(pacman)

### Carregando pacotes

Pacotes precisam estar instalados

    library(pacman)

## Carregando pacotes com `pacman`

- Se os pacotes estão instalados: `pacman` carrega os pacotes
- Se os pacotes não estão instalados: `pacman` instala e depois carrega os pacotes
- Omite mensagens dos pacotes
- Pacote separados por vírgula

    p_load(readxl, writexl, janitor, ggthemes, datacult, tidyverse)

## Funções na linguagem `R`

Função: é uma ação e tem os seguinte componentes na ordem:

- nome da função
- parênteses
- argumentos posicionais
- argumentos nomeados

\[ \texttt{resultado <- } \overbrace{\texttt{nome_funcao}}^{\textit{nome da função}} \overbrace{(}^{\textit{parênteses}} \overbrace{\texttt{valor1},\quad \texttt{valor2}}^{\textit{argumentos posicionais}},\quad \overbrace{\texttt{nome1 = valor3},\quad \texttt{nome2 = valor4}}^{\textit{argumentos nomeados}} \overbrace{)}^{\textit{parênteses}} \]

### Exemplo

    pnab_capitais <- read_xlsx('dados/brutos/pnab-capitais.xlsx', sheet=1)

## Funções na linguagem `R`
Exercício

- Obtenha ajuda para `mean` usando a função `help`.
- Calcule o logaritmo de 10 na base 3 usando a função `log`.
- Leia o conjunto de dados `pnab-capitais.xlsx` (está na pasta `dados/brutos/`) usando a função `read_xlsx`.

A função `read_xlsx` faz parte do `readxl`.

## Como os dados estão organizado na `R`

- Tipo de dados: caracter ou texto (`character`), número real (`double`), número inteiro (`integer`), número complexo (`complex`) e lógico (`logical`).
- Estrutura de dados: atomic `vector` (a estrutura de dados mais básica no `R`), `matrix`, `array`, `list` e `data.frame` (`tibble` no `tidyverse`).
- Estrutura de dados Homogênea: `vector`, `matrix` e `array`.
- Estrutura de dados Heterôgenea: `list` e `data.frame` (`tibble` no `tidyverse`).

Neste curso, vamos usar vetores e dataframes.

## O vetor

- Agrupamento de valores de mesmo tipo em um único objeto.
- Criação de vetor:
  - `c(...)`
  - `primeiro_numero_inteiro:ultimo_numero_inteiro`
  - `seq(from = a, to = b, by = c)`.

### Criando um vetor na mão

    vetor_nomes  <- c("Gilberto", "Sassi")
    vetor_nomes

    [1] "Gilberto" "Sassi"

    vetor_num_int <- 1:2
    vetor_num_int

    [1] 1 2

    vetor_num_real <- seq(from = 1, to = 2, by = 0.05)
    vetor_num_real

     [1] 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50 1.55 1.60 1.65 1.70
    [16] 1.75 1.80 1.85 1.90 1.95 2.00

## Operações com vetores

- Slicing: extrair parte de um vetor
- Operações com vetores númericos (`double`, `integer` e `complex`): Operações básicas (operação, substração, multiplicação e divisão ) realizada em cada elemento do vetor.

### Slicing

Selecionando todos os elementos entre o primeiro e o quinto.

    letras <- c("a", "b", "c", "d", "e", "f", "g", "h", "i")
    letras[1:5]

    [1] "a" "b" "c" "d" "e"

    letras[9]

    [1] "i"

## Operações numéricas com vetores numéricos

Adição (vetores númericos)

    vetor_1 <- 1:5
    vetor_2 <- 6:10
    vetor_1 - vetor_2

    [1] -5 -5 -5 -5 -5

Substração (vetores numéricos)

    vetor_1 <- 1:5
    vetor_2 <- 6:10
    vetor_1 - vetor_2

    [1] -5 -5 -5 -5 -5

Multiplicação (vetores numéricos)

    vetor_1 <- 1:5
    vetor_2 <- 6:10
    vetor_1 * vetor_2

    [1]  6 14 24 36 50

Divisão (vetores numéricos)

    vetor_1 <- 1:5
    vetor_2 <- 6:10
    vetor_1 / vetor_2

    [1] 0.1666667 0.2857143 0.3750000 0.4444444 0.5000000

## Operações com vetoresExercício

Realize as seguintes operações envolvendo vetores:

1. \(\begin{pmatrix} 1 & 2 & 3 \end{pmatrix} + \begin{pmatrix} 0,1 & 0,05 & 0,33 \end{pmatrix}\)
2. \(\begin{pmatrix} 1 & 2 & 3 \end{pmatrix} - \begin{pmatrix} 0,1 & 0,05 & 0,33 \end{pmatrix}\)
3. \(\begin{pmatrix} 1 & 2 & 3 \end{pmatrix} \cdot \begin{pmatrix} 0,1 & 0,05 & 0,33 \end{pmatrix}\)
4. \(\begin{pmatrix} 1 & 2 & 3 \end{pmatrix} / \begin{pmatrix} 0,1 & 0,05 & 0,33 \end{pmatrix}\)

## data frame (`tibble`)
A planilha da linguagem `R`

- Implementação de Planilha Eletrônica na linguagem `R`
- Cada coluna é uma variável e é um vetor
- cada linha é uma observação
- Suposição desse curso - a tabela está `tidy`:
  - Cada variável em uma única coluna
  - Cada unidade observacional em uma única linha
- Criação de planilha eletrônica a mão `tibble`: `tibble(...)` e `tribble(....)`.

As funções`tibble` e `tribble` fazem parte do pacote `tidyverse`.

## Construção um dataframe a mão

    df <- tibble(
      nome = c("João", "Josué", "Joaquim", "José"),
      idade = c(20L, 21L, 23L, 32L),
      salario = c(1000.10,2000.20, 3000.30, 4000.40)
    )
    glimpse(df)

    Rows: 4
    Columns: 3
    $ nome    <chr> "João", "Josué", "Joaquim", "José"
    $ idade   <int> 20, 21, 23, 32
    $ salario <dbl> 1000.1, 2000.2, 3000.3, 4000.4

## Operações em data frame

### Operações em um `tibble`

Algumas funções úteis para dataframe.
Código em `R` | Descrição
--- | ---
`head()` | Mostra as primeiras linhas de um `tibble`
`tail()` | Mostra as últimas linhas de um `tibble`
`glimpse()` | Impressão de informações básicas dos dados
operador `$` | Recupera uma coluna de dataframe

    head(df, n = 2)

    # A tibble: 2 × 3
      nome  idade salario
      <chr> <int>   <dbl>
    1 João     20   1000.
    2 Josué    21   2000.

    tail(df, n = 2)

    # A tibble: 2 × 3
      nome    idade salario
      <chr>   <int>   <dbl>
    1 Joaquim    23   3000.
    2 José       32   4000.

    df$salario

    [1] 1000.1 2000.2 3000.3 4000.4

## Dataframe
Exercício

Realize as seguintes operações no dataset `iris`:

- imprima um resumo sobre o dataset `iris`
- pegue as 5 primeiras linhas de `iris`
- pegue as 5 últimas linhas de `iris`
- recupere a coluna `Sepal.Length` de `iris`

`iris` é toy dataset da linguagem: você pode usá-lo diretamente.

## Valores especiais em `R`

Valor | Descrição | O que é | Função para identificar
--- | --- | --- | ---
`NA` | Not Available | Valor faltante. | `is.na()`
`NaN` | Not a Number | Resultado do cálculo indefinido. | `is.nan()`
`Inf` | Infinito | Valor que excede o valor máximo que sua máquina aguenta. | `is.inf()`
`NULL` | Nulo | Valor indefinido de expressões e funções (diferente de `NaN` e `NA`) | `is.null()`

# Importação e exportação de dados

## Importação de planilha eletrônica: `xlsx` ou `xls`

- Pacote: `readxl`
- Funções:
  - `read_xls`: importação de arquivos `.xls`
  - `read_xlsx`: importação de arquivos `.xlsx`
- Parêmetros:
  - `path`: caminho até o arquivo.
  - `sheet`: especifica a planilha do arquivo que será lida.

Para mais detalhes, consulte a documentação: documentação de `read_xl`.

## Importação de planilha eletrônica: `xlsx` ou `xls`

### Exemplo

    personagens_starwars <- read_xlsx("dados/brutos/starwars.xlsx")
    glimpse(personagens_starwars)

    Rows: 87
    Columns: 14
    $ nome            <chr> "Luke Skywalker", "C-3PO", "R2-D2", "Darth Vader", "Le…
    $ altura          <dbl> 172, 167, 96, 202, 150, 178, 165, 97, 183, 182, 188, 1…
    $ massa           <dbl> 77.0, 75.0, 32.0, 136.0, 49.0, 120.0, 75.0, 32.0, 84.0…
    $ cor_do_cabelo   <chr> "Loiro", NA, NA, "Nenhum", "Castanho", "Castanho, Cinz…
    $ cor_da_pele     <chr> "Branca clara", "Ouro", "Branca, Azul", "Branca", "Cla…
    $ cor_dos_olhos   <chr> "Azul", "Amarelo", "Vermelho", "Amarelo", "Castanho", …
    $ ano_nascimento  <dbl> 19.0, 112.0, 33.0, 41.9, 19.0, 52.0, 47.0, NA, 24.0, 5…
    $ sexo_biologico  <chr> "Macho", "Nenhum", "Nenhum", "Macho", "Fêmea", "Macho"…
    $ genero          <chr> "Masculino", "Masculino", "Masculino", "Masculino", "F…
    $ planeta_natal   <chr> "Tatooine", "Tatooine", "Naboo", "Tatooine", "Alderaan…
    $ especie         <chr> "Humano", "Droide", "Droide", "Humano", "Humano", "Hum…
    $ filmes          <chr> "A New Hope; The Empire Strikes Back; Return of the Je…
    $ veiculos        <chr> "Snowspeeder; Imperial Speeder Bike", NA, NA, NA, "Imp…
    $ naves_espaciais <chr> "X-wing; Imperial shuttle", NA, NA, "TIE Advanced x1",…

## Importação de planilha eletrônica: `xlsx` ou `xls`

### Exercício

1. Importe a planilha `pnab-capitais.xlsx` na linguagem `R` sob o nome `pnab_capitais`.
2. Importe a planilha `pnab-estados.xlsx` na linguagem `R` sob o nome `pnab_estados`.

## comma separated value - `csv`

- Planilha eletrônica sem formatação salva em arquivo de texto.
- Usado para distribuição de dados públicos: IPEA, INEP, IBGE e outros.

Planilha eletrônica em formato `.csv`

## Atenção nas diferenças nas unidades de medidas entre países

As unidades de medidas usadas no Brasil e EUA são diferentes.

| BR | EUA
--- | --- | ---
separador decimal | `.` | `,`
agrupador de milhar | `.` | `,`
separador de colunas em arquivos `.csv` | `;` | `,`

- Salário de João usando no BR: 10.000,33
- Salário de João usando no EUA: 10,000.33

## Importação de planilhas eletrônicas: `csv`

- Pacote: `tidyverse`
- Funções:
  - `read_csv`: importação de arquivos `.csv` - sistema imperial (EUA)
  - `read_csv2`: importação de arquivos `.csv` - sistema métrico (BR)
- Parêmetros:
  - `path`: caminho até o arquivo.

Para mais detalhes, consulte a documentação: documentação.

## Importação de planilha eletrônica: `csv`

### Exemplo - sistema métrico

    personagens_starwars <- read_csv2("dados/brutos/starwars_padrao_metrico.csv")
    glimpse(personagens_starwars)

    Rows: 87
    Columns: 14
    $ nome            <chr> "Luke Skywalker", "C-3PO", "R2-D2", "Darth Vader", "Le…
    $ altura          <dbl> 172, 167, 96, 202, 150, 178, 165, 97, 183, 182, 188, 1…
    $ massa           <dbl> 77.0, 75.0, 32.0, 136.0, 49.0, 120.0, 75.0, 32.0, 84.0…
    $ cor_do_cabelo   <chr> "Loiro", NA, NA, "Nenhum", "Castanho", "Castanho, Cinz…
    $ cor_da_pele     <chr> "Branca clara", "Ouro", "Branca, Azul", "Branca", "Cla…
    $ cor_dos_olhos   <chr> "Azul", "Amarelo", "Vermelho", "Amarelo", "Castanho", …
    $ ano_nascimento  <dbl> 19.0, 112.0, 33.0, 41.9, 19.0, 52.0, 47.0, NA, 24.0, 5…
    $ sexo_biologico  <chr> "Macho", "Nenhum", "Nenhum", "Macho", "Fêmea", "Macho"…
    $ genero          <chr> "Masculino", "Masculino", "Masculino", "Masculino", "F…
    $ planeta_natal   <chr> "Tatooine", "Tatooine", "Naboo", "Tatooine", "Alderaan…
    $ especie         <chr> "Humano", "Droide", "Droide", "Humano", "Humano", "Hum…
    $ filmes          <chr> "A New Hope; The Empire Strikes Back; Return of the Je…
    $ veiculos        <chr> "Snowspeeder; Imperial Speeder Bike", NA, NA, NA, "Imp…
    $ naves_espaciais <chr> "X-wing; Imperial shuttle", NA, NA, "TIE Advanced x1",…

### Exemplo - sistema imperial

    personagens_starwars <- read_csv("dados/brutos/starwars_padrao_imperial.csv")
    glimpse(personagens_starwars)

    Rows: 87
    Columns: 14
    $ nome            <chr> "Luke Skywalker", "C-3PO", "R2-D2", "Darth Vader", "Le…
    $ altura          <dbl> 172, 167, 96, 202, 150, 178, 165, 97, 183, 182, 188, 1…
    $ massa           <dbl> 77.0, 75.0, 32.0, 136.0, 49.0, 120.0, 75.0, 32.0, 84.0…
    $ cor_do_cabelo   <chr> "Loiro", NA, NA, "Nenhum", "Castanho", "Castanho, Cinz…
    $ cor_da_pele     <chr> "Branca clara", "Ouro", "Branca, Azul", "Branca", "Cla…
    $ cor_dos_olhos   <chr> "Azul", "Amarelo", "Vermelho", "Amarelo", "Castanho", …
    $ ano_nascimento  <dbl> 19.0, 112.0, 33.0, 41.9, 19.0, 52.0, 47.0, NA, 24.0, 5…
    $ sexo_biologico  <chr> "Macho", "Nenhum", "Nenhum", "Macho", "Fêmea", "Macho"…
    $ genero          <chr> "Masculino", "Masculino", "Masculino", "Masculino", "F…
    $ planeta_natal   <chr> "Tatooine", "Tatooine", "Naboo", "Tatooine", "Alderaan…
    $ especie         <chr> "Humano", "Droide", "Droide", "Humano", "Humano", "Hum…
    $ filmes          <chr> "A New Hope; The Empire Strikes Back; Return of the Je…
    $ veiculos        <chr> "Snowspeeder; Imperial Speeder Bike", NA, NA, NA, "Imp…
    $ naves_espaciais <chr> "X-wing; Imperial shuttle", NA, NA, "TIE Advanced x1",…

## Importação de planilha eletrônica: `csv`

### Exercício

1. Importe a planilha `editais-proprios-capitais-separador-virgula.csv` na linguagem `R` sob o nome `editais_proprios_capitais`.
2. Importe a planilha `editais-proprios-estados.csv` na linguagem `R` sob o nome `editais_proprios_estados`.

## Exportação para planilha eletrônica

### Salvar no formato `.csv` (sistema métrico)

`write_csv2` é parte do pacote `tidyverse`.

    write_csv2(dados_dentes, "dados/processados/nome.csv")

### Salvar no formato `.xlsx`

`write_xlsx` é parte do pacote `writexl`.

    write_xlsx(dados_dentes, "dados/processados/nome.xlsx")

## Exportação para planilha eletrônica

### Exercício

1. Salvar o dataframe `iris` como uma planilha eletrônica em formato `.csv` sob o nome `iris_novo`.
2. Salvar o dataframe `cars` como uma planilha eletrônica em formato `.xlsx` sob o nome `carros`.

`cars` é toy dataset da linguagem: você pode usá-lo diretamente.

# O operador pipe
`|>`

## O operador pipe
`|>`

> Extensamente usado!

- O valor do lado esquerdo vira primeiro argumento da função do lado direito.
- Principal vantagem: simplifica a leitura e a documentação de funções compostas.

Executar

    f(x, y)

é exatamente a mesma coisa que executar

    x |> f(y)

    log(sqrt(sum(x^2)))

é exatamente a mesma coisa que executar

    x^2 |> sum() |> sqrt() |> log()

### Leia a codificação como se fosse um texto literário

- Operações são realizadas exatamente como lemos em português:
  - da esquerda para direita
  - de cima para baixo

# Conceitos iniciais de Estatística

## Conceitos iniciais

- População: todos os elementos ou indivíduos alvo do estudo.
- Amostra: parte da população.
- Parâmetro: característica numérica da população. Usamos letras gregas para denotar parâmetros populacionais.
- Estatística: função ou cálculo da amostra
- Estimativa: característica numérica da amostra, obtida da estatística computada na amostra. Em geral, usamos uma estimativa para estimar o parâmetro populacional.
- Variável: característica mensurável comum a todos os elementos da população.
- Observação: um elemento ou indivíduo alvo do estudo.

## Conceitos iniciais

### Exemplo

Pesquisa de Fomento às Artes no Brasil.

- População: todos os estados, todos municípios e o Distrito Federal.
- Amostra: 96 entes - 69 cidades, 26 estados e o Distrito Federal.
- Variável: ente publicou edital com recursos próprios (“sim” ou “não”).
- Parâmetro: porcentagem de entes que publicaram editais com recursos próprios no Brasil.
- Estatística: porcentagem de entes que publicaram editais com recursos próprios.
- Estimativa: porcentagem de entes que publicaram editais com recursos próprios entre os 96 entes.
- Observação: ente federativo que participou da pesquisa.

## Classificação de variáveis

    flowchart TD
      A[VARIÁVEL] == texto ==> B["`QUALITATIVA`"]
      A == número ==> C["`QUANTITATIVA`"]
      B == com ordem ==> D["`ORDINAL`"]
      D --> H["`Exemplo:
      <br/>
      Escala Likert`"]
      B == sem ordem ==> E["`NOMINAL`"]
      E --> I["`Exemplo:
      <br/>
      UF`"]
      C == parte decimal ==> F["`CONTÍNUA`"]
      F --> J["`Exemplo:
      <br/>
      Montante do edital
      `"]
      C == número inteiro ==> G["`DISCRETA`"]
      G --> K["`Exemplo:
      <br/>
      Número de propostas previstas
      `"]

# Medidas de Resumo

- Estatísticas usadas em EDA (Exploratory Data Analysis).
- Em alguns programas, também é chamado de métrica.

### Medidas de posição

Um valor para sintetiza ou representa todos valores.

Média, Mediana, Moda, e Quantil.

### Medidas de dispersão

Distribuição ou homogeneidade dos valores.

Variância, desvio padrão, amplitude e intervalo interquartílico.

### Outras medidas de resumo

Mínimo, máximo, tamanho amostral, número de valores faltantes (células vazias), soma, frequência.

## Tabela de distribuição de frequências
exceto variável quantitativa contínua

- Estatística: frequência.
- Variável qualitativa e variável quantitativa discreta (com poucos valores distintos).

Tabela de distribuição de frequência para uma variável qualitativa.
\(X\) | frequência | frequência relativa | porcentagem
--- | --- | --- | ---
\(B_1\) | \(n_1\) | \(f_1=\frac{n_1}{n}\) | \(100 \cdot f_1\%\)
\(B_2\) | \(n_2\) | \(f_2=\frac{n_2}{n}\) | \(100 \cdot f_2\%\)
\(\vdots\) | \(\vdots\) | \(\vdots\) | \(\vdots\)
\(B_k\) | \(n_k\) | \(f_k=\frac{n_k}{n}\) | \(100 \cdot f_k\%\)
Total | \(n=n_1+\cdots+n_k\) | \(1\) | \(100\%\)

## Tabela de distribuição de frequências
exceto variável quantitativa contínua

### Na linguagem `R`

- pacote: `janitor`
- funções: `tabyl` e `adorn_totals`
  - `tabyl`: calcula a frequência de cada categoria
  - `adorn_total`: adiciona uma linha de total

    tabela <- dataframe |>
      tabyl(variavel) |>
      adorn_totals()

## Tabela de distribuição de frequências
exceto variável quantitativa contínua

### Exemplo

Proporção de cidades com plano de cultura.

    df_resposta <- read_xlsx("dados/brutos/resposta.xlsx")
    df_cidades <- df_resposta |>
      filter(tipo_ente == "Cidade") |>
      filter(resposta_completa == "Resposta completa")
    tabela <- df_cidades |>
      tabyl(plano_cultura) |>
      adorn_totals()
    tabela

1
  `filter` (`tidyverse`) e semelhante a função `FILTER` do google planilha. A única diferente é substituição de `=` por `==`.

     plano_cultura  n    percent
     Em elaboração 29 0.42028986
               Não  3 0.04347826
               Sim 37 0.53623188
             Total 69 1.00000000

Podemos exportar `tabela` como `xlsx`.

    write_xlsx(tabela, "output/tab_plano_cultura.xlsx")

## Tabela de distribuição de frequências
exceto variável quantitativa contínua

1. Construa uma tabela de distribuição de frequência para a abragência (`v_3_1`) dos editais PNAB publicados pelos estados.
2. Conte o número de editais públicados com recursos próprios pelas capitais por região (`regiao`).

## Tabela de distribuição de frequências
variável quantitativa contínua

`X`: variável quantitativa contínua

Tabela de frequências para a variável quantitativa contínua.
`X` | Frequência | Frequência relativa | Porcentagem
--- | --- | --- | ---
\([l_0, l_1)\) | \(n_1\) | \(f_1 = \frac{n_1}{n}\) | \(p_1 = f_1 \cdot 100\)
\([l_1, l_2)\) | \(n_2\) | \(f_2 = \frac{n_2}{n}\) | \(p_2 = f_2 \cdot 100\)
\(\vdots\) | \(\vdots\) | \(\vdots\) | \(\vdots\)
\([l_{k-1}, l_k]\) | \(n_k\) | \(f_k = \frac{n_k}{n}\) | \(p_k = f_k \cdot 100\)
total | \(n=n_1+\cdots+n_k\) | \(1\) | \(100\)

- \(\text{menor valor de }X = l_0 \leq l_1 \leq \cdots \leq l_{k-1} \leq l_k = \text{maior valor de }X\)
- \(n_i\) é número de valores de `X` entre \(l_{i-1}\) e \(l_i\)
- \(l_0, l_1, \dots, l_k\) quebram o suporte da variável `X` (breakpoints).
- \(l_0, l_1, \cdots, l_k\) são escolhidos de acordo com a teoria por trás da análise de dados

Recomendações:

- crie \(k\) intervalos:
  - \(l_0, l_1, \cdots, l_k\) igualmente espaçados
  - \([l_0, l_1)\), \([l_1, l_2)\), \(\cdots\), \([l_{k-1}, l_k]\): intervalos com mesma quantidade de observações - use quantil
- use a regra de Sturges para determinar o valor de \(k\):
  - \(k = 1 + \log2(n)\) onde \(n\) é tamanho da amostra
  - Se \(1 + \log2(n)\) não é um número inteiro, usamos \(k = \lceil 1 + \log2(n) \rceil\).

    ceiling(1 + log(n))

## Tabela de distribuição de frequências
variável quantitativa contínua

### Na linguagem `R`

- pacote: `obec`
- funções: `tab_freq_cont`
- parâmetros:
  - `variable`: nome da variável quantitativa contínua
  - `breaks`: não forneça ou forneça o número de faixas ou forneça cada uma das faixas
  - `labels`: nome de cada faixa. Por padrão, usa notação matemática
  - `include_lowest`: menor limite do intervalo é incluído na faixa? Por padrão, `TRUE`.
  - `right`: maior limite do intervalo é incluído na faixa? Por padrão, `FALSE`.

## Tabela de distribuição de frequências
variável quantitativa contínua

### Exemplo

    pnab_capitais <- read_excel("dados/brutos/pnab-capitais.xlsx")
    tabela <- pnab_capitais |>
      tab_freq_cont(n_page,
                    breaks = c(0, 10, 20, 40, 50, 60, Inf),
                    labels = c("1 a 10", "10 a 20", "30 a 40", "40 a 50", "50 a 60", "mais de 60"))
    tabela

         n_page   n   percent
         1 a 10   5 0.0462963
        10 a 20  14 0.1296296
        30 a 40  36 0.3333333
        40 a 50  16 0.1481481
        50 a 60  13 0.1203704
     mais de 60  24 0.2222222
          Total 108 1.0000000

## Tabela de distribuição de frequências
variável quantitativa contínua

1. Qual o número de faixas/intervalos para o conjunto de dados dos editais PNAB dos estados? Use a Regra de Sturges.
2. Construa uma tabela de distribuição de frequências o montante (`v_1_5`) dos editais PNAB dos estados usando os intervalos: [0, 250000), [250000, 500000), [500000, 750000), [750000, 1000000), [1000000, 1250000), [1250000, 1500000), [1500000, \(\infty\)).
3. Construa uma tabela de distribuição de frequência para o número de páginas (`n_page`) dos editais com recursos próprios das capitais. Use a Regra de Sturges.

## Tabela de distribuição de frequência
pergunta checkbox

- campo de formulário que permite assinalar mais de uma opção
- cada opção precisa ter sua própria categoria
- vamos contar o número de sucesso em cada coluna

- pacote: `datacult`
- funções: `tab_freq_checkbox`
- parâmetros:
  - `data`: dataframe com os dados
  - `columns`: colunas com as respostas - uma coluna para cada opção
  - `sucess`: categoria indicando o sucesso. Por padrão, é `"checked"`
  - `labels`: rótulos - um para cada opção
  - `variable_name`: nome do campo do formulário

## Tabela de distribuição de frequências
pergunta checkbox

### Exemplo

    respostas <- read_xlsx("dados/brutos/resposta.xlsx")
    respostas <- respostas |>
      filter(resposta_completa == "Resposta completa")
    tabela <- respostas |>
      tab_freq_checkbox(
        columns = c("linguagens_orgao___1", "linguagens_orgao___2",
                    "linguagens_orgao___3", "linguagens_orgao___4",
                    "linguagens_orgao___5", "linguagens_orgao___6",
                    "linguagens_orgao___7", "linguagens_orgao___8"),
        sucess = "Checked"
      )
    tabela

    # A tibble: 8 × 3
      coluna                   n percent
      <chr>                <dbl>   <dbl>
    1 linguagens_orgao___1    87   0.906
    2 linguagens_orgao___2    85   0.885
    3 linguagens_orgao___3    70   0.729
    4 linguagens_orgao___4    91   0.948
    5 linguagens_orgao___5    90   0.938
    6 linguagens_orgao___6    90   0.938
    7 linguagens_orgao___7    86   0.896
    8 linguagens_orgao___8    48   0.5

## Tabela de distribuição de frequência
pergunta checkbox

### Exercício

1. Construa a tabela de distribuição de frequência para a natureza jurídica (`v_1_10`) permitida para as/os proponentes nos editais PNAB para estados.
2. Construa a tabela de distribuição de frequência para a modalidade de fomento (`v_2_1`) prevista nos editais com recursos próprios das capitais.

## Quantil, percentil e quartil

Quantil de ordem de 10% para os editais PNAB dos estados.

Quantil de ordem de 90% para os editais PNAB dos estados.

Seu salário na realidade brasileira.

## Nomenclatura

- Primeiro quartil: quantil de ordem \(\frac{1}{4}\).
- Segundo quartil: quantil de ordem \(\frac{2}{4}\) - mediana.
- Terceiro quartil: quantil de ordem \(\frac{3}{4}\).

- Primeiro decil: quantil de ordem 10%.
- Segundo decil: quantil de ordem 20%.
- Sétimo decil: quantil de ordem 70%.

- Primeiro percentil: quantil de ordem 1%.
- Segundo percentil: quantil de ordem 2%.
- Vigésimo terceiro percentil: quantil de ordem 23%.

## Média

- Centro de massa dos valores.
- Como calcular: somar todos os valores e, em seguida, dividir esta soma pela quantidade de valores somados.

Interpretação de média.

## Mediana

- Meio da fila ordenada.
- Como calcular: ordenar os valores do menor ao maior valor, em seguida pela o valor que está no meio da fila.

Mediana.

## Variância e desvio padrão

Montante em 100 mil reais para cinco entes em 2022, 2023, 2024 e 2025.

## Medidas de resumo

### Na linguagem `R`

- `summarise`: semelhante a tabela dinâmica do Google Planilha
- `group_by`: semelhante as opções `linhas` ou `colunas` da tabela dinâmica do Google Planilha

As funções disponíveis para usar com `summarise` estão na Tabela 1.

Tabela 1: Medidas de resumo disponíveis para usar com `summarise`.

Descrição da função | Função na linguagem `R` | Classificação | Pacote de origem
--- | --- | --- | ---
Máximo | `max` | Outras | `base`
Mínimo | `min` | Outras | `base`
Desvio padrão | `sd` | Posição | `base`
Quantil (quartil e percentil) | `quantile` | Posição | `base`
Intervalo interquartílico | `IQR` | Dispersão | `base`
Mediana | `median` | Posição | `base`
Média | `mean` | Posição | `base`
Número de observações | `n` | Outras | `tidyverse`
Número de observações faltantes | `n_missing` | Outras | `datacult`
Número de observações não faltantes | `n_no_missing` | Outras | `datacult`

## Medidas de resumo

### Exemplo

    pnab_estados <- read_xlsx("dados/brutos/pnab-estados.xlsx")
    tabela_resumo <- pnab_estados |>
      summarise(
        media = mean(v_1_5), mediana = median(v_1_5),
        desv_pad = sd(v_1_5), q1 = quantile(v_1_5, probs = 0.25),
        n = n(), n_missing = n_missing(v_1_5),
        n_no_missing = n_no_missing(v_1_5), iqr = IQR(v_1_5),
        min = min(v_1_5), max = max(v_1_5)
      )
    tabela_resumo

    # A tibble: 1 × 10
         media mediana desv_pad    q1     n n_missing n_no_missing   iqr   min   max
         <dbl>   <dbl>    <dbl> <dbl> <int>     <int>        <int> <dbl> <dbl> <dbl>
    1 3995006. 2000000 6129413.   1e6   314         0          314   3e6   1e5   4e7

### Exemplo com `group_by`

    pnab_estados <- read_xlsx("dados/brutos/pnab-estados.xlsx")
    tabela_resumo <- pnab_estados |>
      group_by(regiao) |>
      summarise(
        media = mean(v_1_5), mediana = median(v_1_5),
        desv_pad = sd(v_1_5), q1 = quantile(v_1_5, probs = 0.25),
        n = n(), n_missing = n_missing(v_1_5),
        n_no_missing = n_no_missing(v_1_5), iqr = IQR(v_1_5),
        min = min(v_1_5), max = max(v_1_5)
      )
    tabela_resumo

1
  As medidas de resumo serão calculadas para cada categoria. Neste, as medidas de resumo serão calculadas por `regiao`.

    # A tibble: 5 × 11
      regiao       media mediana desv_pad     q1     n n_missing n_no_missing    iqr
      <chr>        <dbl>   <dbl>    <dbl>  <dbl> <int>     <int>        <int>  <dbl>
    1 Centro Oes… 1.78e6  1   e6 3522818. 4.25e5    51         0           51 1.32e6
    2 Nordeste    2.90e6  1.42e6 4364848. 9.05e5   114         0          114 1.74e6
    3 Norte       2.96e6  2   e6 3740640. 1.09e6    48         0           48 1.75e6
    4 Sudeste     6.57e6  3   e6 8497231. 1.7 e6    83         0           83 5.18e6
    5 Sul         8.07e6  6.64e6 8127590. 3.47e6    18         0           18 5.16e6
    # ℹ 2 more variables: min <dbl>, max <dbl>

## Medidas de resumo

### Exercício

Calcule a média, a mediana, o intervalo interquartílico, o primeiro quartil, o terceiro quartil, o desvio padrão, o mínimo e o máximo para cada uma das variáveis abaixo:

1. montante (`v_1_5`) para os editais com recursos próprios dos estados.
2. montante (`v_1_5`) para os editais PNAB dos estados e calcule as medidas de resumo pela abrangência do edital (`v_3_1`).

# Gráficos

## Gráficos no `R`

- Pacote: `ggplot2`
- Permite gráficos personalizados com uma sintaxe simples, rápida e iterativa por camadas.
- Começamos com um camada com os dados `ggplot(dados, x = var1, y = var2)`, e vamos adicionando as camadas de anotações, e sumários estatísticos.
- Usa a gramática de gráficos proposta por Leland Wilkinson: Grammar of Graphics.
- Ideia desta gramática: delinear os atributos estéticos das figuras geométricas (incluindo transformações nos dados e mudança no sistema de coordenadas).
- Comunidade ativa na produção de extensões: extensões do `ggplot2`.

Para mais detalhes, você pode consultar `ggplot2`: elegant graphics for data analysis e documentação do `ggplot2`

## Minha indicação de extensões

- `datacult`: gráfico de barras de forma mais simples.
- `ggthemes`: diversos temas para gráficos.
  Mais detalhes em ggthemes.
- `ggeasy`: simplifica a modificação do tamanho da fonte dos eixos.
  Mais detalhes em ggeasy.
- `ggforce`: implementação de sina plot.
  Mais detalhes em ggforce.

## Gráfico de barras
exceto variável quantitativa contínua

- pacote: `datacult`
- funções: `bar_chart`
- parâmetros:
  - `data`: dataframe com os dados.
  - `variable`: variável qualitativa ou quantitativa discreta.
  - `axis_title`: rótulo do eixo y.
  - `fill`: cor da barra. Por padrão, `"blue"`.
  - `axis_title_axis_size`: tamanho da fonte dos rótulos dos eixos. Por padrão, 22.
  - `axis_text_axis_size`: tamanho da fonte nos eixos. Por padrão, 22.
  - `data_label_size`: tamanho da fonte para os rótulos dos dados. Por padrão, 15.
  - `sort`: barras devem estar ordenadas pela frequência? Por padrão, `TRUE`.

    pnab_capitais <- read_xlsx("dados/brutos/pnab-capitais.xlsx")
    p_load(datacult)

    bar_chart(pnab_capitais, regiao) +
      xlim(c(0, 70))

1
  A função `bar_chart` faz parte do pacote `datacult`.
2
  A função `xlim` modifica o menor value e maior valor do eixo x.

## Gráfico de Barras
caso checkbox

- pacote: `obec`
- funções: `bar_chart_checkbox`
- parâmetros:
  - `data`: dataframe com os dados
  - `columns`: colunas com as respostas - uma coluna para cada opção
  - `sucess`: categoria indicando o sucesso. Por padrão, é `"checked"`
  - `labels`: rótulos - um para cada opção
  - `axis_title`: rótulo do eixo y.
  - `fill`: cor da barra. Por padrão, `"blue"`.
  - `axis_title_axis_size`: tamanho da fonte dos rótulos dos eixos. Por padrão, 22.
  - `axis_text_axis_size`: tamanho da fonte nos eixos. Por padrão, 22.
  - `data_label_size`: tamanho da fonte para os rótulos dos dados. Por padrão, 15.
  - `sort`: barras devem estar ordenadas pela frequência? Por padrão, `TRUE`.

## Gráfico de Barras – caso checkbox

    respostas <- read_xlsx("dados/brutos/resposta.xlsx")
    bar_chart_checkbox(respostas, paste0("linguagens_orgao___", 1:8),
                       sucess = "Checked",
                       labels = c(
                         "Artes Visuais", "Audiovisual", "Circo", "Dança",
                         "Literatura", "Música", "Teatro", "Outra(s)"
                       )) +
      xlim(c(0, 120))

1
  `paste0("linguagens_orgao__", 1:8)` resulta no vetor `c(linguagens_orgao__1, linguagens_orgao__2, linguagens_orgao__3, linguagens_orgao__4, linguagens_orgao__5, linguagens_orgao__6, linguagens_orgao__7, linguagens_orgao__8)`

## Gráfico de barras
Exercício

- Construa o gráfico de barra para a abrangência dos editais (`v_3_1`) para os chamamentos públicos com recursos próprios das capitais.
- Construa o gráfico de barra para a natureza jurídica dos editais (`v_1_10`) para os editais PNAB das capitais.

## O pacote `ggplot2`

- Construção da figura por camadas
- Adicionamos camadas com `+`

### Parte 1) quem é o eixo-x e o eixo-y

    ggplot(dataframe, aes(x=primeira_variavel, y=segunda_variavel))

### Parte 2) qual a figura

`*` é uma das diversas figuras disponíveis.

    geom_*()

### Parte 3) ajustes finos

Aqui mudamos os rótulos dos eixos, o tamanho das fontes, o tema da figura entre outros.

### Tudo junto

    # ggplot2 faz parte do tidyverse
    ggplot(dataframe, aes(x=primeira_variavel, y=segunda_variavel)) +
      geom_*() +
      labs(x='x', y='y')

1
  Parte 1): definindo o eixo-x e o eixo-y.
2
  Parte 2): tipo de figura. Por exemplo, gráfico de barras.
3
  Parte 3): editando a figura. Por exemplo, a função `labs` modifica os rótulos do gráfico.

## Histograma

- gráfico de barra para variável quantitativa contínua
- variável quantitativa discreta com muitos valores distintos
- agrupamos observações em faixas/intervalos
- não existe espaço entre as barras
- no eixo-x mostrar as faixas

- duas formas de construir:
  - estatística - frequência: a altura da barra é a frequênca
  - estatística - densidade: a área é a frequência relativa
- as faixas são especificadas com:
  - `bins`: número de faixas
  - `breaks`: os valores que delimitam as faixas
  - `binwidth`: largura de faixa
- `closed`: `"left"` ou `"right"` - texto indicando se o valor da esquerda ou da direita são inclusos na contagem

### Na linguagem `R`

#### Estatística - frequência

Padrão:

    ggplot(dataframe, aes(x = variavel)) +
      geom_histograma(bins = k, closed = "left")

#### Estatística - frequência

Usando para constuir sina e gráfico de densidade.

    ggplot(dataframe, aes(x = variavel, y = after_stat(density))) +
      geom_histograma(breaks = vetor, closed = "right")

## Histograma

### Exemplo

    pnab_capitais <- read_xlsx("dados/brutos/pnab-capitais.xlsx")
    p_load(ggeasy, ggthemes)

    ggplot(pnab_capitais, aes(x = n_page)) +
      geom_histogram(binwidth = 20, closed = "left", fill = "blue") +
      labs(x = "Número de páginas", y = "Frequência") +
      theme_gdocs() +
      easy_all_text_size(size = 22)
    ggsave('figuras/histograma.png')
    ggsave('figuras/histograma.svg')

1
  `ggeasy`: pacote para modificar o tamanho da fonte nos eixos, e `ggthemes`: adiciona temas pré-definidos ao `ggplot2`.
2
  `labs`: função que modifica os rótulos dos eixos.
3
  `theme_gdocs`: função que modifica os aspectos de design da figura para produzir uma imagem com cara de gráfico do Google Planilha. Este tema está no pacote `ggthemes`.
4
  `easy_all_text_size`: modifica o tamanho da fonte para os textos da figura. Função do pacote `ggeasy`.
5
  Salva a imagem `histograma.png` na pasta `figuras`.
6
  Salva a imagem `histograma.svg` na pasta `figuras`.

## Histograma

### Exercício

1. Construa o histograma para o montate (`v_1_5`) dos editais PNAB dos estados. Use a regra de Sturge.
2. Construa o histograma para o número de páginas (`n_page`) dos editais com recursos próprios dos estados. Use faixa de 20 páginas.

## Boxplot

Em português: diagrama de caixa.

- diagrama construído apenas com quantis.
- visualizamos: assimetria, mediana e intervalo interquartílico, outliers.
- \(LI = q_1 - 1,5 \cdot (q_3 - q_1)\).
- \(LS = q_3 + 1,5 \cdot (q_3 - q_1)\).

Diagrama de caixa - boxplot

## Boxplot

### Na linguagem `R`

    pnab_capitais <- read_xlsx("dados/brutos/pnab-capitais.xlsx")

    ggplot(pnab_capitais, aes(x = "", y = n_page)) +
      geom_boxplot(color = "orange", fill = "blue") +
      labs(x = "", y = "Número de páginas") +
      theme_gdocs() +
      easy_all_text_size(size = 22)

1
  `color` modifica o desenho (contorno) da figura e `fill` modifica o preenchimento da figura.
2
  `labs`: função que modifica os rótulos dos eixos.
3
  `theme_gdocs`: função que modifica os aspectos de design da figura para produzir uma imagem com cara de gráfico do Google Planilha. Este tema está no pacote `ggthemes`.
4
  `easy_all_text_size`: modifica o tamanho da fonte para os textos da figura. Função do pacote `ggeasy`.

## Boxplot

### Exemplo

Boxplot de `n_page` por `regiao`.

    pnab_capitais <- read_xlsx("dados/brutos/pnab-capitais.xlsx")

    ggplot(pnab_capitais, aes(x = regiao, y = n_page)) +
      geom_boxplot(color = "orange", fill = "blue") +
      labs(x = "Região", y = "Número de páginas") +
      theme_gdocs() +
      easy_all_text_size(size = 22)

## Boxplot

### Exercício

1. Construa o diagrama de caixa para o montate (`v_1_5`) dos editais PNAB dos estados.
2. Construa o diagrama de caixa para o número de páginas (`n_page`) dos editais com recursos próprios dos estados.
3. Construa o diagrama de caixa para o montate (`v_1_5`) dos editais PNAB dos estados por região (`regiao`).
4. Construa o diagrama de caixa para o número de páginas (`n_page`) dos editais com recursos próprios dos estados por região (`regiao`).

## sina plot

- Distribuição da variável usando densidade e jitter.
- Partes magras têm poucas observações.
- Partes gordas têm muitas observações.
- Não funciona muito bem com poucas observações. Neste caso, use boxplot.

### Na linguagem `R`

1. Primeira figura geométrica: `geom_violin` - `ggplot2`.
2. Segunda figura geométrica: `geom_sina` - `ggforce`.

### Exemplo

    pnab_capitais <- read_xlsx("dados/brutos/pnab-capitais.xlsx")
    p_load(ggforce)

    ggplot(pnab_capitais, aes(x = "", y = n_page)) +
      geom_violin() +
      geom_sina() +
      labs(x = "", y = "Número de páginas") +
      theme_gdocs() +
      easy_all_text_size(size = 22)

1
  `geom_sina` é uma função do pacote `ggforce`.

## sina plot

    pnab_estados <- read_xlsx("dados/brutos/pnab-estados.xlsx")

    ggplot(pnab_capitais, aes(x = regiao, y = n_page)) +
      geom_violin() +
      geom_sina() +
      labs(x = "Região", y = "Número de páginas") +
      theme_gdocs() +
      easy_all_text_size(size = 22)

## sina plot

### Exercício

1. Construa o sina plot para o montate (`v_1_5`) dos editais PNAB dos estados.
2. Construa o sina plot para o número de páginas (`n_page`) dos editais com recursos próprios dos estados.
3. Construa o sina plot para o montate (`v_1_5`) dos editais PNAB dos estados por região (`regiao`).
4. Construa o sina plot para o número de páginas (`n_page`) dos editais com recursos próprios dos estados por região (`regiao`).