Análise   Exploratória

Linguagem R



Análise Exploratória


Em estatística, a análise exploratória de dados (AED) é uma abordagem à análise de conjuntos de dados de modo a resumir suas características principais, frequentemente com métodos visuais. Um modelo estatístico pode ou não ser usado, mas primeiramente a AED tem como objetivo observar o que os dados podem nos dizer além da modelagem formal ou do processo de teste de hipóteses. A análise exploratória de dados foi promovida pelo estatístico norte-americano John Tukey, que incentivava os estatísticos a explorar os dados e possivelmente formular hipóteses que poderiam levar a novas coletas de dados e experimentos. A AED é diferente da análise inicial de dados (AID), que se concentra mais estreitamente em verificar os pressupostos exigidos para ajuste de modelos e teste de hipóteses, além de manusear valores faltantes e fazer transformações de variáveis conforme necessário. A análise exploratória de dados abrange a AID.

A análise exploratória de dados emprega grande variedade de técnicas gráficas e quantitativas, visando maximizar a obtenção de informações ocultas na sua estrutura, descobrir variáveis importantes em suas tendências, detectar comportamentos anômalos do fenômeno, testar se são válidas as hipóteses assumidas, escolher modelos e determinar o número ótimo de variáveis.


Carregando Conjunto de Dados


Esse estudo estará utilização dados coletados e tratados pelo Kaggles, o qual disponibilizou esse dataset neste link. Com base nas informações dispostas nesse dataset, realizarei Insights acerca dos tripulantes e das circunstâncias que envolveram a tragédia. Vale lembrar que tal conjunto de dados não abriga informações de todos os passageiros, mas sim de apenas 891.

Nesse projete iremos analisar uma série temporal de uma empresa de locação de bicicleta dos Estados. Unidos. O conjunto de dados é obtido na plataforma Kaggle. Nesse conjunto de dados, iremos realizar uma análise exploratória em relação da demanda de locação de bicicleta dos dias da semana, dia úteis, com dias de finais de semanas e feriados, qual a correlação de locação de bicicleta com a temperatura e humidade do ar, se a velocidade do vento interfere em relação a damanda de locação. Toda este projeto foi desenvolvido em linguagem R.

Iremos utilizar a função read.csv().Abaixo demonstraremos como carregar um conjunto de dados, lembrando que é preciso determinar alguns parâmetros, file ou path, caminho do diretório do arquivo em seu computador, header indica se o conjunto de dados tem ou não o nome das variáveis e como é um arquivo csv temos que demonstrar qual é o separador, nesse dataset é a vírgula.
Abaixo temos 02 exemplo, o primeiro, baixar o arquivo, e salva em seu computador. Ou Caso preferir pode utilizar a segunda opção que pega o arquivo direto do repositório do GitHub.

# Primeira Opção
df <- read.csv(file = 'C:/Users/Downloads/data_titanitc.csv')

Ou

# Segunda Opção
df <- read.csv(file = 'https://raw.githubusercontent.com/rodolffoterra/rodolffoterra.github.io/main/dados/data_titanic.csv')
head(df)
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarket
1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.2500 s
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 pc 17599 71.2833 c85 c
3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 310128 7.9250 s
4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1000 c123 s
5 0 3 Allen, Mr. William Henry male 35 0 0 373450 8.0500 s

Análise Inicial dos Dados


Acima você pode conferir as primeiras e últimas linhas do dataset. As informações podem causar certa confusão no primeiro momento, portanto, vamos esclarecer alguns pontos sobre eles, a começar pela remoção de colunas que não usaremos, como a “PassengerId”, “Ticket” e “Cabin”, que contém informações sobre o código de identidade do passIdadeiro, o número da sua cabine e do seu bilhete, respectivamente. Acredito que essas informações não são pertinentes ao estudo que faremos e sua permanência poderia causar perda de foco.

df <- df[,-c(1,9,11)]

Caso a função acima possa parecer estranho, leia o material anterior: Data Frame.

Com as colunas removidas em nosso conjutno de dados, iremos renomear as colunas remanescentes.

colnames(df) <- c("Sobrevivente", "Classe","Nome","Sexo","Idade","Irmãos/Cônjuge","Pais/Crianças","Tarifa","Embarque")
									

Com as colunas devidamente renomeadas para um melhor entendimento, é hora de explicarmos o que cada um desses dados significa. Acompanhe abaixo cada coluna com seu respectivo significado:

  • Sobreviveu.: Informa se o passageiro sobreviveu ao desastre. 0 = Não; 1 = Sim
  • Classe.: Classe na qual o passageiro viajou. 1 = Primeira Classe; 2 = Segunda Classe; 3 = Terceira Classe
  • Nome.: Nome do passageiro
  • Sexo.: Sexo do passageiro
  • Idade.: Idade do passageiro
  • Irmãos/Cônjuge.: Informa a quantidade de irmãos e cônjuges que o paciente possuía na embarcação
  • Pais/Crianças.: Quantidade de crianças e idosos (pais) relativos ao passIdadeiro
  • Tarifa.: Valor da passageiro
  • Embarque.: Local onde o passageiro embarcou

  • A função abaixo mostra a quantidade de linhas (Observações), quantidade de colunas (variáveis) o nome, o tipo da variável que foi classificado pelo RStudio cada variável e a composição das variáveis.

    str(df)

    glimpse(df)

    Já a função skim(df) mostra com maiores detalhes cada variáveis, começamos a ter uma ideia de como cada informação está organizada em nosso conjunto de dados.

    skimr::skim(df)

    Abaixo estamos querendo saber quais variáveis foram classificados como numéricas pelo próprio RStudio

    colunas_numericas <- sapply(df, is.numeric)
    colunas_numericas

    Valores Missing

    Agora iremos visualizar de em nosso conjunto de dados existe valores faltantes, usaremos um gráfico da biblioteca Amelia.
    missmap(df,
    main = "Titanic - Mapa de Dados Missing",
    col = c("black", "grey"),
    legend = FALSE)

    Podemos saber a quantidade de número missing por variável.

    sapply(df, function(x) sum(is.na(x)))

    Observar que a coluna idade possui muitos valores missing. Precisamos remover incluir valores no lugares desses espaços vazios. Para isto decidimos realizar a seguinte técnica. O grafico abaixo mostra um boxplot da faixa etária por classe.

    df$Classe <- factor(df$Classe, labels = c("1ª Classe", "2ª Classe", "3ª Classe"))

    ggplot(df, aes(Classe, Idade)) +
    geom_boxplot(aes(group = Classe, fill = Classe), alpha = 0.4, show.legend = FALSE) +
    scale_y_continuous(breaks = seq(min(0), max(80), by = 10)) +
    theme_classic() +
    labs(title = "Quantidade de Pessoas por Classe",
    y = "Idade",
    x = "Classe")

    Podemos fazer um Group_by para visualizar o valor média por classe. Se você nuncaouviu falar em agrupamento, o artigo SQLDF, explica com maiores detalhes

    df[complete.cases(df$Idade),] %>%
    group_by(Classe) %>%
    summarise(media = mean(Idade))

    Podemos observar acima que a média da 1ª Classe é 38 anos, da 2ª Classe é 30 anos e da terceira Classe é 25 anos.

    sapply(df, function(x) sum(is.na(x)))

    Removemos os valores missing de idade. Na coluna "Embarque" temos 02 observações com nenhuma informação. Nesse caso, colocaremos nessa duas observações que está vazia, o valor “S”, pois representa 72 % do nosso conjunto de dados.

    table <- rbind(table(df$Embarque),
    paste0(round(prop.table(table(df$Embarque))*100, digit = 2),"%"))

    rownames(table) <- c("Total","Percentual")

    table

    O Titanic parou em três locais diferentes para que seus passegeiros pudessem embarcar: Cherbourg, Queenstown e Southampton, representados pelas letras C, Q e S no dataset, respectivamente.

    df[c(62,830),9] <- "S"

    df$Embarque <- factor(df$Embarque, labels = c(Cherbourg", "Queenstown","Southampton"))

    Na coluna Sovrevivente, colocaremos Naufragados no lugar de 0 e Sobrevivente no lugar de 1.
    E na coluna Sexo no lugar, colocaremos Feminino e masculino para iniciarmos a análise exploratória de dados

    df$Sobrevivente <- factor(df$Sobrevivente, labels = c("Naufragados","Sobrevivente"))

    df$Sexo <- factor(df$Sexo, labels = c("Feminino", "Masculine"))

    Análise Exploratória dos Dados


    Abaixo eremos mostrar um Dashboard das variáveis categóricas e numéricas. Segue também a função. O gráficos com as as retas azuis e vermelha, iremos estudar com maiores detalhes no próximo artigo. Iremos construir apenas alguns gráficos para começarmos a nos familializar regressão linear e a variação de gráficos.
    my_fn <- function(data, mapping, ...){
    p <- ggplot(data = data, mapping = mapping) +
    geom_point(size = 2.48, colour = "#A9A9A9") +
    geom_smooth(method=loess, fill = "red", color="red", ...)+
    geom_smooth(method=lm, fill = "blue", color = "blue", ...)
    p
    }

    # Gráfico ggpairs
    ggpairs(df[,c(1,2,4:9)], lower = list(continuous = my_fn)) +
    labs(title = "Correlação entre as variáveis")

    Abaixo um gráfico de barra da quantidade de pessoas que sobreviveram ao naufrágio, e os que não sobreviveram.

    ggplot(df, aes(Sobrevivente)) +
    geom_bar(aes(fill = factor(Sobrevivente)), alpha = 0.5) +
    theme_classic() +
    labs(title = "Quantidade de Sobreviventes x Naufragados",
    y = "Contagem",
    fill = "Sobrevivente")

    Gráfico de barra da quantidade de pessoas por gênero.

    ggplot(df, aes(Sexo)) +
    geom_bar(aes(fill = factor(Sexo)), alphe = 0.5) +
    theme_classic() +
    labs(title = "Quantidade de pessoas por Gênero",
    y = "Contagem",
    x = "Gênero",
    fill = "")

    Vamos usar a função prop.table() para visualizar a proporção de homens e mulheres.

    prop.table(model_table) * 100
    ##
    ##    Feminino       Masculino
    ##      35.2413           64.7587

    Usaremos a função table() para visualizar a quantidade distinta de cada levels.

    table(df$Sexo)
    ##
    ##    Feminino       Masculino
    ##               314                     577

    Gráfico de barra da quantidade de pessoas por classe social.

    ggplot(df, aes(Classe)) +
    geom_bar(aes(fill = Classe), alpha = 0.5, show.legend = FALSE) +
    theme_classic() +
    labs(title = "Quantidade de Pessoas por Classe",
    y = "Contagem",
    x = "Classe",
    fill = "Classe")

    E abaixo um Gráfico de barra da quantidade de pessoas por sexo e por Embarcação.

    ggplot(df) +
    geom_bar(aes(y = Embarque, fill = Sexo, alphe = 0.5)) +
    theme_classic() +
    labs(title = "Quantidade de pessoas por Embarcação e Gênero",
    y = "",
    x = "Quantidade",
    fill = "Sexo") +
    theme(axis.text.y = element_text(angle = 45, hjust = 1))

    Criaremos um blox plot para ver qual a faixa etária dos sobreviventes e se a idade média das mulheres sobreviventes é maior do que a dos homens sobrevivente. Podemos observar que a média pelo gráfico das mulheres sobrevivente é muito próxima da idade dos homens sobreviventes. Para termos certeza se a média de idade dos gênero são iguais ou próxima teremos que realizar o teste de hipótese que será abordados nos próximos artigo.

    subset(df,df$Sobrevivente == "Sobrevivente") %>%
    ggplot(aes(Idade, Sexo)) +
    geom_boxplot(aes(fill = as.factor(Sexo)), alpha = 0.4, show.legend = FALSE) +
    theme_classic() +
    labs(title = "BoxPlot dos Sobreviventes por Sexo x Idade",
    y = "Sobrevivente",
    x = "Idade") +
    theme(axis.text.y = element_text(angle = 45, hjust = 1))

    Já sabendo a média da faixa etária dos sobreviventes podemos fazer um outro gráfico, histograma, para conseguirmos visualizar quais as proporções por idade dos sobrevivente e a diferença entre mulher e home.

    tmp_male <- subset(df, df$Sobrevivente == "Sobrevivente") %>%  filter(Sexo=="Masculino", !is.na(Idade)) %>% select(Idade) %>% .[[1]]
    b <- hist(tmp_male, 20, plot=FALSE)
    tmp_female <- subset(df, df$Sobrevivente == "Sobrevivente") %>% filter(Sexo=="Feminino", !is.na(Idade)) %>% select(Idade) %>% .[[1]]
    a <- hist(tmp_female, breaks = b$breaks, plot=FALSE)

    df_density <- data.frame(Age=c(a$mids,b$mids),Density=c(a$density,b$density),Sex=c(rep("Feminino",length(a$mids)),rep("Maculino",length(b$mids))))

    highchart() %>%
    hc_xAxis(categories = df_density$Age) %>%
    hc_add_series(name="Feminino", select(filter(df_density,Sex=="Feminino"),Density)[[1]], type="column", color='rgba(255, 192, 203, 0.30)', showInLegend=FALSE) %>%
    hc_add_series(name="Masculine", select(filter(df_density,Sex=="Masculine"),Density)[[1]], type="column", color='rgba(68, 170, 255, 0.30)', showInLegend=FALSE) %>%
    hc_add_series(name="Masculine", select(filter(df_density,Sex=="Masculine"),Density)[[1]], type="spline", color="#44AAFF") %>%
    hc_add_series(name="Feminino", select(filter(df_density,Sex=="Feminino"),Density)[[1]], type="spline", color="#FFC0Cb") %>%
    hc_tooltip(pointFormat = "{series.name}"
    {point.y:.3f}",
    shared = FALSE) %>%
    hc_yAxis(title=list(text='Densidade')) %>%
    hc_xAxis(title=list(text='Idade')) %>%
    hc_title(text='Gráfico dos Sobreviventes por Idade')

    CrossTable(x = df$Sexo, y = df$Sobrevivente)

    A função acima CrossTable() demonstra numericamente a relação entre o Sexo, e os sobreviventes e naufragados, tabela cruzada . O nosso conjunto de dados, possui 891. sendo 314 mulheres, ou 35.20% e 577 homens ou 64.80%. A table também mostre a quantidade de mulheres sobreviventes, 233 (74,2% do grupo de mulheres) e 81 mulheres naufragadas (25.80% do grupo de mulheres). O mesmo análise temos na categoria dos homens, sendo 109 homens sobreviventes (18.90% do grupo de homens) e 468 homens naufragados (81.10% do grupo de homens. Abaixo temos também a quantidade de naufragados, 549 pessoas (61.60%) e de sobreviventes 342 pessoas (38.40%).Abaixo vamos mostrar mais um gráfico em relação ao sexo, e sobrevivente e naufragados

    female_rate <- nrow(df[df$Sexo == "Feminino" & df$Sobrevivente == "Sobrevivente",]) / nrow(df[df$Sexo == "Feminino",]) * 100
    male_rate <- nrow(df[df$Sexo != "Feminino" & df$Sobrevivente == "Sobrevivente",]) / nrow(df[df$Sexo != "Feminino",]) * 100

    ggplot(df, aes(Sexo)) +
    geom_bar(aes(fill = Sexo, alpha = Sobrevivente), color="grey", show.legend = FALSE) +
    labs(x = "Gênero",
    y = "Quantidade",
    title="Sobrevivente por Gênero") +
    theme_bw(base_size = 18) +
    scale_fill_manual(name="", values=c("E57373", "#42A5F5")) +
    annotate("text", label=paste(round(female_rate,digits=3), "%"), x = 1, y = 250) +
    annotate("text", label=paste(round(male_rate,digits=3), "%"), x = 2, y = 125)

    Agora mostramos um gráfico separado por embarga, por títularidade do nome e é sobrevivente ou não.

    df$Nome <- gsub('(.*, )|(\\..*)','', df$Nome)
    df$Nome[df$Nome == 'Mlle']<- 'Miss'
    df$Nome[df$Nome == 'Ms']<- 'Miss'
    df$Nome[df$Nome == 'Mme']<- Mrs'
    df$Nome[df$Nome == 'Lady']<- 'Miss'
    df$Nome[df$Nome == 'Dona']<- 'Miss'
    officer<- c('Capt','Col','Don','Dr','Jonkheer','Major','Rev','Sir','the Countess')
    df$Nome[df$Nome %in% officer]<-'Officer'

    df$Nome<- as.factor(df$Nome)

    ggplot(data = df,aes(x=Nome,fill=df$Sobrevivente)) +
    geom_bar(start = "identify") +
    labs(y = "Quantidade",
    fill = "Sobrevivente",
    title = "Titularidade do Nome") +
    scale_y_continuous(breaks = seq(min(0), max(400), by = 50)) +
    facet_wrap(~Embarque) +
    theme_test()

    Para finalizarmos o nosso artigo deixaremos um gráfico abaixo, para que vocÊ possa refletir, pois será assunto para a próxima aula, regressão linear. No próximo artigo terá uma análise detalhada em relação a composição desse gráfico

    ggplot(df, aes(x = df$`Irmãos/Cônjuge`, y = df$`Pais/Crianças`))+
    geom_point() +
    geom_smooth(method=loess, fill = "red", color="red")+
    geom_smooth(method=lm, fill = "blue", color = "blue") +
    theme_classic() +
    labs(title = "Correção entre Irmãos / Cônjuge com Pais / Crianaças",
    y = "Pais/Crianaças",
    x = "Irmãos/Cônjuge")


    Projeto: Análise Exploratória


    Nesse projete iremos analisar uma série temporal de uma empresa de locação de bicicleta dos Estados. Unidos. O conjunto de dados é obtido na plataforma Kaggle. Nesse conjunto de dados, iremos realizar uma análise exploratória em relação da demanda de locação de bicicleta dos dias da semana, dia úteis, com dias de finais de semanas e feriados, qual a correlação de locação de bicicleta com a temperatura e humidade do ar, se a velocidade do vento interfere em relação a damanda de locação. Toda este projeto foi desenvolvido em linguagem R.

    Projeto