Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions content_quiz_analysis.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from util import ReadingLogsData
from scripts import content_quiz_attempts_analysis, content_quiz_grade_analysis

if __name__ == '__main__':
reading_logs_data = ReadingLogsData()
reading_dict, quiz_dict = reading_logs_data.get_parsed_reading_log_data()
content_quiz_attempts_analysis(quiz_dict)
content_quiz_grade_analysis(quiz_dict)
3 changes: 2 additions & 1 deletion schemas/course.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ class CourseSchema:
]

@staticmethod
def page_is_valid(module_num: int, page_num: int) -> bool:
def page_is_valid(module_num: str, page_num: str) -> bool:
Comment thread
Opeyem1a marked this conversation as resolved.
module_num, page_num = int(module_num), int(page_num)
if module_num in CourseSchema.CANCELLED_MODULES or \
module_num in CourseSchema.OPTIONAL_MODULES or \
module_num in CourseSchema.SUMMARY_MODULES:
Expand Down
2 changes: 2 additions & 0 deletions scripts/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@
from .analyze_module_feedback_survey import analyze_module_feedback, compare_module_feedback
from .reading_logs import analyze_num_paragraphs, parse_reading_logs_module, parse_reading_logs_all, \
reading_logs_completion_time
from .content_quiz_analysis.analysis_on_content_quiz import content_quiz_attempts_analysis, content_quiz_grade_analysis

Empty file.
124 changes: 124 additions & 0 deletions scripts/content_quiz_analysis/analysis_on_content_quiz.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
import matplotlib.pyplot as plt
import numpy as np
from util import ReadingLogsData
from schemas import CourseSchema


def content_quiz_attempts_analysis(content_quiz_dict):
r = ReadingLogsData()

page_content_quiz_attempt_mean = []
page_content_quiz_attempt_std = []
content_quiz_attempt_pages = []

module_content_quiz_attempt_mean = []
module_content_quiz_attempt_std = []
content_quiz_attempt_modules = []

module_paragraphs_dict = r.get_module_paragraphs_dict()
for module_num, page_dict in module_paragraphs_dict.items():
for page_num, page_data in page_dict.items():
if not CourseSchema.page_is_valid(module_num, page_num):
continue

# set up for per page analysis
page_attempt = r.page_content_quiz_num_attempts(module_num, page_num)
if page_attempt is not None:
content_quiz_attempt_pages.append(str(module_num)+"-"+str(page_num))
page_content_quiz_attempt_mean.append(page_attempt[0])
page_content_quiz_attempt_std.append(page_attempt[1])

# set up for per module analysis
module_attempt = r.module_content_quiz_num_attempts(module_num)
if module_attempt is not None:
content_quiz_attempt_modules.append(str(module_num))
module_content_quiz_attempt_mean.append(module_attempt[0])
module_content_quiz_attempt_std.append(module_attempt[1])

# Per page graph
page_content_quiz_attempt_std.append(np.mean(page_content_quiz_attempt_mean))
page_content_quiz_attempt_mean.append(np.std(page_content_quiz_attempt_mean))
content_quiz_attempt_pages.append('Overall')

plt.scatter(content_quiz_attempt_pages, page_content_quiz_attempt_mean)
plt.errorbar(content_quiz_attempt_pages, page_content_quiz_attempt_mean, yerr=page_content_quiz_attempt_std,
fmt='o', ecolor="skyblue", elinewidth=0.5)
plt.xticks(fontsize=5)
plt.xlabel("Module_number-Page_number")
plt.ylabel("Number of attempts")
plt.title("Mean and Standard Deviation of Extra Attempts for Each Content Quiz")
plt.show()

# Per module graph
module_content_quiz_attempt_mean.append(np.mean(module_content_quiz_attempt_mean))
module_content_quiz_attempt_std.append(np.std(module_content_quiz_attempt_mean))
content_quiz_attempt_modules.append('Overall')

plt.scatter(content_quiz_attempt_modules, module_content_quiz_attempt_mean)
plt.errorbar(content_quiz_attempt_modules, module_content_quiz_attempt_mean, yerr=module_content_quiz_attempt_std,
fmt='o', ecolor="skyblue", elinewidth=0.5)
plt.xticks(fontsize=5)
plt.xlabel("Module_number")
plt.ylabel("Number of attempts")
plt.title("Mean and Standard Deviation of Extra Attempts for Each Module")
plt.show()


def content_quiz_grade_analysis(content_quiz_dict):
r = ReadingLogsData()

page_content_quiz_grade_mean = []
page_content_quiz_grade_std = []
content_quiz_grade_pages = []

module_content_quiz_grade_mean = []
module_content_quiz_grade_std = []
content_quiz_grade_modules = []

module_paragraphs_dict = r.get_module_paragraphs_dict()
for module_num, page_dict in module_paragraphs_dict.items():
for page_num, page_data in page_dict.items():
if not CourseSchema.page_is_valid(module_num, page_num):
continue

# set up for per page analysis
page_grade = r.page_content_quiz_first_attempt_grade(module_num=module_num, page_num=page_num)
if page_grade is not None:
content_quiz_grade_pages.append(str(module_num) + "-" + str(page_num))
page_content_quiz_grade_mean.append(page_grade[0])
page_content_quiz_grade_std.append(page_grade[1])

# set up for per module analysis
module_grade = r.module_content_quiz_first_attempt_grade(module_num)
if module_grade is not None:
content_quiz_grade_modules.append(str(module_num))
module_content_quiz_grade_mean.append(module_grade[0])
module_content_quiz_grade_std.append(module_grade[1])

# Per page graph
page_content_quiz_grade_mean.append(np.mean(page_content_quiz_grade_mean))
page_content_quiz_grade_std.append(np.std(page_content_quiz_grade_mean))
content_quiz_grade_pages.append('Overall')

plt.scatter(content_quiz_grade_pages, page_content_quiz_grade_mean)
plt.errorbar(content_quiz_grade_pages, page_content_quiz_grade_mean, yerr=page_content_quiz_grade_std,
fmt='o', ecolor="skyblue", elinewidth=0.5)
plt.xticks(fontsize=5)
plt.xlabel("Module_number-Page_number")
plt.ylabel("Number of grades")
plt.title("Mean and Standard Deviation of First Attempt Grade for Each Content Quiz")
plt.show()

# Per module graph
module_content_quiz_grade_mean.append(np.mean(module_content_quiz_grade_mean))
module_content_quiz_grade_std.append(np.std(module_content_quiz_grade_mean))
content_quiz_grade_modules.append('Overall')

plt.scatter(content_quiz_grade_modules, module_content_quiz_grade_mean)
plt.errorbar(content_quiz_grade_modules, module_content_quiz_grade_mean, yerr=module_content_quiz_grade_std,
fmt='o', ecolor="skyblue", elinewidth=0.5)
plt.xticks(fontsize=5)
plt.xlabel("Module_number")
plt.ylabel("First attempt grades")
plt.title("Mean and Standard Deviation of First Attempt Grade for Each Module")
plt.show()
16 changes: 8 additions & 8 deletions scripts/reading_logs/parse_reading_logs/parse_reading_logs.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import pandas as pd
import os
import json
import math
import os
Expand Down Expand Up @@ -104,14 +106,12 @@ def parsing_each_continue(reading_log_folder_path: str, module_number: str, data
for reading_log in os.listdir(reading_log_folder_path):
reading_log_path = os.path.join(reading_log_folder_path, reading_log)

if not reading_log.endswith('.json'):
r = ReadingLogsData()

if not r.is_reading_log_file(reading_log):
continue

reading_log_name_array = reading_log.split('-')
if '(' in reading_log and ')' in reading_log: # check for duplicate files
continue
if reading_log_name_array[0] != "COSC341": # make sure the file is a reading_log
continue
if reading_log_name_array[1] != module_number: # make sure the reading log file is for the correct module
continue

Expand Down Expand Up @@ -146,9 +146,9 @@ def parsing_each_quiz_submit(reading_log_folder_path: str, module_number: str, d
for reading_log in os.listdir(reading_log_folder_path):
reading_log_path = os.path.join(reading_log_folder_path, reading_log)

if not reading_log.endswith('.json'):
continue
if '(' in reading_log and ')' in reading_log: # check for duplicate files
r = ReadingLogsData()

if not r.is_reading_log_file(reading_log):
continue

reading_log_name_array = reading_log.split('-')
Expand Down
5 changes: 3 additions & 2 deletions util/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from .const import KEY_PATH, MODULE_PARAGRAPHS_OUTPUT_FILEPATH, CACHE_FOLDER
from .canvas_api import setup_submissions_filepath, get_quiz_id_from_file_name, DateTimeEncoder
from .data_cleaner import keep_latest_survey_attempt
from .util import normalize
from .plots import set_plot_settings

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's dangerous to auto-format __init__.py files since it can create circular imports

from .reading_logs import ReadingLogsData
from .plots import set_plot_settings
from .util import normalize
Comment thread
nononovia marked this conversation as resolved.

Loading