Lista de Exerícios 12 - R Visualização de Dados

# Primeiro carrega-se os pacotes necessários para a manipulaçao dos dados e geração de gráficos

library(tidyverse) # Manipulação de dataframes
library(plotly)    # Gráficos intereativos
library(Hmisc)     # Criação de intervalos de variáveis quantitativas
library(RColorBrewer) # Cores diversas

Questão 01

# Definindo os dados
MRT_1F <-c(517.1468515630205, 85.13094142168089, 30.333207896694553, 12.694776264558937, 3.3041601673945418, 1.1823111717498882, 1.1892293502386786)

MRT_3F <-c(156.68929936163462, 11.540837783562276, 0.4512835621696538, 0.4509797929766453, 0.4502068233039181, 0.4496185276300172, 0.4543157082191288)

MRT_5F <-c(83.90319666471157, 0.3068151086494968, 0.30522314133037304, 0.3072588968084928, 0.30655265997285697, 0.3055812715727718, 0.3053297166713006)

MRT_10F <-c(29.55430642951759, 0.19832832665772515, 0.1971923924717474, 0.19796648905716516, 0.19615594370806338, 0.2034569237883263, 0.19617420889447737)

MRT_15F <-c(11.317736530583566, 0.167364215666193, 0.16172168266811013, 0.16701085329580515, 0.1598052657153692, 0.1645934043532696, 0.16216563797118075)

MRT_sem_F <-c(11.93430909937736, 0.6095414637034009, 0.6060645101029295, 0.612167181646899, 0.6146761002685637, 0.6096747087200697, 0.6125810476877268)

clock <- c(0.1, 0.5, 1, 1.5, 2, 2.5, 3)

Gráfico 01

# Criando os vetores de formação do gráfico
opts <- c(4, 11, 1, 2, 5, 4)
fogs <- c('1 Fog', '3 Fogs', '5 Fogs', '10 Fogs', '15 Fogs', 'w/o Fog')
cores <- c('black', 'yellow','red','blue','purple','green')

# Criarei uma lista onde cada elemento é um vetor dos dados. O objetivo desta lista
# É fazer um loop por ela para gerar todos os gráficos em um loop for.
dados = list(MRT_1F, MRT_3F, MRT_5F, MRT_10F, MRT_15F, MRT_sem_F)

# Plotando a base plot de linhas
plot(x=clock, y=dados[[1]], pch=opts[1], type='o',
     xlab='Time between Things requests (seconds)',
     ylab='Response Time (seconds)')

# Agora adiciono cada um dos plots.
for (i in 1:length(dados)){
  lines(x=clock, y=dados[[i]], pch=opts[i], type='o',
       col=cores[i])
}

# Por fim, adiciono a legenda.
legend('topright', pch=opts, col=cores, legend=fogs)

Gráfico 02

# Agora irei plotar um conjunto de barplots.
# Cada gráfico será um barplot que compara o tempo de resposta entre n fogs e nenhum fog.

# Irei adicionar os valores à uma matriz, de forma que todos os valores de uma observação estejam na mesma linha

valores <- matrix(c(MRT_1F, MRT_3F, MRT_5F, MRT_10F, MRT_15F, MRT_sem_F),
                  nrow=6, ncol=7, byrow=TRUE)
valores
##           [,1]       [,2]       [,3]       [,4]      [,5]      [,6]      [,7]
## [1,] 517.14685 85.1309414 30.3332079 12.6947763 3.3041602 1.1823112 1.1892294
## [2,] 156.68930 11.5408378  0.4512836  0.4509798 0.4502068 0.4496185 0.4543157
## [3,]  83.90320  0.3068151  0.3052231  0.3072589 0.3065527 0.3055813 0.3053297
## [4,]  29.55431  0.1983283  0.1971924  0.1979665 0.1961559 0.2034569 0.1961742
## [5,]  11.31774  0.1673642  0.1617217  0.1670109 0.1598053 0.1645934 0.1621656
## [6,]  11.93431  0.6095415  0.6060645  0.6121672 0.6146761 0.6096747 0.6125810
# Os gráficos devem ser comparações, aos pares, entre as quantidades de fogs.
# Dessa forma, serão n-1 gráficos, onde n é quantidade de categorias. Ou seja, 5 gráficos.
# Criando o layout 3x2 gráficos
par(mfrow=c(3,2))

# O loop a seguir percorre a matriz valores, plotando a linha i com a linha 6, que é a vetor "sem fog"
for (i in 1:(length(dados)-1)){
  barplot(height=valores[c(6,i),],
          log='y',
        xlab='Time between Things requests (seconds)',
        ylab='Response Time (seconds)',
        col=c('#E6E6E6','#666666'),
        names.arg=as.character(clock),
        beside=TRUE,
        )
  legend('topright', col=c('#E6E6E6','#666666'),
       legend=fogs[c(6,i)], pch=c(15,15))
}

Questão 02

# Primeiro cria-se os vetores com os dados
columnnames <- c('$10-19 (%)', '$20-29 (%)', '$30-39 (%)', '$40-49 (%)')
valores <- matrix(c(53.8, 33.9, 2.6, 0.0, 43.6, 54.2, 60.5, 21.4, 2.6, 11.9, 36.8, 78.6),
                  nrow=3, ncol=4, byrow=TRUE)
quality <- c('Good', 'very Good', 'Excellent')
df <- data.frame(Quality_Rate=quality, valores)
names(df)[-1] <- columnnames
df
##   Quality_Rate $10-19 (%) $20-29 (%) $30-39 (%) $40-49 (%)
## 1         Good       53.8       33.9        2.6        0.0
## 2    very Good       43.6       54.2       60.5       21.4
## 3    Excellent        2.6       11.9       36.8       78.6
# Gerando o barplot
barplot(height=valores,
        names.arg=columnnames,
        ylab='Meal Price',
        main='Qualidade de refeições em restaurantes',
        col=c('red', 'blue', 'green'),
        xlim=c(0, 6))

# Adicionando a legenda
legend('topright', legend=quality,
       col=c('red', 'blue', 'green'),
       pch=c(15,15,15))

Questão 03

# Para plotar as temperaturas de acordo com a escala utilizada no Brasil
# é necessário realizar a transformação de Fahrenheit para Celsius.
# Para isso, pode-se utilizar a função "mutate" do pacote tidyr, onde a nova coluna "Temperatura"
# irá conter os novos valores de temepratura em graus Celsius.
df <- mutate(airquality, Temperatura=(airquality$Temp-32)/1.8)

# Agora filtra-se o dataframe para apenas o mês de Maio.
df <- filter(df, Month==5)

# Então plota-se o histograma.
# Histograma de frequências:
hist(df$Temperatura,
     main='Distribuição das temperaturas no mês de Maio',
     xlab='Temperatura',
     ylab='Frequência',
     col='steelblue',
     probability=F,
     xlim=c(7,30))

# E o histograma de densidades de probabilidades:
hist(df$Temperatura,
     main='Distribuição das temperaturas no mês de Maio',
     xlab='Temperatura',
     ylab='Densidade de Probabilidade',
     col='steelblue',
     probability=T,
     xlim=c(7,30))
lines(density(df$Temperatura))

Questão 04

# Primeiro realiza-se a importação dos dados da web, utilizando a função read.table:
sales <- read.table("https://training-course-material.com/images/8/8f/Sales.txt",header=TRUE)
sales
##   COUNTRY SALES
## 1      US   340
## 2      UK   290
## 3  France   510
## 4  Poland   820
## 5   Japan   120
## 6   China   780
# Para mostrar a participação, em porcentagem, de cada país nas vendas é necessário criar 
# um vetor com essas porcentagens:
percentage <- round(sales$SALES/sum(sales$SALES)*100)

# Agora adiciona-se o simbolo " % " a cada um dos valores:
labls <- paste(percentage, '%', sep='')

# Por fim, gera-se o gráfico de Pizza através da função pie,
# Passando o vetor de porcentagens como "labels" e a legenda é composta pela própria coluna
# COUNTRY do dataframe.
pie(sales$SALES,
    labels=labls,
    main='Porcentagem de Vendas por País',
    col=brewer.pal(n = 6, name = 'Spectral'))
legend('topright', legend=sales$COUNTRY,
      fil=brewer.pal(n = 6, name = 'Spectral'))

Questão 05

# Renomeando o dataframe para 'df' para simplificar
df <- InsectSprays

# Criando o boxplot, onde a variável numérica é a quantidade de insetos
# e a variável categórica de comparação é o tipo do spray utilizado.
boxplot(count ~ spray, data=df,
        main='Quantidade de insetos tratados por inseticida',
        xlab='Inseticida',
        ylab='Quantidade',
        outline=F, # Não mostra os outliers, mas eles continuam no dataset.
        col='yellow')

View(m01) View(m05)

Questão 06

setwd('D:/michel/Universidade/Mestrado/disciplina/repo/data')
none <- read.csv('D:/michel/Universidade/Mestrado/disciplina/repo/data/monitoringCloudData_NONE.csv')
m01 <- read.csv('D:/michel/Universidade/Mestrado/disciplina/repo/data/monitoringCloudData_0.1.csv')
m05 <- read.csv('D:/michel/Universidade/Mestrado/disciplina/repo/data/monitoringCloudData_0.5.csv')
m1 <- read.csv('D:/michel/Universidade/Mestrado/disciplina/repo/data/monitoringCloudData_1.csv')

datasets <- list(none, m01, m05, m1)
names <- list('(None Workload)', '(Workload of 0.1)', '(Workload of 0.5)', '(Workload of 1.0)')

# Criando uma função que transforma valores em GB para MB
gbToMB <- function(mem){
  if (grepl(pattern='GB', x=mem)==T){
    return (parse_number(mem)*1024)
  } else{
    return (parse_number(mem))
  }
}

#layout(matrix(c(1,2,3,4), nrow=2, byrow=T))
par(mfrow=c(2,2))
for (i in 1:length(datasets)){
  
  # Extraindo os números da coluna usedMemory
  datasets[[i]]$Memoria <- sapply(X=datasets[[i]]$usedMemory, FUN=gbToMB)

  # Transformando o tempo em uma diferença entre o tempo i e o tempo inicial
  tempos <- vector()
  for (j in 1:nrow(datasets[[i]])){
    tempos[j] <- (difftime(datasets[[i]]$currentTime[j], datasets[[i]]$currentTime[1], units=c('secs')))/3600
  }
  datasets[[i]]$tempo <- tempos

  # Plotando o resultado:
  plot(datasets[[i]]$tempo, datasets[[i]]$Memoria, type='l',
       main=paste('Memory Analysis', names[[i]], sep=' '),
       xlab='Time (hour)',
       ylab='Used Memory (MB)')
}

Questão 07

# Lendo o arquivo CSV
movies <- read.csv('D:/michel/Universidade/Mestrado/disciplina/repo/data/netflix_titles.csv')

# Para filtrar em apenas 1 país de origem, utilizarei a função "grepl" com o pattern=',',
# Assim, se houver uma, vírgula em determinada linha, na coluna "country", a linha nao será selecionada.
movies <- movies[!grepl(pattern=',', x=movies$country),]

# Para saber a quantidade de conteudos por país usarei o group_by country.
by_country <- movies %>%
  group_by(country) %>%
  summarise(conteudos=n())

# E então, ordenar o dataframe de forma decrescente com a quantidade de conteúdos
# e selecionar os 10 maiores produtores.
by_country <-  head(arrange(by_country,desc(conteudos)), 10)

# Então tem-se o gráfico de pizza.
plot_ly(by_country,
        type='pie',
        labels=~country,
        values=~conteudos)

Perceba que há um país sem nome. Na verdade talvez sejam vários paises cujo nome não foi digitado na base de dados. Dessa forma, vou refazer o mesmo processo porém removendo as linhas nas quais o nome do páis não esteja escrito corretamente.

movies <- read.csv('D:/michel/Universidade/Mestrado/disciplina/repo/data/netflix_titles.csv')
movies <- movies[nchar(movies$country)!=0,] # Selecionando as linhas cujos paises possem mais de 0 caracteres
movies <- movies[!grepl(pattern=',', x=movies$country),]

by_country <- movies %>%
  group_by(country) %>%
  summarise(conteudos=n())


# E então, ordenar o dataframe de forma decrescente com a quantidade de conteúdos
# e selecionar os 10 maiores produtores.
by_country <-  head(arrange(by_country,desc(conteudos)), 10)

# Então tem-se o gráfico de pizza.
plot_ly(by_country,
        type='pie',
        labels=~country,
        values=~conteudos)

Questão 08

# Para criar uma tabela utilizando o pacote potly usa-se o type "table"
plot_ly(type = 'table',
        columnwidth = c(10, 10), # Largura de cada coluna
        columnorder = c(0, 1), # Ordem das colunas
        header = list(
          values = c("País","Total de conteúdos"), # Vetor com os nomes das colunas
          align = c("center", "center"), # Alinhamento Cetral
          line = list(width = 1.5, color = 'black'), # Formatação das linhas do cabeçário
          fill = list(color='#505050'), # Cor de fundo do cabeçário
          font = list(family = "Arial", size = 12, color = c("white")) # Formatação da fonte do cabeçário
          ),
cells = list( # Construção das células de valores
  values = rbind(by_country$country,by_country$conteudos), # Vetor ordenado com os valores de cada coluna
  align = c("center", "center"),
  line = list(width = 1.5, color = 'black'),
  font = list(family = "Arial", size = 12, color = c("black"))
  )
)

Questão 09

movies <- read.csv('D:/michel/Universidade/Mestrado/disciplina/repo/data/netflix_titles.csv')

# Primeiro é necessário criar intervalos para os anos (categorizar a variavel discreta release_year)
# Isto pode ser feito através da função 'cut2', do pacote "Hmisc". Esta função recebe
# Um vetor numérico e uma sequência de pontos nas quais deseja-se separá-lo e retorna uma variável
# Do tipo Fator.
movies$decadas <- as.character(cut2(x=movies$release_year, cuts=seq(1940, 2020, 10)))

# Como não se deseja mostrar o intervalo no eixo x, usarei a função sapply juntamente com a função parse_number
# Para extrair apenas o limite inferior do intervalo
movies <- movies %>%
  mutate(decadas=unlist(str_extract(string=decadas, pattern='\\d{4},'))) %>%
  mutate(decadas=as.numeric(unlist(str_extract(string=decadas, pattern='\\d*'))))

# Agora é necessário fazer os agrupamentos em relação à decada e ao tipo, juntamente com contagem 
# Das ocorrências em cada um desses grupos:
grouped_decade <- movies %>%
  group_by(decadas, type) %>%
  summarise(total=n()) %>%
  filter(decadas!=1950, decadas!=1925)

# Aqui é feita a separação entre os dados "y", para o tipo Movie e para o tipo TV Show
trace_1 <- filter(grouped_decade, type=='Movie')$total
trace_2 <- filter(grouped_decade, type!='Movie')$total

# Criando o gráfico em branco
fig <- plot_ly(data=grouped_decade,
        x=~unique(decadas))

# Adicionando a linha para TV Show
fig <- fig %>% add_trace(
  y=~trace_1,
   name='TV Show',
  type='scatter',
   mode='lines+markers')

# Adicionando a linha para Movie
fig <- fig %>% add_trace(
  y=~trace_2,
   name='Movie',
  type='scatter',
   mode='lines+markers')

# Alterando os título dos eixos
fig <- fig %>% layout(xaxis=list(title='Década'),
                      yaxis=list(title='Qnd. Conteúdo'))


# Por fim, plotando o gráfico de linhas.    
fig

Questão 10

movies <- read.csv('D:/michel/Universidade/Mestrado/disciplina/repo/data/netflix_titles.csv')

# Primeiro, criarei uma coluna com apenas o primeiro gênero atribuído ao conteúdo
movies$Genero <- sapply(X=movies$listed_in, FUN=function(x){unlist(strsplit(x, split=','))[1]})

# Agora seleciona-se apenas os gêneros de drama, comédia e ação e aventura e ano de lançamento entre 2000 e 2010
# Logo em seguida faz-se um agrupamento de acordo com as colunas "release_year" e "Genero",
# Com o objetivo de realizar a contagem por grupos
movies <- movies %>%
  filter((Genero=='Dramas' | Genero=='Action & Adventure' | Genero=='Comedies') & (release_year > 2000 & release_year < 2010)) %>%
  group_by(release_year, Genero) %>%
  summarise(quantidade=n())


# Agora plota-se o gráfico.
# Criando a "base" do barplot
fig <- plot_ly(data = movies,
               x=~unique(release_year)
)

# Adicionando o primeiro genero (Drama)
fig <- fig %>%
  add_trace(y=~filter(movies,Genero=='Dramas')$quantidade,
            type='bar',
            name='Drama')

# Adicionando o genero Ação e Aventura
fig <- fig %>%
  add_trace(y=~filter(movies,Genero=='Action & Adventure')$quantidade,
            type='bar',
            name='Ação e Aventura')

# Adicionando o genero Comédia
fig <- fig %>%
  add_trace(y=~filter(movies,Genero=='Comedies')$quantidade,
            type='bar',
            name='Comédia')

# Por fim, altera-se os títulos dos eixos.
fig <- fig %>%
  layout(xaxis=list(title='Ano de Lançamento'),
         yaxis=list(title='Qnt. de lançamentos'))

# Plota-se o gráfico:
fig