Como discutido em aula anterior, dados são atributos pertencentes a indivíduos.Estes atributos estão são coletados e armazenados de forma bruta, ou seja, com nenhum ou muito pouco tratamento que lhe confira algum valor para além daquele no momento da coleta. Quando processamos esses dados, aplicando qualquer tipo de método analítico, estamos buscando extrair valor dos atributos registrados nas tabelas do banco de dados. A este conteúdo novo, formado pelo tratamento dos dados, damos o nome de informação. A informação pode emergir de várias formas, como indicadores (e.g. consumo médio de sorvete ou índice de qualidade do ar), ou até mesmo como correlação (e.g. quanto maior o raio do tronco de uma árvore, maior sua idade).
Existem riscos inerentes ao processo de tratamento dos dados e sua consequente produção de informações, mas que trataremos em outro momento. É importante destacar que a informação é produto de um esforço analítico dos dados, mas que não pode ser considerado o fim do processo. É necessário que se faça a síntese, a busca pela conexão entre as várias informações adquiridas de forma clara, sabendo das limitações dos dados e apoiando-se no conhecimento acumulado ao longo da história. A essa conexão que agrega ainda mais valor à informação damos o nome de conhecimento. Podemos ainda associar a aplicação do conhecimento a transformação da realidade de sabedoria.
No campo do planejamento e gestão, é crucial conhecer a realidade para intervir de forma eficaz e eficiente. Tanto na noção de gestão estratégica como na contemporânea análise de políticas públicas, o uso de dados tem sido imperativo para a tomada de decisão mais responsável. Isso porque espera-se que conheçamos tanto a realidade que desejamos intervir como entender as consequencias das ações praticadas. O modelo de gestão baseada em dados e chamado de gestão baseada em evidências, que possui sua versão para a administração pública, demoniada de gestão pública baseada em evidências
A gestão pública baseada em evidências, com grande protagonismo atualemente com a evolução da nossa capacidade computacional e aspectos legais de uso de dados, pesosais ou não, pode ser entendida como uma cadeia de produção. Essa cadeia se inicia com a coleta ou aquisição de dados e a organização em uma estrutura, com banco de dados armazenados em equipamentos próprios ou terceirizados. Os dados são tratados, analisados nas mais diversas formas para a construção do conhecimento e oferecido para servir de insumo para a tomada de decisão. Como estamos falando de gestão pública, espera-se atender a população de forma eficiente, justa e transparente.
A linguagem R é muito utilizada por estatísticos e por aqueles que trabalham com estatística aplicada. Não por acaso é uma das principais linguagens de programação em análise de dados. Como já vimos, podemos utilizar o R para executar operações matemáticas.
2*3
## [1] 6
O R retorna o valor (6) no console. O índice 1 indica que o primeiro
e único resultado é o valor 6. Existem contudo, conjunto de comandos que
dificilmente lembraríamos. Assim, pode-se utilizar a janela
help do RStudio, ou ainda utilizar o comando
??
no console. Por exemplo, pode-se verificar, por exemplo,
como executar um gráfico a partir do comando plot
,
utilizando no console o comando ??plot
.
O R possui alguns comandos elementares. Apesar do RStudio oferecer uma janela Environment com todos os objetos abertos no ambiente, podemos listá-los. Podemos criar alguns objetos, como exemplo:
L<-13
P<-"Reinaldo" # como Reinaldo é um texto (ou seja, formato character), usa-se aspas para diferenciá-lo
Reparem que podemos utilizar #
para que o R ignore os
comentários escritos na linha.Comentários são bastante úteis,
considernado que, no futuro, talvez seja interesse reabrir o script e
recordar o que foi feito e o porquê.
Existem alguns comandos que podem ser utilizados, como o comando
seq()
. Este comando oferece uma sequencia, a partir dos
argumentos oferecidos. Vejamos um exemplo:
seq(from=1,to=21,by=2) # sequência do número 1 até o número 21, saltando de duas em duas unidades
## [1] 1 3 5 7 9 11 13 15 17 19 21
seq(from=0,to=5,by=0.5) # sequência de 0 a 5, saltando de 0.5 em 0.5.
## [1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
seq(from=0,to=5) # sequência de 0 a 5.
## [1] 0 1 2 3 4 5
Vejam que a função é composta, nesse caso, por três argumentos. A
omissão do argumento by
torna o número 1 como valor padrão.
Várias funções do R possuem valores iniciais como padrão em caso de não
preenchimento. É possível, também omitir o nome dos argumentos, desde
que respeitada a sequencia dos mesmos.
seq(1,20) # sequência numérica do número 1 até o número 20
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
seq(1,21,2) #sequência númérica de do número 1 até o número 21, saltando de duas em duas unidades
## [1] 1 3 5 7 9 11 13 15 17 19 21
A vantagens é a flexiblidade e a redução do tamanho do código. Entretanto, é possível mudar a ordem dos argumentos somente se utilizarmos seus nomes.
seq(by=10,to=100, from=0) # vejam que os argumentos foram trocados de ordem, mas somente podemos fazê-lo se utilizarmos seus nomes.
## [1] 0 10 20 30 40 50 60 70 80 90 100
Os argumentos e mais detalhes sobre cada função ou comando podem ser consultados na janela de ajuda. Por hora, vejamos abaixo alguns argumentos ou funções muito úteis para a manipulação de objetos:
Comando | Resultado |
---|---|
# |
O R irá ignorar o que estiver após, na mesma linha |
; |
Torna possível a execução de dois comandos na mesma linha |
NA |
Dado ausente |
q() |
Sai do programa |
ls() |
Lista os objetos atualmente ativos na sessão do R |
rm(x) |
Remove o objeto x |
rm(z,y) |
Remove os objetos z e y |
rm(list=ls()) |
Remove todos os objetos abertos |
c() |
Concatena valores em um vetor |
Como vimos anteriormente, os objetos criados em R podem ter uma variedade de formas e tipos de atributos. Abaixo discutiremos as características principais qeu esses objetos podem ter.
Abaixo estão listados alguns tipos de dados e seus testes de
verificação, bem como métodos de conversão. apesar dessa variedade,
iremos utilizar mais frequentemente três tipos: numeric
,
logical
e character
.
Tipo | Teste | Conversão |
---|---|---|
character | is.character() |
as.character() |
complex | is.complex() |
as.complex() |
double | is.double() |
as.double() |
expression | is.expression() |
as.expression() |
integer | is.integer() |
as.integer() |
list | is.list() |
as.list() |
logical | is.logical() |
as.logical() |
numeric | is.numeric() |
as.numeric() |
single | is.single() |
as.single() |
raw | is.raw() |
as.raw() |
function | is.function() |
as.function() |
Vejamos alguns exemplos.
x<-"8" # atribuímos "8" ao objeto x
is.numeric(x) # testamos se x é numérico.
## [1] FALSE
Os comandos de teste retornam valores lógicos, ou seja,
TRUE
ou FALSE
. Nesse caso, como usamos aspas
para caracterizar o número 8, ele se tornou do tipo
character
.
x<-"8"
is.character(x)
## [1] TRUE
y<-as.numeric(x) # y será uma versão numérica de x
is.numeric(y)
## [1] TRUE
Podemos, também, fazer outros tipos de testes.
z<-c(256,"Geografia",FALSE)
is.logical(z)
## [1] FALSE
is.numeric(z)
## [1] FALSE
is.character(z)
## [1] TRUE
Como vimos anteriormente, o comando c()
cria um vetor.
Nesse caso, vetores assuem apenas um tipo de valor e, por ter ao menos
um tipo character
, todos absorvem a mesma característica.
Podemos tentar converter, mas vamos perceber que algumas conversões não
são possíveis e os valores assumem o atributo NA
.
z<-c(256,"Geografia",FALSE)
as.numeric(z)
## Warning: NAs introduzidos por coerção
## [1] 256 NA NA
as.logical(z)
## [1] NA NA FALSE
Outro teste que podemos fazer é utilizar argumentos lógicos com
sinais de igualdade ==
ou desigualdade
>
,>=
,<
e
<=
.
x<-c(10,20,30,40,50) # x agora é um vetor com 5 elementos
x>25 # teste para saber quais valores são maiores que 25
## [1] FALSE FALSE TRUE TRUE TRUE
x==40 # teste para saber quais valores são iguais a 40
## [1] FALSE FALSE FALSE TRUE FALSE
Observe que os valores resultantes dos testes são do tipo
logical
, de forma que:
x<-40
is.logical(x==40)
## [1] TRUE
class(x) # verifica o tipo de dado
## [1] "numeric"
Veja que inserimos o comando class()
no código acima.
Esse comando permite identificar o tipo de objeto que estamos
analisando, tanto o tipo de dado como o tipo de estrutura de dados.
Veremos algumas estruturas abaixo para ficar mais claro.
Em geral, trabalharemos com estruturas de objetos que comportam mais de um tipo de dado. O quadro abaixo apresenta as principais estruturas utilizadas em R.
Estrutura | Descrição |
---|---|
vector |
Vetor com um ou mais elementos. É também uma matriz com uma linha ou uma coluna |
matrix |
Conjunto de dados, ou array, formado por mais de uma linha e mais de uma coluna |
array |
Conjunto de dados com uma, duas ou mais dimensões |
factor |
Tipo de vetor que apresenta dados categóricos |
data.frame |
Similar a matriz, porém permite que colunas diferentes possam armazenar tipos diferentes de dados |
list |
Objeto que permite combinas diferentes tipos de dados ou estruturas em um único objeto |
Vamos trabalhar com alguns exemplos. Comecemos pelas matrizes.
V<-seq(1,9) # criamos um vetor, a partir do comando seq() visto anteriormente.
is.vector(V)
## [1] TRUE
M<-matrix(data = seq(1,9), byrow = FALSE, ncol = 3)
is.vector(M)
## [1] FALSE
is.matrix(M)
## [1] TRUE
M
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
Agora vejamos como acessar dados de uma matriz. Em linhas gerais,
podemos inserir, após os objetos, colchetes []
que
permitiram identificar linhas e colunas ([linhas,colunas]
).
Vejamos no exemplo.
# Refazendo a matriz
M<-matrix(data = seq(1,9), byrow = FALSE, ncol = 3)
#gostaríamos de identificar a primeira coluna de M
M[,1] # veja que deixamos o espaço das linhas vazio
## [1] 1 2 3
# Para mostrar o elemento da segunda linha e terceira coluna...
M[2,3]
## [1] 8
# ou a terceira linha
M[3,]
## [1] 3 6 9
Esses valores entre colchetes são chamados de índices das matrizes. Podemos, também, analisar as características gerais das matrizes da seguinte forma:
X<-matrix(1:12,ncol=4) # construção da matriz
X
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
dim(X) # dimensões da matriz
## [1] 3 4
Podemos adicionar mais uma coluna ao conjunto de dados da matriz, por
meio do comando cbind()
, ou linha, por meio do comando
rbind()
X<-matrix(1:12,ncol=4) # construção da matriz
X
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
X<-cbind(X,c(6,6,6)) # adicionamos uma coluna com a repetição do número 6.
X<-rbind(X,c(9,9,9,9,9)) # veja que a sequencia tem cinco números 9, uma vez que adicionamos uma coluna anteriormente.
X
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 4 7 10 6
## [2,] 2 5 8 11 6
## [3,] 3 6 9 12 6
## [4,] 9 9 9 9 9
Por fim, podemos aplicar filtros, utilizando os índices vistos anteriormente. Nesse caso:
X<-matrix(1:24,ncol=4) # construção da matriz
X
## [,1] [,2] [,3] [,4]
## [1,] 1 7 13 19
## [2,] 2 8 14 20
## [3,] 3 9 15 21
## [4,] 4 10 16 22
## [5,] 5 11 17 23
## [6,] 6 12 18 24
X[X[,2]>10,] # mostrar os valores de X em que a segunda coluna de X apresenta valores superiores a 10
## [,1] [,2] [,3] [,4]
## [1,] 5 11 17 23
## [2,] 6 12 18 24
Os data.frames são conjuntos de dados similares as matrizes, porém
aceitam tipos de valores diferentes em cada campo. Isso significa que,
em uma tabela ou data.frame, pode haver uma coluna em formato
numeric
e outra, no mesmo objeto, logical
ou
character
.
Vamos criar um objeto com os dados da aula anterior.
pessoas<-data.frame(Identificador=c(10001,10002,10003,10004),
Idade=c(42,15,50,78),
cod_sex=c(1,2,2,1),
cod_mun=c(3106200,3136702,3550308,1200013))
pessoas # data.frame de pessoas
## Identificador Idade cod_sex cod_mun
## 1 10001 42 1 3106200
## 2 10002 15 2 3136702
## 3 10003 50 2 3550308
## 4 10004 78 1 1200013
sexo<-data.frame(cod_sex=c(1,2),sexo=c("Homens","Mulheres"))
sexo
## cod_sex sexo
## 1 1 Homens
## 2 2 Mulheres
# podemos unir os dois data.frames com o comando merge()
merge(x=pessoas,y=sexo, by.x="cod_sex",by.y="cod_sex")
## cod_sex Identificador Idade cod_mun sexo
## 1 1 10001 42 3106200 Homens
## 2 1 10004 78 1200013 Homens
## 3 2 10002 15 3136702 Mulheres
## 4 2 10003 50 3550308 Mulheres
As colunas dos data.frames podem ser acessadas por meio de
$
, que separam o nome da tabela do nome do campo. Ou ainda
podemos combinar essa informação com os índices de matrizes.
pessoas<-data.frame(Identificador=c(10001,10002,10003,10004),
Idade=c(42,15,50,78),
cod_sex=c(1,2,2,1),
cod_mun=c(3106200,3136702,3550308,1200013))
pessoas$Idade
## [1] 42 15 50 78
pessoas$Idade[3]
## [1] 50
pessoas[2,3]
## [1] 2
Por fim, as listas podem assumir qualquer tipo de estrutura em seu interior. Vejá o exemplo abaixo.
x<-data.frame()
class(x)
## [1] "data.frame"
lista<-list(x,z=2,Reinaldo="Reinaldo",M=TRUE)
lista # vejam que os objetos também possuem índices ou podem ser acessados com $
## [[1]]
## data frame com 0 coluna e 0 linha
##
## $z
## [1] 2
##
## $Reinaldo
## [1] "Reinaldo"
##
## $M
## [1] TRUE
lista[2]
## $z
## [1] 2
MELLO, M.P.; PETERNELLI, L.A. Conhecendo o R. Uma visão mais que Estatística.Editora UFV, 2013.
RIPLEY, Brian D. et al. The R project in statistical computing. MSOR Connections. The newsletter of the LTSN Maths, Stats & OR Network, v. 1, n. 1, p. 23-25, 2001.