1 CONHECENDO OS DADOS


1.1 DataSet do projeto

Pesquisa Nacional por Amostra de Domicílios - 2015

A Pesquisa Nacional por 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.

Variáveis utilizadas

Renda

Rendimento mensal do trabalho principal para pessoas de 10 anos ou mais de idade.

Idade

Idade do morador na data de referência em anos.

Altura (elaboração própria)

Altura do morador em metros.

UF

Código Descrição
11 Rondônia
12 Acre
13 Amazonas
14 Roraima
15 Pará
16 Amapá
17 Tocantins
21 Maranhão
22 Piauí
23 Ceará
24 Rio Grande do Norte
25 Paraíba
26 Pernambuco
27 Alagoas
28 Sergipe
29 Bahia
31 Minas Gerais
32 Espírito Santo
33 Rio de Janeiro
35 São Paulo
41 Paraná
42 Santa Catarina
43 Rio Grande do Sul
50 Mato Grosso do Sul
51 Mato Grosso
52 Goiás
53 Distrito Federal

Sexo

Código Descrição
0 Masculino
1 Feminino

Anos de Estudo

Código Descrição
1 Sem instrução e menos de 1 ano
2 1 ano
3 2 anos
4 3 anos
5 4 anos
6 5 anos
7 6 anos
8 7 anos
9 8 anos
10 9 anos
11 10 anos
12 11 anos
13 12 anos
14 13 anos
15 14 anos
16 15 anos ou mais
17 Não determinados
Não aplicável

Cor

Código Descrição
0 Indígena
2 Branca
4 Preta
6 Amarela
8 Parda
9 Sem declaração

Observação

Os seguintes tratamentos foram realizados nos dados originais:

    1. Foram eliminados os registros onde a Renda era inválida (999 999 999 999);
    1. Foram eliminados os registros onde a Renda era missing;
    1. Foram considerados somente os registros das Pessoas de Referência de cada domicílio (responsável pelo domicílio).

R (informações básicas)

sessionInfo()
## R version 4.2.2 (2022-10-31)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.5 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
## 
## 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   
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## loaded via a namespace (and not attached):
##  [1] digest_0.6.31   R6_2.5.1        jsonlite_1.8.4  evaluate_0.20  
##  [5] cachem_1.0.6    rlang_1.0.6     cli_3.6.0       rstudioapi_0.14
##  [9] jquerylib_0.1.4 bslib_0.4.2     rmarkdown_2.20  tools_4.2.2    
## [13] xfun_0.37       yaml_2.3.7      fastmap_1.1.0   compiler_4.2.2 
## [17] htmltools_0.5.4 knitr_1.42      sass_0.4.5

Importando bibliotecas

A bilioteca dplyr

https://www.rdocumentation.org/packages/dplyr

install.packages("tidyverse")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.2'
## (as 'lib' is unspecified)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.0     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.1     ✔ tibble    3.1.8
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors

Documentações:

Acessando a ajuda

??select
??arrange

Importando o dataset do projeto

Primeiro baixe os dados tratados da pasta pessoal do professor e pesquisador - Gleison Guardia:

https://drive.google.com/drive/folders/1YDgYJZN6BQFZcdvvTdOCwbR-U2acAzTz?usp=sharing

dados <- read.csv("dados.csv")
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
head(dados,10)
##    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
## 7  11    0    57   8             12  3150 1.570078
## 8  11    1    60   8             12  1700 1.608495
## 9  11    1    50   4             14  1800 1.780329
## 10 11    0    26   8             12  1150 1.793203

1.2 Tipos de dados


Variáveis qualitativas ordinais

  • Variáveis que podem ser ordenadas ou hierarquizadas

Documentações:

head(dados,5)
##   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

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.

Anos_de_Estudos <- c(arrange(unique(select(dados, Anos.de.Estudo)),Anos.de.Estudo ))
Anos_de_Estudos
## $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

Inidade da Federação:

c(arrange(unique(select(dados, UF)), UF))
## $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:

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

Cor da pele dos participantes:

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: Qual o intervalo das idades?

sprintf('A menor idade é %s e a maior idade é %s anos!', min(dados$Idade), max(dados$Idade))
## [1] "A menor idade é 13 e a maior idade é 99 anos!"

Apresentando a formatação de outra forma:

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

veja a nova formatação:

#cat('A menor idade é ', min(dados$Idade), ' e a maior idade é ', max(dados$Idade) )

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

Observação

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

    1. QUANTITATIVA DISCRETA - quando representa anos completos (números inteiros);
    1. QUANTITATIVA CONTÍNUA - quando representa a idade exata, sendo representado por frações de anos;
    1. 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

#glue('A altura mínima é {round(min(dados$Altura),2)} e a altura máxima é de {round(max(dados$Altura),2)} metros!')

#sprintf('A altura mínima é %s e a altura máxima é de %s metros!', round(min(dados$Altura)), round(max(dados$Altura)))

Classificação de uma variável

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:

round((prop.table(table(dados$Sexo))*100),2)
## 
##    0    1 
## 69.3 30.7

Melhorando a tabela e apresentando os dados em porcentagem:

dist_freq_qualitativas <- cbind(freq = table(dados$Sexo), percent = round((prop.table(table(dados$Sexo))*100),2) )
dist_freq_qualitativas
##    freq percent
## 0 53250    69.3
## 1 23590    30.7

Nomeando as Colunas:

colnames(dist_freq_qualitativas) <- c("Frequência", "Porcentagem (%)")
dist_freq_qualitativas
##   Frequência Porcentagem (%)
## 0      53250            69.3
## 1      23590            30.7

Nomeando as linhas:

rownames(dist_freq_qualitativas) <-c("Masculino", "Feminino")
dist_freq_qualitativas
##           Frequência Porcentagem (%)
## Masculino      53250            69.3
## Feminino       23590            30.7

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("Indigêna", "Branca", "Preta", "Amarela", "Parda")
frequencia <- cbind(frequencia) # para se tornar uma tabela interativa
frequencia
##           Indigêna Branca Preta Amarela Parda
## Masculino      256  22194  5502     235 25063
## Feminino       101   9621  2889     117 10862

Apresentando os dados em percentual:

#percentual <- round(prop.table(frequencia)*100, 2 )
#percentual

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

medias <- round(tapply(dados$Renda, list(dados$Sexo, dados$Cor), mean),2)
rownames(medias) <- c("Masculino", "Feminino")
colnames(medias) <- c("Indigêna", "Branca", "Preta", "Amarela", "Parda")
medias <- cbind(medias)
medias
##           Indigêna  Branca   Preta Amarela   Parda
## Masculino  1081.71 2925.74 1603.86 4758.25 1659.58
## Feminino   2464.39 2109.87 1134.60 3027.34 1176.76

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

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

2.2.1 Normalidade dos dados com Sturges


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)

Criando 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, para comentar várias linhas de código utilize o atalho ctrl+shift+c

# 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_renda <- table(
  cut(
 x = dados$Renda,
 breaks = classes,
 labels = labels,
 include.lowest = TRUE
)
)
frequencia_renda
## 
##     E     D     C     B     A 
## 49755 16700  7599  2178   608

Apresentadndo os dados em percentual

percentual_renda_classes <- round(prop.table(frequencia_renda)*100,2)
percentual_renda_classes
## 
##     E     D     C     B     A 
## 64.75 21.73  9.89  2.83  0.79

Nomeando as colunas

dist_freq_renda <- cbind("Frequência" = frequencia_renda, "Porcentagem (%)" = percentual_renda_classes)
dist_freq_renda
##   Frequência Porcentagem (%)
## E      49755           64.75
## D      16700           21.73
## C       7599            9.89
## B       2178            2.83
## A        608            0.79

Ordenando os nomes pelo nome daslinhas:

dist_freq_renda[order(row.names(dist_freq_renda)),]
##   Frequência Porcentagem (%)
## A        608            0.79
## B       2178            2.83
## C       7599            9.89
## D      16700           21.73
## E      49755           64.75

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

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

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,
 main ="Histograma das alturas",
 breaks = "Sturges",
 xlab = "Alturas",
 ylab =  "Frequências",
 col = 'lightgreen',
 border = 'darkblue'
)

Instalando biblioteca ggplot2: Caso já tenha instalado, não precisa e=instalar novamento

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

Constuindo o mesmo gráfico com o uso do ggplot2 Nota - Titulos e subtitulos alinhados a esquerda é o padrão atual de 2023 Nota - %>% chamado de pipe é um operador lógico do pacote dplyr incluso no pacote tidyverse

dados %>% 
  ggplot(aes(x = dados$Altura))+
  geom_histogram( fill = 'lightgreen',
                  col = 'darkblue')+
  ggtitle(("Histograma das alturas"))+
  xlab ("Alturas")+
  ylab ("Frequências")+
  theme(
    plot.title = element_text(size = 16),
    axis.title.x = element_text(size = 14),
    axis.title.y = element_text(size = 14)
  )+
theme_bw()
## Warning: Use of `dados$Altura` is discouraged.
## ℹ Use `Altura` instead.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Vamos padronizar os formatos para não percisar digitar ele toda vez que for necessário uilizar, criando uma variável

formatos <- theme(
        plot.title = element_text(size = 14),
        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.

dados %>% 
  ggplot(aes(x = dados$Altura, y = ..density..))+
  geom_histogram( fill = 'lightgreen',
                  col = 'darkblue')+
  geom_density()+
  ggtitle(("Histograma das alturas"))+
  xlab ("Alturas")+
  ylab ("Frequências")+
  theme_bw()+
  formatos
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## Warning: Use of `dados$Altura` is discouraged.
## ℹ Use `Altura` instead.
## Use of `dados$Altura` is discouraged.
## ℹ Use `Altura` instead.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

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_renda)
bar_chart
##   Frequência Porcentagem....
## E      49755           64.75
## D      16700           21.73
## C       7599            9.89
## B       2178            2.83
## A        608            0.79

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",fill = 'green',color='blue') + 
    ylab("Frequência") + 
    xlab("Classes de Renda") + 
    ggtitle('Gráfico Classes de Renda') +
    theme_bw()+
    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 dodos.

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 aritmética


É representada por \(\mu\) quando se refere à população e por \(\bar{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+5+7+9+4+8+6)/7
## [1] 6.714286

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

mean(df$Fulano)
## [1] 7.714286
mean(df$Beltrano)
## [1] 5.142857
mean(df$Sicrano)
## [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

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$Beltran)
## [1] 6.25

Obtendo a mediana em nosso dataset

Vamos encontrar a média e mediana da renda

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

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)
exemplo_moda
## [1] 1 2 2 3 4 4 5

Agora vamos criar uma tabela de frequência:

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

Agora vamos encontrar as maiores frequências:

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

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

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

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)])
}

Vamos aplicar a função criada no nosso exemplo:

Vamos aplicar agora na nossa dataframe df:

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

Obtendo a moda em nosso dataset

Moda da Renda dos participantes:

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"

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,fill = 'lightgreen',col = 'darkblue')+
  geom_density(color =  'darkblue')+
    theme_bw()+
    formatos
## Warning: Removed 15 rows containing non-finite values (`stat_bin()`).
## Warning: Removed 15 rows containing non-finite values (`stat_density()`).

Usando dados do IBGE (1974 a 2000), visualizando a distribuição de renda das pessoas até R$ 5000 reais.

  ggplot(dados[dados$Renda<5000,],aes(x = Renda, y= ..density..))+
  geom_histogram(binwidth = 500,
                 fill='lightgreen',
                 col ='darkblue')+
  geom_density(color ='darkblue')+
  theme_bw()+
  formatos

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 <- Moda(dados$Renda)

Mediana

mediana <- median(dados$Renda)

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
## [1] FALSE
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(fill='lightgreen',
               col ='darkblue')+
  geom_density(color ='darkblue')+
  theme_bw()+
  formatos
## `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))
moda
## [1] 1.568128 1.671225 1.681659 1.692977 1.708163 1.708370 1.753842 1.779073
## [9] 1.796462

Mediana

mediana <- median(dados$Altura)
mediana
## [1] 1.699325

Media

media <- mean(dados$Altura)
media
## [1] 1.699512

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

Avaliando a variável ANOS DE ESTUDO

Vamos primeiro visualizar seu gráfico de histograma:

ggplot(dados,aes(x=dados$Anos.de.Estudo, y= ..density..))+
geom_histogram(fill='lightgreen',
               col ='darkblue')+
  geom_density(color ='darkblue')+
  theme_bw()+
  formatos
## Warning: Use of `dados$Anos.de.Estudo` is discouraged.
## ℹ Use `Anos.de.Estudo` instead.
## Use of `dados$Anos.de.Estudo` is discouraged.
## ℹ Use `Anos.de.Estudo` instead.
## `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(dados$Anos.de.Estudo)
## [1] "12"

Mediana

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

Media

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

Por que não desenvolver uma function que possa nos informar qual a distribuição uma coluna do df se encaixa

Distribuicao <- function(x){
  moda<- as.numeric(Moda(x))
  mediana <- median(x)
  media<- mean(x)
  
  if(media < mediana & mediana < median(moda)){ 
    print("Distribuição Asimétrica a esquerda")
  }else if(media > mediana & mediana > median(moda)){
    print("Distribuição Asimétrica a direita")
  }else{
    print("Distribuição Simétrica")
    }
  }
Distribuicao(dados$Renda)
## [1] "Distribuição Asimétrica a direita"
Distribuicao(dados$Anos.de.Estudo)
## [1] "Distribuição Asimétrica a esquerda"
Distribuicao(dados$Altura)
## [1] "Distribuição Simétrica"

Veja que neste contexto média < mediana < moda, ou seja existe uma asimetria a esqueda 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.50,0.75,0.99)) # Quartis 
##   25%   50%   75%   99% 
##   788  1200  2000 15000
max(dados$Renda) # Maior renda do DF
## [1] 200000

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

Criando uma function onde ele usa o a coluna e o valor de d para printar os decis e c para printar os resultados de centis

decis_centis <- function (x,y){
  #Criando vetores vazios
  decis <-c()  
  centis <-c()
  
  #laço para criar os veotres dos decis e centis
  for(i in 1:9){
    decis <- c(decis, i/10)}
    decis <-quantile(x,decis)
      
  for(i in 1:99){
    centis <- c(centis, i/100)}
    centis <-quantile(x,centis)
  
    #Verificação para centis ou decis
    if(y == "c" )
      {
      return(centis)
      }
    else("d")
      {
        return(decis)
    }
}

Chamando a função com d de decis

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

Chamando a função com c de centis

decis_centis(dados$Renda,"c")
##    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,fill = "green",color='black'
    ) + 
    geom_freqpoly(
        aes(y = cumsum(..count..)/sum(..count..)), 
        color = 'blue'
    )
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Vamos calcular o decis para idade:

decis_centis(dados$Idade,"d")
## 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.

4.2 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 descriçã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 = 'green') + 
    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', 'red')) + 
    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', "red")) + 
    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 = 'green') + 
    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', "red")) + 
    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 = 'green') + 
    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', "red")) + 
    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.

5.1 Desvio médio absoluto


\[DM = \frac 1n\sum_{i=1}^{n}|X_i-\bar{X}|\] ### 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 colocar 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:

#install.packages('DescTools')
library(DescTools)

Agora com essa biblioteca podemos encontrar o valor absoluto diretamente:

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

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 1n\sum_{i=1}^{n}(X_i-\mu)^2\]

Variância amostral

\[S^2 = \frac 1{n-1}\sum_{i=1}^{n}(X_i-\bar{X})^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

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 1n\sum_{i=1}^{n}(X_i-\mu)^2} \Longrightarrow \sigma = \sqrt{\sigma^2}\] ### Desvio padrão amostral

\[S = \sqrt{\frac 1{n-1}\sum_{i=1}^{n}(X_i-\bar{X})^2} \Longrightarrow S = \sqrt{S^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$Fulano)
## [1] "8"
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.

6 REFERÊNCIAS:

BENGFORT, B.; KIM, J. Análise de dados com Hadoop: Uma introdução para Cientista de Dados. 1ª Edição. São Paulo - SP: Novatec, 2016.

BRUCE, P.; BRUCE, A. Estatística para Cientista de Dados: 50 conceitos iniciais. 1ª Edição. Rio de Janeiro - RJ: Alta Books, 2019.

DIAS, Rodrigo fernando. Estaística com R. Alura. 2022. disponível em: https://cursos.alura.com.br/course/estatistica-r-frequencias-medidas

GOLDSCHMIDT, R.; PASSOS, E.; BEZERRA, E. Data Mining: Conceitos, técnicas, orientações e aplicações. 2ª Edição. Rio de Janeiro - RJ: ELSEVIER, 2015.

HADLEY, W.; GARRETT, G. R para Data Science: Importe, arrume, transforme, visualize e modele dados. 1ª Edição. Rio de Janeiro - RJ: Alta Books, 2019.

MUELLER, J. P.; MASSARON, L. Aprendizado de Máquina para leigos. 1ª Edição. Rio de Janeiro - RJ: Alta Books, 2019.

UCS - Universidade Caxias do Sul. Big Data: o que é, para que serve, como aplicar e exemplos. Disponível em: https://ead.ucs.br/blog/big-data Acesso em: 12, setembro de 2022.

TAULLI, T. Introdução à Inteligência Artificial: Uma abordagem não técnica. 1ª Edição. São Paulo - SP: Novatec, 2020.