A assiduidade dos alunos em escolas públicas é essencial para o sucesso acadêmico, mas diferentes grupos de alunos podem enfrentar desafios únicos que afetam sua frequência escolar. Este estudo visa investigar e compreender a assiduidade dos alunos por grupo e distrito durante o ano letivo de 2021-2022. O problema central é identificar os fatores que influenciam a assiduidade dos alunos, como situação de rua, deficiência, elegibilidade para almoço grátis/a preço reduzido, status de inglês e raça/etnia, e analisar como esses fatores variam entre os diferentes grupos de alunos e distritos escolares.
A compreensão dos fatores que influenciam a assiduidade dos alunos é fundamental para desenvolver estratégias e políticas educacionais eficazes que promovam a igualdade de oportunidades e o sucesso acadêmico para todos os alunos. Ao identificar os desafios específicos enfrentados por diferentes grupos de alunos e distritos, podemos direcionar recursos e intervenções de forma mais precisa, visando melhorar a assiduidade e, consequentemente, o desempenho acadêmico.
Identificar padrões de assiduidade: Analisar os dados para ver se alguns grupos de alunos ou distritos têm taxas de frequência consistentemente altas ou baixas.
Comparar grupos e distritos: Verificar se a assiduidade varia entre os grupos de alunos (por exemplo, alunos com deficiência, alunos de inglês) e entre os distritos escolares.
Identificar fatores importantes: Descobrir quais fatores, como situação de rua, deficiência ou elegibilidade para almoço grátis, têm o maior impacto na assiduidade dos alunos.
Avaliar políticas existentes: Verificar se as políticas atuais estão ajudando a melhorar a assiduidade dos alunos ou se precisam ser ajustadas.
Sugerir melhorias futuras: Usar as descobertas para sugerir maneiras de melhorar a assiduidade dos alunos e o desempenho acadêmico.
library(tidyverse)
library(stats)
library(janitor) #
library(sgeostat)
library(mvoutlier)
library(summarytools)
library(conflicted)
library(outliers)
conflict_prefer("filter", "dplyr")
[conflicted] Removing existing preference.
[conflicted] Will prefer dplyr::filter over any other package.
conflict_prefer("lag", "dplyr")
[conflicted] Removing existing preference.
[conflicted] Will prefer dplyr::lag over any other package.
escola <- readr::read_csv("School_Attendance_by_Student_Group.csv", show_col_types = FALSE) |>
janitor::clean_names() # Padronizar os nomes das colunas
Este conjunto de dados inclui a taxa de frequência de alunos de escolas públicas PK-12 por grupo de alunos e por distrito durante o ano letivo de 2021-2022. Os grupos de estudantes (Alunos em situação de rua, Alunos com deficiência, Alunos que se qualificam para almoço grátis/a preço reduzido, Alunos de inglês, Todos os alunos com altas necessidades, Alunos com necessidades não altas, Alunos por raça/etnia (hispânicos/latinos de qualquer raça, negros ou afro-americanos, brancos, todas as outras raças)
As taxas de frequência são fornecidas para cada grupo de estudantes por distrito e por estado. Os alunos considerados de alta necessidade incluem alunos que estão aprendendo a língua inglesa, que recebem educação especial ou que se qualificam para almoço grátis e com preço reduzido.
Quando nenhum dado de frequência é exibido em uma célula, os dados foram suprimidos para salvaguardar a confidencialidade do aluno ou para garantir que as estatísticas baseadas em um tamanho de amostra muito pequeno não sejam interpretadas como igualmente representativas como aquelas baseadas em um tamanho de amostra suficientemente maior.
utils::head(escola) # Exibir as primeiras linhas do dataset
dplyr::glimpse(escola) # Visualizar a estrutura do dataset
Rows: 2,019
Columns: 12
$ district_code <chr> "00000CT", "00000CT", "00000CT", "000…
$ district_name <chr> "Connecticut", "Connecticut", "Connec…
$ category <chr> NA, "Homelessness", "Students With Di…
$ student_group <chr> "All Students", "Students Experiencin…
$ x2021_2022_student_count_year_to_date <dbl> 500285, 1814, 78417, 168984, 29905, 1…
$ x2021_2022_attendance_rate_year_to_date <dbl> 0.9169, 0.8348, 0.8899, 0.8851, 0.918…
$ x2020_2021_student_count <dbl> 496092, 1735, 76487, 176225, 30886, 2…
$ x2020_2021_attendance_rate <dbl> 0.9294, 0.8155, 0.8946, 0.8861, 0.929…
$ x2019_2020_student_count <dbl> 508346, 3916, 80365, 193706, 27507, 2…
$ x2019_2020_attendance_rate <dbl> 0.9479, 0.8884, 0.9277, 0.9314, 0.951…
$ reporting_period <chr> "June 2022", "June 2022", "June 2022"…
$ date_update <chr> "07/22/2022", "07/22/2022", "07/22/20…
escola |>
dplyr::summarise_all(~sum(is.na(.))) # Indetificar o numero de NA por coluna
Os resultados mostram que há NA no dataset, na coluna Category foram encontrados 201 NA, x2020_2021_student_count apresentou 56 NA, x2020_2021_attendance_rate tem 56 NA, x2019_2020_student_count, x2019_2020_attendance_rate e x2019_2020_attendance tem 62 cada.
Há varias formas de tratamento de valores ausentes (NA), mas para esta análise irei optar pela remoção
escola_sem_na <- escola |>
tidyr::drop_na() # remover NA
head(escola_sem_na) # visualizar primeiras linhas do dataset sem NA
escola_sem_na |>
janitor::get_dupes()
No variable names specified - using all columns.
No duplicate combinations found of: district_code, district_name, category, student_group, x2021_2022_student_count_year_to_date, x2021_2022_attendance_rate_year_to_date, x2020_2021_student_count, x2020_2021_attendance_rate, x2019_2020_student_count, ... and 3 other variables
Os resultados mostram que não há linhas duplicadas no dataset. Caso haja linhas duplicadas usa-se a seguinte codigo
escola_sem_na |>
dplyr::distinct()
# Indentificar outlieres em todo dataframe
escola_sem_na |>
select_if(is.numeric) |>
outlier()
x2021_2022_student_count_year_to_date x2021_2022_attendance_rate_year_to_date
248239.0000 0.7152
x2020_2021_student_count x2020_2021_attendance_rate
251220.0000 0.6882
x2019_2020_student_count x2019_2020_attendance_rate
266736.0000 0.8196
Os resultados mostram que há outliers no Dataset. Vamos remover os outliers
# Filtrando outliers na coluna x2021_2022_attendance_rate_year_to_date
escola_sem_outliers <- escola_sem_na |>
filter(!is.na(x2021_2022_attendance_rate_year_to_date) & x2021_2022_attendance_rate_year_to_date >= quantile(x2021_2022_attendance_rate_year_to_date, 0.25) - 1.5 * IQR(x2021_2022_attendance_rate_year_to_date) & x2021_2022_attendance_rate_year_to_date <= quantile(x2021_2022_attendance_rate_year_to_date, 0.75) + 1.5 * IQR(x2021_2022_attendance_rate_year_to_date))
escola_sem_outliers
escola_sel <- escola_sem_outliers |>
select(district_name, category, student_group, x2021_2022_student_count_year_to_date, x2021_2022_attendance_rate_year_to_date, x2021_2022_attendance_rate_year_to_date)
head(escola_sel)
escola_limpa <- escola_sel |>
dplyr::rename(nome_distrito=district_name,
categoria =category,
grupo_estudante = student_group,
contagem_anual_estudantes=x2021_2022_student_count_year_to_date,
taxa_assiduidade=x2021_2022_attendance_rate_year_to_date)
head(escola_limpa)
hist_original <- ggplot(escola_limpa, aes(x = taxa_assiduidade)) + geom_histogram(bins = 20,
fill = "skyblue",
color = "black") + ggtitle("Distribuição da taxa de asseduidade")
hist_original
Um histograma é um gráfico de barras usado para representar a distribuição de uma variável quantitativa. Ele mostra a frequência de valores dentro de intervalos de valores, chamados de “bins” ou “classes”. Cada barra no histograma representa a frequência (ou contagem) de observações que caem dentro de um determinado intervalo.
# Criar o boxplot com ggplot2
ggplot(escola_limpa, aes(y = taxa_assiduidade)) +
geom_boxplot(fill = "skyblue", color = "black") +
labs(title = "Boxplot da Taxa de Assiduidade", y = "Taxa de Assiduidade")
Foi possivel encontrar outliers nesse boxplot, por isso terei de os remove-los novamente.
# Calcular os limites dos bigodes
Q1 <- quantile(escola_limpa$taxa_assiduidade, 0.25)
Q3 <- quantile(escola_limpa$taxa_assiduidade, 0.75)
IQR <- Q3 - Q1
limite_inferior <- Q1 - 1.5 * IQR
limite_superior <- Q3 + 1.5 * IQR
# Remover outliers
escola_sem_outliers <- escola_limpa[escola_limpa$taxa_assiduidade >= limite_inferior & escola_limpa$taxa_assiduidade <= limite_superior, ]
escola_sem_outliers
# Criar o boxplot com ggplot2
ggplot(escola_sem_outliers
, aes(y = taxa_assiduidade)) +
geom_boxplot(fill = "skyblue", color = "black") +
labs(title = "Boxplot da Taxa de Assiduidade", y = "Taxa de Assiduidade")
segundo_hist <- ggplot(escola_sem_outliers, aes(x = taxa_assiduidade)) + geom_histogram(bins = 20,
fill = "skyblue",
color = "black") + ggtitle("Distribuição da taxa de asseduidade")
segundo_hist
# Criar o gráfico Q-Q normal
ggplot(escola_sem_outliers, aes(sample = taxa_assiduidade)) +
geom_qq() +
geom_qq_line() +
labs(title = "Gráfico Q-Q Normal",
x = "Quantis teóricos da distribuição normal",
y = "Quantis observados da variável")
# Criar o gráfico de densidade Q-Q
ggplot(escola_sem_outliers, aes(sample = taxa_assiduidade)) +
stat_qq(color = "red") +
geom_abline(slope = 1, intercept = 0, color = "green") +
labs(title = "Gráfico de Densidade Q-Q",
x = "Quantis teóricos da distribuição normal",
y = "Quantis observados da variável") +
theme_minimal()
resumo_estatistico <- escola_sem_outliers |>
summarytools::descr() |>
base::data.frame()
resumo_estatistico
#Agregacao por Distrito
agregado_escola_distrito <- escola_sem_outliers |>
group_by(nome_distrito) |>
summarise(media_distrito = mean(taxa_assiduidade))
agregado_escola_distrito
# Criar o gráfico de barras horizontal com cores
ggplot(agregado_escola_distrito, aes(x = media_distrito, y = nome_distrito, fill = nome_distrito)) +
geom_bar(stat = "identity") +
scale_fill_viridis_d(option = "D") + # Aplicar as cores manualmente
labs(title = "Asseduidade dos estudantes",
x = "Total de Estudantes",
y = "Categoria") +
theme_minimal()
#Agregacao - Media de taxa de asseduidade por categoria
agregado_escola_categoria <- escola_limpa |>
group_by(categoria) |>
summarise(media_categoria = mean(taxa_assiduidade))
agregado_escola_categoria
# Criar o gráfico de barras horizontal com cores
ggplot(agregado_escola_categoria , aes(x = media_categoria, y = categoria, fill = categoria)) +
geom_bar(stat = "identity") +
scale_fill_viridis_d(option = "D") + # Aplicar as cores manualmente
labs(title = "Assiduidade dos estudantes",
x = "Total de Estudantes",
y = "Categoria") +
theme_minimal()
Grafico Pizza
# Gráfico de setores
ggplot(agregado_escola_categoria, aes(x = "", y = media_categoria, fill = categoria)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y") +
scale_fill_viridis_d(option = "D") +
labs(title = "Assiduidade dos estudantes",
fill = "Categoria",
x = NULL,
y = NULL) +
theme_void()
Utilizarei métodos estatísticos, como ANOVA, regressão linear ou regressão logística, para avaliar a relação entre as categorias e a taxa de assiduidade.
ANOVA
Pressupostos da ANOVA
Analise de Normalidade
Hipótese nula (H0): Os dados seguem uma distribuição normal. (P-value ≥ 0.5)
Hipótese alternativa (H1): Os dados não seguem uma distribuição normal. (P-value < 0.5)
# Teste de Shapiro Wilk
shapiro_asseduidade <- stats::shapiro.test(escola_sem_outliers$taxa_assiduidade)
shapiro_asseduidade
Shapiro-Wilk normality test
data: escola_sem_outliers$taxa_assiduidade
W = 0.97441, p-value < 2.2e-16
O teste de normalidade de Shapiro-Wilk para a variável
taxa_assiduidade resultou em um valor de
estatística de teste (W) de aproximadamente 0.886 e um valor p muito
pequeno (menor que 2.2e-16). Isso indica que há evidências
estatisticamente significativas para rejeitar a hipótese nula de que os
dados seguem uma distribuição normal. Ou seja, a
taxa_assiduidade não segue uma
distribuição normal. Logo não se pode fazer Análise de Variaça com
amostras que não seguem uma distribuíção normal, uma das possiveis
soluções é realizar a transformação dos dados
Transformacao logaritimica para normalizar a distribuicao dos dados
asseduidade_log <- sqrt(escola_sem_outliers$taxa_assiduidade)
asseduidade_transf <- data.frame(escola_sem_outliers$categoria, asseduidade_log)
head(asseduidade_transf)