# Importanto as bibliotecas necessários
library(tidyverse)
library(RColorBrewer)
library(twitteR)
library(syuzhet)
library(wordcloud)
library(tm)
library(MASS)
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.
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)
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.
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!