Escolar Documentos
Profissional Documentos
Cultura Documentos
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/
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
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
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
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.
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
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
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"
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
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
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)
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
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
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
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
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
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
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, ]
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
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
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
0.5401
0.5
0.4
Freqüência Relativa
0.3
0.267
0.1929
0.2
0.1
0.0
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]))
0.1929
Nível de Terceirização
Médio
0.267
Baixo
0.5401
Freqüência relativa
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")
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,]
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”:
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
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)
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:
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
vu 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
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: 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
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
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")
## 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")
write.xls(df, "Ecivil.xls")
0.4286 0.4312
0.4
Freqüência relativa
0.3
0.2
0.1
0.0831
0.026 0.0312
0.0
Estado Civil
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")
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")
>= 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
milsa[1:10,]
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
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"
$`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
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
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
t1f[,1]
12
12
solteiro
10
10
casado
8
8
6
6
4
4
2
2
0
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
∑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
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
∑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")
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
$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")
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 -
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.
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:
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.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
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
>
71