Universidade Federal do Paraná
Curso de Estatística
CE 083 -
Estatística Computacional I - 2014/2
Prof. Dr. Walmes Marques Zeviani
Tabela de conteúdo
Instruções para downaload dos dados usados nessa sessão.
social
no topo superior da
página (cor vermelha).temas > demografia
e clicar.Estados
,
selecionar o nível de abrangência Brasil
e selecionar a data
2000
.*.csv
separado por vírgula clicando no último ícone do canto superior
direito. Ao salvar o arquivo dar o nome ipea_demografico.csv
.##-----------------------------------------------------------------------------
## Lendo arquivos de dados.
getwd()
## [1] "/home/walmes/Dropbox/Ensino/ce083-2014-02/aulas"
list.files(pattern="*.csv")
## [1] "a.csv" "ipea_demografico2.csv" "ipea_demografico.csv"
## [4] "ipea_habitacao.csv"
## Este arquivo está em UTF-8.
system("file ipea_demografico.csv")
## As primeiras linhas.
system("head -10 ipea_demografico.csv")
##-----------------------------------------------------------------------------
## Lendo arquivo de dados.
ipea1 <- read.table("ipea_demografico.csv", header=TRUE,
sep=",", dec=".", stringsAsFactors=FALSE)
str(ipea1, vec.len=1)
## 'data.frame': 27 obs. of 9 variables:
## $ Sigla : chr "AC" ...
## $ Código : int 12 27 ...
## $ Estado : chr "Acre" ...
## $ Taxa.de.fecundidade..2000. : num 3.42 3.14 ...
## $ População.rural..2000. : int 187259 902882 ...
## $ População.urbana..2000. : int 370267 1919739 ...
## $ Esperança.de.vida.ao.nascer..2000. : logi NA ...
## $ Mortalidade.infantil..por.mil.nascidos.vivos...2000.: logi NA ...
## $ X : logi NA ...
ipea1$Estado
## [1] "Acre" "Alagoas" "Amazonas"
## [4] "Amapá" "Bahia" "Ceará"
## [7] "Distrito Federal" "Espírito Santo" "Goiás"
## [10] "Maranhão" "Minas Gerais" "Mato Grosso do Sul"
## [13] "Mato Grosso" "Pará" "Paraíba"
## [16] "Pernambuco" "Piauí" "Paraná"
## [19] "Rio de Janeiro" "Rio Grande do Norte" "Rondônia"
## [22] "Roraima" "Rio Grande do Sul" "Santa Catarina"
## [25] "Sergipe" "São Paulo" "Tocantins"
## Não foi preciso informar o encoding porque o default do sistema
## operacional é compatível com o do arquivo.
##-----------------------------------------------------------------------------
## As definições do sistema e encodings disponíveis.
## Configurações do sistema (idioma, codificação, timezone, moeda).
sessionInfo()
## R version 3.1.1 (2014-07-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=pt_BR.UTF-8
## [4] LC_COLLATE=en_US.UTF-8 LC_MONETARY=pt_BR.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=pt_BR.UTF-8 LC_NAME=C LC_ADDRESS=C
## [10] LC_TELEPHONE=C LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets base
##
## other attached packages:
## [1] knitr_1.6
##
## loaded via a namespace (and not attached):
## [1] evaluate_0.5.5 formatR_1.0 stringr_0.6.2 tools_3.1.1
Sys.getlocale("LC_CTYPE") ## Default para leitura de arquivos é UTF-8.
## [1] "en_US.UTF-8"
## Idioma é o inglês dos USA com codificação UTF-8. Isso tem implicações
## na represetação das datas, inclusive.
cbind(month.name, month.abb)
## month.name month.abb
## [1,] "January" "Jan"
## [2,] "February" "Feb"
## [3,] "March" "Mar"
## [4,] "April" "Apr"
## [5,] "May" "May"
## [6,] "June" "Jun"
## [7,] "July" "Jul"
## [8,] "August" "Aug"
## [9,] "September" "Sep"
## [10,] "October" "Oct"
## [11,] "November" "Nov"
## [12,] "December" "Dec"
## Lista de encodings diponíveis.
il <- iconvlist()
length(il)
## [1] 1167
grep("^UTF-", il, value=TRUE) ## Família UTF.
## [1] "UTF-16" "UTF-16BE" "UTF-16LE" "UTF-32" "UTF-32BE" "UTF-32LE" "UTF-7"
## [8] "UTF-8"
grep("^ISO-8859", il, value=TRUE) ## Família ISO (ou Latin).
## [1] "ISO-8859-1" "ISO-8859-10" "ISO-8859-11" "ISO-8859-13" "ISO-8859-14" "ISO-8859-15"
## [7] "ISO-8859-16" "ISO-8859-2" "ISO-8859-3" "ISO-8859-4" "ISO-8859-5" "ISO-8859-6"
## [13] "ISO-8859-7" "ISO-8859-8" "ISO-8859-9" "ISO-8859-9E"
##-----------------------------------------------------------------------------
## Lendo arquivo de dados, usando uma codificação **incorreta**.
ipea2 <- read.table("ipea_demografico.csv", header=TRUE,
sep=",", dec=".", stringsAsFactors=FALSE,
encoding="latin1")
str(ipea2, vec.len=1)
## 'data.frame': 27 obs. of 9 variables:
## $ Sigla : chr "AC" ...
## $ CÃ.digo : int 12 27 ...
## $ Estado : chr "Acre" ...
## $ Taxa.de.fecundidade..2000. : num 3.42 3.14 ...
## $ PopulaÃ.Ã.o.rural..2000. : int 187259 902882 ...
## $ PopulaÃ.Ã.o.urbana..2000. : int 370267 1919739 ...
## $ EsperanÃ.a.de.vida.ao.nascer..2000. : logi NA ...
## $ Mortalidade.infantil..por.mil.nascidos.vivos...2000.: logi NA ...
## $ X : logi NA ...
ipea2$Estado
## [1] "Acre" "Alagoas" "Amazonas"
## [4] "Amapá" "Bahia" "Ceará"
## [7] "Distrito Federal" "EspÃrito Santo" "Goiás"
## [10] "Maranhão" "Minas Gerais" "Mato Grosso do Sul"
## [13] "Mato Grosso" "Pará" "ParaÃba"
## [16] "Pernambuco" "PiauÃ" "Paraná"
## [19] "Rio de Janeiro" "Rio Grande do Norte" "Rondônia"
## [22] "Roraima" "Rio Grande do Sul" "Santa Catarina"
## [25] "Sergipe" "São Paulo" "Tocantins"
## Nesse caso não impediu de fazer a leitura, mas os caracteres
## acentuados foram comprometidos.
## É possível trocar a codificação dentro do R. No entanto, fazer isso
## para cada coluna pode não ser viável. O melhor é ler com o encoding
## correto.
iconv(ipea2$Estado, to="utf-8")
## [1] "Acre" "Alagoas" "Amazonas"
## [4] "Amapá" "Bahia" "Ceará"
## [7] "Distrito Federal" "Espírito Santo" "Goiás"
## [10] "Maranhão" "Minas Gerais" "Mato Grosso do Sul"
## [13] "Mato Grosso" "Pará" "Paraíba"
## [16] "Pernambuco" "Piauí" "Paraná"
## [19] "Rio de Janeiro" "Rio Grande do Norte" "Rondônia"
## [22] "Roraima" "Rio Grande do Sul" "Santa Catarina"
## [25] "Sergipe" "São Paulo" "Tocantins"
##-----------------------------------------------------------------------------
## Fazendo cópia do arquivo com alteração do encoding.
## Comando no terminal do Linux que copia com troca de encoding.
cmd <- "iconv -f UTF-8 -t ISO-8859-1//TRANSLIT
--output=ipea_demografico2.csv ipea_demografico.csv"
## Criar cópia (isso funciona no Linux).
system(strwrap(cmd, w=200))
## Ver se o arquivo foi criado.
list.files(pattern="*.csv")
## [1] "a.csv" "ipea_demografico2.csv" "ipea_demografico.csv"
## [4] "ipea_habitacao.csv"
## Verificar codificação e conteúdo.
system("file ipea_demografico2.csv")
system("head -10 ipea_demografico2.csv")
## Está como Latin1 e será lido como UTF-8 (errado de propósito).
ipea3 <- read.table("ipea_demografico2.csv", header=TRUE,
sep=",", dec=".", stringsAsFactors=FALSE,
encoding="utf-8")
## Error: invalid multibyte string 2
## Dá erro pois não consegue compreender/representar aquelas sequências
## como \363 que é o `ó` de Código.
## É Latin1 e será informado durante a leitura.
ipea3 <- read.table("ipea_demografico2.csv", header=TRUE,
sep=",", dec=".", stringsAsFactors=FALSE,
encoding="latin1")
ipea3$Estado
## [1] "Acre" "Alagoas" "Amazonas"
## [4] "Amapá" "Bahia" "Ceará"
## [7] "Distrito Federal" "Espírito Santo" "Goiás"
## [10] "Maranhão" "Minas Gerais" "Mato Grosso do Sul"
## [13] "Mato Grosso" "Pará" "Paraíba"
## [16] "Pernambuco" "Piauí" "Paraná"
## [19] "Rio de Janeiro" "Rio Grande do Norte" "Rondônia"
## [22] "Roraima" "Rio Grande do Sul" "Santa Catarina"
## [25] "Sergipe" "São Paulo" "Tocantins"
## Foi lido corretamente.
Instruções para downaload dos dados usados nessa sessão.
social
no topo superior da
página (cor vermelha).temas > habitação
e clicar.Municípios
,
selecionar o nível de abrangência Brasil
e selecionar a data
2000
.ipea_habitacao.csv
.##-----------------------------------------------------------------------------
## Lendo dados de habitação.
## Verificar codificação e conteúdo.
system("file ipea_habitacao.csv")
system("head -10 ipea_habitacao.csv")
hab <- read.table("ipea_habitacao.csv", header=TRUE,
sep=",", dec=".", stringsAsFactors=FALSE,
quote="")
str(hab, vec.len=1)
## 'data.frame': 5596 obs. of 10 variables:
## $ Sigla : chr "AC" ...
## $ Código : int 1200013 1200054 ...
## $ Município : chr "Acrelândia" ...
## $ Domicílios...com.água.encanada...pessoas..2000. : num 21.5 ...
## $ Domicílios...com.energia.elétrica...pessoas..2000.: num 56.2 ...
## $ Domicílios...com.telefone...pessoas..2000. : num 8.85 ...
## $ Domicílios...com.carro...pessoas..2000. : num 9.3 ...
## $ Domicílios...com.computador...pessoas..2000. : num 0.947 ...
## $ Domícilios...número..2000. : int 1878 807 ...
## $ X : logi NA ...
## Remove a última coluna que é desnecessária.
hab <- hab[,-ncol(hab)]
## Modifica para nomes curtos nas colunas.
names(hab) <- c("sig", "cod", "mun", "agua", "ener", "tel", "carro",
"comp", "tot")
## A função transform() oferece uma maneira conveniente de transformar/adicionar o
## conteúdo data.frames. A função within() trabalha de forma semelhante.
## hab <- within(hab, sig <- factor(sig))
hab <- transform(hab, sig=factor(sig))
str(hab, ve.len=1)
## 'data.frame': 5596 obs. of 9 variables:
## $ sig : Factor w/ 27 levels "AC","AL","AM",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ cod : int 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## $ mun : chr "Acrelândia" "Assis Brasil" "Brasiléia" "Bujari" ...
## $ agua : num 21.5 27.4 26.9 17.3 13.1 ...
## $ ener : num 56.2 65.3 55.9 43.9 35.9 ...
## $ tel : num 8.85 26.71 22.73 12.28 9.19 ...
## $ carro: num 9.3 6.03 7.47 6.49 5.73 ...
## $ comp : num 0.947 1.637 1.857 0.127 0.088 ...
## $ tot : int 1878 807 4114 1365 1267 14368 2807 5268 740 2308 ...
##-----------------------------------------------------------------------------
## Seleção via operador colchetes.
## hab[hab$sig=="AC", "agua"]
## hab[hab$sig=="RR", c("mun", "tel", "carro")]
## Usando a função subset().
subset(hab, sig=="AC", select="agua")
## agua
## 1 21.455
## 2 27.389
## 3 26.862
## 4 17.343
## 5 13.116
## 6 27.487
## 7 24.498
## 8 16.741
## 9 3.103
## 10 9.213
## 11 10.090
## 12 4.865
## 13 19.056
## 14 23.062
## 15 53.198
## 16 8.068
## 17 25.846
## 18 34.798
## 19 21.827
## 20 22.712
## 21 40.749
## 22 18.626
subset(hab, sig=="RR", select=c("mun", "tel", "carro"))
## mun tel carro
## 3927 Amajari 0.858 10.040
## 3928 Alto Alegre 9.310 12.036
## 3929 Boa Vista 54.292 32.345
## 3930 Bonfim 9.006 8.810
## 3931 Cantá 2.257 12.223
## 3932 Caracaraí 16.215 14.637
## 3933 Caroebe 6.720 8.742
## 3934 Iracema 21.222 14.683
## 3935 Mucajaí 24.356 18.574
## 3936 Normandia 6.949 6.937
## 3937 Pacaraima 12.773 15.153
## 3938 Rorainópolis 11.653 10.453
## 3939 São João da Baliza 18.363 19.049
## 3940 São Luiz 17.057 17.290
## 3941 Uiramutã 0.193 3.327
##-----------------------------------------------------------------------------
## A questão dos dados incompletos/ausentes/perdidos (missings).
## Pegando apenas o Mato Grosso do Sul (o Estado do Pantanal).
ms <- subset(hab, sig=="MS")
## A função is.na() testa se cada elemento em um vetor é um valor
## disponível ou não (na: not avaliable).
ms$agua
## [1] 88.99 87.69 79.64 76.11 90.93 90.75 79.72 91.73 78.64 81.56 89.58 86.94 84.20 77.13
## [15] 74.48 82.58 88.41 82.31 86.08 95.85 82.63 95.73 96.46 85.93 65.67 76.72 90.84 85.20
## [29] 83.64 66.52 79.89 93.64 88.34 91.06 NA 92.68 76.92 93.30 91.99 80.74 72.44 91.46
## [43] 50.22 86.46 86.59 89.43 74.38 76.83 79.27 89.80 68.07 96.17 92.29 60.36 88.50 94.46
## [57] 77.54 NA 87.86 65.70 75.77 86.32 66.04 91.16 85.73 87.56 91.82 91.13 84.29 96.14
## [71] 89.46 96.52 83.55 83.84 72.47 88.25 88.15 95.88 84.50
is.na(ms$agua)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [15] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [29] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [43] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [57] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [71] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## A função complete.cases() verifica se cada linha de registro tem
## todos os registros disponíveis. Em outras palavras, é um is.na() de
## cada coluna para o qual se verifica se todos são não NA. Caso
## completo é o nome que se dá a uma linha que não tem nenhum registro
## ausente.
complete.cases(ms)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [15] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [29] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [43] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [57] TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [71] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
apply(sapply(ms, is.na), 1, any) ## Equivalente ao complete.cases.
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [15] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [29] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [43] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [57] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [71] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## A função na.omit() retorna um data.frame onde todas as linhas são
## caso completo por elimina as linhas com NA. Junto vem um atributo
## indicando quais os registros removidos.
## ms2 <- ms[complete.cases(ms), ] ## Equivalente à na.omit(ms).
ms2 <- na.omit(ms)
str(ms2)
## 'data.frame': 77 obs. of 9 variables:
## $ sig : Factor w/ 27 levels "AC","AL","AM",..: 12 12 12 12 12 12 12 12 12 12 ...
## $ cod : int 5000203 5000252 5000609 5000708 5000807 5000856 5000906 5001003 5001102 5001243 ...
## $ mun : chr "Água Clara" "Alcinópolis" "Amambaí" "Anastácio" ...
## $ agua : num 89 87.7 79.6 76.1 90.9 ...
## $ ener : num 92.2 86.7 80.5 96.2 96.3 ...
## $ tel : num 16.4 15.7 24.7 19.5 24.6 ...
## $ carro: num 28 28.9 27.7 21 28.6 ...
## $ comp : num 1.9 1.13 5.15 1.51 2.43 ...
## $ tot : int 3072 1117 8197 6036 2150 2166 1955 5623 11656 2016 ...
## - attr(*, "na.action")=Class 'omit' Named int [1:2] 35 58
## .. ..- attr(*, "names")= chr [1:2] "2243" "2266"
##-----------------------------------------------------------------------------
## Por que a preocupação com os NA? 1) eles são incovenientes para
## aplicações de resumos estatísticos 2) função que depender de muitas
## variáveis só são calculadas para as linhas dos registros completos
## implicando em uma redução de informação. Às vezes se faz necessário
## empregar alguma técnica de inputação.
mean(ms$agua) ## Tem NA.
## [1] NA
mean(ms2$agua) ## Não tem NA.
## [1] 84.12
mean(ms$agua, na.rm=TRUE) ## Desconsidera os NA para operar.
## [1] 84.12
## Não é só a função mean() que tem opção para lidar com os NA. São muitas.
args(sum)
## function (..., na.rm = FALSE)
## NULL
args(min)
## function (..., na.rm = FALSE)
## NULL
args(max)
## function (..., na.rm = FALSE)
## NULL
args(range)
## function (..., na.rm = FALSE)
## NULL
args(median)
## function (x, na.rm = FALSE)
## NULL
args(sd)
## function (x, na.rm = FALSE)
## NULL
args(var)
## function (x, y = NULL, na.rm = FALSE, use)
## NULL
Se você está já com esse data.frame, coloque em prática seu conhecimento respondendo as seguintes perguntas.