Onde estamos?

O R

O R é uma linguagem de programação desenvolvida por estatísticos, finalidades estatísticas. Trata-se de uma linguagem extremamente eficiente em procedimentos de análise de dados, sejam eles simples ou complexos, especialmente quando utilizado em conjunto ao RStudio.

O RStudio

O RStudio é uma IDE (integrated development environment), ou simplesmente uma interface, que faz com que trabalhar com o R seja uma tarefa bem menos dolorosa.

A iniciativa Tidyverse

O Tidyverse é um conjunto de pacotes do R que possui ferramentas para basicamente todos os problemas de análise de dados que enfrentamos na Meios, e que você provavelmente vai enfrentar ao longo da vida nos seus trabalhos quantitativos em Ciências Sociais.

Todos os pacotes do tidyverse funcionam de maneira extremamente integrada. Utilizá-los faz com que o trabalho fique realmente muito mais fácil.

Instalando e carregando o tidyverse:

## Instalar os pacotes

#install.packages('tidyverse')
#install.packages('knitr')
#install.packages('kableExtra')
#install.packages('scales')

## Carregar os pacotes
library(tidyverse)
## -- Attaching packages ------------------------------------------------------ tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.1     v dplyr   1.0.0
## v tidyr   1.1.0     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts --------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
#KableExtra para fazer tabelas bonitas
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(knitr)

#Scales para percentuais em gráficos 
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor

O processo de análise de dados

Importação dos dados para o R (Import)

Na Meios, grande parte das vezes (felizmente) trabalhamos com dados estruturados e limpos em formato de planilha (spreadsheets). Tudo que temos que fazer é estabelecer um diretório padrão, importar o dataset para o R e começar a trabalhar.

Estabelecendo um diretório padrão

O diretório padrão é o local onde todos os nossos arquivos de input (as bases propriamente ditas) devem estar para que o R seja capaz de lê-las de maneira direta, é também o local onde os outputs (resultados das análises) serão salvos.

## Descobrindo o diretório padrão atual - GETWD (Get working directory)

getwd()
## [1] "C:/Users/romul/Desktop/Projetos em R/capacitacao_meios/capacitacaoteste/projetoteste"
## Estabelecendo um novo diretório padrão (cuidado com a direção das barras!)

# setwd("C:/Users/romul/Desktop/acertos de matricula")

# Checando se o novo diretório foi corretamente carregado

getwd()
## [1] "C:/Users/romul/Desktop/Projetos em R/capacitacao_meios/capacitacaoteste/projetoteste"

Leitura do dado com o readr e readxl

Vamos abrir a base de dados que enviei para vocês no e-mail utilizando comando ‘read_csv()’ e ‘read_excel()’.

# READ_CSV do readr - Leitura de arquivos com separador 'virgulas'

percepcao_alunos_cacs   <- readr ::read_csv('percepcao_alunos_cacs.csv')
## Parsed with column specification:
## cols(
##   .default = col_character(),
##   IDADE = col_double(),
##   IMPACTO_PRECO = col_double(),
##   IMPACTO_MET_ENSINO = col_double(),
##   IMPACTO_INTERNET = col_double(),
##   IMPACTO_ACESSO = col_double(),
##   IMPACTO_AMBIENTE = col_double(),
##   IMPACTO_TEMPO = col_double(),
##   IMPACTO_NAO_EAD = col_double()
## )
## See spec(...) for full column specifications.
# READ_EXCEL - readxl - Leitura de arquivos em formato .xlsx (padrão excel)
percepcao_alunos_cacsxl <- readxl ::read_excel('percepcao_alunoscacsxl.xlsx')

## Remoção de um objeto do environment

#rm(percepcao_alunos_cacs)

## Remoção de vários objetos do environment

#rm(list = c('mulheres_20_mais', 'obj'))

## Remoção de todos os objetos do environment

#rm(list = ls())

Explorando a estrutura do dado e checando consistência (Tidying)

Tipos de dado no R:

Existe uma infinidade de tipos de dados no R. Os mais importantes pra nós são:

  1. Characters/Strings - Variáveis de texto reconhecidas como “sem padrão”.
  2. Numerics/Integers - Numéricas em geral ou números inteiros
  3. Logicals - Variáveis lógicas, TRUE/FALSE
  4. Factors - Variáveis textuais bastante específicas e com níveis, reconhecidas como tendo um padrão.

Checagem da estrutura do dado

As funções mais relevantes são:

  1. str(): Mostra várias informações sobre a estrutura do dado

  2. summary(): Estatísticas descritivas simples sobre cada coluna do dado

  3. colnames(): Mostra o nome das variáveis do dado

  4. head(): Mostra o conteúdo das seis (ou mais, você escolhe) primeiras linhas do dado

  5. tail(): Mostra o conteúdo das seis últimas linhas do dado

  6. View(): Mostra o dado em formato de planilha (não recomendável para bases muito grandes e para PC’s com menor capacidade de processamento)

# Nome das variáveis (colunas)
colnames(percepcao_alunos_cacs)
##  [1] "DATA_HORA"          "EMAIL"              "IDADE"             
##  [4] "GENERO"             "RACA_COR"           "ESCOLARIDADE"      
##  [7] "MATRICULADO_UFMG"   "BOLSA_CACSLING"     "ACESSO_INTERNET"   
## [10] "POSSUI_COMPUTADOR"  "TEMPO_ATIVIDADES"   "TENTOU_1SEM"       
## [13] "TENTOU_2SEM"        "MOTIVO_CACS"        "EXPERIENCIA_CACS"  
## [16] "APRENDIZADO_CACS"   "PESSOAS_TURMA"      "DURACAO_AULAS"     
## [19] "PERIODO_AULAS"      "MATERIAL_DID"       "FORMATO_AULA"      
## [22] "CONTINUA_MATRIC"    "SAUDE_MENTAL"       "SM_AFETA"          
## [25] "IMPACTO_PRECO"      "IMPACTO_MET_ENSINO" "IMPACTO_INTERNET"  
## [28] "IMPACTO_ACESSO"     "IMPACTO_AMBIENTE"   "IMPACTO_TEMPO"     
## [31] "IMPACTO_NAO_EAD"    "MODIFICADOS"        "SAUDE_MENTAL2"     
## [34] "SM_AFETA2"          "OUTROS_ASPECTOS"
# Características gerais do banco de dados (STR = Structure)
# str(percepcao_alunos_cacs) 


# (ALTERAÇÃO ESTRUTURAL) Conversão de todas variáveis categóricas em fatores
percepcao_alunos_cacs <- percepcao_alunos_cacs %>% 
  dplyr::mutate_if(is.character, as.factor)


# Estatísticas descritivas para variáveis numéricas e contagem de fatores
#summary(percepcao_alunos_cacs)



# 10 primeiros casos do dado
head(percepcao_alunos_cacs, 10) # 10 sendo um argumento opcional 
# 10 últimos casos do dado
tail(percepcao_alunos_cacs, 10) # 20 sendo um argumento opcional
# Visualizar o dataframe em formato de planilha
View(percepcao_alunos_cacs)

Análise exploratória

Tabelas de frequência de uma e duas variáveis

# Tabela de frequência para uma variável
table(percepcao_alunos_cacs$GENERO)
## 
##  Homem Mulher  Outro 
##    156    267      1
# Tabela de frequência cruzada (duas variáveis)
table(percepcao_alunos_cacs$GENERO, percepcao_alunos_cacs$RACA_COR)
##         
##          Amarelo (Ascêndencia asiática) Branco Pardo Preto
##   Homem                               0     79    57    19
##   Mulher                              1    106   118    41
##   Outro                               0      1     0     0
# Tabela de proporção para uma variável
prop.table(table(percepcao_alunos_cacs$GENERO))
## 
##       Homem      Mulher       Outro 
## 0.367924528 0.629716981 0.002358491
# Tabela de proporção cruzada
racacor_genero <- prop.table(table(percepcao_alunos_cacs$GENERO, 
                  percepcao_alunos_cacs$RACA_COR))

colSums(racacor_genero)
## Amarelo (Ascêndencia asiática)                         Branco 
##                    0.002369668                    0.440758294 
##                          Pardo                          Preto 
##                    0.414691943                    0.142180095
rowSums(racacor_genero)
##       Homem      Mulher       Outro 
## 0.367298578 0.630331754 0.002369668
# Tabelas de frequência para variáveis selecionadas utilizando o purrr e o dplyr
percepcao_alunos_cacs %>% 
  dplyr:: select(RACA_COR,
                 ESCOLARIDADE,
                 GENERO,
                 MATRICULADO_UFMG,
                 ACESSO_INTERNET) %>% 
  purrr:: map(table) %>% 
  purrr:: map(as.data.frame)
## $RACA_COR
##                             Var1 Freq
## 1 Amarelo (Ascêndencia asiática)    1
## 2                         Branco  186
## 3                          Pardo  177
## 4                          Preto   60
## 
## $ESCOLARIDADE
##                          Var1 Freq
## 1 Ensino fundamental completo    2
## 2       Ensino médio completo   22
## 3     Ensino médio incompleto    8
## 4    Ensino superior completo  260
## 5    Ensino superior em curso  110
## 6  Ensino superior incompleto   24
## 
## $GENERO
##     Var1 Freq
## 1  Homem  156
## 2 Mulher  267
## 3  Outro    1
## 
## $MATRICULADO_UFMG
##   Var1 Freq
## 1  Não  266
## 2  Sim  160
## 
## $ACESSO_INTERNET
##                                              Var1 Freq
## 1                                      Não possuo    6
## 2                Possuo, através de conexão wi-fi  318
## 3 Possuo, através de plano de internet contratado  102
# Tabelas de proporção para variáveis selecionadas utilizando o purrr e o dplyr
percepcao_alunos_cacs %>% 
  dplyr ::select(RACA_COR,
                 ESCOLARIDADE,
                 GENERO,
                 MATRICULADO_UFMG,
                 ACESSO_INTERNET) %>% 
  purrr:: map(table) %>% 
  purrr:: map(prop.table) %>% 
  purrr:: map(as.data.frame)
## $RACA_COR
##                             Var1        Freq
## 1 Amarelo (Ascêndencia asiática) 0.002358491
## 2                         Branco 0.438679245
## 3                          Pardo 0.417452830
## 4                          Preto 0.141509434
## 
## $ESCOLARIDADE
##                          Var1        Freq
## 1 Ensino fundamental completo 0.004694836
## 2       Ensino médio completo 0.051643192
## 3     Ensino médio incompleto 0.018779343
## 4    Ensino superior completo 0.610328638
## 5    Ensino superior em curso 0.258215962
## 6  Ensino superior incompleto 0.056338028
## 
## $GENERO
##     Var1        Freq
## 1  Homem 0.367924528
## 2 Mulher 0.629716981
## 3  Outro 0.002358491
## 
## $MATRICULADO_UFMG
##   Var1      Freq
## 1  Não 0.6244131
## 2  Sim 0.3755869
## 
## $ACESSO_INTERNET
##                                              Var1       Freq
## 1                                      Não possuo 0.01408451
## 2                Possuo, através de conexão wi-fi 0.74647887
## 3 Possuo, através de plano de internet contratado 0.23943662

Dplyr e operadores lógicos para construção de tabelas

O dplyr é um dos pacotes mais utilizados do tidyverse pois condensa várias funções que precisam ser utilizadas constantemente no processo de análise de dados. Os operadores lógicos da figura abaixo são do R base e conversam muito bem com o dplyr.

  • filter() : Filtra as observações por uma ou várias condições .

  • arrange() : Reordena as linhas com base numa coluna de referência.

  • select() : Seleciona as colunas desejadas.

  • mutate() : Cria novas variáveis que são funções de variáveis pré-existentes .

  • summarise() : Collapse many values down to a single summary .

### Exemplo 1: Mulheres com 20 anos ou mais / select(), filter() + arrange()

# Crie um novo objeto chamado mulheres_20_mais  
# Utilizando como referência o banco de dados percepcao_alunos_cacs, então
# Selecione apenas as colunas GENERO, IDADE e RACA_COR e MATRICULADO_UFMG, então 
# Filtre os casos em que hajam apenas mulheres de 20 ou mais anos de idade então
# Reordene o novo objeto pela idade das mulheres em ordem decrescente

mulheres_20_mais <- percepcao_alunos_cacs %>% 
  dplyr:: select(GENERO, IDADE, RACA_COR, MATRICULADO_UFMG) %>% 
  dplyr:: filter(GENERO == 'Mulher'& IDADE >= 20) %>% 
  dplyr:: arrange(desc(IDADE))

View(mulheres_20_mais)
str(mulheres_20_mais)
## tibble [249 x 4] (S3: tbl_df/tbl/data.frame)
##  $ GENERO          : Factor w/ 3 levels "Homem","Mulher",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ IDADE           : num [1:249] 73 72 65 64 62 59 57 56 56 56 ...
##  $ RACA_COR        : Factor w/ 4 levels "Amarelo (Ascêndencia asiática)",..: 2 3 2 3 2 2 2 3 2 3 ...
##  $ MATRICULADO_UFMG: Factor w/ 2 levels "Não","Sim": 1 1 1 1 1 1 1 1 1 1 ...
### Exemplo 2 - Mulheres 20+ por faixa etária / mutate() + case_when()

# Atualize o objeto mulheres_20_mais 
# Utilizando como referência o banco de dados mulheres_20_mais, então
# Crie uma variável FAIXA_ET, com as faixas etárias: 18 a 40, 41 a 64 e 65 +

mulheres_20_mais <- mulheres_20_mais %>% 
  dplyr:: mutate(FAIXA_ET = case_when(IDADE >= 20 & IDADE <= 40 ~ '20 a 40 anos',
                                      IDADE >= 41 & IDADE <= 64 ~ '41 a 64 anos',
                                      IDADE >= 65 ~ '65 + anos'))

## Deu certo? 
#View(mulheres_20_mais)
#table(mulheres_20_mais$FAIXA_ET)
#names(mulheres_20_mais)
#summary(mulheres_20_mais)
#mulheres_20_mais


### Exemplo 3 - Contagem agrupada de mulheres (20+) matriculadas ou não na UFMG, por faixa etária. summarise + group_by() + spread()

# Crie um novo objeto chamado mulheres20mais_cor_faixaet 
# Utilizando como referência o objeto mulheres_20_mais, então
# Agrupe o resultado pelos valores das variáveis RACA_COR e MATRICULADO_UFMG, então
# Faça a contagem agrupada dessas categorias numa nova coluna chamada 'contagem'

mulheres20mais_cor_faixaet <- mulheres_20_mais %>% 
  dplyr:: filter(!is.na(RACA_COR)) %>%
  dplyr:: group_by(RACA_COR, MATRICULADO_UFMG) %>%
  dplyr:: summarise(contagem = n()) %>% 
  tidyr:: spread(MATRICULADO_UFMG, contagem)
## `summarise()` regrouping output by 'RACA_COR' (override with `.groups` argument)
mulheres20mais_cor_faixaet

Tabelas apresentáveis para o seu relatório!

As tabelas que vimos até aqui não foram exatamente bonitas, e podemos fazer algumas coisas em relação a isso:

Diversos dos pacotes do tidyverse são utilizados no processo de construção de tabelas. Em geral, a maior parte do trabalho de manipulação de dados é feito pelo dplyr, mas o tidyr e o forcats desempenham um grande papel no produto final. As alterações estéticas são feitas pelos pacotes knitr e kableExtra.

É impossível cobrir todas as funcionalidades do kableExtra, as possibilidades de customização são infinitas. No link abaixo tem tudo que importa, caso queira se aprofundar:

Create Awesome HTML Table with knitr::kable and kableExtra (r-project.org)

Avaliação do CACS Línguas por raça/cor dos estudantes - Frequência

## options(knitr.kable.NA = 0)

# Tabela de avaliação do CACS por raça/cor

## Funções auxiliares
# View(percepcao_alunos_cacs)
# names(percepcao_alunos_cacs)
# unique(percepcao_alunos_cacs$EXPERIENCIA_CACS) 
# class(percepcao_alunos_cacs$EXPERIENCIA_CACS)

# Construção da tabela - dplyr, forcats, tidyr

raca_cor_aval_tbl <- percepcao_alunos_cacs %>% 
  dplyr:: filter(!is.na(EXPERIENCIA_CACS)) %>% 
  dplyr:: group_by(RACA_COR, EXPERIENCIA_CACS) %>% 
  dplyr:: summarise(Contagem = n()) %>%
  dplyr:: mutate(EXPERIENCIA_CACS = forcats:: fct_relevel(EXPERIENCIA_CACS,
                                                          c('Excelente', 
                                                            'Bom', 
                                                            'Regular', 
                                                            'Pessimo', 
                                                            'Ruim'))) %>% 
  dplyr:: arrange(EXPERIENCIA_CACS) %>% 
  tidyr:: pivot_wider(names_from = EXPERIENCIA_CACS, values_from = Contagem)
## `summarise()` regrouping output by 'RACA_COR' (override with `.groups` argument)
raca_cor_aval_tbl
percepcao_alunos_cacs
# Estética da tabela - knitr, kable e kableExtra

raca_cor_aval_tbl %>% 
  knitr:: kable(caption = 'Avaliação do curso de línguas por raça/cor',
                col.names = c('Raça/Cor', 
                              'Excelente', 
                              'Bom', 
                              'Regular',
                              'Ruim',
                              'Péssimo')) %>%
  kableExtra:: footnote('Pesquisa CACS Línguas - Meios Jr.',
               general_title = 'Fonte: ',
               footnote_as_chunk = T,
               fixed_small_size  = T) %>% 
  kableExtra:: kable_classic (full_width = F, 
                              html_font = 'Cambria') %>% 
  kableExtra:: kable_styling(bootstrap_options = c("striped",
                                                   "hover",
                                                   'condensed'), font_size = 15)
Avaliação do curso de línguas por raça/cor
Raça/Cor Excelente Bom Regular Ruim Péssimo
Branco 42 39 6 4 NA
Pardo 32 37 9 4 NA
Preto 7 7 8 1 2
Fonte: Pesquisa CACS Línguas - Meios Jr.

Avaliação do CACS Línguas por raça/cor dos respondentes - Proporção

# A única coisa que muda é que, ao invés de manter a contagem, criaremos uma coluna de proporção com o mutate().


raca_cor_aval_prop_tbl <- percepcao_alunos_cacs %>% 
  dplyr:: filter(!is.na(EXPERIENCIA_CACS)) %>% 
  dplyr:: group_by(RACA_COR, EXPERIENCIA_CACS) %>% 
  dplyr:: summarise(contagem = n()) %>%
  dplyr:: mutate(percentual = contagem/sum(contagem))%>% 
  dplyr:: mutate_if(is.numeric, round, 2) %>% 
  dplyr:: select(-contagem) %>% 
  dplyr:: mutate(EXPERIENCIA_CACS = fct_relevel(EXPERIENCIA_CACS, c('Excelente', 
                                                                  'Bom', 
                                                                  'Regular', 
                                                                  'Ruim', 
                                                                  'Péssimo'))) %>%
  dplyr:: arrange(EXPERIENCIA_CACS) %>% 
  tidyr:: spread(EXPERIENCIA_CACS, percentual)
## `summarise()` regrouping output by 'RACA_COR' (override with `.groups` argument)
## `mutate_if()` ignored the following grouping variables:
## Column `RACA_COR`
raca_cor_aval_prop_tbl
# Estética da tabela - knitr, kable e kableExtra

raca_cor_aval_prop_tbl %>% 
  knitr:: kable(caption = 'Avaliação do curso de línguas por raça/cor, percentual',
                col.names = c('Raça/Cor', 
                              'Excelente', 
                              'Bom', 
                              'Regular',
                              'Ruim',
                              'Péssimo')) %>%
 kableExtra:: footnote('Pesquisa CACS Línguas - Meios Jr.',
                       general_title = 'Fonte: ',
                       footnote_as_chunk = T,
                       fixed_small_size  = T) %>% 
 kableExtra:: kable_classic_2(full_width = F, 
                              html_font = 'Cambria') %>% 
 kableExtra:: kable_styling(bootstrap_options = c("striped",
                                                  "hover", 
                                                  "condensed"),
                            font_size = 15)
Avaliação do curso de línguas por raça/cor, percentual
Raça/Cor Excelente Bom Regular Ruim Péssimo
Branco 0.46 0.43 0.07 0.04 NA
Pardo 0.39 0.45 0.11 0.05 NA
Preto 0.28 0.28 0.32 0.04 0.08
Fonte: Pesquisa CACS Línguas - Meios Jr.

Gráficos com o ggplot2

A Gramática dos Gráficos

The grammar of graphics: Wikinson (1999)

  1. Data (Dado)

Não existe gráfico se não há dado, a qualidade do dado e as manipulações feitas previamente são as únicas fontes de informação para os comandos executados no ggplot2.

  1. Mapping (Mapeamento de eixos)

Mapeamento do dado no plano cartesiano. O que estará no eixo X? O que estará no eixo Y? Eu gostaria que minhas observações fossem dividas por alguma outra variável?

  1. Statistics (Estatísticas padrão)

Dentro de cada “geom_” existe uma série de padrões (defaults) que facilitam consideravelmente nossa vida na hora de plotar um gráfico. O gráfico de barras, por exemplo, tem o eixo Y fixado como a soma das linhas para cada categoria de X, ou seja, contagem. Boxplots calculam a mediana, os quartis e definem os outliers automaticamente, etc.

  1. Scales (Escalas)

As escalas são outros tipos de mapeamento que não apenas o eixo X e Y. É possível dividir as observações de um gráfico de pontos por cores ou formatos diferentes dos pontos, por exemplo.

  1. Geometries (Forma geométrica)

Os geoms, ou geometries, são os responsáveis por representar aquilo que foi estabelecido como o mapeamento dos eixos (x, y e scales) numa forma geométrica escolhida.

  • geom_bar() e geom_col() para gráficos de barras

  • geom_histogram() para histogramas

  • geom_boxplot() para boxplots

  • geom_point() para diagramas de dispersão

  • geom_line() para linhas

  1. Facets (Lados/perspectivas/faces)

Os Facets nos possibilitam criar diversos gráficos de uma só vez num mesmo plano cartesiano. Posso querer, por exemplo, saber a variação da renda por idade por escolaridade em dois anos diferentes e quem faz isso por mim é o facet_wrap().

  1. Theme (Temas)

Propriedades estéticas gerais que não são indispensáveis para interpretação.

# Exemplo de facet_wrap

mpg %>% 
  ggplot(mapping = aes(x = cty, y = hwy, colour = manufacturer)) +
  geom_point() +
  facet_wrap(~ class) +
  labs(title = 'Um gráfico com muitas informações que eu não sei o que significam',
       subtitle = 'Pois não sei nada de carro =)',
       caption = 'Fonte: Bases confusas do R',
       y = 'hwy',
       x = 'cty', 
       colour = '') +
  theme_minimal()

Função padrão de gráficos no ggplot2

A estrutura básica de um argumento ggplot é composta de:

  1. Um objeto que contenha os dados que serão plotados; no formato correto

  2. A função ggplot(), seguido do mapeamento dos eixos X e Y do seu gráfico e algum argumento de escala opcional

  3. Um argumento de definição do tipo de gráfico - Forma geométrica (geom_)

  4. É importante lembrar que operador de continuidade do ggplot não é o pipe ‘%>%’ , mas sim um sinal ‘+’.

    (No ggplot nada se transforma, tudo se adiciona, por isso o operador +)

#Gráfico de frequência - Raça/Cor

#percepcao_alunos_cacs %>% 
#  count(RACA_COR) %>% 
#  ggplot(mapping = aes(x = RACA_COR, 
#                       y = n)) +
#  geom_col()

# Problema 1 - Presença de NA's

#percepcao_alunos_cacs %>%
#  filter(!is.na(RACA_COR)) %>% 
#  count(RACA_COR) %>% 
#  ggplot(mapping = aes(x = RACA_COR, 
#                       y = n)) +
#  geom_col()


# Problema 2 - Ordenamento das categorias

#percepcao_alunos_cacs %>% 
# count(RACA_COR) %>% 
# filter(!is.na(RACA_COR)) %>% 
# ggplot(mapping = aes(x = fct_reorder(RACA_COR, - n),
#                     y = n)) +
# geom_col()

# Problema 3 - Posso querer o gráfico em percentual

#percepcao_alunos_cacs %>% 
# count(RACA_COR) %>%
#  mutate(percentual = n/sum(n)) %>% 
#  filter(!is.na(RACA_COR)) %>% 
#  ggplot(mapping = aes(x = fct_reorder(RACA_COR, - percentual),
#                       y = percentual)) +
#  geom_col() +
  
  # Pacote Scales para formato percentual
#  scale_y_continuous(labels = percent_format())

# Problema 4 - Feio

percepcao_alunos_cacs %>% 
  count(RACA_COR) %>%
  mutate(percentual = n/sum(n)) %>% 
  filter(!is.na(RACA_COR)) %>% 
  ggplot(mapping = aes(x = fct_reorder(RACA_COR, - percentual),
                       y = percentual)) +
  geom_col(fill = 'turquoise',
           colour = 'grey2') +
  scale_y_continuous(labels = percent_format()) +
  
  # Adicionando um título, subtítulo, modificando o nome dos eixos
  
  labs(title   = 'Respondentes por Raça/Cor',
       caption = 'Pesquisa de percepção CACS - Meios Jr.',
       x       = '',
       y       = '',
       subtitle = 'Cacs Línguas') +
  
  # Aplicando um tema
  
  theme_minimal()

# Gráfico de barras bivariado

percepcao_alunos_cacs %>% 
  group_by(RACA_COR, GENERO) %>% 
  summarise(contagem = n()) %>% 
  filter(GENERO %in% c('Mulher', 'Homem'),
         !is.na(RACA_COR)) %>% 
  ggplot(mapping = aes(x = fct_reorder(RACA_COR, contagem),
                       y = contagem, 
                       fill = GENERO)) +
  geom_col(position = 'dodge',
           colour = 'gray2') +
  coord_flip() +
  scale_x_discrete(labels = c('Amarelo', 'Preto', 'Pardo', 'Branco')) +
  labs(x = '',
       y = '',
       fill = 'Gênero',
       title = 'Homens e mulheres por raça/cor',
       subtitle = 'Estudantes do Cacs Línguas',
       caption  = 'Fonte: Pesquisa de percepção do Cacs Línguas - Meios Jr') +
  theme_minimal() +
  #scale_fill_brewer(palette = 'Dark2') +
  scale_fill_manual('Gênero', values = c('Homem' = 'yellow2',
                                         'Mulher'= 'violet'))
## `summarise()` regrouping output by 'RACA_COR' (override with `.groups` argument)

Tipos de gráfico e quando utilizá-los

Gráfico de barras

O gráfico de barras é a melhor alternativa quando trabalhamos com uma ou duas variáveis categóricas.

No ggplot, o código para fazer gráficos de barra consiste na função padrão de estabelecer as variáveis dos eixos + geom_bar() ou geom_col()

Histogramas

O histograma é um dos tipos de gráfico mais apropriados para mostrar a distribuição de frequências de uma variável numérica

percepcao_alunos_cacs %>%
  filter(IDADE > 10,
         !is.na(RACA_COR), 
         RACA_COR != 'Amarelo (Ascêndencia asiática)',
         GENERO %in% c('Homem', 'Mulher')) %>% 
  ggplot(mapping = aes(x = IDADE,
                       fill = RACA_COR)) +
  geom_histogram(alpha = 0.7,
                 colour = 'grey43') +
  facet_wrap(~ GENERO) +
  theme_minimal() +
  labs(x = 'Frequência',
       y = 'Idade',
       fill = 'Raça/Cor',
       title = 
'Distribuição da idade de estudantes do CACS Línguas
por Raça/Cor e Gênero') +
  scale_fill_brewer(palette = 'Dark2')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#Gráfico de densidade

percepcao_alunos_cacs %>%
  filter(IDADE > 10,
         !is.na(RACA_COR),
         GENERO %in% c('Homem', 'Mulher')) %>% 
  ggplot(mapping = aes(x = IDADE, 
                       fill = RACA_COR)) +
  geom_density(alpha = 0.5) +
  theme_minimal() +
  facet_wrap(~ GENERO) +
  theme_minimal() +
  labs(x = 'Idade',
       y = 'Densidade',
       fill = 'Raça/Cor',
       title = 
'Distribuição da idade de estudantes do CACS Línguas
por Raça/Cor e Gênero') 
## Warning: Groups with fewer than two data points have been dropped.
## Warning in max(ids, na.rm = TRUE): nenhum argumento não faltante para max;
## retornando -Inf

Boxplot

O boxplot é um dos tipos de gráfico mais interessantes para mostrar o comportamento de uma variável numérica, dado os níveis de uma variável categórica.

A linha no centro do boxplot corresponde à mediana da distribuição. A caixa acima da linha (ou à direita, em caso de boxplots invertidos), representa o percentil 75, enquanto a caixa abaixo da linha representa o percentil 25. As barras das pontas representam os valores mínimos e máximos não considerados outliers. Os pontos externos são os outliers, ou valores extremos da distribuição.

#Boxplot de idade e raça - NA
#str(percepcao_alunos_cacs)
percepcao_alunos_cacs %>% 
  filter(!is.na(RACA_COR), 
         GENERO %in% c('Mulher', 'Homem'),
         RACA_COR %in% c('Branco', 'Preto','Pardo')) %>% 
  ggplot(mapping = aes(x = RACA_COR,
                       y = IDADE,
                       fill = GENERO)) +
  geom_boxplot() +
  theme_minimal() +
    scale_fill_brewer(palette = 'Dark2') +
  labs(x = 'Idade',
       y = '',
       fill = '',
       title = 'Idade por raça/cor e gênero',
       subtitle = 'Estudantes Cacs Línguas',
       caption = 'Pesquisa de percepção Cacs Línguas - Meios Jr.') +
  ylim(20,70) 
## Warning: Removed 32 rows containing non-finite values (stat_boxplot).

Diagrama de dispersão

O diagrama de dispersão (ou scatter plot) é o tipo de gráfico ideal para visualizar a distribuição de duas variáveis numéricas. Trata-se do formato gráfico mais importante para criação de modelos estatísticos preditivos, pois é possível verificar se há ou não linearidade nas relações entre as duas variáveis.

Infelizmente o banco de dados dessa pesquisa não nos oferece duas variáveis numéricas de boa qualidade (diversas em seu padrão de resposta), por isso utilizei a base mpg e USArrests.

data('USArrests')


# Transformar os nomes das linhas uma nova coluna
USArrests_state <- USArrests %>% 
  tibble::rownames_to_column() %>% 
  rename('state_US' = 'rowname')

USArrests_state
# O número de assassinatos e ocorrências violentas estão associados?

USArrests_state %>% 
  ggplot(mapping = aes(x = Murder, y = Assault)) +
  geom_point() #+

  #geom_smooth(method = lm, se = F, colour = 'red') #+
  #geom_text(aes(label = state_US), check_overlap = T)

# Modelo linear preditivo

murderassault_model <- lm(Murder ~ Assault, data = USArrests)

summary(murderassault_model)
## 
## Call:
## lm(formula = Murder ~ Assault, data = USArrests)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8528 -1.7456 -0.3979  1.3044  7.9256 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 0.631683   0.854776   0.739    0.464    
## Assault     0.041909   0.004507   9.298  2.6e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.629 on 48 degrees of freedom
## Multiple R-squared:  0.643,  Adjusted R-squared:  0.6356 
## F-statistic: 86.45 on 1 and 48 DF,  p-value: 2.596e-12
## Colorindo pontos de acordo com uma variável categórica

mpg %>% 
  ggplot(mapping =  aes(x = displ,y = hwy, fill = class, colour = class)) +
  geom_point() +
  theme_minimal() #+

  #geom_smooth(se = F)

Nuvem de palavras com o pacote wordcloud

#install.packages("wordcloud")
library(wordcloud)
## Loading required package: RColorBrewer
#install.packages("RColorBrewer")
library(RColorBrewer)

#install.packages("wordcloud2)
library(wordcloud2)

#install.packages("tm")
library(tm)
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## The following object is masked from 'package:ggplot2':
## 
##     annotate
# Função de remoção de acentos 

rm_accent <- function(str,pattern="all") {
  if(!is.character(str))
    str <- as.character(str)
  pattern <- unique(pattern)
  if(any(pattern=="Ç"))
    pattern[pattern=="Ç"] <- "ç"
  symbols <- c(
    acute = "áéíóúÁÉÍÓÚýÝ",
    grave = "àèìòùÀÈÌÒÙ",
    circunflex = "âêîôûÂÊÎÔÛ",
    tilde = "ãõÃÕñÑ",
    umlaut = "äëïöüÄËÏÖÜÿ",
    cedil = "çÇ"
  )
  nudeSymbols <- c(
    acute = "aeiouAEIOUyY",
    grave = "aeiouAEIOU",
    circunflex = "aeiouAEIOU",
    tilde = "aoAOnN",
    umlaut = "aeiouAEIOUy",
    cedil = "cC"
  )
  accentTypes <- c("´","`","^","~","¨","ç")
  if(any(c("all","al","a","todos","t","to","tod","todo")%in%pattern)) # opcao retirar todos
    return(chartr(paste(symbols, collapse=""), paste(nudeSymbols, collapse=""), str))
  for(i in which(accentTypes%in%pattern))
    str <- chartr(symbols[i],nudeSymbols[i], str)
  return(str)
}


#Aplicando a função a coluna outros aspectos e salvando num objeto

percepcao_alunos_cacs_acentos <- rm_accent(percepcao_alunos_cacs$OUTROS_ASPECTOS)

#Substituindo a coluna 35 pela nova coluna, sem os acentos

percepcao_alunos_cacs[35] <- percepcao_alunos_cacs_acentos


# Ok, pausa pra respirar


#Criação de um vetor selecionando apenas a variável outros aspectos

txt <- percepcao_alunos_cacs$OUTROS_ASPECTOS

# Corpus 

docs <- Corpus(VectorSource(txt))

# Limpeza
docs <- docs %>%
  tm_map(removeNumbers) %>% # Remoção de números
  tm_map(removePunctuation) %>% # Remoção de pontuação
  tm_map(stripWhitespace) # Retirando espaços em branco
docs <- tm_map(docs, content_transformer(tolower)) # Removendo letras maiusculas
docs <- tm_map(docs, removeWords, stopwords("portuguese")) #Removendo conectivos



# Colocando no formato de dataframe com palavra x freq
dtm <- TermDocumentMatrix(docs) 
matrix <- as.matrix(dtm) 
words <- sort(rowSums(matrix),decreasing=TRUE) 
df <- data.frame(word = names(words),freq=words)


#Resolvendo o problema do presenciais e excluindo o não
df$word[df$word == "presenciais" ] <- "presencial"

df <- df %>% 
  group_by(word) %>% 
  summarise(freq = sum(freq)) %>% 
  filter(word != 'nao') # %>% 
## `summarise()` ungrouping output (override with `.groups` argument)
  #filter(word %in% c('nao', 'aulas') == FALSE)


#Gerando o wordcloud
wordcloud(words = df$word, freq = df$freq, min.freq = 1, max.words = 200, random.order=FALSE, rot.per=0.35, colors=brewer.pal(8, "Dark2"))