library(RSQLite)
# Descompactar
unzip("database.sqlite3.zip", exdir = "data_SQL")
# Conectar ao banco
<- dbConnect(SQLite(), "data_SQL/database.sqlite3") conn
Desafio 08
SQLite - Parte II
Benilton Carvalho, Guilherme Ludwig
SQLite
O SQLite é uma biblioteca embutida em um processo único que é autônomo, não necessita de servidor e exige zero de configuração. O código é de domínio público e seu uso é gratuito em qualquer tipo de utilização. Trata-se de um sistema SQL completo, capaz de utilizar múltiplas tabelas, índices, gatilhos e visões. Ele funciona, virtualmente, em qualquer plataforme (incluindo móveis) e pesa cerca de 600KB.
Objetivos
Ao fim deste laboratório, você deverá ser capaz de:
Conectar-se a um banco de dados do tipo SQLite utilizando o R como interface; Explorar quais são as tabelas disponíveis no referido banco de dados; Identificar quais são as colunas de uma dada tabela existente no banco de dados; Realizar pesquisas simples; Extrair registros do banco de dados e armazená-las em objetos do R; Realizar algumas pesquisas complexas, utilizando WHERE, INNER JOIN. Criar novas tabelas no banco de dados. Fonte do problema: Estes dados são de uma iniciativa de publicidade de desempenho de alunos e professores nas Universidades Americanas. A UW-Madison disponibilizou os seus dados online (no Office of the Registrar: https://registrar.wisc.edu/), e alguém trouxe os dados para uma competição no Kaggle (https://www.kaggle.com/Madgrades/uw-madison-courses). Nesta atividades, examinaremos disciplinas oferecidas no assunto de Estatística pela referida Universidade.
Observações
Esta tarefa não deve ser realizada no site jupyter.ime.unicamp.br ; Você deve realizar o download dos dados para o computador que estiver utilizando e, então, iniciar a atividade; Recomenda-se a utilização dos seguintes pacotes: RSQLite Toda a atividade deve ser realizada utilizando-se apenas de SQLite (i.e., não utilize dbplyr);
Atividade
- Baixe o arquivo uwmadison.sqlite3. Conecte-se a ele usando o pacote RSQLite, armazenando a conexão em uma variável conn.
- Quem são e quantos são os professores que lecionaram disciplinas cujo tópico era estatística (subjects.abbreviation=‘STAT’);
<- dbGetQuery(conn, "
professores_stat SELECT DISTINCT i.name AS professor
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 sub ON sm.subject_code = sub.code
WHERE sub.abbreviation = 'STAT';
")
<- nrow(professores_stat)
n_professores_stat
print(professores_stat)
professor
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
print(n_professores_stat)
[1] 377
# Executa a consulta SQL na conexão 'conn' e armazena o resultado em 'professores_stat' (um data.frame).
# Seleciona os nomes dos instrutores; DISTINCT evita repetir o mesmo professor várias vezes; renomeia a coluna para 'professor'.
# Indica a tabela base 'instructors' com o alias 'i'.
# Junta com 'teachings' para saber quais turmas/ensinos cada instrutor lecionou.
# Junta com 'sections' para ligar cada teaching à sua seção correspondente.
# Junta com 'course_offerings' para obter a oferta de curso associada à seção.
# Junta com 'subject_memberships' para ver que subjects (tópicos) pertencem àquela oferta de curso.
# Junta com 'subjects' para acessar atributos do subject (como 'abbreviation').
# Filtra apenas os registros cujo subject tem abreviação 'STAT' (ou seja, tópicos de Estatística).
# Fecha a string SQL e o argumento passado para dbGetQuery.
# Conta quantas linhas (professores distintos) foram retornadas pela consulta.
- O GPA americano é definido numa escala de 0 a 4, em que A = 4, AB = 3.5, B = 3, BC = 2.5, C = 2, D = 1 e F = 0. Determinando a nota média de cada oferecimento pela ponderação da quantidade de alunos em cada extrato com os valores numéricos de cada conceito, indique (no que se referente a disciplinas no assunto de estatística):
Quem é o professor mais difícil? Quem é o professor mais fácil? Qual é a disciplina mais difícil? Qual é a disciplina mais fácil?
# Seleciona nome do professor, nome da disciplina e contagem de notas por seção para o departamento STAT
<- dbGetQuery(conn, "
grades_stat SELECT i.name AS professor,
c.name AS course_name,
gd.a_count, gd.ab_count, gd.b_count, gd.bc_count,
gd.c_count, gd.d_count, gd.f_count
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 instructors i ON t.instructor_id = i.id
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'
")
# Define quais colunas contêm contagens de notas
<- c("a_count", "ab_count", "b_count", "bc_count", "c_count", "d_count", "f_count")
cols
# Converte todas essas colunas de character para numérico, garantindo que operações matemáticas funcionem
<- lapply(grades_stat[cols], as.numeric)
grades_stat[cols]
# Calcula o total de alunos em cada oferecimento (soma de todas as contagens de notas)
$total <- with(grades_stat, a_count + ab_count + b_count + bc_count + c_count + d_count + f_count)
grades_stat
# Calcula o GPA de cada seção/oferecimento
# Se total > 0, aplica a fórmula ponderada do GPA; caso contrário, atribui NA para evitar divisão por zero
$gpa <- with(grades_stat,
grades_statifelse(total > 0,
4*a_count + 3.5*ab_count + 3*b_count + 2.5*bc_count +
(2*c_count + 1*d_count + 0*f_count) / total,
NA))
# Calcula o GPA médio de cada professor usando aggregate, ignorando valores NA
<- aggregate(gpa ~ professor, data = grades_stat, mean, na.rm = TRUE)
gpa_prof
# Calcula o GPA médio de cada disciplina usando aggregate, ignorando valores NA
<- aggregate(gpa ~ course_name, data = grades_stat, mean, na.rm = TRUE)
gpa_course
# Seleciona todos os professores com o menor GPA médio (mais difícil), considerando empates
<- gpa_prof[gpa_prof$gpa == min(gpa_prof$gpa), ]
prof_mais_dificil
# Seleciona todos os professores com o maior GPA médio (mais fácil), considerando empates
<- gpa_prof[gpa_prof$gpa == max(gpa_prof$gpa), ]
prof_mais_facil
# Seleciona todas as disciplinas com o menor GPA médio (mais difícil), considerando empates
<- gpa_course[gpa_course$gpa == min(gpa_course$gpa), ]
disc_mais_dificil
# Seleciona todas as disciplinas com o maior GPA médio (mais fácil), considerando empates
<- gpa_course[gpa_course$gpa == max(gpa_course$gpa), ]
disc_mais_facil
# Exibe todos os professores mais difíceis, professores mais fáceis, disciplinas mais difíceis, disciplinas mais fáceis, separados por vírgula, com o GPA médio arredondado
cat("Professor(es) mais difícil(s):", paste(prof_mais_dificil$professor, collapse = ", "),
"com GPA médio =", round(min(prof_mais_dificil$gpa), 2), "\n")
Professor(es) mais difícil(s): JAMES D KUELBS com GPA médio = 2.64
cat("Professor(es) mais fácil(s):", paste(prof_mais_facil$professor, collapse = ", "),
"com GPA médio =", round(max(prof_mais_facil$gpa), 2), "\n")
Professor(es) mais fácil(s): GUANHUA CHEN, SRIKANTHMADHAVAN ARAVAMUTHAN, YAJUAN SI com GPA médio = 4
cat("Disciplina(s) mais difícil(s):", paste(disc_mais_dificil$course_name, collapse = ", "),
"com GPA médio =", round(min(disc_mais_dificil$gpa), 2), "\n")
Disciplina(s) mais difícil(s): Introduction to the Theory of Probability com GPA médio = 2.89
cat("Disciplina(s) mais fácil(s):", paste(disc_mais_facil$course_name, collapse = ", "),
"com GPA médio =", round(max(disc_mais_facil$gpa), 2), "\n")
Disciplina(s) mais fácil(s): Data Science Practicum, Empir Proc&Semiparmtrc Infernc, Nonparametric Statistics and Machine Learning Methods, Sample Survey Theory and Method com GPA médio = 4
#calcula quando o html foi gerado
cat(paste0("Este HTML foi gerado em: ", Sys.time()))
Este HTML foi gerado em: 2025-09-24 18:47:01.045437
- Desconecte do banco de dados.
dbDisconnect(conn)