Primeiramente vamos importar as bibliotecas necessárias para esse script ser executado.
library(ggplot2)
library(plyr)
library(dplyr)
Os dados estão em um arquivo em que cada linha representa uma relação entre uma aluno e uma disciplina.
dados_alunos_ufcg = read.csv("/home/marianne-linhares/alunosUFCGAnon.csv")
names(dados_alunos_ufcg)
## [1] "Matricula" "Cod_Curso" "Cod_Disciplina"
## [4] "Cod_Evasao" "Nome_Curso" "Periodo"
## [7] "Nome_Disciplina" "Creditos" "Departamento"
## [10] "Media_Disciplina" "Situacao" "Centro"
## [13] "Campus" "Creditos_Curso" "Tipo"
## [16] "Periodo_Ingresso" "Periodo_Relativo"
summary(dados_alunos_ufcg)
## Matricula Cod_Curso Cod_Disciplina Cod_Evasao
## B32258 : 143 Min. :11104120 Min. :1105013 Min. :0.00000
## B30701 : 138 1st Qu.:13306200 1st Qu.:1301063 1st Qu.:0.00000
## B22035 : 132 Median :21204100 Median :2101046 Median :0.00000
## B25585 : 129 Mean :28575038 Mean :2815884 Mean :0.06797
## B27775 : 128 3rd Qu.:41403100 3rd Qu.:4101151 3rd Qu.:0.00000
## B28061 : 124 Max. :91402100 Max. :9101274 Max. :1.00000
## (Other):919735
## Nome_Curso Periodo
## MEDICINA VETERINÁRIA - D : 60372 Min. :2002
## MEDICINA - D : 56689 1st Qu.:2008
## ENFERMAGEM - D : 53611 Median :2011
## ENGENHARIA CIVIL - D : 42458 Mean :2010
## ENGENHARIA ELÉTRICA : 41408 3rd Qu.:2012
## CIÊNCIA DA COMPUTAÇÃO - D: 38246 Max. :2014
## (Other) :627745
## Nome_Disciplina Creditos
## CALCULO DIFERENCIAL E INTEGRAL I : 14822 Min. : 0.00
## ÁLGEBRA VETORIAL E GEOMETRIA ANALÍTICA: 13091 1st Qu.: 4.00
## FÍSICA GERAL I : 7620 Median : 4.00
## CALCULO DIFERENCIAL E INTEGRAL II : 7285 Mean : 3.89
## METODOLOGIA CIENTÍFICA : 7068 3rd Qu.: 4.00
## LINGUA PORTUGUESA : 6581 Max. :53.00
## (Other) :864062
## Departamento
## UNID. ACAD. DE EDUCAÇÃO : 89211
## UNID. ACAD. DE DIREITO : 73924
## UNID. ACAD. DE MEDICINA VETERINÁRIA : 60320
## UNID. ACAD. DE MATEMÁTICA : 55618
## UNID. ACAD. DE AGRONOMIA E TECNOLOGIA DE ALIMENTO: 38988
## UNID. ACAD. DE SISTEMAS E COMPUTAÇÃO : 36013
## (Other) :566455
## Media_Disciplina Situacao Centro
## Min. : 0.000 Aprovado :751010 Min. :11.00
## 1st Qu.: 6.000 Reprovado : 74289 1st Qu.:13.00
## Median : 7.600 Reprovado por Falta: 69216 Median :21.00
## Mean : 6.789 Trancado : 26014 Mean :28.34
## 3rd Qu.: 8.500 3rd Qu.:41.00
## Max. :10.000 Max. :91.00
## NA's :26042
## Campus Creditos_Curso Tipo Periodo_Ingresso
## Min. :1.000 Min. :120.0 Obrigatória:828078 Min. :1995
## 1st Qu.:1.000 1st Qu.:204.0 Optativa : 92451 1st Qu.:2007
## Median :2.000 Median :240.0 Median :2009
## Mean :2.641 Mean :246.6 Mean :2009
## 3rd Qu.:4.000 3rd Qu.:265.0 3rd Qu.:2011
## Max. :9.000 Max. :526.0 Max. :2014
## NA's :3332
## Periodo_Relativo
## Min. : 1.000
## 1st Qu.: 2.000
## Median : 4.000
## Mean : 4.231
## 3rd Qu.: 6.000
## Max. :28.000
##
Observando esses dados podemos identificar algumas situações em que devemos ter cuidado:
Existem algumas linhas com valores NA, e para algumas análises aqui realizadas isso pode influenciar nos resultados. Então, essas linhas devem ser cuidadosamente removidas.
Existem Disciplinas com diferentes nomes que deveriam ser “a mesma disciplina”, exemplo: GEOGRAFIA (LICENCIATURA) - N e GEOGRAFIA (LIC) - N. Isso se dá pois a mesma disciplina pode ser oferecida por vários campus, e cada campus pode usar uma nomenclatura distinta, ou simplesmente falta de padronização nos dados. Na análise aqui apresentada consideramos cada disciplina através do seu código, de forma que disciplinas diurnas, noturnas ou de campos diferentes mesmo representando “a mesma disciplina” serão consideradas disciplinas distintas. Assim, evitamos “agrupamentos” indesejados ou “separações” indesejadas.
“Em quais cursos estão as melhores e piores notas? Por que você acha que isso acontece em cada caso?”
Primeiramente, é válido dizer que nesta análise cada curso foi identificado por seu Cod_Curso, o motivo para isso já foi explicado na sessão anterior. Utilizando essa abordagem temos 95 cursos possíveis.
Seguindo com a análise, há varios modos de buscarmos essa resposta nos dados, algumas delas:
Uma delas seria utilizar apenas a mediana, porém não acho que essa solução seja a mais adequada, pois se, por exemplo, num curso X as notas são [1, 2, 2, 2, 9, 10, 10] a mediana é 2, porém esse valor não representa bem a realidade. No entanto, Utilizando um Box Plot teremos mais informações a respeito da dispersão das notas de cada curso e assim um resultado mais próximo da realidade que pode ser considerado portanto mais representativo.
Utilizando o mesmo exemplo do quesito anterior e calculando a média aparada (10%) e desvio padrão, teríamos que a média é ~5.143 e desvio padrão ~4.26. Assim sabemos que o curso X tem média aproximadamente 5, porém os dados são bastante variados. Para os dados desse exercício, é possível que encontremos desvios padrões muito grandes devido aos desistentes e reprovados que serão outliers e puxarão a média para baixo e aumentarão o desvio padrão, porém ainda sim acredito que seja possível chegar a resultados interessantes com essa abordagem ao utilizar a média aparada.
Outra forma seria definir o que faz uma nota ser considerada alta e baixa (exemplo: [8,10] são consideradas notas altas, e [0,4] notas baixas), e verificar quais cursos tem a maior porcentagem de notas localizadas nessa “região” de notas altas e baixas. O problema dessa abordagem é que dados são perdidos, por exemplo se uma disciplina tem vários 7.9, essa observação não será considerada nota alta, apesar de estar bem perto do intervalo considerado como “nota alta”.
Assim, de acordo com o que foi dito acima, escolhi utilizar as análises 1. e 2. e verificar os resultados e chegar a uma conclusão.
Vamos ordenar os cursos pela mediana da variável Media_Disciplina, “plotar” o Box Plot de todos dados e considerar os 10 primeiros valores (menores medianas) e 10 últimos (maiores medianas) para nossa análise.
# Ordenar por Mediana para um gráfico mais visual
dados_mediana_curso_graf <- dados_alunos_ufcg %>%
group_by(Cod_Curso) %>%
mutate(Mediana_Curso = median(Media_Disciplina, na.rm = T))
dados_mediana_curso_graf <- dados_mediana_curso_graf[order(dados_mediana_curso_graf$Mediana_Curso),]
# Gráfico Ordenado por Mediana
ggplot(dados_mediana_curso_graf, aes(x = factor(reorder(Cod_Curso, Mediana_Curso, na.rm = T)), y = Media_Disciplina), na.rm = T) + geom_boxplot(alpha=1/8, na.rm = T) +
theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank()) + xlab("Cursos") + ylab("Distribuição das Médias")
# Agrupar e Ordenar por Mediana
dados_mediana_curso <- aggregate(x = dados_alunos_ufcg$Media_Disciplina, by=list(Cod_Curso = factor(dados_alunos_ufcg$Cod_Curso), Nome_Curso = dados_alunos_ufcg$Nome_Curso, Campus = dados_alunos_ufcg$Campus), FUN=median, na.rm=TRUE)
# Renomeando de x para Mediana_Curso
colnames(dados_mediana_curso)[4] <- "Mediana_Curso"
# Ordenação
dados_mediana_curso <- dados_mediana_curso[order(dados_mediana_curso$Mediana_Curso),]
# 10 Maiores e Menores Medianas
menores_10_medianas_curso = dados_mediana_curso[1:10,]
maiores_10_medianas_curso = dados_mediana_curso[95:86,]
# Filtrando dados
dados_maiores_10_medianas_curso = na.omit(subset(dados_alunos_ufcg, Cod_Curso %in% maiores_10_medianas_curso[,1]))
dados_menores_10_medianas_curso = na.omit(subset(dados_alunos_ufcg, Cod_Curso %in% menores_10_medianas_curso[,1]))
# Gerando nova coluna que diferencia disciplinas com mesmo nome porém
# de campus diferentes
dados_maiores_10_medianas_curso$Nome_Curso_Campus <- paste(dados_maiores_10_medianas_curso$Nome_Curso, dados_maiores_10_medianas_curso$Campus, sep=": ")
dados_menores_10_medianas_curso$Nome_Curso_Campus <- paste(dados_menores_10_medianas_curso$Nome_Curso, dados_menores_10_medianas_curso$Campus, sep=": ")
plot_10_maiores_medianas <- ggplot(dados_maiores_10_medianas_curso, aes(x = reorder(Cod_Curso,Media_Disciplina, FUN="median"), y = Media_Disciplina, fill = Nome_Curso_Campus)) + geom_boxplot() + xlab("Código do Curso") + ylab("Distribuição das Médias") +
labs(fill = "Nome do Curso : Campus") + theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ggtitle("10 Cursos com Maiores Medianas")
plot_10_maiores_medianas
plot_10_menores_medianas <- ggplot(dados_menores_10_medianas_curso, aes(x = reorder(Cod_Curso, Media_Disciplina, FUN="median"), y = Media_Disciplina, fill = Nome_Curso_Campus)) + geom_boxplot() + xlab("Código do Curso") + ylab("Distribuição das Médias") +
labs(fill = "Nome do Curso : Campus") + theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
ggtitle("10 Cursos com Menores Medianas")
plot_10_menores_medianas
Vamos utilizar o mesmo procedimento do Box Plot: visualizar os dados dos cursos como um todo e depois selecionar os cursos com 10 maiores e menores médias.
# Agrupar e Ordenar por Média aparada e Desvio padrão para gráfico mais visual
dados_media_desvio_curso <- group_by(dados_alunos_ufcg, Cod_Curso, Campus, Nome_Curso)
dados_media_desvio_curso <- summarise(dados_media_desvio_curso,
Media_Curso = mean(Media_Disciplina,trim=0.10, na.rm= T),
Desvio_Curso = sd(Media_Disciplina, na.rm = T))
dados_media_desvio_curso <- dados_media_desvio_curso[order(dados_media_desvio_curso$Media_Curso),]
# Gerando nova coluna que diferencia disciplinas com mesmo nome porém
# de campus diferentes
dados_media_desvio_curso$Nome_Curso_Campus <- paste(dados_media_desvio_curso$Nome_Curso, dados_media_desvio_curso$Campus, sep=": ")
# Gráfico - Todos Ordenados
ggplot() +
geom_point(data = dados_media_desvio_curso, aes(x = factor(reorder(Cod_Curso, Media_Curso)), y = Media_Curso),
size = 2) +
geom_errorbar(data = dados_media_desvio_curso, aes(x = factor(Cod_Curso), ymin =
Media_Curso - Desvio_Curso, ymax = Media_Curso + Desvio_Curso),
colour = 'blue', width = 0.4) +
theme(axis.text.x=element_blank(),
axis.ticks.x=element_blank()) + xlab("Cursos") + ylab("Média") +
ggtitle("Cursos Ordenados por Média Aparada")
# Agrupar e Ordenar por Média aparada
dados_media_curso <- aggregate(x = dados_alunos_ufcg$Media_Disciplina, by=list(Cod_Curso = factor(dados_alunos_ufcg$Cod_Curso), Nome_Curso = dados_alunos_ufcg$Nome_Curso), FUN=function(x) mean(x, trim = 0.10, na.rm = T))
dados_media_curso <- dados_media_curso[order(dados_media_curso$x),]
# 10 maiores e menores Médias
dados_10_menores_medias <- dados_media_desvio_curso[1:10,]
dados_10_maiores_medias <- dados_media_desvio_curso[95:86,]
# Gráfico - 10 Maiores Médias Ordenadas
ggplot() +
geom_point(data = dados_10_maiores_medias, aes(x = factor(reorder(Nome_Curso_Campus, Media_Curso)), y = Media_Curso), size = 2) +
geom_errorbar(data = dados_10_maiores_medias, aes(x = factor(reorder(Nome_Curso_Campus, Media_Curso)), ymin = Media_Curso - Desvio_Curso, ymax = Media_Curso + Desvio_Curso), width = 0.4) + xlab("Nome do Curso : Campus") + ylab("Média") + coord_flip() + ggtitle("10 Maiores Médias Ordenadas")
# Gráfico - 10 Menores Médias Ordenadas
ggplot() +
geom_point(data = dados_10_menores_medias, aes(x = factor(reorder(Nome_Curso_Campus, -Media_Curso)), y = Media_Curso), size = 2) +
geom_errorbar(data = dados_10_menores_medias, aes(x = factor(reorder(Nome_Curso_Campus, -Media_Curso)), ymin = Media_Curso - Desvio_Curso, ymax = Media_Curso + Desvio_Curso), width = 0.4) + xlab("Nome do Curso : Campus") + ylab("Média") + coord_flip() + ggtitle("10 Menores Médias Ordenadas")
menores_10_medianas_curso
## Cod_Curso Nome_Curso Campus Mediana_Curso
## 28 11105110 FÍSICA (LIC) - D 1 0.7
## 16 15125100 ENGENHARIA DE ALIMENTOS - D 1 3.9
## 24 11134100 ESTATÍSTICA - D 1 4.2
## 51 21105210 FÍSICA (LIC) - N 2 5.0
## 80 51105210 FÍSICA (LIC) - N 5 5.0
## 27 11105150 FÍSICA (BAC) - D 1 5.1
## 43 15108100 METEOROLOGIA - D 1 5.2
## 26 13314210 FILOSOFIA (LIC) - N 1 5.4
## 25 13314250 FILOSOFIA (BAC) - N 1 6.0
## 41 11107210 MATEMÁTICA (LIC) - N 1 6.3
dados_10_menores_medias
## Source: local data frame [10 x 6]
## Groups: Cod_Curso, Campus [10]
##
## Cod_Curso Campus Nome_Curso Media_Curso Desvio_Curso
## <int> <int> <fctr> <dbl> <dbl>
## 1 11105110 1 FÍSICA (LIC) - D 2.361673 3.277094
## 2 15125100 1 ENGENHARIA DE ALIMENTOS - D 3.795978 3.114403
## 3 11134100 1 ESTATÍSTICA - D 3.879579 3.527961
## 4 51105210 5 FÍSICA (LIC) - N 4.169588 3.688588
## 5 21105210 2 FÍSICA (LIC) - N 4.314537 3.319036
## 6 11105150 1 FÍSICA (BAC) - D 4.391892 3.347933
## 7 15108100 1 METEOROLOGIA - D 4.505206 3.596768
## 8 13314210 1 FILOSOFIA (LIC) - N 4.779648 3.220512
## 9 11107210 1 MATEMÁTICA (LIC) - N 5.180718 3.389617
## 10 51107210 5 MATEMÁTICA (LIC) - N 5.279742 3.629887
## # ... with 1 more variables: Nome_Curso_Campus <chr>
Em relação aos cursos de menores notas: ambas análises obtiveram resultados similares, concordando por exemplo que Física (Código: 11105110) se destaca apresentando tanto média quanto mediana bem baixas, no entanto apresenta desvio padrão bem alto, o Blox Plot mostra uma grande dispersão dessas notas acima da mediana com poucos (ou nenhum) outliers. Devido ao baixo número de outliers a média deve representar bem os dados.
Os demais cursos seguem este mesmo resultado: poucos outliers, dados muito dispersos, e ambas as análises concordaram em geral a respeito de quais são as 10 cursos com menores notas, havendo apenas algumas trocas de posição no ranking, e uma troca de disciplina presente no ranking.
Assim, podemos perceber que alguns dos cursos com menores notas em geral são popularmente conhecidos pelo pequeno número de alunos e dificuldade do curso, como é o caso de Física e Matemática que aparece várias vezes no ranking mesmo em diferentes campus e turnos. Outras aparições foram mais surpreendentes como por exemplo Engenharia de Alimentos, que tem tanto a segunda menor mediana quanto a segunda menor média. Algumas possibilidades do que poderia diminuir a mediana ou média dos cursos são: grande número de desistência (a nota do aluno fica como 0 no sistema), uma amostra indevida dos alunos (escolheu muitos alunos desistentes ou com notas muito baixas). Mas suposições desse tipo necessitariam mais estudos e análises para serem comprovadas.
maiores_10_medianas_curso
## Cod_Curso Nome_Curso Campus Mediana_Curso
## 66 31350100 DIREITO - M 3 8.6
## 68 31350300 DIREITO - V 3 8.5
## 60 21205100 MEDICINA - D 2 8.5
## 48 12208200 PSICOLOGIA - N 1 8.5
## 44 13311150 MÚSICA (BAC) - D 1 8.5
## 50 21204100 ENFERMAGEM - D 2 8.4
## 69 31340100 SERVIÇO SOCIAL - M 3 8.3
## 67 31350200 DIREITO - N 3 8.3
## 57 21310110 LETRAS - LÍNGUA PORTUGUESA (LIC) - M 2 8.3
## 61 21312110 PEDAGOGIA (LICENCIATURA) - M 2 8.2
dados_10_maiores_medias
## Source: local data frame [10 x 6]
## Groups: Cod_Curso, Campus [10]
##
## Cod_Curso Campus Nome_Curso Media_Curso
## <int> <int> <fctr> <dbl>
## 1 31350100 3 DIREITO - M 8.533155
## 2 31350300 3 DIREITO - V 8.515662
## 3 21205100 2 MEDICINA - D 8.496193
## 4 13311150 1 MÚSICA (BAC) - D 8.492349
## 5 12208200 1 PSICOLOGIA - N 8.391074
## 6 31350200 3 DIREITO - N 8.347820
## 7 21204100 2 ENFERMAGEM - D 8.323356
## 8 31340100 3 SERVIÇO SOCIAL - M 8.249038
## 9 21310110 2 LETRAS - LÍNGUA PORTUGUESA (LIC) - M 8.188319
## 10 12205100 1 MEDICINA - D 8.168864
## # ... with 2 more variables: Desvio_Curso <dbl>, Nome_Curso_Campus <chr>
Os cursos de maiores notas apresentaram menor desvio padrão e mais outliers, devido ao grande número de outliers abaixo do resultado as médias devem estar um pouco a baixo das medianas, e as medianas devem ser mais confiáveis. Apesar disso os resultados são bem similares, havendo apenas alguns “desacordos” entre os rankings em relação a posição dos cursos. E devido à baixa dispersão dos dados podemos “falar com mais propriedade” sobre os resultados observados do que em relação às de menores notas que eram bastante dispersas.
Assim, podemos concluir a partir das análises que os cursos que provavelmente tem as maiores notas são: Direito - M do Campus 3, Direito - V do Campus 3 e Medicida - D do Campus 2. Além disso os cursos dos rankings são em sua maioria da área de saúde e humanas e algumas possibilidades para as notas serem tão altas são: baixo número de desistência, uma amostra indevida dos alunos (escolheu muitos alunos com boas notas), amostra de alunos muito pequena, ou simplesmente os alunos realmente apresentam um bom rendimento nesses cursos.
Obs: no Box Plot essa quantidade grande de 0’s devem ser consequência de várias reprovações por falta, ou desistências que estão presentes nos dados e não foram retirados para manter a consistência nos dados.
“Em qual período estão as melhores e piores notas do curso de Ciência da Computação?”
Nesta análise é considerado que a questão pede o período (2002.1, 2002.2, …) em que as disciplinas cursadas tiveram melhores notas e o período em que as disciplinas cursadas tiveram as menores notas.
Para esta análise foi utilizada a variável Cod_Curso para filtrar os dados pertencentes a Computação, em seguida os dados foram agrupados por Periodo e foi analisada a variável Media_Disciplina através de um Box Plot, perceba que estamos na mesma situação da Parte 1 e outras técnicas poderiam ter sido utilizadas. Assim, também analisei a partir da Média Aparada e Desvio Padrão para obter mais resultados (a variável Periodo representa o Período em as disciplinas foram cursadas).
# Filtro dos Dados de CC
COD_CC = 14102100
dados_alunos_cc <- subset(dados_alunos_ufcg, Cod_Curso == COD_CC, na.rm = T)
# Agrupa por Período e Calcula Média e Desvio
dados_media_cc <- group_by(dados_alunos_cc, Periodo)
dados_media_cc <- summarise(dados_media_cc,
Media_Periodo = mean(Media_Disciplina, trim=0.1, na.rm = T),
Desvio_Periodo = sd(Media_Disciplina, na.rm = T))
# Ordena dados pela Média
dados_media_cc <- dados_media_cc[order(dados_media_cc$Media_Periodo),]
# Box Plot
dados_mediana_cc <- group_by(dados_alunos_cc, Periodo)
dados_mediana_cc <- summarise(dados_mediana_cc,
Mediana_Periodo = median(Media_Disciplina, na.rm = T))
ggplot(dados_alunos_cc, aes(factor(Periodo), Media_Disciplina, na.rm = T)) + geom_boxplot(alpha=1/4, na.rm = T) + xlab("Período") + ylab("Distribuição das Notas em relação à Mediana") + theme(axis.text.x = element_text(angle = 90, hjust = 1))
# Médias e Desvio Padrão
ggplot() +
geom_point(data = dados_media_cc, aes(x = factor(Periodo), y =
Media_Periodo), size = 2) +
geom_errorbar(data = dados_media_cc, aes(x = factor(Periodo),
ymin = Media_Periodo - Desvio_Periodo, ymax = Media_Periodo + Desvio_Periodo),
colour = 'blue', width = 0.4) + xlab("Período") +
ylab("Média") + theme(axis.text.x = element_text(angle = 90, hjust = 1))
Ambas as análises indicam que o Período 2002.1 apresenta as maiores médias (Média: 8.1, Desvio Padrão: 2.1, Mediana: 8.2), além disso contém poucos outliers e desvio padrão consideravelmente abaixo dos demais, de forma que assim temos mais confiança no nosso resultado.
Já o Período de menores médias é mais difícil de afirmar com precisão, porém de todos os anos o que apresentou tanto menor média quanto menor mediana foi o ano de 2014.1 (Média: 5.84, Desvio Padrão: 3.19, Mediana: 7.0) e segundo o Box Plot também vemos uma grande concentração de notas abaixo da mediana. Ainda segundo as análises os últimos anos (2009.2 - 2014.1) vem tendo as menores médias com mediana em torno de ~7 e a média entre [6, 7] com grande desvio padrão, e poucos outliers.
“Existe correlação entre as notas de Matemática Discreta e Cáclulo I para o curso de Ciência da Computação? Se sim, a correlação é positiva ou negativa? Qual a força dessa correlação? (Dica: cada par ordenada de notas (x,y) onde x é a nota de Cálculo I e y de Matemática Discreta corresponde a um aluno que cursou as duas disciplinas).”
Essa atividade é mais direta, vamos calcular a correlação entre as notas das disciplinas indicadas e “plotar” um Scatter Plot para visualizar melhor como as variáveis estão distribuídas no plano.
Algumas questões para ter cuidado são:
E se, algum aluno reprovou/cursou múltiplas vezes em Discreta ou CALC 1, qual par de X e Y devemos considerar como notas?
Nesta análise consideramos apenas a última Nota em cada disciplina que deve ser a nota que o aluno foi aprovado na disciplina ou desistiu da disciplina.
Outras abordagens, como média, poderiam ter sido feitas, esta foi apenas a que eu achei que faz mais sentido. Já que as últimas notas do aluno refletem seu desempenho “final” na disciplina.
No caso de um aluno só ter pago uma das Disciplinas?
O na.rm cuidará disso. Exemplo de matrículas em que isso ocorre: B1975 e B2785
Pergunta: Como pode B1024 ter pago CALC 2 e reprovado CALC 1 por falta? Incoerência nos dados?
# Seleciona-se os alunos de Discreta e Calculo
COD_DISCRETA = 1109113
COD_CALCULO = 1109103
discreta = subset(dados_alunos_cc, Cod_Disciplina == COD_DISCRETA)
calculo = subset(dados_alunos_cc, Cod_Disciplina == COD_CALCULO)
# Agrupa-se os dados e escolhe-se apenas a última nota como representante do
# desempenho desse aluno
discreta = discreta %>% group_by(Matricula) %>% top_n(1, Media_Disciplina)
calculo = calculo %>% group_by(Matricula) %>% top_n(1, Media_Disciplina)
# Retiramos colunas desnecessárias
discreta = subset(discreta, select = c("Matricula", "Media_Disciplina"))
calculo = subset(calculo, select = c("Matricula", "Media_Disciplina"))
# Fazemos o Merge entre os data-frames
discreta_e_calculo = merge(calculo, discreta, by.x = "Matricula", by.y = "Matricula", na.rm = T)
# Gráfico Scatter Plot do resultado
ggplot(discreta_e_calculo, aes(Media_Disciplina.x, Media_Disciplina.y)) + geom_point(shape=19, alpha=1/4) + xlab("Média em Discreta") + ylab("Média em Cálculo")
De acordo com o Scatter Plot visualizamos uma aparente correlação positiva, consideravelmente forte (> 0.5).
E de fato se calcularmos a correlação entre as médias das disciplinas, temos:
cor(discreta_e_calculo$Media_Disciplina.x, discreta_e_calculo$Media_Disciplina.y)
## [1] 0.6927944
Portanto a correlação é forte e positiva, já que a correlação é maior que 0 e próxima de 0.7 que é um valor positivo e consideravelmente próximo de 1.