1 Conhecendo os Dados

1.1 DataSet do Projeto

Pesquisa Nacional por Amostra de Domicílios - 2015

A Pesquisa Nacional por <color=red>Amostra de Domicílios<> - PNAD investiga anualmente, de forma permanente, características gerais da população, de educação, trabalho, rendimento e habitação e outras, com periodicidade variável, de acordo com as necessidades de informação para o país, como as características sobre migração, fecundidade, nupcialidade, saúde, segurança alimentar, entre outros temas. O levantamento dessas estatísticas constitui, ao longo dos 49 anos de realização da pesquisa, um importante instrumento para formulação, validação e avaliação de políticas orientadas para o desenvolvimento socioeconômico e a melhoria das condições de vida no Brasil.

Verificando versão do R

sessionInfo()
## R version 4.3.1 (2023-06-16)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.6 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3 
## LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3;  LAPACK version 3.9.0
## 
## locale:
##  [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
##  [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
##  [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
## [10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   
## 
## time zone: UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] digest_0.6.33     R6_2.5.1          fastmap_1.1.1     xfun_0.39        
##  [5] cachem_1.0.8      knitr_1.43        htmltools_0.5.5   rmarkdown_2.23   
##  [9] cli_3.6.1         sass_0.4.7        jquerylib_0.1.4   compiler_4.3.1   
## [13] rstudioapi_0.15.0 tools_4.3.1       evaluate_0.21     bslib_0.5.0      
## [17] yaml_2.3.7        rlang_1.1.1       jsonlite_1.8.7

Importando as Bibliotecas

A bilioteca dplyr

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Importando o dataset do projeto

dados = read.csv("dados.csv")
head(dados,)
##   UF Sexo Idade Cor Anos.de.Estudo Renda        Altura
## 1 11    0    23   8             12   800 1.603.807.616
## 2 11    1    23   2             12  1150 1.739.789.827
## 3 11    1    35   8             15   880 1.760.443.822
## 4 11    0    46   2              6  3500 1.783.157.945
## 5 11    1    47   8              9   150 1.690.630.954
## 6 11    1    34   8             12   790 1.637.905.598

Aqui o interresante é que o R consome todo esses milhares de dados que se fossem para ser manipulados por humanos demoraria muito tempo, simplificando assim todo o processo de análise dos dados

1.2 Tipos de dados

Variáveis qualitativas ordinais

  • Variáveis que podem ser ordenadas ou hierarquizadas
head(dados)
##   UF Sexo Idade Cor Anos.de.Estudo Renda        Altura
## 1 11    0    23   8             12   800 1.603.807.616
## 2 11    1    23   2             12  1150 1.739.789.827
## 3 11    1    35   8             15   880 1.760.443.822
## 4 11    0    46   2              6  3500 1.783.157.945
## 5 11    1    47   8              9   150 1.690.630.954
## 6 11    1    34   8             12   790 1.637.905.598

Selecionando apenas o atributo Anos de Estudo:

#select(dados, Anos.de.Estudo)

Como a tabela ficou muito grande, vamos pegar apenas os valores únicos desse atributo:

unique(select(dados, Anos.de.Estudo ))
##     Anos.de.Estudo
## 1               12
## 3               15
## 4                6
## 5                9
## 9               14
## 16              16
## 17              10
## 21               1
## 23               5
## 37               7
## 38               3
## 44               2
## 50               4
## 51               8
## 63              11
## 75              17
## 161             13

Para melhorar nossa visualização, iremos agora ordenar esta apresentação de dados, usando o atributo Anos de Estudo como fator a ser ordenado.

arrange(unique(select(dados, Anos.de.Estudo )), Anos.de.Estudo)
##    Anos.de.Estudo
## 1               1
## 2               2
## 3               3
## 4               4
## 5               5
## 6               6
## 7               7
## 8               8
## 9               9
## 10             10
## 11             11
## 12             12
## 13             13
## 14             14
## 15             15
## 16             16
## 17             17

Agora vamos criar um vetor com as informações dos Anos de Estudo, para possíveis utilizações.

anosDeEstudo = c(arrange(unique(select(dados, Anos.de.Estudo )), Anos.de.Estudo))
anosDeEstudo
## $Anos.de.Estudo
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17

Variáveis qualitativas nominais

*Variáveis que não podem ser ordenadas ou hierarquizadas Unidades da federação:

Estados <- c(unique(select(dados, UF)))
Estados
## $UF
##  [1] 11 12 13 14 15 16 17 21 22 23 24 25 26 27 28 29 31 32 33 35 41 42 43 50 51
## [26] 52 53

Sexo dos participantes:

Sexo <- c(arrange(unique(select(dados,Sexo))))
Sexo
## $Sexo
## [1] 0 1

Cor de Pele dos participantes:

Cor_pele <- c(arrange(unique(select(dados, Cor)),Cor))
Cor_pele
## $Cor
## [1] 0 2 4 6 8

Variáveis quantitativas discretas

  • Variáveis que representam uma contagem onde os valores possíveis formam um conjunto finito ou enumerável. Idade dos participantes:
sprintf("A menor nidade é %s é a %s", min(dados$Idade), max(dados$Idade))
## [1] "A menor nidade é 13 é a 99"

Vamos ver outra alternativa, o pacote glue()

library(glue)
glue(" A menor idade é {min(dados$Idade)} e a maior {max(dados$Idade)}")
##  A menor idade é 13 e a maior 99

Observação

A variável idade pode ser classificada de três formas distintas:

  • 1.QUANTITATIVA DISCRETA - quando representa anos completos (números inteiros);

  • 2.QUANTITATIVA CONTÍNUA - quando representa a idade exata, sendo representado por frações de anos;

  • 3.QUALITATIVA ORDINAL - quando representa faixas de idade.

Variáveis quantitativas contínuas

  • Variáveis que representam uma contagem ou mensuração que assumem valores em uma escala contínua (números reais).

Altura dos participantes

Ao analizar os valores correspondentes a Altura notamos que esses valores estão em formatos estranhos. Podemos perceber que estão em formato string e que possuem vários pontos separadores. Precisamos tratar estes dados:

head(dados)
##   UF Sexo Idade Cor Anos.de.Estudo Renda        Altura
## 1 11    0    23   8             12   800 1.603.807.616
## 2 11    1    23   2             12  1150 1.739.789.827
## 3 11    1    35   8             15   880 1.760.443.822
## 4 11    0    46   2              6  3500 1.783.157.945
## 5 11    1    47   8              9   150 1.690.630.954
## 6 11    1    34   8             12   790 1.637.905.598
glue("A menor altura é {min(dados$Altura)} e a menor altura é {max(dados$Altura)}")
## A menor altura é 1.339.244.614 e a menor altura é 20.041.846

Primeiro vamos transformar estes valores em inteiros e elimar os pontos entre os algarímos:

library(dplyr)
head(dados)
##   UF Sexo Idade Cor Anos.de.Estudo Renda        Altura
## 1 11    0    23   8             12   800 1.603.807.616
## 2 11    1    23   2             12  1150 1.739.789.827
## 3 11    1    35   8             15   880 1.760.443.822
## 4 11    0    46   2              6  3500 1.783.157.945
## 5 11    1    47   8              9   150 1.690.630.954
## 6 11    1    34   8             12   790 1.637.905.598
dados <- dados %>%
  mutate(Altura = as.integer(gsub("\\.", "", Altura)))
head(dados)
##   UF Sexo Idade Cor Anos.de.Estudo Renda     Altura
## 1 11    0    23   8             12   800 1603807616
## 2 11    1    23   2             12  1150 1739789827
## 3 11    1    35   8             15   880 1760443822
## 4 11    0    46   2              6  3500 1783157945
## 5 11    1    47   8              9   150 1690630954
## 6 11    1    34   8             12   790 1637905598

Neste exemplo, usamos a função gsub() para remover os pontos da coluna “Altura”, substituindo-os por uma string vazia (““), tornando a string um valor numérico válido sem os separadores de milhar. Em seguida, usamos a função as.integer() para converter a string resultante em um número inteiro. O resultado da conversão é armazenado na própria coluna Altura do DataFrame.

head(dados$Altura, 100)
##   [1] 1603807616 1739789827 1760443822 1783157945 1690630954 1637905598
##   [7] 1570078218 1608495442 1780328883 1793202625 1787003282 1712911548
##  [13] 1736442076 1750826666 1780450392 1711825037 1789011804 1673665133
##  [19] 1715137632  176597309 1746351196 1660873129 1746048026 1726496158
##  [25] 1778913561 1668637941 1783770601 1873445247 1890250314 1660204145
##  [31] 1636361741 1685590822  168402625  167104419 1632129706 1712121503
##  [37] 1763447989 1694500204 1705147683 1672258066 1645452653 1814785789
##  [43] 1652746296 1757341995 1611286043 1693976403 1684819452 1701974845
##  [49] 1599083153 1646862718 1752071058 1576576371 1697451547 1573698003
##  [55] 1727453392 1663525091 1450378572  175151196 1599067442  162281412
##  [61] 1523482727 1677850056  177007179 1799870428 1704955017 1674563104
##  [67] 1810539927 1741427298 1799846494 1492688377  166788028 1827358586
##  [73] 1774589199 1709833981   17085447 1827305281  170508676 1785680605
##  [79] 1645685159 1754153474 1772827632 1718663746   17149494 1650202938
##  [85] 1727064502 1765924712 1742593838  176866907 1764367928 1713904438
##  [91] 1745392257  159311812 1591341012 1864178568 1790890146  167198338
##  [97] 1717498162 1632010545 1701369066 1542187487

Podemos perceber que teremos valores com número de algarismos diferentes, logo precisamos padronizar estes dados. Precisamos construir uma função que irá deixar todos os números com a mesma quantidade de dígitos. Isso será feito acrescentando-se zeros a direita dos números.

# Função para ajustar números de uma coluna para um múltiplo de dez
ajustar_multiplo_dez <- function(coluna) {
  # Encontrar o número máximo de dígitos
  max_dig <- max(nchar(coluna))
  
  # Função para encontrar o múltiplo de dez apropriado
  encontrar_multiplo_dez <- function(n) {
    multiplo <- 10^floor(log10(n))
    if (multiplo == 1) {
      return(1)
    } else {
      return(multiplo)
    }
  }
  
  # Aplicar a função de ajuste para cada elemento da coluna
  coluna_ajustada <- sapply(coluna, function(x) {
    digito_divisor <- encontrar_multiplo_dez(x)
    ajustado <- x / digito_divisor
    return(ajustado)
  })
  
  return(coluna_ajustada)
}

Nesta função, ajustar_multiplo_dez() recebe uma coluna de um data frame como entrada. Primeiro, ela encontra o número máximo de dígitos na coluna. Em seguida, define uma função interna encontrar_multiplo_dez que calcula o múltiplo de dez apropriado para um dado número, considerando a quantidade de dígitos do número original. A função principal aplica o ajuste a cada elemento da coluna, dividindo-o pelo múltiplo de dez encontrado. O resultado é armazenado em uma nova coluna chamada “coluna_ajustada”.

  • A expressão multiplo <- 10^floor(log10(n)) é usada para calcular um múltiplo de dez que seja igual ou imediatamente inferior ao número n. Vamos desmembrar essa expressão em partes menores:

  • log10(n): O logaritmo de base 10 de n. Isso calcula o expoente ao qual 10 deve ser elevado para obter o valor de n. Por exemplo, log10(100) é igual a 2, porque 10^2 é igual a 100.

  • floor(log10(n)): O resultado do passo anterior é arredondado para o número inteiro imediatamente inferior. Isso é importante porque queremos encontrar o expoente para obter o múltiplo de dez menor ou igual a n. Por exemplo, floor(2.6) é igual a 2.

  • 10^floor(log10(n)): Isso eleva 10 à potência calculada no passo anterior. O resultado é um número que é uma potência de 10, sendo igual ou imediatamente inferior a n. Por exemplo, se n fosse 1234, esse resultado seria 1000, que é o múltiplo de dez mais próximo e menor ou igual a 1234.

O objetivo dessa expressão é encontrar um número que seja uma potência de dez, ajustado ao valor de n, de modo que possamos dividir n por esse número para realizar o ajuste necessário. Isso é útil para garantir que o resultado final tenha zeros à direita, conforme o objetivo mencionado anteriormente. O valor calculado em multiplo é usado posteriormente no código para fazer essa divisão.

Esta função utiliza a função sapply() para aplicar uma operação a cada elemento da coluna coluna de um data frame, com o objetivo de ajustar cada número dessa coluna para um múltiplo de dez com a mesma quantidade de zeros que o número original. Aqui está uma explicação passo a passo:

  • sapply(coluna, function(x) {…}: A função sapply() é usada para aplicar uma função (definida pelo usuário) a cada elemento de um vetor ou coluna. Nesse caso, estamos aplicando uma função anônima definida pela expressão entre {…} a cada elemento da coluna coluna.

  • function(x) {…}: Esta é uma função anônima definida para receber um argumento x, que representa cada elemento da coluna coluna. O objetivo é ajustar o valor de x para um múltiplo de dez com a mesma quantidade de zeros que o número original.

  • digito_divisor <- encontrar_multiplo_dez(x): Isso calcula o múltiplo de dez apropriado usando a função interna encontrar_multiplo_dez(), que foi definida anteriormente no código. Essa função calcula um múltiplo de dez com base na quantidade de dígitos do número original x.

  • ajustado <- x / digito_divisor: Isso realiza a divisão do número original x pelo múltiplo de dez calculado em digito_divisor. O resultado é o número original x ajustado para um múltiplo de dez com a mesma quantidade de zeros que o número original.

  • return(ajustado): Isso retorna o valor ajustado de x após a divisão. Esse valor é armazenado em uma nova coluna chamada coluna_ajustada, que é criada no data frame onde estamos aplicando essa operação.

Essa função percorre cada elemento da coluna coluna do Dataframe, ajusta o número para um múltiplo de dez com a mesma quantidade de zeros que o número original e, em seguida, armazena os números ajustados na nova coluna Altura_ajustada. Isso nos permite padronizar os números na coluna para terem a mesma quantidade de dígitos e zeros à direita.

Agora vamos transormar todo o valor em um número que representa a altura, ou seja, começando com um número diferente de zero, seguido do (.) ponto que será os metros dos decimais de metros.

# Aplicar a função à coluna "Altura" criando a coluna "Altura_ajustada"
dados$Altura_ajustada <- ajustar_multiplo_dez(dados$Altura)

# Mostrar o DataFrame após o ajuste
head(dados)
##   UF Sexo Idade Cor Anos.de.Estudo Renda     Altura Altura_ajustada
## 1 11    0    23   8             12   800 1603807616        1.603808
## 2 11    1    23   2             12  1150 1739789827        1.739790
## 3 11    1    35   8             15   880 1760443822        1.760444
## 4 11    0    46   2              6  3500 1783157945        1.783158
## 5 11    1    47   8              9   150 1690630954        1.690631
## 6 11    1    34   8             12   790 1637905598        1.637906

Neste código, após aplicar a função ajustar_multiplo_dez à coluna original “Altura” para criar a coluna “Altura_ajustada”. Abaixo iremos utilizamos a função select() do pacote dplyr para eliminarmos a coluna “Altura” no Dataframe. Na sequência vamos usar a função rename() do pacote dplyr para renomear a coluna. Vou mostrar o código para fazer essa alteração:

dados <- dados %>% 
  select(-Altura) %>% 
  rename(Altura = Altura_ajustada)
head(dados)
##   UF Sexo Idade Cor Anos.de.Estudo Renda   Altura
## 1 11    0    23   8             12   800 1.603808
## 2 11    1    23   2             12  1150 1.739790
## 3 11    1    35   8             15   880 1.760444
## 4 11    0    46   2              6  3500 1.783158
## 5 11    1    47   8              9   150 1.690631
## 6 11    1    34   8             12   790 1.637906

Agora poderemos ver a altura mínima e máxima de nosso dataframe.

glue("De {min(dados$Altura)} até {max(dados$Altura)} metros")
## De 1.339244614 até 2.028496765 metros

Classificação de uma variável

Neste capitulo aprendemos que quando tratamos de dados existem tipos diferentes, que estão separado em variaveis qualitativas e quantitativas. As qualitativas se tratam de caracteristica que representam categorias e qualidades e são separadas em ordinais e nominais, sendo as nominais as que não podem ser ordenadas por não se tratarem de uma sequência, já as nominais as que podem ser ordenadas por apresentarem uma sequência ou uma lógica a ser seguida. As quantitativas podem ser caracterizads por variaveis contáveis qu podem ser expressas por números e podem ser dividias em continuas e discretas, seno as continuas as que podem ser um número ordenado porém infinito, já as discretas podem ser contadas e têm um número especifico.

2 DISTRIBUIÇÃO DE FREQUÊNCIAS

O primeiro passo em um trabalho de análise é o conhecimento do comportamento das variáveis envolvidas no estudo. Utilizando técnicas estatísticas como as análises das DISTRIBUIÇÕES DE FREQUÊNCIAS e HISTOGRAMAS podemos avaliar melhor a forma como os fenômenos em estudo se distribuem.

2.1 Distribuição de frequências para variáveis qualitativas

Método 1

Documentações:

Criando uma tabela com a variável sexo:

table(dados$Sexo)
## 
##     0     1 
## 53250 23590

Apresentando os dados em porcentagem:

prop.table(table(dados$Sexo))*100
## 
##        0        1 
## 69.29984 30.70016

Melhorando a tabela e apresentando os dados em porcentagem:

dist_freq_qualitativas <- cbind(freq = table(dados$Sexo), percent = prop.table(table(dados$Sexo)) * 100)
dist_freq_qualitativas
##    freq  percent
## 0 53250 69.29984
## 1 23590 30.70016

Nomeando as Colunas:

colnames(dist_freq_qualitativas) <- c('Frequência', 'Porcentagem (%)')
dist_freq_qualitativas
##   Frequência Porcentagem (%)
## 0      53250        69.29984
## 1      23590        30.70016

Nomeando as linhas:

rownames(dist_freq_qualitativas) <- c('Masculino', 'Feminino')
dist_freq_qualitativas
##           Frequência Porcentagem (%)
## Masculino      53250        69.29984
## Feminino       23590        30.70016

Método 2

Documentações:

Construindo uma tabela com cruzamento de dois atributos.

frequencia <- table(dados$Sexo, dados$Cor)
frequencia
##    
##         0     2     4     6     8
##   0   256 22194  5502   235 25063
##   1   101  9621  2889   117 10862

Nomeando colunas e linhas para facilitar o entendimento:

rownames(frequencia) <- c('Masculino', 'Feminino')
colnames(frequencia) <- c('Indígena', 'Branca', 'Preta', 'Amarela', 'Parda')
frequencia <- cbind(frequencia)
frequencia
##           Indígena Branca Preta Amarela Parda
## Masculino      256  22194  5502     235 25063
## Feminino       101   9621  2889     117 10862

Apresentando os dados em percentual:

percentual <- prop.table(frequencia) * 100
percentual
##            Indígena   Branca    Preta   Amarela    Parda
## Masculino 0.3331598 28.88339 7.160333 0.3058303 32.61713
## Feminino  0.1314420 12.52082 3.759761 0.1522644 14.13587

Encontrando a Renda Média dos participantes apresentados na tabela acima:

medias <- tapply(dados$Renda, list(dados$Sexo, dados$Cor), mean)
rownames(medias) <- c('Masculino', 'Feminino')
colnames(medias) <- c('Indígena', 'Branca', 'Preta', 'Amarela', 'Parda')
medias
##           Indígena   Branca    Preta  Amarela    Parda
## Masculino 1081.711 2925.744 1603.862 4758.251 1659.577
## Feminino  2464.386 2109.867 1134.596 3027.342 1176.759

Agora temos uma compreenção da média de renda por sexo e cor dos participantes.

Aqui podemos ver que foram selecionados os dados das pessoas do sexo feminino e masculino e suas respectivas cores e separados em colunas, logo após foi feito o calculo de quantas pessoas de cada sexo tinha em cada coluna de cor. Por fim foi feito o calculo da média da frequência de de pessoas(masculino e feminino) nas cores(indigena,Branca,Preta,Amarela e Parda).

2.2 Distribuição de frequências para variáveis quantitativas (classes personalizadas


Documentações:

Passo 1 - Especificar os limites de cada classe

Utilizar a seguinte classificação:

A ► Acima de 20 SM

B ► De 10 a 20 SM

C ► De 4 a 10 SM

D ► De 2 a 4 SM

E ► Até 2 SM

onde SM é o valor do salário mínimo na época. Em nosso caso R$ 788,00 (2015):

A ► Acima de 15.760

B ► De 7.880 a 15.760

C ► De 3.152 a 7.880

D ► De 1.576 a 3.152

E ► Até 1.576

Encontrando a renda mínima:

min(dados$Renda)
## [1] 0

Encontrando a renda máxima:

max(dados$Renda)
## [1] 200000

Criando a variável classes:

classes <- c(0, 1576, 3152, 7880, 15760, 200000)

Crinado a variável labels

labels <- c('E', 'D', 'C', 'B', 'A')

Passo 2 - Criar a tabela de frequências

Iniciando a construção com a ferramenta cut

#cut(
#  x = dados$Renda,
#  breaks = classes,
#  labels = labels,
#  include.lowest = TRUE
#)

Como pode ver, ele classificou cada participante por uma classe de renda, porém isso ficou muito grande. Vamos cria uma tabela para esta informação e condensá-la:

frequencia <- table(
    cut(
        x = dados$Renda,
        breaks = classes,
        labels = labels,
        include.lowest = TRUE
    )
)
frequencia
## 
##     E     D     C     B     A 
## 49755 16700  7599  2178   608

Apresentadndo os dados em percentual

percentual <- prop.table(frequencia)*100
percentual
## 
##          E          D          C          B          A 
## 64.7514315 21.7334721  9.8893805  2.8344612  0.7912546

Nomeando as colunas

dist_freq_quantitativas_personalizadas <- cbind('Frequência' = frequencia,
                                                'Porcentagem (%)' = percentual)
dist_freq_quantitativas_personalizadas
##   Frequência Porcentagem (%)
## E      49755      64.7514315
## D      16700      21.7334721
## C       7599       9.8893805
## B       2178       2.8344612
## A        608       0.7912546

Ordenando os nomes pelo nome daslinhas:

dist_freq_quantitativas_personalizadas[
    order(row.names(dist_freq_quantitativas_personalizadas)), 
]
##   Frequência Porcentagem (%)
## A        608       0.7912546
## B       2178       2.8344612
## C       7599       9.8893805
## D      16700      21.7334721
## E      49755      64.7514315

Agora podemos conferir o percentual de participantes por classificação de classes.

Nesta sequência de funções é criado um limite para as classes de renda onde abriga muitos salários. Depois foi usada a função ‘cut’ para classificar os participantes das classes de renda, então foi construído uma tabela usando a função table e por fim criado uma tabela que mostra a distribuição em cada classe de renda mostradas as frequências absolutas e percentuais.

2.3 Distribuição de frequências para variáveis quantitativas (classes de amplitude fixa)


Regra de Sturges

\[k = 1 + \frac {10}{3}\log_{10}n\] Encontrando o número informações no dataset:

n <- nrow(dados)
n
## [1] 76840

Aplicando a Regra de Sturgs para a quantidade ótima de classes:

k <- 1 + (10 / 3) * log10(n)
k
## [1] 17.28529

Fazendo o arredondamento do valor de k

k <- round(k)
k
## [1] 17

Passo 2 - Criar a tabela de frequências

Utilizando a quantidade de classes, encontramos a amplitude de cada classe e apresentamos os novos labels

labels <- c(
    '      0.00 |—|  11,764.70', 
    ' 11,764.70  —|  23,529.40', 
    ' 23,529.40  —|  35,294.10', 
    ' 35,294.10  —|  47,058.80', 
    ' 47,058.80  —|  58,823.50', 
    ' 58,823.50  —|  70,588.20', 
    ' 70,588.20  —|  82,352.90', 
    ' 82,352.90  —|  94,117.60', 
    ' 94,117.60  —| 105,882.00', 
    '105,882.00  —| 117,647.00', 
    '117,647.00  —| 129,412.00', 
    '129,412.00  —| 141,176.00', 
    '141,176.00  —| 152,941.00', 
    '152,941.00  —| 164,706.00', 
    '164,706.00  —| 176,471.00', 
    '176,471.00  —| 188,235.00', 
    '188,235.00  —| 200,000.00'
)

Agora vamos construir a tabela com esse novo labels:

frequencia <- table(
    cut(
        x = dados$Renda,
        breaks = k,
        labels = labels,
        include.lowest = TRUE
    )
)
frequencia
## 
##       0.00 |—|  11,764.70  11,764.70  —|  23,529.40  23,529.40  —|  35,294.10 
##                     75594                      1022                       169 
##  35,294.10  —|  47,058.80  47,058.80  —|  58,823.50  58,823.50  —|  70,588.20 
##                        19                        16                         5 
##  70,588.20  —|  82,352.90  82,352.90  —|  94,117.60  94,117.60  —| 105,882.00 
##                         4                         1                         6 
## 105,882.00  —| 117,647.00 117,647.00  —| 129,412.00 129,412.00  —| 141,176.00 
##                         0                         1                         0 
## 141,176.00  —| 152,941.00 152,941.00  —| 164,706.00 164,706.00  —| 176,471.00 
##                         0                         0                         0 
## 176,471.00  —| 188,235.00 188,235.00  —| 200,000.00 
##                         0                         3

Transformando estes dados em percentual:

percentual <- prop.table(frequencia) * 100
percentual
## 
##       0.00 |—|  11,764.70  11,764.70  —|  23,529.40  23,529.40  —|  35,294.10 
##              98.378448725               1.330036439               0.219937533 
##  35,294.10  —|  47,058.80  47,058.80  —|  58,823.50  58,823.50  —|  70,588.20 
##               0.024726705               0.020822488               0.006507028 
##  70,588.20  —|  82,352.90  82,352.90  —|  94,117.60  94,117.60  —| 105,882.00 
##               0.005205622               0.001301406               0.007808433 
## 105,882.00  —| 117,647.00 117,647.00  —| 129,412.00 129,412.00  —| 141,176.00 
##               0.000000000               0.001301406               0.000000000 
## 141,176.00  —| 152,941.00 152,941.00  —| 164,706.00 164,706.00  —| 176,471.00 
##               0.000000000               0.000000000               0.000000000 
## 176,471.00  —| 188,235.00 188,235.00  —| 200,000.00 
##               0.000000000               0.003904217

Melhorando a apresentação dos dados:

dist_freq_quantitativas_amplitude_fixa <- cbind('Frequência' = frequencia,
                                                'Porcentagem (%)' = percentual)
dist_freq_quantitativas_amplitude_fixa
##                           Frequência Porcentagem (%)
##       0.00 |—|  11,764.70      75594    98.378448725
##  11,764.70  —|  23,529.40       1022     1.330036439
##  23,529.40  —|  35,294.10        169     0.219937533
##  35,294.10  —|  47,058.80         19     0.024726705
##  47,058.80  —|  58,823.50         16     0.020822488
##  58,823.50  —|  70,588.20          5     0.006507028
##  70,588.20  —|  82,352.90          4     0.005205622
##  82,352.90  —|  94,117.60          1     0.001301406
##  94,117.60  —| 105,882.00          6     0.007808433
## 105,882.00  —| 117,647.00          0     0.000000000
## 117,647.00  —| 129,412.00          1     0.001301406
## 129,412.00  —| 141,176.00          0     0.000000000
## 141,176.00  —| 152,941.00          0     0.000000000
## 152,941.00  —| 164,706.00          0     0.000000000
## 164,706.00  —| 176,471.00          0     0.000000000
## 176,471.00  —| 188,235.00          0     0.000000000
## 188,235.00  —| 200,000.00          3     0.003904217

Aqui foi usado uma técnica chamada Regra de Sturges para determinar o número certo de grupos. Depois, arredondamos esse número para torná-lo mais fácil. Com base nessas faixas, criamos categorias que representam intervalos específicos. Logo após , organizamos as informações em uma tabela, classificando os participantes de acordo com essas categorias. Convertendo os números brutos em percentuais, conseguimos ver de forma mais clara como a variável quantitativa se distribui, o que nos ajuda a compreender melhor os padrões dos dados e como variam.

2.4 Histograma


O HISTOGRAMA é a representação gráfica de uma distribuição de frequências. É um gráfico formado por um conjunto de retângulos colocados lado a lado, onde a área de cada retângulo é proporcional à frequência da classe que ele representa.

Documentações:

Configurando o tamanho do gráfico para não ficar muito grande

options(repr.plot.width = 7, repr.plot.height =4)

Criando um histograma básico no R

hist(dados$Altura)

Formatando o histograma para ficar com mais informações

hist(
    x = dados$Altura,
    breaks = 'Sturges',
    col = 'lightblue',
    main = 'Histograma das Alturas',
    xlab = 'Altura',
    ylab = 'Frequências'
)

Carregando o pacote ggplot2

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

Constuindo o mesmo gráfico com o uso do ggplot2

ggplot(dados, aes(x = Altura)) + 
    geom_histogram(binwidth = 0.02, color = "black", alpha = 0.9) + 
    ylab("Frequência") + 
    xlab("Alturas") + 
    ggtitle('Histograma das Alturas') +
    theme(
        plot.title = element_text(size = 14, hjust = 0.5),
        axis.title.y = element_text(size = 12, vjust = +0.2),
        axis.title.x = element_text(size = 12, vjust = -0.2),
        axis.text.y = element_text(size = 10),
        axis.text.x = element_text(size = 10)
    )

Vamos padronizar os formatos para não percisar digitar ele toda vez que for necessário tuilizar.

formatos <- theme(
        plot.title = element_text(size = 14, hjust = 0.5),
        axis.title.y = element_text(size = 12, vjust = +0.2),
        axis.title.x = element_text(size = 12, vjust = -0.2),
        axis.text.y = element_text(size = 10),
        axis.text.x = element_text(size = 10)
    )

Agora vamos reconstruir o gráfico anterior, utilizando o vetor formatos como padrão. Também iremos ver a densidade dos dados.

ggplot(dados, aes(x = Altura, y = ..density..)) + 
    geom_histogram(binwidth = 0.02, color = "black", alpha = 0.9) + 
    geom_density(color = 'green') +
    ylab("Frequência") + 
    xlab("Alturas") + 
    ggtitle('Histograma das Alturas') +
    formatos
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Constuindo agora o histograma de uma informação qualitativa. Neste caso usaremos a distribuição de frequência já criada.

Primentiramente iremos constuir um dataframe, pois o ggplot tabralha melhor com dados neste formato.

bar_chart <- data.frame(dist_freq_quantitativas_personalizadas)
bar_chart
##   Frequência Porcentagem....
## E      49755      64.7514315
## D      16700      21.7334721
## C       7599       9.8893805
## B       2178       2.8344612
## A        608       0.7912546

Agora com o dataframe criado, iremos construir nosso histograma:

ggplot(bar_chart, aes(x = row.names(bar_chart), y = Frequência)) + 
    geom_bar(stat = "identity") + 
    ylab("Frequência") + 
    xlab("Classes de Renda") + 
    ggtitle('Gráfico Classes de Renda') +
    formatos

Veja que o comportamento deste gráfico é diferente do anterior, e que sua concentração é maior no lado direito apresentando assim uma assimetria nos dados.

Neste capítulo podemos ver o histograma que se destaca por ser uma ferramenta visual essencial para representação de dados, por meio de retângulos que mostram as frequências das categorias. Para a criação desses histogramas foi utilizada a regra de Sturges para definir os intervalos de classes e usado o pacote ggplot2 que permite construir gráficos complexos .

3 MEDIDAS DE TENDÊNCIA CENTRAL

DataFrame de exemplo

Para iniciarmos nosso estudo, iremos adotar um dataframe mais simples para exemplo. Contudo, após a conceituação iremos voltar ao dataframe original.

Variáveis do dataframe:

materias <- c('Matemática', 'Português', 'Inglês', 
              'Geografia', 'História', 'Física', 'Química')
Fulano <- c(8, 10, 4, 8, 6, 10, 8)
Beltrano <- c(10, 2, 0.5, 1, 3, 9.5, 10)
Sicrano <- c(7.5, 8, 7, 8, 8, 8.5, 7)

Construindo o dataframe df:

df <- data.frame(Fulano, Beltrano, Sicrano, row.names = materias)
df
##            Fulano Beltrano Sicrano
## Matemática      8     10.0     7.5
## Português      10      2.0     8.0
## Inglês          4      0.5     7.0
## Geografia       8      1.0     8.0
## História        6      3.0     8.0
## Física         10      9.5     8.5
## Química         8     10.0     7.0

3.1 Média Aritimética

É representada por \(\mu\) quando se refere à população e por \(\overline{x}\) quando se refere à amostra

\[\mu=\frac{1}{n}\sum_{i=1}^{n}X_{i}\]

onde

\(n\) = número de observações (registros)

\(X_{i}=\) valor da i-ésima observação (registro)

Documentações:

Agora vamos entender a média. Trata-se da soma de todos os valores de um vetor dividido pela sua frequência.

(8 + 10 + 4 + 8 + 6 + 10 + 8) / 7
## [1] 7.714286

Contudo, no R podemos utilizar a função reservada mean()

mean(df$Fulano)
## [1] 7.714286

Veja que temos o mesmo valor. Agora vamos encontrar a média da renda de nossos participantes.

mean(dados$Renda)
## [1] 2000.383

Veja que tivemos uma renda média de R$ 2000,38.

Também podemos encontrar a renda média dos participantes agregados pelo sexo:

aggregate(list(Renda = dados$Renda), list(Sexo = dados$Sexo), mean)
##   Sexo    Renda
## 1    0 2192.442
## 2    1 1566.847

Aqui podemos ver como a medida média é utilizada no R, através da função mean() que soma todos os dados e divide pelo número de dados trazendo a média dos dados.

3.2 Mediana

Para obtermos a mediana de uma conjunto de dados devemos proceder da seguinte maneira:

1.Ordenar o conjunto de dados;

2.Identificar o número de observações (registros) do conjunto de dados (\(n\)) ;

3.Identicar o elemento mediano:

Quando \(n\) for ímpar, a posição do elemento mediano será obtida da seguinte forma:

[\(Elemento_{md}=\frac{n+1}{2}\)]

Quando \(n\) for par, a posição do elemento mediano será obtida da seguinte forma:

[\(Elemento_{md}=\frac{n}{2}\)]

  1. Obter a mediana:

Quando \(n\) for ímpar:

\(Md=\)\(X_{{Elemento}_{md}}\)

Quando \(n\) for par:

\(Md=\)\(\frac{X_{{Elemento}_{md}+}X_{{Elemento}_{md}}}{2}\)

Documentações:

Exemplo 1 - \(n\) ímpar

Vamos rever o nosso dataframe alternativo:

df
##            Fulano Beltrano Sicrano
## Matemática      8     10.0     7.5
## Português      10      2.0     8.0
## Inglês          4      0.5     7.0
## Geografia       8      1.0     8.0
## História        6      3.0     8.0
## Física         10      9.5     8.5
## Química         8     10.0     7.0

Agora vamos ordenar as notas do Fulano:

df_fulano <- df[order(df$Fulano),]
df_fulano
##            Fulano Beltrano Sicrano
## Inglês          4      0.5     7.0
## História        6      3.0     8.0
## Matemática      8     10.0     7.5
## Geografia       8      1.0     8.0
## Química         8     10.0     7.0
## Português      10      2.0     8.0
## Física         10      9.5     8.5

Agora vamos contar o número de ocorrências para Fulano:

n = nrow(df_fulano)
n
## [1] 7

Como se trata de uma quantidade impar, iremos encontar o elemento central utilizando a regra apresentada anteriormente:

elemento_md <- (n+1)/2
elemento_md
## [1] 4

Agora iremos obter este o valor deste elemento:

df_fulano[elemento_md,]
##           Fulano Beltrano Sicrano
## Geografia      8        1       8

Logo, temos então que o elemento médiano de fulano é a nota 8.

Agora iremos refazer todo este cálculo utilizando a função reservada do R chamada median()

median(df$Fulano)
## [1] 8

Veja como é bem mais simples e prático, utilizando os recursos prontos do próprio R.

Exemplo 2 -\(n\) par

Obtendo uma amostra aleatória dos dados

Analisando nosso dataframe exemplo novamente:

df
##            Fulano Beltrano Sicrano
## Matemática      8     10.0     7.5
## Português      10      2.0     8.0
## Inglês          4      0.5     7.0
## Geografia       8      1.0     8.0
## História        6      3.0     8.0
## Física         10      9.5     8.5
## Química         8     10.0     7.0

Vamos agora fazer uma amostragem com apenas 6 elementos, para que possamos ter um número par de elementos.

set.seed(101)
sample(nrow(df),6)
## [1] 1 7 6 2 3 5

Vamos refazer agora armazenando este dado em outro dataframe, com uma semente fixa de sorteio para tenhamos o mesmo valor.

set.seed(101)
df_beltrano <- df[sample(nrow(df), 6), ]
df_beltrano
##            Fulano Beltrano Sicrano
## Matemática      8     10.0     7.5
## Química         8     10.0     7.0
## Física         10      9.5     8.5
## Português      10      2.0     8.0
## Inglês          4      0.5     7.0
## História        6      3.0     8.0

Agora iremos contar o número de linhas do nosso novo dataset

n <- nrow(df_beltrano)
n
## [1] 6

Agora vamos ordenar o dataframe:

df_beltrano <- df_beltrano[order(df_beltrano$Beltrano), ]
df_beltrano
##            Fulano Beltrano Sicrano
## Inglês          4      0.5     7.0
## Português      10      2.0     8.0
## História        6      3.0     8.0
## Física         10      9.5     8.5
## Matemática      8     10.0     7.5
## Química         8     10.0     7.0

Agora vamos encontrar o elemento mediano

elemento_md = n / 2
elemento_md
## [1] 3

Neste momento iremos encontrar a media entre os doiselementos medianos.

mean(df_beltrano[c(elemento_md, elemento_md + 1), ]$Beltrano)
## [1] 6.25

Agora vamos utilizar a função própria do R

median(df_beltrano$Beltrano)
## [1] 6.25

Obtendo a mediana em nosso dataset

Vamos encontrar a mediana da renda

median(dados$Renda)
## [1] 1200

As funções neste capitulo calculam a mediana manualmente e através da função median(), onde a mediana é a responsavel por dividir uma distribuição em duas partes iguais quanto ao número de elementos de cada parte

3.3 Moda

Pode-se definir a moda como sendo o valor mais frequente de um conjunto de dados. A moda é bastante utilizada para dados qualitativos.

Documentações:

Vamos começar visualizando no dataframe alternativo:

df
##            Fulano Beltrano Sicrano
## Matemática      8     10.0     7.5
## Português      10      2.0     8.0
## Inglês          4      0.5     7.0
## Geografia       8      1.0     8.0
## História        6      3.0     8.0
## Física         10      9.5     8.5
## Química         8     10.0     7.0

Vamos criar um vetor exemplo:

exemplo_moda <- c(1, 2, 2, 3, 4, 4, 5, 6, 7, 7)
exemplo_moda
##  [1] 1 2 2 3 4 4 5 6 7 7

Agora vamos criar uma tabela de frequência:

freq <- table(exemplo_moda)
freq
## exemplo_moda
## 1 2 3 4 5 6 7 
## 1 2 1 2 1 1 2

Agora vamos encontrar as maiores frequências:

freq[freq == max(freq)]
## exemplo_moda
## 2 4 7 
## 2 2 2

Neste momento, iremos encontrar os nomes das maiores frequências:

names(freq)[freq == max(freq)]
## [1] "2" "4" "7"

Agora iremos criar uma função que automatize toda essa nossa aplicação:

Moda <- function(x) {
    freq <- table(x)
    return(names(freq)[freq == max(freq)])
}
Moda(exemplo_moda)
## [1] "2" "4" "7"

Vamos aplicar agora na nossa dataframe df:

Moda(df$Fulano)
## [1] "8"
Moda(df$Beltrano)
## [1] "10"
Moda(df$Sicrano)
## [1] "8"

Obtendo a moda em nosso dataset

Obtendo a moda em nosso dataset

Moda(dados$Renda)
## [1] "788"

Moda da altura de nossos participantes:

Moda(dados$Altura)
## [1] "1.56812756"  "1.671224912" "1.681659101" "1.692976729" "1.708162716"
## [6] "1.708369705" "1.753841591" "1.779072545" "1.796462296"

a função Moda simplifica o cálculo da moda, sendo aplicada a diferentes conjuntos de dados para identificar os valores mais frequentes em variáveis específicas.

3.4 Relação entre média, mediana e moda

Documentações:

Avaliando a variável RENDA

Vamos ver o comportamento do dado Renda:

library(ggplot2)
ggplot(dados[dados$Renda,], aes(x = Renda, y = ..density..)) + 
    geom_histogram(binwidth = 500) + 
    geom_density(color = 'green')
## Warning: Removed 15 rows containing non-finite values (`stat_bin()`).
## Warning: Removed 15 rows containing non-finite values (`stat_density()`).

Veja como a renda de algumas pessoas, como identificamos de R$ 200 000,00 distorcem o gráfico. Vamos tentar melhorar, pegando apenas pessoas que ganham até 10% desse teto.

ggplot(dados[dados$Renda < 20000, ], aes(x = Renda, y = ..density..)) + 
    geom_histogram(binwidth = 500) + 
    geom_density(color = 'green')

Observe que mesmo com essa redução, o valor ainda é muito exorbitante para a maioria das pessoas. Já pensou no quanto esses valores altos intereferem na média da renda geral?

Vamoa agora avaliar as medidas de tendencia central, em relação a distribuição de assimetria.

Moda

moda <- as.numeric(Moda(dados$Renda))
moda
## [1] 788

Mediana

mediana <- median(dados$Renda)
mediana
## [1] 1200

Media

media <- mean(dados$Renda)
media
## [1] 2000.383

Veja que neste contexto moda < mediana < média, ou seja Assimétrica a Direita:

(moda < mediana) & (mediana < media)
## [1] TRUE

Avaliando a variável ALTURA

Vamos primeiro visualizar seu gráfico de histograma:

ggplot(dados, aes(x = Altura, y = ..density..)) + 
    geom_histogram() + 
    geom_density(color = 'green')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Neste podemos ver que ele se comporta mais simétrico. Vamos analisar as métricas:

Moda

moda <- as.numeric(Moda(dados$Altura))
# como temos varias modas, vamos achar a média delas
moda = mean(moda)
moda = round(moda, 2)
moda
## [1] 1.71

Mediana

mediana <- round(median(dados$Altura),3)
mediana
## [1] 1.699

Media

media <- round(mean(dados$Altura), 4)
media
## [1] 1.6995

Comparativos:

Criando uma função para comparar as assimétricas:

Compara <- function(moda,mediana,media)
  {
  if((moda<mediana)&(mediana < media))
    {
    print("Assimétrica á direita")
  }else
    {
    print("Simétrica")
  }
}

Testando a função:

moda = round(as.numeric(Moda(dados$Renda)),4)
mediana = round(median(dados$Renda), 4)
media = round(mean(dados$Renda), 4)
Compara(moda,mediana,media)
## [1] "Assimétrica á direita"
moda = round(mean(as.numeric(Moda(dados$Altura))),4)
mediana = round(median(dados$Altura), 4)
media = round(mean(dados$Altura), 4)
Compara(moda,mediana,media)
## [1] "Simétrica"

Veja que neste contexto moda = mediana = média, ou seja existe uma simetria nos dados.

Avaliando a variável ANOS DE ESTUDO

ggplot(dados, aes(x = Anos.de.Estudo, y = ..density..)) + 
    geom_histogram() + 
    geom_density(color = 'green')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Neste podemos ver que ele se comporta mais simétrico. Vamos analisar as métricas:

Moda

moda <- as.numeric(Moda(dados$Anos.de.Estudo ))
moda
## [1] 12

Mediana

mediana <- median(dados$Anos.de.Estudo)
mediana
## [1] 11

Média

media <- mean(dados$Anos.de.Estudo)
media
## [1] 9.469664

Veja que neste contexto média < mediana < moda, ou seja existe uma asimetria a esqueda dos dados.

Neste capitulo aborda mostra a relação entre as medidas de tendencia central que são média, mediana e moda onde juntos indicam a assimetria ou simetria dos dados

4 MEDIDAS SEPARATRIZES

4.1 Quartis, decis e percentis

Há uma série de medidas de posição semelhantes na sua concepção à mediana, embora não sejam medidas de tendência central. Como se sabe, a mediana divide a distribuição em duas partes iguais quanto ao número de elementos de cada parte. Já os quartis permitem dividir a distribuição em quatro partes iguais quanto ao número de elementos de cada uma; os decis em dez partes e os centis em cem partes iguais.

Documentações:

Particionando os dados em 25%, 50% e 75% que são os 3 quartos dos dados.

quantile(dados$Renda, c(0.25, 0.5, 0.75))
##  25%  50%  75% 
##  788 1200 2000

Vamos criar um laço for para gerar os 10 decis e alimentar um vetor com este nome:

decis <- c()
for(i in 1:9){
    decis <- c(decis, i / 10)
}
decis
## [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

Agora é só passar o vetor no quantile:

quantile(dados$Renda, decis)
##  10%  20%  30%  40%  50%  60%  70%  80%  90% 
##  350  788  800 1000 1200 1500 1900 2500 4000

Vamos replicar a mesma função para os Centis

centis <- c()
for(i in 1:99){
    centis <- c(centis, i / 100)
}
quantile(dados$Renda, centis)
##    1%    2%    3%    4%    5%    6%    7%    8%    9%   10%   11%   12%   13% 
##     0     0     0    50   100   180   200   280   300   350   400   400   480 
##   14%   15%   16%   17%   18%   19%   20%   21%   22%   23%   24%   25%   26% 
##   500   500   600   600   700   700   788   788   788   788   788   788   788 
##   27%   28%   29%   30%   31%   32%   33%   34%   35%   36%   37%   38%   39% 
##   788   788   789   800   800   800   840   870   900   900   920   970  1000 
##   40%   41%   42%   43%   44%   45%   46%   47%   48%   49%   50%   51%   52% 
##  1000  1000  1000  1000  1014  1100  1100  1150  1200  1200  1200  1200  1200 
##   53%   54%   55%   56%   57%   58%   59%   60%   61%   62%   63%   64%   65% 
##  1200  1300  1300  1350  1400  1490  1500  1500  1500  1500  1500  1520  1600 
##   66%   67%   68%   69%   70%   71%   72%   73%   74%   75%   76%   77%   78% 
##  1600  1700  1800  1800  1900  2000  2000  2000  2000  2000  2000  2200  2300 
##   79%   80%   81%   82%   83%   84%   85%   86%   87%   88%   89%   90%   91% 
##  2400  2500  2500  2600  3000  3000  3000  3000  3400  3500  4000  4000  4200 
##   92%   93%   94%   95%   96%   97%   98%   99% 
##  5000  5000  5400  6000  7000  8000 10000 15000

Vamos ver um histograma acumulado da idade para entendermos a sua população e distribuição.

ggplot(data = dados, aes(x = Idade)) + 
    geom_histogram(
        aes(y = cumsum(..count..)/sum(..count..)), 
        bins = 10
    ) + 
    geom_freqpoly(
        aes(y = cumsum(..count..)/sum(..count..)), 
        color = 'green'
    )
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Vamos calcular o decis para idade:

decis <- c()
for(i in 1:9){
    decis <- c(decis, i / 10)
}
quantile(dados$Idade, decis)
## 10% 20% 30% 40% 50% 60% 70% 80% 90% 
##  28  33  36  40  43  47  51  55  61

Classificação percentual

Percentual de pessoas com até 40 anos de idade:

length(dados$Idade[dados$Idade <= 40]) / length(dados$Idade) * 100
## [1] 42.07574

Assim, os participantes com até 40 anos representam 42,08% dos dados.

Neste capitulo é falado sobre os quartis, decis e percentis.Onde os quartis sãõ valores que dividem um conjunto de dados em quatro partes. Os Decis são os que dividem um conjunto de dados em 10 partes iguais. E por fim os percentis que dividem os dados em 100 parte iguais

Box-plot

O box plot dá uma idéia da posição, dispersão, assimetria, caudas e dados discrepantes (outliers). A posição central é dada pela mediana e a dispersão por IIQ. As posições relativas de Q1, Mediana e Q3 dão uma noção da simetria da distribuição. Os comprimentos das cauda são dados pelas linhas que vão do retângulo aos valores remotos e pelos valores atípicos.

Documentações:

Vamos primeiro criar alguns vetores com a descirção de cada uma das variáveis, para melhor apresentar os dados em nossos gráficos.

sexo = c(
    'Masculino', 
    'Feminino'
)
cor = c(
    'Indígena', 
    'Branca', 
    'Preta', 
    'Amarela', 
    'Parda'
)
anos_de_estudo = c(
    'Sem instrução e menos de 1 ano', 
    '1 ano', 
    '2 anos', 
    '3 anos', 
    '4 anos', 
    '5 anos', 
    '6 anos', 
    '7 anos', 
    '8 anos', 
    '9 anos', 
    '10 anos', 
    '11 anos', 
    '12 anos', 
    '13 anos', 
    '14 anos', 
    '15 anos ou mais', 
    'Não determinados'
)

Construindo o boxplot da Altura:

ggplot(data = dados, aes(x = "", y = Altura)) + 
    stat_boxplot(geom ='errorbar', width = 0.4) + 
    geom_boxplot(fill = '#3274A1') + 
    coord_flip() +
    ylab("Metros") + 
    xlab("") + 
    ggtitle('Box-plot Alturas') +
    formatos

Vamos construir o boxplot da altura, levando em consideração o sexo dos participantes.

ggplot(data = dados, aes(x = Sexo, y = Altura, group = Sexo)) + 
    stat_boxplot(geom ='errorbar', width = 0.4) + 
    geom_boxplot(fill = c('#3274A1', "orange")) + 
    coord_flip() +
    ylab("Metros") + 
    xlab("Sexo") + 
    ggtitle('Box-plot Alturas X Sexo') +
    formatos

Vamos mudar a categorização numérica do sexo para uma variável categorica:

dados$Cat.Sexo <- factor(dados$Sexo)
levels(dados$Cat.Sexo) <- sexo

Vamos relembrar o cabeçalho de nossa dataframe

head(dados)
##   UF Sexo Idade Cor Anos.de.Estudo Renda   Altura  Cat.Sexo
## 1 11    0    23   8             12   800 1.603808 Masculino
## 2 11    1    23   2             12  1150 1.739790  Feminino
## 3 11    1    35   8             15   880 1.760444  Feminino
## 4 11    0    46   2              6  3500 1.783158 Masculino
## 5 11    1    47   8              9   150 1.690631  Feminino
## 6 11    1    34   8             12   790 1.637906  Feminino

Agora vamos utilizar os nomes para a categoria sexo.

ggplot(data = dados, aes(x = Cat.Sexo, y = Altura)) + 
    stat_boxplot(geom ='errorbar', width = 0.4) + 
    geom_boxplot(fill = c('#3274A1', "orange")) + 
    coord_flip() +
    ylab("Metros") + 
    xlab("Sexo") + 
    ggtitle('Box-plot Alturas X Sexo') +
    formatos

Vamos agora fazer um boxplot da renda. Como já sabemos que existe um discrepância muito grande por valores altos, vamos plotar apenas até renda de R$ 10 000,00:

ggplot(data = dados[dados$Renda < 10000, ], aes(x = "", y = Renda)) + 
    stat_boxplot(geom ='errorbar', width = 0.4) + 
    geom_boxplot(fill = '#3274A1') + 
    coord_flip() +
    ylab("R$") + 
    xlab("") + 
    ggtitle('Box-plot Renda') +
    formatos

Vamos fazer a renda separada por sexo:

ggplot(data = dados[dados$Renda < 10000, ], aes(x = Cat.Sexo, y = Renda)) + 
    stat_boxplot(geom ='errorbar', width = 0.4) + 
    geom_boxplot(fill = c('#3274A1', "orange")) + 
    coord_flip() +
    ylab("R$") + 
    xlab("Sexo") + 
    ggtitle('Box-plot Renda X Sexo') +
    formatos

Vamos criar o factor para as variáveis de anos de estudos

dados$Cat.Anos.de.Estudo <- factor(dados$Anos.de.Estudo, order = TRUE)
levels(dados$Cat.Anos.de.Estudo) <- anos_de_estudo

Vamos visualizar novamente esse atributo no dataframe:

head(dados)
##   UF Sexo Idade Cor Anos.de.Estudo Renda   Altura  Cat.Sexo Cat.Anos.de.Estudo
## 1 11    0    23   8             12   800 1.603808 Masculino            11 anos
## 2 11    1    23   2             12  1150 1.739790  Feminino            11 anos
## 3 11    1    35   8             15   880 1.760444  Feminino            14 anos
## 4 11    0    46   2              6  3500 1.783158 Masculino             5 anos
## 5 11    1    47   8              9   150 1.690631  Feminino             8 anos
## 6 11    1    34   8             12   790 1.637906  Feminino            11 anos

Agora vamos fazer o boxplot dos anos de estudos dos participantes:

ggplot(data = dados, aes(x = "", y = Anos.de.Estudo)) + 
    stat_boxplot(geom ='errorbar', width = 0.4) + 
    geom_boxplot(fill = '#3274A1') + 
    coord_flip() +
    ylab("Anos") + 
    xlab("") + 
    ggtitle('Box-plot Anos de Estudo') +
    formatos

Vamos fazer o mesmo gráfico separado por sexo:

ggplot(data = dados, aes(x = Cat.Sexo, y = Anos.de.Estudo)) + 
    stat_boxplot(geom ='errorbar', width = 0.4) + 
    geom_boxplot(fill = c('#3274A1', "orange")) + 
    coord_flip() +
    ylab("Anos") + 
    xlab("Sexo") + 
    ggtitle('Box-plot Anos de Estudo X Sexo') +
    formatos

Veja agora a relação entre a distribuição normal dos dados e o boxplot.

5 MEDIDAS DE DISPERSÃO

Embora as medidas de posição forneçam uma sumarização bastante importante dos dados, elas podem não ser suficientes para caracterizar conjuntos distintos, especialmente quando as observações de determinada distribuição apresentarem dados muito dispersos.

\[\mu=\frac{1}{n}\sum_{i=1}^{n}X_{i}\]

Documentações:

Vamos começar revendo nossa dataframe alternativa, para entermos melhor a idéia do desvio médio:

df
##            Fulano Beltrano Sicrano
## Matemática      8     10.0     7.5
## Português      10      2.0     8.0
## Inglês          4      0.5     7.0
## Geografia       8      1.0     8.0
## História        6      3.0     8.0
## Física         10      9.5     8.5
## Química         8     10.0     7.0

Vamos observar o resumos dos dados estatísticos desta tabela:

summary(df)
##      Fulano          Beltrano         Sicrano     
##  Min.   : 4.000   Min.   : 0.500   Min.   :7.000  
##  1st Qu.: 7.000   1st Qu.: 1.500   1st Qu.:7.250  
##  Median : 8.000   Median : 3.000   Median :8.000  
##  Mean   : 7.714   Mean   : 5.143   Mean   :7.714  
##  3rd Qu.: 9.000   3rd Qu.: 9.750   3rd Qu.:8.000  
##  Max.   :10.000   Max.   :10.000   Max.   :8.500

Veja, que Fulano e Sicrano tem as mesmas médias, mas aparentimente Fulano é menos constante nas notas. As medidas de dispersão nos ajudarão a entender melhor essa situação.

Vamos agora trabalhar um pouco com esse dataframe, observando as nostas de Fulano para entender bem o que acontece.

Agora iremos criar um novo dataframe para manipulação e não alterar assim o original:

notas_fulano <- data.frame(Fulano = df$Fulano, row.names = row.names(df))
notas_fulano
##            Fulano
## Matemática      8
## Português      10
## Inglês          4
## Geografia       8
## História        6
## Física         10
## Química         8

Agora vamos calcular a nota média de fulano:

nota_media_fulano <- mean(notas_fulano$Fulano)
nota_media_fulano
## [1] 7.714286

Vamos entender a diferença entre as notas individuais e a média das notas de Fulano. Iremos criar um novo atributo com esse valor:

notas_fulano$Desvio <- notas_fulano$Fulano - nota_media_fulano
notas_fulano
##            Fulano     Desvio
## Matemática      8  0.2857143
## Português      10  2.2857143
## Inglês          4 -3.7142857
## Geografia       8  0.2857143
## História        6 -1.7142857
## Física         10  2.2857143
## Química         8  0.2857143

Vamos somar os valores dos desvios:

sum(notas_fulano$Desvio)
## [1] -8.881784e-16

Veja que este desvio é praticamente nulo. Isto é a característica dos desvios, suas somas se anulam.

Agora vamos colcoar os valores do desvio em módulo, para termos os desvios absolutos:

notas_fulano$Desvio.Absoluto <- abs(notas_fulano$Desvio)
notas_fulano
##            Fulano     Desvio Desvio.Absoluto
## Matemática      8  0.2857143       0.2857143
## Português      10  2.2857143       2.2857143
## Inglês          4 -3.7142857       3.7142857
## Geografia       8  0.2857143       0.2857143
## História        6 -1.7142857       1.7142857
## Física         10  2.2857143       2.2857143
## Química         8  0.2857143       0.2857143

Neste momento vamos visualizar esta varição do desvio:

ggplot(data = notas_fulano, aes(x = row.names(notas_fulano), y = Fulano)) + 
    geom_point() + 
    geom_hline(yintercept = mean(notas_fulano$Fulano), color = 'red') + 
    geom_segment(aes(x = 1, y = 10, xend = 1, yend = mean(notas_fulano$Fulano))) + 
    geom_segment(aes(x = 2, y = 8, xend = 2, yend = mean(notas_fulano$Fulano))) + 
    geom_segment(aes(x = 3, y = 6, xend = 3, yend = mean(notas_fulano$Fulano))) + 
    geom_segment(aes(x = 4, y = 4, xend = 4, yend = mean(notas_fulano$Fulano))) + 
    geom_segment(aes(x = 5, y = 8, xend = 5, yend = mean(notas_fulano$Fulano))) + 
    geom_segment(aes(x = 6, y = 10, xend = 6, yend = mean(notas_fulano$Fulano))) + 
    geom_segment(aes(x = 7, y = 8, xend = 7, yend = mean(notas_fulano$Fulano)))

Vamos agora encontrar a média do desvio absoluto:

mean(notas_fulano$Desvio.Absoluto)
## [1] 1.55102

Instalando o pacote DescTools

Instalando o pacote DescTools na versão específica:

library(DescTools)
MeanAD(df$Fulano)
## [1] 1.55102

O desvio médio absoluto (DMA) é uma medida de dispersão que avalia a média dos desvios absolutos entre cada valor de um conjunto de dados e a média aritmética desse conjunto.

5.2 Variância

Variância

A variância é construída a partir das diferenças entre cada observação e a média dos dados, ou seja, o desvio em torno da média. No cálculo da variância, os desvios em torno da média são elevados ao quadrado.

Variância populacional

\[\sigma^2 = \frac{1}{n} \sum_{i=1}^n (X_i - \mu)^2\]

Variância amostral

\[\S^2 = \frac{1}{n-1} \sum_{i=1}^n (X_i - \overline)^2\]

Documentações:

Agora vemos encontrar a variância utilizando a fórmula acima dada. Vamos criar um novo atributo que será o quadrado do desvio

notas_fulano$Desvio2 <- notas_fulano$Desvio ^ 2
notas_fulano
##            Fulano     Desvio Desvio.Absoluto     Desvio2
## Matemática      8  0.2857143       0.2857143  0.08163265
## Português      10  2.2857143       2.2857143  5.22448980
## Inglês          4 -3.7142857       3.7142857 13.79591837
## Geografia       8  0.2857143       0.2857143  0.08163265
## História        6 -1.7142857       1.7142857  2.93877551
## Física         10  2.2857143       2.2857143  5.22448980
## Química         8  0.2857143       0.2857143  0.08163265

Vamos agora dividir a soma do desvio ao quadrado pelo número de participanes, subtraindo -1 já que sempre consideramos os dados como amostrais.

sum(notas_fulano$Desvio2) / (nrow(notas_fulano) - 1)
## [1] 4.571429

Agora vamos ver pela função var do R

variancia <- var(notas_fulano$Fulano)
variancia
## [1] 4.571429

A variância é uma medida estatística que representa a dispersão dos dados em torno da média. Ela é calculada elevando ao quadrado os desvios de cada valor em relação à média, e a fórmula pode variar dependendo de ser uma variância populacional ou amostral.

5.3 Desvio padrão

Uma das restrições da variância é o fato de fornecer medidas em quadrados das unidades originais - a variância de medidas de comprimento, por exemplo, é em unidades de área. Logo, o fato de as unidades serem diferentes dificulta a comparação da dispersão com as variáveis que a definem. Um modo de eliminar essa dificuldade é considerar sua raiz quadrada.

Desvio padrão populacional

\[\sigma= \sqrt{\frac{1}{n} \sum_{i=1}^n (X_i - \mu)^2}\]

Desvio padrão amostral

\[\S= \sqrt{\frac{1}{n-1} \sum_{i=1}^n (X_i - \overline{x})^2}\]

Documentações:

Vamos analisar a fórmula dada, tirando a raiz quadrada da variância anteriormente calculada

sqrt(variancia)
## [1] 2.13809

Agora vamos fazer a mesma operação utilizando a função sd do R

desvio_padrao <- sd(notas_fulano$Fulano)
desvio_padrao
## [1] 2.13809

Veja que temos os mesmos valores.

Agora vamos rever o nosso dataframe

df
##            Fulano Beltrano Sicrano
## Matemática      8     10.0     7.5
## Português      10      2.0     8.0
## Inglês          4      0.5     7.0
## Geografia       8      1.0     8.0
## História        6      3.0     8.0
## Física         10      9.5     8.5
## Química         8     10.0     7.0

Vamos calcular a moda de Fulano e Sicrano:

Moda(df$Sicrano)
## [1] "8"

Veja que são iguais, mas vamos ver o desvio padrão:

sd(df$Fulano)
## [1] 2.13809
sd(df$Sicrano)
## [1] 0.5669467

Veja que Sicrano tem uma dispersão muito menor, apresentando uma consistencia maior na amostra e nos seus dados.

Aqui encerramos essa primeria análise de dados, que remete as estatisticas descritivas de uma base de dados. Nos demais cursos que se seguem iremos aprofundar nossos conhecimentos.

O desvio padrão é uma medida de dispersão que indica o quanto os dados de um conjunto se afastam da média. Ele é uma forma de expressar a variabilidade dos dados em termos da unidade de medida original.