Alura > Cursos de Data Science > Cursos de Data Science > Conteúdos de Data Science > Primeiras aulas do curso R: utilizando o Tidyverse e transformando dados com dplyr

R: utilizando o Tidyverse e transformando dados com dplyr

Conhecendo os dados - Apresentação

Boas-vindas ao curso de R, utilizando o Tidyverse e transformando seus dados com dplyr. Nele, entenderemos como transformar e tratar dados e como isso pode ajudar na análise de dados, aprendendo sobre o Tidyverse e o pacote dplyr da linguagem R.

Eu sou Igor do Nascimento Alves, instrutor na Escola de Dados, e acompanharei você neste conteúdo.

Audiodescrição: Igor se identifica como um homem branco. Possui cabelos pretos e curtos. No corpo, veste uma camiseta cinza-clara. Ao fundo, um cenário iluminado pelas cores verde e azul e uma planta decorativa à direita.

Para quem é o curso?

Este curso é destinado a quem possui interesse em utilizar o R para análise de dados e precisa realizar essas transformações.

O que aprenderemos?

Neste conteúdo, aprenderemos sobre o pacote dplyr, que permite transformar e manipular dados. Conheceremos diversas funções desse pacote, como:

Por meio dessas funções, seremos capazes de criar um projeto.

Conhecendo o projeto

Neste curso trabalharemos em um projeto de milhas aéreas. Existe uma companhia aérea tentando entender como sua clientela utiliza esse pacote de benefícios de milhas: vendendo-as ou comprando passagens. Ela precisa da nossa ajuda e dos nossos conhecimentos em R para avançar nesse projeto.

Pré-requisitos

Para compreender bem o conteúdo deste curso, é importante já ter tido contato com a linguagem R e com o Tidyverse. Aqui, focaremos em nos aprofundar no pacote dplyr.

Conclusão

Com o conhecimento adquirido através do pacote dplyr, seremos capazes de transformar dados — ou seja, coletá-los e extrair informações deles, realizando transformações. Afinal, um dado é apenas isso até ser transformado em um insight.

Estamos contentes em desenvolver este projeto junto com você. Vamos começar!

Conhecendo os dados - Importar e visualizar dados

Antes de tudo, entenderemos o contexto do trabalho.

Conhecendo o contexto

A companhia aérea com a qual vamos trabalhar está interessada em aprimorar seu programa de fidelidade para clientes. Atualmente, eles utilizam milhas aéreas.

Toda vez que uma pessoa cliente compra uma passagem, ela ganha algumas milhas. Posteriormente, ela pode acumular essas milhas e optar por vendê-las em um programa específico, recebendo dinheiro, ou utilizá-las na compra de uma próxima passagem. Se houver milhas suficientes, a passagem pode sair sem custo ou ser complementada com algum valor.

A ideia é fidelizar a clientela, incentivando-a a voar sempre com essa companhia aérea para acumular milhas, que são restritas a essa empresa.

Atualmente, o programa está em funcionamento e a clientela o utiliza, mas não conseguimos acompanhar como ele está sendo usado. Precisamos entender se a clientela está usando as milhas para comprar passagens, fazer upgrades (melhorias) para passagens de classe superior, ou se estão vendendo todas as milhas.

Compreender como o programa é utilizado é essencial para melhorá-lo e avaliar se faz sentido para a companhia aérea. Este é o projeto.

Subindo os arquivos de dados

Para este projeto, utilizaremos a linguagem R e precisamos encontrar uma maneira de carregar os dados no ambiente.

O ambiente escolhido é o Google Colab, pois não requer instalações e tem poucas limitações quanto ao tempo de uso. Acessando a página do Colab no navegador, devemos clicar em "Editar > Configurações de notebook" pela barra de menu superior.

Na janela exibida, verificaremos se o campo "Tipo de ambiente de execução" possui a opção "R" selecionada e clicaremos no botão "Salvar".

Voltando à tela principal, carregaremos os dados.

A empresa forneceu três arquivos para análise. Para carregá-los, clicaremos em "Conectar", no canto superior direito da tela, para alocar a máquina do Google.

Na barra vertical da lateral esquerda, clicaremos no ícone chamado "Arquivos" para abrir uma aba à sua direita. No canto superior esquerdo dessa aba, clicaremos no botão de fazer upload de arquivos.

Na janela do explorador de arquivos, selecionaremos os três arquivos abaixo, disponibilizados entre as atividades dessa aula:

É importante lembrar que, toda vez que entrarmos nesse ambiente, precisaremos carregar os arquivos novamente, pois, quando o ambiente é desalocado pela Google, perdemos todos os dados carregados.

Após clicar em "Abrir", veremos os nomes dos arquivos carregados na aba lateral esquerda, abaixo da pasta "sample_data".

Ao lermos esses arquivos, entenderemos melhor do que se tratam. No momento, podemos recolher essa aba clicando no ícone "Arquivos" da barra vertical.

Carregando pacotes do Tidyverse

Temos interesse em trabalhar com um grande conjunto de dados e focar no resultado. Nosso objetivo, utilizando a linguagem R, é manipular esses dados com facilidade. Para isso, utilizaremos o pacote Tidyverse.

Para carregar esse pacote no Colab pela linguagem R, executaremos o comando abaixo na primeira célula de código, por meio do atalho "Shift + Enter".

library(tidyverse)

No retorno, o Colab exibirá tudo o que foi carregado do conjunto de pacotes tidyverse, incluindo o dplyr, que será foco, além de outros como ggplot e readr.

── Attaching core tidyverse packages ───────────────────────── tidyverse 2.0.0 ──

dplyr 1.1.4 readr 2.1.5

forcats 1.0.0 stringr 1.5.1

ggplot2 3.5.1 tibble 3.2.1

lubridate 1.9.3 tidyr 1.3.1

purrr 1.0.2

── Conflicts ─────────────────────────────────── tidyverse_conflicts() ──

dplyr::filter() masks stats::filter()

dplyr::lag() masks stats::lag()

i: Use the conflicted package (http://conflicted.r-lib.org/) to force all conflicts to become errors

O carregamento da biblioteca pode gerar warnings (avisos) sobre bibliotecas que utilizam o mesmo nome para funções, mas isso não é uma preocupação no momento.

Carregando os dados

Para trazer os dados, utilizaremos a função read_csv() na próxima célula. Essa função, quando parte do dplyr, é interessante porque já traz o dataframe carregado, identificando seus tipos, o que facilita a análise.

Faremos um read_csv() do arquivo transacoes_milhas.csv. Abrindo a aba lateral por meio do ícone "Arquivos", clicaremos no botão de três pontos à direita do arquivo desejado e selecionaremos "Copiar caminho".

Entre os parênteses do read_csv(), colaremos o caminho entre aspas duplas.

Precisamos salvar esse resultado em uma variável. Para isso, antes do read_csv(), digitaremos transacoes_milhas <- para atribuir o valor a essa variável.

transacoes_milhas <- read_csv("/content/transacoes_milhas.csv")

Ao rodar essa célula, ele informa que leu um dataframe com mil linhas e quatro colunas, incluindo:

Rows: 1000 Columns: 4

── Column specification ────────────────────────────────────────────────────────

Delimiter: ","

dbl (3): id_cliente, milhas_vendidas, valor_recebido

date (1): data_venda_milhas

Esses dados tratam de transações de clientes que vendem suas milhas aéreas por dinheiro. Precisamos entender como isso funciona.

Na próxima célula, faremos um read_csv() do próximo dataframe, transacoes_passagens.csv. Faremos o mesmo processo para copiar seu caminho, colar entre os parênteses do read_csv() e envolvê-lo entre aspas duplas. A variável será transacoes_passagens.

transacoes_passagens <- read_csv("/content/transacoes_passagens.csv")

Ao executar a célula, o relatório informa mil linhas e seis colunas, com tipos de dados como string (chr), numérico e data.

Rows: 1000 Columns: 6

── Column specification ────────────────────────────────────────────────────────

Delimiter: ","

chr (1): classe_voo

dbl (4): id_cliente, milhas_utilizadas, valor_pago, numero_voo

date (1): data_transacao

Essa base possui informações de clientes que realizaram compras de passagens utilizando milhas aéreas, utilizando o benefício conforme idealizado inicialmente.

Por fim, carregaremos a base clientes.csv na célula seguinte, atribuindo seu valor com read_csv() à variável clientes, colando o caminho dessa base.

clientes <- read_csv("/content/clientes.csv")

Ao executar esse comando, o relatório informa mil clientes e cinco colunas que informam o ID, milhas acumuladas, gasto total, status de fidelidade e data de nascimento.

Rows: 1000 Columns: 5

── Column specification ────────────────────────────────────────────────────────

Delimiter: ","

chr (1): status_fidelidade

dbl (3): id_cliente, milhas_acumuladas, gasto_total

date (1): data_nascimento

Essa base possui informações sobre a clientela. Entretanto, focaremos somente nos dados de transações por enquanto.

Analisando dados

Para analisar os dados, podemos usar a função head. Por exemplo, executando um transacoes_milhas %>% head(), traremos uma amostra de seis linhas e quatro colunas do dataframe transacoes_milhas.

transacoes_milhas %>% head()

Retorno:

id_cliente <dbl>data_venda_milhas <date>milhas_vendidas <dbl>valor_recebido <dbl>
3502023-02-234131536.88
1092022-09-266525113.70
3762022-06-129955466.73
4432022-12-1759131489.56
6472023-10-062841908.38
8182023-05-2942251339.10

O ID da clientela é um número que representa cada cliente de forma única. A data da venda da milha, a quantidade vendida e o valor recebido são informações que variam conforme a época do ano e o serviço utilizado para vender as milhas.

Na próxima célula, ao executar transacoes_milhas %>% glimpse(), retornaremos os detalhes das transações ocorridas. Os dados exibidos não necessariamente serão úteis para a análise.

transacoes_passagens %>% head()

Retorno:

id_cliente <dbl>data_transacao <date>milhas_utilizadas <dbl>valor_pago <dbl>classe_voo <chr>numero_voo <dbl>
5072023-01-309837424.31Economica3705
862023-03-076067513.52Economica9504
5892022-02-1128931320.34Primeira Classe1695
7742022-09-2322741000.44Economica2963
7052023-06-0860431607.35Economica9190
3162023-05-1317981802.67Executiva6242

Para uma análise mais objetiva, utilizaremos a função glimpse(). Ao executar transacoes_milhas %>% glimpse() na célula seguinte, retornaremos o nome das colunas, tipo e uma amostra de valores dessa base. Isso permite uma análise rápida dos dados.

transacoes_milhas %>% glimpse()

Retorno:

Rows: 1,000

Columns: 4

$ id_cliente <dbl> 350, 109, 376, 443, 647, 818, 32, 770, 707, 842, 170…

$ data_venda_milhas <date> 2023-02-23, 2022-09-26, 2022-06-12, 2022-12-17, 202…

$ milhas_vendidas <dbl> 4131, 6525, 9955, 5913, 284, 4225, 2854, 6127, 5091,…

$ valor_recebido <dbl> 536.88, 113.70, 466.73, 1489.56, 1908.38, 1339.10, 1…

Para entender como isso funciona, aplicaremos glimpse() na tabela de clientes com o comando abaixo.

clientes %>% glimpse()

A função informa que temos mil registros de pessoas clientes e cinco colunas, além do ID, data de nascimento, status de fidelidade, milhas acumuladas e gasto total de cada uma. Cada linha representa uma pessoa cliente, com informações atualizadas sobre milhas e status de fidelidade.

Retorno:

Rows: 1,000

Columns: 5

$ id_cliente <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1…

$ data_nascimento <date> 1971-01-09, 1996-08-11, 1994-07-18, 2003-03-08, 196…

$ status_fidelidade <chr> "Diamante", "Diamante", "Diamante", "Prata", "Diaman…

$ milhas_acumuladas <dbl> 2833, 8864, 917, 8773, 1492, 6270, 2583, 8263, 8914,…

$ gasto_total <dbl> 1906.69, 493.58, 519.16, 1256.60, 410.37, 250.93, 92…

Com o glimpse(), conseguimos obter informações rapidamente sobre tipos de colunas, quantidade de linhas e colunas, e um resumo dos dados.

Conclusão

Conhecemos nossos dados e os trouxemos para o notebook. A seguir, começaremos a transformá-los e tratá-los para ajudar o time de negócios a responder suas dúvidas.

Conhecendo os dados - Seleção e filtragem de dados

Conseguimos carregar nossos dados no Jupyter Notebook presente no Colab. Durante conversas com o time de negócios, entendemos que este é o caminho. Precisamos carregar os dados no R e realizar nossa análise.

Um ponto de atenção que surgiu na discussão foi a quantidade de dados que temos. São mil registros em cada uma das tabelas, com diversas colunas. Será que precisamos de todas essas informações para nossa análise ou podemos focar mais para entender como esses dados estão se comportando?

Pensando nisso, faremos transformações no dataframe com o qual estamos trabalhando.

Retomando os dados

O primeiro foco será na base transacoes_milhas. Criaremos uma nova célula no notebook, na qual utilizaremos o pipe (%>%) mais o glimpse() para relembrar esses dados.

transacoes_milhas %>% glimpse()

Temos mil registros, com as colunas de cliente, data da venda, milhas vendidas e valor recebido.

Retorno:

Rows: 1,000

Columns: 4

$ id_cliente <dbl> 350, 109, 376, 443, 647, 818, 32, 770, 707, 842, 170…

$ data_venda_milhas <date> 2023-02-23, 2022-09-26, 2022-06-12, 2022-12-17, 202…

$ milhas_vendidas <dbl> 4131, 6525, 9955, 5913, 284, 4225, 2854, 6127, 5091,…

$ valor_recebido <dbl> 536.88, 113.70, 466.73, 1489.56, 1908.38, 1339.10, 1…

Quanto à quantidade de colunas, parece que está tudo certo. Essas colunas são do nosso interesse.

Vamos olhar para a próxima base, transações de passagens, por meio de um novo glimpse().

transacoes_passagens %>% glimpse()

Nessa base, também temos mil registros, mas com seis colunas, referentes a cliente, data da transação, milhas utilizadas, valor pago, classe do voo e número do voo.

Retorno:

Rows: 1,000

Columns: 6

$ id_cliente <dbl> 507, 86, 589, 774, 705, 316, 801, 149, 11, 154, 363,…

$ data_transacao <date> 2023-01-30, 2023-03-07, 2022-02-11, 2022-09-23, 202…

$ milhas_utilizadas <dbl> 9837, 6067, 2893, 2274, 6043, 1798, 4354, 6976, 6344…

$ valor_pago <dbl> 424.31, 513.52, 1320.34, 1000.44, 1607.35, 1802.67, …

$ classe_voo <chr> "Economica", "Economica", "Primeira Classe", "Econom…

$ numero_voo <dbl> 3705, 9504, 1695, 2963, 9190, 6242, 2415, 6747, 3509…

Selecionando colunas

As informações de classe do voo e número do voo podem se mostrar relevantes futuramente. Entretanto, como o interesse atual é verificar como as milhas estão sendo utilizadas, talvez não precisemos dessas informações.

Para selecionar essas colunas, utilizaremos a função select(), chamando transacoes_passagens e um pipe para aplicar a função select(). Entre os parênteses dessa função, podemos informar as colunas de interesse.

No caso da base transacoes_passagens, temos interesse em id_cliente, data_transacao, milhas_utilizadas e valor_pago. As colunas classe_do_voo e numero_do_voo não são relevantes para nossa análise no momento, pois queremos focar nas milhas.

transacoes_passagens %>% select(id_cliente, data_transacao, milhas_utilizadas, valor_pago)

Podemos executar o código da seleção e verificar que o retorno exibiu um tibble com 4 colunas, em vez de todas.

Retorno:

id_cliente <dbl>data_transacao <date>milhas_utilizadas <dbl>valor_pago <dbl>
5072023-01-309837424.31
862023-03-076067513.52
5892022-02-1128931320.34
7742022-09-2322741000.44
7052023-06-0860431607.35
3162023-05-1317981802.67

Após confirmar que essas são as colunas de interesse, podemos sobrescrever o transacoes_passagens para receber esse valor e salvá-lo. Para isso, adicionaremos o transacoes_passagens e o símbolo de atribuição (<-) antes do comando anterior.

transacoes_passagens <- transacoes_passagens %>% select(id_cliente, data_transacao, milhas_utilizadas, valor_pago)

Ao executar com "Shift + Enter", o comando acima não retornará nada. Na célula seguinte, podemos utilizar o glimpse() novamente para exibir o resultado.

transacoes_passagens %>% glimpse()

Com isso, constataremos que as mil linhas foram mantidas, mas reduzimos as colunas de 6 para 4.

Retorno:

Rows: 1,000

Columns: 4

$ id_cliente <dbl> 507, 86, 589, 774, 705, 316, 801, 149, 11, 154, 363,…

$ data_transacao <date> 2023-01-30, 2023-03-07, 2022-02-11, 2022-09-23, 202…

$ milhas_utilizadas <dbl> 9837, 6067, 2893, 2274, 6043, 1798, 4354, 6976, 6344…

$ valor_pago <dbl> 424.31, 513.52, 1320.34, 1000.44, 1607.35, 1802.67, …

Selecionando períodos

Outra maneira de reduzir os dados é focar em um período específico. Conversando com o time de negócios, foi decido utilizar os dados do último ano para a análise.

Para isso, aplicaremos a função filter(). Na célula seguinte, usaremos o transacoes_milhas, atribuindo um valor a ele por meio do símbolo de atribuição.

Atribuiremos a ele o transacoes_milhas, um pipe e a função filter(), em vez de select(), para filtrar os dados com uma regra. A regra adicionada entre parênteses será: filtrar um período específico na coluna data_venda_milhas, que seja menor ou igual ao ano de 2022.

Para essa regra, formataremos a data conforme os dados existentes na coluna, criando as strings "2022-01-01" para o início do ano de 2022 e "2022-12-1" para o final.

Compararemos data_venda_milhas à data inicial por meio do símbolo >= (maior ou igual) e à data final por meio do símbolo <= (menor ou igual). Por fim, adicionaremos um sinal & entre ambas as regras para uni-las.

transacoes_milhas <- transacoes_milhas %>% filter(data_venda_milhas >= '2022-01-01' & data_venda_milhas <= '2022-12-31')

Após pressionar "Shift + Enter", verificaremos o dataframe com o comando abaixo.

transacoes_milhas %>% glimpse()

No retorno, o transacoes_milhas terá 485 linhas, reduzindo bastante os dados para uma análise mais focada.

Retorno:

Rows: 485

Columns: 4

$ id_cliente <dbl> 109, 376, 443, 32, 842, 609, 391, 600, 101, 761, 959…

$ data_venda_milhas <date> 2022-09-26, 2022-06-12, 2022-12-17, 2022-12-06, 202…

$ milhas_vendidas <dbl> 6525, 9955, 5913, 2854, 5686, 937, 1190, 8295, 635,…

$ valor_recebido <dbl> 113.70, 466.73, 1489.56, 1983.85, 191.69, 183.50, 47…

Os dados de vendas e milhas podem variar ao longo dos anos, com quedas e aumentos. Queremos focar no ano anterior e, analisando esse período específico, entenderemos melhor o comportamento ao longo do ano.

Não podemos fazer isso apenas para um dataframe. Nossa análise também incluirá o transacoes_passagens. Podemos copiar a consulta para a próxima célula e substituir transacoes_milhas por transacoes_passagens e a coluna data_da_venda por data_transacao, mantendo o mesmo período de análise.

transacoes_passagens <- transacoes_passagens %>% filter(data_transacao >= '2022-01-01' & data_transacao <= '2022-12-31')

Após executar a célula acima, verificaremos o resultado com o glimpse().

transacoes_passagens %>% glimpse()

Após filtrar esse período específico, temos 502 linhas na base consultada. Reduzimos para 400 em transações de milhas e 502 em passagens.

Retorno:

Rows: 502

Columns: 5

$ id_cliente <\dbl> 589, 774, 149, 620, 96, 449, 693, 242, 358, 317, 633…

$ data_transacao <date> 2022-02-11, 2022-09-23, 2022-11-07, 2022-08-12, 202…

$ milhas_utilizadas <dbl> 2893, 2274, 6976, 6479, 9444, 8102, 5335, 7139, 7280…

$ valor_pago <dbl> 1320.34, 1000.44, 309.56, 1869.74, 267.63, 268.38, 1…

$ classe_voo <chr> "Primeira Classe", "Economica", "Primeira Classe", "…

Conclusão

Com essas transformações no dataframe, tanto na seleção de linhas quanto de colunas, teremos uma exploração mais específica dos dados.

Próximos passos

A seguir, começaremos a explorar esses dados e gerar insights com o que temos.

Sobre o curso R: utilizando o Tidyverse e transformando dados com dplyr

O curso R: utilizando o Tidyverse e transformando dados com dplyr possui 97 minutos de vídeos, em um total de 46 atividades. Gostou? Conheça nossos outros cursos de Data Science em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Data Science acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas