Desafio 08

library(RSQLite)
unzip("database.sqlite3.zip", exdir = ".")
#tirando o zip
conn <- dbConnect(SQLite(), dbname = "database.sqlite3")
#abrindo a conexao
dbListTables(conn)
 [1] "course_offerings"    "courses"             "grade_distributions"
 [4] "instructors"         "rooms"               "schedules"          
 [7] "sections"            "subject_memberships" "subjects"           
[10] "teachings"          
#vendo as tabelas
# Para ver colunas de uma tabela
dbListFields(conn, "subjects")
[1] "code"         "name"         "abbreviation"
###
dbListFields(conn, "course_offerings")
[1] "uuid"        "course_uuid" "term_code"   "name"       
###
dbListFields(conn, "sections")
[1] "uuid"                 "course_offering_uuid" "section_type"        
[4] "number"               "room_uuid"            "schedule_uuid"       
###
dbListFields(conn, "instructors")
[1] "id"   "name"
dbListFields(conn, "subject_memberships")
[1] "subject_code"         "course_offering_uuid"
#vendo a coluna do subject membership
# pergunta 1
query <- "
SELECT DISTINCT i.name
FROM instructors i
JOIN teachings t ON i.id = t.instructor_id
JOIN sections s ON t.section_uuid = s.uuid
JOIN course_offerings co ON s.course_offering_uuid = co.uuid
JOIN subject_memberships sm ON co.uuid = sm.course_offering_uuid
JOIN subjects subj ON sm.subject_code = subj.code
WHERE subj.abbreviation = 'STAT'
"
# Define uma query SQL que seleciona os nomes distintos de professores (i.name)
# que deram aulas de disciplinas cujo assunto tem abreviação 'STAT'.
# Faz joins entre:
# instructors -> teachings -> sections -> course_offerings -> subject_memberships -> subjects
# para relacionar cada professor às disciplinas de estatística.

professores_stat <- dbGetQuery(conn, query)
# Executa a query no banco de dados conectado via 'conn' e salva o resultado
# no data.frame 'professores_stat'.

professores_stat
                             name
1                     MINJING TAO
2                   DONALD PORTER
3                      SHENG WANG
4                   KUNLING HUANG
5                        DONG XIA
6                 JENNIFER NGUYEN
7                     SEULKEE YUN
8                      DUZHE WANG
9                     YONGFENG WU
10                    JARED BROWN
11                    YUCHEN ZHOU
12                     VICTOR LUO
13                 GUN WOONG PARK
14                    BROOK LUERS
15                     DUY NGUYEN
16                   JOHN GILLETT
17                      QUOC TRAN
18                      YAOYAO XU
19                      JIE ZHANG
20                      LONG PHAN
21                   WESLEY CHANG
22                        TONG LI
23                   SHANE HUBLER
24                       FAN YANG
25                     JU HEE CHO
26                      JEEA CHOI
27                     SHIXUE LIU
28                    WEI-YIN LOH
29                        BIN DAI
30                     XIPEI YANG
31               DOUGLAS M. BATES
32           MICHAEL GEORGE ILTIS
33                  LIAM JOHNSTON
34                   CRYSTAL CHEN
35                      YIFAN MEI
36                       RUI CHEN
37                      JILI WANG
38                    LUWAN ZHANG
39                 GINA BENNINGER
40                       JIE SONG
41                       XIWEN MA
42                       HAODA FU
43                   DEYUAN JIANG
44                 JINGJIANG PENG
45              ERICA LEE DEADMAN
46                 AKICHIKA OZEKI
47                      MENG SONG
48                       HAO TENG
49                    DONGGYU KIM
50                COLIN LONGHURST
51                FREDERICK BOEHM
52                     YONGSU LEE
53               GONZALO CONTADOR
54                       HAO CHEN
55                      XIN ZHANG
56                        BO YANG
57                    RUNGANG HAN
58                      SEAN KENT
59                     DEBRAJ DAS
60                          YI LI
61                   CLAIRE BOBST
62                      CHAN PARK
63                      SIJING LI
64                    SHENGJI JIA
65                     YUCHANG WU
66                      ZHUANG WU
67                     XIAOMAO LI
68                    HYEBIN SONG
69                      YOURAN QI
70                 YOUNG MIN PARK
71                      BIN ZHANG
72                    QIURONG CUI
73                      SEHO PARK
74                    SHENG ZHANG
75                   HUIKUN ZHANG
76                 ALYSSA DIGILIO
77                      YUQING XU
78                   STEPHEN BERG
79                    PEIGEN ZHOU
80                       YAN CHEN
81                    QIONG ZHANG
82                YOUNGDEOK HWANG
83                       HAN CHEN
84        NICHOLAS STEPHEN KEULER
85                   ZHENGXIAO WU
86                    YUJIN CHUNG
87                   WENWEN ZHANG
88                    PERLA REYES
89                        QI TANG
90                 CHIA-CHIEH LIN
91                       JIALE XU
92                      YANG ZHAO
93                    XINWEI DENG
94                       MING XIE
95                    JINGCI MENG
96                  ISMOR FISCHER
97                    JIAJIE CHEN
98                  ZUOFENG SHANG
99                      HAO ZHENG
100                         XU XU
101                       BIN ZHU
102                    QUEFENG LI
103                    YU QIU LIU
104                        JUN LI
105                       FAN GAO
106            VICTORIA MANSFIELD
107                      ANQI SHI
108                   KYLE HEBERT
109                      XIUYU MA
110                  CHENLIANG XU
111                   CHANHAN HSU
112                    YUANZHI LI
113                  KAM-WAH TSUI
114                    XINYU SONG
115                 TIMOTHY IDOWU
116                      XIAO NIE
117                    CHEN CHENG
118                 ANDREW LESLIE
119                    YAOGUO XIE
120                 KEVIN PACKARD
121                        YI LIU
122                    WENZHI CAO
123                JOSEPH DEUTSCH
124                       LAN LUO
125                      RYAN ZEA
126                ROBERT WARDROP
127                  SANGBUM CHOI
128                        XIN LI
129                 SEUNGBONG HAN
130                   ZHIGUO XIAO
131            RICHARD A. JOHNSON
132                      RUI TANG
133            IAN BRANSTAD RILEY
134                      BO HUANG
135         HEATHER MARIE BRAZEAU
136                         XU HE
137         GARY HOWARD SCHROEDER
138                     JUN ZHANG
139                     CHENXI LI
140                SONA Z SWANSON
141                    YUAN JIANG
142                    JUNHEE HAN
143                      LILUN DU
144                    XIRAN WANG
145                   ZIFENG ZHAO
146                     CUIZE HAN
147                    YING ZHANG
148                    JOHN DAVIS
149                     CHEN JING
150                    JINGLAN LI
151                       YI CHAI
152                        THU LE
153                    ALAN HUANG
154                   HAOYANG FAN
155                      BOWEN HU
156               TZU HSIANG HUNG
157                    TUN LEE NG
158               ABIGAIL BENZINE
159           ALEXANDER COVINGTON
160                 CHELSEY GREEN
161               MICHAEL KUTZLER
162                    LILI ZHENG
163                  REBECCA POST
164                       LU YANG
165                     RUOSI GUO
166                      XUN ZHAO
167                       MIN NIU
168                       JIAN WU
169                     WEI ZHENG
170                     XINJIE HE
171                       JIE WEI
172           CLAUDIA SOLIS LEMUS
173                   XUEYAO CHEN
174            MANJUSHA KANCHARLA
175              MITCHELL PAUKNER
176                    XIAOWU DAI
177               CHENGNING ZHANG
178                       GINA OH
179                      LUXI CAO
180                     SONG WANG
181                        LAM HO
182                       TIEN VO
183                  SHIZHEN WANG
184                SOHEIL SADEGHI
185                  BINGYING XIE
186                       GENG LI
187             JENNIFER BIRSTLER
188              MARIA KAMENETSKY
189                   KYLE HERBET
190                  JIANCHANG HU
191                       TRAM TA
192                     YUAN WANG
193               KAZUHIKO SHINKI
194                   SIJIAN WANG
195                CHIEN-WEI CHEN
196                BEHZAD AALIPUR
197                    DEREK BEAN
198              BEN ADAM HAALAND
199               ELOISA D CHAVAS
200                     YALI WANG
201               VARSHA KULKARNI
202           SCOTT JOSEPH HETZEL
203                  MIN JUNG LEE
204                     FANG FANG
205                KRISTEN CYFFKA
206                   TING-LI LIN
207                   BRET LARGET
208               KATHERINE GOODE
209                 ERIK NORDHEIM
210                      NING FAN
211                    ANRU ZHANG
212              GARVESH RASKUTTI
213  KRISHNAKUMAR BALASUBRAMANIAN
214                   YAZHEN WANG
215                   CHAOYANG YU
216                   YILIN ZHANG
217                ZHENGJUN ZHANG
218                  XIUFENG SHAO
219                       YUAN LI
220                   BRET HANLON
221                      LILI LAN
222                    CECILE ANE
223                ZHANG CHUNMING
224                        LEI XU
225                    MUHONG GAO
226                 AUGUST JENSEN
227                      XIAO GUO
228               THOMAS G. KURTZ
229            NICHOLAS HENDERSON
230               CHENSHENG KUANG
231                     TAERI UHM
232            NORBERT BINKIEWICZ
233                     KARL ROHE
234                   JUNGWON MUN
235                 JOSEP GINEBRA
236                        TAO YU
237                     XINXIN YU
238                      HAO ZHOU
239                     LIE XIONG
240                 QIAN ZHIGUANG
241                      SHANG WU
242                       SHAN LU
243        STEPHEN AARON STANHOPE
244                LANCINE KONATE
245 GUILHERME VIEIRA NUNES LUDWIG
246              PAUL SAVARIAPPAN
247                     CUICUI QI
248                  KJELL DOKSUM
249                  DEREK NORTON
250              KEEGAN KORTHAUER
251                   KAILEI CHEN
252       THEVAASIINEN CHANDERENG
253                     JOHN KANE
254                    SOKOL VAKO
255                       QING LI
256                     YOUNG LEE
257                HYUNSEUNG KANG
258     BEHZAD AALIPUR HAFSHEJANI
259                   SHULEI WANG
260                   ZHONGJIE YU
261                        LIN QI
262                    JIWEI ZHAO
263                  SUNDUZ KELES
264                     SHUYUN YE
265                      HUI WANG
266            KEVIN HASEGAWA ENG
267                   XIAODAN WEI
268                    MARIA ROJO
269                    RUIFENG XU
270                  YONGJOON KIM
271               NELLIE LAUGHLIN
272                 MICHAEL HOGAN
273                   KARL BROMAN
274                REBECCA KOSCIK
275                   RONGJUN ZHU
276                   BI CHENG WU
277                    YUNONG LIN
278                  ZHIGENG GENG
279                 XIAOPING FENG
280                  SHUANG HUANG
281                   GUANNAN SUN
282                  JEE YEON KIM
283              GREGORY SHINAULT
284                  TONGHAI YANG
285              TIMO SEPPALAINEN
286                 BENEDEK VALKO
287               DAVID GRIFFEATH
288                DAVID ANDERSON
289                   PHILIP WOOD
290              FLORIAN BERTRAND
291         JASON RICHARD SWANSON
292             ALEXANDER KISELEV
293              SAMUEL STECHMANN
294                  WAI TONG FAN
295                       JUN YIN
296                 STEFFEN LEMPP
297                  RUIFANG SONG
298                JAMES D KUELBS
299                  ANATOLE BECK
300                  DONGHYUN LEE
301                 ANDREJ ZLATOS
302           DANIELE CAPPELLETTI
303                 MIHAELA IFRIM
304                SEBASTIEN ROCH
305                 SCOTT HOTTOVY
306             JONATHON PETERSON
307               STEPHEN WAINGER
308                ALEXANDER FISH
309        GREGORIO MORENO-FLORES
310             SUKHENDU MEHROTRA
311           DIETRICH UHLENBROCK
312                   LEV BORISOV
313             RICHARD A BRUALDI
314                 ARNOLD MILLER
315               MATTHEW BALLARD
316                ALBRECHT KLEMM
317            PAUL M TERWILLIGER
318                    STEVEN SAM
319                       KEN ONO
320                 ROBERT HARRON
321                    YANNAN QIU
322         JOHN WILTSHIRE-GORDON
323                 KYUNGMANN KIM
324            CHRISTOPHER WAGNER
325                  PAUL RATHOUZ
326                STEPHEN WRIGHT
327                BENJAMIN RECHT
328                MICHAEL FERRIS
329           JESSE THOMAS HOLZER
330                     HUILIN HU
331               ALBERTO DEL PIA
332                ROBERT R MEYER
333                       SHI JIN
334                MARY LINDSTROM
335          ADIN-CRISTIAN ANDREI
336                  MICHAEL LIOU
337                   CHAOQUN MEI
338      CHRISTINA M. KENDZIORSKI
339                RONALD GANGNON
340            ROBERT WAYNE GREEN
341                     COLE COOK
342                MURRAY CLAYTON
343                      QI JIANG
344                       JUN ZHU
345                 ANNE BRUCKNER
346                       TING YE
347                      JUN SHAO
348                  HUAIBAO FENG
349                     ZIJIAN NI
350                   THOMAS COOK
351           RICHARD J. CHAPPELL
352                   MOO K CHUNG
353                MICHAEL NEWTON
354                 BRIAN YANDELL
355               MICHELLE HARRIS
356                 NORMAN DRAPER
357                   YU MENGGANG
358                     MING YUAN
359                 FANGFANG WANG
360                     JUNHO LEE
361                   GRACE WAHBA
362                  JASON P FINE
363          MICHAEL RENE KOSOROK
364                     YAJUAN SI
365                        LU MAO
366                  DAVID DEMETS
367                JAMES ANDERSON
368                  EDWARD ERKER
369                    SHUAI CHEN
370                    MARI PALTA
371                  GUANHUA CHEN
372  SRIKANTHMADHAVAN ARAVAMUTHAN
373         NATALIA DE LEON GATTI
374                GUILHERME ROSA
375                 YANBING ZHENG
376            CHRISTINE SORKNESS
377               MARIAN R FISHER
# Exibe o conteúdo de 'professores_stat', mostrando os nomes dos professores de STAT.

# Total de professores
nrow(professores_stat)
[1] 377
# Retorna o número de linhas do data.frame, ou seja, o total de professores distintos.
grade_values <- c("A"=4, "AB"=3.5, "B"=3, "BC"=2.5, "C"=2, "D"=1, "F"=0)
# Cria um vetor nomeado em R que associa cada nota em letra (A, AB, B, BC, C, D, F)
# ao seu valor numérico correspondente na escala americana de GPA (0 a 4).
dbListFields(conn, "grade_distributions")
 [1] "course_offering_uuid" "section_number"       "n_count"             
 [4] "c_count"              "f_count"              "cr_count"            
 [7] "p_count"              "nw_count"             "other_count"         
[10] "bc_count"             "u_count"              "d_count"             
[13] "ab_count"             "a_count"              "s_count"             
[16] "i_count"              "b_count"              "nr_count"            
# Lista todas as colunas existentes na tabela 'grade_distributions' do banco de dados
# conectado via 'conn', permitindo verificar quais campos estão disponíveis para consulta.
grades_stat3 <- dbGetQuery(conn, "
SELECT gd.course_offering_uuid,
       gd.section_number,
       gd.a_count, gd.ab_count, gd.b_count, gd.bc_count, gd.c_count, gd.d_count, gd.f_count,
       t.instructor_id,
       co.uuid AS course_offering_uuid,
       co.course_uuid,
       c.name AS course_name
FROM grade_distributions gd
JOIN sections s ON gd.section_number = s.number AND gd.course_offering_uuid = s.course_offering_uuid
JOIN teachings t ON s.uuid = t.section_uuid
JOIN course_offerings co ON s.course_offering_uuid = co.uuid
JOIN courses c ON co.course_uuid = c.uuid
JOIN subject_memberships sm ON co.uuid = sm.course_offering_uuid
JOIN subjects subj ON sm.subject_code = subj.code
WHERE subj.abbreviation = 'STAT'
")
# Executa uma query SQL no banco conectado via 'conn' e salva o resultado em 'grades_stat3'.
# A query faz o seguinte:
# - Seleciona o identificador do oferecimento (course_offering_uuid) e número da seção (section_number)
# - Seleciona a contagem de alunos por nota: a_count, ab_count, b_count, bc_count, c_count, d_count, f_count
# - Inclui o id do professor responsável (instructor_id)
# - Inclui o UUID do curso (co.uuid) e o UUID do curso real (co.course_uuid)
# - Inclui o nome do curso (course_name)
# - Faz joins entre grade_distributions -> sections -> teachings -> course_offerings -> courses
#   -> subject_memberships -> subjects para relacionar cada nota à disciplina e professor
# - Filtra apenas as disciplinas cuja abreviação do assunto é 'STAT' (estatística)
cols_count <- c("a_count","ab_count","b_count","bc_count","c_count","d_count","f_count")
# Cria um vetor com os nomes das colunas que representam a contagem de alunos por cada nota.

grades_stat3[cols_count] <- lapply(grades_stat3[cols_count], as.numeric)
# Converte todas as colunas de contagem de notas em 'grades_stat3' para o tipo numérico,
# garantindo que cálculos matemáticos possam ser feitos corretamente.
n <- nrow(grades_stat3)
# Armazena o número de linhas (seções) em 'grades_stat3' na variável 'n'.

grades_stat3$total_students <- numeric(n)
grades_stat3$gpa <- numeric(n)
# Cria duas novas colunas em 'grades_stat3':
# - total_students: para armazenar o número total de alunos por seção
# - gpa: para armazenar o GPA médio da seção

values <- c(4, 3.5, 3, 2.5, 2, 1, 0)
# Define um vetor com os valores numéricos correspondentes às notas A, AB, B, BC, C, D, F

for(i in 1:n){
  counts <- as.numeric(grades_stat3[i, cols_count])
  # Para a linha i, extrai as contagens de alunos por nota e converte para numérico

  grades_stat3$total_students[i] <- sum(counts)
  # Calcula o total de alunos na seção i somando todas as contagens

  grades_stat3$gpa[i] <- sum(counts * values) / grades_stat3$total_students[i]
  # Calcula o GPA médio ponderado da seção i:
  # multiplica cada contagem pelo valor numérico da nota, soma e divide pelo total de alunos
}
# Pegar nomes dos professores
professores <- dbGetQuery(conn, "SELECT id, name FROM instructors")
# Executa uma query no banco para obter os IDs e nomes de todos os professores,
# armazenando o resultado no data.frame 'professores'.

# GPA médio por professor
prof_ids <- unique(grades_stat3$instructor_id)
# Cria um vetor com os IDs únicos dos professores presentes em 'grades_stat3'.

gpa_prof <- data.frame(professor_id=prof_ids, gpa=NA, stringsAsFactors = FALSE)
# Cria um data.frame com uma coluna para os IDs dos professores e outra para o GPA médio,
# inicializando o GPA como NA.

for(i in seq_along(prof_ids)){
  gpa_prof$gpa[i] <- mean(grades_stat3$gpa[grades_stat3$instructor_id == prof_ids[i]])
}
# Para cada professor, calcula a média do GPA das seções que ele lecionou
# e armazena no data.frame 'gpa_prof'.

# Juntar nomes
gpa_prof <- merge(gpa_prof, professores, by.x="professor_id", by.y="id", all.x=TRUE)
# Faz um merge entre 'gpa_prof' e 'professores' para adicionar os nomes
# correspondentes aos IDs, mantendo todos os professores de 'gpa_prof'.

# Professor mais difícil (menor GPA)
prof_mais_dificil <- gpa_prof[which.min(gpa_prof$gpa), ]
# Seleciona o(s) professor(es) com o menor GPA médio, ou seja, mais difícil.

# Professor mais fácil (maior GPA)
prof_mais_facil <- gpa_prof[which.max(gpa_prof$gpa), ]
# Seleciona o(s) professor(es) com o maior GPA médio, ou seja, mais fácil.
courses <- unique(grades_stat3$course_offering_uuid)
# Cria um vetor com os IDs únicos de cada oferecimento de disciplina presentes em 'grades_stat3'.

gpa_course <- data.frame(course_offering_uuid=courses, gpa=NA, course_name=NA, stringsAsFactors = FALSE)
# Cria um data.frame para armazenar o GPA médio e o nome de cada disciplina,
# inicializando gpa e course_name como NA.

for(i in seq_along(courses)){
  idx <- which(grades_stat3$course_offering_uuid == courses[i])
  # Para cada curso, encontra os índices das linhas em 'grades_stat3' correspondentes a esse curso.

  gpa_course$gpa[i] <- mean(grades_stat3$gpa[idx])
  # Calcula o GPA médio do curso i, com base nas seções encontradas, e armazena no data.frame.

  gpa_course$course_name[i] <- grades_stat3$course_name[idx][1]  # pegar nome da disciplina
  # Atribui o nome da disciplina correspondente ao curso i,
  # pegando o primeiro valor encontrado.
}

# Disciplina mais difícil (menor GPA)
disc_mais_dificil <- gpa_course[which.min(gpa_course$gpa), ]
# Seleciona a(s) disciplina(s) com o menor GPA médio, ou seja, a mais difícil.

# Disciplina mais fácil (maior GPA)
disc_mais_facil <- gpa_course[which.max(gpa_course$gpa), ]
# Seleciona a(s) disciplina(s) com o maior GPA médio, ou seja, a mais fácil.

#vendo empate

# Definir tolerância
tol <- 1e-6
# Define uma pequena tolerância para comparação de números decimais,
# evitando problemas com precisão de ponto flutuante ao comparar GPAs.

# Professores mais difíceis (menor GPA)
gpa_min <- min(gpa_prof$gpa, na.rm=TRUE)
# Calcula o menor GPA entre os professores, ignorando valores NA.

prof_mais_dificeis <- gpa_prof[abs(gpa_prof$gpa - gpa_min) < tol, ]
# Seleciona todos os professores cujo GPA está dentro da tolerância do menor GPA,
# considerando empates.

# Professores mais fáceis (maior GPA)
gpa_max <- max(gpa_prof$gpa, na.rm=TRUE)
# Calcula o maior GPA entre os professores, ignorando valores NA.

prof_mais_faceis <- gpa_prof[abs(gpa_prof$gpa - gpa_max) < tol, ]
# Seleciona todos os professores cujo GPA está dentro da tolerância do maior GPA,
# considerando empates.

# Disciplinas mais difíceis
gpa_min_course <- min(gpa_course$gpa, na.rm=TRUE)
# Calcula o menor GPA entre as disciplinas, ignorando valores NA.

disc_mais_dificeis <- gpa_course[abs(gpa_course$gpa - gpa_min_course) < tol, ]
# Seleciona todas as disciplinas cujo GPA está dentro da tolerância do menor GPA,
# considerando empates.

# Disciplinas mais fáceis
gpa_max_course <- max(gpa_course$gpa, na.rm=TRUE)
# Calcula o maior GPA entre as disciplinas, ignorando valores NA.

disc_mais_faceis <- gpa_course[abs(gpa_course$gpa - gpa_max_course) < tol, ]
# Seleciona todas as disciplinas cujo GPA está dentro da tolerância do maior GPA,
# considerando empates.
# GPA mínimo e máximo dos professores, ignorando NAs
gpa_min <- min(gpa_prof$gpa, na.rm = TRUE)
# Calcula o menor GPA entre os professores, ignorando valores NA.

gpa_max <- max(gpa_prof$gpa, na.rm = TRUE)
# Calcula o maior GPA entre os professores, ignorando valores NA.

# Professores mais difíceis (menor GPA)
prof_mais_dificeis <- gpa_prof[!is.na(gpa_prof$gpa) & abs(gpa_prof$gpa - gpa_min) < 1e-6, ]
# Seleciona todos os professores cujo GPA não é NA e está dentro da tolerância
# do menor GPA, garantindo que empates e valores válidos sejam considerados.

# Professores mais fáceis (maior GPA)
prof_mais_faceis <- gpa_prof[!is.na(gpa_prof$gpa) & abs(gpa_prof$gpa - gpa_max) < 1e-6, ]
# Seleciona todos os professores cujo GPA não é NA e está dentro da tolerância
# do maior GPA, garantindo que empates e valores válidos sejam considerados.
# Remover NAs e repetições nos nomes
prof_mais_dificeis_names <- unique(na.omit(prof_mais_dificeis$name))
# Remove quaisquer valores NA e repetições dos nomes dos professores mais difíceis.

prof_mais_faceis_names <- unique(na.omit(prof_mais_faceis$name))
# Remove quaisquer valores NA e repetições dos nomes dos professores mais fáceis.

disc_mais_dificeis_names <- unique(na.omit(disc_mais_dificeis$course_name))
# Remove quaisquer valores NA e repetições dos nomes das disciplinas mais difíceis.


# Mostrar resultados
cat("Professor(es) mais difícil(is):", paste(prof_mais_dificeis_names, collapse=", "),
    "com GPA médio =", round(prof_mais_dificeis$gpa[1],2), "\n")
Professor(es) mais difícil(is): JAMES D KUELBS com GPA médio = 2.64 
# Exibe os nomes dos professores mais difíceis, separados por vírgula,
# junto com o GPA médio arredondado a duas casas decimais.

cat("Professor(es) mais fácil(is):", paste(prof_mais_faceis_names, collapse=", "),
    "com GPA médio =", round(prof_mais_faceis$gpa[1],2), "\n")
Professor(es) mais fácil(is): SRIKANTHMADHAVAN ARAVAMUTHAN, GUANHUA CHEN com GPA médio = 4 
# Exibe os nomes dos professores mais fáceis, separados por vírgula,
# junto com o GPA médio arredondado a duas casas decimais.

cat("Disciplina(s) mais difícil(is):", paste(disc_mais_dificeis_names, collapse=", "),
    "com GPA médio =", round(disc_mais_dificeis$gpa[1],2), "\n")
Disciplina(s) mais difícil(is): Introduction to Stochastic Processes com GPA médio = 2.44 
# Exibe os nomes das disciplinas mais difíceis, separados por vírgula,
# junto com o GPA médio arredondado a duas casas decimais.
 
# Criar tabela de GPA médio por disciplina (agrupando pelo nome da disciplina)
grades_stat3_valid <- grades_stat3[!is.na(grades_stat3$gpa), ]

gpa_course_final <- aggregate(gpa ~ course_name, data=grades_stat3_valid, FUN=function(x) mean(x, na.rm=TRUE))

# GPA máximo entre todas as disciplinas
gpa_max_course <- max(gpa_course_final$gpa, na.rm = TRUE)

# Selecionar apenas disciplina(s) mais fácil(is)
disc_mais_faceis <- gpa_course_final[gpa_course_final$gpa == gpa_max_course, ]

# Mostrar resultados
cat("Disciplina(s) mais fácil(is):", paste(disc_mais_faceis$course_name, collapse=", "), "\n")
Disciplina(s) mais fácil(is): Data Science Practicum, Empir Proc&Semiparmtrc Infernc, Nonparametric Statistics and Machine Learning Methods, Sample Survey Theory and Method 
# Criar tabela de GPA médio por disciplina (agrupando pelo nome da disciplina)
gpa_course_final <- aggregate(gpa ~ course_name, data=grades_stat3_valid, FUN=function(x) mean(x, na.rm=TRUE))

# GPA máximo entre todas as disciplinas
gpa_max_course <- max(gpa_course_final$gpa, na.rm = TRUE)

# Selecionar apenas disciplina(s) mais fácil(is)
disc_mais_faceis <- gpa_course_final[gpa_course_final$gpa == gpa_max_course, ]

# Mostrar resultados
cat("Disciplina(s) mais fácil(is):", paste(disc_mais_faceis$course_name, collapse=", "), "\n")
Disciplina(s) mais fácil(is): Data Science Practicum, Empir Proc&Semiparmtrc Infernc, Nonparametric Statistics and Machine Learning Methods, Sample Survey Theory and Method 
#calculando quando o html foi gerado
cat(paste0("Este HTML foi gerado em: ", Sys.time()))
Este HTML foi gerado em: 2025-09-24 17:26:44.304889
dbDisconnect(conn)