Introdução ao R
UFPE
O R é uma linguagem de programação inicialmente desenvolvida para computação estatística. E licenciada como Software Livre.
O que é um Software Livre?
Resposta:
O que é um Software Livre?
Resposta:
…voltando ao Software Livre…
Mas o que tem de interessante nisso?
Isso não é no nível de utilizar o R para fazer scripts, mas sim, que você pode pegar o R, fazer uma nova linguagem de programação baseada nele e distribuir para a comunidade, sem ter que pagar nada por isso, mas claro, respeitando a licença do R, esta deve ser a mesma na sua modificação.
Para obter o R, acesse o link: https://cloud.r-project.org/
O CRAN (Comprehensive R Archive Network) é um conjunto de servidores-espelho distribuídos pelo mundo e é utilizado para distribuir o R e os pacotes do R.
Uma nova grande versão do R é lançada uma vez por ano, e há dois ou três pequenos lançamentos por ano.
É interessante manter o R sempre atualizado, pois as novas versões do R trazem melhorias de desempenho em relação aos hardware mais recentes, novas funcionalidades e correções de bugs. tware para o R.
No momento que essa aula foi criada, o R encontrava-se na versão 4.4.2.
Um pacote no R é uma colação de funções, dados e documentação que estende as capacidades do R base.
ou
e as funções do pacote podem ser usadas de duas formas:
ou
# Exemplo de utilização de função de pacote
datasets::iris |>
dplyr::filter(Species == "setosa") |>
utils::head()
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
vou colocar aqui abaixo novamente…
c()
.list()
.[[1]]
[1] 1
[[2]]
[1] "a"
[[3]]
[1] TRUE
[]
.Vale uma observação, de que os índices em R começam em 1, e não em 0, como em algumas outras linguagens de programação.
dplyr
é um pacote do R que fornece uma gramática para manipulação de dados, e é muito útil para transformar, filtrar e resumir dados.dplyr
fornece um conjunto de funções que são fáceis de usar e que permitem realizar operações comuns de manipulação de dados de forma eficiente, dessa forma, para essa parte inicial de tratamento de dados, vamos focar na utilização desse pacote.pacote::funcao()
para evitar conflitos de funções com o mesmo nome em diferentes pacotes.dplyr
:# A tibble: 13 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 517 515 2 830 819
2 2013 1 1 533 529 4 850 830
3 2013 1 1 542 540 2 923 850
4 2013 1 1 544 545 -1 1004 1022
5 2013 1 1 554 600 -6 812 837
6 2013 1 1 554 558 -4 740 728
7 2013 1 1 555 600 -5 913 854
8 2013 1 1 557 600 -3 709 723
9 2013 1 1 557 600 -3 838 846
10 2013 1 1 558 600 -2 753 745
11 2013 1 1 558 600 -2 849 851
12 2013 1 1 558 600 -2 853 856
13 2013 1 1 558 600 -2 924 917
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
Conseguimos fazer filtragem de dados utilizando a função filter()
# A tibble: 13 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 11 1 5 2359 6 352 345
2 2013 11 1 35 2250 105 123 2356
3 2013 11 1 455 500 -5 641 651
4 2013 11 1 539 545 -6 856 827
5 2013 11 1 542 545 -3 831 855
6 2013 11 1 549 600 -11 912 923
7 2013 11 1 550 600 -10 705 659
8 2013 11 1 554 600 -6 659 701
9 2013 11 1 554 600 -6 826 827
10 2013 11 1 554 600 -6 749 751
11 2013 11 1 555 600 -5 847 854
12 2013 11 1 555 600 -5 839 846
13 2013 11 1 555 600 -5 929 943
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
Para usar filtragens de forma eficaz, você precisa saber como utilizar operadores de comparação e operadores lógicos.
Alguns operadores são:
==
igual a!=
diferente de>
maior que<
menor que&
e|
ou!
não# A tibble: 5 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 11 1 5 2359 6 352 345
2 2013 11 1 35 2250 105 123 2356
3 2013 11 1 455 500 -5 641 651
4 2013 11 1 539 545 -6 856 827
5 2013 11 1 542 545 -3 831 855
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
# A tibble: 5 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 11 1 5 2359 6 352 345
2 2013 11 1 35 2250 105 123 2356
3 2013 11 1 455 500 -5 641 651
4 2013 11 1 539 545 -6 856 827
5 2013 11 1 542 545 -3 831 855
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
filter()
só considera as linhas em que a condição é verdadeira (TRUE
), e descarta as linhas em que a condição é falsa (FALSE
) ou NA
. Se deseja preservar os valores faltantes, peça eles explicitamente:# A tibble: 10 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 NA 1630 NA NA 1815
2 2013 1 1 NA 1935 NA NA 2240
3 2013 1 1 NA 1500 NA NA 1825
4 2013 1 1 NA 600 NA NA 901
5 2013 1 2 NA 1540 NA NA 1747
6 2013 1 2 NA 1620 NA NA 1746
7 2013 1 2 NA 1355 NA NA 1459
8 2013 1 2 NA 1420 NA NA 1644
9 2013 1 2 NA 1321 NA NA 1536
10 2013 1 2 NA 1545 NA NA 1910
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
arraange()
, que serve para ordenar os dados.filter()
, mas ao invés de filtrar, ele ordena.# A tibble: 10 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 10 30 2400 2359 1 327 337
2 2013 11 27 2400 2359 1 515 445
3 2013 12 5 2400 2359 1 427 440
4 2013 12 9 2400 2359 1 432 440
5 2013 12 9 2400 2250 70 59 2356
6 2013 12 13 2400 2359 1 432 440
7 2013 12 19 2400 2359 1 434 440
8 2013 12 29 2400 1700 420 302 2025
9 2013 2 7 2400 2359 1 432 436
10 2013 2 7 2400 2359 1 443 444
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
arrange()
.# A tibble: 10 × 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 517 515 2 830 819
2 2013 1 1 533 529 4 850 830
3 2013 1 1 542 540 2 923 850
4 2013 1 1 544 545 -1 1004 1022
5 2013 1 1 554 600 -6 812 837
6 2013 1 1 554 558 -4 740 728
7 2013 1 1 555 600 -5 913 854
8 2013 1 1 557 600 -3 709 723
9 2013 1 1 557 600 -3 838 846
10 2013 1 1 558 600 -2 753 745
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>
desc()
.select()
é utilizada para selecionar colunas de um data frame.select()
.# A tibble: 15 × 16
dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier
<int> <int> <dbl> <int> <int> <dbl> <chr>
1 517 515 2 830 819 11 UA
2 533 529 4 850 830 20 UA
3 542 540 2 923 850 33 AA
4 544 545 -1 1004 1022 -18 B6
5 554 600 -6 812 837 -25 DL
6 554 558 -4 740 728 12 UA
7 555 600 -5 913 854 19 B6
8 557 600 -3 709 723 -14 EV
9 557 600 -3 838 846 -8 B6
10 558 600 -2 753 745 8 AA
11 558 600 -2 849 851 -2 B6
12 558 600 -2 853 856 -3 B6
13 558 600 -2 924 917 7 UA
14 558 600 -2 923 937 -14 UA
15 559 600 -1 941 910 31 AA
# ℹ 9 more variables: flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
# air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
mutate()
é utilizada para criar novas colunas a partir de colunas existentes.# A tibble: 15 × 20
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 517 515 2 830 819
2 2013 1 1 533 529 4 850 830
3 2013 1 1 542 540 2 923 850
4 2013 1 1 544 545 -1 1004 1022
5 2013 1 1 554 600 -6 812 837
6 2013 1 1 554 558 -4 740 728
7 2013 1 1 555 600 -5 913 854
8 2013 1 1 557 600 -3 709 723
9 2013 1 1 557 600 -3 838 846
10 2013 1 1 558 600 -2 753 745
11 2013 1 1 558 600 -2 849 851
12 2013 1 1 558 600 -2 853 856
13 2013 1 1 558 600 -2 924 917
14 2013 1 1 558 600 -2 923 937
15 2013 1 1 559 600 -1 941 910
# ℹ 12 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
# hour <dbl>, minute <dbl>, time_hour <dttm>, speed <dbl>
summarise()
, que é utilizada para resumir os dados.summarise()
é muito útil para resumir os dados e obter estatísticas descritivas.# A tibble: 1 × 2
mean_distance mean_air_time
<dbl> <dbl>
1 1040. NA
air_time
o resultado foi NA
, isso ocorreu porque a função mean()
não sabe o que fazer com valores faltantes. Nesse caso, devemos passar como argumento para remover os valores faltantes.group_by()
é utilizada para agrupar os dados por uma ou mais variáveis.dados |>
dplyr::group_by(month) |>
dplyr::summarise(mean_distance = mean(distance),
mean_air_time = mean(air_time, na.rm = TRUE))
# A tibble: 12 × 3
month mean_distance mean_air_time
<int> <dbl> <dbl>
1 1 1007. 154.
2 2 1001. 151.
3 3 1012. 149.
4 4 1039. 153.
5 5 1041. 146.
6 6 1057. 150.
7 7 1059. 147.
8 8 1062. 148.
9 9 1041. 143.
10 10 1039. 149.
11 11 1050. 155.
12 12 1065. 163.
n()
.Também conseguimos agrupar por múltiplas variáveis, basta passar mais argumentos para a função group_by()
Então, quando estivermos trabalhando com manipulação de dados, vamos procurar sempre trabalhar com os pacotes do tidyverse
, que são pacotes que seguem uma filosofia de organização de dados, e que são muito úteis para manipulação de dados. Entre eles, estão:
dplyr
: para manipulação de dadosggplot2
: para visualização de dadostidyr
: para organização de dadosreadr
: para leitura de dadospurrr
: para programação funcional, como mapeamento e reduçãotibble
: para organização de dadosstringr
: para manipulação de stringstidymodels
: para modelagem estatística e machine learningAprendizado de Máquina: uma abordagem estatística, Izibicki, R. and Santos, T. M., 2020, link: https://rafaelizbicki.com/AME.pdf.
An Introduction to Statistical Learning: with Applications in R, James, G., Witten, D., Hastie, T. and Tibshirani, R., Springer, 2013, link: https://www.statlearning.com/.
Mathematics for Machine Learning, Deisenroth, M. P., Faisal. A. F., Ong, C. S., Cambridge University Press, 2020, link: https://mml-book.com.
An Introduction to Statistical Learning: with Applications in python, James, G., Witten, D., Hastie, T. and Tibshirani, R., Taylor, J., Springer, 2023, link: https://www.statlearning.com/.
Matrix Calculus (for Machine Learning and Beyond), Paige Bright, Alan Edelman, Steven G. Johnson, 2025, link: https://arxiv.org/abs/2501.14787.
Machine Learning Beyond Point Predictions: Uncertainty Quantification, Izibicki, R., 2025, link: https://rafaelizbicki.com/UQ4ML.pdf.
Mathematics of Machine Learning, Petersen, P. C., 2022, link: http://www.pc-petersen.eu/ML_Lecture.pdf.
OBRIGADO!
Slide produzido com quarto
Aprendizagem de Máquina - Prof. Jodavid Ferreira