Primeiro, vamos fazer uma distribuição de frequência e seu histograma usando um objeto comum no R/RStudio que é o vetor de dados, ou seja, um conjunto unidimensional de valores da mesma classe.
Usando o exemplo feito na aula, preços de webcans:
112, 132, 180, 150, 200, 65, 340, 105, 85, 270, 200, 90, 230, 150, 150, 120, 130, 80, 230, 200, 110, 126, 170, 100, 140, 128, 90, 340, 170, 190.
Para definir o objeto vamos usar o operador <- ou = e c()
que é uma função genérica que combina valores em um vetor ou lista.
preco_webcans <- c(112, 132, 180, 150, 200, 65, 340, 105, 85, 270, 200, 90, 230, 150, 150, 120,
130, 80, 230, 200, 110, 126, 170, 100, 140, 128, 90, 340, 170, 190)
preco-webcans
[1] 112 132 180 150 200 65 340 105 85 270 200 90 230 150 150 120 130 80 230 200 110 126 170 100 140 128 90 340 170 190 `````
Poderíamos usar diretamente a função nativa do R, hist()
para construir um histograma de frequência absoluta e hist(x, freq=FALSE)
para construir um histograma de frequência relativa. Tais funções também podem receber outros argumentos para personalizar o gráfico. Contudo, vamos fazer o passo a passo visto em sala de aula para construir os histogramas, conforme a convenção estatística definida.
1.Ordenar os dados (opcional)
Ordene de forma crescente os dados, para isto usaremos a função sort()
, a função classifica (ou ordena) um vetor ou fator (parcialmente) em ordem crescente ou decrescente. Para ordenar ao longo de mais de uma variável, por exemplo, um data frames, consulte a função order
:
sort (preco_webcans)
[1] 65 80 85 90 90 100 105 110 112 120 126 128 130 132 140 150 150 150 170 170 180 190 200 200 200 230 230 270 340 340
2.Amplitude
Podemos confirmar na função range()
a amplitude do conjunto de dados e depois com as função max()
e min()
calcular a amplitude total (AT) do conjunto de dados:
range(preco_webcans)
[1] 65 340
AT <- ceiling((max(preco_webcans)- min(preco_webcans)))
AT
[1] 275
3. Número de classes
Para encontrar o número de classes ou intervalos (k) usaremos uma das duas regras a seguir.
Se nosso conjunto de dados for maior do que 30 elementos usaremos a função nclass.Sturges()
:
k <- nclass.Sturges(preco_webcans)
Se nosso conjunto de dados for menor ou igual à 30 elementos usaremos a função raiz quadrada e a função de arredondamento para cima:
k <- ceiling((sqrt(length(preco_webcans))))
Para identificar o número de elementos no conjunto de dados podemos usar a função length()
que retorna o comprimento de vetores (incluindo listas) e fatores:
length(preco_webcans)
[1] 30
Logo, usaremos:
k <- ceiling((sqrt(length(preco_webcans))))
k
[1] 6
4. Tamanho da classe
Para encontrar o tamanho de cada classe (ou a amplitude de classe) (h) usaremos as funções de arredonadameno para cima e o operador matemático de divisão:
h <- ceiling(AT/k)
h
[1] 46
Por fim, como queremos construir a tabela de distribuição de frequência e o histograma a partir da convenção estatística definida, vamos precisar dos limites iniciais e finais da primeira e da última classe.
Para tanto, vamos usar novamente a função de min()
para guardar o valor que começa nossa primeira classe e vamos fazer uma conta básica (o menor valor somado ao número de classes multiplicado pelo tamanho das classes) para guardar o valor que termina nossa última classe. Assim, vamos definir o limite inferior e o limite superior da distribuição.
infclass <- min(preco_webcans)
supclass <- infclass+(k*h)
infclass
[1] 65
supclass
[1] 341
5.Tabela de distribuição de frequências e histograma
Tabela de distribuição de frequências
A tabela de distribuição de frequências relaciona categorias ou classes de valores, juntamente com contagens ou frequências do número de valores que se enquadram em cada categoria de análise.
LEMBRE-SE: no Brasil o intervalo é aberto à direita “├”.
Para informar ao R quais serão as quebras da nossa distribuição usaremos a função seq()
, que gera sequências regulares
brk <-seq(infclass,supclass,h)
brk
[1] 65 111 157 203 249 295 341
Pronto, finalmente, podemos usar a função table()
aliada à função cut()
para construirmos uma tabela de distribuição de frequência absoluta, com intervalos definidos anteriormente. O argumento rigth=FALSE indica que não queremos o intervalo fechado à direita.
tabelaDF_webcans<-table(cut(preco_webcans,breaks = brk, right = FALSE))
tabelaDF_webcans
[65,111) [111,157) [157,203) [203,249) [249,295) [295,341)
8 10 7 2 1 2
Caso você queira importar a tabela pode usar a função write.table
:
write.table(tabelaDF_webcans,"C:/Estatistica/Aula_R/tabelaDF_webcans.txt")
A tabela de distribuição de frequência relativa é obtida facilmente usando a função prop.table()
que retorna as proporções:
tabelaDFR_webcans <- prop.table(tabelaDF_webcans)
tabelaDFR_webcans
[65,111) [111,157) [157,203) [203,249) [249,295) [295,341)
0.26666667 0.33333333 0.23333333 0.06666667 0.03333333 0.06666667
Caso você queria importar a tabela, basta usar a função write.table()
descrita anteriomente.
Histogramas
Para construir os histogramas vamos usar as funções hist()
e a função plot()
. A ideia é usar os argumentos dessas funções para que nossos histogramas sejam desenhados, conforme nossas especificações.
hist(preco_webcans,
main = "Precos webcams",
xlab = "Precos Webcams em R$", ylab = "Freq. Absoluta",
col = c("blue"),
border = c("royalblue"),
breaks = brk,
right = FALSE,
axes = FALSE
)
axis(1, at=seq(infclass,supclass,h))
axis(2, at=seq(0,max(tabelaDF_webcans),2))
Figura 1 - Histograma de Frequência Absoluta
hfri<- hist(preco_webcans,breaks = brk,right = FALSE, plot = F)
hfri$counts <- hfri$counts / sum(hfri$counts)
plot(hfri, freq=TRUE, xlab = "Precos Webcams em R$", ylab="Freq. Relativa", col = c("blue"), axes = FALSE)
axis(1, at=seq(infclass,supclass,h))
axis(2, at=seq(0,max(tabelaDFR_webcans),0.05))
Figura 2 - Histograma de Frequência Relativa
Apenas para comparação,por exemplo, se usassemos apenas:
hist(preco_webcans)
Figura 3 - Histograma de Frequência Absoluta
Agora, vamos fazer uma distribuição de frequência e seu histograma usando um banco de dados.
Lembre-se de verificar o diretório de trabalho usando as funções getwd()
e setwd()
.
A base de dados DADOS_demog1 que você baixou no Classroom está em formato textual, mais especificamente no formato csv, que é uma das formas mais seguras de disponibilização de dados.
ATENÇÃO: o formato csv possui duas variações: csv - os valores são separados por vírgula e os decimais por ponto; csv2 - os valores são separados por ponto e vírgula e os decimais por vírgula. Lembre-se de especificar o formato correto.
É possível importar essa base de dados pela interface, em Environment, ou código.
Para importar a base de dados pela interface, clique em Import Dataset e em seguida em From Text (base)…. Na janela que foi aberta, encontre o arquivo que deseja importar no diretório e clique em Open. Uma janela com opções adcionais será aberta. Você deve selecionar as seguintes opções para importar a base de dados baixada:
Uma pré-visualização estará disponível em Data Frame, onde você pode conferir se a base de dados será importada corretamente. Quando estiver pronto, clique em Import.
Nesse momento o código foi executado no Console, um novo objeto está listado em Environment e uma nova janela foi aberta em Source, que permite a visualização interativa da tabela, de forma semelhante ao Excel.
Embora a interface seja útil para importar dados, para tornar o código reprodutível, é necessário copiar o código que foi executado para o script. Faça isso copiando e colando do Console ou pela aba History.
O código copiado e colado deve ser semelhante ao código abaixo, com alterações apenas no diretório.
dados <- read.csv2('~/DADOS_demog1.csv', encoding="UTF-8", stringsAsFactors = TRUE)
Para visualizar os dados execute a função View()
, com o nome da base de dados como argumento, sem aspas.
View(dados)
Para saber a dimensão do conjunto de dados execute a função dim()
, com o nome da base de dados como argumento, sem aspas.
dim(dados)
[1] 50 7
Para saber o nome das variáveis presentes no conjunto de dados execute a função names()
, com o nome da base de dados como argumento, sem aspas.
names(dados)
[1] "Sujeito" "Genero" "Grau_de_Instrucao" "N_Filhos" "Idade"
[6] "Altura" "Salario"
Para saber a classe de cada variável presente no conjunto de dados execute a função str()
, com o nome da base de dados como argumento, sem aspas.
str(dados)
'data.frame': 50 obs. of 7 variables:
$ Sujeito : int 1 2 3 4 5 6 7 8 9 10 ...
$ Genero : Factor w/ 2 levels "F","M": 2 1 2 2 1 1 2 2 2 2 ...
$ Grau_de_Instrucao: Factor w/ 3 levels "Ens Fundamental",..: 3 3 3 1 2 3 1 3 3 2 ...
$ N_Filhos : int 1 0 0 0 0 2 0 0 1 2 ...
$ Idade : int 31 25 33 20 23 37 38 37 34 40 ...
$ Altura : int 160 160 157 163 163 155 165 168 163 170 ...
$ Salario : num 4.1 2.65 4.7 1.45 1.85 2.2 2.35 2.7 2.9 1.6 ...
Outras funções podem ser interesantes, mas não trabalharemos neste momento com elas, por exemplo:
head()
: exibe as primeiras observações da base de dados no Console.tail()
: exibe as últimas observações da base de dados no Console.summary()
: apresenta um sumário de estatísticas descritivas para todas as variáveis numéricas.which()
: filtrar as observações que satisfazem uma determinada condição.Para variáveis qualitativas (precisam estar como Factor) usaremos a função table()
. Além disso, sempre que quisermos selecionar uma coluna específica (seja ele qualitativa ou quantitativa) usamos “$” após o nome da base de dados.
table(dados$Genero)
F M
25 25
table(dados$Grau_de_Instrucao)
Ens Fundamental Ensino Medio Superior
10 19 21
table(dados$Genero, dados$Grau_de_Instrucao)
Ens Fundamental Ensino Medio Superior
F 3 11 11
M 7 8 10
prop.table(table(dados$Genero))
F M
0.5 0.5
prop.table(table(dados$Grau_de_Instrucao))
Ens Fundamental Ensino Medio Superior
0.20 0.38 0.42
prop.table(table(dados$Genero, dados$Grau_de_Instrucao))
Ens Fundamental Ensino Medio Superior
F 0.06 0.22 0.22
M 0.14 0.16 0.20
Para variáveis quantitativas (precisam estar como int ou num) seguiremos, praticamente, os mesmos passos realizados no CASO 1, mudando apenas a forma como invocamos a variável de interesse, ou seja, usando o “$” para selecionar a coluna em que estão os dados que queremos analisar.
DICA: se a variável for quantitativa discreta e possuir um número baixo de valores possíveis, você pode usar as mesmas instruções apresentadas anteriormente para as variáveis qualitativas. Por exemplo, no caso do número de filhos que varia entre 0 a 4.
1.Ordenar os dados (não se aplica)
2.Amplitude
Podemos confirmar na função range()
a amplitude do conjunto de dados e depois com as função max()
e min()
calcular a amplitude total (AT) do conjunto de dados:
range(dados$Salario)
[1] 1.00 5.85
AT <- ceiling((max(dados$Salario)- min(dados$Salario)))
AT
[1] 5
3. Número de classes
Para identificar o número de elementos no conjunto de dados podemos usar a função dim()
que retorna a dimensão de um objeto do tipo matrix, array ou data frame.
dim(dados)
[1] 50 7
Portanto, usaremos a regra de Sturges:
k <- nclass.Sturges(dados$Salario)
k
[1] 7
4. Tamanho da classe
Para encontrar o tamanho de cada classe (ou a amplitude de classe) (h) usaremos as funções de arredonadameno simples com uma casa decimal e o operador matemático de divisão:
h <- round((AT/k),1)
h
[1] 0.7
Por fim, como queremos construir a tabela de distribuição de frequência e o histograma a partir da convenção estatística definida, vamos precisar dos limites iniciais e finais da primeira e da última classe.
Para tanto, vamos usar novamente a função de min()
para guardar o valor que começa nossa primeira classe e vamos fazer uma conta básica (o menor valor somado ao número de classes multiplicado pelo tamanho das classes) para guardar o valor que termina nossa última classe. Assim, vamos definir o limite inferior e o limite superior da distribuição.
infclass <- min(dados$Salario)
supclass <- infclass+(k*h)
infclass
[1] 1
supclass
[1] 5.9
5.Tabela de distribuição de frequências e histograma
Tabela de distribuição de frequências
A tabela de distribuição de frequências relaciona categorias ou classes de valores, juntamente com contagens ou frequências do número de valores que se enquadram em cada categoria de análise.
LEMBRE-SE: no Brasil o intervalo é aberto à direita “├”.
Para informar ao R quais serão as quebras da nossa distribuição usaremos a função seq()
, que gera sequências regulares
brk <-seq(infclass,supclass,h)
brk
[1] 1.0 1.7 2.4 3.1 3.8 4.5 5.2 5.9
Pronto, por fim, podemos usar a função table()
aliada à função cut()
para construirmos uma tabela de distribuição de frequência absoluta, com intervalos definidos anteriormente. Não se esqueça do argumento rigth=FALSE, não queremos o intervalo fechado à direita.
tabelaDF_salarios<-table(cut(dados$Salario,breaks = brk, right = FALSE))
tabelaDF_salarios
[1,1.7) [1.7,2.4) [2.4,3.1) [3.1,3.8) [3.8,4.5) [4.5,5.2) [5.2,5.9)
5 13 11 10 6 2 3
Sugiro fortemente você conferir se sua tabela está contemplando todos os dados, basta usar a função sum()
e verificar se a soma é igual ao número de elementos. Caso não esteja correto, volte e verifique se nenhum dado ficou de fora, geralmente, os arredondamentos são suficientes para evitar esse problema.
sum(tabelaDF_salarios)
[1] 50
Se você quiser importar a tabela pode usar a função write.table
como fizemos no CASO 1.
A tabela de distribuição de frequência relativa é obtida facilmente usando a função prop.table()
que retorna as proporções:
tabelaDFR_salarios <- prop.table(tabelaDF_salarios)
tabelaDFR_salarios
[1,1.7) [1.7,2.4) [2.4,3.1) [3.1,3.8) [3.8,4.5) [4.5,5.2) [5.2,5.9)
0.10 0.26 0.22 0.20 0.12 0.04 0.06
sum(tabelaDFR_salarios)
[1] 1
*** 1, porque é 100%.
Caso você queria importar a tabela, basta usar a função write.table()
descrita anteriomente.
Histogramas
Aqui também seguimos as instruções realizadas no CASO 1, alterando apenas o comando para selecionar a coluna de interesse na base de dados.
hist(dados$Salario,
main = "Salarios",
xlab = "Salarios_SM", ylab = "Freq. Absoluta",
col = c("red"),
border = c("pink"),
breaks = brk,
right = FALSE,
axes = FALSE
)
axis(1, at=seq(infclass,supclass,h))
axis(2, at=seq(0,max(tabelaDF_2),2))
Figura 4 - Histograma de Frequência Absoluta
hfri<- hist(dados$Salario,breaks = brk,right = FALSE, plot = F)
hfri$counts <- hfri$counts / sum(hfri$counts)
plot(hfri, freq=TRUE, xlab = "Salarios_SM", ylab="Freq. Relativa", col = c("blue"), axes = FALSE)
axis(1, at=seq(infclass,supclass,h))
axis(2, at=seq(0,max(tabelaDF_2),0.05))
Figura 5 - Histograma de Frequência Relativa
Apenas para comparação,por exemplo, se usassemos apenas:
hist(dados$Salario)
Figura 6 - Histograma de Frequência Relativa