Universidade Federal do Paraná
Curso de Estatística
CE 083 - Estatística Computacional I - 2014/2
Prof. Dr. Walmes Marques Zeviani


Aula 10

Tabela de conteúdo


Codificação de caracteres

Instruções para downaload dos dados usados nessa sessão.

  1. Entrar no site do ipeadata.
  2. Apontar o ponteiro do mouse para a aba social no topo superior da página (cor vermelha).
  3. No menu dropdown que descer seguir por temas > demografia e clicar.
  4. Uma página tipo tabela aparece com uma lista de títulos de tabelas e colunas indicando o nível de representação, frequência, unidade e período. Cada item pode ser selecionado pela caixa de seleção na margem esquerda.
  5. Selecionar as tabelas com títulos abaixo. Todas elas tem um X na coluna referente à estadual.
  6. Com itens acima selecionados, clicar no ícone de uma lupa do canto superior direito.
  7. Na página que abrir, selecionar o nível geográfico Estados, selecionar o nível de abrangência Brasil e selecionar a data 2000.
  8. Por fim, fazer o download da tabela de dados em formato *.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.

Registros incompletos

Instruções para downaload dos dados usados nessa sessão.

  1. Entrar no site do ipeadata.
  2. Apontar o ponteiro do mouse para a aba social no topo superior da página (cor vermelha).
  3. No menu dropdown que descer seguir por temas > habitação e clicar.
  4. Uma página tipo tabela aparece com uma lista de títulos de tabelas e colunas indicando o nível de representação, frequência, unidade e período. Cada item pode ser selecionado pela caixa de seleção na margem esquerda.
  5. Selecionar as tabelas com títulos abaixo. Todas elas tem um X na coluna referente à municipal.
  6. Com itens acima selecionados, clicar no ícone de uma lupa do canto superior direito.
  7. Na página que abrir, selecionar o nível geográfico Municípios, selecionar o nível de abrangência Brasil e selecionar a data 2000.
  8. Por fim, fazer o download da tabela de dados em formato csv separado por vírgula clicando no último ícone do canto superior direito. Ao salvar o arquivo dar o nome 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.

  1. Qual o número de municípios do Paraná (PR)?
  2. Qual o número de municípios considerando os Estados da região sul (PR, SC, RS)?
  3. Qual o número total de domicílios da cidade de Curitiba?
  4. Considerando todos os Estados, qual a cidade com maior proporção de domicílios com computador?
  5. Qual o número de municípios onde a proporção de dimicílios com água encanada é maior que a proporção de domicílios com energia elétrica.
  6. Qual o município com maior proporção de carros por domicílio no Estado do Paraná?
  7. Em quantos municípios do Paraná a proporção de domicílios com telefone supera a proporção de dimicílios com carro?
  8. Em quantos municípios do Paraná a proporção de domicílios com carro é inferior à 50%?
  9. Em quantos municípios do Paraná a proporção de domicílios com energia elétrica e de domicílios com computador são inferiores à 50%?
  10. Qual dos Estados do Brasil tem a menor média para a proporção de domicílios com computador?
  11. Quais os 3 municípios do Paraná com maior proporção de carros?
  12. Considere o seguinte índice de qualidade de vida \[ \text{iqv} = 0.3\times \text{ener}+0.3\times \text{agua}+0.15\times \text{carro}+0.15\times \text{tel}+0.1\times \text{comp}.\] Qual é o valor médio desse índice para o Estado do Paraná?
  13. Quantas cidades do Paraná tem um valor de iqv superior ao da capital Curitiba?
  14. Qual o Estado do Brasil com o menor valor médio de iqv?
  15. Qual o número de municípios do Brasil com iqv superior à 80?

Feliz por ler os dados até perceber o problema de encoding