Antes de qualquer coisa…

Não se esqueça de verificar o diretório de trabalho usando as funções getwd() e setwd().

Importar banco de dados e visualizar

A base de dados que você baixou no Classroom está em formato textual, mais especificamente no formato csv. Usaremos a função read.csv2, conforme práticas anteriores.

dados_agua <- read.csv2('Exemplo_AGUA.csv', stringsAsFactors = TRUE, encoding = "UTF-8")

Para visualizar os dados execute a função View(), com o nome da base de dados como argumento, sem aspas.

View(dados_agua)

Para saber a dimensão do conjunto de dados execute a função dim(), com o nome da base de dados como argumento, sem aspas.

dim(dados_agua)
[1] 645  12

Para saber o nome das variáveis presentes no conjunto de dados execute a função names(), com o nome da base de dados como argumento, sem aspas.

names(dados_agua)
 [1] "codibge"          "municipio"        "Regic_interm"     "ano"              "IDHM"            
 [6] "IDHM_tipo"        "PIB_rc"           "PIBpc_rc"         "pop_total"        "pop_atend_abagua"
[11] "vmer"             "qer"       

Para saber a classe de cada variável presente no conjunto de dados execute a função str(), com o nome da base de dados como argumento, sem aspas.

str(dados_agua)
'data.frame':   645 obs. of  12 variables:
 $ codibge         : int  3500105 3500204 3500303 3500402 3500501 3500550 3500600 3500709 3500758 3500808 ...
 $ municipio       : Factor w/ 645 levels "Adamantina","Adolfo",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Regic_interm    : Factor w/ 11 levels "Araçatuba","Araraquara",..: 6 8 4 4 4 11 4 3 11 6 ...
 $ ano             : int  2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
 $ IDHM            : num  0.79 0.73 0.715 0.781 0.745 0.757 0.854 0.745 0.712 0.741 ...
 $ IDHM_tipo       : Factor w/ 3 levels "alto","medio",..: 1 1 1 1 1 1 3 1 1 1 ...
 $ PIB_rc          : num  639091 61059 549175 96964 233684 ...
 $ PIBpc_rc        : num  18910 17166 17083 12785 13534 ...
 $ pop_total       : int  33797 3557 32148 7584 17266 5601 2707 34524 4884 3891 ...
 $ pop_atend_abagua: int  32879 3108 29001 7584 17111 4611 2707 32792 3519 3575 ...
 $ vmer            : num  1954 176 NA 479 849 ...
 $ qer             : int  11595 1200 50 3179 7751 1916 1928 10013 1318 1294 ...

Verificando valores NA’s e removendo do dataset

Ao trabalhar com banco de dados maiores é mais comum acontecer de termos elementos com dados faltantes (missing values ou NAs). Algumas funções no R já possuem argumentos para tratar esses elementos, contudo, recomenda-se identificá-los antes do início das análises para ter certeza que não foi um problema de coleta de dados ou de tratamento dos dados antes de importá-los ao R.

Usaremos a função complete.cases() que retorna um vetor lógico indicando quais casos estão completos, ou seja, não têm valores ausentes, sendo FALSE para valores ausentes.

complete.cases(dados_agua)
  [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
 [18]  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
 [35]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [52]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
 [69]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE
 [86]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
[103]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[120]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE
[137]  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[154]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[171]  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[188]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
[205]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE
[222]  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[239] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[256]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[273]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
[290]  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
[307] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
[324]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
[341] FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[358]  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
[375]  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[392]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
[409]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[426]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
[443]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
[460]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[477]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[494] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
[511]  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
[528]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
[545]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
[562]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[579]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
[596]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
[613]  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
[630]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE

Se usarmos a função which()junto com a função complete.cases() teremos as linhas correspondentes aos elementos com valores completos. Incluindo “!” teremos as linhas correspondentes aos elementos com valores ausentes.

which(complete.cases(dados_agua))
  [1]   1   2   4   5   6   7   8   9  10  11  13  14  15  16  17  18  19  20  22  24  25  26  27  29  30  32
 [27]  33  34  35  36  37  38  39  40  42  43  44  45  46  47  48  49  50  51  52  53  54  56  57  58  59  61
 [53]  62  63  65  66  67  68  69  70  71  72  74  75  77  78  79  81  82  83  86  87  88  89  90  91  92  94
 [79]  96  97  98 100 101 103 104 106 107 108 109 110 112 113 114 115 117 118 119 120 121 122 124 125 126 127
[105] 128 131 132 133 137 139 141 142 144 146 147 149 150 151 153 154 155 156 158 159 160 161 162 164 165 166
[131] 168 169 170 171 173 174 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 194 196 200
[157] 202 203 204 205 206 208 209 210 211 212 213 214 215 216 217 220 221 222 223 225 228 229 231 232 233 234
[183] 235 236 237 238 240 241 246 247 249 251 252 253 255 256 257 258 259 260 261 262 263 264 267 268 269 270
[209] 271 272 273 274 275 276 277 278 279 280 282 283 284 285 286 288 289 290 291 293 295 296 298 299 300 301
[235] 302 303 305 306 308 309 310 311 312 313 315 316 317 318 320 321 323 324 325 326 328 329 330 331 332 333
[261] 335 336 337 339 340 342 343 345 346 347 348 349 350 351 352 353 355 356 357 358 360 364 366 368 369 371
[287] 372 373 375 376 378 379 381 383 384 386 387 388 389 390 391 392 393 395 396 397 398 399 402 403 405 406
[313] 407 408 409 410 411 413 414 415 416 417 418 419 420 421 422 423 424 426 427 428 429 430 432 433 435 436
[339] 437 440 441 442 443 444 445 446 447 448 450 452 453 454 455 456 457 460 462 463 464 465 466 467 469 470
[365] 471 472 473 474 475 477 478 479 480 481 482 484 485 486 487 488 489 490 491 492 495 496 497 498 499 500
[391] 501 502 504 505 507 508 510 511 513 515 516 517 518 519 520 521 522 523 525 526 528 529 531 532 533 534
[417] 535 536 537 538 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 558 559 560 561 562 563
[443] 564 565 566 568 569 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 588 589 591 592 593 595
[469] 596 597 598 601 602 603 604 606 607 609 610 612 613 614 616 617 619 620 621 622 624 625 627 628 629 630
[495] 631 632 634 635 636 637 639 640 642 643 644 645
which(!complete.cases(dados_agua))
  [1]   3  12  21  23  28  31  41  55  60  64  73  76  80  84  85  93  95  99 102 105 111 116 123 129 130 134 135 136 138 140 143 145
 [33] 148 152 157 163 167 172 175 193 195 197 198 199 201 207 218 219 224 226 227 230 239 242 243 244 245 248 250 254 265 266 281 287
 [65] 292 294 297 304 307 314 319 322 327 334 338 341 344 354 359 361 362 363 365 367 370 374 377 380 382 385 394 400 401 404 412 425
 [97] 431 434 438 439 449 451 458 459 461 468 476 483 493 494 503 506 509 512 514 524 527 530 539 556 557 567 570 571 587 590 594 599
[129] 600 605 608 611 615 618 623 626 633 638 641

ATENÇÃO: antes de remover as linhas com valores ausentes é importante que você verifique se realmente esses valores não existem ou se algum erro de coleta e tratamento ocorreu.

Caso você verifique que realmente os valores são ausentes é possível retirar o elemento que possue tal valor ausente. Note que a linha será retirada por completo, ou seja, mesmo que das 12 variáveis em análise o elemento do conjunto de dados tenha valor ausente em uma delas, todo o elemento será descartado. Para tanto, será usada a função na.omit() e, em seguida, as funções de visualização e dimensão.

dados_agua_sna <- na.omit(dados_agua)
View(dados_agua_sna)
dim(dados_agua_sna)
[1] 506  12

Ainda temos as mesmas 12 variáveis, contudo, nosso número de elementos caiu de 645 para 506, foram excluidos 139 elementos.

Definir novas variáveis

A depender do que você deseja analisar, acaba sendo comum a necessidade de definir novas variáveis a partir das variáveis disponíveis no banco de dados. Neste exemplo, vamos criar duas novas variáveis, chamadas cons1 e cons2.

Tais variáveis serão definidas porque a unidade de medida que estão, originalmente, é de 1.000 m³/ano, assim, precisamos multiplicar por 1.000. Além disso, como queremos o consumo per capita, também iremos dividir pela população total (cons1) e pela população atendida (cons2). Você poderá visualizar as novas variáveis usando a função View().

dados_agua_sna$cons1 <-((dados_agua_sna$vmer*1000 / dados_agua_sna$pop_total))
dados_agua_sna$cons2 <-((dados_agua_sna$vmer*1000 / dados_agua_sna$pop_atend_abagua))
View(dados_agua_sna)

Estatísticas Descritivas Básicas

Existem pelo menos duas maneiras de obtermos medidas de estatísticas descritivas básicas. A mais direta é por meio da função summary(), que apresenta um sumário de estatísticas descritivas para todas as variáveis numéricas.

summary(dados_agua_sna)
    codibge                         municipio                  Regic_interm      ano            IDHM             IDHM_tipo  
 Min.   :3500105   Adamantina            :  1   São José do Rio Preto: 75   Min.   :2010   Min.   :0.6390   alto      :434  
 1st Qu.:3514552   Adolfo                :  1   Sorocaba             : 73   1st Qu.:2010   1st Qu.:0.7190   medio     : 49  
 Median :3528754   Águas da Prata        :  1   Campinas             : 67   Median :2010   Median :0.7400   muito alto: 23  
 Mean   :3528681   Águas de Lindóia      :  1   São Paulo            : 50   Mean   :2010   Mean   :0.7412                   
 3rd Qu.:3543249   Águas de Santa Bárbara:  1   Ribeirão Preto       : 44   3rd Qu.:2010   3rd Qu.:0.7640                   
 Max.   :3557154   Águas de São Pedro    :  1   Presidente Prudente  : 43   Max.   :2010   Max.   :0.8620                   
                   (Other)               :500   (Other)              :154                                                   
     PIB_rc             PIBpc_rc        pop_total        pop_atend_abagua        vmer               qer              cons1        
 Min.   :    13985   Min.   :  4814   Min.   :     805   Min.   :     661   Min.   :     1.7   Min.   :      8   Min.   :  0.244  
 1st Qu.:    64886   1st Qu.: 10936   1st Qu.:    4970   1st Qu.:    3720   1st Qu.:   184.3   1st Qu.:   1312   1st Qu.: 37.200  
 Median :   211944   Median : 15582   Median :   14622   Median :   11294   Median :   591.4   Median :   3758   Median : 45.536  
 Mean   :  2480400   Mean   : 19908   Mean   :   77434   Mean   :   74178   Mean   :  4090.7   Mean   :  25237   Mean   : 46.628  
 3rd Qu.:   955080   3rd Qu.: 22706   3rd Qu.:   47487   3rd Qu.:   41526   3rd Qu.:  2540.1   3rd Qu.:  13604   3rd Qu.: 53.413  
 Max.   :450491988   Max.   :172149   Max.   :11253503   Max.   :11253503   Max.   :627684.1   Max.   :3900531   Max.   :190.120  
                                                                                                                                  
     cons2        
 Min.   :  0.244  
 1st Qu.: 47.200  
 Median : 52.317  
 Mean   : 54.814  
 3rd Qu.: 58.842  
 Max.   :211.459  

A outra maneira é por meio das funções de estatística básica específicas para a média, mediana, variânica, desvio padrão e quartis.

Com o uso do operador “$” podemos aplicar funções em uma variável para obter estatísticas básicas. Vamos executar essas funções na nova variável cons1.

DICA: Caso você não tenha retirado os NAs, todas as funções descritas a seguir possuem o argumento opcional na.rm = TRUE para remover os valores faltantes (NA). Se a variável não possuir valores faltantes, esse argumento não é necessário.

Média <- mean(dados_agua_sna$cons1)
Mediana <- median(dados_agua_sna$cons1)
Variância <- var(dados_agua_sna$cons1)
Desvio_Padrão <- sd(dados_agua_sna$cons1)

Se vocês notaram, foram criados objetos para cada estatística, pois, a seguir vamos contruir uma tabela com os mesmos usando a função data.frame.

descritivas_1 <- data.frame(Média, Mediana, Variância, Desvio_Padrão)
descritivas_1 
     Média  Mediana Variância Desvio_Padrão
1 46.62771 45.53574   272.258      16.50024
Quartis <- quantile(dados_agua_sna$cons1, c(0.25, 0.50, 0.75))
Quartis
     25%      50%      75% 
37.19990 45.53574 53.41301 

Gráficos

  • Box-plot

O box-plot é um gráfico utilizado para avaliar a distribuição empírica de uma variável, exibindo a mediana, quartis e limites superior e inferior. Para desenhar um box-plot, usaremos a função boxplot(), no nosso exemplo com as duas variáveis cons1 e cons2.

boxplot(dados_agua_sna$cons1, dados_agua_sna$cons2)

Figura 1 - Box-Plot

  • Qqplot

A distribuição de uma determinada variável também pode ser visualizada com um qqplot, que compara duas distribuições de dados traçando quantis. Para desenhar um qqplot comparando a distribuição de cons1 com uma curva normal, usaremos as funções qqnorm() e qqline().

qqnorm(dados_agua_sna$cons1)
qqline(dados_agua_sna$cons1, col = "red")

Figura 2 - Q-QPlot

Exportando a base de dados

Após executar a prática, você fez alterações na base de dados (novas variáveis), por isso é importante salvá-la para acesso futuro. O R não vai exportar a sua base de dados a menos que você especifique esse comando.

É possível exportar a base de dados no formato csv2 com a função write.csv2(). Ela exige dois argumentos: primeiro o nome do objeto que deseja exportar e depois o diretório, nome do arquivo e formato entre aspas. Para não perder a base de dados original, recomendamos salvar essa base de dados com um novo nome.

write.csv2(agua1, "Exemplo_AGUA2.csv", row.names = FALSE)

ATENÇÃO: não se esqueça de salvar seu script!