Welcome

O que é o R

O R não é apenas uma linguagem de programação, é também um ambiente integrado de desenvolvimento. É um projeto GNU, que foi desenvolvido na Bell Laboratories (antiga AT & T, agora Lucent Technologies) por John Chambers e seus colegas.

De acordo com seus criadores, o R é um conjunto integrado de instalações de software para manipulação de dados, cálculo e exibição gráfica, e esse ambiente inclui:

  • Ler e armazenar dados;
  • Operações matemáticas: cálculos em numéricos, em vetores e matrizes;
  • Ferramentas para análise de dados;
  • Criação de gráficos;

Além disso, o R conta com uma ampla comunidade que oferece suporte e ajuda aos usuários.

Isso faz do R um projeto aberto, o que sigfinica ser continuamente melhorado, atualizado e expandido pela comunidade global de desenvolvedor e seus usuários.

Bases de Dados Utilizadas

Neste primeiro módulo (Introdução ao R) faremos uso de alguns arquivos externos que estão disponíveis na pasta datasets no nosso diretório no dropbox.

  • populacao.txt,populacao.csv e populacao.xlsx: São todos a mesma base, porém em formatos diferentes. Trata-se dados simulados de uma amostra de pessoas de cinco regiões diferentes. Com informações sobre idade, gênero e região.

  • iris: (inclída no R) refere-se a informações sobre o comprimento e a largura de pétalas e sépalas (em centímetros) de 50 flores.

  • dados_anp2.csv: Com o objetivo de evitar possíveis irregularidades, desde 02 de maio de 2004, a ANP publica o Levantamento de Preços e de Margens de Comercialização de Combustíveis, contemplando a ampliação do universo de municípios pesquisados, abrangendo todos os estados brasileiros. A divulgação da pesquisa encontra-se no site http://www.anp.gov.br/preco/ Os combustíveis incluídos nessa pesquisa são: Gasolina, Etanol, Diesel, GNV, Diesel S10. Essa base contém dados dos preços de venda e compra desses combustíveis no ano de 2016. Esses dados foram capturados usando a técnica de wescraping com R.

  • Human development index (HDI).csv: base com a evolução do Índice de desenvolvimento Humano (IDH) nos anos de 2013 e 2014.

  • churn_telecon.csv,churn_telecon.xlsx echurn_telecon_tab: dados coletados no http://www.kaggle.com/. São referntes à uma empresa de telecom, com informações sobre dados móveis, pacotes de dados que o cliente possui. Também é possível saber se o cliente permanece na empresa ou não.

Instalando o R e o RStudio

Instalação do R

Neste curso faremos uso da versão mais recente do R, para instalá-la siga os passos:

  1. Entre no site cran.r-project.org
  2. Faça o download do arquivo
  3. Clique em executar

Instalação do RStudio

Neste curso além do R faremos uso do RStudio, para instalá-lo basta:

  1. Entre no site https://www.rstudio.com/home/
  2. Clique em dowload
  3. Escolha a opção Free
  4. Faça o download do arquivo
  5. Clique em executar

Acessando o RStudio pelo Azure Notebook

Além de acessar o R e Rsudio em sua máquina, é possível acessá-lo via Azure Notebook

  1. No Portal Azure, acesse seu Painel de Recursos e Selecione:
  1. Seleciione sua máquina e clique no botão iniciar:
  1. Com sua máquina ligada, abra ela via RStudio


4. Aprecie sem moderação!

Conhecendo o RStudio

O RStudio é um ambiente de desenvolvimento integrado (IDE) para R. Nele estão inclusos ferramentas que facilitam o uso da linguagem R, como um console e uma janela que suporta a execução do código direto, e instrumentos que auxiliam na análise histórica do script e debugação de possíveis erros.

O RStudio está disponível em open source e edições comerciais e é executado no desktop (Windows, Mac e Linux) ou em um navegador conectado ao RStudio Server ou ao RStudio Server Pro (Debian / Ubuntu, RedHat / CentOS e SUSE Linux).

Ao abrir o RStudio será aberto uma tela grande com quatro telas menores:

  1. A primeira tela é destinada à escrita dos seus scripts, onde ficarão armazendos seus códigos.


  1. A segunda tela é onde são compilados os códigos escritos na primeira tela. Você também pode digitar os comandos no console, mas não serão armazenados.

  1. A terceira tela, destina-se principalmente à armazenar os objetos criados nos scripts.



  1. A quarta tela tem três diferentes objetivos. O primeiro é mostrar os plots (gráficos) que serão feitos em um script. O segundo objetivo é mostrar os arquivos dentro de um diretório. O terceiro objetivo é responder os questionamentos de qualquer objeto fazendo uso da função help().



Scripts

Criando um Script

Scripts são arquivos em texto onde são armazenados os seus comandos em R, os scripts são escritos na primeira tela do RStudio. Para criar um novo Script basta seguir o caminho: File >> New File >> R Script:

Salvando um script existente

Para salvar um script escrito, basta seguir o caminho: File >> Save As...:

Executando um script

Para fazer com que o R entenda que você está executando uma linha de comando existem duas maneiras. A primeira é fortemente desencorajada, que é colocar o cursor ao final da linha ou selecionar as linhas que deseja e excutar e clicar no botão:

A segunda forma vai facilitar a sua vida durante o curso que é:

CRTL + Enter

Primeiros Passos com R

Operações Matemáticas

São operações que resultam em um número, essas operações são:

Operação Código
Soma +
Subtração -
Multiplicação *
Divisão /
Potência a**b
Raiz Quadrada sqrt()
Módulo %%
Média mean()
Desvio Padrão sd()
Mediana median()
Logaritmo log(x, base)

Exemplo: Qual é o resultado de \(\sqrt[2]{25}\)?

sqrt(25)
## [1] 5

Exemplo: Qual é o resto da divisão de \(\frac{5}{2}\)?

5%%2
## [1] 1

## Operações Lógicas

São operações que testam se uma situação é verdadeira ou falsa, os principais operadores são:

Operação Código
Negação !
Contém %in%
Maior >
Menor <
Igual ==
Diferença !=

Exemplo: Considere \(a=25\) e \(b=45\) analise se a é maior:

5%%2
## [1] 1

Os operadores lógicos acima analisam se uma situação é verdadeira ou falsa de maneira pontual. Existem operadores lógicos que analisam de maneira mais ampla se uma situção é verdadeira ou não:

  • Operador E - Retorna verdadeiro se toda a expressão for verdadeira. No R fazemos uso do operador & ou &&.
  • Operador OU - Retorna verdadeiro se ao menos uma das partes da expressão for verdadeira. No R fazemos uso do operador | ou ||.
  • Operador OU Exclusivo - Retorna verdadeiro, somente se uma das partes for verdadeira. No R para ou exclusivo fazemos uso do xor().

Exemplo: Analise se \(25^2 = \sqrt{625}\) E se Bigdata= bigData:

25**2==sqrt(625) & "Bigdata" == "bigData"
## [1] FALSE

Exemplo: Analise se \(25^2 = \sqrt{625}\) OU se Bigdata= bigData:

25**2==sqrt(625) | "Bigdata" == "bigData"
## [1] FALSE

Objetos

São objetos destinados a guardar temporariamente os valores calculados. Para atribuir um valor à um objeto basta digitar o comando <- ou =.

OBS: No R você pode criar objetos e visualizá-los de duas maneiras distintas:

  1. A primeira é inserindo “(” antes do objeto e “)” após o objeto atribuído

Exemplo:

(a=3)
## [1] 3
  1. A segunda é chamar o objeto pelo nome atribuído:

Exemplo:

a=3
a
## [1] 3

Umas dicas para os nomes dos objetos no R:

  • use letras minusculas
  • use _ entre palavras
  • tente usar nomes descritivos
  • tente usar nomes curtos.

Bom:

votos <- c("Sim", "Não", "Não", "Não", "Sim")

valor_produto <- c(1.32, 6.2, 1.9, 3.05)

Ruim:

data <- c(1, 3, 2, 4)

MuitasCoisasJuntosNumaBase <- c("alo", "tchau", "bom dia!")

Código em geral deve ser escrito numa forma que o deixe fácil ler depois. Por exemplo, insira espaços entre operadores como =, e quebre partes longas craindo novas linhas no código. Um exemplo que é ruim:

x<-data.frame(primeira=c(1,2,"João", "Maria"),segunda=3:6,terceira=TRUE)
x
##   primeira segunda terceira
## 1        1       3     TRUE
## 2        2       4     TRUE
## 3     João       5     TRUE
## 4    Maria       6     TRUE

A versão melhor:

x <- data.frame(primeira = c(1, 2, "João", "Maria"),
                segunda = 3:6,
                terceira = TRUE)
x
##   primeira segunda terceira
## 1        1       3     TRUE
## 2        2       4     TRUE
## 3     João       5     TRUE
## 4    Maria       6     TRUE

Classes de objetos

No R, há alguns tipos de variáveis que você pode ter num dataframe:

  • num: variável numerica, e.g. 1.45 (também chamada dbl);
  • int: número inteiro, e.g. 2;
  • chr: caracter, ou “string”, e.g. "Maria";
  • log: logical, FALSE ou TRUE.
  • Factor: caracter que tem níveis numéricos, que vamos explorar numa outra aula.
  • data: datas e horas.

Obviamente, algumas funções só podem ser aplicadas no tipo correto de variável: você não pode calcular a média de um chr, por exemplo. Com variáveis lógicas (TRUE/FALSE), podemos fazer operações matemáticas, porque TRUE = 1 e FALSE = 0 internamente no R; também podemos fazar cálculos com Factors.

Todos esses tipos têm funções para transformar uma variável no tipo desejado e para checar o tipo. No entanto, há limites obviamente, você não pode transformar "Maria" num número!

Numérico

Como o próprio nome indica, são variáveis que contém números.

Exemplo: Considere \(a=2\) e \(b=5\), calcule \(c=a+b\)

a=2
b=5

c=a+b
c
## [1] 7

Exemplo: Considere \(a=15\) e \(b=25\), calcule \(c=a+b\) e \(d=(\sqrt[3]{c})\)

a=15
b=25

(c=a+b)
## [1] 40
d=c^(1/3)
d
## [1] 3.419952

Caracteres (texto)

São palavras, textos, letras, entre outros. Para atribuir a uma variável tipo character é necessário colocar o valor entre "" (aspas duplas) ou '' (aspas simples).

Exemplo: Crie \(nome_1=Big\) e \(nome_2=Data\):

nome1="big"
nome1
## [1] "big"
nome2='data'
nome2
## [1] "data"

Exemplo: Calcule \(nomecompleto=nome_1+nome_2\):

Para resolver essa questão é necessário fazer uso da função paste(), essa função server para concatenar duas ou mais variáveis character.

nomecompleto=paste(nome1,nome2)
nomecompleto
## [1] "big data"

Caso não seja útil o espaço entre as palavras, basta usar a função paste0():

nomecompleto=paste0(nome1,nome2)
nomecompleto
## [1] "bigdata"

Data

Dados do tipo data podem ser importados de diversos tipos em especial character. É muito útil transformar caracteres em datas, principalmente quando arquivos são importados de fontes externas.

Exemplo: Transforme 06/02/2017 em data:

data="06/02/2017"

formatodata=as.Date(x = data,format="%d/%m/%Y")

formatodata
## [1] "2017-02-06"

No exemplo acima foi feito o uso da função as.Date(), que tem como inputs:

  • x : Objeto a ser transformado
  • format: como esta divido o texto a ser transformado em data (no exemplo acima estava divido por “/”):
    • %d = representa o dia
    • %m = representa o mês
    • %Y = representa o ano

Lógica

É uma variável booleana que pode receber como valores as situações TRUE (verdadeira) ou FALSE (Falso).

##Conhecendo a classe de um objeto

Para saber qual é a classe de um objeto basta usar a função class() ou str():

Exemplo: Considere \(a=3\), descubra a classe de a.

a=3

str(a)
##  num 3

Exemplo: Considere \(a=3\), descubra a classe de a.

a=3

class(a)
## [1] "numeric"

Vetores

Vetores são objetos que armazenam unidimensionalmente várias variáveis da mesma classe.

Imagine que você é um diretor de uma empresa que vende um determinado produto em todos os estados brasileiros. Assim, se você quisesse ter o conjunto de preços por estado de cada produtos você deveria criar 27 objetos numéricos diferentes.

preco1 = 1.5
preco2 = 2.5
preco3 = 2.5
.
.
.
preco27 = 5.5

Para evitar esse trabalho desnecessário o correto é usar vetores, que armazenará em um único objeto todos os preços em um formato sequêncial:

precos=[1.5,2.5,4.5,…,5.5]

No R para criar um vetor basta usar a função c():

Exemplo: Crie um vetor chamado nomes que contenha:

Anna
Paula
Roberta
Ingrid
Fernanda
João
nomes=c("Anna","Paula","Roberta","Ingrid","Fernanda","João")

nomes
## [1] "Anna"     "Paula"    "Roberta"  "Ingrid"   "Fernanda" "João"

Indexação de Vetores

É comum, trabalhar com um ou mais elementos específicos de um vetor, para acessa-los é necessário conhecer a indexação:

\(elemento_i=V[i]\)

onde:

\(i\) = é a posição do elemento solicitado.

\(V\) = Vetor em questão

No R, segue essa mesma lógica basta digitar nome_vetor[posição desejada].

Exemplo: Considere o vetor \(v=[1,10,15,5,30,2]\), qual é o primeiro elemento do vetor?

v=c(1,10,15,5,30,2)

v[1]
## [1] 1

Caso queira mais de uma posição digite nome_vetor[posicao_inicial:posicao_final]:

Exemplo: Ainda com o vetor \(v=[1,10,15,5,30,2]\), quais são os três primeiros elementos do vetor?

v[1:3]
## [1]  1 10 15

Tamanho do Vetor

Para saber o tamanho de um vetor, basta usar a função length():

Exemplo: Qual é o tamanho do vetor \(v=[1,10,15,5,30,2]\)?

v=c(1,10,15,5,30,2)
length(v)
## [1] 6

Concatenando vetores

Agora vamos supor que você é um professor e no primeiro dia de aula tem a lista com o nome dos alunos:

Anna
Pedro
Carlos
Bruno
Vanessa
Paula
Italo

Mas no segundo dia surgiram mais 5 alunos:

Jorge
Davi
Mariana
Bruno
Carolina
Alice

Como colocar os novos nomes na antiga lista?

No R, para concatenar vetores basta usar a função c(primeiro_objeto,segundo_objeto,...).

Exemplo: Concatene as listas com os nomes dos alunos:

nomes1<-c("Anna","Pedro","Carlos","Bruno","Vanessa","Paula","Italo")
nomes2<-c("Jorge","Davi","Mariana","Carolina","Alice")

nomes_completo<-c(nomes1,nomes2)
nomes_completo
##  [1] "Anna"     "Pedro"    "Carlos"   "Bruno"    "Vanessa"  "Paula"   
##  [7] "Italo"    "Jorge"    "Davi"     "Mariana"  "Carolina" "Alice"

Funções úteis

Função Saída
mean() Médias dos valores em um vetor
max() Retorna o valor Máximo
min() Retorna o Valor Mínimo
sum() Retorna a soma dos elementos
unique() Remoção de duplicatas

Exercícios

  1. Crie um vetor \(v=[105,106,150,135,120,147]\):
  • Concatene com o vetor \(v2=[105,250,300,175,157,147,134]\).

  • Remova as duplicatas.

  • Qual é o terceiro elemento?

  • Qual é o o tamanho do vetor?

  • Qual é a média dos valores?

  • Qual é o maior elemento?

Data Frames

No mundo real as informações não estão contidas em uma unica dimensão (vetor), na maioria dos casos são necessárias mais informações. Por exemplo caso na lista dos alunos, é importante as datas das aulas para saber o nível de presença, o nome da matéria, entre outras informações.

Neste tipo de cenário o adequado é o uso de tabelas. No r as tabelas são chamadas de Data Frame, e são os objetos mais usados na linguagem.

No R para criar um data frame basta usar a função data.frame().

Produto Preço
Produto A R$ 5,00
Produto B R$ 15,00
Produto C R$ 4,00
Produto D R$ 6,00
Produto E R$ 8,00

Crie esta tabela no R:

Produto<-c("Produto A"," Produto B","Produto C", "Produto D","Produto E")
Preco<-c(5,15,4,6,8)

tabela_preco_produto<-data.frame(Produto,Preco)

tabela_preco_produto
##      Produto Preco
## 1  Produto A     5
## 2  Produto B    15
## 3  Produto C     4
## 4  Produto D     6
## 5  Produto E     8

Indexação de Data Frames

A indexação dos valores de uma data frame é parecida com a indexação dos vetores, sendo que com duas dimensões:

\(elemento_{i,j}=df[i,j]\)

onde:

\(df\) = data frame criado

\(i\) = é posição da linha onde está o objeto desejado

\(j\) = é a posição da coluna do objeto desejado

No R, segue essa mesma lógica basta digitar data_frame[posição linha, posição coluna].

Exemplo: Acesse o preço do Produto D na tabela produtos:

tabela_preco_produto[4,2]
## [1] 6

Exemplo: Acesse os preço do Produto D e Produto E na tabela produtos:

tabela_preco_produto[4:5,2]
## [1] 6 8

Acessando colunas em data frame

Além da indexação tradicional pelo número da coluna, existem outras duas formas muito úteis para acessar uma coluna de um data frame.

A primeira é data_frame$nome_coluna:

Exemplo: Acesse a coluna produtos na tabela_produto:

tabela_preco_produto$Produto
## [1] "Produto A"  " Produto B" "Produto C"  "Produto D"  "Produto E"

A segunda forma é usando colchetes, data_frame[,"nome_coluna"]

Exemplo: Acesse a coluna produtos na tabela_preco_produto:

tabela_preco_produto[,"Produto"]
## [1] "Produto A"  " Produto B" "Produto C"  "Produto D"  "Produto E"

Criando uma nova coluna em uma data frame

A criação de um a nova coluna em um data frame é parecida com o acesso á colunas.

A primeira forma de criar uma nova coluna é data_frame$nome_nova_coluna.

Exemplo: Crie uma coluna quantidade, na tabela preços, que receba os valores:

quantidade<-c(50,100,120,150,200)

tabela_preco_produto$quantidade<-c(50,100,120,150,200)
tabela_preco_produto
##      Produto Preco quantidade
## 1  Produto A     5         50
## 2  Produto B    15        100
## 3  Produto C     4        120
## 4  Produto D     6        150
## 5  Produto E     8        200

A segunda forma de criar uma nova coluna é data_frame[,“nome_nova_coluna”]

Exemplo: Crie uma coluna, na tabela preços com os custos de cada produto:

custos<-c(2,12,3,5,6)

tabela_preco_produto[,"Custos"]<-c(2,12,3,5,6)
tabela_preco_produto
##      Produto Preco quantidade Custos
## 1  Produto A     5         50      2
## 2  Produto B    15        100     12
## 3  Produto C     4        120      3
## 4  Produto D     6        150      5
## 5  Produto E     8        200      6

Conhecendo seu Data Frame

É aconselhável conhecer seu objeto, data frame, com o qual está trabalhando. Até o momento trabalhamos com uma tabela pequena, a tabela preços, composta por 5 linhas (observações) e 4 colunas (variáveis). No mundo real tabelas como estas são exceção, neste sentido não é possível visualizar e extrair informações analogamente olhando a olho nu o data frame como feito na tabela preços.

O R oferece algumas funções que auxiliam a entender seu data frame. Para isso, vamos usar outra base de dados a iris.

A primeira função é a str() que ajuda a conhecer a classe de cada coluna (variável) no data frame.

base_flores<-iris

str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

A primeira saída dessa função é o numero de observações (linhas) e o número de colunas, depois saem as informações sobre cada coluna que exceto pela última são todas numéricas.

A segunda função é a head() que retorna as seis primeiras observações de seu data frame:

head(base_flores)
##   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

A terceira função é a summary() que faz um “resumo” de todos os dados dentro de um data frame:

summary(base_flores)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

Perceba que para as colunas numéricas a função summary calculou as estatísticas descritivas e para as colunas de texto foram contabilizadas as quantidades.

A quarta função é a names() que retorna os nomes das colunas do data frame.

names(base_flores)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

Funções Úteis

Algumas funções úteis:

Função Saída
nrow() Número de linhas (observações) em um data frame
ncol() Número de colunas (varáveis) em um data frame
dim() Retorna a dimensão do data frame. Número de linhas e úmero de colunas
unique() Remoção de duplicatas
tail() Retorna as 6 últimas observações em um data frame
cbind() Concatena dois data frames pelas colunas
rbind() Concatena dois data frames pelas linhas

Exercício

Leia o arquivo dados_frame.txt e baseado em suas informações crie uma tabela, chamada de tabela_pessoas e responda as questões

  1. Quantas observações tem a tabela?
  2. Quais são as médias das idades?
  3. Quais são as classes de cada uma das colunas?
  4. calcule um resumo da tabela.

Utilização de Pacotes

Os pacotes no R são conjuntos de funções que facilitam a nossa vida. Como a comunidade do R vem crescendo, novos pacotes aparecem todos os dias.

Para instalar pacotes, use o comando install.packages()

Vamos instalar nosso primeiro:

Instalar pacotes

Importando as Bases de Dados

Nem todos os objetos que usamos no R são calculados dentro de um Script. Assim, é indispensável a leitura de arquivos externos. O R oferece uma gama de funções e pacotes para a leitura de arquivos externos nos formatos, .txt, .csv, dentre outros. Estas funções lêem os arquivos externos e transforma automáticamente em data frames.

Diferentes tipos de dados

txt

A primeira função é a read.table(), que é considerada a raiz, muitas funções são derivadas dela. A função read.table() é composta pelos campos:

  • file: nome do arquivo OU caminho e nome do arquivo.
  • header: determina se o arquivo tem cabecalho ou nao, default TRUE; no caso de FALSE a funcao cria nomes para as colunas.
  • sep: separador da coluna (default tab).
  • dec: separador decimal (default ponto).

Exemplo: Leia o arquivo churn_telecom_tab.txt no diretório datasets:

df_tab<-read.table(file="assess/data/churn_telecom_tab.txt",header = TRUE,sep = "\t",dec=".")
# head(df_tab)

csv - padrão internacional (separador decimal .)

A função read.table() não é tão eficiente por isso existem variações destas função. Além disso, dados internacionais, principalmente em inglês, utilizam o . como separador decimal e vírgula , para a separação das colunas.

Quando os dados estiverem nesse padrão, nós utilizamos a função: read_csv

library(readr)

df_csv <- read_csv("assess/data/churn_telecom.csv")
# df_csv

csv - padrão Brasil

Em português a separação do decimal é feita com , e geralmente o separador de colunas é o ;.

Nesses casos a gente usa a função: read_csv2

library(readr)

df_csv_br <- read_csv2("assess/data/churn_telecom_br.csv")
## i Using ',' as decimal and '.' as grouping mark. Use `read_delim()` for more control.
## 
## -- Column specification --------------------------------------------------------
## cols(
##   estado = col_character(),
##   cliente_fidelidade_meses = col_double(),
##   ddd = col_double(),
##   telefone = col_character(),
##   plano_internacional = col_character(),
##   plano_email = col_character(),
##   plano_sms = col_double(),
##   min_lig_diurno = col_double(),
##   qtdd_lig_diurna = col_double()
## )
# df_csv_br$min_lig_diurno

Excel

Para ler arquivos no formato .xlsx, primeiro será necessário carregar o pacote xlsx usando o comando library(). O segundo passo é usar a função read.xlsx, com os parâmetros:

  • file: Endereço + nome do arquivo a ser lido.
  • header: Booleano, TRUE ou FALSE. Determina se o arquivo vai ter cabeçalho ou não (Default = TRUE).
  • sheetIndex: Índice da aba a ser lida.
  • SheetName: Nome da aba a ser lida (Default=NULL).
  • rowIndex: Índices das linhas a serem lidas (Default=NULL).
  • colIndex: índices das colunas que devem ser lidas (default NULL).

Exemplo: Na pasta datasets leia o arquivo populcao.xlsx:

library(xlsx)

base<-read.xlsx("assess/data/churn_telecom.xlsx", sheetName = "churn_telecom")

Exportação de Arquivos

Nem todo mundo usa o R. Em muitos casos seus resultados serão utilizados por outros softwares. Neste sentido, o R permite a exportação dos resultados para outras extensões no formato .txt, .csv, dentre outros.

txt

A exportação de arquivos ocorre de maneira análoga ao que é feito na leitura de dados, a primeira função é a write.table() e existem outras derivadas desta. A função write.table() tem como parâmetros:

  • x: nome do data frame a ser salvo
  • file: diretório + nome do arquivo a ser salvo
  • quotes: Booleano, decide se as colunas caracteres ou fatores serão salvos com aspas duplas.
  • row.names: Booleano, TRUE ou FALSE, significa se o arquivo salvo terá ou não nome nas linhas
  • col.names: Booleano, TRUE ou FALSE, significa se o arquivo salvo terá ou não nome nas colunas
  • append - Booleano, TRUE ou FALSE, decide se a tabela será anexada a um arquivo já existente ou não
  • sep: Character, informa qual será o separador das colunas
  • dec: Character, decide qual será o separador número decimal

Exemplo: Tome a tabela abaixo com nomes e idades, exporte ela para o formato .txt, como o nome idades.txt

Nomes Idades
Marco 36
Carol 29
João 28
Caio 8
Vinicius 10
Nomes<-c("Marco","Carol","João","Caio","Vinicius")
Idades=c(36,29,28,8,10)

frame_idades<-data.frame(Nomes,Idades)

write.table(frame_idades,"assess/data/save/idades.txt")

csv (formato internacional)

A função write.table() também não é muito indicada dado que não apresenta um bom desempenho. Assim, existe outras funções que são variações da função write.table()

A primeira função é a write.csv() que apresenta os mesmos parâmetros que a write.table(), sendo que considera como default o sep="," e o dec=.

Exemplo: Tome a tabela abaixo com nomes e idades, exporte ela para o formato .csv, como o nome idades.csv

Nomes<-c("Marco","Carol","João","Caio","Vinicius")
Idades=c(36,29,28,8,10)

frame_idades<-data.frame(Nomes,Idades)

write.csv(frame_idades,"assess/data/save/idades.csv")

csv (formato brasileiro)

A segunda função é a write.csv2(), voltada para arquivos .csv brasileiros, que apresenta os mesmos parâmetros que a write.table(), sendo que considera como default o sep=";" e o dec=.

Exemplo: Tome a tabela abaixo com nomes e idades, exporte ela para o formato .csv, como o nome idades.csv

Nomes<-c("Marco","Carol","João","Caio","Vinicius")
Idades=c(36,29,28,8,10)

frame_idades<-data.frame(Nomes,Idades)

write.csv2(frame_idades,"assess/data/save/idades.csv")

Microsoft Excel

Para exportar arquivos no formato .xlsx também é necessário o pacote xlsx. A função utilizada para a exportação deste tipo de arquivo é a write.xlsx() que tem como parâmetros:

  • x: data frame a ser salvo no formato.xlsx
  • file: nome do arquivo
  • sheetName: Nome da aba do arquivo a ser salvo
  • row.names: Booleano, TRUE ou FALSE, significa se o arquivo salvo terá ou não nome nas linhas
  • col.names: Booleano, TRUE ou FALSE, significa se o arquivo salvo terá ou não nome nas colunas

Exemplo: Crie um arquivo chamado funcionarios.xlsx com os dados:

Nome Salário
Anna R$ 3.000,00
Bruno R$ 5.000,00
Fernando R$ 2.500,00
Viviane R$ 1.000,00
Bernardo R$ 500,00
Nome<-c("Anna","Bruno","Fernando","Viviane","Bernardo")
Salario<-c(3000,5000,2500,1000,500)

df_salarios<-data.frame(Nome,Salario)

write.xlsx(df_salarios,"assess/data/save/funcionarios.xlsx",sheetName ="Salario",row.names = FALSE)

R para Data Science - Tidyverse

Até o momento demos um overview no ambiente R. Neste tópico iremos introduzir a visão do uso do R para Data Science.

Antes de fazer isso, vamos entender um pouco do mundo de Data Science:

  1. Import: Essa é fase em que seus dados são capturados não importando seu formato;
  2. Tidy: Essa é a fase,com o intuito de trabalhar com os dados, de transformação dos dados para:

  1. Entendimento dos dados - Essa etapa em que é feita a análise exploratória dos dados. Onde seu dados são tranformados para uma melhor compreensão da situação; onde são realizadas as primeiras hipóteses. Essa fase esta compreendida:
  • Análise exploratória: compreende o passado dos dados;
  • Visualização: A relação dos dados é traduzida em graficos;
  • Agora são aplicados os modelos para um entendimento mais produndo.
  1. Comunicação - É a fase em que são elaboradas: apresentações, relatórios e dashboards para comunicar seus resultados.

Para isso começo apresentando o Tidyverse:

Tidyverse é uma coleção de pacotes voltados para Data Science. Todos os pacotes foram construídos com a mesma filosofia e gramática.

Para instalar os pacotes basta usar o comando install.packages()

# install.packages("tidyverse")

Para chamar os pacotes a serem usados basta:

library(tidyverse)

Ou se preferir pode chamar pelo pacote a ser usado. Os principais pacotes do Tidyverse são:

  • ggplot2: um pacote super útil voltado para visualização de dados;
  • dplyr: pacote que oferece uma gama de funções para trabalhar com datasets;
  • tibble: é um novo conceito de estrutura de dados em especial data frame;
  • purr: uma série de funções que auxiliam no funcionamento ótimo do código;
  • ...

Tibble

O R é uma linguagem muito útil, porém ele já um jovem de 20 e poucos anos, coisas que era úteis a 20 anos atrás hoje podem atrapalhar. Para não quebrar o código fonte as melhorias são feitas nos pacotes.

Um exemplo disso é o tibble que é um objeto que muito se assemelha ao nosso velho amigo data frame. Porém esse objeto não exatamente uma tabela.

Para transformar um objeto Data Frame em tibble basta usar a função as.tibble

Exemplo 14.1- Transforme o iris em tibble:

library(tibble)

tb_iris<-as_tibble(iris)

O tibble tem basicamente a estrutura:

  • A primeira linha contem o tipo do objeto (‘tibble’), número de observações e o número de variáveis;
  • 10 primeiras linhas do tibble, com a finalidade de economisar memória;
  • A linha entre os headers e as obs é composta pelos tipos das colunas;
head(tb_iris)
## # A tibble: 6 x 5
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
## 1          5.1         3.5          1.4         0.2 setosa 
## 2          4.9         3            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           3.6          1.4         0.2 setosa 
## 6          5.4         3.9          1.7         0.4 setosa

Para esse tipo de objeto ao invès de usarmos o str() usaremos a função glimpse():

str(tb_iris)
## tibble [150 x 5] (S3: tbl_df/tbl/data.frame)
##  $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
glimpse(tb_iris)
## Rows: 150
## Columns: 5
## $ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9, 5.4,...
## $ Sepal.Width  <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7,...
## $ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5,...
## $ Petal.Width  <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2,...
## $ Species      <fct> setosa, setosa, setosa, setosa, setosa, setosa, setosa...

O Operador Pipe: %>%

Vamos agora aprender uma nova forma de programar em R. Uma forma que pode ajudar muito na organização do código. O pipe (%>%) é um operador que permite encadear, de maneira fácil e organizada, uma sequência de cálculos.

O seu uso é muito simples:

  • Carregue o pacote tidyverse;

  • Basta usar a estrutura:

Objeto %>% 
  funcao()

Onde:

  • objeto: Objeto o qual vai ser aplicado a função
  • funcao: Função a ser aplicada

Atalho para digitar o operador pipe:

CRTL + Shift + M

Exemplo: Considere o vetor \(vetor=[4,5,10,15,25,45]\) calcule a média usando pipe:

library(tidyverse)
vetor<-c(4,5,10,15,45)

vetor %>% 
  mean()
## [1] 15.8

Okay, e se quisermos aplicar mais de uma função? Simples, basta colocar as funções na sequência do %>%.

Objeto %>% funcao1()
       %>% funcao2()
       %>% funcao3()
       ...

Exemplo: Considere o vetor \(vetor=[1,5,5,7,9,9,9,9,9,10,8]\) remova os valores duplicados e calcule a média:

library(tidyverse)
vetor<-c(1,5,5,7,9,9,9,9,9,10,8)
final<- vetor %>%
        unique() %>%
        mean()

Trabalhando o Dataset - Tidyverse

No mundo real de Data Science é muito raro receber uma base de dados pronta para começar a análise. Seja porque você precisa fazer um recorte dos dados ou porquê você precisa dos dados em um outra estrutura. Para isso usaremos o pacote Tidyverse para tratar os nossos dados.

A seguir, iremos ver as seguintes funções:

  • selecionar colunas (select);

  • filtrando valores (filter);

  • agrupando (group_by);

  • ordenando (arrange);

  • criando novas colunas (variáveis) (mutate);

  • recodificando valores (case_when).

  • Iremos usar essas funções para descobrir se clientes de Nova Iorque com plano de email ficam mais minutos no telefone no período noturno, se comparados aos clientes que não possuem plano de email.

Leitura de dados de Bancos relacionais

Até o momento foi aprendido criar data frames por dentro do R ou fazendo leituras de arquivos em CSV e/ou excel. Nesse módulo aprenderemos a fazer leitura direto de um banco de dados, para isso usaremos precisaremos usar o pacote DBI.

install.packages("DBI")
library(DBI)

O pacote DBI funciona como uma interface entre o R o banco, no nosso caso, Azure SQl Server.

Em qualquer outra interface com bancos (como SQL Management, Dbeaver, Mysql Workbech, entre outros) você precisa passar os parâmetros para acessar o seu banco:

  • Driver: ODBC
  • Servidor
  • Porta
  • Login e Senha
  • Forma de autênticação

No caso do DBI, para fazer a conexão com com banco, informaremos os campos acima por meio de uma Connection String:

c_ctring = 'Driver={ODBC Driver 17 for SQL Server};Server=tcp:sy-treinamento-analytics-poc.sql.azuresynapse.net,1433;Database=datawarehouse;Uid=seulogin;Pwd=suasenha;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;Authentication=SqlPassword'
## Warning: package 'DBI' was built under R version 4.0.4

Próximo passo criar a conexão, com a função dbConnect:

con <- dbConnect(odbc::odbc(), .connection_string =c_string)

Agora é só executar a query aplicando a função dbGetQuery:

base_audiencia = dbGetQuery(con," SELECT * FROM [claroTreinamentos].[rtp_audience_meter]")

head(base_audiencia)
##   dat_ini_ts_conteudo_assistido dsc_periodo_assistido  dsc_nome_canal_tv
## 1           2020-09-27 03:00:00                 NOITE     Band Sports HD
## 2           2020-09-30 03:00:00             MADRUGADA       GloboNews HD
## 3           2020-09-30 03:00:00                 TARDE               Band
## 4           2020-09-30 03:00:00                 TARDE      CNN Brasil HD
## 5           2020-09-27 03:00:00                 NOITE           Globo HD
## 6           2020-09-30 03:00:00              MANH<c3> TV Tribuna - Globo
##   num_canal_tv sgl_canal_tv dsc_genero dsc_segmentacao     dsc_nome_produto
## 1          575     SPOBSPHD  MASCULINO           BLACK TOP HD MAX FID 18724
## 2          540     STSGWSHD  MASCULINO          PURPLE                 <NA>
## 3           22       SPOBAN      OUTRO           BLACK                 <NA>
## 4          577     SPOCNBHD  MASCULINO    SEM SEGMENTO                 <NA>
## 5          501      SPOGLHD  MASCULINO    SEM SEGMENTO                 <NA>
## 6           18       STSGLB  MASCULINO    SEM SEGMENTO                 <NA>
##   dsc_perfil_produto
## 1               <NA>
## 2               <NA>
## 3               <NA>
## 4               <NA>
## 5               <NA>
## 6               <NA>
##                                                         dsc_cidade
## 1 785ee795e7edc591e82338383a9d3b9d5aab581e18ff34177d9722aa6707b36b
## 2 241b311ab9f84e2ac984953c1e1f9ff2cb42b967203ab8cb5d1f80c670213707
## 3 785ee795e7edc591e82338383a9d3b9d5aab581e18ff34177d9722aa6707b36b
## 4 785ee795e7edc591e82338383a9d3b9d5aab581e18ff34177d9722aa6707b36b
## 5 785ee795e7edc591e82338383a9d3b9d5aab581e18ff34177d9722aa6707b36b
## 6 241b311ab9f84e2ac984953c1e1f9ff2cb42b967203ab8cb5d1f80c670213707
##                                                             sgl_uf
## 1 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
## 2 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
## 3 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
## 4 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
## 5 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
## 6 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
##   qtd_dur_titulo_min qtd_dur_periodo_assistido qtd_num_serie_smart_card
## 1                 NA                         0                        1
## 2                 NA                       390                        2
## 3                 NA                         4                        2
## 4                 NA                       296                        4
## 5                 NA                       873                        8
## 6                 NA                       871                        5
##   dat_criacao_registro data_dia_ref
## 1  2020-10-10 16:17:16     20200927
## 2  2020-10-07 20:14:16     20200930
## 3  2020-10-10 16:17:16     20200930
## 4  2020-10-10 16:17:16     20200930
## 5  2020-10-10 16:17:16     20200927
## 6  2020-10-07 20:14:16     20200930
  • Vamos verificar a estrutura da base de dados:
base_audiencia %>%
  glimpse()
## Rows: 47,956
## Columns: 16
## $ dat_ini_ts_conteudo_assistido <dttm> 2020-09-27 03:00:00, 2020-09-30 03:0...
## $ dsc_periodo_assistido         <chr> "NOITE", "MADRUGADA", "TARDE", "TARDE...
## $ dsc_nome_canal_tv             <chr> "Band Sports HD", "GloboNews HD", "Ba...
## $ num_canal_tv                  <chr> "575", "540", "22", "577", "501", "18...
## $ sgl_canal_tv                  <chr> "SPOBSPHD", "STSGWSHD", "SPOBAN", "SP...
## $ dsc_genero                    <chr> "MASCULINO", "MASCULINO", "OUTRO", "M...
## $ dsc_segmentacao               <chr> "BLACK", "PURPLE", "BLACK", "SEM SEGM...
## $ dsc_nome_produto              <chr> "TOP HD MAX FID 18724", NA, NA, NA, N...
## $ dsc_perfil_produto            <chr> NA, NA, NA, NA, NA, NA, NA, "COMBO 23...
## $ dsc_cidade                    <chr> "785ee795e7edc591e82338383a9d3b9d5aab...
## $ sgl_uf                        <chr> "791fdea745a0b1eacb76240541fea99010e4...
## $ qtd_dur_titulo_min            <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ qtd_dur_periodo_assistido     <int> 0, 390, 4, 296, 873, 871, 342, 150, 3...
## $ qtd_num_serie_smart_card      <int> 1, 2, 2, 4, 8, 5, 5, 1, 1, 1, 1, 1, 1...
## $ dat_criacao_registro          <dttm> 2020-10-10 16:17:16, 2020-10-07 20:1...
## $ data_dia_ref                  <int> 20200927, 20200930, 20200930, 2020093...

Como temos muitas variáveis, o primeiro passo é selecionar apenas as colunas que iremos usar.

Seleção de Variáveis

  • Utilizamos o select() para remover ou selecionar colunas.

  • A sintaxe é:

df_2 <- df %>%
  select(nome_da_coluna)

Para selecionar mais que uma, use c(), ou simplesmente escreve com vírgula entre os nomes das colunas:

df_2 <- df %>%
  select(coluna_1, coluna_3)

Exemplo:

recorte_audiencia <- base_audiencia %>%
  select("dat_ini_ts_conteudo_assistido", "dsc_periodo_assistido",        
"dsc_nome_canal_tv",  "num_canal_tv" ,      
"sgl_canal_tv","dsc_genero" ,                 
"dsc_segmentacao", "dsc_nome_produto",'qtd_dur_periodo_assistido')

head(recorte_audiencia)
##   dat_ini_ts_conteudo_assistido dsc_periodo_assistido  dsc_nome_canal_tv
## 1           2020-09-27 03:00:00                 NOITE     Band Sports HD
## 2           2020-09-30 03:00:00             MADRUGADA       GloboNews HD
## 3           2020-09-30 03:00:00                 TARDE               Band
## 4           2020-09-30 03:00:00                 TARDE      CNN Brasil HD
## 5           2020-09-27 03:00:00                 NOITE           Globo HD
## 6           2020-09-30 03:00:00              MANH<c3> TV Tribuna - Globo
##   num_canal_tv sgl_canal_tv dsc_genero dsc_segmentacao     dsc_nome_produto
## 1          575     SPOBSPHD  MASCULINO           BLACK TOP HD MAX FID 18724
## 2          540     STSGWSHD  MASCULINO          PURPLE                 <NA>
## 3           22       SPOBAN      OUTRO           BLACK                 <NA>
## 4          577     SPOCNBHD  MASCULINO    SEM SEGMENTO                 <NA>
## 5          501      SPOGLHD  MASCULINO    SEM SEGMENTO                 <NA>
## 6           18       STSGLB  MASCULINO    SEM SEGMENTO                 <NA>
##   qtd_dur_periodo_assistido
## 1                         0
## 2                       390
## 3                         4
## 4                       296
## 5                       873
## 6                       871

Os dataframes no R são imutáveis. Isso quer dizer que qualquer modificação feita nele precisa ser atribuída a outro nome. Para manter o próprio nome, basta usá-lo novamente.

df <- df %>%
  select(coluna_1, coluna_3)

Para remover uma coluna, basta utilizar o operador menos -:

df <- df %>%
  select(-(coluna_3))

Para renomear uma ou mais colunas, basta utilizar o operador =:

df <- df %>%
  select(coluna_nova = coluna_1)

Para só renomear colunas, utilize a função rename.

Para selecionar colunas contíguas, usamos : entre os nomes das colunas:

df <- df %>%
  select(coluna_1:coluna_10)

Filtrar

A função filter() é capaz de filtrar linhas que atendam certas condições no dataframe. A sintaxe é: filter(dataframe, condição)

Para filtrar, por exemplo, todos os clientes de que assitiram multishow:

df_multishow <- base_audiencia %>%   filter(dsc_nome_canal_tv=="Multishow HD")

head(df_multishow)
##   dat_ini_ts_conteudo_assistido dsc_periodo_assistido dsc_nome_canal_tv
## 1           2020-09-27 03:00:00                 NOITE      Multishow HD
## 2           2020-09-27 03:00:00                 TARDE      Multishow HD
## 3           2020-09-24 03:00:00              MANH<c3>      Multishow HD
## 4           2020-09-29 03:00:00                 NOITE      Multishow HD
## 5           2020-09-25 03:00:00                 TARDE      Multishow HD
## 6           2020-09-25 03:00:00                 TARDE      Multishow HD
##   num_canal_tv sgl_canal_tv dsc_genero dsc_segmentacao
## 1          542     RJOMTSHD  MASCULINO          PURPLE
## 2          542     CPSMTSHD      OUTRO           BLACK
## 3          542     SPOMTSHD   FEMININO    SEM SEGMENTO
## 4          542     STSMTSHD  MASCULINO    SEM SEGMENTO
## 5          542     CTCMTSHD   FEMININO           BLACK
## 6          542     RBPMTSHD  MASCULINO           BLACK
##                  dsc_nome_produto   dsc_perfil_produto
## 1 FACIL HD TURBO MULTI FIDELIDADE PTV+VTA+FONE+CELULAR
## 2                            <NA>                 <NA>
## 3      FACIL HD TURBO 2P CONF FID         PTV + VIRTUA
## 4    MIX HD C/VTA ATQ EXC RET FID  PTV + VIRTUA + FONE
## 5                            <NA>                 <NA>
## 6                            <NA>                 <NA>
##                                                         dsc_cidade
## 1 b64fb8a90ad46bba8c9c88689fc65d89e5781b68d0b702aa889b5fb0c6ddf411
## 2 857f0e23bfd4b280a99a91e450467ad76486f1612dc06ae593dac217e2b89c16
## 3 785ee795e7edc591e82338383a9d3b9d5aab581e18ff34177d9722aa6707b36b
## 4 241b311ab9f84e2ac984953c1e1f9ff2cb42b967203ab8cb5d1f80c670213707
## 5 186157f569daf9352b41ff7d6409c30240186565838590b19ff22d74d0a3e674
## 6 33a04bc6bf7d34815407dbdb8780df7577f65d24b9a630f29a69826f132850d7
##                                                             sgl_uf
## 1 b907c1d15ad106586bfc955b859943f98a6a4727bedb5caed41c92269cfdab7d
## 2 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
## 3 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
## 4 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
## 5 2eca5909e27956e4dae9248153c6ac95c145f345e6d226742a29c2f57466d0c5
## 6 791fdea745a0b1eacb76240541fea99010e46f9c19a95f0a0f21f6d4e1c68cf5
##   qtd_dur_titulo_min qtd_dur_periodo_assistido qtd_num_serie_smart_card
## 1                 NA                        90                        1
## 2                 NA                         1                        1
## 3                 NA                        90                        1
## 4                 NA                        32                        1
## 5                 NA                       330                        1
## 6                 NA                       210                        1
##   dat_criacao_registro data_dia_ref
## 1  2020-10-14 17:30:29     20200927
## 2  2020-10-10 16:17:16     20200927
## 3  2020-10-10 16:17:16     20200924
## 4  2020-10-07 20:14:16     20200929
## 5  2020-10-13 15:48:28     20200925
## 6  2020-10-16 01:05:38     20200925

Agrupar

Okay!!! Mas se eu precisar saber a audiência de cada um dos canais eu precisaria fazer um filtro para cada canal?!

Não!!! basta agrupar.

Por exemplo, temos uma lista de compras de clientes:

Cliente Data Valor
Anna 01/01/2018 500
Roberto 01/03/2018 50
João 04/10/2017 25
Anna 05/06/2018 405
João 10/07/2018 200
Roberto 25/08/2018 50
Anna 01/09/2018 1000

E queremos ter o consolidado do cliente:

Cliente Ticket
Anna 635.00
Roberto 50.00
João 112.50

Em muitos casos os dados não estão dispostos na estrutura necessária para se trabalhar, muitas vezes precisamos agrupar os dados em relação a algumas variáveis. No caso acima, agrupamos em relação aos clientes.

Como fazer isso?

Simples use o pacote dplyr e as funções:

  • group_by(): similar ao SQL, função que agrupa os dados de acordo com a variável(eis) desejada(s).

  • sumarize(): aplica uma função nas demais variáveis desejadas.

Exemplo: Crie uma tabela com a quantidade total de clientes por canal:

df_audiencia <- base_audiencia %>%
  group_by(dsc_nome_canal_tv) %>% 
  summarise(audiencia=sum(qtd_num_serie_smart_card))

Ordenação

  • arrange(): Ordena o banco de dados, incluindo ordem alfabética e numérica

Qual cliente ficou menos tempo ao telefone à noite?

Crescente

  • Ordena o banco de dados, incluindo ordem alfabética e numérica
base_audiencia<-as.tibble(base_audiencia)
## Warning: `as.tibble()` is deprecated as of tibble 2.0.0.
## Please use `as_tibble()` instead.
## The signature and semantics have changed, see `?as_tibble`.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
base_audiencia %>%
  arrange(dat_ini_ts_conteudo_assistido)
## # A tibble: 47,956 x 16
##    dat_ini_ts_conteud~ dsc_periodo_ass~ dsc_nome_canal_~ num_canal_tv
##    <dttm>              <chr>            <chr>            <chr>       
##  1 2020-09-23 03:00:00 "TARDE"          Cartoon Network~ 604         
##  2 2020-09-23 03:00:00 "MANH\xc3"       FOX Sports HD    573         
##  3 2020-09-23 03:00:00 "NOITE"          SBT              5           
##  4 2020-09-23 03:00:00 "MANH\xc3"       GloboNews HD     540         
##  5 2020-09-23 03:00:00 "MANH\xc3"       Globo HD         501         
##  6 2020-09-23 03:00:00 "MADRUGADA"      CNN Brasil HD    577         
##  7 2020-09-23 03:00:00 "MADRUGADA"      Studio Universa~ 657         
##  8 2020-09-23 03:00:00 "MANH\xc3"       Globo HD         501         
##  9 2020-09-23 03:00:00 "MADRUGADA"      Telecine Premiu~ 661         
## 10 2020-09-23 03:00:00 "MADRUGADA"      BIS HD           620         
## # ... with 47,946 more rows, and 12 more variables: sgl_canal_tv <chr>,
## #   dsc_genero <chr>, dsc_segmentacao <chr>, dsc_nome_produto <chr>,
## #   dsc_perfil_produto <chr>, dsc_cidade <chr>, sgl_uf <chr>,
## #   qtd_dur_titulo_min <int>, qtd_dur_periodo_assistido <int>,
## #   qtd_num_serie_smart_card <int>, dat_criacao_registro <dttm>,
## #   data_dia_ref <int>

Qual cliente ficou mais tempo ao telefone à noite? #### Decrescente

  • A função desc() organiza os dados de uma forma descendente:
base_audiencia %>%
  arrange(desc(dat_ini_ts_conteudo_assistido))
## # A tibble: 47,956 x 16
##    dat_ini_ts_conteud~ dsc_periodo_ass~ dsc_nome_canal_~ num_canal_tv
##    <dttm>              <chr>            <chr>            <chr>       
##  1 2020-09-30 03:00:00 "MADRUGADA"      GloboNews HD     540         
##  2 2020-09-30 03:00:00 "TARDE"          Band             22          
##  3 2020-09-30 03:00:00 "TARDE"          CNN Brasil HD    577         
##  4 2020-09-30 03:00:00 "MANH\xc3"       TV Tribuna - Gl~ 18          
##  5 2020-09-30 03:00:00 "NOITE"          Record           19          
##  6 2020-09-30 03:00:00 "MADRUGADA"      TV Tribuna - Gl~ 518         
##  7 2020-09-30 03:00:00 "MADRUGADA"      TV Tribuna - Gl~ 518         
##  8 2020-09-30 03:00:00 "MANH\xc3"       TV Tribuna - Gl~ 518         
##  9 2020-09-30 03:00:00 "NOITE"          VTV - SBT HD     521         
## 10 2020-09-30 03:00:00 "MADRUGADA"      TV Tribuna - Gl~ 518         
## # ... with 47,946 more rows, and 12 more variables: sgl_canal_tv <chr>,
## #   dsc_genero <chr>, dsc_segmentacao <chr>, dsc_nome_produto <chr>,
## #   dsc_perfil_produto <chr>, dsc_cidade <chr>, sgl_uf <chr>,
## #   qtd_dur_titulo_min <int>, qtd_dur_periodo_assistido <int>,
## #   qtd_num_serie_smart_card <int>, dat_criacao_registro <dttm>,
## #   data_dia_ref <int>

–>

–>

Visualização

Introdução

As capacidades gráficas são uma componente muito importante e extremamente versátil do ambiente R. O R consegue plotar desde gráficos bidimensionais simples até graficos tridimensionais mais complexos por meio de comandos simples. Dá-se muita ênfase no R aos gráficos estatísticos, tais como histogramas, curvas de distribuições, gráfico de barras dentre outros.

Para a visualização de dados, usaremos o pacote ggplot2 da família tidyverse.

Gráficos de Análise Descritiva

Tipos de Gráficos

Apresentaremos agora três gráficos fundamentais na análise descritiva dos dados: histograma, gráfico de barras e gráfico de caixas. São reconhecidos no R pelos nomes hist, barplot e boxplot.

Scater Plot

O primeiro gráfico é útil quando queremos avaliar a relação entre duas variáveis numéricas.Assim, fazemos o scatter plot –>

exemplo: queremos avaliar a relação entre o período assitido e quantidade de pessoas:

con <- dbConnect(odbc::odbc(), .connection_string =c_string)

base_audiencia = dbGetQuery(con," SELECT * FROM [claroTreinamentos].[rtp_audience_meter] where qtd_num_serie_smart_card<1000")
library(ggplot2)

p <- ggplot(base_audiencia, aes(x = qtd_dur_periodo_assistido, y = qtd_num_serie_smart_card)) +
  geom_point()

p

Está feio? Vamos adicionar um título? Basta adicionar o parâmetros labs(title="seu título")

library(ggplot2)

library(ggplot2)

p <- ggplot(base_audiencia, aes(x = qtd_dur_periodo_assistido, y = qtd_num_serie_smart_card)) +
  geom_point()

p+labs(title="Relação Tempo e Audiência")

E se quisermos com cores por categoria?

exemplo: l Também queremos saber por sexo:

library(ggplot2)

base_audiencia$dsc_genero = as.factor(base_audiencia$dsc_genero)

p <- ggplot(base_audiencia, aes(x = qtd_dur_periodo_assistido, y = qtd_num_serie_smart_card,colour=dsc_genero)) +
  geom_point()

p+labs(title="Relação Tempo e Audiência")

Histograma

Um histograma divide uma série de dados em diferentes classes igualmente espaçadas e mostra a frequência de valores em cada classe. Em um gráfico, o histograma mostra diferentes barras, com bases iguais e amplitudes relativas às frequências dos dados em cada classe. O eixo das ordenadas, portanto, mostra a frequência relativa de cada classe e o eixo das abcissas os valores e intervalos das classes. Abaixo é apresentada a sintaxe do comando e um exemplo ilustrativo:

hist(base_audiencia$qtd_num_serie_smart_card)

library(ggplot2)
 
# dataset:


# basic histogram
p <- ggplot(base_audiencia, aes(x=qtd_num_serie_smart_card)) + 
  geom_histogram()

p+labs(title="Meu Histograma")

E se eu quiser aumentar o número de bins?

library(ggplot2)
p <- ggplot(base_audiencia, aes(x=qtd_num_serie_smart_card)) + 
  geom_histogram(bins = 100)

p+labs(title="Meu Histograma")

Barplot

Barplot é útil quando queremos avaliar a relação entre variáveis númericas e variáveis categórias. Ou quando queremos resumir a variável númerica entre as variáveis categorias:

Por exemplo, queremos saber a média da Sepal.Length por espécie de flor:

library(tidyverse)
library(ggplot2)

base_audiencia$dsc_periodo_assistido<-iconv(base_audiencia$dsc_periodo_assistido,"latin1","utf-8")

agrupa_audienciar= base_audiencia %>% group_by(dsc_periodo_assistido) %>%
  summarise(media=mean(qtd_num_serie_smart_card))



p <- ggplot(data = agrupa_audienciar, aes(x = dsc_periodo_assistido, y = media)) +
  geom_bar(stat = "identity")

Faltou informação? basta adicionar o parâmetro geom_text()

library(tidyverse)
library(ggplot2)

p <- ggplot(data = agrupa_audienciar, aes(x = dsc_periodo_assistido, y = media)) +
  geom_bar(stat = "identity")
p + geom_text(aes(label=media))

Okay, mas e se quisermos fazer um gráfico agrupado por categorias?

library(tidyverse)
library(ggplot2)


agrupa_audienciar= base_audiencia %>% group_by(dsc_periodo_assistido,dsc_genero) %>%
  summarise(media=mean(qtd_num_serie_smart_card))

p <- ggplot(data = agrupa_audienciar, aes(x = dsc_periodo_assistido, y = media,fill=dsc_genero)) + geom_bar(position = "dodge", stat="identity")
  geom_bar(stat = "identity")
## geom_bar: width = NULL, na.rm = FALSE, orientation = NA
## stat_identity: na.rm = FALSE
## position_stack
  p+labs(title="Relação Sexo e Perído")

Boxplot

O box-plot é uma visualização que permite o entendimento da distribuição por meio dos quartis. Esse gráfico é:

  • Uma caixa que é desenhada do primeiro quartil ao terceiro. Essa caixa representa 50% dos dados totais que estãoo mais próximos do centro das observações na amostra.

  • Uma linha no meio dessa caixa, representando a mediana (ou se preferir o segundo quartil).

  • Os 25% dos dados mais espaçados para cima e para baixo, são representados por uma linha pontilhada.

  • Existem duas linhas fora da caixa", elas representam o limite do que é considerado outlier. O pontos antes da primeira linha linha e depois da segunda são os valores considerados outliers.

    • A primeira linha é chamada de Limite Inferior= \(Q1 - 1,5IQR\)
    • A primeira linha é chamada de Limite Superior= \(Q3 + 1,5IQR\)
    • O \(IQR\) é o intervalo interquatil é se da por \(Q3- Q1\)
library(tidyverse)
library(ggplot2)



base_audiencia = base_audiencia %>%  filter(qtd_num_serie_smart_card<=10)

p <- ggplot(data = base_audiencia, aes(qtd_dur_periodo_assistido)) +geom_boxplot()
p 

Também é possível fazer por categoria:

library(tidyverse)
library(ggplot2)

p <- ggplot(data = base_audiencia, aes(qtd_dur_periodo_assistido,fill=dsc_genero)) +geom_boxplot()
p 

Pipeline Analytics

A maioria dos projetos de analytics começam com qual pergunta eu desejo responder?. Para isso, existe uam metodologia que é muito útil para:

  • verificar ser é fatível responder a pergunta
  • Encontrar o melhor modelo que responda
  • colocar em produção

Enquadramento

Essa é fase mais importante do projeto. É onde são definidos:

  • Pergunta a ser respondida
  • Enquadramento da evolução (inputs e outputs)
  • Fatores exógenos

Sanity check

Agora já temos maturidade para saber que a base de qualquer projeto em Analytics, são os dados, e desejamos:

Porém!!!!!

E por mais glamuroso que seja trabalhar:

  • trabalhar com dados
  • extrair insights
  • aplicar técnicas de machine learning

Sabemos que grande parte do esforço de uma trabalho com data science:

Então:

Assim, faz sentido se debruçar para conhecer o dado que vc está usando. Nessa etapa, é checado se a base de dados que recebemos possui as colunas e a quantidade de linhas esperadas. A gente também verifica se há observações faltantes (missing data) entre outros pontos.

Depois de carregar a base de dados (data frame), a gente precisa verificar como os dados estão. No mundo real as bases de dados são longas e possuem muitas variáveis. Assim sendo, não é possível visualizar e extrair informações apenas olhando para a tabela.

O Primeiro passo é a extração de pequenas asmostras. Para isso, basta usar a função a head() que retorna as seis primeiras observações do seu data frame:

con <- dbConnect(odbc::odbc(), .connection_string =c_string)

df = dbGetQuery(con," SELECT [dat_ini_ts_conteudo_assistido]
,[dsc_periodo_assistido]
,[dsc_nome_canal_tv]
,[num_canal_tv]
,[sgl_canal_tv]
,[dsc_genero]
,[dsc_segmentacao]
,[dsc_nome_produto]
,[dsc_perfil_produto]
,[qtd_dur_titulo_min]
,[qtd_dur_periodo_assistido]
,[qtd_num_serie_smart_card]
,[dat_criacao_registro]
,[data_dia_ref]
 FROM [claroTreinamentos].[rtp_audience_meter]")

Já a função tail() retorna as seis últimas observações do seu data frame:

df %>% 
  tail()
##       dat_ini_ts_conteudo_assistido dsc_periodo_assistido dsc_nome_canal_tv
## 47951           2020-09-23 03:00:00              MANH<c3>          Globo HD
## 47952           2020-09-23 03:00:00             MADRUGADA   Universal TV HD
## 47953           2020-09-23 03:00:00             MADRUGADA          Globo HD
## 47954           2020-09-23 03:00:00              MANH<c3>          Globo HD
## 47955           2020-09-23 03:00:00                 NOITE          Globo HD
## 47956           2020-09-23 03:00:00              MANH<c3>         Record HD
##       num_canal_tv sgl_canal_tv dsc_genero dsc_segmentacao dsc_nome_produto
## 47951          501      SPOGLHD   FEMININO    SEM SEGMENTO             <NA>
## 47952          630     SPOUNVHD      OUTRO           BLACK             <NA>
## 47953          501      SPOGLHD  MASCULINO       BLACK VIP             <NA>
## 47954          501      SPOGLHD   FEMININO           BLACK             <NA>
## 47955          501      SPOGLHD  MASCULINO           BLACK             <NA>
## 47956          519     SPORECHD   FEMININO    SEM SEGMENTO             <NA>
##       dsc_perfil_produto qtd_dur_titulo_min qtd_dur_periodo_assistido
## 47951               <NA>                 NA                       510
## 47952               <NA>                 NA                       284
## 47953               <NA>                 NA                      2040
## 47954               <NA>                 NA                       600
## 47955               <NA>                 NA                       603
## 47956               <NA>                 NA                       569
##       qtd_num_serie_smart_card dat_criacao_registro data_dia_ref
## 47951                        6  2020-10-17 18:47:11     20200923
## 47952                        4  2020-10-10 16:17:16     20200923
## 47953                        6  2020-10-10 16:17:16     20200923
## 47954                        3  2020-10-10 16:17:16     20200923
## 47955                        3  2020-10-10 16:17:16     20200923
## 47956                        3  2020-10-10 16:17:16     20200923

Por padrão, para executar um bom sanity check basta seguir o checklist:

  • Quais tabelas são necessárias para a construção do analise?
  • Qual a quantidade de linhas e colunas cada tabela possui?
  • Qual é a chave de cada tabela? A chave é única ou existe duplicidade?
  • Qual o percentual de missing data por coluna?
  • Quais são as estatísticas descritivas de cada coluna numérica (mínimo, máximo, média, mediana)?
  • Quais são as categorias que mais aparecem e quanto aparecem? Existe alguma categoria dominante nas colunas - categóricas?
  • Na tabelas temporais como está o comportamento ?

Exercício

Faça um sanity preliminar na base do [claroTreinamentos].[rtp_audience_meter].

DataExplorer

Para um sanity check mais completo e visualmente mais bonito, o R possui um pacote, que com poucas linhas de comando, a gente consegue produzir relatórios estatístico muito interessante. Esse pacote se chama DataExplorer e vamos carregá-lo agora:

library(DataExplorer)

Sumário da base de dados - Tabela

Um dos primeiros passos que a gente faz ao receber uma base de dados é conferir quantas colunas e linhas a base possui. A gente consegue essas informações e outras com o próximo comando do pacote DataExplorer:

introduce(df)
##    rows columns discrete_columns continuous_columns all_missing_columns
## 1 47956      14               10                  3                   1
##   total_missing_values complete_rows total_observations memory_usage
## 1                88598             0             671384      4818144

Sumário da base de dados - Gráfico

Caso você queria gerar um gráfico com as informações da tabela produzida pelo comando anterior (introduce), basta usar o seguinte comando:

plot_intro(df)

Análise dados Faltantes

O próximo comando (plot_missing) lista a quantidade de observações que estão faltando em cada coluna:

plot_missing(df)

Análise das variáveis categóricas

Outro comando bastante útil é o plot_bar. Ele serve para analisarmos como as variáveis categóricas se comportam. Bastante rodar o seguinte comando, que o R produz os gráficos automaticamente:

df_beta= df %>%  select(-("dat_ini_ts_conteudo_assistido"))

plot_bar(df_beta)
## 5 columns ignored with more than 50 categories.
## dsc_nome_canal_tv: 228 categories
## num_canal_tv: 137 categories
## sgl_canal_tv: 1519 categories
## dsc_nome_produto: 882 categories
## dsc_perfil_produto: 290 categories

Análise das variáveis Numéricas

Já para analisarmos as variáveis numéricas, nós utilizamos o comando plot_histogram na base de dados:

plot_histogram(df)

Relacionamento entre as variáveis

Para fazermos a matriz de correlação basta usar a função plot_correlation.:

plot_correlation(df,type = "all")
## 6 features with more than 20 categories ignored!
## dsc_nome_canal_tv: 228 categories
## num_canal_tv: 137 categories
## sgl_canal_tv: 1519 categories
## dsc_nome_produto: 882 categories
## dsc_perfil_produto: 290 categories
## dat_criacao_registro: 35 categories

Relatório completo da base de dados

O próximo comando é um dos mais relevantes, pois com apenas uma linha de comando a gente consegue criar um relatório com os principais análises descritivas e estatísticas da base de dados:

create_report(df)

Exercício individual

  1. Carregar a base de dados: [claroTreinamentos].[rtp_audience_meter].
  2. Verificar se há outliers ou dados faltantes (missing data).
  3. O que podemos fazer com os dados faltantes?
  4. Quantos aos outliers, a gente retira da base de dados ou eles fazem sentido em termos de negócio?
  5. Elabore um relatório estáticos da base de dados (DataExplorer).
  6. Alguma informação do relatório te chamou atenção?
  7. As variáveis apresentaram valores que você esperava?