# Importanto as bibliotecas necessários
library(tidyverse)
library(RColorBrewer)
library(twitteR)
library(syuzhet)
library(wordcloud)
library(tm)
library(MASS)

Questões

VADeaths

Vamos carregar os dados nativos do R em uma variável chamada data.

data <- VADeaths
str(data)
##  num [1:5, 1:4] 11.7 18.1 26.9 41 66 8.7 11.7 20.3 30.9 54.3 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:5] "50-54" "55-59" "60-64" "65-69" ...
##   ..$ : chr [1:4] "Rural Male" "Rural Female" "Urban Male" "Urban Female"

Vamos transformar em uma matriz e transpor-la, assim fica mais fácil de fazer o parplot.

matriz <- as.matrix(data, nrow=4)
matriz <- t(matriz)

Agora plotamos o gráfico de barras, onde o eixo x mostra as faixas etárias, o eixo y as taxas de morte, e a legenda separa os grupos.

barplot(height=matriz,
        beside=T,
        #names.arg=unique(df$Age),
        main='Taxas de morte no estado da Virginia',
        xlab='Idade',
        col=brewer.pal(4, 'Dark2'),
        #col=c('red', 'blue', 'green', 'purple'),
        ylab='Taxa de mortalidade (%)',
        xlim=c(0,30),
        ylim=c(0,80))

legend('topleft', legend=rownames(matriz), col=brewer.pal(4, 'Dark2'),
       pch=c(15,15,15,15))

Perceba que a maior taxa de mortalidade, em todas as faixas etárias, é para homens, seja no meio urbano ou rural.

ClassificaçãoDoença

Estado <- c('moderado', 'leve', 'leve', 'severo', 'leve', 
            'moderado', 'moderado', 'moderado', 'leve',
            'leve', 'severo', 'leve', 'moderado', 'moderado', 'leve',
            'severo', 'moderado', 'moderado', 'moderado', 'leve')

Primeiro vamos criar um dataframe com os dados. Será necessário, antes, calcular a frequência de cada ocorrência dos estados. Uma forma de fazer isto é através da função table().

df2 <- table(Estado)
df2 <- data.frame(df2)

Vamos também criar um dataframe com as frequências relativas de cada ocorrência. Isto será necessário para adicionar a porcentagem à cada fatia da pizza.

proporcoes <- data.frame(prop.table(table(Estado)))

#Agora vamos formatar os valores das frequências relativas
proporcoes$Freq <- paste(proporcoes$Freq*100, '%', sep='')

Agora estamos prontos para criar nosso gráfico de pizza.

# Ajustando as margens para caber a legenda.
par(mar=c(2,0,2,2))

pie(x=df2$Freq,
    labels=proporcoes$Freq,
    col=brewer.pal(n=3, name='Spectral'),
    xlim=c(0, 20),
    main='Estágios da doença nos paciêntes',
    cex=1,
    radius=0.7)


# Para adicionar a legenda, usamos o mesmo dataframe df2
legend('topleft', legend=unique(df2$Estado),
       fill=brewer.pal(n=3, name='Spectral'),
       x=.6, y=1)

Twitters

Para esta questão será necessário utilizar o pacote twitteR, que possui uma API do Twitter para coletar dados da rede social.

setup_twitter_oauth(api_key, api_secret, token, token_secret)
## [1] "Using direct authentication"
tweets <- searchTwitter("#COVID19", n = 1000, lang='en')

Os tweets vem originalmente em forma de lista. Vamos transformar em um DataFrame. A biblioteca twetteR fornece a função twListToDF que faz a conversão.

tweets.clean <- twListToDF(tweets)

Agora precisamos concatenar todos os tweets em uma única string, fazemos isso utilizando a função paste:

tweets.clean <- paste(tweets.clean$text, collapse=' ')

Agora transformamos este vetor caractere para o formato Corpus para tratar o texto bruto. O objetivo é reduzir o texto à apenas as palavras mais importantes e que agregagam sentido ao texto.

sv <- VectorSource(tweets.clean)
corpus <- Corpus(sv)

# Limpando os termos conectores e pontuações
corpus <- tm_map(corpus, content_transformer(tolower)) # Trasnformando em caixa baixa
corpus <- tm_map(corpus, removePunctuation) # Removendo pontuações
corpus <- tm_map(corpus, stripWhitespace) # Removendo espaços em brancos em excesso
corpus <- tm_map(corpus, removeNumbers) # Removendo os caracteres numéricos
corpus <- tm_map(corpus, removeWords, stopwords('english')) # Removendo as stopwords em inglês
#inspect(corpus)

Como o texto vem de uma rede social, é necessário remover caracteres relacionados ao mundo digital, como links e outras pontuações.

removerURL <- function(x){gsub("http[^[:space:]]*", "", x)}
corpus <- tm_map(corpus, removerURL)

removerNumPunct <- function(x){gsub("[^[:alpha:][:space:]]*", "", x)}
corpus <- tm_map(corpus, removerNumPunct)

Agora podemos calcular a matriz das frequências e plotar um histograma com a frequência das palavras.

freqs <- as.matrix(TermDocumentMatrix(corpus))
freqs <- sort(rowSums(freqs), decreasing=T)

# Plotando as palavras com pelo menos 2 ocorrências
barplot(freqs, las=2)

# Agora vamos plotar nossa nuvem de palavras
freq.minima <- 15

par(mar=c(2,0,2,2))
wordcloud(corpus, min.freq=freq.minima, max.words=Inf,
          random.order = T, rot.per=0.25,
          colors=brewer.pal(8, 'Dark2'))

Agora vamos para a segunda parte: Análise de sentimentos Para realizar a análise de sentimentos, iremos utilizar dataframe original com os tweets e a função get_nrc_sentiment.

tweets.clean <- twListToDF(tweets)
sentimentos <- get_nrc_sentiment(tweets.clean$text)

Então, plotamos um gráfico de barra com os sentimentos e suas contangens de ocorrências

par(mar=c(6,4,2,2))
barplot(colSums(sentimentos), las=2, col=rainbow(10),
        xlab='Frequência do sentimento',
        main='Sentimentos do Twitter em relação a #COVID19',
        horiz=T)

Percebe-se que existem três sentimentos que se sobre saem sobre os demais: Positivo, negativo e confiança. À primeira vista, pode parecer controverso haver sentimentos positivos quando se fala de uma pandemia. No entanto, temos que lembrar que uma boa parte da população já está vacinada e que a população está otimista com a vacinação nos próximos meses. Ainda assim existem sentimentos negativos. Apesar da vacinação ter atingido uma boa parcela da população, os números de casos e mortes ainda estão muito altos! E provavelmente tanto as pessoas quanto os noticiários estão comentando sobre as consequências da pandemia de COVID 19. O terceiro sentimento é o de confiança, o que faz muito sentido com o que já falei. As pessoas estão otimistas com a vacinação e com a volta das atividades normais ao redor do mundo.

Teorema

flu <- read.csv('flu.csv')

Vamos começar plotando o histograma da distribuição das idades.

hist(flu$age,
     main='Histograma das idades',
     xlab='Idade',
     ylab='Frequência',
     probability = T)
lines(density(flu$age))

Como pode ser visto, a distribuição está longe de ser Normal. Agora vamos testar o Teorema do Limite Central (TLC) e ver se de fato a distribuição das médias das amostras se aproxima da Normal.

# Criando um vetor com amostras tiradas da população
n.amostras <- 200
tam.amostras <- 35
medias <- vector()
for (i in 1:n.amostras){
  medias[i] <- mean(sample(x=flu$age, size=35, replace=T))
}

# plotando o histograma da distribuição das médias
hist(medias,
     main='Histograma das médias amostrais',
     ylab='Frequência',
     xlab='Média',
     probability=T)
lines(density(medias))

Dessa forma, com apenas 200 amostras com tamanho 35 já foi possível observar o processo de normalização da distribuição das médias amostrais. Vamos testar com 500 amostras:

# Criando um vetor com amostras tiradas da população
n.amostras <- 600
tam.amostras <- 35
medias <- vector()
for (i in 1:n.amostras){
  medias[i] <- mean(sample(x=flu$age, size=35, replace=T))
}

# plotando o histograma da distribuição das médias
hist(medias,
     main='Histograma das médias amostrais',
     ylab='Frequência',
     xlab='Média',
     probability=T)
lines(density(medias))

Quanto maior o tamanho da amostra, mais a distribuição se aproximará da Normal!