Vetor de dados

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 operadores <- 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.

Ordenação dos dados

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

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

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

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

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.

Histograma de frequência absoluta

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

Histograma de frequência relativa

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

Banco de dados

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().

Importar banco de dados

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:

  • Encoding: UTF-8 (Codificação: UTF-8)
  • Heading: Yes (Cabeçalho: Sim)
  • Separator: Semicolon (Separador: ponto e vírgula)
  • Decimal: Comma (Decimal: vírgula)
  • StringsAsFactors: selecionar

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.

Variáveis qualitativas

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.

  • Frequências absolutas:
table(dados$Genero)
 F  M 
25 25 
table(dados$Grau_de_Instrucao)
Ens Fundamental    Ensino Medio        Superior 
             10              19              21 
  • Tabela cruzada com frequências absolutas:
table(dados$Genero, dados$Grau_de_Instrucao)
    Ens Fundamental Ensino Medio Superior
  F               3           11       11
  M               7            8       10
  • Frequências relativas:
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

Variáveis quantitativas

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.

  • Frequências absolutas:

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.

  • Frequência Absoluta
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.

  • Frequência Relativa

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.

  • Histograma de frequência absoluta
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

Histograma de frequência relativa

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

O histograma pode ser criado usando a hist()função na linguagem de programação R. Esta função recebe um vetor de valores para os quais o histograma é plotado.

Vamos usar o conjunto de dados integrado airqualityque possui medições diárias da qualidade do ar em Nova York, de maio a setembro de 1973. -R documentação.

> str(airquality)
'data.frame':	153 obs. of  6 variables:
$ Ozone  : int  41 36 12 18 NA 28 23 19 8 NA ...
$ Solar.R: int  190 118 149 313 NA NA 299 99 19 194 ...
$ Wind   : num  7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp   : int  67 72 74 62 56 66 65 59 61 69 ...
$ Month  : int  5 5 5 5 5 5 5 5 5 5 ...
$ Day    : int  1 2 3 4 5 6 7 8 9 10 ...

Usaremos o parâmetro de temperatura que possui 154 observações em graus Fahrenheit.


Exemplo 1: histograma simples

Temperature <- airquality$Temp
hist(Temperature)

Histograma simples em programação R

Podemos ver acima que existem 9 células com intervalos igualmente espaçados. Neste caso, a altura de uma célula é igual ao número de observações que caem nessa célula.

Podemos passar parâmetros adicionais para controlar a aparência do nosso gráfico. Você pode ler sobre eles na seção de ajuda ?hist.

Alguns dos mais usados ​​são, mainpara dar o título, xlabylabfornecer rótulos para os eixos, xlimylimfornecer alcance dos eixos, coldefinir cores, etc.

Além disso, com o argumento freq=FALSEpodemos obter a distribuição de probabilidade em vez da frequência.


Exemplo 2: histograma com parâmetros adicionados

# histogram with added parameters
hist(Temperature,
main="Maximum daily temperature at La Guardia Airport",
xlab="Temperature in degrees Fahrenheit",
xlim=c(50,100),
col="darkmagenta",
freq=FALSE
)

Crie Histograma em R com parâmetros como cor.

Observe que o eixo y é rotulado como densidade em vez de frequência. Neste caso, a área total do histograma é igual a 1.


Valor de retorno de hist()

hist()função retorna uma lista com 6 componentes.

> h <- hist(Temperature)
> h
$breaks
[1]  55  60  65  70  75  80  85  90  95 100
$counts
[1]  8 10 15 19 33 34 20 12  2
$density
[1] 0.010457516 0.013071895 0.019607843 0.024836601 0.043137255
[6] 0.044444444 0.026143791 0.015686275 0.002614379
$mids
[1] 57.5 62.5 67.5 72.5 77.5 82.5 87.5 92.5 97.5
$xname
[1] "Temperature"
$equidist
[1] TRUE
attr(,"class")
[1] "histogram"

Vemos que histogramé retornado um objeto de classe que possui:

  • breaks- locais onde ocorrem as quebras,
  • counts- o número de observações que caem nessa célula,
  • density-a densidade das células, mids-os pontos médios das células,
  • xname-o nome do argumento x e
  • equidist-um valor lógico que indica se as quebras são igualmente espaçadas ou não.

Podemos usar esses valores para processamento adicional.

Por exemplo, no exemplo a seguir, usamos os valores de retorno para colocar as contagens no topo de cada célula usando a text()função.


Exemplo 3: Use valores de retorno de histograma para rótulos usando text()

h <- hist(Temperature,ylim=c(0,40))
text(h$mids,h$counts,labels=h$counts, adj=c(0.5, -0.5))

Histograma com valor de retorno de texto


Definindo o número de pausas

Com o breaksargumento podemos especificar o número de células que queremos no histograma. No entanto, este número é apenas uma sugestão.

R calcula o melhor número de células, mantendo esta sugestão em mente. A seguir estão dois histogramas nos mesmos dados com diferentes números de células.


Exemplo 4: Histograma com quebras diferentes

hist(Temperature, breaks=4, main="With breaks=4")
hist(Temperature, breaks=20, main="With breaks=20")

R Histograma Com Quebra

Na figura acima vemos que o número real de células plotadas é maior do que havíamos especificado.

Também podemos definir pontos de interrupção entre as células como um vetor. Isso torna possível traçar um histograma com intervalos desiguais. Nesse caso, a área da célula é proporcional ao número de observações que caem dentro dessa célula.


Exemplo 5: Histograma com largura não uniforme

hist(Temperature,
main="Maximum daily temperature at La Guardia Airport",
xlab="Temperature in degrees Fahrenheit",
xlim=c(50,100),
col="chocolate",
border="brown",
breaks=c(55,60,70,75,80,100)
)

R histograma com larguras diferentes