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.
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
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
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
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 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
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.
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
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.
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.
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
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).
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')
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.
\[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
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.
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.
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 .
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
É 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)
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.
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}\)]
Quando \(n\) for ímpar:
\(Md=\)\(X_{{Elemento}_{md}}\)
Quando \(n\) for par:
\(Md=\)\(\frac{X_{{Elemento}_{md}+}X_{{Elemento}_{md}}}{2}\)
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.
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
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
Pode-se definir a moda como sendo o valor mais frequente de um conjunto de dados. A moda é bastante utilizada para dados qualitativos.
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
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.
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
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.
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
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.
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
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
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.
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.
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}\]
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 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.
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.
\[\sigma^2 = \frac{1}{n} \sum_{i=1}^n (X_i - \mu)^2\]
\[\S^2 = \frac{1}{n-1} \sum_{i=1}^n (X_i - \overline)^2\]
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.
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.
\[\sigma= \sqrt{\frac{1}{n} \sum_{i=1}^n (X_i - \mu)^2}\]
\[\S= \sqrt{\frac{1}{n-1} \sum_{i=1}^n (X_i - \overline{x})^2}\]
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.