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:
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.
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.
Neste curso faremos uso da versão mais recente do R, para instalá-la siga os passos:
Neste curso além do R faremos uso do RStudio, para instalá-lo basta:
Free
Além de acessar o R e Rsudio em sua máquina, é possível acessá-lo via Azure Notebook
Portal Azure
, acesse seu Painel de Recursos
e Selecione:RStudio
4. Aprecie sem moderação!
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:
help()
.
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
:
Para salvar um script escrito, basta seguir o caminho: File >> Save As...
:
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
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
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:
&
ou &&
.|
ou ||
.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
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:
Exemplo:
(a=3)
## [1] 3
Exemplo:
a=3
a
## [1] 3
_
entre palavrasBom:
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
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!
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
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"
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 transformadoformat
: 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É 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 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.
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:
No R para criar um vetor basta usar a função c()
:
Exemplo: Crie um vetor chamado nomes
que contenha:
nomes=c("Anna","Paula","Roberta","Ingrid","Fernanda","João")
nomes
## [1] "Anna" "Paula" "Roberta" "Ingrid" "Fernanda" "João"
É comum, trabalhar com um ou mais elementos específicos de um vetor, para acessa-los é necessário conhecer a indexação:
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
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
Agora vamos supor que você é um professor e no primeiro dia de aula tem a lista com o nome dos alunos:
Mas no segundo dia surgiram mais 5 alunos:
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çã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 |
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?
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
A indexação dos valores de uma data frame é parecida com a indexação dos vetores, sendo que com duas dimensões:
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
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"
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
É 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"
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 |
Leia o arquivo dados_frame.txt
e baseado em suas informações crie uma tabela, chamada de tabela_pessoas
e responda as questões
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:
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
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)
.
)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
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
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")
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.
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 salvofile
: diretório + nome do arquivo a ser salvoquotes
: 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 linhascol.names
: Booleano, TRUE ou FALSE, significa se o arquivo salvo terá ou não nome nas colunasappend
- Booleano, TRUE ou FALSE, decide se a tabela será anexada a um arquivo já existente ou nãosep
: Character, informa qual será o separador das colunasdec
: Character, decide qual será o separador número decimalExemplo: 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")
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")
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")
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.xlsxfile
: nome do arquivosheetName
: Nome da aba do arquivo a ser salvorow.names
: Booleano, TRUE ou FALSE, significa se o arquivo salvo terá ou não nome nas linhascol.names
: Booleano, TRUE ou FALSE, significa se o arquivo salvo terá ou não nome nas colunasExemplo: 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)
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:
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;...
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:
tibble
, com a finalidade de economisar memória;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...
%>%
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çãofuncao
: Função a ser aplicadaAtalho 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()
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.
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:
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
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.
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)
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
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))
arrange()
: Ordena o banco de dados, incluindo ordem alfabética e numéricaQual cliente ficou menos tempo ao telefone à noite?
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
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>
–>
–>
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
.
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.
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")
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 é ú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")
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
.
Limite Inferior
= \(Q1 - 1,5IQR\)Limite Superior
= \(Q3 + 1,5IQR\)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
A maioria dos projetos de analytics começam com qual pergunta eu desejo responder?
. Para isso, existe uam metodologia que é muito útil para:
Essa é fase mais importante do projeto. É onde são definidos:
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:
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:
Faça um sanity preliminar na base do [claroTreinamentos].[rtp_audience_meter]
.
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)
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
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)
O próximo comando (plot_missing
) lista a quantidade de observações que estão faltando em cada coluna:
plot_missing(df)
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
Já para analisarmos as variáveis numéricas, nós utilizamos o comando plot_histogram
na base de dados:
plot_histogram(df)
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
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)
[claroTreinamentos].[rtp_audience_meter]
.