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.
Rendimento mensal do trabalho principal para pessoas de 10 anos ou mais de idade.
Idade do morador na data de referência em anos.
Altura do morador em metros.
| 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 |
| Código | Descrição |
|---|---|
| 0 | Masculino |
| 1 | Feminino |
| 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 |
| Código | Descrição |
|---|---|
| 0 | Indígena |
| 2 | Branca |
| 4 | Preta |
| 6 | Amarela |
| 8 | Parda |
| 9 | Sem declaração |
Os seguintes tratamentos foram realizados nos dados originais:
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
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
??select
??arrange
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
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
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:
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!
A variável idade pode ser classificada de três formas distintas:
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)))
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:
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
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.
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")
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.
\[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
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,
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.
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 \(\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)
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
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$Beltran)
## [1] 6.25
Vamos encontrar a média e mediana da renda
mean(dados$Renda)
## [1] 2000.383
median(dados$Renda)
## [1] 1200
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)
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"
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"
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
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.
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.
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.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
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.
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 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.
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.
\[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 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
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 1n\sum_{i=1}^{n}(X_i-\mu)^2\]
\[S^2 = \frac 1{n-1}\sum_{i=1}^{n}(X_i-\bar{X})^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
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 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.
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.