# Noções básicas de R ```r Hello world! ``` ### O que iremos ver hoje? - Introdução: * O que é o R e o RStudio * Do que é composto o RStudio * Utilidade estatística * Primeiros conceitos: * Cálculos * Criação de variáveis * Funções * Estruturas de dados * Operadores lógicos * Plotagem de gráficos e funções estatísticas * Pacotes do R * Gráficos * Uso do R como ferramenta para estatística * Correlação * Regressão ## Começando pelo começo ### O que é o R? O R é tanto uma linguagem de programação como um ambiente de análise estatística e criação de gráficos. Ele foi criado baseado na liguagem estatístics S, sendo pautado na necessidade de um programa de análises estatísticas que fosse gratis. Sua propagaropagação vem da facilidade de escrever códigos e figuras publicáveis, por ser gratuito, funcionar em todos os OS e ser desenvolvido através de uma liguagem verdadeira, o que significa permitir aos usuários criar mais funcionalidades. Quando se diz ambiente, quer-se dizer um programa de computador planejado e estruturado para realizar alguma função. O R não é sómente um conjunto de ferramentas, mas ele dá a possibilidade de armazenar e operar dados, como analizá-los. ### O que é o RStudio? O RStudio é uma IDE, ou seja, uma ambiente de desenvolvimento integrado, utilizado para rodar as funcionalidades do R. Uma IDE é composta normalmente por um editor de texto, automatizador de build e debugger. * Editor de texto: utilizado para escrever o código a ser processado * Automatizador: Processo de criação de software, onde estão inclusos a compilação do código em codigo binário, empacotamento do mesmo e realização de testes. ### O que isso tem a ver comigo? * Análise de dados * Inferência estatística * Aprendizagem de máquina [Pacotes existentes no R](https://cran.r-project.org/web/views/) [Cientista de dados - Linkedin](https://www.linkedin.com/jobs/search/?currentJobId=3442161820&keywords=data%20analist) [Cientista de dados - Glassdoor](https://www.glassdoor.com.br/Sal%C3%A1rios/cientista-de-dados-sal%C3%A1rio-SRCH_KO0,18.htm#:~:text=Qual%20%C3%A9%20o%20sal%C3%A1rio%20de,De%20Dados%20na%20sua%20regi%C3%A3o.) ## Seguindo pelo segundo ### Cálculos Usando a linha de comando de R podemos realizar contas simples Somar ```r > 1+1 [1] 2 ``` subtrair, ```r > 14-6 [1] 8 ``` multiplicar, ```r > 3*4 [1] 12 ``` dividir, ```r > 47/11 [1] 4.272727 ``` e realizar cálculos mais complexos como se fosse uma calculadora científica. ```r > sin(5) [1] -0.9589243 ``` Podemos também atribuir o resultado de um cálculo à uma variável ```r > resultado <- 47/11 > resultado [1] 4.272727 > resultado*11 [1] 47 > resultado <- resultado+42 > resultado [1] 46.27273 ``` ## Nosso primeiro programa! #### Calculando a média dos números de 1 a 10 ```r mean(1:10) ``` > O operador ":" cria uma sequência de números > Dentro dos parenteses ficam os argumentos da função > O resultado é chamado vetor ## Testanto a vetorização dos operadores ```r 1:5 + 6:10 c(1, 3, 6, 10, 15) + c(0,1,3,6,10) ``` ## Atribuição de variáveis ```r x <- 5 y <- 1:10 ``` ## Operadores lógicos ![](https://i.imgur.com/bzMFkf1.png) ```r ! # não & # e | #ou == # "igual" > # maior < # menor >= # maior ou igual <= # menor ou igual =! # diferente TRUE FALSE ``` ## Estrutura de dados ![](https://i.imgur.com/j1dTecR.png) # Indexacao por posicao dos elementos #### Vetores É um conjunto de dados ordenados em linha. ```r a2 <- c(10,20,30) a2 a2[3] a4 <- c("porque", "o", "gato" ,"e" ,"nosso" ,"amigo") a4 a4[3] ``` #### Matrizes É um conjunto de dados que possuem coordenadas de linha e coluna (tabela) em modo unico. ```r #matrix[linha , coluna] é para indexar matrizes d1 <- matrix(data=1:12,nrow=4,ncol=3, byrow=TRUE, dimnames = NULL) colnames(d1) <- c("col1", "col2", "col3") rownames(d1) <- c("linhaA", "linhaB", "linhaC", "linhaD") d1 d2<-matrix(c("nao", "atire", "o", "pau", "no", "gato", "porque", "o", "gato" ,"e" ,"nosso" ,"amigo"), ncol=3, nrow=4, byrow=T) d2 d2[1, 2] # me retorna o elemento de posição [1,2] d2[,3] # me retorna a coluna 3 d2[,-3] # me retorna tudo, exceto a coluna 3 d1[c(1,3),] # me retorna a linha 1 e 3 d1[c(1:3),] # me retorna as linhas 1 até a 3 d1[c(1,3),]<-0 # input de 0 na linha 1 e 3 ```` ## Vetores lógicos ````r d1 > 5 d1 >= 5 d1 ==5 d2 == "gato" which(d1>5) #retorna a posição dos elementos indicados posicoes<-which(d1>5, arr.ind = T) # não me dá os valores, me dá as posições desses valores!! sensacional! ```` ## Data Frame Data frames são matrizes mais gerais onde colunas podem ser compostas por diferentes tipos de objetos (numérico, lógico, categórico) ````r dados<-data.frame(d1, d2) dados dados[,3] dados[,5] #falar sobre ordem alfabética imposta no R. dados[3,6] #DATA FRAME: INDEXAÇÃO PELOS COMPONENTES #indexacao por nome das variaveis (apenas colunas) dados$X3 dados$X3[3] ```` # Trabalhando com um data.frame do próprio R ````r randu sum(randu$x > 0.5) dados1<-randu[,] colnames(dados1)<-c("largura", "altura", "comprimento") dados1$largura > 0.5 mean(dados1$largura[dados1$largura > 0.5]) ```` # Qual a posicao dos valores da coluna "largura" que sao maiores do que 0.5? ````r which(dados1$largura > 0.5) ```` # Quantos valores são maiores do que 0.5? ````r length(which(dados1$largura > 0.5)) dados1[which(dados1$largura > 0.5),] # exibe quais dados da coluna largura (dados1$largura>0,5) sao maiores que 0,5 e de todas as linhas. dados1[which(dados1$largura >0.1 & dados1$altura < 0.7),] #quais dados sao assim dados1[-which(dados1$largura >0.1 & dados1$altura < 0.7),] # quais dados (-) os que são assim, nessa condição. ```` ### Listas: São objetos que podem armazenar objetos de dados de tipos diferentes. É possível incluir data.frames, arrays, matrizes, vetores, fatores e mesmo listas em uma lista. ```r generos <- factor(c("Masculino", "Feminino", "Indefinido")) #Fator com gêneros vetorValores <- 1:12 #Dados head(x = mtcars, n = 10) # Carrega as 10 primeiras linhas do data.frame mtcars (carros) da base do R (vem na instalação do R) , se colocar tail() carrega as 10 últimas ``` ## Cria lista com os objetos ```r lista <- list(vetorValores, generos, head(x = mtcars, n = 10)) lista ``` ## Acessando os dados ```r #Acessa o segundo carro (base mtcars) lista[[3]][2,] ``` # Plotagem de gráficos e funções estatísticas ## Pacotes do R ```r # Instalando pacotes install.packages("ggplot2") install.packages("gcookbook") # Carregando pacotes instalados library("ggplot2") library("gcookbook") ``` ## Gráficos ### Scatterplot ```r plot(mtcars$wt, mtcars$mpg) qplot(mtcars$wt, mtcars$mpg) ``` ![](https://i.imgur.com/FyDDWke.png) ```r #Tipos de pontos diferentes ggplot(heightweight, aes(x=ageYear, y=heightIn)) + geom_point(shape=3) #Mapeando uma variavel continua por cor ou tamanho heightweight[,c("sex", "ageYear", "heightIn", "weightLb")] ggplot(heightweight, aes(x=ageYear, y=heightIn, size=weightLb)) + geom_point() ggplot(heightweight, aes(x=ageYear, y=heightIn, colour=weightLb)) + geom_point() ``` ### Gráfico de linhas ```r plot(pressure$temperature, pressure$pressure, type ="l") points(pressure$temperature, pressure$pressure) qplot(pressure$temperature, pressure$pressure, geom = c("line", "point")) #Gráfico de área ggplot(uspopage, aes(x=Year, y=Thousands, fill=AgeGroup)) + geom_area() ggplot(uspopage, aes(x=Year, y=Thousands, fill=AgeGroup)) + geom_area(colour="black", size=2, alpha=.4)+ scale_fill_brewer(palette="Blues", breaks=rev(levels(uspopage$AgeGroup))) ``` ### Gráfico de barras ```r barplot(BOD$demand, names.arg = BOD$Time, xlab = "Eixo X", ylab = "Eixo Y") ggplot(pg_mean, aes(x = group, y = weight)) + geom_bar(stat = "identity") #Colorindo grafico de barras upc <- subset(uspopchange, rank(Change)>40) upc ggplot(upc, aes(x=Abb, y=Change, fill=Region)) + geom_bar(stat="identity") ggplot(upc, aes(x=reorder(Abb, Change), y=Change, fill=Region)) + geom_bar(stat="identity", colour="black") + scale_fill_manual(values=c("#669933", "#FFCC66")) + xlab("State") #Colorindo barras csub <- subset(climate, Source=="Berkeley" & Year >= 1900) csub$pos <-csub$Anomaly10y >= 0 csub ggplot(csub, aes(x=Year, y=Anomaly10y, fill=pos)) + geom_bar(stat="identity", position="identity") #Colorindo barras positivas e negativas ggplot(csub, aes(x=Year, y=Anomaly10y, fill=pos)) + geom_bar(stat="identity", position="identity", colour="black", size=0.25) + scale_fill_manual(values=c("#CCEEFF", "#FFDDDD"), guide=FALSE) ``` ### BoxPlot ```r plot(ToothGrowth$supp, ToothGrowth$len) qplot(ToothGrowth$supp, ToothGrowth$len, geom = "boxplot") boxplot(len~supp+dose, data = ToothGrowth) ``` ### Funções Curvas ```r curve(x^3 - 5*x, from= -4, to = 4) teste <- function(xvar) { 1/(1 + exp(-xvar + 10)) } curve(teste(x), from = 0, to = 20) curve(1-teste(x), add = TRUE, col = "red") ``` ### Editando legendas ```r p <- ggplot(PlantGrowth, aes(x=group, y=weight, fill=group)) + geom_boxplot() + scale_fill_brewer(palette="Pastel2") p = theme(legend.position="top") p = theme(legend.position=c(1,0)) p <- ggplot(PlantGrowth, aes(x=group, y=weight, fill=group)) + geom_boxplot() p p+labs(fill="Condicao") p <- ggplot(PlantGrowth, aes(x=group, y=weight, fill=group)) + geom_boxplot() p + scale_fill_discrete(labels=c("Controle", "Tratamento1", "Tratamento2")) ``` # Uso do R como ferramenta para estatística ## Obtenção de dados > Link para download dos conjuntos de dados: https://drive.google.com/drive/folders/1Up7qIFrxjaAlCkdOQZpNrEM_JOYIQvsZ?usp=sharing ##### Paises: > Area, tamanho populacional, taxas de nascimento e óbito, expectativa de vida e forma de governo de 249 países ##### dados_politicos: > Conjunto de dados políticos e institucionais de 36 países ```r #Carregando texto separado por tabulação (.tsv ou .txt) t <- read.table(f, header = TRUE, sep = "\t", stringsAsFactors = FALSE) head(t) tail(t) #Carregando texto separado por vírgula (.csv) v <- read.table(f, header = TRUE, sep = ",", stringsAsFactors = FALSE) head(v) tail(v) #Carregando arquivo do excel (.csv) install.packages("readxl") library("readxl") e <- read_excel(f, sheet = 1, col_names = TRUE) head(e) tail(e) str(e) # OU install.packages("XLConnect") install.packages("XLConnectJars") library("XLConnect") library("XLConnectJars") e1 <- readWorksheetFromFile(f, sheet = 1, header = TRUE) head(d) #Criando um arquivo excel no R writeWorksheetToFile(e2, e, sheet = "myData", clearSheets = TRUE) ``` ### Explorando os dados ```r d <- read.csv("paises.csv", header = TRUE, sep = ",", stringsAsFactors = FALSE) head(d) summary(d) names(d) #Como saber a densidade populacional dos países? d$density <- d$population/d$area #Quais são os 10 países com maior densidade populacional? d <- d[order(-d$density), ] d[1:10, ] #E os países com menor densidade populacional? d <- d[order(d$density), ] d[1:10, ] #Inserindo linha de média e estimativa de distribuição par(mfrow = c(1, 1)) # Estabelece um painel e redesenha o histograma acima de log(Tamanho populacional) hist(log(population), freq = FALSE, col = "white", main = "Histograma com média e densidade", xlab = "log(Tamanho populacional)", ylab = "Densidade", ylim = c(0, 0.2)) abline(v = mean(log(population), na.rm = TRUE), col = "blue") lines(density(log(population), na.rm = TRUE), col = "green") detach(d) ``` ### Medidas de tendência e variância > São essenciais para analises descritivas e teste de hipótese ##### Conceitos importantes: * População: Conjunto com todos os dados do conjunto de dados; * Amostra: Uma ou mais observações da população; * Parâmetro: Uma característica mensurável na população; * Estatística: Uma característica mensurável na amostra. #### Medidas de tendência * Moda: Valor mais comum observado; * Mediana: Valor medio em uma seria ordenado de valores; * Média: Soma de todos os valores, divido pela quantidade de valores #### Medidas de disperção * Amplitude: Diferença entre o máximo e mínimo; * Interquartil: 25th até 75th quartil; ```r summary() ``` ## Conceitos Estatísticos * O R², é uma medida de ajuste de um modelo estatístico linear, como a regressão linear, em relação aos valores observados. Quanto maior o R², mais explicativo é o modelo, melhor ele se ajusta à amostra. * O p-valor é a evidência contra uma hipótese nula. Quanto menor o p-valor, mais forte é a evidência de rejeição da hipótese nula. ![](https://i.imgur.com/qN4PQt0.png) ## Regressão ![](https://i.imgur.com/c9YJ5Da.png) ###### Mesma regressão linear e R-square de 0,816. Dado que uma maior area disponivel permite o desenvolvimento das populacoes residentes e introducao de novas especies. Coletamos dados da riqueza de bromélias em paredoes rochosos na serra do mar e gostaríamos de verificar qual a relacao entre a Área do paredao e o numero de especies presentes. ```r #importar dados dados=read.table('dados_regressao.txt', header=T, dec=',') summary(dados) #verifica-los graficamente plot(density(dados$area)) plot(density(dados$riqueza)) plot(dados$area, dados$riqueza, bty="l", ylab="Riqueza", xlab="Área") #efetuar teste teste=lm(riqueza~area, data=dados) summary(teste) anova(teste) ### gráfico final - opcao I par(mar=c(4,4,3,1), family="serif", font.axis=1) plot(dados$area,dados$riqueza, bty="l", ylab = "Espécies de bromélias (S)", xlab= "Área do paredãoo rochoso (km²)") # reta da estimativa abline(a=6.779, b=25.818) # equacao da reta (não é necessário, mas fica legal!) text(1, 20,"Y=6.779 + 25.818 * X") # resultados modelo (não é necessário, mas fica legal!) text(1, 21.7,expression(R^2==~"0.78;"~F["(1,43)"]==~"161.4;"~p<"0.0001")) ```` ### Reportando o resultado ###### Existe uma maior riqueza de bromélias em paredões maiores (R2=0,78; gl=43; p<0,001). A área do paredão explica 78% da variação na riqueza de bromélias. ### Correlação > Dado que o cerrado possui espécies arbóreas com diversas caracteristicas morfológicas e anatômicas. Há correlação entre a massa e o volume de madeira obtido em uma área de cerrado? ```r #importar os dados dados<-read.table("dados_correlacao.txt", header=T, dec=",") summary(dados) #verificar gráficamente plot(density(dados$massa)) plot(density(dados$volume)) par(mar=c(5,4,3,2), family="serif", bty="l", cex.axis=1.3, cex.lab=1.2, font.axis=1) plot(dados$massa, dados$volume, bty="l", yaxp= c(0,60,10), ylim=c(0,60), ylab="Volume", xlab="Massa") #efetuar teste cor.test(dados$massa,dados$volume,method="pearson",alternative="two.sided") ``` ## Regressão >Dado que uma maior area disponível permite o desenvolvimento das populações residentes e introdução de novas espécies. Coletamos dados da riqueza de bromélias em paredões de rocha na Serra do mar e gostaríamos de verificar qual a relacao entre a área do paredao e o número de espécies presentes. ```r #importar dados dados=read.table('dados_regressao.txt', header=T, dec=',') summary(dados) #verifica-los graficamente plot(density(dados$area)) plot(density(dados$riqueza)) plot(dados$area, dados$riqueza, bty="l", ylab="Riqueza", xlab="Área") #efetuar teste teste=lm(riqueza~area, data=dados) summary(teste) anova(teste) ### gráfico final - opcao I par(mar=c(4,4,3,1), family="serif", font.axis=1) plot(dados$area,dados$riqueza, bty="l", ylab = "Espécies de bromélias (S)", xlab= "Área do paredãoo rochoso (km²)") # reta da estimativa abline(a=6.779, b=25.818) # equacao da reta (não é necessário, mas fica legal!) text(1, 20,"Y=6.779 + 25.818 * X") # resultados modelo (não é necessário, mas fica legal!) text(1, 21.7,expression(R^2==~"0.78;"~F["(1,43)"]==~"161.4;"~p<"0.0001")) ````