Apresentação

Row

Sobre os dados

Dataset link: https://www.kaggle.com/datasets/jayaantanaath/student-habits-vs-academic-performance/data

Este é um conjunto de dados simulado que explora como os hábitos de vida afetam o desempenho acadêmico dos alunos. Com 1.000 registros sintéticos de alunos e mais de 15 recursos, incluindo horas de estudo, padrões de sono, uso de mídias sociais, qualidade da dieta, saúde mental e notas de exames finais, é perfeito para projetos de ML, análise de regressão, agrupamento e visualização de dados. Criado com base em padrões realistas para práticas educacionais.

Já se perguntou o quanto assistir à Netflix, dormir ou rolar o TikTok afeta suas notas? 👀 Este conjunto de dados simula os hábitos diários de 1.000 alunos — do tempo de estudo à saúde mental — e os compara com as notas das provas finais. É como espionar seu GPA através das lentes do estilo de vida. Perfeito para EDA, prática de ML ou apenas para curtir dados enquanto finge ser produtivo.

Colunas do dataSet:

student_id: Identificador único do aluno (ex: S1000, S1001)

age: Idade do aluno em anos (23, 20, 21)

study_hours_per_day: Horas de estudo por dia (0.0, 6.9)

social_media_hours: Horas gastas em mídias sociais (1.2, 2.8)

part_time_job: Se o aluno tem emprego de meio período (Yes/No)

attendance_percentage: Porcentagem de frequência nas aulas (85.0, 97.3)

sleep_hours: Horas de sono por noite (8.0, 4.6)

diet_quality: Qualidade da dieta (Fair, Good, Poor)

exercise_frequency: Frequência de exercícios por semana (6, 1)

parental_education_level: Nível de educação dos pais (Master, High School)

internet_quality: Qualidade da internet (Average, Poor, Good)

mental_health_rating: Autoavaliação de saúde mental (1-10)

extracurricular_participation: Participação em atividades extracurriculares (Yes/No)

exam_score: Pontuação no exame (56.2, 100.0)

Tipos de dados

Row

Variáveis Qualitativas Ordinais

As variáveis qualitativas ordinais são características que podem ser categorizadas e ordenadas, mas cuja diferença entre as categorias não é uniforme. Ou seja, existe uma relação de ordem entre as categorias, mas a distância entre elas não é quantificável de maneira precisa. Vamos explorar essa categoria de variáveis com exemplos práticos e utilização da linguagem R.

Do nosso dataframe um exemplo disso é a coluna “diet_quality”, vamos ter uma ideia de como está a qualidade de alimentação de nossos estudantes!

Row

Variáveis Qualitativas Nominais

As variáveis qualitativas nominais representam categorias que não possuem uma ordem intrínseca. Cada categoria é única e independente das outras. Exemplos comuns incluem cores, estados civis e tipos de animais. Vamos entender essas características e distinções com exemplos e utilização da linguagem R.

Analisando nosso DataSet iremos analisar o atributo “part_time_job” com o gráfico de pizza vamos mostrar a distribuição de estudantes com emprego de meio período

Row

Variáveis Quantitativas Discretas

Variáveis quantitativas discretas representam contagens ou valores distintos e separados por unidades fixas. Ao contrário das variáveis contínuas, essas variáveis assumem valores inteiros específicos. Exemplos incluem o número de alunos em uma sala de aula, o número de carros em um estacionamento, etc.

No nossos dados vamos analisar a coluna “mental_health_rating”, representando a saúde mental do nossos alunos em uma escala de 1 a 10:

Row

Variáveis Quantitativas Contínuas

Variáveis quantitativas contínuas assumem valores em um intervalo contínuo e podem assumir qualquer valor dentro desse intervalo. Ao contrário das variáveis discretas, as variáveis contínuas podem assumir um número infinito de valores. Exemplos incluem altura, peso, temperatura, etc.

Vamos calcular a função densidade para o exemplo de horas de sono dos nossos estudantes:

Histograma

Row

Histograma

Os histogramas são gráficos valiosos para visualizar a distribuição de frequências em variáveis quantitativas. Vamos criar um histograma para descobrir as horas de estudos por dia que nossos estudantes gastam!

Medidas de Tendência Central

Row

Média Aritmética

A média aritmética é uma medida de tendência central que representa a soma dos valores de um conjunto dividida pelo número de elementos nesse conjunto. Vamos visualizar a média dos nossos estudantes!

Row

Mediana

A mediana é outra medida de tendência central que representa o valor que separa a metade inferior da metade superior de um conjunto de dados ordenado. Vamos visualizar a mediana da idade dos nossos estudantes!

Estatísticas Descritivas das Idades
Estatística Valor (anos)
Min. 17.000
1st Qu. 18.750
Median 20.000
Mean 20.498
3rd Qu. 23.000
Max. 24.000

Row

Moda

A moda é uma medida de tendência central que representa o valor que ocorre com mais frequência em um conjunto de dados. Um conjunto de dados pode ter uma moda (unimodal), mais de uma moda (multimodal), ou não ter moda se todos os valores ocorrerem com a mesma frequência. Vamos calcular a moda da pontuação de exame dos nossos estudantes!

a moda é de 100 pontos! ou seja esta é a pontuação que aparece com maior frequência no dataset

Medidas de dispersão

Row

Variância

A variância é uma medida de dispersão que quantifica a extensão na qual cada ponto de dados em um conjunto se desvia da média desse conjunto. Vamos visualizar como ocorre essa variação!

Média de horas de sono: 6.5 horas
Variância: 1.5 horas²
Desvio padrão: 1.2 horas
Valores variam entre 5.2 e 7.7 horas

Row

Desvio Padrão valores

O desvio padrão é uma medida de dispersão que representa a média das distâncias entre cada ponto de dados e a média do conjunto. Vamos visualizar isso observando o tempo de rede social dos estudantes!

Média de uso:  2.51 horas/dia
Intervalo típico: [ 1.33 h ;  3.68 h]
Coeficiente de Variação:  46.8 % ( Alta dispersão )

Podemos observar que ocorre uma alta variabilidade: Há estudantes usando pouquíssimo e outros muito redes sociais. É também observado que 68% dos dados estão entre 1.33h e 3.68h.

Extras

Row

Trabalhar = Menos uso de redes sociais?

Aqui vamos dar uma checada se ter um trabalho influencia o maior uso de redes sociais, usando um gráfico de caixas.

Row

Mais horas por estudo = melhor nota?

Aqui temos a dispersão da nota dos estudantes por hora de estudo!

---
title: "Análise de Dados"
output: 
  flexdashboard::flex_dashboard:
    code_folding: show
    orientation: rows
    social: menu
    source_code: embed
    css: estilo.css
---


```{r setup, include=FALSE}
library(flexdashboard)
library(tidyverse)
library(ggplot2)
library(patchwork)


# Carregar e preparar os dados
data <- read_csv("student_habits_performance.csv", locale = locale(encoding = "UTF-8"))
```

Sidebar {.sidebar}
=======================================================================
![](gojo.png){width=215px height=220px}


**Instituto Federal de Rondônia - IFRO**  
Campus Ji-Paraná  
Curso de Análise e Desenvolvimento de Sistemas

Olá! Meu nome é Lucayan Felipe Teixeira da Silva, sou estudante de Análise e Desenvolvimento de Sistemas no Instituto Federal de Rondônia (IFRO) e nasci em 18 de fevereiro de 2000.

Apresentação
=======================================================================

Row
-----------------------------------------------------------------------

### Sobre os dados {.value-box}

Dataset link: <https://www.kaggle.com/datasets/jayaantanaath/student-habits-vs-academic-performance/data>

Este é um conjunto de dados simulado que explora como os hábitos de vida afetam o desempenho acadêmico dos alunos. Com 1.000 registros sintéticos de alunos e mais de 15 recursos, incluindo horas de estudo, padrões de sono, uso de mídias sociais, qualidade da dieta, saúde mental e notas de exames finais, é perfeito para projetos de ML, análise de regressão, agrupamento e visualização de dados. Criado com base em padrões realistas para práticas educacionais.

Já se perguntou o quanto assistir à Netflix, dormir ou rolar o TikTok afeta suas notas? 👀 Este conjunto de dados simula os hábitos diários de 1.000 alunos — do tempo de estudo à saúde mental — e os compara com as notas das provas finais. É como espionar seu GPA através das lentes do estilo de vida. Perfeito para EDA, prática de ML ou apenas para curtir dados enquanto finge ser produtivo.

Colunas do dataSet:

student_id: Identificador único do aluno (ex: S1000, S1001)

age: Idade do aluno em anos (23, 20, 21)

study_hours_per_day: Horas de estudo por dia (0.0, 6.9)

social_media_hours: Horas gastas em mídias sociais (1.2, 2.8)

part_time_job: Se o aluno tem emprego de meio período (Yes/No)

attendance_percentage: Porcentagem de frequência nas aulas (85.0, 97.3)

sleep_hours: Horas de sono por noite (8.0, 4.6)

diet_quality: Qualidade da dieta (Fair, Good, Poor)

exercise_frequency: Frequência de exercícios por semana (6, 1)

parental_education_level: Nível de educação dos pais (Master, High School)

internet_quality: Qualidade da internet (Average, Poor, Good)

mental_health_rating: Autoavaliação de saúde mental (1-10)

extracurricular_participation: Participação em atividades extracurriculares (Yes/No)

exam_score: Pontuação no exame (56.2, 100.0)

Tipos de dados
=======================================================================

Row
-----------------------------------------------------------------------

### Variáveis Qualitativas Ordinais {.value-box}

As variáveis qualitativas ordinais são características que podem ser categorizadas e ordenadas, mas cuja diferença entre as categorias não é uniforme. Ou seja, existe uma relação de ordem entre as categorias, mas a distância entre elas não é quantificável de maneira precisa. Vamos explorar essa categoria de variáveis com exemplos práticos e utilização da linguagem R.

Do nosso dataframe um exemplo disso é a coluna "diet_quality", vamos ter uma ideia de como está a qualidade de alimentação de nossos estudantes!
<div style="margin-top: 10px;">

```{r}
df <- data
# Suponha que seu dataframe se chama df
data$diet_quality <- factor(data$diet_quality, levels = c("Poor", "Fair", "Good"), ordered = TRUE)

# Criar gráfico
ggplot(df, aes(x = diet_quality)) +
  geom_bar(fill = "#00FF00", color = "#00FF00") +
  theme_minimal(base_size = 14) +
  theme(
    panel.background = element_rect(fill = "black"),
    plot.background = element_rect(fill = "black"),
    panel.grid = element_line(color = "#00FF00"),
    axis.text = element_text(color = "#00FF00"),
    axis.title = element_text(color = "#00FF00"),
    plot.title = element_text(color = "#00FF00", face = "bold"),
    axis.line = element_line(color = "#00FF00")
  ) +
  labs(
    title = "Frequência de Qualidade da Dieta",
    x = "Qualidade da Dieta",
    y = "Frequência"
  )
```

</div>

Row
-----------------------------------------------------------------------

### Variáveis Qualitativas Nominais {.value-box}

As variáveis qualitativas nominais representam categorias que não possuem uma ordem intrínseca. Cada categoria é única e independente das outras. Exemplos comuns incluem cores, estados civis e tipos de animais. Vamos entender essas características e distinções com exemplos e utilização da linguagem R.

Analisando nosso DataSet iremos analisar o atributo "part_time_job" com o gráfico de pizza vamos mostrar a distribuição de estudantes com emprego de meio período

<div style="margin-top: 10px;">

```{r}

df$part_time_job <- factor(df$part_time_job)

df_pie <- as.data.frame(table(df$part_time_job))
colnames(df_pie) <- c("part_time_job", "Frequencia")
df_pie$Percent <- 100 * df_pie$Frequencia / sum(df_pie$Frequencia)

ggplot(df_pie, aes(x = "", 
                   y = Percent, 
                   fill = part_time_job)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar(theta = "y") +
  labs(
    title = "Alunos com emprego de meio período", 
    fill = "Possui emprego?"  
  ) +  
  theme(
    axis.text = element_blank(), 
    axis.title = element_blank(),
    plot.title = element_text(hjust = 0.5, color = "white", size = 14),  
    panel.background = element_rect(fill = "black"), 
    plot.background = element_rect(fill = "black"),
    legend.background = element_rect(fill = "black"), 
    legend.text = element_text(color = "white"),   
    legend.title = element_text(color = "white")
  ) +
  geom_text(aes(label = paste0(round(Percent, 1), "%")), 
            position = position_stack(vjust = 0.5), 
            color = "white", size = 4) +
  scale_fill_manual(
    values = c("Yes" = "#00FF00",  
               "No" = "#FF0000"),   
    labels = c("Yes" = "Sim", "No" = "Não")
  )


```

</div>

Row
-----------------------------------------------------------------------

### Variáveis Quantitativas Discretas {.value-box}

Variáveis quantitativas discretas representam contagens ou valores distintos e separados por unidades fixas. Ao contrário das variáveis contínuas, essas variáveis assumem valores inteiros específicos. Exemplos incluem o número de alunos em uma sala de aula, o número de carros em um estacionamento, etc.

No nossos dados vamos analisar a coluna "mental_health_rating", representando a saúde mental do nossos alunos em uma escala de 1 a 10:

<div style="margin-top: 10px;">

```{r}
ggplot(data, aes(x = factor(mental_health_rating, levels = 1:10))) +
  geom_bar(fill = "#00FF00", color = "white", alpha = 0.8) +  
  labs(
    title = "Distribuição da Classificação de Saúde Mental (1-10)",
    x = "Classificação (1 = pior, 10 = melhor)", 
    y = "Número de Alunos"
  ) +
  theme_minimal() +
  theme(
    plot.background = element_rect(fill = "black"),
    panel.background = element_rect(fill = "black"),
    text = element_text(color = "white"),  
    axis.text = element_text(color = "white"), 
    plot.title = element_text(color = "white", hjust = 0.5, face = "bold"),
    panel.grid.major = element_line(color = "#333333"),
    panel.grid.minor = element_blank()
  ) +
  scale_x_discrete(drop = FALSE) 
```

</div>

Row
-----------------------------------------------------------------------

### Variáveis Quantitativas Contínuas {.value-box}

Variáveis quantitativas contínuas assumem valores em um intervalo contínuo e podem assumir qualquer valor dentro desse intervalo. Ao contrário das variáveis discretas, as variáveis contínuas podem assumir um número infinito de valores. Exemplos incluem altura, peso, temperatura, etc.

Vamos calcular a função densidade para o exemplo de horas de sono dos nossos estudantes:

<div style="margin-top: 10px;">

```{r}

par(bg = "black", col.axis = "#00FF00", col.lab = "#00FF00", col.main = "#00FF00", fg = "#00FF00")


sleep_density <- density(data$sleep_hours, na.rm = TRUE)

plot(sleep_density,
     main = "Função Densidade de Probabilidade - Horas de Sono",
     xlab = "Horas de Sono",
     col = "#00FF00",   
     lwd = 2)

```

</div>


Histograma
=======================================================================

Row
-----------------------------------------------------------------------

### Histograma {.value-box}

Os histogramas são gráficos valiosos para visualizar a distribuição de frequências em variáveis quantitativas. Vamos criar um histograma para descobrir as horas de estudos por dia que nossos estudantes gastam!

<div style="margin-top: 10px;">

```{r}

par(bg = "black", 
    col.main = "#00FF00", 
    col.lab = "#00FF00", 
    col.axis = "#00FF00", 
    fg = "#00FF00",
    family = "sans")  

hist(df$study_hours_per_day, 
     main = "DISTRIBUIÇÃO DE HORAS DE ESTUDO",
     xlab = "Horas de estudo por dia",
     ylab = "Quantidade de Alunos",
     col = "#00FF40",      
     border = "#003300",   
     breaks = 12,          
     las = 1,               
     cex.main = 1.3,       
     cex.axis = 0.9,      
     lwd = 1.2)         


grid(col = "#005500",      
     lty = "dotted", 
     nx = NA, 
     ny = NULL)


lines(density(df$study_hours_per_day, na.rm = TRUE), 
      col = "#00FF00", 
      lwd = 2.5,
      lty = 1)


abline(v = mean(df$study_hours_per_day, na.rm = TRUE), 
       col = "#FF00FF",
       lwd = 2, 
       lty = 2)


legend("topright", 
       legend = c("Frequência", "Densidade", "Média"),
       fill = c("#00FF40", NA, NA),
       border = c("#003300", NA, NA),
       lty = c(NA, 1, 2),
       col = c(NA, "#00FF00", "#FF00FF"),
       text.col = "#00FF00",
       bg = "#111111",     
       box.lwd = 1,
       box.col = "#005500")

par(bg = "white", col.main = "black", col.lab = "black", col.axis = "black", fg = "black")
```
</div>


Medidas de Tendência Central
=========================================================================

Row
-------------------------------------------------------------------------

### Média Aritmética {.value-box}

A média aritmética é uma medida de tendência central que representa a soma dos valores de um conjunto dividida pelo número de elementos nesse conjunto.
Vamos visualizar a média dos nossos estudantes!

<div style="margin-top: 10px;">
```{r}

media_notas <- mean(df$exam_score, na.rm = TRUE)

#1 casa decimal
media_formatada <- format(round(media_notas, 1), nsmall = 1)

par(bg = "black", col.main = "#00FF00", col.lab = "#00FF00", col.axis = "#00FF00", fg = "#00FF00")

# Histograma das notas
hist(df$exam_score, 
     main = "DISTRIBUIÇÃO DAS NOTAS DOS ESTUDANTES",
     xlab = "Pontuação no Exame",
     ylab = "Número de Estudantes",
     col = "#00FF40",
     border = "#003300",
     breaks = 10,
     las = 1)

# Adicionando linha da média
abline(v = media_notas, col = "#FF00FF", lwd = 2, lty = 2)

# Resetando parâmetros gráficos
par(bg = "white", col.main = "black", col.lab = "black", col.axis = "black", fg = "black")
```
</div>


Row
-------------------------------------------------------------------------

### Mediana {.value-box}

A mediana é outra medida de tendência central que representa o valor que separa a metade inferior da metade superior de um conjunto de dados ordenado.
Vamos visualizar a mediana da idade dos nossos estudantes!

<div style="margin-top: 10px;">

```{r}
# Calculando a mediana das idades
mediana_idades <- median(df$age, na.rm = TRUE)

# Calculando também outras estatísticas descritivas
estatisticas_idades <- summary(df$age)

# Convertendo para dataframe para melhor apresentação
df_estatisticas_idades <- data.frame(
  Estatística = names(estatisticas_idades),
  Valor = as.numeric(estatisticas_idades)
)

# Versão simples apenas com kable
knitr::kable(
  df_estatisticas_idades,
  align = c('l', 'r'),
  col.names = c("Estatística", "Valor (anos)"),
  caption = "<span style='color:#00FF00'>Estatísticas Descritivas das Idades</span>",
  format = "html",
  table.attr = "style='width:80%; color:#00FF00; background-color:#000000; border:1px solid #00FF00'"
)
```

</div>

Row
-------------------------------------------------------------------------

### Moda {.value-box}

A moda é uma medida de tendência central que representa o valor que ocorre com mais frequência em um conjunto de dados. Um conjunto de dados pode ter uma moda (unimodal), mais de uma moda (multimodal), ou não ter moda se todos os valores ocorrerem com a mesma frequência. 
Vamos calcular a moda da pontuação de exame dos nossos estudantes!

<div style="margin-top: 10px;">

```{r}
# Calculando a moda das pontuações
calcular_moda <- function(x) {
  tab <- table(x)
  moda <- as.numeric(names(tab)[tab == max(tab)])
  return(moda)
}

moda_exame <- calcular_moda(df$exam_score)

# Configurando output colorido
cat(paste("a moda é de", moda_exame, "pontos! ou seja esta é a pontuação que aparece com maior frequência no dataset")
)

```
</div>


Medidas de dispersão
=========================================================================

Row
-------------------------------------------------------------------------

### Variância {.value-box}

A variância é uma medida de dispersão que quantifica a extensão na qual cada ponto de dados em um conjunto se desvia da média desse conjunto. 
Vamos visualizar como ocorre essa variação!

<div style="margin-top: 10px;">
```{r}
# Passo 1: Calcular média e variância
media <- mean(df$sleep_hours, na.rm = TRUE)
variancia <- var(df$sleep_hours, na.rm = TRUE)
desvio_padrao <- sd(df$sleep_hours, na.rm = TRUE)

# Passo 2: Calcular intervalo de variação
limite_inferior <- media - desvio_padrao
limite_superior <- media + desvio_padrao

cat("Média de horas de sono:", round(media, 1), "horas\n")
cat("Variância:", round(variancia, 1), "horas²\n")
cat("Desvio padrão:", round(desvio_padrao, 1), "horas\n")
cat("Valores variam entre", round(limite_inferior, 1), "e", round(limite_superior, 1), "horas")

```
</div>

Row
-------------------------------------------------------------------------

### Desvio Padrão valores {.value-box}

O desvio padrão é uma medida de dispersão que representa a média das distâncias entre cada ponto de dados e a média do conjunto.
Vamos visualizar isso observando o tempo de rede social dos estudantes!

<div style="margin-top: 10px;">
```{r}
# Calculando o desvio padrão
desvio_padrao_social_media <- sd(df$social_media_hours, na.rm = TRUE)
media_social_media <- mean(df$social_media_hours, na.rm = TRUE)

cat("Média de uso: ", round(media_social_media, 2), "horas/dia\n")
cat("Intervalo típico: [", 
    round(media_social_media - desvio_padrao_social_media, 2), "h ; ", 
    round(media_social_media + desvio_padrao_social_media, 2), "h]\n")
cat("Coeficiente de Variação: ", 
    round((desvio_padrao_social_media/media_social_media)*100, 1), "% (", 
    ifelse((desvio_padrao_social_media/media_social_media)*100 > 30, 
           "Alta dispersão", "Dispersão moderada"), ")")

```
</div>

Podemos observar que ocorre uma alta variabilidade: Há estudantes usando pouquíssimo e outros muito redes sociais.
É também observado que 68% dos dados estão entre 1.33h e 3.68h.

Extras
==============================================================

Row
-------------------------------------------------------------------------

### Trabalhar = Menos uso de redes sociais? {.value-box}

Aqui vamos dar uma checada se ter um trabalho influencia o maior uso de redes  sociais, usando um gráfico de caixas.

<div style="margin-top: 10px;">

```{r}
library(dplyr)

# Calcular média por grupo
medias <- df %>%
  group_by(part_time_job) %>%
  summarise(media = mean(social_media_hours, na.rm = TRUE))

# Adicionar ao gráfico
ggplot(df, aes(x = part_time_job, y = social_media_hours, fill = part_time_job)) +
  geom_boxplot() +
  geom_text(data = medias, aes(x = part_time_job, y = media, label = round(media, 1)), 
            vjust = -1, color = "white", fontface = "bold") +
  labs(title = "Uso de Mídias Sociais por Trabalho", 
       x = "Tem emprego?", y = "Horas/dia") +
  theme_minimal()

```
 
</div>

Row
-------------------------------------------------------------------------

### Mais horas por estudo = melhor nota? {.value-box}

Aqui temos a dispersão da nota dos estudantes por hora de estudo!

<div style="margin-top: 10px;">
```{r}
library(ggplot2)

ggplot(df, aes(x = study_hours_per_day, y = exam_score)) +
  geom_point(color = "blue", size = 3) +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  labs(title = "Horas de estudo por dia vs Nota no exame",
       x = "Horas de estudo por dia",
       y = "Nota no exame") +
  theme_minimal()

```
</div>