Curso Básico de R

Preview:

DESCRIPTION

Curso básico de R preparado para o MCTI

Citation preview

Prof. Dr. Roberto Dantas de Pinho, roberto.pinho@mct.gov.br

Este curso tomou como base material dos profs. Dr. Paulo Justiniano Ribeiro Jr (UFPR) e Dr. Cosme Marcelo Furtado Passos da Silva (FIOCRUZ)

1

Um primeira sessão com o R

Objetos Entrada de dados Agora que temos

os dados... Algumas análises

Filtragem e seleção

Salvando seu trabalho

Manipulando dados

Somas e agregações

Regressão linear

2

E muitas outras coisas ao longo do caminho

Você pode usar o R para avaliar algumas expressões aritméticas simples. Digite:1 + 2 + 3

2 + 3 * 4

3/2 + 1

4 * 3**3

O R é uma ambiente e uma linguagem

6

O ambiente R permite que você envie comandos e veja seus resultados imediatamente

A linguagem R é composta pelo conjunto de regras e funções disponíveis que podem ser executados no ambiente R.

Você pode juntar sequências de comandos em scripts para uso posterior

7

Um série de funções estão disponíveis. Alguns exemplos simples:

sqrt(2)

abs(-10)

sin(pi)

pi é uma constante do R, seu valor já é definido

2

10

)sin(

8

Resultados, dados de entrada , tabelas, etcsão armazenados no R em Objetos

Objetos possuem um nome, conteúdo , um tipo e são armazenados na memória. Ex.

Criar o objeto “x” contendo o número 10:x <- 10

Exibir o conteúdo de x:x

No R, abc é diferente de ABC

9

Experimente:X <- sqrt(2)

Y = sin(pi)

Z = sqrt(X+Y)

Nos exemplos acima, X, Y e Z armazenam os resultados das respectivas operações

No R, sempre existem muitas formas de fazer a mesma coisa.

<- e = são equivalentes.

Vamos focar sempre em uma.

10

Qual o valor de C ao final da sequência de comandos abaixo?A = 1

B = 2

C = A + B

A = 5

B = 5

Por quê?

11

12

Ambiente que facilita o uso do R Organiza as janelas de trabalho Acesso facilitado aos objetos e histórico de

comandos.

13

Edição de Scripts e

exibição de objetos

Console

14

Lista de objetos

e histórico

Ajuda, gráficos,

arquivos e

pacotes

15

Objeto que armazena múltiplos dados de um único tipo

A função c( ) (“c” de concatenar ou de conjunto) permite agrupar valores para formar um vetor:X = c(1,3,6)

Para acessar elementos do vetor:X[1] X[3]

16

Operações aritméticas e funções podem ser aplicadas a todo um vetor. Ex.X = c(1,3,5)

Y = c(10,20,30)

X+Y

11 23 35

sum(X)

9

E X + 100 ?101 103 105 pela Lei da reciclagem

17

Quando o tamanho pedido por uma operação é diferente dos dados disponíveis, os dados existentes são repetidos até completar o necessário.

Como X tem 3 elementos, X+100 é o

mesmo que X + c(100,100,100)

18

> X = 1:10

> [1] 1 2 3 4 5 6 7 8 9 10

> X = seq(0,1,by=0.1)

> [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

> rep(“a”,5)

> “a” “a” “a” “a” “a”

> nomes = c("fulano", "beltrano",

"cicrano")

> nomes [1] "fulano" "beltrano" "cicrano"

> letras = letters[1:5]

> letras [1] "a" "b" "c" "d" "e"

> letras = LETTERS[1:5]

> letras [1] "A" "B" "C" "D" "E"

19

numeric is.numeric( )

as.numeric( )

character is.character( )

as.character( )

integer is.integer( )

as.integer( )

logical T == TRUE == 1

F == FALSE == 0

A == B significa “A é igual a B?”

20

Vetor organizado em linhas e colunasm1 <- matrix(1:12, ncol = 3)

[,1] [,2] [,3]

[1,] 1 5 9

[2,] 2 6 10

[3,] 3 7 11

[4,] 4 8 12

21

length(m1) [1] 12 dim(m1) [1] 4 3 nrow(m1) [1] 4 ncol(m1) [1] 3

22

m1[1, 2]

[1] 5

m1[2, 2]

[1] 6

m1[ , 2]

[1] 5 6 7 8

m1[3, ]

[1] 3 7 11

23

m1[1,2]= 99

muda o valor da célula

m1[1:2, 2:3]

[,1] [,2]

[1,] 5 9

[2,] 6 10

24

colnames(m1)

NULL

rownames(m1)

NULL

colnames(m1) = c("C1","C2","C3")

m1[,”C1”]

[1] 1 2 3 4t(m1) transposta de m1

25

“matriz” com várias dimensões. Ex. com 3 dim.:ar1 <- array(1:24, dim = c(3, 4, 2)), , 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

Para um array de 3 dimensões, você pode entender a 3ª

dimensão como uma coleção de matrizes.

1ª matriz

2ª matriz

26

Como trabalhar com coisas assim?

Ano UFCódigo do ÓrgãoÓrgão Código da UO unidade orçamentária função subfunção programa açãolocalizador descrição da ação valor P&D valor ACTC

2010 AC 1

Adm

direta e

indireta 1 Adm direta e indireta 19 121 2056 1548

MODERNIZAÇÃO DO SISTEMA DE

PLANEJAMENTO E GESTÃO DA SDCT R$ - R$ 16.655,00

2010 AC 1

Adm

direta e

indireta 1 Adm direta e indireta 19 121 2056 1549

PROGRAMA DE COOPERAÇÃO TÉCNICA E

FINANCEIRA COM INSTIT. NAC. INTERN.

GOVERNAMENTAIS E NÃO

GOVERNAMENTAIS R$ - R$ 715.000,00

2010 AC 1

Adm

direta e

indireta 1 Adm direta e indireta 19 122 2009 2224

MANUTENÇÃO DO GABINETE DO SECRETÁ

RIO R$ - R$ 27.732,11

2010 AC 1

Adm

direta e

indireta 1 Adm direta e indireta 19 122 2009 2227 DEPARTAMENTO DE GESTÃO INTERNA R$ - R$ 2.266.169,90

27

Cada coluna tem o seu tipod = data.frame(letters[1:4], 1:4, 10.5)

letters.1.4. X1.4 X10.5

1 a 1 10.5

2 b 2 10.5

3 c 3 10.5

4 d 4 10.5

Podemos mudar o nome das colunas:colnames(d) = c("letra","num", "valor")

colnames(d)

[1] "letra" "num" "valor“

d$valor # seleciona a coluna “valor” de d

colnames(d) [1] "letra" "num" "valor"

Na maior parte do tempo usaremos data.frames

28

lista fator

29

veremos depois...

Diversas fontes. Veremos:

Teclado x = scan( )

Arquivos Excel

Arquivos CSV

Bancos de Dados SQL

30

require(XLConnect)

wb <- loadWorkbook(“AC_PDACTCaula.xls”)

plan1 <- readWorksheet(wb, sheet = 1)

str(plan1)

View(plan1)

31

require(XLConnect)

Carrega o pacote XLConnect Pacotes são conjuntos de funções e dados

que adicionam funcionalidades ao R. Se o pacote não estiver instalado:

setInternet2() #somente no windows

install.packages("XLConnect", dep=T)

32

Cria um objeto “wb” que aponta para o arquivo excel:

wb <-

loadWorkbook(“AC_PDACTCaula.xls”)

33

Carrega os dados da primeira planilha (“aba”) em um objeto chamado “plan1”

plan1 <- readWorksheet(wb, sheet = 1)

As funções no R identificam os parâmetros pela ordem

34

As funções no R identificam os

parâmetros pela ordem

Ou utilizando o nome do

parâmetro

Mostra a estrutura do objeto criado:

str(plan1)

Mostra os dados carregados em uma janela:

View(plan1)

35

str() funciona para qualquer

objeto do R. É muito útil.

No RStudio, você pode clicar em um objeto na lista de objetos

args(readWorksheet) #mostra parâmetros

function (

object, #o workbook “wb”

sheet, #número ou nome da

“aba”/planilha

startRow, #linha inicial daimportação

startCol, #col. inicial da importação

endRow, #linha final da importação

endCol, #col. final da importação

header # T ou F: usar primeira

linha para dar nome às

colunas )

36

Comma-separated values: valores separados por vírgula

Formato de arquivo muito comum para troca de dados

São comuns outros separadores: <tab> ; <espaço>

Exemplo:uf ano valido somaactc somapd

AC 2009 1 34296430.67 3630841.04

AC 2010 1 29397712.04 3579715.12

AL 2009 1 12650160.51 8903714.41

37

Exemplo:uf ano valido somaactc somapd

AC 2009 1 34296430,67 3630841,04

AC 2010 1 29397712,04 3579715,12

AL 2009 1 12650160,51 8903714,41

Para ler este arquivo:d = read.csv(file="AgregaUF20110930_b.txt",

header=T, # usa primeira linha como cabeçalho

sep="\t", # separador de valores é <tab>

dec="," # separador decimal é vírgula

)

38

str(d) #estrutura criada

summary(d) #resumo estatístico

head(d) #primeiros registros

tail(d) #últimos registros

plot(d) #visualização padrão

39

require(RODBC)

canal <- odbcConnect(

“base_ODBC",

case="tolower“,

uid=“usuário”,

pwd=“senha”)

d <- sqlQuery(canal,

”select * from tabela where ano = 2010”,

as.is=T)

40

Como fazer a soma de uma coluna de um data.frame?sum(data.frame$coluna)

sum(d$somapd)

[1] NA

41

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.

42

Tente: c(-1,0,1)/0

Soma:sum(d$somapd, na.rm=T)

[1] 4836882446

Média:sum(d$somapd, na.rm=T)

Mediana:median(d$somapd, na.rm=T)

Desvio padrão:sd(d$somapd, na.rm=T)

43

Para estes exemplos:milsa = read.csv("milsaText.txt",

sep="\t", head=T, dec=".")

44

Frequências absolutastable(milsa$civil)

Frequências relativastable(milsa$civil) /

length(milsa$civil)

ou

prop.table(milsa$civil)

Gráfico de setorespie(table(milsa$civil))

45

Com attach(milsa)

Frequências absolutastable(civil)

Frequências relativastable(civil) /

length(civil)

ou

prop.table(civil)

Gráfico de setorespie(table(civil))

46

depois: detach(milsa)

Gráfico de barras:barplot(table(instrucao))

Lembrando:

Posso salvar resultados como objetos e usá-los várias vezes

instrucao.tb = table(instrucao)

barplot(instrucao.tb )

pie(instrucao.tb )

47

Tente:prop.table(filhos)

Solução:prop.table(table(filhos))

Outra solução:

Filtrar os elementos com NA

48

mean(filhos, na.rm=T) #média

median(filhos, na.rm=T) #mediana

range(filhos, na.rm=T) #amplitude

var(filhos, na.rm=T) #variância

sd(filhos, na.rm=T) #desvio padrão

Quartis: filhos.quartis = quantile(filhos, na.rm=T)

Amplitude inter-quartis:

filhos.quartis [4] -filhos.quartis [1]

49

plot(milsa)

plot(salario ~ ano)

hist(salario)

boxplot(salario)

stem(salario)

50

Selecionando algumas linhas milsaNovo = milsa[c(1,3,5,6) , ]

Selecionando algumas colunas milsaNovo = milsa[ , c(1,3,5)]

milsaNovo = milsa[ , c(“funcionario”,

”instrucao“, “salario”)]

Atenção: Cria cópia

milsaNovo=milsa[c(1,3,5,6) ,]

Substitui anterior milsa=milsa[c(1,3,5,6) , ]

51

Quem ganha acima da mediana acimamediana = milsa[ salario >

median(salario), ]

Quais são os casados com nível superior? casadoEsuperior = milsa[

civil==“casado” & instrucao ==

“Superior”, ]

52

E: ambas as condições devem ser verdadeiras

Quais são os casados ou quem tem nível superior?

casadoOUsuperior = milsa[

civil==“casado” | instrucao ==

“Superior”, ]

53

OU: pelo menos uma das condições deve ser

verdadeira

milsaLimpo=milsa[!is.na(salario), ]

Em português: Nova tabela milsaLimpo

É igual =

Tabela antiga milsa

Selecione [

Linhas Salário não é NA ! is.na(salario)

e todas as colunas , ]

54

NÃO

QUANTOS são os casados? sum(civil==“casado”)

ou

table(civil)["casado"]

QUANTOS são os casados e tem nível superior? sum(civil==“casado” & instrucao

== “Superior” )

table(civil,instrucao)["casado",

"Superior"]

55

milsaNovo é igual a milsa, sem as linhas 1,2 e 5 e sem as colunas 1 e 8:

milsaNovo =

milsa[-c(1,2,5), -c(1,8)]

56

sup = which(instrucao=="Superior“)

[1] 19 24 31 33 34 36

Posso usar depois: mean(milsa[sup,”salario”])

Média salarial dos que tem nível superior

57

Quais linhas atendem à condição

vantagem: não cria cópia!!

Uma amostra aleatória de 10 elementos de milsa:

amostra =

sample(x=nrow(milsa),size=10)

[1] 12 29 1 3 17 14 26 33 20

31

Média salarial da amostra:

mean(milsa[amostra,”salario”])

58

Em ordem de número de filhos:milsa[order(filhos),]

Decrescente:milsa[order(filhos, decreasing=T),]

Em ordem de número de filhos e depois por idade:milsa[order(filhos,ano),]

Ver os 10 mais novos:head(milsa[order(ano),], 10)

Ver os 10 mais velhos:tail(milsa[order(ano),], 10)

59

Apagando um objeto

rm(milsaNovo)

Apagando tudo

rm(list = ls())

60

ls() : lista de objetos correntes

Objetos do tipo lista são coleções que podem conter objetos de tipos diferentes.

lis = list(A=1:10, B=“Texto”,

C = matrix(1:9,ncol=3)

São muito utilizadas na passagem de parâmetros para funções ou nos resultados de funções.

lis[1:2]

uma lista com os dois primeiros itens de lis (A e B) lis[[1]]: objeto armazenado na primeira posição da lista ( o conteúdo

de A). O mesmo que lis$A

61

Para salvar todos os objetos:save.image(“arquivo.RData”)

Para salvar alguns objetos:save( x, y,

file=“arquivo.RData”)

Carregando:load(“arquivo.RData“)

62

Vários “load”: os objetos com nomes distintos se acumulam

Salvar um script “.R” que reproduza os passos feitos.

Vantagem: Além de servir de documentação da criação da base, incorpora alterações na base, se houver.

Modelo híbrido:

Resultados intermediários que requerem muito tempo processamento pode ser salvos em imagem. Ex. agregação de dados de empregados por empresa

63

Criando uma coluna em um data.frame:

milsa$idade =

milsa$ano + milsa$mes/12

64

65

X Y

6+3+5=14

66

X Y

67

X Y

68

X Y

69

X Y

Exemplo:

com

70

Registros com correspondência :merge(x=milsa,

y=tabInst,by.x="instrucao", by.y="desc“,

all=F)

Todos os registros da tabela X:merge(x=milsa,

y=tabInst,by.x="instrucao", by.y="desc",

all.x=T)

71

Todos os registros da tabela y:merge(x=milsa,

y=tabInst,by.x="instrucao", by.y="desc",

all.y=T)

Todos os registros das tabela x e y:merge(x=milsa,

y=tabInst,by.x="instrucao",

by.y="desc", all=T)

72

De texto para númerod.f$novaColuna = as.numeric(d.f$coluna)

De número para texto:d.f$novaColuna=as.character(d.f$coluna)

De texto ou número para inteiro:d.f$novaColuna = as.integer(d.f$coluna)

73

Inteiros economizam memória

Representação de variáveis qualitativas

Nominais

▪ “casado”, “solteiro”

Ordinais

▪ “alto”, “baixo”

Economizam espaço de memória Tratamento apropriado para este tipo de

variável pelas funções do R

74

Fatores economizam memória

Nominal:milsa$fatorcivil=factor(milsa$civil, ordered=F)

$fatorcivil : Factor w/ 2 levels

"casado","solteiro": 2 1 1 2 2 1 2 2 1 2

Ordinal:milsa$fatormes = factor(milsa$mes, ordered=T)

$fatormes : Ord.factor w/ 12 levels

"0"<"1"<"2"<"3"<..: 4 11 6 11 8 1 1 5 11 7 ...

75

É possível definir uma ordem específica: ?factor

De fator para texto:d.f$novaColuna =

as.character(d.f$colunaFator)

De fator para número:d.f$novaColuna =

as.numeric(

as.character(d.f$colunaFator))

76

A representação interna de um fator é diferente do seu texto

Para:m1 <- matrix(1:12, ncol = 3)

Soma das colunas (um valor para cada coluna):colSums(m1)

[1] 10 26 42

Ouapply(m1,2,sum)

[1] 10 26 42

77

Soma das linhas (um valor para cada linha):rowSums(m1)

[1] 15 18 21 24

Ouapply(m1,1,sum)

[1] 15 18 21 24

78

Posso usar qualquer função.

Até próprias

aggregate(salario ~ instrucao,

data = milsa, mean)

instrucao salario

1 1oGrau 7.836667

2 2oGrau 11.528333

3 Superior 16.475000

79

aggregate(

salario ~ instrucao + civil,

data = milsa, mean)

instrucao civil salario

1 1oGrau casado 7.044000

2 2oGrau casado 12.825000

3 Superior casado 17.783333

4 1oGrau solteiro 8.402857

5 2oGrau solteiro 8.935000

6 Superior solteiro 15.166667

80

modelo = lm(

formula = salario ~ ano + instrucao,

data = milsa)

summary(modelo)

81

É uma linha mesmo!!!