Mais um pouco sobre dados

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.


Hierarquia entre dados, informação, conhecimento e 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


Modelo de gestão pública baseada em dados

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.

Trabalhando no R

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.

Comandos e seus argumentos

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:


Comandos e símbolos importantes

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

Tipos e estrutura de dados em R

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.

Tipos de dados em R

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.


Tipos de objetos

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.

Estrutura de dados em R

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.


Tipos de objetos

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

Vetores e Matrizes

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

Data.frames

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

Listas

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

Sugestões de leitura

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.