You are on page 1of 71

Prof Adenilson adenilson.rocha@gmail.

com
Índice
Assunto Pág.
1 Introdução .............................................................................................................................................. 002
1.1 O que é Estatística? ................................................................................................................. 002
1.2 O que é R-project? ................................................................................................................. 002
1.3 Baixando e instalando o R-project .......................................................................................... 003
2 Módulo Básico do R .............................................................................................................................. 009
2.1 Entendendo a Ajuda no R ....................................................................................................... 009
2.2 Cálculos e Funções ................................................................................................................. 013
2.3 Como o R armazena Objetos e Comandos ............................................................................. 015
2.4 Tipos de Objetos ..................................................................................................................... 019
2.4.1 Vetores .................................................................................................................... 019
2.4.2 Matrizes ................................................................................................................... 024
2.4.3 Array........................................................................................................................ 027
2.4.4 Data Frames............................................................................................................. 029
3 Módulo Entrada e Saída de Dados ......................................................................................................... 035
3.1 Saída de Dados ....................................................................................................................... 035
3.2 Entrada de Dados ................................................................................................................... 036
3.3 Saída de Resultados ............................................................................................................... 036
3.4 Pacote xlsReadWrite .............................................................................................................. 039
4 População, amostra, variável, coleta e apuração de dados .................................................................... 043
4.1 Elementos estatísticos para análise exploratória de dados ..................................................... 043
4.2 Níveis de Mensuração ............................................................................................................ 043
4.3 Escalas Numéricas ................................................................................................................. 043
4.4 Tópicos iniciais de amostragem ............................................................................................. 044
4.5 Apuração de Dados ................................................................................................................ 046
4.6 Apresentação tabular .............................................................................................................. 047
4.7 Tabelas de dupla entrada ou de contingência ......................................................................... 048
4.8 Apresentação gráfica .............................................................................................................. 051
5 Estudo de Medidas ................................................................................................................................. 061
5.1 Medidas de Tendência Central ou de Posição ........................................................................ 061
5.1.1 Definição ................................................................................................................ 061
5.1.2 Medidas para Dados não Grupados ........................................................................ 061
5.1.2.1 Média ...................................................................................................... 061
5.1.2.2 Média Aritmética Simples ...................................................................... 061
5.1.2.3 Moda ....................................................................................................... 062
5.1.2.4 Mediana .................................................................................................. 062
5.1.3 Medidas de Dados Grupados .................................................................................. 063
5.1.3.1 Média Aritmética .................................................................................... 063
5.1.3.2 Mediana .................................................................................................. 066
5.1.3.3 Moda ....................................................................................................... 067
5.2 Medidas de dispersão ............................................................................................................. 068
5.2.1 Valores mínimos e máximos .................................................................................. 068
5.2.2 Amplitude de Variação ........................................................................................... 068
5.2.3 Amplitude interquartílica ou Distância entre quartis (DEQ) .................................. 068
5.2.4 Variância ................................................................................................................. 069
5.2.5 Desvio padrão ......................................................................................................... 070
5.2.6 Coeficiente de variação de Pearson ........................................................................ 070
6 Análise Exploatória de Dados ................................................................................................................ 071
6.1 Diagrama de Ramo e Folhas (Stem and Leaf Plot) ................................................................ 072
6.2 Histograma ............................................................................................................................. 081
6.3 Esquema de cinco números .................................................................................................... 085
6.4 Boxplot (desenho de caixa e bigode) ..................................................................................... 087
6.5 Reta Resistente ....................................................................................................................... 093
1 Introdução
1.1 O que é Estatística?
O que modernamente se conhece como Ciências Estatísticas, ou simplesmente Estatística, é um conjunto
de técnicas e métodos de pesquisa que entre outros tópicos envolve o planejamento do experimento a ser
realizado, a coleta qualificada dos dados, a inferência, o processamento, a análise e a disseminação das
informações.
O desenvolvimento e o aperfeiçoamento de técnicas estatísticas de obtenção e análise de informações
permite o controle e o estudo adequado de fenômenos, fatos, eventos e ocorrências em diversas áreas do
conhecimento. A Estatística tem por objetivo fornecer métodos e técnicas para lidarmos, racionalmente,
com situações sujeitas às incertezas.
1.2 O que é o R-project?
Ou simplesmente R é um sistema desenvolvido a partir da linguagem S (que também é usada numa
versão comercial – o S-Plus), que tem duas origens nos laboratórios da AT & T no final dos anos 80. Em
1995 dois professores de estatística da universidade de Auckland, na Nova Zelândia, iniciaram o “Projeto
R”, com o intuito de desenvolver um programa estatístico poderoso baseado em S, e de domínio público.
Dúvidas mais comuns sobre o R:
Com o R posso utilizar menus para fazer análise estatística, como no SPSS, SAS e S-Plus?
Não. O R em versão para Windows é até provido de menus, mas todos são usados para realizar tarefas
não estatísticas (como atualizar a versão ou salvar um gráfico). Todas as funções estatísticas que
acompanham o R devem ser chamadas a partir do cursor do programa (seja digitando um comando ou
copiando e colando um comando previamente digitado).
O fato do R não possuir menus não seria uma desvantagem em relação a outros pacotes
estatísticos?
Depende. Muitos irão certamente interpretar esse fato como uma desvantagem, mas, na verdade, esta é
uma vantagem forte do R. A utilização do R para analisar estatísticas exige muito mais do que simples
apertar de botões em série e dar alguns cliques no mouse: para trabalhar dados do R é preciso PENSAR e
ENTENDER o que está fazendo. Ao contrário de muitos pacotes estatísticos clássicos, o R permite uma
grande flexibilidade em relação às funções estatísticas pré-existentes, isto é, elas são “editáveis”, além da
possibilidade de você mesmo poder criar as suas próprias funções personalizadas (como será mostrado
mais tarde).
Quanto custa para ter uma cópia do R?
Não custa nada: ele é gratuito, ou seja, ninguém precisa gastar US$ 1.349, o que seria necessário para
comprar o módulo básico do SPSS, por exemplo; nem ser obrigado a cometer um pequeno delito para
usar o R.
Se ninguém está ganhando dinheiro para manter o R atualizado, como posso ter certeza que se
trata de um produto confiável?
Está é uma outra vantagem do R: o Projeto R é de uma colaboração internacional de vários pesquisadores
que se comunicam através de uma eficiente lista de discussão pela Internet. Com isso, não só “bugs”
(defeitos de programação) são detectados e corrigidos, como também novos módulos contendo métodos
estatísticos recentemente implementados são regularmente disponibilizados e atualizados na rede.
O que são esses módulos adicionais?
Os módulos adicionais funcionam da seguinte forma: um pesquisador em algum lugar do mundo
precisou desenvolver uma aplicação numa área que não é coberta nem pelo módulo básico nem pelos
módulos de colaboradores existentes. O que esse pesquisador faz é desenvolver o que é chamada de uma
biblioteca para o R com as funções que ele criou e utilizou, disponibilizando-as na rede. A vantagem é

2
que a biblioteca pode ser usada por diferentes pessoas, que irão eventualmente reportar erros nas funções,
que podem então ser atualizadas pelo seu criador.
Que plataformas (sistemas operacionais) suportam o R?
Atualmente o R está disponível para a família UNIX (incluindo LINUX), a maior parte dos Mac OS e
ainda Windows.
Onde posso conseguir o R?
O R está disponível na Internet no website do CRAN – que é o Comprehensive R Archive Network ou
“Rede completa de Arquivos do R”, no seguinte endereço:
http://www.r-project.org/

1.3 Baixando e Instalando o R


Digite o endereço do site: http://www.r-project.org/
Vai abrir esta tela.
Clique na opção CRAN em Download.

3
Em seguida clique na opção Brazil, preferencialmente na Universidade Federal do Paraná

4
Clique agora na opção Windows

5
Clique agora em base

6
Finalmente clique em Download R 2.9.1 for Windows, para baixar o executável do programa.

7
Para começar o processo de instalação basta clicar no arquivo executável do R e proceder à instalação
passo a passo como em qualquer programa.

8
2 Módulo Básico do R
Pré-requisitos: Por se tratar de um módulo básico, não existem pré-requisitos.
Pacotes e arquivos necessários: Nenhum.
Material extra: Qualquer mídia regravável para salvar o seu trabalho.
Este módulo tem por objetivo apresentar as características básicas de funcionamento do R e introduzir o
aluno a um primeiro contato com o ambiente R, sem referência específica a um tópico de estatística. Por
ora, assumimos que o R já está instalado no seu computador, e que um ícone já aparece na área de
trabalho. Para iniciar uma sessão do R, dê um duplo-clique no ícone do R que deve estar localizado na
sua área de trabalho. Uma vez iniciado o programa, uma janela contendo o prompt de comando é aberta:

Prompt de
Comando

Observe que há uma janela dentro do programa com o prompt de comando. As saídas não gráficas no R
aparecerão nesta mesma janela enquanto que as gráficas serão geradas em uma janela separada.
2.1 Entendendo a Ajuda do R
Qual é o conhecimento fundamental que uma pessoa que deseja saber usar qualquer programa de
computador deve ter? A resposta seria contundente: o que diferencia a capacidade de um usuário se
tornar familiarizado com qualquer software é a capacidade de usar de maneira racional e eficiente a
ajuda desse programa. O R possui diversas formas diferentes de obter ajuda sobre o programa em geral e
ainda sobre funções e conjuntos de dados disponíveis.
Uma característica muito útil do R é sem dúvida nenhuma a ajuda baseada em HTML que ele possui. O
R tem uma ajuda que pode ser acessada através do seu browser favorito. Para quem não sabe, browser é
aquele programa que você usa para navegar na internet, como o Internet Explorer ou o Netscape, para
citar os mais usados.
Para acessar essa ajuda, clique na barra de menus em Ajuda e, em seguida, Ajuda Html, como na figura
abaixo:

9
Ao fazer isso, o seu browser será automaticamente executado e a página inicial da ajuda vai aparecer na
sua tela. Você verá algo assim:

O grupo de links que dizem respeito à ajuda do R é o de referências (Reference). O link de Packages vai
levar você à pagina com todos os pacotes que estão instalados na sua máquina, além é claro do pacote
base (que é o pacote básico do R que é automaticamente instalado quando você instala o R). Ao clicar
em cada um dos links com os nomes dos pacotes, você será levado então a uma página com todas as
funções e bancos de dados que compõem o pacote.

10
O segundo link em interesse para nós aqui é o de Search Engine & Keywords, algo como “Ferramenta de
Procura e Palavras-chave”.
Ao clicar neste segundo link você encontrará a seguinte tela que está dividida em duas partes: Search e
Keywords.

Na primeira parte podemos procurar uma ou mais palavras que estejam no título das páginas de ajuda
(Help page titles), por palavras-chave (Keywords) ou pelo nome de funções ou objetos (Object names).
Vamos experimentar procurar ajuda sobre como fazer um gráfico de barras. Digite, em inglês claro,
barplot e clique no botão Search ou aperte somente a tecla enter no seu teclado. O help HTML abrirá
outra página com uma lista de comandos e uma pequena descrição do que cada uma delas faz. Clique no
nome do comando e outra janela será aberta com todos os detalhes do respectivo comando.

11
No canto superior esquerdo encontramos o nome do comando e entre chaves o nome do pacote não qual
este comando se encontra (mas a frente vamos entender um pouco melhor sobre o tópico pacotes). Esta
janela é composta por 7 ítens:
1. Description (Descrição)
Descreve o que o comando faz
2. Usage (Sintaxe – forma de uso)
Mostra como devemos usar o comando, quais os seus argumentos e respectivos valores padrões.
3. Arguments
Descreve cada argumento listado na sintaxe do comando.
4. Details (Detalhes)
Descreve com um pouco mais de detalhe o comando e/ou argumentos.
5. Value (Valores)
Descreve o que o comando retorna.
6. See Also (Ver também)
Cita alguns comandos que tenham alguma ligação com o comando em questão.
7. Examples (Exemplos)
Exemplifica o comando. Podemos selecionar os comandos listados no exemplo, depois colar e copiar na
janela do R para executá-los.
A segunda parte da tela Keyword lista diversos links por assunto. Ao clicar em um desses links uma
janela será aberta com todos os comandos relacionados aquele assunto. Este tópico é muito útil quando
avançamos na utilização do R.
A partir deste ponto, vamos começar a discutir coisas que são feitas no R propriamente dito. Isto consiste
basicamente em entrar comandos no prompt de comando, que já foi apresentado anteriormente. O aluno
tem duas opções para conferir as saídas aqui apresentadas no R: ou escreve a partir do teclado o mesmo
comando apresentado, ou então copia e cola o comando no R. Para copiar, basta marcar o texto com o
mouse e então pressionar a tecla Ctrl seguida da tecla c no seu teclado. Para colar, pressione a tecla Ctrl
seguida da tecla v no seu teclado. Para isso, evidentemente você deve ter o programa onde você está
12
lendo este material aberto e também o R, alternando entre um e outro. Um detalhe importante deve ser
mencionado de uma vez: o prompt do R, como você já deve ter notado, começa com o símbolo de maior
(“>”). Sempre que neste material o comando for mostrado juntamente com a saída correspondente, o
sinal “>” estará também no texto, como nesse primeiro exemplo abaixo:
> 3+7
[1] 10

Se você quiser copiar e colar esse comando de soma de dois números no R, NÃO COPIE O SINAL DE
MAIOR, pois se o fizer, você receberá uma mensagem de erro. Veja só:
> > 3+7
Erro: unexpected '>' in ">"

E, claro, não copie a saída também, só o comando. Às vezes depois de colar, você deverá pressionar a
tecla enter no teclado para o R executar o comando. É claro que você é livre para copiar o que quiser,
mas sempre que a recomendação for copiar e colar, os comandos virão sem o símbolo “>” antes do
comando.
2.2 Cálculos e Funções
Vamos iniciar mostrando o R como calculadora. Por exemplo, tente fazer uma conta simples:
> 3+7
[1] 10

Repare que o resultado da operação é precedido por um [1]. Isto é apenas para indicar que o resultado
“10” é o primeiro (e nesse caso único) elemento retornado pelo programa. Bem, essa é uma excelente
deixa para dizer que o R pode funcionar como uma calculadora, como a que você já deve ter usado em
cursos passados. Porque a gente não experimenta outras operações simples?
Tente:
> 3-7
[1] -4
> 3*7
[1] 21
> 3/7
[1] 0.4285714
> 3^7
[1] 2187

Como em outros programas (como por exemplo: Excel), os operadores matemáticos simples são “+”, “-”,
“*”, “/” e “^” – este último para potenciação. Você pode estar se perguntando agora, depois de algumas
aulas de matemática: como é o inverso do operador potência? Ou melhor, como descobrir a que potência
um certo número foi elevado para obtermos um determinado resultado?
Bom, nesse caso temos que lançar mão de uma função, já que como você deve se lembrar o operador
inverso da potenciação é a função logarítmica. Recordando:
Se 37=2187 → log3 (2187) = 7 , ou seja, o logaritmo de 2187 na base 3 é igual a 7.
Agora usando o R:
> log(2187, base=3)
[1] 7

Vamos aproveitar esse exemplo para explicar algumas características básicas das funções disponíveis no
R. Todas têm a forma:
> função (argumento(s) obrigatório(s), argumento(s) opcional(is))

Sendo que os argumentos opcionais podem ter um valor padrão pré-estabelecido ou não. Os argumentos
estarão sempre entre parênteses sendo separados por vírgula. Se você deixar o primeiro argumento em
branco, vai receber uma mensagem de erro:
> log(, base=3)
Erro em log(, base = 3) : Argumento não-numérico para função matemática

13
Repare que o programa já indica que o argumento (que ele chama de “x”) obrigatório não foi fornecido e
que não existe nenhum padrão (default). Agora, deixe o segundo argumento em branco:
> log(2187,)
[1] 7.690286

Dessa vez não houve mensagem de erro, mas o resultado é diferente do que a gente obteve anteriormente.
Se não houve queixa do programa quanto ao segundo argumento, ele deve ter um default pré-
estabelecido. Por que esse default seria 3? Vamos descobrir, aproveitando para aprender a consultar a
ajuda do R? Por que não tentamos assim:
> ?log

Note que uma nova janela se abriu dentro do próprio R com a informação de ajuda sobre a função “log”.
É fácil observar que o R possui vários tipos de ajuda; se preferir, abra a ajuda em HTML e procure pela
função “log”. De qualquer modo, se você olhar a entrada “Usage”, na página de ajuda sobre o “log”, vai
ver:
log(x, base = exp(1))

Isso quer dizer que a função log() precisa de um argumento x que não tem default e também de um
argumento base que tem um valor pré-estabelecido, exp(1) que nada mais é que o número e
(conhecido como algarismo Neperiano e aproximadamente igual ao valor 2.718282).
Testando:
> exp(1)
[1] 2.718282

Vamos conferir então se foi isso mesmo que aconteceu. Vamos tentar assim:
> log(2187, base=2.718282)
[1] 7.690286

A próxima pergunta que você pode estar fazendo é se existe uma maneira de economizar digitação
omitindo o argumento base =. A resposta é sim, neste caso. Vamos tentar:
> log(2187, 3)
[1] 7

Neste caso deu certo porque a função só tem 2 argumentos possíveis e eles foram digitados na ordem
certa. Se você trocar a ordem, o resultado é diferente:
> log(3,2187)
[1] 0.1428571

Se você trocar a ordem, porém especificando quem é quem, não haverá confusão:
> log(base=3,2187)
[1] 7

Concluímos então, que é sempre melhor especificarmos o que estamos escrevendo.


Vamos aproveitar e ver rapidamente algumas funções bastante usadas no R. Veja a tabela abaixo:
Função Descrição
sqrt() raiz quadrada
abs() valor absoluto
exp() exponencial
log10() logaritmo na base 10
log() logaritmo na base e
sin() cos() tan() funções trigonométricas
asin() acos() atan() funções trigonométricas inversas

Para descobrirmos como estas funções funcional podemos usar a ajuda do R:


> help(sqrt)

14
Vai se abrir uma janela de ajuda que na verdade é genérica para a função “abs()” também. Esperamos
que você tenha percebido que esta é uma forma alternativa de chamar a ajuda (em vez de ?sqrt).
Valores faltantes e especiais
• NA Not Available, denota dados faltantes. Note que deve utilizar maiúsculas.
• NaN Not a Number, denota um valor que não é representável por um número.
• Inf e –Inf, mais ou menos infinito.
Vejamos no exemplo abaixo alguns resultados que geram estes valores especiais.
> c(-1, 0, 1)/0
[1] -Inf NaN Inf

2.3 Como o R armazena Objetos e Comandos


Objeto para o R significa tanto um banco de dados quanto a saída de uma função ou até mesmo uma
fórmula. Para criar um objeto no R, seja ele qual for, você deverá sempre usar o operador de asignment
(<-), apontando para o nome de um objeto. Por exemplo, para criar o objeto x com o valor 3, faça assim
no R:
> x <- 3

O que fizemos foi colocar o número 3 em um objeto chamado x usando o operador assignment (<-).
Este objeto pode então ser chamado e seu conteúdo revelado, simplesmente digitando o seu nome:
> x
[1] 3

É ainda desejável, e as vez crucial, evitar ainda outros nomes que sejam de objetos do sistema (em geral
funções, ou constantes tais como o número π) como, por exemplo:
c q s t C D F I T diff exp log mean pi range rank var

Nomes reservados
O R, como qualquer outra linguagem, possui nomes reservados, isto é, nomes que não podem ser
utilizados para objetos por terem um significado especial na linguagem. São eles:
FALSE Inf NA NaN NULL TRUE break else for function if in next repeat while

15
Valores especiais revisitados
Vimos anteriormente os valores especiais NA, NaN e Inf. Estes valores podem ser atribuídos a objetos ou
elementos de um objeto e pode-se ainda testar a presença destes valores em objetos ou seus elementos.
No exemplo a seguir definimos um vetor de valores e verificamos que o objeto criado não contém
nenhum destes valores especiais. Note neste exemplo o uso do caracter ! que indica negação. As funções
do tipo is.*() testam cada valor do vetor individualmente enquanto que any() verifica a presença de
algum valor que satisfaça a condição e all() verifica se todos os valores satisfazem a condição.
> x <- c(23, 34, 12, 11, 34)
> is.na(x)
[1] FALSE FALSE FALSE FALSE FALSE
> !is.na(x)
[1] TRUE TRUE TRUE TRUE TRUE
> is.nan(x)
[1] FALSE FALSE FALSE FALSE FALSE
> is.finite(x)
[1] TRUE TRUE TRUE TRUE TRUE
> !is.finite(x)
[1] FALSE FALSE FALSE FALSE FALSE
> any(!is.finite(x))
[1] FALSE
> all(is.finite(x))
[1] TRUE

A seguir vamos substituir o terceiro dado 12 pelo código de dado faltante. Note ainda que operações
envolvendo NA tipicamente retornam valor NA o que faz sentido uma vez que o valor não pode ser
determinado, não está disponível.
> x[3] <- NA
> x
[1] 23 34 NA 11 34
> is.na(x)
[1] FALSE FALSE TRUE FALSE FALSE
> any(is.na(x))
[1] TRUE
> all(is.na(x))
[1] FALSE
> x + 5
[1] 28 39 NA 16 39
> x/10
[1] 2.3 3.4 NA 1.1 3.4
> mean(x)
[1] NA

Agora vamos ver outros valores especiais.


> x1 <- (x - 34)/0
> x1
[1] -Inf NaN NA -Inf NaN
> is.finite(x1)
[1] FALSE FALSE FALSE FALSE FALSE
> !is.finite(x1)
[1] TRUE TRUE TRUE TRUE TRUE
> is.nan(x1)
[1] FALSE TRUE FALSE FALSE TRUE

Quando você usa um editor de texto como o Word, por exemplo, e você salva o seu trabalho pela
primeira vez, o programa pede para você dar um nome ao seu arquivo e o salva fisicamente em um
diretório (que em geral é em “Meus Documentos” – “My Documents” se versão em inglês). Uma vez
salvo, aquele único arquivo estará naquela localidade com o nome que você deu e portanto você poderá
abri-lo no Word para futura edição ou para imprimir, etc.
O R trabalha um pouco diferente. Na verdade, quando você cria uma série de objetos, eles podem ser
salvos também, porém EM GRUPO, ou seja, o R salva TODOS OS OBJETOS num mesmo arquivo.
Mais tarde, você poderá abrir este arquivo e trabalhar com TODOS os objetos que foram salvos.
16
Você deve estar se perguntando se isso não vai atrapalhar muito a sua vida. Depende. Apesar do R salvar
o arquivão com o mesmo nome sempre (“.RData”), você pode salvá-lo com um nome diferente (mas
mantendo a extensão) em diretórios (ou pastas). A vantagem é que você pode armazenar todos os objetos
relativos a um determinado projeto num diretório próprio do projeto.
Uma questão que deve ficar clara é que o R vai armazenar temporariamente todos os objetos que foram
criados em uma sessão de trabalho e posteriormente salvá-los definitivamente no arquivo “.RData”; mas
repare que serão salvos os OBJETOS, ou seja, tudo o que você guardou usando o símbolo de assignment
(<-). Isso quer dizer que saídas de fórmulas, funções e dados externos serão armazenados como objetos
(desde que designados para algum objeto com o símbolo <-), mas não as saídas na tela ou os gráficos
gerados por funções. Mais tarde você vai aprender a salvar essas saídas de um modo mais conveniente.
Vamos ver um exemplo. Iremos salvar o nosso arquivo no pendrive.
Primeiro, vamos fazer com que o R mude o diretório de trabalho (que em geral é configurado para ser
"C:\\Program Files\R\rwXXXX" Faça assim:
 Na barra de menus do R, clique em “Arquivo” e em seguida em “Mudar dir”

 Uma pequena janela chamada “Choose directory” se abrirá. Clique em “Meu computador”

17
 A janela “Procurar pasta” se abrirá. Selecione o drive.

 Clique em “OK” e em “OK” novamente na outra janela.


Agora o nosso diretório de trabalho é o drive escolhido, assim, podemos salvar a nossa sessão inteira no
pendrive
 Vá em “Arquivo” de novo, mas clique em “Salvar área de trabalho”
18
 Note que o arquivo “.RData” está para ser salvo no nosso pendrive
 Clique “Save”
Agora, experimente salvá-lo com outro nome, mas não se esquecendo de manter a extensão .Rdata
(exemplo: “aluno.Rdata”). Quando você encerra uma sessão do R ele sempre pergunta se você deseja
salvar as alterações, o que significa salvar todos os objetos novos que foram criados naquela sessão.
Uma outra característica do R é a capacidade de armazenar um histórico de comandos usados
anteriormente. Como no caso dos objetos, o R armazena esses comandos num arquivo que tem a
extensão “.Rhistory”, também sem nome por default (e que também pode ser modificado, mantendo-se a
extensão). Esse arquivo é na verdade um ASCII que contém todos os comandos que você salvou na sua
última sessão. É claro que você pode editar esse arquivo, salvar com um nome diferente, etc.
O funcionamento do histórico é o seguinte: Na primeira vez que você salvar o seu workspace, o R vai
automaticamente salvar no mesmo diretório um arquivo com o histórico; se na próxima vez que você
executar o R ele encontrar um arquivo “.Rhistory” na mesma pasta onde está o arquivo “.RData”, ele vai
carregar automaticamente esse arquivo. Caso contrário, você terá que carregá-lo manualmente, através do
menu “Arquivo” e depois “Carregar histórico”. Um detalhe importante é que caso você tenha carregado
um arquivo de histórico (seja automaticamente ou manualmente), quando você salvar o histórico no final
da sessão, o R vai acumular os comandos dessa sessão com os comandos previamente salvos.
Por fim, uma vez que você tenha salvo o seu workspace, seja no disquete, seja em outro diretório
qualquer, da próxima vez que for usá-lo, basta dar um duplo-clique no arquivo mesmo (a partir do
Windows Explorer, por exemplo), que o R será automaticamente executado o workspace carregado.
2.4 Tipos de objetos
Os tipos básicos de objetos do R são:
• vetores
• matrizes e arrays
• data-frames
Experimente os comandos listados para se familiarizar com estas estruturas. Note que usamos as funções
do tipo is.*() para testar se um objeto é de um determinado tipo. Estas funções são:
is.vector(), is.matrix(), is.array()e is.data.frame().

2.4.1 Vetores
Vetores são o tipo básico e mais simples de objeto para armazenar dados no R. O R é uma linguagem
vetorial, e portanto capaz de operar vetores e matrizes diretamente sem a necessidade de ”loops”.
Nos exemplo a seguir mostramos algumas operações com vetores. A função c() (”c” de concaternar) é
usada para criar um vetor. Os colchetes [ ] são usados para indicar seleção de elementos.
As funções rep(), seq() e o símbolo ":" são usadas para facilitar a criação de vetores que tenham
alguma lei de formação.
> x1 <- 10
> x1
[1] 10
> x2 <- c(1, 3, 6)
> x2
[1] 1 3 6
> x2[1]
[1] 1
> x2[2]
[1] 3
> length(x2)
[1] 3
> is.vector(x2)
[1] TRUE
> is.matrix(x2)
[1] FALSE

19
> is.numeric(x2)
[1] TRUE
> is.character(x2)
[1] FALSE
> x3 <- 1:10
> x3
[1] 1 2 3 4 5 6 7 8 9 10
> x4 <- seq(0, 1, by = 0.1)
> x4
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> x4[x4 > 0.5]
[1] 0.6 0.7 0.8 0.9 1.0
> x4 > 0.5
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
> x5 <- seq(0, 1, len = 11)
> x5
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> x6 <- rep(1, 5)
> x6
[1] 1 1 1 1 1
> x7 <- rep(c(1, 2), c(3, 5))
> x7
[1] 1 1 1 2 2 2 2 2
> x8 <- rep(1:3, rep(5, 3))
> x8
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3

Um escalar é um vetor de comprimento igual a 1. Os vetores podem ser compostos de números e


caracteres ou apenas de um destes tipos. Portanto, adicionando um caracter a um vetor numérico este é
transformado em um vetor alfanumérico.
> x2
[1] 1 3 6
> c("a", x2)
[1] "a" "1" "3" "6"
> c(x2, "a")
[1] "1" "3" "6" "a"

Diversas operações numéricas podem ser feitas sobre vetores. Uma característica importante da
linguagem é a ”lei da reciclagem” que permite operações sobre vetores de tamanhos diferentes.
> x2
[1] 1 3 6
> x2 + 3
[1] 4 6 9
> x2 + 1:3
[1] 2 5 9
> x2 + 1:6
[1] 2 5 9 5 8 12
> (1:3) * x2
[1] 1 6 18
> x2/(1:6)
[1] 1.00 1.50 2.00 0.25 0.60 1.00
> x2^(1:3)
[1] 1 9 216

Vetores são uma estrutura de dados sobre a qual podemos aplicar funções como por exemplo as que
fornecem medidas estatísticas.
> x9 <- c(73, 91, 57, 77, 65, 75, 59, 96, 91, 70)
> x9
[1] 73 91 57 77 65 75 59 96 91 70
> sum(x9)
[1] 754
> mean(x9)
[1] 75.4
> var(x9)
[1] 184.9333

20
> min(x9)
[1] 57
> max(x9)
[1] 96
> summary(x9)
Min. 1st Qu. Median Mean 3rd Qu. Max.
57.00 66.25 74.00 75.40 87.50 96.00
> fivenum(x9)
[1] 57 65 74 91 96

Criando vetores com elementos repetidos


As funções rep() e seq() do R são úteis para criar vetores de dados que seguem um certo padrão.
Vamos ver os comandos que podem ser usados para criar vetores para cada uma das três colunas iniciais
deste arquivo.
A primeira coluna pode ser obtida com um dos dois comandos mostrados inicialmente, a seguir. Os
demais reproduzem a segunda e terceira coluna do arquivo de dados.
> rep(1:4, each = 12)
> rep(1:4, rep(12, 4))
> rep(rep(1:3, each = 4), 4)
> rep(1:4, 12)

Vetores lógicos e seleção de elementos


Como dito anteriormente os colchetes [] são usados para selecionar elementos de um vetor. No exemplo
abaixo vemos como selecionar os 3 primeiros elementos do vetor x9 criado anteriormente e depois os
elementos em posição par no vetor (segundo, quarto, sexto, oitavo e décimo).
> x9[1:3]
[1] 73 91 57
> x9[2 * (1:5)]
[1] 91 77 75 96 70

Entretanto, a seleção de elementos é mais geral podendo atender a critérios definidos pelo usuário. A
seguir mostramos que podemos criar um vetor lógico ind.72 que indica se cada valor de x9 é ou não
maior que 72. O vetor pode ser ainda convertido para o formato de uma variável indicadora (”dummy”).
> ind.72 <- x9 > 72
> ind.72
[1] TRUE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE FALSE
> as.numeric(ind.72)
[1] 1 1 0 1 0 1 0 1 1 0
> x10 <- x9[ind.72]
> x10
[1] 73 91 77 75 96 91

Vetores de caracteres
Vetores de caracteres também são criados por c() com elementos entre aspas. Há também algumas
funções para criação automática.
> nomes <- c("fulano", "beltrano", "cicrano")
> nomes
[1] "fulano" "beltrano" "cicrano"
> let5 <- letters[1:5]
> let5
[1] "a" "b" "c" "d" "e"
> let10 <- LETTERS[11:20]
> let10
[1] "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T"

Uma função particularmente útil para criar vetores de caracteres é paste(). Examine os seguintes
comandos.
> paste(nomes, 1:3)
[1] "fulano 1" "beltrano 2" "cicrano 3"
> paste("fulano", 2)
21
[1] "fulano 2"
> paste("fulano", 2, sep = "")
[1] "fulano2"
> paste(letters[1:8], 2, sep = "")
[1] "a2" "b2" "c2" "d2" "e2" "f2" "g2" "h2"

Vejamos ainda mais um exemplo. Considere criar um vetor com elementos: T1 T1 T1 T1 T2 T2 T2 T2


T3 T3 T3
> rep(paste("T", 1:3, sep = ""), c(4, 4, 3))
[1] "T1" "T1" "T1" "T1" "T2" "T2" "T2" "T2" "T3" "T3" "T3"

Fatores
Comentamos anteriormente que os vetores podem ser numéricos ou de caracteres. Entretanto há mais um
tipo importante de objeto: os fatores. Por exemplo, ao criar um vetor de indicadores de “tratamentos” em
uma análise de experimentos devemos declarar este vetor como um “fator”. Portanto revisitando o
exemplo visto anteriormente temos que uma forma mais adequada de usar o vetor como variável
indicadora de tratamentos é defini-lo como um fator. Note que neste caso, diferentemente do anterior, são
registrados os “níveis” (levels) do fator.
> factor(rep(paste("T", 1:3, sep = ""), c(4, 4, 3)))
[1] T1 T1 T1 T1 T2 T2 T2 T2 T3 T3 T3
Levels: T1 T2 T3

É importante notar a diferença entre um vetor de caracteres e um vetor que seja um fator que são objetos
de classes diferentes. O primeiro simplesmente guarda os seus elementos enquanto o segundo possui
atributos que nesta caso incluem os níveis do fator. Nos comandos abaixo esta distinção fica mais clara
onde um vetor é criado inicialmente como numérico e depois convertido para fator.
> estados <- c("PR", "SC", "RS")
> estados
[1] "PR" "SC" "RS"
> class(estados)
[1] "character"
> attributes(estados)
NULL
> estados <- factor(estados)
> estados
[1] PR SC RS
Levels: PR RS SC
> class(estados)
[1] "factor"
> attributes(estados)
$levels
[1] "PR" "RS" "SC"
$class
[1] "factor"

Um fato relevante a respeito da manipulação de fator é que uma seleção de parte dele que exclua um
certo valor não exclui este valor dos atributos do vetor, como mostra o caso abaixo.
> estados.sel <- estados[-3]
> estados.sel
[1] PR SC
Levels: PR RS SC

Da mesma forma pode-se criar um vetor e definir para eles níveis, mesmos que estes níveis não estejam
entre os elementos atualmente existentes no vetor. Note no exemplo abaixo o que acontece com o valor
"MG" em cada caso.
> est <- c("SC", "PR", "SC", "PR", "RS", "SP", "RS", "SP", "ES", "PR", "RJ", "ES")
> est
[1] "SC" "PR" "SC" "PR" "RS" "SP" "RS" "SP" "ES" "PR" "RJ" "ES"
> table(est)
est
ES PR RJ RS SC SP
2 3 1 2 2 2

22
> sesul <- factor(est, levels = c("PR", "SC", "RS", "MG", "SP", "RJ", "ES"))
> sesul
[1] SC PR SC PR RS SP RS SP ES PR RJ ES
Levels: PR SC RS MG SP RJ ES
> table(sesul)
sesul
PR SC RS MG SP RJ ES
3 2 2 0 2 1 2

Fatores Ordenados
Um tipo especial de fator é dado pelos fatores ordenados que são fatores para os quais preserva-se a
ordenação natural dos níveis. No próximo exemplo vemos um vetor inicialmente definido como de
caracteres e a diferença entre defini-lo como não-ordenado ou ordenado. A ordenação segue a ordem
alfabética a menos que uma ordenação diferente seja definida pelo usuário no argumento levels. Note
ainda que pode-se usar duas funções diferentes para definir fatores ordenados: factor(..., ord=T) ou
ordered().
> grau <- c("medio", "baixo", "medio", "alto", "baixo", "baixo", "alto", "medio",
"alto", "medio")
> factor(grau)
[1] medio baixo medio alto baixo baixo alto medio alto medio
Levels: alto baixo medio
> factor(grau, ord = T)
[1] medio baixo medio alto baixo baixo alto medio alto medio
Levels: alto < baixo < medio
> ordered(grau)
[1] medio baixo medio alto baixo baixo alto medio alto medio
Levels: alto < baixo < medio
> factor(grau, ord = T, levels = c("baixo", "medio", "alto"))
[1] medio baixo medio alto baixo baixo alto medio alto medio
Levels: baixo < medio < alto
> ordered(grau, levels = c("baixo", "medio", "alto"))
[1] medio baixo medio alto baixo baixo alto medio alto medio
Levels: baixo < medio < alto

Mais algumas operações com vetores


Considere o vetor vec obtido como se segue. As funções abaixo mostram como inverter a ordem dos
elementos do vetor rev(), ordenar os elementos sort() e a posição de cada elemento no vetor ordenado,
e encontrar o ”rank”dos elementos rank(). As operações %% e %/% fornecem, respectivamente, o resto e
a parte inteira de uma divisão.
> vec <- round(rnorm(7, m = 70, sd = 10))
> vec
[1] 83 66 83 73 81 63 71
> rev(vec)
[1] 71 63 81 73 83 66 83
> sort(vec)
[1] 63 66 71 73 81 83 83
> order(vec)
[1] 6 2 7 4 5 1 3
> vec[order(vec)]
[1] 63 66 71 73 81 83 83
> rank(vec)
[1] 6.5 2.0 6.5 4.0 5.0 1.0 3.0
> vec%%5
[1] 3 1 3 3 1 3 1
> vec%/%5
[1] 16 13 16 14 16 12 14

A função which retorna a posição do(s) elemento(s) que obedece a certo critério.
> which(vec > 70)
[1] 1 3 4 5 7
> which.max(vec)
[1] 1

23
> which.min(vec)
[1] 6

Outra operação é a remoção de elementos de vetores através de índices negativos.


> vec
[1] 83 66 83 73 81 63 71
> vec[-5]
[1] 83 66 83 73 63 71
> vec[-(2:4)]
[1] 83 81 63 71

Já que estamos falando de vetores e já vimos como o R funciona como uma calculadora, que tal agora
vermos como o R combina essas duas características para realizar operações vetoriais? Não se assuste, é
só uma maneira que o R tem para facilitar a sua vida. Vamos pegar um exemplo qualquer bem simples,
como um vetor de pesos de pessoas em kg e alturas em metros. Vamos fazer assim:
peso <- c(62, 70, 52, 98, 90, 70)
altura <- c(1.70, 1.82, 1.75, 1.94, 1.84, 1.61)

Vamos calcular o índice de massa corporal (IMC) para essas pessoas:


> imc <- peso/altura^2
> imc
[1] 21.45329 21.13271 16.97959 26.03890 26.58318 27.00513

O R calculou o IMC para cada posição dos vetores de peso e altura. Por exemplo, o primeiro resultado
21.45329 é o resultado da aplicação da fórmula proposta sobre o primeiro elemento de peso e o primeiro
elemento de altura. Confira: 62/1.702=21.45329.
Esse procedimento é uma operação vetorial, ou seja, ela foi aplicada a um vetor inteiro.
Esse é um bom momento para falar sobre precedência de operações matemáticas no R. Bem, o R segue a
precedência que aprendemos na matemática do ensino fundamental. Na operação matemática acima, a
potenciação tem precedência em relação à divisão e, portanto, a nossa conta foi feita corretamente.
Lembre-se que se a divisão fosse feita antes da potenciação, o resultado seria diferente. Podemos mudar a
precedência das operações usando parênteses.
> (peso/altura)^2
[1] 1330.1038 1479.2899 882.9388 2551.8121 2392.4858 1890.3592

Para não confundirmos nunca com os resultados, o uso dos parênteses é sempre uma boa política quando
não se tem certeza de uma determinada operação.
Para mais detalhes sobre vetores você pode consultar ainda as seguinte páginas:
• Vetores: http://www.leg.ufpr.br/Rtutorial/vectors.html
• Aritmética de vetores: http://www.leg.ufpr.br/Rtutorial/vecarit.html
• Caracteres e fatores: http://www.leg.ufpr.br/Rtutorial/charfacs.html
• Vetores Lógicos: http://www.leg.ufpr.br/Rtutorial/logicals.html
• Índices: http://www.leg.ufpr.br/Rtutorial/subscrip.html
2.4.2 Matrizes
Matrizes são montadas a partir da reorganização de elementos de um vetor em linhas e colunas. Por
“default” a matrix é preenchida por colunas e o argumento opcional byrow=T inverte este padrão. A
seleção de elementos ou submatrizes é feita usando [,] sendo que antes da vírgula indica-se a(s) linha(s)
e depois a(s) coluna(s) a serem selecionadas. Opcionalmente matrizes podem ter nomes associados às
linhas e colunas (”rownames”e ”colnames”). Cada um destes componentes da matrix é um vetor de
nomes. Os comandos a seguir ilustram todas estas funcionalidades.
> m1 <- matrix(1:12, ncol = 3)
> m1
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12
24
> matrix(1:12, ncol = 3, byrow = T)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
> length(m1)
[1] 12
> dim(m1)
[1] 4 3
> nrow(m1)
[1] 4
> ncol(m1)
[1] 3
> m1[1, 2]
[1] 5
> m1[2, 2]
[1] 6
> m1[, 2]
[1] 5 6 7 8
> m1[3, ]
[1] 3 7 11
> m1[1:2, 2:3]
[,1] [,2]
[1,] 5 9
[2,] 6 10
> dimnames(m1)
NULL
> dimnames(m1) <- list(c("L1", "L2", "L3", "L4"), c("C1", "C2", "C3"))
> dimnames(m1)
[[1]]
[1] "L1" "L2" "L3" "L4"
[[2]]
[1] "C1" "C2" "C3"
> m1[c("L1", "L3"), ]
C1 C2 C3
L1 1 5 9
L3 3 7 11
> m1[c(1, 3), ]
C1 C2 C3
L1 1 5 9
L3 3 7 11
> m2 <- cbind(1:5, 6:10)
> m2
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
> m3 <- cbind(1:5, 6)
> m3
[,1] [,2]
[1,] 1 6
[2,] 2 6
[3,] 3 6
[4,] 4 6
[5,] 5 6

Matrizes são muitas vezes utilizadas para armazenar freqüências de cruzamentos entre variáveis. Desta
forma é comum surgir a necessidade de obter os totais marginais, isto é a soma dos elementos das linhas
e/ou colunas das matrizes, o que pode ser diretamente obtido com margin.table(). No caso de matrizes
esta operação produz o mesmo resultado que outras funções conforme mostramos a seguir.
> margin.table(m1, margin = 1)
L1 L2 L3 L4
15 18 21 24
25
> apply(m1, 1, sum)
L1 L2 L3 L4
15 18 21 24
> rowSums(m1)
L1 L2 L3 L4
15 18 21 24
> margin.table(m1, margin = 2)
C1 C2 C3
10 26 42
> apply(m1, 2, sum)
C1 C2 C3
10 26 42
> colSums(m1)
C1 C2 C3
10 26 42

Operações com matrizes


Operações com matrizes são feitas diretamente assim como no caso de vetores. A ”lei da reciclagem”
permanece válida. Existem diversas operações sobre matrizes e vamos apresentar apenas algumas aqui.
Note que as operações abaixo são todas realizadas elemento a elemento.
> m4 <- matrix(1:6, nc = 3)
> m5 <- matrix(10 * (1:6), nc = 3)
> m4
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> m5
[,1] [,2] [,3]
[1,] 10 30 50
[2,] 20 40 60
> m4 + m5
[,1] [,2] [,3]
[1,] 11 33 55
[2,] 22 44 66
> m4 * m5
[,1] [,2] [,3]
[1,] 10 90 250
[2,] 40 160 360
> m5 - m4
[,1] [,2] [,3]
[1,] 9 27 45
[2,] 18 36 54
> m5/m4
[,1] [,2] [,3]
[1,] 10 10 10
[2,] 10 10 10

A multiplicação de matrizes é feita usando o operador %*%. A função t() faz transposição e a inversão é
obtida com solve().
> t(m4) %*% m5
[,1] [,2] [,3]
[1,] 50 110 170
[2,] 110 250 390
[3,] 170 390 610

A função solve() na verdade é mais geral e fornece a solução de um sistema de equações lineares. Por
exemplo, a solução do sistema:

 x + 3y − z = 1 0

 5x − 2 y + z = 1 5
 2x + y − z = 7

26
pode ser obtida com:
> mat <- matrix(c(1, 5, 2, 3, -2, 1, -1, 1, -1), nc = 3)
> vec <- c(10, 15, 7)
> solve(mat, vec)
[1] 3.615385 3.307692 3.538462

2.4.3 Arrays
O conceito de array generaliza a idéia de matrix. Enquanto em uma matrix os elementos são organizados
em duas dimensões (linhas e colunas), em um array os elementos podem ser organizados em um número
arbitrário de dimensões.
No R um array é definido utilizando a função array(). Defina um array com o comando a seguir e
inspecione o objeto certificando-se que você entendeu como arrays são criados.
> ar1 <- array(1:24, dim = c(3, 4, 2))
> ar1
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
, , 2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
[2,] 14 17 20 23
[3,] 15 18 21 24

Examine agora os resultados dos seguintes comandos para selecionar e operar elementos do ”array”.
> ar1[, 2:3, ]
, , 1
[,1] [,2]
[1,] 4 7
[2,] 5 8
[3,] 6 9
, , 2
[,1] [,2]
[1,] 16 19
[2,] 17 20
[3,] 18 21
> ar1[2, , 1]
[1] 2 5 8 11
> sum(ar1[, , 1])
[1] 78
> sum(ar1[1:2, , 1])
[1] 48

Podemos atribuir nomes às dimensões de um array.


> dimnames(ar1)
NULL
> dimnames(ar1) <- list(c("Baixo", "Médio", "Alto"), paste("col", 1:4, sep = ""),
c("Masculino", "Feminino"))

Inspecione o “help” da função array (digite help(array)), rode e inspecione os exemplos contidos na
documentação.
Veja agora um exemplo de dados já incluído no R no formato de array. Para “carregar”e visualizar os
dados digite:

27
> data(Titanic)
> Titanic
, , Age = Child, Survived = No
Sex
Class Male Female
1st 0 0
2nd 0 0
3rd 35 17
Crew 0 0
, , Age = Adult, Survived = No
Sex
Class Male Female
1st 118 4
2nd 154 13
3rd 387 89
Crew 670 3
, , Age = Child, Survived = Yes
Sex
Class Male Female
1st 5 1
2nd 11 13
3rd 13 14
Crew 0 0
, , Age = Adult, Survived = Yes
Sex
Class Male Female
1st 57 140
2nd 14 80
3rd 75 76
Crew 192 20

Para obter maiores informações sobre estes dados digite:


help(Titanic)

Agora vamos responder às seguintes perguntas, mostrando os comandos do R utilizados sobre o array de
dados.
1. quantas pessoas haviam no total?
> sum(Titanic)
[1] 2201

2. quantas pessoas haviam na tripulação (crew)?


> sum(Titanic[4, , , ])
[1] 885

3. quantas pessoas sobreviveram e quantas morreram?


> apply(Titanic, 4, sum)
No Yes
1490 711

4. quantas crianças sobreviveram?


> sum(Titanic[, , 1, 2])
[1] 57

5. quais as proporções de sobreviventes entre homens e mulheres?


Vamos fazer por partes obtendo primeiro o número de homens e mulheres, depois dentre estes os que
sobreviveram e depois obter as percentagens pedidas.
apply(Titanic, 2, sum)
Male Female
1731 470

apply(Titanic[, , , 2], 2, sum)


Male Female
367 344

28
100 * apply(Titanic[, , , 2], 2, sum)/apply(Titanic, 2, sum)
Male Female
21.20162 73.19149

Note-se ainda que assim como em matrizes, margin.table() poderia ser utilizada para obter os totais
marginais para cada dimensão do array de dados, fornecendo uma maneira alternativa à alguns dos
comandos mostrados acima.
margin.table(Titanic, margin = 1)
Class
1st 2nd 3rd Crew
325 285 706 885

margin.table(Titanic, margin = 2)
Sex
Male Female
1731 470

margin.table(Titanic, margin = 3)
Age
Child Adult
109 2092

margin.table(Titanic, margin = 4)
Survived
No Yes
1490 711

Esta função admite ainda índices múltiplos que permitem outros resumos da tabela de dados. Por
exemplo mostramos a seguir como obter o total de sobreviventes e não sobreviventes, separados por sexo
e depois as porcentagens de sobreviventes para cada sexo.
margin.table(Titanic, margin = c(2, 4))
Survived
Sex No Yes
Male 1364 367
Female 126 344

prop.table(margin.table(Titanic, margin = c(2, 4)), margin = 1)


Survived
Sex No Yes
Male 0.7879838 0.2120162
Female 0.2680851 0.7319149

2.4.4 Data-frames
Vetores, matrizes e arrays forçam todos os elementos a serem do mesmo ”tipo”, isto é., ou numérico ou
caracter. O ”data-frame” é uma estrutura semelhante à uma matriz porém com cada coluna sendo tratada
separadamente. Desta forma podemos ter colunas de valores numéricos e colunas de caracteres no
mesmo objeto. Note entretanto que dentro de uma mesma coluna todos elementos ainda serão forçados a
serem do mesmo tipo.
d1 <- data.frame(X = 1:10, Y = c(51, 54, 61, 67, 68, 75, 77, 75, 80, 82))
d1
X Y
1 1 51
2 2 54
3 3 61
4 4 67
5 5 68
6 6 75
7 7 77
8 8 75
9 9 80
10 10 82

29
names(d1)
[1] "X" "Y"
d1$X
[1] 1 2 3 4 5 6 7 8 9 10
d1$Y
[1] 51 54 61 67 68 75 77 75 80 82
plot(d1)
plot(d1$X, d1$Y)
d2 <- data.frame(Y = c(10 + rnorm(5, sd = 2), 16 + rnorm(5, sd = 2), 14 + rnorm(5,
sd = 2)))
d2$lev <- gl(3, 5)
d2
Y lev
1 14.35972 1
2 10.57823 1
3 11.19100 1
4 10.44532 1
5 12.50729 1
6 14.57557 2
7 16.36979 2
8 18.51120 2
9 14.20450 2
10 20.36193 2
11 14.59282 3
12 13.32687 3
13 14.12779 3
14 13.13010 3
15 13.35594 3

by(d2$Y, d2$lev, summary)


INDICES: 1
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.45 10.58 11.19 11.82 12.51 14.36
---------------------------------------------------------------
INDICES: 2
Min. 1st Qu. Median Mean 3rd Qu. Max.
14.20 14.58 16.37 16.80 18.51 20.36
---------------------------------------------------------------
INDICES: 3
Min. 1st Qu. Median Mean 3rd Qu. Max.
13.13 13.33 13.36 13.71 14.13 14.59

d3 <- expand.grid(1:3, 4:5)


d3
Var1 Var2
1 1 4
2 2 4
3 3 4
4 1 5
5 2 5
6 3 5

Na criação de data-frame expand.grid() pode ser muito útil gerando automaticamente combinações de
valores.
expand.grid(1:3, 1:2)
Var1 Var2
1 1 1
2 2 1
3 3 1
4 1 2
5 2 2
6 3 2

Vamos ver outro banco de dados. Para tal, de um duplo click no arquivo Empresa.RData que se encontra
na área de trabalho.

30
Vamos agora dar uma olhadinha em alguns registros do nosso novo objeto; na verdade, vamos olhar
apenas os primeiros 6 registros:
empresa[1:6, ]

Empresa Setor Receita Gastos No.de.funcionarios Nivel.de.terceirizacao Unilocal Idade.da.empresa


1 1 S1 22193 15000 5 Baixo 1 4
2 2 S1 863675 897156 35 Medio 1 25
3 3 S1 714864 742740 21 Alto 1 25
4 4 S1 175860 18071 17 Baixo 1 5
5 5 S1 600000 568000 10 Alto 1 15
6 6 S1 213443 203836 10 Medio 1 29
Vamos fazer uma pequena exploração desse banco de dados.
names(empresa)
[1] "Empresa" "Setor" "Receita"
[4] "Gastos" "No.de.funcionarios" "Nivel.de.terceirizacao"
[7] "Unilocal" "Idade.da.empresa"

As descrições dessas variáveis são:


• Empresa – Nº de Identificação
• Setor – S1 (Comércio/Serviço); S2 (Indústria)
• Receita – média mensal em R$
• Gastos – média mensa em R$
• No.de.funcionarios
• Nivel.de.terceirizacao – Baixo, Médio, Alto
• Unilocal – 1 se tem filial, 0 se não tem filial
• Idade.da.empresa – em anos
Se quisermos listar uma das variáveis apenas, basta saber qual é a coluna correspondente. Por exemplo,
selecionar a variável Receita que corresponde a terceira coluna da matriz empresa.
empresa[,3]

Vamos omitir a saída aqui para poupar espaço. Mas será que existe uma outra maneira de selecionar uma
variável em um banco de dados no R? Uma maneira mais convencional, por exemplo, seria chamar o
nome da variável e não tendo que saber especificamente a coluna correspondente. Tente:
empresa$Receita

O símbolo $ serve para indicar o nome de uma variável em um data frame.


Digamos agora que você queira listar todas as empresas que tenham receita média mensal superior a R$
1.200.000. Nesse caso, estaremos selecionando todas as colunas do banco e somente as linhas que
satisfizerem essa condição. Vamos ver como seria, usando os nossos colchetes:
empresa[empresa$Receita > 1200000,]
Empresa Setor Receita Gastos No.de.funcionarios Nivel.de.terceirizacao Unilocal Idade.da.empresa
109 119 S1 1256000 1134723 27 Alto 1 23
110 120 S1 1315466 1009574 52 Alto 0 25
177 1014 S2 1407425 1704708 22 Alto 0 19
179 1016 S2 1358593 989097 33 Baixo 0 21
180 1017 S2 1247984 1396337 66 Alto 1 33
200 1037 S2 1437783 1220871 60 Alto 1 8
207 1044 S2 1382904 1064769 33 Alto 1 5
213 1051 S2 1319326 977538 43 Alto 1 21
216 1054 S2 1256872 1210417 34 Medio 1 16
228 1066 S2 1213646 842882 35 Baixo 1 15
241 1080 S2 1273145 1172548 46 Baixo 0 28
244 1083 S2 1395000 1416077 48 Alto 1 18
251 1090 S2 1316204 1124590 20 Medio 1 9
255 1094 S2 1499791 1694112 49 Alto 1 18
287 1127 S2 1224351 1133282 22 Alto 1 35
290 1130 S2 1265876 1075414 15 Alto 0 17
294 1134 S2 1354240 1206843 50 Alto 1 20
333 1174 S2 1328340 965571 41 Alto 1 24
404 1246 S2 1315271 964021 14 Baixo 1 2
406 1248 S2 1211566 786372 42 Medio 1 21
421 1264 S2 1284728 909809 68 Alto 1 11
442 1285 S2 1212188 1428338 106 Alto 1 14
456 1300 S2 1204862 931132 71 Alto 1 4

31
471 1315 S2 1509639 1268973 27 Alto 1 4
487 1331 S2 1276650 854065 80 Baixo 1 18

Selecionamos (com os colchetes), do banco empresa as linhas (primeiro índice dentro dos colchetes,
antes da vírgula) onde a variável Receita > 1200000, e todas as colunas (o espaço em branco após a
vírgula dentro dos colchetes – segundo índice).
Para terminar, vamos fazer o seguinte exercício em nosso banco de dados. Ele não possui nenhum valor
faltante (missing value). No R, o “símbolo” para missing é “NA” de not available em inglês. Bem, vamos
aproveitar o nosso exercício de seleção para ver como podemos também substituir valores selecionados
por outro. Digamos que houve um engano e que todas as receitas maiores que R$ 1.200.00,00 não são
confiáveis e devem ser considerados como faltantes (esse é um exemplo péssimo na verdade –
normalmente nós substituímos valores que outros sistemas consideram missing por NA, como “-99” ou
espaço em branco.) Neste caso a sintaxe será um pouco diferente:
empresa$Receita[empresa$Receita > 1200000]<- NA

Explicando devagar: estamos substituindo (com o símbolo <-) os valores da variável Receita que são
maiores que R$ 1.200.000,00 por NA. Tente:
empresa$Receita

Repare que a saída é mesmo um vetor com os valores da variável Receita.


Explorando um Data Frame
Vamos agora comparar a Receita das empresas de acordo com o nível de terceirização: Baixo, Médio e
Alto. Para isso, lançaremos mão de uma função especial:
by(data=empresa$Receita, INDICES=empresa$Nivel.de.terceirizacao, FUN=summary)
empresa$Nivel.de.terceirizacao: Alto
Min. 1st Qu. Median Mean 3rd Qu. Max.
400600 450900 558700 706200 946300 1510000
------------------------------------------------------------
empresa$Nivel.de.terceirizacao: Baixo
Min. 1st Qu. Median Mean 3rd Qu. Max.
1320 120000 275800 361200 527200 1359000
------------------------------------------------------------
empresa$Nivel.de.terceirizacao: Medio
Min. 1st Qu. Median Mean 3rd Qu. Max.
12460 121700 250000 354800 457200 1316000

Essa função é especial porque ela aplica uma outra função (no caso a função summary() – argumento
FUN) a uma variável (argumento data=) estratificado por uma outra variável (argumento INDICES).
Repare qual é a saída da função summary(): ela calcula a média, mediana mínimo, máximo, primeiro e
terceiro quartís, além de reportar o número de missings.
Você deve ter notado que é muito trabalhoso digitar o nome do data frame toda vez que a gente quiser
trabalhar com uma de suas variáveis. Para contornar esse problema existe uma função no R que permite
acessar as variáveis diretamente. Vejamos
attach(empresa)
Nivel.de.terceirizacao2<-factor(Nivel.de.terceirizacao, ord = T, levels = c("Baixo",
"Medio", "Alto"))

Para testar vamos repetir a função by() omitindo o nome do data frame e também o $. Observe que
criamos uma nova variável, Nivel.de.terceirizacao2, que colocou a anterior como fator ordenado.

32
by(Receita, Nivel.de.terceirizacao2, summary)

Nivel.de.terceirizacao2: Baixo
Min. 1st Qu. Median Mean 3rd Qu. Max.
1320 120000 275800 361200 527200 1359000
------------------------------------------------------------
Nivel.de.terceirizacao2: Medio
Min. 1st Qu. Median Mean 3rd Qu. Max.
12460 121700 250000 354800 457200 1316000
------------------------------------------------------------
Nivel.de.terceirizacao2: Alto
Min. 1st Qu. Median Mean 3rd Qu. Max.
400600 450900 558700 706200 946300 1510000

Para já começarmos a ver alguns gráficos no R, vamos utilizar a tabela de freqüência e o gráfico de
barras do nosso banco de dados.
Nivel.de.terceirizacao.tb <- table(Nivel.de.terceirizacao2)
df<-matrix(0,4,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c("Baixo", "Médio","Alto","Total")
df[1,1]<- Nivel.de.terceirizacao.tb["Baixo"]
df[2,1]<- Nivel.de.terceirizacao.tb["Medio"]
df[3,1]<- Nivel.de.terceirizacao.tb["Alto"]
df[4,1]<-length(Nivel.de.terceirizacao2)
for(i in 1:4) {df[i,2]<-round(df[i,1]/length(Nivel.de.terceirizacao2),4)}
for(i in 1:4) {df[i,3]<-df[i,2]*100}

df
fa fr fp(%)
Baixo 350 0.5401 54.01
Médio 173 0.2670 26.70
Alto 125 0.1929 19.29
Total 648 1.0000 100.00

Construindo Alguns Gráficos


gc1<- barplot(df[1:3,2], xlab="Nível de Terceirização", ylab="Freqüência Relativa",
col=gray(seq(0.4,1.0, length=3)),ylim=c(0,0.60),
main="Gráfico de Barras da Variável Nível de Terceirização")
text(locator(n=3),paste(df[1:3,2]))

Gráfico de Barras da Variável Nível de Terceirização


0.6

0.5401
0.5
0.4
Freqüência Relativa

0.3

0.267

0.1929
0.2
0.1
0.0

Baixo Médio Alto

Nível de Terceirização

33
gc2<- barplot(df[1:3,2], horiz=T, xlab="Freqüência relativa", ylab="Nível de
Terceirização", col= heat.colors(3),xlim=c(0,0.60),
main="Gráfico de Barras da Variável Nível de Terceirização")
text(locator(n=3),paste(df[1:3,2]))

Gráfico de Barras da Variável Nível de Terceirização


Alto

0.1929
Nível de Terceirização

Médio

0.267
Baixo

0.5401

0.0 0.1 0.2 0.3 0.4 0.5 0.6

Freqüência relativa

pie(df[1:3,2],col=rainbow(3),radius=1.05,main="Setorgrama da Variável Nível de


Terceirização")
text(locator(n=3),paste(df[1:3,3],"%"))

Setorgrama da Variável Nível de Terceirização


Baixo

54.01 %

19.29 %

26.7 %
Alto

Médio

34
3 Módulo Entrada e Saída de Dados
Pré-requisitos: Saber como funcionam e como usar funções e pacotes no R. Saber selecionar elementos,
linhas e colunas em dataframes.
3.1 Saída de Dados
Vamos iniciar a nossa discussão pela saída de dados. Apesar de parecer estranho estudarmos como o R
exporta dados, em vez de como ele os importa, será mais fácil primeiro exportar para depois então
reimportamos alguns formatos.
Como mencionado, o pacote foreign deve ser instalado na sua máquina. Se este pacote não estiver
instalado, instale-o a partir do próprio R. Para instruções sobre como fazer isso, consulte o módulo
Baixando e Instalando o R. Esse pacote, como sugere o nome, contém várias funções tanto para importar
como para exportar alguns formatos de bancos de dados entre o R e diversos programas.
Uma vez instalado o pacote, você precisa carregá-lo. Faça assim:
library(foreign)

Aproveite para dar uma olhada nas funções contidas nesse pacote. Use a ajuda em HTML para facilitar a
sua vida.
O R é capaz de exportar também para o formato ASCII, que pode ser considerado como um formato
universal, ou seja, qualquer programa é capaz de ler um arquivo nesse formato. Nessa seção, vamos ver
uma função que faz essa tarefa, usando diferentes argumentos para a exportação, convenientes para o
programa que vai ler os dados. Não estranhe, mas a função utilizada para este fim – write.table() –
faz parte do pacote base, que é instalada junto com a instalação básica do R.
O caso mais geral é exportar dados num formato ASCII delimitado por espaço ou tabulação. Vamos
começar com a separação por tabulação. Este formato pode ser lido por diversos programas, como Excel,
SPSS, SAS, dentre outros.
Se você já fez o módulo básico, deve se lembrar do banco de dados empresa. Bem, vamos invocar esse
mesmo banco e trabalhar com ele:
load("C:\\Documents and Settings\\toshiba\\Meus documentos\\Prof Adenilson\\JK
ADM\\Curso de Estatística\\Empresa.RData")

Vamos usar a função write.table():


write.table(empresa, file="empresa.txt", sep="\t", row.names=F, quote = FALSE)

Os 3 primeiros argumentos da função write.table() não devem suscitar dúvidas: o primeiro é o nome
do objeto a ser exportado, o segundo, o nome do arquivo onde o dado será armazenado e o terceiro o tipo
de delimitador a ser usado, que neste caso é esse "\t" que significa tabulações. O argumento
row.names=F serve para indicar que as linhas desse objeto não têm nome e ainda previne o R de colocar
números como nomes (por default o R vai fazer uma numeração crescente, como se fosse o número do
registro, se esse argumento for T). O argumento quote=FALSE serve para indicar ao R que variáveis tipo
caracter devem ser exportadas sem estar entre aspas (porque se estiverem o SPSS por exemplo não vai
levar isso em conta e vai importar as aspas junto).
O arquivo gerado “empresa.txt” pode ser facilmente importado para diversos programas. A técnica de
importação para outros programas não faz parte do escopo desse módulo e deverá ser dominado por
pessoas que trabalham com os respectivos programas de uma forma regular.
Uma dúvida natural do leitor nesse momento seria: legal exportei os dados para um arquivo, mas onde
está este arquivo? Boa pergunta! Por default, o R salva o arquivo no mesmo diretório de onde você está
trabalhando, ou seja no mesmo diretório onde está o seu arquivo “.Rdata”. Se você quiser saber que
diretório é esse, faça assim:
getwd()

35
3.2 Entrada de Dados
O R é capaz de ler arquivos de dados salvos em diversos formatos diferentes, como ASCII (arquivo
texto, delimitado por espaço, tabulação, vírgula, ponto-e-vírgula, entre outros), Excel, SPSS, EpiInfo, etc.
A função mais simples que lê dados externos no R faz parte do pacote básico e se chama read.table()
e também pertence ao pacote base. Essa função vai importar dados em formato ASCII para um objeto do
tipo dataframe. Vamos ver um exemplo, usando a base de dados que nós acabamos de exportar (note que
o arquivo “empresa.txt” deve estar presente no seu diretório de trabalho):
empresa1 <- read.table(file="empresa.txt", header=T, sep="\t")

Vamos ver por partes o que nós fizemos: criamos um objeto empresa1, para não mexer no objeto
empresa que nós criamos na seção anterior, através do assignment <- pela função read.table(), que
tem um argumento obrigatório (file) e dois argumentos opcionais (header=T e sep="\t").
Bom, file é simplesmente o nome do arquivo externo onde os dados estão armazenados, com a
extensão inclusive e entre aspas. O argumento header=T é para indicar para o R que a primeira linha
contém o nome das variáveis nesse banco. O último argumento que usamos, sep="\t" é usado para
indicar que a delimitação dos dados nesse caso é feita por tabulação. Uma importante observação é que
se o separador fosse espaço e não tabulação, a função leria os dados da mesma forma, apenas mudando-
se para sep="\t".
Bom, a primeira providência após importar os dados é dar uma olhadinha neles para ver se tudo
funcionou a contento. Se a gente quisesse ver esse banco inteiro, bastaria digitar o nome do objeto
empresa1 (como você deve se lembrar que acontece com qualquer objeto). Como esse banco tem 648
registros e 8 variáveis, vamos ver somente os 10 primeiros registros:
empresa1[1:10,]

Empresa Setor Receita Gastos No.de.funcionarios Nivel.de.terceirizacao Unilocal Idade.da.empresa


1 1 S1 22193 15000 5 Baixo 1 4
2 2 S1 863675 897156 35 Medio 1 25
3 3 S1 714864 742740 21 Alto 1 25
4 4 S1 175860 18071 17 Baixo 1 5
5 5 S1 600000 568000 10 Alto 1 15
6 6 S1 213443 203836 10 Medio 1 29
7 7 S1 241119 77421 13 Baixo 1 24
8 8 S1 635304 357452 27 Medio 0 16
9 9 S1 53345 38794 10 Baixo 1 13
10 10 S1 414373 421385 5 Alto 1 32

3.3 Saída de Resultados


Uma outra necessidade é a saída de resultados de funções usadas no R. Essas saídas são basicamente de
dois tipos: Ou um gráfico ou uma saída de texto, que pode conter uma “tabela” ou resultados na forma de
texto livre mesmo. Se você já tem alguma familiaridade com o R, deve saber que sua parte gráfica é
bastante superior à sua parte de saída tipo tabela.
Vamos então usar o mesmo exemplo visto no final do módulo básico com o nosso banco empresa para
mostrar como copiar e colar a saída de uma função e também um gráfico do R em um outro programa,
como um editor de texto avançado (tipo Word) ou até mesmo para uma planilha eletrônica qualquer
(como Excel). Primeiramente vamos reiniciar o objeto empresa, evitando acidentes:
empresa
attach(empresa)

Recordando os nomes das variáveis desse banco:


names(empresa)
[1] "Empresa" "Setor" "Receita"
"Gastos" "No.de.funcionarios" "Nivel.de.terceirizacao"
[7] "Unilocal" "Idade.da.empresa"

Você deve estar se lembrando da função utilizada no módulo básico chamada by(). Vamos comparar os
Gastos das empresas por Nível de terceirização:
by(data=Gastos, INDICES=Nivel.de.terceirizacao, FUN=summary)

36
Temos aqui uma saída do tipo texto.
O primeiro passo para copiar e colar a saída dessa função é selecionar no R a saída ou parte da saída que
seja de interesse. Para isso apertamos o botão esquerdo do mouse e o arrastamos sobre o texto. O tom
azul sobre a tela indica a parte que está sendo selecionada.
O próximo passo é copiar a parte do texto selecionada no R. Isso pode ser feito selecionando no menu
“Edit” a opção “Copy”, ou simplesmente apertando sucessivamente a tecla “Ctrl” e a tecla “c”. Outra
possibilidade ainda é após selecionar o texto no R clicar com o botão direito do mouse e escolher
“Copy”:

Agora, é só colocar o conteúdo no Word ou programa equivalente. Em qualquer editor de texto no


Windows, a forma de se fazer isso é a mesma utilizada acima no processo de copiar os dados do R
bastando trocar a opção “Copy” pela opção “Colar” (ou “Paste”). Para obter uma formatação no Word
igual ao que aparece no R, troque a fonte do texto colado para “courier new”.
Uma outra necessidade de exportação de dados pode ser quando se deseja exportar uma tabulação
qualquer (por exemplo, uma tabela de freqüência, com uma ou mais variáveis) para um programa de
planilha eletrônica. Bem, nós já podemos usar, neste caso, a nossa já conhecida função write.table(),
pois funciona também com outros tipos de objetos fora banco de dados.
Para dar um exemplo, vamos dizer que desejamos fazer uma tabulação das empresas segundo o critério
delas terem Nº de funcionários maiores ou menores do que a mediana do grupo inteiro por Nível de
terceirização. Inicialmente, vamos descobrir essa mediana:
median(No.de.funcionarios)
[1] 19

Muito bem, vamos então criar um vetor para agrupar as espécies segundo essa mediana (não se preocupe
em entender a sintaxe por enquanto):
g.funcionarios <- ifelse(No.de.funcionarios<19, "<19", ">=19")
Nivel.de.terceirizacao2<-factor(Nivel.de.terceirizacao, ord = T, levels = c("Baixo",
"Medio", "Alto"))

37
table(Nivel.de.terceirizacao2,g.funcionarios)
g.funcionarios
Nivel.de.terceirizacao2 <19 >=19
Baixo 172 178
Medio 80 93
Alto 66 59

Podemos guardar essa tabela em objeto se quisermos. Faça assim:


g.funcionarios <- ifelse(No.de.funcionarios<19, "<19", ">=19")
output<- table(Nivel.de.terceirizacao2,g.funcionarios)

Confira o conteúdo do objeto output. Deverá ser a mesma tabela acima. Agora podemos usar a nossa
velha amiga:
write.table(output, file="funcionarios.nivel.txt",row.names=T, sep="\t", quote=F)

Depois abra o arquivo "funcionarios.nivel.txt" como arquivo de texto no Excel.


Um arquivo gráfico pode ser copiado pelo R através de dois formatos: Bitmap ou Metafile. Esses
formatos se diferem entre si por vantagens e desvantagens que cada um possui. Uma dentre outras
vantagens do formato “metafile” é o de gerar arquivos de tamanho menor.
Para copiar um arquivo no formato “metafile”, primeiro se certifique que a janela gráfica está
selecionada (para tanto, apenas clique em qualquer área dentro da janela), e então escolha com o botão
direito do mouse a opção “Copiar coo metafile”, depois é só colar no Word.
Nivel.de.terceirizacao.tb <- table(Nivel.de.terceirizacao2)
df<-matrix(0,4,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c("Baixo", "Médio","Alto","Total")
df[1,1]<- Nivel.de.terceirizacao.tb["Baixo"]
df[2,1]<- Nivel.de.terceirizacao.tb["Medio"]
df[3,1]<- Nivel.de.terceirizacao.tb["Alto"]
df[4,1]<-length(Nivel.de.terceirizacao2)
for(i in 1:4) {df[i,2]<-round(df[i,1]/length(Nivel.de.terceirizacao2),4)}
for(i in 1:4) {df[i,3]<-df[i,2]*100}
df
fa fr fp(%)
Baixo 350 0.5401 54.01
Médio 173 0.2670 26.70
Alto 125 0.1929 19.29
Total 648 1.0000 100.00
pie(df[1:3,2],col=rainbow(3),radius=1.05,main="Setorgrama da Variável Nível de
Terceirização")
text(locator(n=3),paste(df[1:3,3],"%"))

38
3.4 Pacote xlsReadWrite
O pacote xlsReadWrite deve ser instalado da seguinte forma:
Click com o mouse no ícone “Pacotes”, depois em “Carregar pacote” e apparecerá a opção abaixo:

Selecione o pacote xlsReadwrite e click em OK.


Assim você terá carregado o pacote no R.
Observando o arquivo2.xls no Excel:
39
Importando o arquivo2.xls para o R, e colocando no objeto bd1:
bd1<-read.xls("arquivo2.xls")
bd1
Sexo Idade Peso Altura
1 F 25 45 1.55
2 F 26 52 1.55
3 M 27 76 1.68
4 F 26 47 1.73
5 F 29 54 1.60
6 F 26 55 1.60
7 F 21 55 1.72
8 F 33 58 1.63
9 F 21 53 1.62
10 M 19 68 1.84
11 M 22 78 1.83
12 M 21 70 1.79
13 F 37 65 1.58
14 M 20 70 1.80
15 M 35 60 1.67
16 M 33 79 1.75
17 F 33 59 1.58
18 M 25 63 1.85
19 M 21 72 1.83
20 F 31 62 1.63
21 M 21 72 1.74
22 M 19 68 1.70
23 F 26 68 1.78
24 M 22 83 1.79
25 M 18 86 1.75
26 F 40 75 1.55
27 M 23 67 1.71
28 F 22 49 1.57
29 M 22 63 1.83
30 F 25 55 1.66
31 F 19 45 1.60
32 M 19 90 1.97
33 M 27 80 1.75
34 M 40 113 1.88
40
Como podemos observar os dados já vieram com a formatação correta para a variável altura, pois no
Excel a variável altura era separada por vírgulas.
Saída de dados o comando é “write.xls”. Vamos fazer uma tabela de freqüência da variável Sexo e em
seguida salvar como um arquivo xls.
attach(bd1)
Sexo.tb <- table(Sexo)
df<-matrix(0,3,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c("Masculino", "Feminino","Total")
df[1,1]<-Sexo.tb["M"]
df[2,1]<-Sexo.tb["F"]
df[3,1]<-length(Sexo)
for(i in 1:3) {df[i,2]<-round(df[i,1]/length(Sexo),4)}
for(i in 1:3) {df[i,3]<-df[i,2]*100}
df
fa fr fp(%)
Masculino 18 0.5294 52.94
Feminino 16 0.4706 47.06
Total 34 1.0000 100.00

Salvando como arquivo xls:


write.xls(df,"tabsexo.xls")

Abrindo o arquivo tabsexo.xls no Excel temos:

Observe que na exportação veio sem a primeira coluna, que é um problema do pacote que será resolvido
criando uma nova coluna e digitando as informações:

41
42
4 População, amostra, variável, coleta e apuração de dados
4.1 Elementos estatísticos para análise exploratória de dados
Estatística: é uma coleção de métodos para planejar experimentos, obter e organizar dados, resumi-
los,analisá-los, interpretá-los e deles extrair conclusões (Triola, 1999).
4.2 Níveis de mensuração
Escala nominal
Os indivíduos são classificados em categorias segundo uma característica.
Ex: sexo (masculino, feminino),
hábito de fumar (fumante, não fumante),
sobrepeso (sim, não).
Não existe ordem entre as categorias e suas representações, se numéricas, são destituídas de significado
numérico.
Ex: sexo masculino=1, sexo feminino = 2.
Os valores 1 e 2 são apenas rótulos.
Escala ordinal
Os indivíduos são classificados em categorias que possuem algum tipo inerente de ordem. Neste caso,
uma categoria pode ser "maior" ou "menor" do que outra.
Ex: nível sócio-econômico (A, B, C e D; onde A representa maior poder aquisitivo);
nível de satisfação (Ótimo, Bom, Regular, Ruim e Péssimo).
Embora exista ordem entre as categorias, a diferença entre categorias adjacentes não tem o mesmo
significado em toda a escala.
4.3 Escalas numéricas
Escala intervalar
Este nível de mensuração possui um valor zero arbitrário.
Ex: temperatura em graus Celsius.
Escala de razões – possui zero verdadeiro.
Escala de razões discreta: o resultado numérico da mensuração é um valor inteiro.
Ex: número de refeições em um dia (nenhuma, uma, duas, três, quatro, ...),
freqüência de consumo semanal de determinado alimento (1 vez, 2 vezes, 3 vezes, 4 vezes, 5
vezes, 6 vezes, 7 vezes) .
Escala de razões contínua: o resultado numérico é um valor pertencente ao conjunto dos números reais R
={-∞;...; -38; ...; -0,3;...; 0;...0,2;...0,73;...; 1;...; 2,48;...; +∞}.
Ex: peso (g), altura (cm), circunferência da cintura (cm)
De acordo com o nível de mensuração, os fenômenos ao serem medidos, resultam em variáveis que
podem ser classificadas em qualitativas e quantitativas. Esquematicamente tem-se:

43
 n o m i n a l
Q a u a l i t a t i v
 o r d i n a l
V : a r iá v e l
Q d i s c r e t a
vu a a n t i t a t i

 c o n t í n u a
O tipo da variável irá indicar a melhor forma para o dado ser apresentado em tabelas e gráficos, em
medidas de resumo e, a análise estatística mais adequada.
4.4 Tópicos iniciais de amostragem
Coleta de dados
É a observação e registro da categoria ou medida de variáveis relacionadas ao objeto de estudo que
ocorrem em unidades (indivíduos) de uma amostra ou população.
População: totalidade de elementos sob estudo. Apresentam uma ou mais características em comum.
Na prática, a população de estudo nem sempre corresponde à população alvo. Por exemplo, no estudo
sobre a ocorrência de sobrepeso em crianças de 7 a 12 anos no Município de São Paulo, no ano de 2003,
a população alvo é o conjunto de todas as crianças nesta faixa etária, deste município, neste ano. Porém,
pode ser que algumas crianças estejam ausentes no momento da entrevista (crianças que estão internadas,
que trabalham, que não permanecem no domicílio durante o dia ou estão viajando) fazendo com que a
população de estudo represente um subconjunto da população alvo.
Elementos: são unidades de análise; podem ser pessoas, domicílios, escolas, creches, células ou qualquer
outra unidade.
Amostra: é uma parte da população de estudo.
Amostragem: processo para obtenção de uma amostra. tem como objetivo estimar parâmetros
populacionais.
Parâmetro: Quantidade fixa de uma população
Ex: idade média dos correntistas do Banco do Brasil ao abrir sua primeira conta-corrente
(μ=21,52anos);
renda percapita dos correntistas da Caixa Ecônomica no Destrito Federal (μ = 2.900 reais)
Estimador: é uma fórmula matemática que permite calcular um valor (estimador por ponto) ou com um
conjunto de valores (estimador por intervalo) para um parâmetro.
n

Ex: Média aritmética: ∑x i


, onde
n

∑x i = x1 + x2 + ... + xn e n = número de observações.


X = i =1
i =1
n
Estimativa: valor do estimador calculado em uma amostra. Estima o valor do parâmetro.
Ex: idade média dos correntistas do Banco do Brasil ao abrir sua primeira conta-corrente, calculado em
uma amostra de 120.000 correntistas no Brasil: média amostral = 21,2 anos.

44
Tipos de Amostragem
Probabilística: cada unidade amostral tem probabilidade conhecida e diferente de zero de pertencer à
amostra. É usada alguma forma de sorteio para a obtenção da amostra.
Não probabilística: não se conhece a probabilidade de cada unidade amostral pertencer à amostra.
Algumas unidades terão probabilidade zero de pertencer à amostra.
Ex: amostragem intencional; por voluntários; acesso mais fácil; por quotas.
Tipos de amostragem probabilística
- aleatória simples (com e sem reposição)
- sistemática
- estratificada
- por conglomerado
Amostragem aleatória simples (AAS)
É o processo de amostragem onde qualquer subconjunto de n elementos diferentes de uma população de
N elementos tem mesma probabilidade de ser sorteado (Kalton G. 1983, Silva, NN, 1998). Tamanho da
população: N; tamanho da amostra: n; fração global de amostragem ou probabilidade de sortear um
n
indivíduo =
N
- É necessário ter um sistema de referência que contenha todos os elementos da população da qual será
retirada a amostra.
- Utilização da tabela de números aleatórios – mecânica.
- Utilização de programas computacionais.
Amostragem sistemática
Utiliza-se a ordenação natural dos elementos da população (prontuários, casa, ordem de nascimento).
N
- Intervalo de amostragem k = , onde N= tamanho da população e n = tamanho da amostra.
n
- Início casual i, sorteado entre 1 e k, inclusive.
- Amostra sorteada é composta pelos elementos: i, i+k, i+2k, ...., i+(n-1)k.
OBS: É necessário ter cuidado com a periodicidade dos dados, por exemplo se for feito sorteio de dia no
mês, pode cair sempre em um domingo onde o padrão de ocorrência do evento pode ser diferente.
N 80
Exemplo: N=80; n=10; k = = = 8 ; início casual: 1 ≤ i ≤ 8
n 10
Começo casual sorteado: i=4
Amostra composta dos elementos:
i 4
i+k 12
i+2k 20
. .
. .
. .
i+(n-1)k 76
Se o intervalo de amostragem não for inteiro proceder da seguinte forma:
N 321
N= 321 ; n=154; k = = = 2,084
n 154
i deve ser um número sorteado entre 1 e 2,084
Sortear um número entre 1000 e 2084 e dividir o resultado por 1000

45
Número sorteado = 1941, portanto i=1,941
Indivíduos: elemento
i 1,941 1
i+k 1,941+2,084 = 4,025 4
i+2k 1,941+4,168 = 6,109 6
i+3k 1,941+6,252 = 8,193 8
. .
. .
. .
i+(n-1)k 1,941+318,852 = 320,793 320
Amostragem por conglomerado
É o processo no qual os elementos da população são reunidos em grupos que constituem a unidade
amostral e, por sua vez, alguns destes são sorteados para comporem a amostra. Se o interesse residir no
sorteio de escolares, em um processo de amostragem por conglomerados, seria possível sortear
escolas(unidade amostral) e considerar todos os alunos destas para comporem a amostra (Silva, 1998).
4.5 Apuração de dados
Processo no qual conta-se o número de vezes que a variável assumiu um determinado valor (freqüência
de ocorrência). Pode ser manual, mecânica ou eletrônica (programas estatísticos: Epi info, Stata, Excel,
SPSS, SAS, R, S-Plus)
Distribuição de freqüências - correspondência entre categorias (valores) e freqüência de ocorrência.

 v a l o pr eo sn t u a i s
Distribuição de freqüências 
 v a l o er mei sn t e r v da ecl ol as s s e
Notação:
X : variável
xi : valor observado para o indivíduo i
Apresentação pontual
Ex: 10 indivíduos
X: número de refeições diárias
xi: 2, 3, 3, 1, 5, 2, 3, 2, 3
Apuração:
número de refeições freqüência absoluta
1 1
2 3
3 4
5 1

X: idade (anos inteiros)


xi: 5, 5, 15, 20, 20, 20, 21, 21, 22, 22
idade freqüência
5 2
15 1
20 3
21 2
22 2
46
X: peso ao nascer em gramas
xi: 2250, 3025, 1600, 2725, 3750, 3950, 2400, 2180, 2520, 2530
peso freqüência
1600 1
2180 1
2250 1
2400 1
2520 1
2530 1
2725 1
3025 1
3750 1
3950 1

X: altura em metro
xi: 1,63; 1,60; 1,59; 1,60; 1,45; 1,73; 2,05; 1,85
altura freqüência
1,45 1
1,59 1
1,60 2
1,63 1
1,73 1
1,85 1
2,05 1
4.6 Apresentação tabular
Elementos essenciais: título, corpo, cabeçalho e coluna indicadora.
Tabela 1 - Título: o que (natureza do fato estudado)?como (variáveis)?onde? quando?
Variável nº %

Total
Fonte
notas, chamadas
OBS: nenhuma casela (intersecção entre linha e coluna) deve ficar em branco.
A tabela deve ser uniforme quanto ao número de casas decimais e conter os símbolos – ou 0 quando o
quando não se dispõe do dado ou valor numérico é nulo respectivamente.
Como idade é variável quantitativa contínua, a melhor forma de apresentá-la em tabelas é utilizando
intervalos de valores denominados intervalos de classe.
Exemplo:
x: 5, 5, 15, 20, 20, 20, 21, 21, 22, 22

Idade freqüência %
5 |-- 10 2 20
10 |-- 15 0 -
15 |-- 20 1 10
20 |-- 25 7 70
Total 10 100

47
Intervalos de classe: conjunto de observações contidas entre dois valores limite (limite inferior e limite
superior)
Representação:
5 |-- 10 intervalo fechado no limite inferior e aberto no limite superior (contém o valor 5 mas não contém
o valor 10)
5 -- 10 intervalo aberto nos limites inferior e superior (não contém os valores 5 e 10)
5 |--| 10 intervalo fechado nos limites inferior e superior (contém os valores 5 e 10)
OBS: Representar o intervalo 0 |-- | 11 meses é equivalente a representá-lo como 0 |-- 12 meses
Os intervalos de classe devem ser mutuamente exclusivos (um indivíduo não pode ser classificado em
dois intervalos ao mesmo tempo) e exaustivos (nenhum indivíduo pode ficar sem classificação).
A amplitude do intervalo é o tamanho do intervalo de classe. A amplitude do intervalo e o número de
intervalos dependem basicamente do problema específico e da literatura existente sobre o assunto.
O ponto médio do intervalo é calculado somando-se o limite inferior e limite superior, dividindo-se o
resultado por dois.

48
4.7 Tabela de dupla entrada ou de contingência
Exemplo: Tabela retirada do artigo Cartografia do retardo estatural em escolares do estado da Paraíba.
Brasil. Carvalho AT et al. Rev Saúde Pública 2000; 34(1):3-8.

Exemplo:
Os dados contidos no arquivo de nome AEUNB.xls, são relativos a uma pesquisa realizada pela
Associação de Educadores da UnB (AEUnB), sobre aspectos sócio-econômicos e culturais de
comunidades de baixa renda da de uma determinada região do entorno do DF. As variáveis foram
organizadas da seguinte forma:
Coluna 1: Número do questionário (Num)
Coluna 2: Cidade do DF (Cidade)
Coluna 3: Sexo (Sexo): (1) se masculino e (2) se feminino
Coluna 4: Faixa de idade, em anos (Idade):
(1) de 14(inclusive) a 25(exclusive)
(2) de 25(inclusive) a 35(exclusive)
(3) de 35(inclusive) a 45(exclusive)
(4) 45 anos ou mais
Coluna 5: Estado Civil (Ecivil):
(1) solteiro
(2) casado
(3) divorciado
(4) viúvo
(5) outros
Coluna 6: Região de procedência (Reproce)
Coluna 7: Tempo de residência no DF em anos (TempoDF)
Coluna 8: Número de residentes na casa (Resid)
Coluna 9: Trabalho (Trab): (1) sim, (2) não e (3) aposentado
Coluna 10: Tipo de trabalho, só para os que responderam que trabalham (Ttrab)
(1) empregado com carteira
(2) empregado sem carteira
(3) profissional liberal
(4) autônomo
(5) rural
Coluna 11: Idade que começou a trabalhar, em anos (Itrab)
Coluna 12: Renda familiar em faixas em de reais (Renda):
(1) de 0 (inclusive) a 300(exclusive)
(2) de 300 (inclusive) a 450(exclusive)
(3) de 450 (inclusive) a 700(exclusive)
(4) de 700 (inclusive) a 900(exclusive)
(5) de 900 (inclusive) a 1500(exclusive)
(6) 1500 ou mais
49
Coluna 13: Acesso a computador (Acompu): (1) sim e (2) não
Coluna 14: Série em que parou de estudar (Serief): em branco não parou de estudar; 1 a 9 (séries do
ensino fundamental); 10 a 12 (séries do ensino médio).
Tabela com as 22 primeiras observações:
Num Cidade Sexo Idade Ecivil Reproce TempoDF Resid Trab Ttrab Itrab Renda Acompu Serief
1 Guará 2 4 4 Nordeste 21 9 3 20 1 2 1
2 Guará 2 1 1 Sudeste 24 9 1 1 14 2 2 7
3 Guará 2 2 1 Nordeste 31 3 1 1 14 5 2 7
4 Guará 1 2 2 Nordeste 10 3 1 4 10 5 2 11
5 Guará 2 4 2 Nordeste 31 6 1 1 11 6 1 4
6 Guará 2 4 2 Sudeste 24 4 2 15 4 2 4
7 Guará 1 1 1 Sudeste 20 4 1 1 15 6 2 11
8 Guará 2 1 1 Sudeste 20 4 1 1 20 6 1
9 Guará 2 4 2 Sudeste 46 3 1 1 14 5 2 11
10 Guará 2 4 2 Sudeste 20 5 1 2 9 3 2
11 Guará 2 3 2 Nordeste 11 7 1 2 7 3 2 2
12 Guará 1 3 2 Nordeste 18 4 1 4 4 1 2 5
13 Guará 2 1 2 Nordeste 29 5 2 4 2 10
15 Guará 2 1 1 Sudeste 16 3 2 2 2
16 Guará 2 3 3 Nordeste 20 7 1 2 12 4 2 5
17 Guará 2 2 2 Sudeste 33 10 1 4 17 6 2 11
18 Guará 1 4 2 Sudeste 45 4 1 4 7 5 2 8
19 Guará 1 4 2 Sul 25 4 1 1 12 3 2 8
20 Guará 2 4 2 Sudeste 30 4 1 1 18 6 1 11
21 Guará 2 2 2 Sul 30 7 1 2 12 6 2 5
22 Guará 2 2 2 Sudeste 29 4 2 15 6 2 10

Carregando os dados no R-project e lendo as 22 primeiras linhas:


aeunb<-read.xls ("AEUNB.xls ")
attach(aeunb)
aeunb[1:22,]

Num Cidade Sexo Idade Ecivil Reproce TempoDF Resid Trab Ttrab Itrab Renda Acompu Serief
1 1 Guará 2 4 4 Nordeste 21 9 3 NA 20 1 2 1
2 2 Guará 2 1 1 Sudeste 24 9 1 1 14 2 2 7
3 3 Guará 2 2 1 Nordeste 31 3 1 1 14 5 2 7
4 4 Guará 1 2 2 Nordeste 10 3 1 4 10 5 2 11
5 5 Guará 2 4 2 Nordeste 31 6 1 1 11 6 1 4
6 6 Guará 2 4 2 Sudeste 24 4 2 NA 15 4 2 4
7 7 Guará 1 1 1 Sudeste 20 4 1 1 15 6 2 11
8 8 Guará 2 1 1 Sudeste 20 4 1 1 20 6 1 NA
9 9 Guará 2 4 2 Sudeste 46 3 1 1 14 5 2 11
10 10 Guará 2 4 2 Sudeste 20 5 1 2 9 3 2 NA
11 11 Guará 2 3 2 Nordeste 11 7 1 2 7 3 2 2
12 12 Guará 1 3 2 Nordeste 18 4 1 4 4 1 2 5
13 13 Guará 2 1 2 Nordeste 29 5 2 NA NA 4 2 10
14 15 Guará 2 1 1 Sudeste 16 3 2 NA NA 2 2 NA
15 16 Guará 2 3 3 Nordeste 20 7 1 2 12 4 2 5
16 17 Guará 2 2 2 Sudeste 33 10 1 4 17 6 2 11
17 18 Guará 1 4 2 Sudeste 45 4 1 4 7 5 2 8
18 19 Guará 1 4 2 Sul 25 4 1 1 12 3 2 8
19 20 Guará 2 4 2 Sudeste 30 4 1 1 18 6 1 11
20 21 Guará 2 2 2 Sul 30 7 1 2 12 6 2 5
21 22 Guará 2 2 2 Sudeste 29 4 2 NA 15 6 2 10
22 23 Guará 1 1 2 Sudeste 20 4 1 2 14 5 2 10

Podemos observar que ao importar os dados do Excel para o R, as perguntas não respondidas no R
receberam a denominação “NA” de not available em inglês.
Construindo algumas tabelas de freqüência usando o banco de dados da pesquisa acima:
Sexo.tb <- table(Sexo)
df<-matrix(0,3,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c("Masculino", "Feminino","Total")
50
df[1,1]<-Sexo.tb["1"]
df[2,1]<-Sexo.tb["2"]
df[3,1]<-length(Sexo)
for(i in 1:3) {df[i,2]<-round(df[i,1]/length(Sexo),4)}
for(i in 1:3) {df[i,3]<-df[i,2]*100}
df
fa fr fp(%)
Masculino 169 0.439 43.9
Feminino 216 0.561 56.1
Total 385 1.000 100.0

write.xls(df, "sexo.xls ")

Distribuição da variável Sexo da pesquisa da AEUnB, de abril 2007.


Sexo fa fr fp(%)
Masculino 169 0,439 43,9
Feminino 216 0,561 56,1
Total 385 1 100
Fonte: AEUnB

Distribuição de freqüência - Idade


Idade.tb<-table(Idade)
df<-matrix(0,5,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c("14 |- 25","25 |- 35","35 |- 45",">= 45","Total")
df[1,1]<-Idade.tb["1"]
df[2,1]<-Idade.tb["2"]
df[3,1]<-Idade.tb["3"]
df[4,1]<-Idade.tb["4"]
df[5,1]<-length(Idade)
for(i in 1:5) {df[i,2]<-round(df[i,1]/length(Idade),4)}
for(i in 1:5) {df[i,3]<-df[i,2]*100}

df
fa fr fp(%)
14 |- 25 128 0.3325 33.25
25 |- 35 105 0.2727 27.27
35 |- 45 79 0.2052 20.52
>= 45 73 0.1896 18.96
Total 385 1.0000 100.00

write.xls(df, "idade.xls")

Distribuição da variável Idade da pesquisa da AEUnB, de abril 2007.


Idade fa fr fp(%)
14 |- 25 128 0,3325 33,25
25 |- 35 105 0,2727 27,27
35 |- 45 79 0,2052 20,52
>= 45 73 0,1896 18,96
Total 385 1 100
Fonte: AEUnB

## Tabela Cruzada

Idade.Sexo<-table(Idade,Sexo)
rownames(Idade.Sexo)<-c("14 |- 25","25 |- 35","35 |- 45",">= 45")
colnames(Idade.Sexo)<-c("Masculino", "Feminino")

Idade.Sexo
Sexo
Idade Masculino Feminino
51
14 |- 25 58 70
25 |- 35 46 59
35 |- 45 31 48
>= 45 34 39

write.xls(Idade.Sexo, "idadesexo.xls")

Trabalhando essa saída no Excel, temos:


Distribuição da variável Idade e Sexo da pesquisa da AEUnB, de abril 2007.
fa fr fp(%)
Idade
Masculino Feminino Masculino Feminino Masculino Feminino
14 |- 25 58 70 0,1506 0,1818 15,06 18,18
25 |- 35 46 59 0,1195 0,1532 11,95 15,32
35 |- 45 31 48 0,0805 0,1247 8,05 12,47
>= 45 34 39 0,0883 0,1013 8,83 10,13
Total 169 216 0,4390 0,5610 43,90 56,10
Fonte: AEUnB

Idade2.Sexo2 <- round(prop.table(Idade.Sexo)*100,2)


Idade2.Sexo2
Sexo
Idade Masculino Feminino
14 |- 25 15.06 18.18
25 |- 35 11.95 15.32
35 |- 45 8.05 12.47
>= 45 8.83 10.13

4.8 Apresentação gráfica


Diagrama de barras
Características: barras separadas e bases de mesmo tamanho.
Apropriados para representar as variáveis: qualitativa nominal, ordinal e quantitativa discreta.
Variável qualitativa nominal
Distribuição de freqüência - Ecivil
Ecivil.tb<-table(Ecivil)
df<-matrix(0,6,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c("solteiro","casado","divorciado","viúvo","outros","Total")
df[1,1]<-Ecivil.tb["1"]
df[2,1]<-Ecivil.tb["2"]
df[3,1]<-Ecivil.tb["3"]
df[4,1]<-Ecivil.tb["4"]
df[5,1]<-Ecivil.tb["5"]
df[6,1]<-length(Idade)
for(i in 1:6) {df[i,2]<-round(df[i,1]/length(Idade),4)}
for(i in 1:6) {df[i,3]<-df[i,2]*100}
df
fa fr fp(%)
solteiro 165 0.4286 42.86
casado 166 0.4312 43.12
divorciado 10 0.0260 2.60
viúvo 12 0.0312 3.12
outros 32 0.0831 8.31
Total 385 1.0000 100.00

write.xls(df, "Ecivil.xls")

Distribuição da variável Estado Civil da pesquisa da AEUnB, de abril 2007.


Estado Civil fa fr fp(%)
52
solteiro 165 0,4286 42,86
casado 166 0,4312 43,12
divorciado 10 0,0260 2,60
viúvo 12 0,0312 3,12
outros 32 0,0831 8,31
Total 385 1 100
Fonte: AEUnB

gc3<- barplot(df[1:5,2], ylab="Freqüência relativa", xlab="Estado Civil",


col=heat.colors(5), ylim=c(0,0.50),
main="Gráfico de Barras do Estado Civil")
text(locator(n=5),paste(df[1:5,2]))

Gráfico de Barras da Estado Civil


0.5

0.4286 0.4312
0.4
Freqüência relativa

0.3
0.2
0.1

0.0831

0.026 0.0312
0.0

solteiro casado divorciado viúvo outros

Estado Civil

Variável qualitativa ordinal


A variável Idade como está dividida por classes assume características de variável qualitativa ordinal,
bem como a variável Renda.
## Distribuição de freqüência (Renda)
Renda.tb<-table(Renda)
df<-matrix(0,7,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c("0 |- 300","300 |- 450","450 |- 700","700 |- 900","900 |- 1500", ">=
1500","Total")
df[1,1]<-Renda.tb["1"]
df[2,1]<-Renda.tb["2"]
df[3,1]<-Renda.tb["3"]
df[4,1]<-Renda.tb["4"]
df[5,1]<-Renda.tb["5"]
df[6,1]<-Renda.tb["6"]
df[7,1]<-length(Renda)
for(i in 1:7) {df[i,2]<-round(df[i,1]/length(Renda),4)}
for(i in 1:7) {df[i,3]<-df[i,2]*100}

53
df
fa fr fp(%)
0 |- 300 37 0.0961 9.61
300 |- 450 76 0.1974 19.74
450 |- 700 74 0.1922 19.22
700 |- 900 120 0.3117 31.17
900 |- 1500 48 0.1247 12.47
>= 1500 30 0.0779 7.79
Total 385 1.0000 100.00
write.xls(df, "Renda.xls")

Distribuição da variável Estado Civil da pesquisa da AEUnB, de abril 2007.


Renda fa fr fp(%)
0 |- 300 37 0,0961 9,61
300 |- 450 76 0,1974 19,74
450 |- 700 74 0,1922 19,22
700 |- 900 120 0,3117 31,17
900 |- 1500 48 0,1247 12,47
>= 1500 30 0,0779 7,79
Total 385 1 100
Fonte: AEUnB
gc3<- barplot(df[1:6,2], ylab="Freqüência relativa", xlab="Renda Familiar",
col=rainbow(6), ylim=c(0,0.40),
main="Gráfico de Barras da Renda Familiar")
text(locator(n=6),paste(df[1:6,2]))

Gráfico de Barras da Renda Familiar


0.4

0.3117
0.3
Freqüência relativa

0.1974 0.1922
0.2

0.1247

0.0961
0.1

0.0779
0.0

0 |- 300 300 |- 450 450 |- 700 700 |- 900 900 |- 1500 >= 1500

Renda Familiar
Fazendo um gráfico de barras da tabela cruzada:

Idade.Sexo<-table(Idade,Sexo)
rownames(Idade.Sexo)<-c("14 |- 25","25 |- 35","35 |- 45",">= 45")
colnames(Idade.Sexo)<-c("Masculino", "Feminino")
Idade2.Sexo2 <- round(prop.table(Idade.Sexo)*100,2)
barplot(Idade2.Sexo2, col=c("lightblue", "mistyrose", "lightcyan", "lavender"),
legend = rownames(Idade2.Sexo2),beside=T,ylab="Porcentagem",ylim=c(0,20))
title("Distribuição da Variável Idade por Sexo", cex.main = 2, font.main= 4,
col.main= "blue")

54
Distribuição da Variável Idade por Sexo
20
14 |- 25
25 |- 35
35 |- 45
>= 45
15
Porcentagem

10
5
0

Masculino Feminino

barplot(Idade.Sexo, space=0.2,col=heat.colors(4),xlab="Idade",ylab="Freqüência",
ylim=c(0,300),legend =rownames(Idade.Sexo))
title("Distribuição da Variável Idade por Sexo", cex.main = 2, font.main= 4,
col.main= "blue")

Distribuição da Variável Idade por Sexo


300

>= 45
35 |- 45
250

25 |- 35
14 |- 25
200
Freqüência

150
100
50
0

Masculino Feminino

Idade
Aplicação de tabela de contingência
Vamos utilizar aqui os dados milsa de Bussab & Morettin e que podem ser obtidos conforme comando
abaixo. Repetimos aqui o preparo inicial dos dados convertendo as variáveis categóricas em fatores do R
e criando a variável idade.
load("C:\\Documents and Settings\\toshiba\\Meus documentos\\Prof Adenilson\\JK
ADM\\Curso de Estatística\\milsa.RData")

55
milsa

funcionario civil instrucao filhos salario ano mes regiao


1 1 1 1 NA 4.00 26 3 1
2 2 2 1 1 4.56 32 10 2
3 3 2 1 2 5.25 36 5 2
4 4 1 2 NA 5.73 20 10 3
5 5 1 1 NA 6.26 40 7 3
6 6 2 1 0 6.66 28 0 1
7 7 1 1 NA 6.86 41 0 1
8 8 1 1 NA 7.39 43 4 2
9 9 2 2 1 7.59 34 10 2
10 10 1 2 NA 7.44 23 6 3
11 11 2 2 2 8.12 33 6 1
12 12 1 1 NA 8.46 27 11 2
13 13 1 2 NA 8.74 37 5 3
14 14 2 1 3 8.95 44 2 3
15 15 2 2 0 9.13 30 5 1
16 16 1 2 NA 9.35 38 8 3
17 17 2 2 1 9.77 31 7 2
18 18 2 1 2 9.80 39 7 3
19 19 1 3 NA 10.53 25 8 1
20 20 1 2 NA 10.76 37 4 1
21 21 2 2 1 11.06 30 9 3
22 22 1 2 NA 11.59 34 2 2
23 23 1 1 NA 12.00 41 0 3
24 24 2 3 0 12.79 26 1 3
25 25 2 2 2 13.23 32 5 1
26 26 2 2 2 13.60 35 0 3
27 27 1 1 NA 13.85 46 7 3
28 28 2 2 0 14.69 29 8 1
29 29 2 2 5 14.71 40 6 1
30 30 2 2 2 15.99 35 10 2
31 31 1 3 NA 16.22 31 5 3
32 32 2 2 1 16.61 36 4 1
33 33 2 3 3 17.26 43 7 2
34 34 1 3 NA 18.75 33 7 2
35 35 2 2 2 19.40 48 11 2
36 36 2 3 3 23.30 42 2 1

milsa <- transform(milsa, civil = factor(civil, label = c("solteiro", "casado"),


levels = 1:2), instrucao = factor(instrucao, label = c("1oGrau", "2oGrau",
"Superior"), lev = 1:3, ord = T), regiao = factor(regiao, label = c("capital",
"interior", "outro"), lev = c(2, 1, 3)))
milsa <- transform(milsa, idade = ano + mes/12)
names(milsa)
[1] "funcionario" "civil" "instrucao" "filhos" "salario" "ano"
"mes" "regiao" "idade"

milsa[1:10,]

funcionario civil instrucao filhos salario ano mes regiao idade


1 1 solteiro 1oGrau NA 4.00 26 3 interior 26.25000
2 2 casado 1oGrau 1 4.56 32 10 capital 32.83333
3 3 casado 1oGrau 2 5.25 36 5 capital 36.41667
4 4 solteiro 2oGrau NA 5.73 20 10 outro 20.83333
5 5 solteiro 1oGrau NA 6.26 40 7 outro 40.58333
6 6 casado 1oGrau 0 6.66 28 0 interior 28.00000
7 7 solteiro 1oGrau NA 6.86 41 0 interior 41.00000
8 8 solteiro 1oGrau NA 7.39 43 4 capital 43.33333
9 9 casado 2oGrau 1 7.59 34 10 capital 34.83333
10 10 solteiro 2oGrau NA 7.44 23 6 outro 23.50000

Tabelas de contingência podem ser obtidas com as freqüências de ocorrência dos cruzamentos das
variáveis. A seguir mostramos algumas opções da vizualização dos resultados usando a função table()
e a função ftable(). As funções retornam as tabelas de contingência em um objeto que pode ser uma
56
matrix, no caso do cruzamento de duas variáveis, ou de forma mais geral, na forma de um array, onde o
número de dimensões é igual ao número de variáveis. Entretanto a classe do objeto resultante vai
depender da função utilizada. Neste caso, para o cruzamento de apenas duas variáveis, os resultados são
exibidos de forma semelhante. No exemplo consideram-se as variáveis civil e instrucao que situadas
nas colunas 2 e 3 do data-frame.
> t1 <- table(milsa[c(2, 3)])
> t1
instrucao
civil 1oGrau 2oGrau Superior
solteiro 7 6 3
casado 5 12 3

> t1f <- ftable(milsa[c(2, 3)])


> t1f
instrucao 1oGrau 2oGrau Superior
civil
solteiro 7 6 3
casado 5 12 3

> sapply(list(t1, t1f), class)


[1] "table" "ftable"
> sapply(list(t1, t1f), is.matrix)
[1] TRUE TRUE
> sapply(list(t1, t1f), is.array)
[1] TRUE TRUE

Ambas funções possuem o argumento dnn que pode ser usado para sobrescrever os nomes das dimensões
do objeto resultante.
> dimnames(t1)
$civil
[1] "solteiro" "casado"

$instrucao
[1] "1oGrau" "2oGrau" "Superior"

> t1 <- table(milsa[c(2, 3)], dnn = c("Estado Civil", "Nível de Instrução"))


> dimnames(t1)
$`Estado Civil`
[1] "solteiro" "casado"

$`Nível de Instrução`
[1] "1oGrau" "2oGrau" "Superior"

> t1f <- table(milsa[c(2, 3)], dnn = c("Estado Civil", "Nível de Instrução"))

As diferenças na forma de exibir os resultados são mais claras considerando-se o cruzamento de três ou
mais variáveis. Enquanto table() vai exibir um array da forma usual, mostrando as várias camadas
separadamente, ftable() irá arranjar a tabela de forma plana, em uma visualização mais adequada para
a leitura dos dados. Vamos considerar o cruzamento das variáveis civil, instrucao e regiao situadas
nas colunas 2, 3 e 8 do data-frame.
> t2 <- with(milsa, table(civil, instrucao, regiao))
> t2
, , regiao = capital

instrucao
civil 1oGrau 2oGrau Superior
solteiro 2 1 1
casado 2 4 1

57
, , regiao = interior

instrucao
civil 1oGrau 2oGrau Superior
solteiro 2 1 1
casado 1 6 1

, , regiao = outro

instrucao
civil 1oGrau 2oGrau Superior
solteiro 3 4 1
casado 2 2 1

> t2f <- with(milsa, ftable(civil, instrucao, regiao))


> t2f
regiao capital interior outro
civil instrucao
solteiro 1oGrau 2 2 3
2oGrau 1 1 4
Superior 1 1 1
casado 1oGrau 2 1 2
2oGrau 4 6 2
Superior 1 1 1
>
Enquanto que o objeto retornado por table() não é uma matrix, mas sim um array de três dimensões,
por serem três variáveis. A dimensão do array é de 2 × 3 × 3 por haver 2 estados civis, 3 níveis de
instrução e 3 regiões. Já o objeto retornado por ftable() ainda é uma matriz, neste caso de dimensão 6
× 3 onde 6 = 2 × 3 indicando o produto do número de nívies das duas primeiras variáveis.
> sapply(list(t2, t2f), is.matrix)
[1] FALSE TRUE
> sapply(list(t2, t2f), is.array)
[1] TRUE TRUE
> sapply(list(t2, t2f), dim)
[[1]]
[1] 2 3 3
[[2]]
[1] 6 3

Com ftable() é possível ainda criar outras visualizações da tabela. Os argumentos row.vars e
col.vars podem ser usados para indicar quais variáveis serão colocadas nas linhas e colunas, e em que
ordem. No exemplo a seguir colocamos o estado civil e região de procedência (variáveis 1 e 3) nas
colunas da tabela e também modificamos o nome das dimensões da tabela com o argumento dnn. O
objeto resultante é uma matrix de dimens˜ao 6 × 3.
> with(milsa, ftable(civil, instrucao, regiao, dnn = c("Estado Civil:", "Nível de
Instrução", "Procedência:"), col.vars = c(1, 3)))
Estado Civil: solteiro casado
Procedência: capital interior outro capital interior outro
Nível de Instrução
1oGrau 2 2 3 2 1 2
2oGrau 1 1 4 4 6 2
Superior 1 1 1 1 1 1

Extensões: freqüências relativas e gráficos


As funções table() e ftable() retornam objetos das classes table e ftable, respectivamente. A
partir de tais objetos, outras funções podem ser utilizadas tais como prop.table() para obtenção de
freqüências relativas, ou barplot() para gráficos de barras. A distinção entre as classes não é importante
no caso de cruzamento entre duas variáveis. Entretanto para três ou mais variáveis os resultados são bem
diferentes, devido ao fato já mencionado de que table() retorna um array de dimensão igual ao
número de variáveis, enquanto que ftable() retorna sempre uma matriz.

58
Vejamos primeiro os resultados de freqüências relativas para duas variáveis, que não diferem entre as
clases. Da mesma forma, no caso de duas variáveis, as margens da tabelas obtidas de uma ou outra forma
são as mesmas.
> prop.table(t1)
Nível de Instrução
Estado Civil 1oGrau 2oGrau Superior
solteiro 0.19444444 0.16666667 0.08333333
casado 0.13888889 0.33333333 0.08333333
> prop.table(t1f)
instrucao 1oGrau 2oGrau Superior
civil
solteiro 0.19444444 0.16666667 0.08333333
casado 0.13888889 0.33333333 0.08333333
> prop.table(t1,margin=1)
Nível de Instrução
Estado Civil 1oGrau 2oGrau Superior
solteiro 0.4375 0.3750 0.1875
casado 0.2500 0.6000 0.1500
> prop.table(t1f,margin=1)
instrucao 1oGrau 2oGrau Superior
civil
solteiro 0.4375 0.3750 0.1875
casado 0.2500 0.6000 0.1500
> margin.table(t1,mar=1)
Estado Civil
solteiro casado
16 20
> margin.table(t1,mar=2)
Nível de Instrução
1oGrau 2oGrau Superior
12 18 6
> par(mfrow=c(2,2))
> plot(t1,main="")
> plot(t1f,main="")
> barplot(t1,beside=T,legend=T)
> barplot(t1f,beside=T,legend=T)

solteiro casado
12
11
1oGrau
Nível de Instrução

10
t1f[,2]

9
2oGrau

8
7
Superior

Estado Civil 5.0 5.5 6.0 6.5 7.0

t1f[,1]
12

12

solteiro
10

10

casado
8

8
6

6
4

4
2

2
0

1oGrau 2oGrau Superior 59


> prop.table(t2)
, , regiao = capital

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.05555556 0.02777778 0.02777778
casado 0.05555556 0.11111111 0.02777778

, , regiao = interior

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.05555556 0.02777778 0.02777778
casado 0.02777778 0.16666667 0.02777778

, , regiao = outro

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.08333333 0.11111111 0.02777778
casado 0.05555556 0.05555556 0.02777778

> prop.table(t2f)
regiao capital interior outro
civil instrucao
solteiro 1oGrau 0.05555556 0.05555556 0.08333333
2oGrau 0.02777778 0.02777778 0.11111111
Superior 0.02777778 0.02777778 0.02777778
casado 1oGrau 0.05555556 0.02777778 0.05555556
2oGrau 0.11111111 0.16666667 0.05555556
Superior 0.02777778 0.02777778 0.02777778

> prop.table(t2,margin=1)
, , regiao = capital

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.1250 0.0625 0.0625
casado 0.1000 0.2000 0.0500

, , regiao = interior

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.1250 0.0625 0.0625
casado 0.0500 0.3000 0.0500

, , regiao = outro

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.1875 0.2500 0.0625
casado 0.1000 0.1000 0.0500

> prop.table(t2f,margin=1)
regiao capital interior outro
civil instrucao
solteiro 1oGrau 0.2857143 0.2857143 0.4285714
2oGrau 0.1666667 0.1666667 0.6666667
Superior 0.3333333 0.3333333 0.3333333
casado 1oGrau 0.4000000 0.2000000 0.4000000
2oGrau 0.3333333 0.5000000 0.1666667
Superior 0.3333333 0.3333333 0.3333333

60
> prop.table(t2, margin=3)
, , regiao = capital

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.18181818 0.09090909 0.09090909
casado 0.18181818 0.36363636 0.09090909

, , regiao = interior

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.16666667 0.08333333 0.08333333
casado 0.08333333 0.50000000 0.08333333

, , regiao = outro

instrucao
civil 1oGrau 2oGrau Superior
solteiro 0.23076923 0.30769231 0.07692308
casado 0.15384615 0.15384615 0.07692308

> par(mfrow=c(1,2))
> plot(t2, main="")
> barplot(t2f,beside=T)

solteiro casado
capital interior outro capital interior outro
5
1oGrau

4
instrucao

3
2oGrau

2
1
Superior

civil

61
5 Estudo das Medidas
de tendência central ou de posição
Medidas de variabilidade ou de dispersão ou de variação
de formato

5.1 Medidas de Tendência Central ou de Posição


5.1.1 Definição:
Medidas de tendência central, como o próprio nome já diz, são aquelas cujo resultado tende localizar-se
no centro da série.
De modo geral, se houver a necessidade ou interesse em apresentar informações de um conjunto de dados
na forma resumida devemos apresentá-los em forma de medidas de tendência central.
As medidas mais utilizadas em estatística são:a média, a moda e a mediana.
5.1.2 Medidas para Dados não Agrupados
5.1.2.1 Média ( X )
- Aritmética
- Simples
- Ponderada
- Geométrica
- Harmônica
5.1.2.2 Média Aritmética Simples
Para se obter a média aritmética simples de um conjunto de dados, devemos dividir a soma dos valores
de todos os dados do conjunto pela quantidade deles.
n
∑x i
X = i =1
n
Exemplo:
> aeunb<-read.xls ("AEUNB.xls")
> fix(aeunb)
> aeunb[1:10,]
Num Cidade Sexo Idade Ecivil Reproce TempoDF Resid Trab Ttrab Itrab Renda
1 1 Guará 2 4 4 Nordeste 21 9 3 NA 20 1
2 2 Guará 2 1 1 Sudeste 24 9 1 1 14 2
3 3 Guará 2 2 1 Nordeste 31 3 1 1 14 5
4 4 Guará 1 2 2 Nordeste 10 3 1 4 10 5
5 5 Guará 2 4 2 Nordeste 31 6 1 1 11 6
6 6 Guará 2 4 2 Sudeste 24 4 2 NA 15 4
7 7 Guará 1 1 1 Sudeste 20 4 1 1 15 6
8 8 Guará 2 1 1 Sudeste 20 4 1 1 20 6
9 9 Guará 2 4 2 Sudeste 46 3 1 1 14 5
10 10 Guará 2 4 2 Sudeste 20 5 1 2 9 3
Acompu Serief
1 2 1
2 2 7
3 2 7
4 2 11
5 1 4
6 2 4
7 2 11
8 1 NA
9 2 11
10 2 NA
> mean(TempoDF)
[1] 19.01039
> sum(TempoDF)
[1] 7319
> length(TempoDF)
62
[1] 385
> sumTempoDF<- sum(TempoDF)
> lengthTEmpoDF<- length(TempoDF)
> média <- sumTempoDF/lengthTEmpoDF
> média
[1] 19.01039
4

∑x i
21 + 24 + ... + 16 7319
X= i =1
= = = 19,01039
n 385 285

A Média do Tempo que reside no DF - X - indica que o tempo médio dessa população (amostra)
residente no DF é de 19,01039 anos.
Propriedades da média
- a soma algébrica dos desvios tomados em relação à média é nula. ∑( xi − X ) = 0.

- a soma algébrica dos quadrados dos desvios (em realçào à média) é mínima.
∑( xi − X ) 2 ≤ ∑( xi − yi ) 2 , onde X ≠ y i .
- somando ou subtraindo uma constante a todos valores de uma variável, a média ficará acrescida ou
∑ ( xi + k ) = ∑ xi + ∑ k = ∑ xi + nk = X + k .
subtraída dessa constante. n n n
- multiplicando (ou dividindo) todos os valores de uma variável por uma constante, a média ficará
∑kx i = k ∑ xi = kX .
multiplicada ou dividida por essa constante. n n
5.1.2.3 Moda (Mo )
Moda de uma série é o dado que mais se repete ou que possui a maior freqüência.

Exemplo:
Distribuição da variável Estado Civil da pesquisa da AEUnB, de abril 2007.
Estado Civil fa fr fp(%)
Solteiro 165 0,4286 42,86
Casado 166 0,4312 43,12
Divorciado 10 0,0260 2,60
Viúvo 12 0,0312 3,12
Outros 32 0,0831 8,31
Total 385 1 100
Fonte: AEUnB

Achando a Moda da variável Ecivil no R:


> Ecivil.tb<-table(Ecivil)
> Ecivil.mo <- names(Ecivil.tb)[ Ecivil.tb==max(Ecivil.tb)]
> Ecivil.mo
[1] "2"
Ecivil igual a “2” corresponde ao Estado Civil “casado”, como pode ser observado na Tabela de
Distribuição acima.
5.1.2.4 Mediana (Me)
É o elemento que está exatamente no centro das informações ordenadas. Para se obter o elemento
mediana de uma série deveremos seguir os seguintes passos:
N +1
P=
a) Se N for ímpar a mediana é o termo de ordem 2 .
N N
P1 = P2 = +1
b) Se N for par é a média aritmética dos termos de ordem: 2 e 2

63
Exemplos:
a) Determine o valor da mediana da série que é composta dos seguintes elementos: 56, 58 , 62, 65 e 90.
Solução:
N +1 5 +1
N = 5 (ímpar), P = = = 3 0 elemento da série ordenada . Então Me = 62.
2 2

b) Pesquisa realizada a respeito de erros por folha, cometidos por digitadores, revelou as seguintes
quantidades: 12, 12, 13, 13, 15, 16, 18,20. Determinar a quantidade mediana de falhas.
Solução:
8 8
P1 =
= 4 0 elemento e P2 = + 1 = 5 0 elemento
N = 8(par), então 2 2
13 + 15 28
Me = = = 14
Logo a mediana será: 2 2

Usando o R para calcular a mediana:


Exemplo: Calcular a mediana da variável TempoDF.
> median(TempoDF)
[1] 18

5.1.3 Medidas para Dados Agrupados


5.1.3.1 Média Aritmética ( X )
n
∑xi . Fi
a) Sem intervalos de classe X = n
i =1

∑Fi
i =1
Exemplo: Coluna 8: Número de residentes na casa (Resid)
Resid.tb<-table(Resid)
df<-matrix(0,11,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c(1:10,"Total")
for(i in 1:10) {df[i,1]<- Resid.tb[i]}
df[11,1]<-length(Resid)
for(i in 1:11) {df[i,2]<-round(df[i,1]/length(Resid),4)}
for(i in 1:11) {df[i,3]<-df[i,2]*100}
df

fa fr fp(%)
1 25 0.0649 6.49
2 30 0.0779 7.79
3 78 0.2026 20.26
4 90 0.2338 23.38
5 57 0.1481 14.81
6 40 0.1039 10.39
7 30 0.0779 7.79
8 17 0.0442 4.42
9 11 0.0286 2.86
10 7 0.0182 1.82
Total 385 1.0000 100.00

> write.xls(df,"Resid.xls")

Após os devidos tratamentos no Excel, temos:


Distribuição da variável Número de residentes na casa (Resid):
Resid fa fr fp(%)
1 25 0,0649 6,49
64
2 30 0,0779 7,79
3 78 0,2026 20,26
4 90 0,2338 23,38
5 57 0,1481 14,81
6 40 0,1039 10,39
7 30 0,0779 7,79
8 17 0,0442 4,42
9 11 0,0286 2,86
10 7 0,0182 1,82
Total 385 1 100
Fonte: AEUnB
Xi Fi XiFi
1 25 25
2 30 60
3 78 234
4 90 360
5 57 285
6 40 240
7 30 210
8 17 136
9 11 99
10 7 70
Total 385 1719

1719
Cálculo da média: X = = 4,464935
385
No R:
Resid.média<-sum(1:10*df[1:10,1])/sum(df[1:10,1])
Resid.média
[1] 4.464935

b) Com intervalos de classe


n
∑PM . Fi
X = i =1 n , onde PM é o ponto médio de cada intervalo de classe.
∑Fi
i =1
Coluna 7: Tempo de residência no DF em anos (TempoDF)
TempoDF.hist<- hist(TempoDF, plot=F,right=F)
TempoDF.hist
$breaks
[1] 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70

$counts
[1] 44 45 51 64 65 50 27 13 12 10 3 0 0 1

$intensities
[1] 0.0228571429 0.0233766234 0.0264935065 0.0332467532 0.0337662338 0.0259740260
0.0140259740 0.0067532468 0.0062337662
[10] 0.0051948052 0.0015584416 0.0000000000 0.0000000000 0.0005194804

$density
[1] 0.0228571429 0.0233766234 0.0264935065 0.0332467532 0.0337662338 0.0259740260
0.0140259740 0.0067532468 0.0062337662
[10] 0.0051948052 0.0015584416 0.0000000000 0.0000000000 0.0005194804

$mids
[1] 2.5 7.5 12.5 17.5 22.5 27.5 32.5 37.5 42.5 47.5 52.5 57.5 62.5 67.5

65
$xname
[1] "TempoDF"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

df<-matrix(0,15,3)
colnames(df)<-c("fa","fr","fp(%)")
rownames(df)<-c(“0|-5”, “5|-10”, “10|-15”, “15|-20”, “20|-25”, “25|-30”, “30|-35”,
“35|-40”, “40|-45”, “45|-50”, “50|-55”, “55|-60”, “60|-65”, “65|-|70”,"Total")
for(i in 1:14) {df[i,1]<- TempoDF.hist$counts[i]}
df[15,1]<-length(TempoDF)
for(i in 1:15) {df[i,2]<-round(df[i,1]/length(Resid),4)}
for(i in 1:15) {df[i,3]<-df[i,2]*100}
df

fa fr fp(%)
0|- 5 44 0.1143 11.43
5|- 10 45 0.1169 11.69
10|- 15 51 0.1325 13.25
15|- 20 64 0.1662 16.62
20|- 25 65 0.1688 16.88
25|- 30 50 0.1299 12.99
30|- 35 27 0.0701 7.01
35|- 40 13 0.0338 3.38
40|- 45 12 0.0312 3.12
45|- 50 10 0.0260 2.60
50|- 55 3 0.0078 0.78
55|- 60 0 0.0000 0.00
60|- 65 0 0.0000 0.00
65|-|70 1 0.0026 0.26
Total 385 1.0000 100.00
>
> write.xls(df,"TempoDF.xls")

Após os devidos tratamentos no Excel, temos:


Distribuição da variável Tempo de residência no DF em anos (TempoDF):
TempoDF fa fr fp(%)
0 |-- 5 44 0,1143 11,43
5 |-- 10 45 0,1169 11,69
10 |-- 15 51 0,1325 13,25
15 |-- 20 64 0,1662 16,62
20 |-- 25 65 0,1688 16,88
25 |-- 30 50 0,1299 12,99
30 |-- 35 27 0,0701 7,01
35 |-- 40 13 0,0338 3,38
40 |-- 45 12 0,0312 3,12
45 |-- 50 10 0,0260 2,60
50 |-- 55 3 0,0078 0,78
55 |-- 60 0 0,0000 0,00
60 |-- 65 0 0,0000 0,00
65 |--| 70 1 0,0026 0,26
Total 385 1 100
Fonte: AEUnB

Xi PM Fi PMFi
0 |-- 5 2,5 44 110
5 |-- 10 7,5 45 337,5
10 |-- 15 12,5 51 637,5

66
15 |-- 20 17,5 64 1120
20 |-- 25 22,5 65 1462,5
25 |-- 30 27,5 50 1375
30 |-- 35 32,5 27 877,5
35 |-- 40 37,5 13 487,5
40 |-- 45 42,5 12 510
45 |-- 50 47,5 10 475
50 |-- 55 52,5 3 157,5
55 |-- 60 57,5 0 0
60 |-- 65 62,5 0 0
65 |--| 70 67,5 1 67,5
Total - 385 7617,5
7617 ,5
Cálculo da média: X = = 19,78571
385
No R:
TempoDF.média<-sum(seq(2.5,67.5,5)*df[1:14,1])/sum(df[1:14,1])
TempoDF.média
[1] 19.78571
> mean(TempoDF)
[1] 19.01039

Quando quebramos uma variável por classes perdemos precisão nos cálculos nas medidas de tendência
central.

5.1.3.2 Mediana ( Me )
a) Sem intervalos de classe
Mediana é o valor da variável correspondente a freqüência acumulada que é imediatamente superior à
N
P= .
2
Resid Fi Fac
1 25 25
2 30 55
3 78 133
4 90 223
5 57 280
6 40 320
7 30 350
8 17 367
9 11 378
10 7 385
Total 385 -

Temos que a mediana é o valor da variável de freqüência acumulada imediatamente superior à


385
P= = 192 ,5. Portanto, a Me = 4.
2
b) Com intervalos de classe
 P − Fi ' ac 
Me = LiMe +  ×h onde:

 F i 

LiMe - Limite inferior da classe mediana;
'
Fi ac - freqüência acumulada da classe anterior à classe mediana;
P - é a posição da mediana;
Fi - é a freqüência simples da classe mediana;
h - é a amplitude do intervalo da classe mediana.

TempoDF PM Fi Fac
0 |-- 5 2,5 44 44

67
5 |-- 10 7,5 45 89
10 |-- 15 12,5 51 140
15 |-- 20 17,5 64 204
20 |-- 25 22,5 65 269
25 |-- 30 27,5 50 319
30 |-- 35 32,5 27 346
35 |-- 40 37,5 13 359
40 |-- 45 42,5 12 371
45 |-- 50 47,5 10 381
50 |-- 55 52,5 3 384
55 |-- 60 57,5 0 384
60 |-- 65 62,5 0 384
65 |--| 70 67,5 1 385
Total - 385 -
385
P= = 192 ,5.
2
LiMe = 15;
'
Fi ac = 140;
P = 192,5;
Fi = 64;
h=5
192 ,5 −140 
Me = 15 +  ×5 = 19,1015625
 64 
> median(TempoDF)
[1] 18

Como podemos ver existe uma perda considerável na precisão do cálculo quando quebramos a variável
TempoDF por classes para o cálculo da mediana.

5.1.3.3 Moda (Mo)


a) Sem intervalos de classe:
Basta fixar o valor da variável de maior freqüência. Portanto, para a variável Resid é igual a 4.

b) Com intervalos de classe


 f Mo − f ant 
Mo = LiMo +   ×h
2 f Mo −( f ant + f post ) 
 

Para a variável TempoDF quebrada por classes, podemos obter o valor da moda da seguinte maneira:
 65 −64 
Mo = 20 +   ×5 =20 ,3125
2 ×65 −( 64 +50 ) 
Idade.tb<-table(Idade)
Idade.mo <- names(Idade.tb)[ Idade.tb==max(Idade.tb)]
Idade.mo

[1] "20"

Como podemos ver houve uma pequena perda do cálculo quando quebramos a variável TempoDF por
classes para o cálculo da moda.

68
Comparação entre Média, Mediana e Moda:

Medida de Posição Vantagens Desvantagens


Reflete cada valor É influenciada por valores
Média
observado na distribuição extremos
Menos sensível a valores Difícil de determinar para
Mediana
extremos do que a Média grandes quantidades de dados
Maior quantidade de valores Não se presta à análise
Moda
concentrados neste ponto matemática

5.2 Medidas de dispersão


Apesar das medidas de tendência central fornecerem uma idéia do comportamento das variáveis elas
podem esconder valiosas informações. Essas medidas podem não ser suficientes para descrever e
discriminar diferentes conjuntos de dados. Por exemplo: a renda per capita no nosso país.
É fácil construir exemplos onde dois conjuntos de dados distintos possuem medidas de posição idênticas.
Em muitas dessas situações existe diferença em relação à dispersão dos dados, isto é, quanto à maneira
como os valores de cada conjunto se espalham. A fim de quantificar tal característica, vamos definir
algumas medidas. de dispersão.
5.2.1 Valores mínimo e máximo
Valores extremos da distribuição
5.2.2 Amplitude de variação
- Amplitude de uma variável em um conjunto de dados:
- A amplitude amostral é uma das medidas de dispersão mais simples.
- É dada pela diferença entre os valores máximo e mínimo observados na amostra.
- Se x é o vetor que contém os dados, podemos calcular a amplitude amostral como
- amplitude<-max(x)-min(x).
- A grande desvantagem da amplitude amostral como medida para caracterizar a dispersão num
conjunto de dados é que ela só leva em conta o mínimo e o máximo dos dados, ignorando todo o
resto.
Ulizando o R para o cálculo da Amplitude:

> TempoDF.ampl<- max(TempoDF)-min(TempoDF)


> TempoDF.ampl
[1] 66
> summary(TempoDF)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 10.00 18.00 19.01 26.00 67.00

69
> by(TempoDF,Cidade,summary)
INDICES: Ceilândia
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 7.25 17.00 17.24 24.00 50.00
------------------------------------------------------------------------------------
INDICES: Guará
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 8.00 15.00 17.51 25.00 67.00
------------------------------------------------------------------------------------

INDICES: Recanto
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 11.50 18.00 17.21 21.00 37.00
------------------------------------------------------------------------------------
INDICES: Samambaia
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.00 12.00 18.50 19.44 25.00 49.00
------------------------------------------------------------------------------------
INDICES: Taguatinga
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 14.00 23.00 23.11 34.50 52.00

5.2.3 Amplitude interquartílica ou Distância entre quartis (DEQ)


- Uma medida de dispersão um pouco mais refinada que a amplitude amostral é a distância entre
quartis (DEQ).
- Depois de ordenada a amostra, divide-se ela em quatro partes de freqüência relativa ¼. Tomam-se
então os valores que correspondem à freqüência relativa acumulada de ¼ e ¾, que são chamados
respectivamente de primeiro e terceiro quartis (Q1 e Q3). É a diferença entre o terceiro quartil e o
primeiro quartil, ou seja, Q3 - Q1.
- DEQ=Q3-Q1
- No R podemos calcular a distância entre quartis para um vetor de dados x da seguinte forma deq<-
IQR(x)
- Mas, esta medida, ainda tem a desvantagem de só levar em conta dois valores do conjunto, ignorando
os extremos e o meio.
Utilizando o Softwere R-Project para fazer DEQ da variável Altura :
> TempoDF.IQR<-IQR(TempoDF)
> TempoDF.IQR
[1] 16
> summary(TempoDF)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 10.00 18.00 19.01 26.00 67.00
>

5.2.4 Variância
Indica o quanto, em média, os quadrados dos desvios de cada observação em relação à média aritmética
estão afastados desta média.
N

Variância populacional: ∑ (X i − X )2
σ2 = i =1

N
n

Variância amostral: ∑ (x i − x)2


1
S2 = i =1

n −1
Utilizando o Softwere R-Project para calcular a variância amostral:
> var(TempoDF)
[1] 138.0520

70
> TempoDF.var<-sum((TempoDF-mean(TempoDF))^2)/(length(TempoDF)-1)
> TempoDF.var
[1] 138.0520
>

5.2.5 Desvio padrão


É a raiz quadrada da variância , ou seja σ = σ2
S = S2

Utilizando o Softwere R-Project para calcular o desvio padrão amostral:


> sd(TempoDF)
[1] 11.74955
> sqrt(var(TempoDF))
[1] 11.74955

5.2.6 Coeficiente de Variação de Pearson (CV)


- É uma medida da variação relativa em um conjunto de valores numéricos.
- Costuma ser expresso em termos percentuais.
- Mede a dispersão dos dados em relação à média aritmética.
- É definido por CV=(DP/média)x100%, onde DP é o desvio-padrão dos dados, média é a média
aritmética dos dados.
Utilizando o R-Project para cálcular o coeficiente de variação amostral de Pearson
> TempoDF.cv<-sd(TempoDF)/mean(TempoDF)*100
> TempoDF.cv
[1] 61.80595

71

You might also like