Carregando os dados e pacotes que serão usados nos exemplos da aula:
options(Encoding="UTF-8")
library(gmodels)
dados_exp_vida = read.csv("../data/life_expectancy.csv") # dados sobre expecativa de vida em 197 países
dados_homicidios = read.csv("../data/homicidios_cidade.csv",header=F) # dados sobre as 50 cidades mais violentas por número de homcídio. Fonte: http://glo.bo/1nuIQuK
dados_bancarios = read.csv("../data/dados_bancarios.csv",header=T) # Fonte: http://superdatascience.com/training/
dados_salario = read.csv("../data/salario_barcelona.csv",header=F) #Dados sobre salário semanal dos jogadores do Barcelona 2015-2016 em libras esterlinas.
dados_notas = read.csv("../data/dados_notas.csv") #Notas de alunos de uma turma passada do DME dada a alunos de computa????o.
Uma boa forma de começar a olhar os dados de variáveis quantitativas (ou numéricas) é usar um Scatter Plot (gráfico de dispersão). Abaixo plotamos os dados de notas de uma disciplina do DME dada a alunos de computação:
plot(dados_notas$Aluno,dados_notas$Notas,xlab="Aluno",ylab="Nota")
plot(dados_notas$Aluno,sort(dados_notas$Notas),xlab="Aluno",ylab="Nota") #ordenado por notas
Abaixo plotamos o Boxplot e mostramos o sumário de 5 número dos dados.
boxplot(dados_notas$Notas,ylab="Notas")
summary(dados_notas$Notas)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.092 3.875 3.880 6.265 8.780
A chamada padrão da função boxplot já calcula automaticamente possíveis outliers como mostrado no Boxplot de salários dos jogadores do Barcelona abaixo.
boxplot(dados_salario$V2,ylab="Salários Semanais")
Atribuindo a parte numérica dos dados (expectativa de vida em anos) à variável life_exp:
life_exp = dados_exp_vida[,2]
Quando os dados são quantitativos, um histograma pode dizer muito sobre a distribuição desses dados. O eixo x é composto por intervalos de valores (também chamados de bins) e o eixo y contém a quantidade de valores que caem dentro de cada intervalo. O tamanho do intervalo é configurável e pode mudar a forma da distribuição. O código abaixo gera o histograma para os dados sobre expectativa de vida. Note que o parâmetro breaks especifica o número de bins que desejamos para o histograma.
hist(life_exp,breaks=10, xlab = "Expectativa de Vida (anos)",main = "Histograma de Expectativa de Vida",ylab = "Frequencia")
Abaixo geramos três histogramas como ilustração de distribuições enviesadas para a esquerda, direita e simétricas.
left = rbeta(10000,5,2)
right = rbeta(1000,2,5)
center = rbeta(10000,5,5)
hist(left,main="Dist. Enviesada Esquerda",xlab='',ylab='',prob=T)
lines(density(left,bw=0.05),col='red',lwd=3)
hist(right,main="Dist. Enviesada Direita",xlab='',ylab='',prob=T)
lines(density(right,bw=0.05),col='red',lwd=3)
hist(center,main="Dist. Sim??trica",xlab='',ylab='',prob=T)
lines(density(center,bw=0.05),col='red',lwd=3)
Abaixo geramos o Boxplot (horizontal) dos dados de expectativa de vida que nos ajuda a verificar que a distribuição é enviesada para a esquerda.
boxplot(life_exp,horizontal = T,range=0,xlab="Expectativa de Vida (anos)")
O sumário da distribuição mostra isso mais claramente. Note que a distância do primeiro quartil à mediana é menor que a distância da mediana ao terceiro quartil. Também note que a média possui um valor diferente da mediana.
summary(life_exp)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 47.79 61.52 72.48 68.91 76.74 83.39
Para calcular a média, variância e desvio padrão de uma variável quantitativa basta chamar as funções mean, var e sd respectivamente como no exemplo abaixo.
mean(dados_salario$V2)
## [1] 78351.85
var(dados_salario$V2)
## [1] 3823573362
sd(dados_salario$V2)
## [1] 61835.05
Nesse exemplo vamos criar um gráfico de barras para visualizar a quantidade de cidades, do ranking das 50 cidades mais violentas (http://glo.bo/1nuIQuK), por país. Abaixo o código para atribuir a coluna país à variável pais.
pais = dados_homicidios[,2]
A função table() conta o número de ocorrências de cada país nos dados.
counts = table(pais)
A função barplot() abaixo gera o gráfico de barras (por frequencia absoluta e relativa).
barplot(counts, col=rainbow(10),legend.text = rownames(counts))
relfreq = counts/sum(counts)
barplot(relfreq, col=rainbow(10),legend.text = rownames(relfreq))
Aqui vamos comparar as distribuições de homicídios considerando Brasil, Venezuela e México.
colnames(dados_homicidios) = c("Cidade", "Pais", "Homicidios")
attach(dados_homicidios)
homicidios_pais = split(dados_homicidios,Pais)
Brasil = homicidios_pais$Brasil
Venezuela = homicidios_pais$Venezuela
Mexico = homicidios_pais$Mexico
boxplot(Brasil$Homicidios, Venezuela$Homicidios, Mexico$Homicidios, names=c("Brasil","Venezuela", "México"))
O código abaixo mostra como gerar as tabelas de contagem absoluta e relativa de cada variável, ou seja, da variável Gender (Sexo) e da variável Exited que indica se o cliente permaneceu (Stayed) ou deixou o banco (Exited).
dados_bancarios$Gender = factor(dados_bancarios$Gender, levels = c("Male","Female"))
dados_bancarios$Exited = factor(dados_bancarios$Exited, levels = c('0','1'), labels = c("Stayed", "Exited"))
freqGender = table(dados_bancarios$Gender)
freqExited = table(dados_bancarios$Exited)
relfreqGender = freqGender/nrow(dados_bancarios)
relfreqExited = freqExited/nrow(dados_bancarios)
cbind(freqGender,relfreqGender)
## freqGender relfreqGender
## Male 5457 0.5457
## Female 4543 0.4543
cbind(freqExited,relfreqExited)
## freqExited relfreqExited
## Stayed 7963 0.7963
## Exited 2037 0.2037
Para criar a tabela de contingência chamamos a função CrossTable() do pacote gmodels.
joint = CrossTable(dados_bancarios$Exited,dados_bancarios$Gender,chisq = F)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 10000
##
##
## | dados_bancarios$Gender
## dados_bancarios$Exited | Male | Female | Row Total |
## -----------------------|-----------|-----------|-----------|
## Stayed | 4559 | 3404 | 7963 |
## | 10.499 | 12.611 | |
## | 0.573 | 0.427 | 0.796 |
## | 0.835 | 0.749 | |
## | 0.456 | 0.340 | |
## -----------------------|-----------|-----------|-----------|
## Exited | 898 | 1139 | 2037 |
## | 41.041 | 49.298 | |
## | 0.441 | 0.559 | 0.204 |
## | 0.165 | 0.251 | |
## | 0.090 | 0.114 | |
## -----------------------|-----------|-----------|-----------|
## Column Total | 5457 | 4543 | 10000 |
## | 0.546 | 0.454 | |
## -----------------------|-----------|-----------|-----------|
##
##
joint
## $t
## y
## x Male Female
## Stayed 4559 3404
## Exited 898 1139
##
## $prop.row
## y
## x Male Female
## Stayed 0.5725229 0.4274771
## Exited 0.4408444 0.5591556
##
## $prop.col
## y
## x Male Female
## Stayed 0.8354407 0.7492846
## Exited 0.1645593 0.2507154
##
## $prop.tbl
## y
## x Male Female
## Stayed 0.4559 0.3404
## Exited 0.0898 0.1139
Chamando a variável \(joint\) temos acesso a várias tabelas de contingência, incluindo tabelas contendo os valores aboslutos e relativos, tais como as distriuições condicionais. O atributo t nos dá a tabela de contingência com os valores absolutos que podemos usar para plotar os gráficos de barra lado a lado e empilhados.
joint_counts = joint$t
barplot(joint_counts,beside=T,col=rainbow(2),ylab='Frequencia',xlab='Sexo')
legend('topright',c('Saiu','Ficou'),pch=15,col=rainbow(2))
barplot(joint_counts,beside=F,col=rainbow(2),ylab='Frequencia',xlab='Sexo')
legend('topright',c('Saiu','Ficou'),pch=15,col=rainbow(2))
Para acessar a distribuição condicional de Exited dado Gender, acessamos o atributo prop.col de joint. A partir disso podemos plotar o gráfico de barras agora com a distribuição condicional.
Exited_given_Gender = joint$prop.col
barplot(Exited_given_Gender, col=rainbow(2), ylab='Propor????o de clientes que sa??ram e ficaram para cada Sexo',xlab='Sexo')
Além de plotar um Scatter Plot para verificar visualmente se há alguma correlação entre as variáveis, podemos chamar a função cor como no exemplo abaixo que mede o grau de correlação linear entre expectativa de vida e PIB.
PIB = dados_exp_vida[,3]
plot(PIB,life_exp,xlab="PIB",ylab="Expectativa de Vida")
cor(PIB,life_exp)
## [1] 0.6350906