Upload 26 files
Browse files- Rekomendasi Materi Belajar/edtech/backend/data/processed/cleaned_education_data.csv +0 -0
- Rekomendasi Materi Belajar/edtech/backend/data/raw/personalized_education_data.csv +0 -0
- Rekomendasi Materi Belajar/edtech/backend/data/recommendations/evaluations/collaborative_evaluation.csv +2 -0
- Rekomendasi Materi Belajar/edtech/backend/data/recommendations/evaluations/content_based_evaluation.csv +2 -0
- Rekomendasi Materi Belajar/edtech/backend/data/recommendations/evaluations/hybrid_evaluation.csv +2 -0
- Rekomendasi Materi Belajar/edtech/backend/data/recommendations/test_data.csv +201 -0
- Rekomendasi Materi Belajar/edtech/backend/data/recommendations/train_data.csv +0 -0
- Rekomendasi Materi Belajar/edtech/backend/models/recommenders/collaborative/collab_model.joblib +3 -0
- Rekomendasi Materi Belajar/edtech/backend/models/recommenders/content_based/content_model.joblib +3 -0
- Rekomendasi Materi Belajar/edtech/backend/models/recommenders/hybrid/hybrid_model.joblib +3 -0
- Rekomendasi Materi Belajar/edtech/backend/src/app.py +193 -0
- Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/evaluations/collaborative_evaluation.csv +2 -0
- Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/evaluations/content_based_evaluation.csv +2 -0
- Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/evaluations/hybrid_evaluation.csv +2 -0
- Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/test_data.csv +201 -0
- Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/train_data.csv +0 -0
- Rekomendasi Materi Belajar/edtech/backend/src/models/recommenders/collaborative/collab_model.joblib +3 -0
- Rekomendasi Materi Belajar/edtech/backend/src/models/recommenders/content_based/content_model.joblib +3 -0
- Rekomendasi Materi Belajar/edtech/backend/src/models/recommenders/hybrid/hybrid_model.joblib +3 -0
- Rekomendasi Materi Belajar/edtech/backend/src/recommendation/collaborative.py +144 -0
- Rekomendasi Materi Belajar/edtech/backend/src/recommendation/content_based.py +198 -0
- Rekomendasi Materi Belajar/edtech/backend/src/recommendation/data_splitter.py +117 -0
- Rekomendasi Materi Belajar/edtech/backend/src/recommendation/evaluator.py +356 -0
- Rekomendasi Materi Belajar/edtech/backend/src/recommendation/hybrid.py +127 -0
- Rekomendasi Materi Belajar/edtech/backend/src/recommendation/utils.py +61 -0
- Rekomendasi Materi Belajar/edtech/backend/src/train_recommender.py +220 -0
Rekomendasi Materi Belajar/edtech/backend/data/processed/cleaned_education_data.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Rekomendasi Materi Belajar/edtech/backend/data/raw/personalized_education_data.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Rekomendasi Materi Belajar/edtech/backend/data/recommendations/evaluations/collaborative_evaluation.csv
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
RMSE,MAE,Precision@K,Recall@K,NDCG@K,model
|
| 2 |
+
0.5873683620699068,0.5249163001110007,0.19658119658119655,0.47692307692307695,0.3365554336734982,collaborative
|
Rekomendasi Materi Belajar/edtech/backend/data/recommendations/evaluations/content_based_evaluation.csv
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
RMSE,MAE,Precision@K,Recall@K,NDCG@K,model
|
| 2 |
+
0.279107926379566,0.24733157275956955,0.3350427350427351,1.0,0.6786757984354084,content_based
|
Rekomendasi Materi Belajar/edtech/backend/data/recommendations/evaluations/hybrid_evaluation.csv
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
RMSE,MAE,Precision@K,Recall@K,NDCG@K,model
|
| 2 |
+
0.279107926379566,0.24733157275956955,0.19658119658119655,0.47692307692307695,0.3365554336734982,hybrid
|
Rekomendasi Materi Belajar/edtech/backend/data/recommendations/test_data.csv
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
student_id,grade,tech_savvy,timestamp,duration_minutes,engagement_score,completion_rate,quiz_score,material_rating,interaction_duration,related_materials,material_engagement_score,feature_engagement,jam_belajar,hari_dalam_minggu,akhir_pekan,efisiensi_belajar,rasio_penyelesaian,interaksi_total,material_type_encoded,preferensi_materi,jumlah_pengakses,engagement_rata2,gender_Male,learning_style_Kinesthetic,learning_style_Visual,subject_English,subject_History,subject_Mathematics,subject_Science,click_page_English,click_page_History,click_page_Home,click_page_Math,click_page_Science,performance_label_encoded,learning_speed_encoded,student_feedback_encoded,achievement_status_encoded,is_assessment_encoded
|
| 2 |
+
STU1120,0.8,1,2025-03-26 21:15:00,0.409090909090909,0.7777777777777777,0.977777777777778,0.5847013960703209,0.75,0.3333333333333333,Video Lesson Programming,0.960166939416453,0.2525997824597098,0.8571428571428572,2,0,0.1513564189009025,0.977777777777778,0.3581081081081081,0,0.2745098039215686,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 3 |
+
STU1017,0.3999999999999999,0,2024-12-12 17:45:00,0.6454545454545454,0.8888888888888888,1.0,0.5681836543433301,0.25,0.8,Video Lesson Physics,0.2530215271532433,0.3298774180153486,0.2857142857142856,3,0,0.1131899060560181,1.0,0.602195945945946,0,0.1853496115427302,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 4 |
+
STU1002,0.0,1,2025-05-18 20:00:00,0.009090909090909,0.6666666666666665,0.8555555555555555,0.3878942605997935,0.5,0.8,Audio Lecture Modern History,0.942258990119304,0.1077354379822434,0.714285714285714,6,1,0.6969130025517146,0.8555555555555555,0.0515202702702702,1,0.5952645209027007,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,2.0,2.0,1,1
|
| 5 |
+
STU1144,0.8,1,2025-02-01 15:15:00,0.8363636363636363,0.3333333333333333,0.9555555555555556,0.625,0.25,0.5333333333333334,Interactive Exercise Ancient Civilizations,0.6156811232934086,0.5389839325506166,0.0,5,1,0.0332911489283597,0.9555555555555556,0.3310810810810811,0,0.2042175360710322,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,2.0,2.0,1,0
|
| 6 |
+
STU1187,0.0,1,2024-10-23 16:45:00,0.5454545454545454,0.7777777777777777,0.7999999999999999,0.5847013960703209,0.25,0.4666666666666667,Video Lesson Programming,0.3325434368052288,0.1845964240344895,0.1428571428571428,2,0,0.1167179028824841,0.7999999999999999,0.4594594594594595,2,0.1553829078801332,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,0.0,1,0
|
| 7 |
+
STU1043,0.5999999999999999,1,2025-06-25 15:15:00,0.5636363636363636,0.5555555555555556,0.6888888888888889,0.0,0.25,0.7333333333333334,Interactive Exercise Ancient Civilizations,0.4689347515494337,0.4543840323329537,0.0,2,0,0.0823199315255259,0.6888888888888889,0.3513513513513514,0,0.169811320754717,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 8 |
+
STU1183,0.8,1,2025-02-16 19:15:00,0.8999999999999999,0.3333333333333333,0.8333333333333334,0.375,0.5,0.0666666666666667,Interactive Exercise Algebra,0.853616654280294,0.6649625302161895,0.5714285714285712,6,1,0.0304923601195549,0.8333333333333333,0.3547297297297297,0,0.3978912319644839,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 9 |
+
STU1141,0.8,0,2024-12-08 19:15:00,0.2999999999999999,0.2222222222222222,0.9888888888888888,1.0,0.25,1.0,Video Lesson Programming,0.4664934346214637,0.3225980051157171,0.5714285714285712,6,1,0.0672438968193026,0.9888888888888888,0.0954391891891892,2,0.45338512763596,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,1
|
| 10 |
+
STU1124,0.5999999999999999,0,2025-05-13 22:15:00,0.7818181818181817,0.7777777777777777,0.977777777777778,0.5912314024085137,0.75,0.5333333333333334,Interactive Exercise Vocabulary,0.1882280420886091,0.5793840725909646,1.0,1,0,0.0823199318470881,0.977777777777778,0.6351351351351352,1,0.3740288568257491,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 11 |
+
STU1193,0.5999999999999999,0,2025-03-29 18:45:00,0.9909090909090909,1.0,0.8777777777777778,0.625,1.0,0.3333333333333333,Video Lesson World War,0.0614449211153287,0.2673617654399955,0.4285714285714284,5,1,0.0830981666850345,0.8777777777777778,0.991554054054054,2,0.2852386237513873,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,2.0,1,0
|
| 12 |
+
STU1057,0.5999999999999999,1,2024-12-02 16:45:00,0.0909090909090909,0.8888888888888888,0.9222222222222224,0.375,1.0,0.3333333333333333,Interactive Exercise Algebra,0.5500703600371556,0.0432300582306915,0.1428571428571428,0,0,0.4898035747537576,0.9222222222222224,0.1385135135135135,2,0.1908990011098779,1.0,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 13 |
+
STU1118,0.5999999999999999,0,2024-09-04 21:00:00,0.9090909090909092,0.5555555555555556,0.8444444444444444,1.0,0.5,0.8666666666666667,Audio Lecture Modern History,0.2395030187344075,0.9003797474898564,0.8571428571428572,2,0,0.0503274129549779,0.8444444444444444,0.543918918918919,0,0.2364039955604883,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,1
|
| 14 |
+
STU1080,0.5999999999999999,0,2025-03-20 20:15:00,0.4363636363636363,0.5555555555555556,0.6666666666666666,0.375,1.0,0.4666666666666667,Video Lesson Algebra,0.9762892629403518,0.1977467437259178,0.714285714285714,3,0,0.1046740504897195,0.6666666666666666,0.2804054054054054,0,0.3351831298557158,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0,2.0,0.0,0,0
|
| 15 |
+
STU1025,1.0000000000000002,0,2025-04-29 17:00:00,0.7272727272727272,0.6666666666666665,0.9222222222222224,0.5912314024085137,0.75,0.1333333333333333,Audio Lecture Literature,0.0922904626904395,0.2129170895751014,0.2857142857142856,1,0,0.0761459368976383,0.9222222222222224,0.5185810810810811,1,0.4200887902330743,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 16 |
+
STU1050,0.5999999999999999,0,2025-03-28 18:30:00,0.7545454545454545,0.6666666666666665,0.8111111111111111,0.0,0.25,0.6000000000000001,Video Lesson Algebra,0.6371149246219355,0.6176354132885155,0.4285714285714284,4,0,0.0733576811730414,0.811111111111111,0.5363175675675677,0,0.2008879023307436,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0.0,1.0,0,1
|
| 17 |
+
STU1119,0.5999999999999999,1,2024-08-03 18:15:00,0.2181818181818181,0.5555555555555556,0.9222222222222224,0.5912314024085137,0.5,0.0666666666666667,Interactive Exercise Vocabulary,0.0799998736256766,0.1431947951612596,0.4285714285714284,5,1,0.1858251365622197,0.9222222222222224,0.1587837837837838,2,0.2613762486126526,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 18 |
+
STU1048,1.0000000000000002,1,2025-06-20 17:45:00,0.109090909090909,0.3333333333333333,0.9888888888888888,0.375,0.0,0.0,Interactive Exercise Algebra,0.5235556486108981,0.9963034216649884,0.2857142857142856,4,0,0.1917680159890264,0.9888888888888888,0.0608108108108108,2,0.3063263041065482,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 19 |
+
STU1143,0.1999999999999999,0,2025-06-25 16:45:00,0.4272727272727272,1.0,0.9111111111111112,0.625,0.5,0.2,Video Lesson World War,0.9829341963520212,0.5315303809355705,0.1428571428571428,2,0,0.1846782667821868,0.9111111111111112,0.4679054054054055,0,0.3310210876803552,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 20 |
+
STU1046,0.5999999999999999,0,2025-03-14 16:45:00,0.0818181818181818,0.4444444444444445,0.8333333333333334,0.5681836543433301,1.0,0.5333333333333334,Video Lesson Physics,0.9491244657566036,0.6830796202090033,0.1428571428571428,4,0,0.2821623856589356,0.8333333333333333,0.0667229729729729,0,0.1305956344802071,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 21 |
+
STU1164,0.8,1,2025-05-13 20:00:00,0.1545454545454545,0.6666666666666665,0.8999999999999999,0.5912314024085137,0.0,0.3999999999999999,Audio Lecture Literature,0.3191023304436176,0.711409198479234,0.714285714285714,1,0,0.2778297623423536,0.9000000000000001,0.1461148648648648,2,0.3129855715871253,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 22 |
+
STU1126,1.0000000000000002,1,2024-02-07 16:00:00,0.7,0.3333333333333333,0.8444444444444444,0.1207988624612208,0.75,0.0,Audio Lecture Chemistry,0.4429276831831524,0.0549890514854965,0.1428571428571428,2,0,0.0408051385700341,0.8444444444444444,0.2804054054054054,2,0.3779134295227524,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0,1.0,2.0,0,1
|
| 23 |
+
STU1168,0.0,0,2024-10-21 17:30:00,0.609090909090909,1.0,0.8222222222222222,0.375,0.5,0.1333333333333333,Interactive Exercise Algebra,0.3883763493819835,0.1926571057052733,0.2857142857142856,0,0,0.1340371613940268,0.8222222222222222,0.6368243243243243,0,0.3657047724750277,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 24 |
+
STU1158,0.5999999999999999,0,2024-07-03 21:00:00,0.0181818181818181,1.0,0.8555555555555555,0.625,0.75,0.2666666666666666,Video Lesson World War,0.6824886824968809,0.0647585482649579,0.8571428571428572,2,0,0.9158091743913784,0.8555555555555555,0.0878378378378378,1,0.5001849796522383,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,0.0,1,0
|
| 25 |
+
STU1091,0.3999999999999999,0,2024-09-29 22:00:00,0.7454545454545454,0.2222222222222222,0.9666666666666666,0.5847013960703209,0.75,0.5333333333333334,Video Lesson Programming,0.6806446031211876,0.4663394241295531,1.0,6,1,0.0259486741446228,0.9666666666666666,0.2195945945945946,0,0.1831298557158712,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 26 |
+
STU1121,1.0000000000000002,0,2025-02-18 15:30:00,0.7454545454545454,0.2222222222222222,0.9888888888888888,0.625,0.75,0.0666666666666667,Audio Lecture Modern History,0.9198735763978956,0.0384393650376045,0.0,1,0,0.0259486741446228,0.9888888888888888,0.2195945945945946,2,0.3079911209766925,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 27 |
+
STU1173,0.0,0,2024-12-25 18:00:00,0.9272727272727272,0.3333333333333333,0.8333333333333334,0.0,0.5,0.4666666666666667,Interactive Exercise Ancient Civilizations,0.3011587474359719,0.2087357000960709,0.4285714285714284,2,0,0.0293999757110805,0.8333333333333333,0.3648648648648649,2,0.4413614502404736,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,2.0,0.0,0,1
|
| 28 |
+
STU1155,0.1999999999999999,1,2025-06-29 16:30:00,0.6454545454545454,0.6666666666666665,0.7333333333333333,0.5912314024085137,1.0,0.1333333333333333,Video Lesson Grammar,0.7560720048047218,0.1397250197943573,0.1428571428571428,6,1,0.0857499288226175,0.7333333333333333,0.4653716216216216,2,0.4520902700702922,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 29 |
+
STU1068,1.0000000000000002,0,2025-01-03 22:45:00,0.1818181818181818,0.2222222222222222,0.6777777777777778,0.5681836543433301,0.25,0.8666666666666667,Interactive Exercise Biology,0.33277656825806,0.8052497769406544,1.0,4,0,0.1008419139685898,0.6777777777777777,0.0625,1,0.2047724750277469,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0,2.0,1.0,0,0
|
| 30 |
+
STU1146,1.0000000000000002,0,2024-08-07 21:00:00,0.709090909090909,0.5555555555555556,0.7222222222222222,0.5847013960703209,0.0,0.7333333333333334,Video Lesson Programming,0.7437976259548672,0.8836880616022553,0.8571428571428572,2,0,0.065481763895085,0.7222222222222222,0.4324324324324324,1,0.4334073251942286,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 31 |
+
STU1037,0.0,1,2024-11-19 17:45:00,0.1272727272727272,0.8888888888888888,0.8222222222222222,0.0139607032057917,0.5,0.0,Audio Lecture Calculus,0.8698855222250614,0.5246296719978385,0.2857142857142856,1,0,0.4064546505186224,0.8222222222222222,0.1689189189189189,1,0.2669256381798002,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0,1
|
| 32 |
+
STU1112,0.0,0,2024-11-05 19:30:00,0.1181818181818181,0.6666666666666665,0.9888888888888888,0.5681836543433301,0.5,0.1333333333333333,Video Lesson Physics,0.863229162957669,0.9783208901452084,0.5714285714285712,1,0,0.3279375434396915,0.9888888888888888,0.1224662162162162,1,0.0488346281908989,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1,1.0,0.0,1,0
|
| 33 |
+
STU1139,1.0000000000000002,0,2025-05-12 19:15:00,0.6454545454545454,1.0,0.8333333333333334,0.5681836543433301,0.0,0.8666666666666667,Audio Lecture Chemistry,0.3467422872761973,0.0246006528410567,0.5714285714285712,0,0,0.1269098946727184,0.8333333333333333,0.6706081081081082,2,0.2802441731409545,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1,0.0,1.0,1,0
|
| 34 |
+
STU1024,0.8,1,2024-05-06 18:45:00,0.3727272727272727,0.6666666666666665,0.7777777777777778,0.5681836543433301,1.0,1.0,Interactive Exercise Biology,0.8958564158902083,0.7623066120152141,0.4285714285714284,0,0,0.1422439984895389,0.7777777777777778,0.2880067567567568,0,0.1176470588235294,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 35 |
+
STU1190,0.8,0,2025-02-24 19:00:00,0.809090909090909,0.7777777777777777,0.9888888888888888,0.5847013960703209,1.0,0.3333333333333333,Video Lesson Programming,0.7397095740941637,0.9809790634754756,0.5714285714285712,0,0,0.0795135705620603,0.9888888888888888,0.6554054054054055,2,0.7918978912319644,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 36 |
+
STU1030,0.1999999999999999,1,2025-06-28 15:30:00,0.6545454545454544,0.4444444444444445,0.8666666666666667,0.5912314024085137,1.0,0.6000000000000001,Video Lesson Grammar,0.4898163483934529,0.0896283653779353,0.0,5,1,0.0574733669276692,0.8666666666666667,0.3327702702702703,1,0.3701442841287459,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 37 |
+
STU1129,0.5999999999999999,0,2024-11-16 21:30:00,0.1818181818181818,0.6666666666666665,0.6888888888888889,0.5912314024085137,1.0,0.6000000000000001,Interactive Exercise Vocabulary,0.618762185876628,0.5457748043851429,0.8571428571428572,5,1,0.2490177879190889,0.6888888888888889,0.1638513513513513,0,0.0904550499445061,0.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,2.0,0,0
|
| 38 |
+
STU1185,1.0000000000000002,0,2024-04-09 15:45:00,0.0818181818181818,0.6666666666666665,0.8555555555555555,0.5681836543433301,0.75,0.0,Audio Lecture Chemistry,0.8701004058743459,0.7327727578802335,0.0,1,0,0.3991433365202236,0.8555555555555555,0.0988175675675675,0,0.7531631520532742,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 39 |
+
STU1036,0.0,1,2025-06-18 22:30:00,0.0,0.2222222222222222,0.8999999999999999,0.0,0.75,0.2666666666666666,Video Lesson Physics,0.780568739243086,0.0744037756165882,1.0,2,0,0.3231057026679597,0.9000000000000001,0.0118243243243243,1,0.0011098779134295,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0,1.0,0.0,0,1
|
| 40 |
+
STU1137,1.0000000000000002,1,2025-05-08 21:30:00,0.6272727272727272,0.3333333333333333,0.8222222222222222,0.0,0.25,0.9333333333333332,Interactive Exercise Ancient Civilizations,0.4761078569851258,0.1083383983410264,0.8571428571428572,3,0,0.0459793288907981,0.8222222222222222,0.2533783783783784,1,0.4953755086940437,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,2.0,1.0,0,1
|
| 41 |
+
STU1034,1.0000000000000002,0,2024-08-04 19:15:00,0.6,0.5555555555555556,0.977777777777778,1.0,0.5,0.2666666666666666,Audio Lecture Literature,0.0221610398186905,0.497156751025593,0.5714285714285712,6,1,0.0774457251149333,0.977777777777778,0.3716216216216216,0,0.750832408435072,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,1
|
| 42 |
+
STU1004,0.1999999999999999,0,2025-04-01 22:15:00,0.9818181818181818,0.5555555555555556,0.8111111111111111,0.625,0.75,0.6000000000000001,Audio Lecture Modern History,0.4122156422994131,0.7469371277223724,1.0,1,0,0.0462177584508725,0.811111111111111,0.5844594594594595,0,0.5929522752497225,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 43 |
+
STU1111,0.1999999999999999,1,2024-10-14 19:15:00,0.0181818181818181,0.3333333333333333,0.9222222222222224,0.5912314024085137,0.5,0.3999999999999999,Interactive Exercise Vocabulary,0.2184673302996833,0.2683455788349927,0.5714285714285712,0,0,0.3601496748599807,0.9222222222222224,0.027027027027027,2,0.2119866814650388,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 44 |
+
STU1179,0.3999999999999999,0,2025-02-16 16:30:00,0.1727272727272727,0.6666666666666665,0.7111111111111111,0.375,0.25,0.4666666666666667,Interactive Exercise Algebra,0.3099497570088037,0.5203153578770995,0.1428571428571428,6,1,0.2579594351767347,0.7111111111111111,0.1579391891891892,0,0.0588235294117647,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0,0.0,2.0,0,0
|
| 45 |
+
STU1022,0.1999999999999999,0,2025-05-15 15:15:00,0.6818181818181818,0.8888888888888888,0.7999999999999999,0.0,0.5,0.1333333333333333,Audio Lecture Modern History,0.098896608886692,0.8721432131441298,0.0,3,0,0.1073790874161311,0.7999999999999999,0.6326013513513514,0,0.6052534221235665,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,2.0,0,1
|
| 46 |
+
STU1049,0.1999999999999999,0,2024-12-22 21:30:00,0.2636363636363636,0.2222222222222222,0.8555555555555555,0.5912314024085137,1.0,0.8666666666666667,Interactive Exercise Vocabulary,0.2478926713512718,0.7149425802800202,0.8571428571428572,6,1,0.0751960902885887,0.8555555555555555,0.085304054054054,2,0.2175360710321865,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 47 |
+
STU1010,1.0000000000000002,1,2025-06-02 21:00:00,0.8999999999999999,0.6666666666666665,0.9111111111111112,0.5681836543433301,0.5,1.0,Video Lesson Physics,0.1199020962243293,0.8529707467367437,0.8571428571428572,0,0,0.0610791238299345,0.9111111111111112,0.6309121621621622,0,0.2397336293007769,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1,0.0,1.0,1,0
|
| 48 |
+
STU1196,0.3999999999999999,0,2025-03-21 18:45:00,0.4909090909090908,0.8888888888888888,1.0,0.375,1.0,0.2,Video Lesson Algebra,0.7471945889417827,0.4262280404364546,0.4285714285714284,4,0,0.1459892533303274,1.0,0.472972972972973,0,0.1576026637069922,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,2.0,2.0,1,0
|
| 49 |
+
STU1060,0.5999999999999999,0,2025-04-15 21:15:00,0.1272727272727272,0.6666666666666665,0.9111111111111112,0.5847013960703209,0.0,0.5333333333333334,Interactive Exercise Algorithms,0.0838563414768952,0.8772177576113912,0.8571428571428572,1,0,0.3138447300713097,0.9111111111111112,0.1283783783783783,1,0.1664816870144283,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,0
|
| 50 |
+
STU1078,1.0000000000000002,1,2025-04-23 17:30:00,0.6909090909090908,0.5555555555555556,0.7999999999999999,0.0,0.0,0.4666666666666667,Interactive Exercise Vocabulary,0.463388508770417,0.5596722779247028,0.2857142857142856,2,0,0.0672438977208595,0.7999999999999999,0.4222972972972973,1,0.2663706992230854,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0.0,1.0,0,1
|
| 51 |
+
STU1182,0.5999999999999999,0,2024-04-05 19:30:00,0.9545454545454544,0.4444444444444445,0.8555555555555555,1.0,0.25,0.9333333333333332,Video Lesson World War,0.9279368332894496,0.6973685141024625,0.5714285714285712,4,0,0.0380282294626315,0.8555555555555555,0.4721283783783784,2,0.2386237513873474,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,1.0,0.0,1,1
|
| 52 |
+
STU1102,0.1999999999999999,1,2024-09-13 21:30:00,0.7909090909090908,0.7777777777777777,0.7777777777777778,0.625,0.75,0.8,Audio Lecture Modern History,0.0541301191185069,0.3556697927728817,0.8571428571428572,4,0,0.0813651903791847,0.7777777777777778,0.641891891891892,0,0.4961154273029966,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,0
|
| 53 |
+
STU1162,0.0,1,2025-04-30 22:45:00,0.6272727272727272,0.5555555555555556,0.7999999999999999,1.0,0.25,0.8,Interactive Exercise Biology,0.8852629747698798,0.4603281445721182,1.0,2,0,0.0741139890833395,0.7999999999999999,0.3868243243243243,2,0.4017758046614873,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1,1.0,1.0,1,1
|
| 54 |
+
STU1083,0.3999999999999999,0,2024-04-20 17:00:00,0.5272727272727272,1.0,0.8222222222222222,0.375,1.0,0.0,Interactive Exercise Algebra,0.9719071470554048,0.6561177491926868,0.2857142857142856,5,1,0.1531392842895073,0.8222222222222222,0.5608108108108109,0,0.345541990381058,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,1.0,1,0
|
| 55 |
+
STU1045,0.1999999999999999,0,2025-05-07 16:00:00,0.7636363636363636,0.4444444444444445,0.977777777777778,0.5847013960703209,0.75,0.8666666666666667,Interactive Exercise Algorithms,0.8764148874962948,0.6976298620700548,0.1428571428571428,2,0,0.0488227255190223,0.977777777777778,0.3834459459459459,1,0.5837957824639289,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,1.0,1,0
|
| 56 |
+
STU1132,0.5999999999999999,1,2025-05-13 20:00:00,0.2727272727272727,0.7777777777777777,0.7,0.6549896587383661,1.0,0.1333333333333333,Video Lesson Grammar,0.2017747564177291,0.5702238525564925,0.714285714285714,1,0,0.2119738212836626,0.7,0.2567567567567568,2,0.4384017758046615,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,0.0,0,1
|
| 57 |
+
STU1062,0.0,0,2025-03-27 18:15:00,0.1545454545454545,0.5555555555555556,0.8555555555555555,0.625,0.75,0.2666666666666666,Interactive Exercise Ancient Civilizations,0.999751898897204,0.6700251659915546,0.4285714285714284,3,0,0.2366697975085482,0.8555555555555555,0.1233108108108108,0,0.4365519792822789,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,2.0,1,0
|
| 58 |
+
STU1093,0.8,0,2025-07-02 22:30:00,0.3909090909090909,0.6666666666666665,0.7888888888888889,0.5681836543433301,1.0,0.2666666666666666,Video Lesson Physics,0.2353119697328168,0.8192941209847273,1.0,2,0,0.1364879989761116,0.788888888888889,0.2998310810810811,2,0.4064927857935627,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 59 |
+
STU1035,0.8,1,2025-05-18 16:15:00,0.4999999999999999,0.8888888888888888,0.7999999999999999,0.5681836543433301,0.75,0.0,Video Lesson Physics,0.5334118199438668,0.7306796134847616,0.1428571428571428,6,1,0.1435849572930918,0.7999999999999999,0.4805743243243243,0,0.3662597114317425,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 60 |
+
STU1061,0.3999999999999999,0,2025-06-24 18:15:00,0.8545454545454545,1.0,0.7,0.5912314024085137,0.5,0.2,Interactive Exercise Vocabulary,0.1737465714942065,0.9561324328176752,0.4285714285714284,1,0,0.0965676124467685,0.7,0.8648648648648649,1,0.4839067702552719,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,2.0,2.0,0,0
|
| 61 |
+
STU1178,0.8,0,2025-03-06 21:15:00,0.5272727272727272,0.4444444444444445,0.977777777777778,0.1742179420889353,0.0,0.0,Video Lesson Algebra,0.671580893639549,0.4349141365957127,0.8571428571428572,3,0,0.0714246463976114,0.977777777777778,0.2736486486486487,2,0.6051054384017758,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,0.0,0,1
|
| 62 |
+
STU1152,0.0,1,2024-05-03 17:15:00,0.5636363636363636,0.7777777777777777,0.9222222222222224,0.5847013960703209,0.25,0.3999999999999999,Video Lesson Programming,0.8009502761050026,0.3595029220529698,0.2857142857142856,4,0,0.1131899058654627,0.9222222222222224,0.472972972972973,2,0.516093229744728,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 63 |
+
STU1130,0.8,1,2025-05-09 19:15:00,0.8181818181818181,0.7777777777777777,0.977777777777778,0.375,0.75,0.6000000000000001,Interactive Exercise Algebra,0.7812548454605317,0.2922597218493973,0.5714285714285712,4,0,0.0786155349504772,0.977777777777778,0.6621621621621622,2,0.4528301886792452,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,0.0,1,0
|
| 64 |
+
STU1039,0.3999999999999999,1,2024-02-23 17:45:00,0.609090909090909,0.2222222222222222,0.8555555555555555,0.625,0.75,0.3333333333333333,Audio Lecture Modern History,0.5784410904302985,0.7305150380584934,0.2857142857142856,4,0,0.0330081543722089,0.8555555555555555,0.1815878378378378,0,0.8718091009988901,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 65 |
+
STU1169,0.0,0,2025-02-14 21:30:00,0.1999999999999999,0.7777777777777777,0.8777777777777778,0.375,0.5,0.6666666666666667,Audio Lecture Calculus,0.7574014153590986,0.0387008588734111,0.8571428571428572,4,0,0.2675397727417134,0.8777777777777778,0.2027027027027027,1,0.1048834628190898,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,0.0,1,0
|
| 66 |
+
STU1163,0.5999999999999999,0,2025-04-29 21:15:00,0.1181818181818181,1.0,0.7666666666666666,0.5912314024085137,0.75,0.0666666666666667,Video Lesson Grammar,0.2149865273803909,0.5515320928153924,0.8571428571428572,1,0,0.4728922012685383,0.7666666666666667,0.1807432432432432,2,0.2608213096559378,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 67 |
+
STU1071,0.1999999999999999,0,2025-01-18 17:15:00,0.8181818181818181,0.2222222222222222,0.8999999999999999,0.5912314024085137,0.25,0.7333333333333334,Interactive Exercise Vocabulary,0.5395308031186095,0.1620419707429955,0.2857142857142856,5,1,0.0230495809225011,0.9000000000000001,0.2398648648648648,0,0.5529966703662597,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,0
|
| 68 |
+
STU1180,0.0,0,2025-04-05 21:30:00,0.4727272727272726,0.4444444444444445,0.8444444444444444,0.5847013960703209,0.0,0.3999999999999999,Video Lesson Programming,0.5998070977990106,0.3671534600087269,0.8571428571428572,5,1,0.0793325144531519,0.8444444444444444,0.2483108108108108,1,0.1176470588235293,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,1.0,1,0
|
| 69 |
+
STU1104,0.8,0,2025-06-16 15:15:00,0.4454545454545454,0.8888888888888888,0.7777777777777778,0.375,0.25,0.4666666666666667,Video Lesson Algebra,0.3941452429342989,0.5381183709118588,0.0,0,0,0.1592332569045487,0.7777777777777778,0.4349662162162162,0,0.1365149833518312,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 70 |
+
STU1134,0.3999999999999999,0,2024-06-29 19:00:00,0.3181818181818181,0.3333333333333333,1.0,0.625,0.25,0.1333333333333333,Interactive Exercise Ancient Civilizations,0.1541879195806367,0.3349567351585688,0.5714285714285712,5,1,0.088493925570314,1.0,0.1385135135135135,0,0.169811320754717,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 71 |
+
STU1086,1.0000000000000002,1,2024-09-13 21:15:00,0.0909090909090909,0.2222222222222222,0.8555555555555555,0.5912314024085137,0.25,0.6000000000000001,Video Lesson Grammar,0.0899127563010276,0.5516249646953622,0.8571428571428572,4,0,0.1564078639217295,0.8555555555555555,0.0371621621621621,1,0.0554938956714761,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 72 |
+
STU1005,0.1999999999999999,0,2024-07-14 17:15:00,0.6636363636363636,0.5555555555555556,0.9222222222222224,0.375,0.0,0.8666666666666667,Interactive Exercise Algebra,0.6575863781694877,0.5850497181319968,0.2857142857142856,6,1,0.0700463274177631,0.9222222222222224,0.4070945945945946,0,0.3144654088050315,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 73 |
+
STU1194,0.5999999999999999,1,2024-12-30 15:15:00,0.8727272727272727,0.4444444444444445,0.7888888888888889,0.5912314024085137,0.75,0.3999999999999999,Video Lesson Grammar,0.3079248658964315,0.7783637005137007,0.0,0,0,0.0421307198825348,0.788888888888889,0.4341216216216216,2,0.3712541620421753,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 74 |
+
STU1177,1.0000000000000002,1,2025-06-04 22:45:00,0.7909090909090908,0.4444444444444445,0.8333333333333334,0.5912314024085137,0.75,0.6666666666666667,Audio Lecture Literature,0.5165302648769683,0.6312857041311745,1.0,2,0,0.0469944971766338,0.8333333333333333,0.3961148648648649,0,0.295227524972253,0.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,0
|
| 75 |
+
STU1081,0.3999999999999999,1,2024-12-19 22:45:00,0.4999999999999999,0.5555555555555556,0.8777777777777778,0.1207988624612208,0.25,0.8666666666666667,Video Lesson Grammar,0.4074329431073227,0.1453703219947636,1.0,3,0,0.0922933076972997,0.8777777777777778,0.3158783783783784,0,0.3629300776914539,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,2.0,1.0,0,1
|
| 76 |
+
STU1042,1.0000000000000002,0,2024-10-02 22:00:00,0.7454545454545454,0.3333333333333333,0.9555555555555556,0.0,0.25,0.5333333333333334,Audio Lecture Literature,0.8879926229715808,0.0758193749228285,1.0,2,0,0.0380282293575919,0.9555555555555556,0.2972972972972973,0,0.4001109877913429,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,0.0,2.0,0,1
|
| 77 |
+
STU1114,0.8,0,2025-06-12 22:15:00,0.1636363636363636,0.7777777777777777,0.7111111111111111,0.0,1.0,0.8666666666666667,Video Lesson Programming,0.7663790808151407,0.4695206573089047,1.0,3,0,0.3072297376436429,0.7111111111111111,0.1756756756756756,2,0.0721420643729189,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 78 |
+
STU1004,0.1999999999999999,0,2023-11-13 15:15:00,0.0454545454545454,0.2222222222222222,0.7111111111111111,0.625,0.25,0.4666666666666667,Video Lesson World War,0.9605329164644928,0.1305403418980681,0.0,0,0,0.211973812022671,0.7111111111111111,0.0244932432432432,0,0.5929522752497225,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,2.0,0,0
|
| 79 |
+
STU1195,0.3999999999999999,0,2025-04-01 16:45:00,0.9909090909090909,0.8888888888888888,0.9333333333333332,0.5912314024085137,0.0,0.0,Video Lesson Grammar,0.2064632042796024,0.0258756522852011,0.1428571428571428,1,0,0.0737593508671026,0.9333333333333332,0.8910472972972974,0,0.6034036256011839,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 80 |
+
STU1128,0.1999999999999999,1,2024-11-08 17:00:00,0.4909090909090908,0.8888888888888888,0.9666666666666666,0.0,1.0,0.6000000000000001,Video Lesson Grammar,0.115165082376858,0.2300868156515395,0.2857142857142856,4,0,0.1459892533303274,0.9666666666666666,0.472972972972973,1,0.1576026637069922,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,0.0,0,1
|
| 81 |
+
STU1073,0.3999999999999999,1,2025-04-15 21:30:00,0.7999999999999999,0.3333333333333333,0.7888888888888889,0.625,0.0,0.5333333333333334,Video Lesson World War,0.5815590307458806,0.1455647876458446,0.8571428571428572,1,0,0.0350699709682756,0.788888888888889,0.3175675675675675,1,0.5396781354051055,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 82 |
+
STU1149,0.8,0,2024-12-26 20:00:00,0.4909090909090908,0.8888888888888888,0.7777777777777778,0.5912314024085137,0.25,0.3999999999999999,Audio Lecture Literature,0.502395279658993,0.8565515269084977,0.714285714285714,3,0,0.1459892533303274,0.7777777777777778,0.472972972972973,0,0.6362375138734739,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 83 |
+
STU1103,0.5999999999999999,0,2025-06-23 19:45:00,0.1363636363636363,0.4444444444444445,0.9888888888888888,0.5681836543433301,0.75,0.1333333333333333,Audio Lecture Chemistry,0.3312744672188638,0.2233126629000416,0.5714285714285712,0,0,0.2119738179497055,0.9888888888888888,0.0920608108108108,1,0.3621901590825009,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,0.0,1,0
|
| 84 |
+
STU1090,1.0000000000000002,0,2025-01-01 22:30:00,0.7636363636363636,0.7777777777777777,0.7777777777777778,1.0,0.0,0.2666666666666666,Audio Lecture Literature,0.924121163158115,0.608683679320681,1.0,2,0,0.0842903557270064,0.7777777777777778,0.6216216216216217,1,0.3736588975212727,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,2.0,1,1
|
| 85 |
+
STU1014,0.8,1,2025-05-01 16:30:00,0.7545454545454545,0.6666666666666665,0.9222222222222224,0.5912314024085137,1.0,0.5333333333333334,Audio Lecture Literature,0.6967344336519914,0.1366916308696201,0.1428571428571428,3,0,0.0733576811730414,0.9222222222222224,0.5363175675675677,1,0.2108768035516093,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,0.0,1,0
|
| 86 |
+
STU1087,0.8,1,2024-12-04 20:45:00,0.1636363636363636,0.8888888888888888,0.9555555555555556,0.5847013960703209,0.0,0.8666666666666667,Video Lesson Programming,0.4755514297496868,0.4458960690279354,0.714285714285714,2,0,0.3469197037858838,0.9555555555555556,0.1993243243243243,2,0.0643729189789123,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 87 |
+
STU1099,0.1999999999999999,1,2025-06-26 15:45:00,0.9454545454545454,0.6666666666666665,0.9333333333333332,1.0,0.5,0.4666666666666667,Video Lesson Grammar,0.5389727679953009,0.9068310888403972,0.0,3,0,0.0579488995010672,0.9333333333333332,0.660472972972973,0,0.2508324084350721,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,0.0,1,1
|
| 88 |
+
STU1106,0.8,0,2024-09-10 18:15:00,0.6818181818181818,0.7777777777777777,0.7555555555555555,1.0,0.0,0.5333333333333334,Interactive Exercise Biology,0.3805373591782654,0.9038559500606316,0.4285714285714284,1,0,0.0943047453149738,0.7555555555555555,0.5608108108108109,0,0.4095449500554938,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,1
|
| 89 |
+
STU1184,0.3999999999999999,0,2025-06-27 17:00:00,0.1545454545454545,0.5555555555555556,0.8444444444444444,0.625,0.25,0.3333333333333333,Interactive Exercise Ancient Civilizations,0.0352295821414593,0.0085139403873748,0.2857142857142856,4,0,0.2366697975085482,0.8444444444444444,0.1233108108108108,0,0.0488346281908989,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,1.0,1.0,1,0
|
| 90 |
+
STU1038,0.0,1,2024-11-02 19:15:00,0.1363636363636363,0.8888888888888888,0.7333333333333333,0.625,0.5,0.2,Interactive Exercise Ancient Civilizations,0.04332716332248,0.633162199718396,0.5714285714285712,5,1,0.3897848655048975,0.7333333333333333,0.1765202702702702,2,0.0643729189789123,1.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 91 |
+
STU1109,0.3999999999999999,0,2025-06-18 18:15:00,0.209090909090909,0.5555555555555556,0.7555555555555555,0.375,0.25,0.8666666666666667,Video Lesson Algebra,0.4731776123086155,0.7827902660005365,0.4285714285714284,2,0,0.1917680190505113,0.7555555555555555,0.1537162162162162,0,0.0776914539400665,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,2.0,1,0
|
| 92 |
+
STU1160,0.5999999999999999,1,2025-04-23 17:30:00,0.2454545454545454,0.3333333333333333,0.8222222222222222,0.625,0.5,0.1333333333333333,Audio Lecture Modern History,0.2013385801297555,0.2062260742804656,0.2857142857142856,2,0,0.1098526097637762,0.8222222222222222,0.1114864864864864,1,0.0632630410654827,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 93 |
+
STU1066,0.3999999999999999,1,2025-03-15 16:15:00,0.4454545454545454,1.0,0.7,0.625,0.5,0.6000000000000001,Interactive Exercise Ancient Civilizations,0.0520714765706797,0.997306502962102,0.1428571428571428,5,1,0.178069173393308,0.7,0.4847972972972973,1,0.1453940066592675,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,0.0,0,0
|
| 94 |
+
STU1159,0.0,1,2025-04-17 15:00:00,0.3545454545454545,0.6666666666666665,0.7,0.625,1.0,0.3333333333333333,Video Lesson World War,0.4970724698649821,0.6033949399699028,0.0,3,0,0.1484698755046771,0.7,0.2761824324324324,2,0.2835738068812431,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,0.0,0,0
|
| 95 |
+
STU1098,0.1999999999999999,1,2024-11-29 20:15:00,0.0999999999999999,0.2222222222222222,0.8111111111111111,0.0,0.25,0.1333333333333333,Video Lesson Physics,0.9608184809245712,0.0959806308299899,0.714285714285714,4,0,0.1484698711846809,0.811111111111111,0.0396959459459459,2,0.4450610432852386,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0,0.0,0.0,0,1
|
| 96 |
+
STU1101,1.0000000000000002,0,2025-06-22 17:30:00,0.2363636363636363,0.8888888888888888,0.9111111111111112,0.5847013960703209,0.75,0.0,Video Lesson Programming,0.0668025338896292,0.6963024171446645,0.2857142857142856,6,1,0.2675397737064,0.9111111111111112,0.2601351351351352,0,0.0921198668146503,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,0.0,1,0
|
| 97 |
+
STU1148,1.0000000000000002,0,2025-04-13 18:15:00,0.1999999999999999,0.2222222222222222,0.8777777777777778,0.0673797828335063,0.25,0.1333333333333333,Video Lesson Physics,0.5221223618549242,0.0602062893752324,0.4285714285714284,6,1,0.0938961700942147,0.8777777777777778,0.0675675675675675,1,0.0876803551609322,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 98 |
+
STU1003,0.8,1,2025-06-20 15:00:00,0.9818181818181818,0.8888888888888888,0.8111111111111111,0.625,0.75,0.1333333333333333,Video Lesson World War,0.320523694056688,0.1477637206859045,0.0,4,0,0.0744716334234509,0.811111111111111,0.883445945945946,1,0.8706992230854607,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 99 |
+
STU1047,0.0,1,2025-05-04 20:30:00,0.6636363636363636,0.6666666666666665,0.8333333333333334,1.0,0.5,0.8,Video Lesson Algebra,0.7510430679411558,0.1276554701954296,0.714285714285714,6,1,0.0834357139031044,0.8333333333333333,0.4771959459459459,0,0.4334073251942286,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,0.0,1,1
|
| 100 |
+
STU1089,0.5999999999999999,0,2024-10-17 20:15:00,0.3727272727272727,0.6666666666666665,0.7999999999999999,0.625,0.0,0.3999999999999999,Video Lesson World War,0.7530187183365914,0.5859029228243289,0.714285714285714,3,0,0.1422439984895389,0.7999999999999999,0.2880067567567568,2,0.336662967073622,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 101 |
+
STU1167,0.0,0,2025-06-15 21:45:00,0.5363636363636363,1.0,0.7111111111111111,1.0,0.75,0.0,Video Lesson World War,0.7893580812552008,0.3811237015088908,0.8571428571428572,6,1,0.1507707440950834,0.7111111111111111,0.5692567567567568,0,0.318534961154273,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,1.0,0.0,0,1
|
| 102 |
+
STU1085,0.0,0,2024-10-17 18:45:00,0.509090909090909,0.5555555555555556,0.8444444444444444,1.0,1.0,0.9333333333333332,Video Lesson Grammar,0.8848119967564771,0.7230077728671821,0.4285714285714284,3,0,0.0907390153088559,0.8444444444444444,0.3209459459459459,1,0.2397336293007769,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,1.0,1,1
|
| 103 |
+
STU1189,1.0000000000000002,1,2025-03-02 20:00:00,0.2181818181818181,0.4444444444444445,0.7,0.5847013960703209,0.75,0.5333333333333334,Audio Lecture Data Structures,0.805779872236121,0.5860663676351006,0.714285714285714,6,1,0.1531392818861357,0.7,0.1300675675675675,0,0.1165371809100999,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0,0
|
| 104 |
+
STU1175,0.0,0,2025-06-17 20:45:00,0.5818181818181818,0.5555555555555556,0.9888888888888888,0.5912314024085137,0.0,0.0,Video Lesson Grammar,0.0834336676290356,0.186259618686583,0.714285714285714,1,0,0.0798169606669225,0.9888888888888888,0.3614864864864865,1,0.1498335183129855,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 105 |
+
STU1067,0.3999999999999999,0,2024-12-29 18:15:00,0.609090909090909,0.3333333333333333,0.8777777777777778,0.375,1.0,0.4666666666666667,Interactive Exercise Algebra,0.7713209186249291,0.6592753500528468,0.4285714285714284,6,1,0.04744086966104,0.8777777777777778,0.2466216216216216,1,0.1587125416204217,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 106 |
+
STU1151,0.3999999999999999,1,2025-04-28 17:30:00,0.609090909090909,0.8888888888888888,0.977777777777778,1.0,0.0,0.8,Video Lesson Grammar,0.0051463801049845,0.3219907415819122,0.2857142857142856,0,0,0.1196044461051956,0.977777777777778,0.5717905405405406,2,0.3618201997780245,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,2.0,1,1
|
| 107 |
+
STU1125,1.0000000000000002,0,2025-05-29 16:30:00,0.6909090909090908,0.6666666666666665,0.7222222222222222,0.625,0.5,0.2666666666666666,Audio Lecture Modern History,0.7686346332670541,0.2495534803915156,0.1428571428571428,3,0,0.0801662125900501,0.7222222222222222,0.4949324324324324,0,0.1886792452830188,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 108 |
+
STU1188,0.5999999999999999,1,2024-10-02 22:30:00,0.0545454545454545,0.6666666666666665,0.6666666666666666,0.5681836543433301,0.0,0.0666666666666667,Audio Lecture Chemistry,0.4579452966893717,0.2886455481256465,1.0,2,0,0.4759120807248974,0.6666666666666666,0.081081081081081,0,0.2003329633740288,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0,1.0,1.0,0,0
|
| 109 |
+
STU1012,0.5999999999999999,1,2025-04-25 19:45:00,0.9727272727272726,1.0,0.7666666666666666,0.375,0.75,0.2666666666666666,Interactive Exercise Algebra,0.7282514176574155,0.7639109794034082,0.5714285714285712,4,0,0.0846945454436863,0.7666666666666667,0.9746621621621624,2,0.2774694783573806,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,1.0,1,0
|
| 110 |
+
STU1166,0.1999999999999999,1,2024-02-14 22:30:00,0.7181818181818181,0.8888888888888888,0.6888888888888889,0.375,0.75,0.0,Audio Lecture Calculus,0.6749396270385014,0.3180004377626736,1.0,2,0,0.1020905895469944,0.6888888888888889,0.6630067567567568,2,0.3921568627450981,1.0,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0.0,1.0,0,0
|
| 111 |
+
STU1018,1.0000000000000002,0,2024-09-11 17:00:00,0.5818181818181818,1.0,0.7888888888888889,1.0,1.0,1.0,Audio Lecture Chemistry,0.4872194626850976,0.0058985050143313,0.2857142857142856,2,0,0.1398882621077272,0.788888888888889,0.6114864864864865,2,0.1853496115427303,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,0.0,1,1
|
| 112 |
+
STU1019,0.3999999999999999,0,2025-04-06 22:45:00,0.9090909090909092,0.7777777777777777,0.8666666666666667,0.5681836543433301,1.0,0.0666666666666667,Video Lesson Physics,0.2091923119954345,0.868276856073035,1.0,6,1,0.0705332144380654,0.8666666666666667,0.7297297297297298,2,0.686644469108398,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1,1.0,0.0,1,0
|
| 113 |
+
STU1059,0.1999999999999999,1,2024-09-18 19:30:00,0.3545454545454545,0.0,0.1444444444444445,0.5681836543433301,0.0,0.6666666666666667,Interactive Exercise Biology,0.3948864234287349,0.5687780347297534,0.5714285714285712,2,0,0.0123899895055672,0.1444444444444445,0.0278716216216216,1,0.3013318534961154,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0,2.0,2.0,0,0
|
| 114 |
+
STU1029,0.5999999999999999,0,2025-04-02 21:30:00,0.0272727272727272,0.7777777777777777,0.8777777777777778,1.0,0.0,1.0,Audio Lecture Data Structures,0.3560479024967615,0.583860696511781,0.8571428571428572,2,0,0.6735986276974907,0.8777777777777778,0.0743243243243243,0,0.097669256381798,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,2.0,1,1
|
| 115 |
+
STU1055,0.8,1,2025-04-11 17:45:00,0.7,0.7777777777777777,0.8222222222222222,0.625,0.25,0.3999999999999999,Video Lesson World War,0.3073348536793754,0.7051310433971978,0.2857142857142856,4,0,0.0919002686343527,0.8222222222222222,0.5743243243243243,2,0.4324824269330374,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,1.0,0.0,1,0
|
| 116 |
+
STU1028,0.1999999999999999,1,2025-05-13 16:15:00,0.5363636363636363,0.7777777777777777,0.8111111111111111,0.3344751809720789,0.75,0.6000000000000001,Interactive Exercise Algebra,0.2630913902310068,0.1193146249188182,0.1428571428571428,1,0,0.1185585969772098,0.811111111111111,0.4527027027027027,2,0.5235849056603774,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,1.0,2.0,1,1
|
| 117 |
+
STU1140,0.0,1,2024-09-18 20:00:00,0.5363636363636363,0.3333333333333333,0.8666666666666667,0.5912314024085137,0.0,0.1333333333333333,Video Lesson Grammar,0.7303054770558202,0.1851266429469031,0.714285714285714,2,0,0.0541343027414627,0.8666666666666667,0.2195945945945946,1,0.4961154273029966,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,2.0,0.0,1,0
|
| 118 |
+
STU1032,1.0000000000000002,1,2025-06-05 15:45:00,0.4818181818181818,1.0,0.8666666666666667,0.5847013960703209,0.5,0.1333333333333333,Interactive Exercise Algorithms,0.904528548419776,0.71430965510493,0.0,3,0,0.1661098615267832,0.8666666666666667,0.5185810810810811,2,0.2003329633740288,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 119 |
+
STU1165,1.0000000000000002,1,2025-03-25 19:45:00,0.4181818181818181,0.8888888888888888,0.8111111111111111,0.625,0.5,0.5333333333333334,Audio Lecture Modern History,0.1905722150675996,0.281206242727938,0.5714285714285712,1,0,0.1683148593351719,0.811111111111111,0.4121621621621621,2,0.1331853496115427,1.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 120 |
+
STU1000,0.0,1,2024-09-25 15:30:00,0.4363636363636363,0.4444444444444445,0.6888888888888889,0.5847013960703209,0.25,0.4666666666666667,Audio Lecture Data Structures,0.3478720728004227,0.6738459925422966,0.0,2,0,0.0855133768257188,0.6888888888888889,0.2314189189189189,2,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0.0,2.0,0,0
|
| 121 |
+
STU1001,0.1999999999999999,1,2025-06-10 19:30:00,0.1454545454545454,0.6666666666666665,0.977777777777778,0.5847013960703209,1.0,0.1333333333333333,Audio Lecture Data Structures,0.0810566746333176,0.3464105490123374,0.5714285714285712,1,0,0.2889112909098579,0.977777777777778,0.1402027027027027,0,0.1361450240473548,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 122 |
+
STU1064,0.1999999999999999,0,2025-01-18 19:45:00,0.7818181818181817,0.7777777777777777,1.0,0.625,0.0,0.7333333333333334,Interactive Exercise Ancient Civilizations,0.6105559126258934,0.6520067508910071,0.5714285714285712,5,1,0.0823199318470881,1.0,0.6351351351351352,2,0.7142064372918979,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,1.0,1,0
|
| 123 |
+
STU1051,0.5999999999999999,0,2024-04-23 20:00:00,0.409090909090909,0.4444444444444445,0.9111111111111112,0.625,0.25,1.0,Video Lesson World War,0.3151205368639675,0.5581962140132246,0.714285714285714,1,0,0.0907390150027074,0.9111111111111112,0.21875,2,0.1759156492785794,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,0.0,1,0
|
| 124 |
+
STU1013,0.3999999999999999,0,2025-01-16 19:30:00,0.9636363636363636,0.1111111111111111,0.0333333333333333,0.5681836543433301,0.0,0.7333333333333334,Interactive Exercise Biology,0.6742409023430315,0.980171375427846,0.5714285714285712,3,0,0.0088706823348944,0.0333333333333333,0.1824324324324324,0,0.413984461709212,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0,0
|
| 125 |
+
STU1002,0.0,1,2025-05-10 15:00:00,0.2818181818181817,0.4444444444444445,0.9444444444444444,0.5681836543433301,1.0,0.3999999999999999,Audio Lecture Chemistry,0.2137526852826897,0.8698569933581745,0.0,5,1,0.1252367236968581,0.9444444444444444,0.1596283783783784,1,0.5952645209027007,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 126 |
+
STU1133,0.0,1,2024-11-28 22:15:00,0.5272727272727272,0.2222222222222222,0.7222222222222222,0.0139607032057917,0.75,0.2,Video Lesson Programming,0.871018523976302,0.8339837777883972,1.0,3,0,0.038738791240853,0.7222222222222222,0.1587837837837838,2,0.3226045135035146,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,2.0,2.0,0,1
|
| 127 |
+
STU1053,0.1999999999999999,1,2024-12-01 17:00:00,0.5272727272727272,0.7777777777777777,0.7111111111111111,0.3878942605997935,0.25,0.4666666666666667,Interactive Exercise Algorithms,0.8122981896655268,0.0912777811070014,0.2857142857142856,6,1,0.120453429132749,0.7111111111111111,0.4459459459459459,1,0.3046614872364039,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,2.0,1.0,0,1
|
| 128 |
+
STU1097,0.8,0,2025-02-20 16:00:00,0.8909090909090909,0.7777777777777777,0.8111111111111111,0.375,0.25,0.0666666666666667,Interactive Exercise Algebra,0.0234309095259943,0.6387940621461871,0.1428571428571428,3,0,0.0720299404599911,0.811111111111111,0.7162162162162163,0,0.517573066962634,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,1.0,0.0,1,0
|
| 129 |
+
STU1075,0.3999999999999999,1,2025-06-29 16:45:00,0.4272727272727272,0.4444444444444445,0.6666666666666666,0.625,0.0,0.8,Interactive Exercise Ancient Civilizations,0.522227639715337,0.6764842932711569,0.1428571428571428,6,1,0.0871941376439511,0.6666666666666666,0.2271959459459459,2,0.1065482796892341,1.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,1.0,2.0,0,0
|
| 130 |
+
STU1041,0.5999999999999999,1,2025-01-29 15:45:00,0.6181818181818182,0.5555555555555556,0.7111111111111111,0.625,0.5,0.2666666666666666,Interactive Exercise Ancient Civilizations,0.6777435845094765,0.9143755920941278,0.0,2,0,0.0751960913845641,0.7111111111111111,0.3817567567567568,0,0.1653718091009988,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,1.0,0.0,0,0
|
| 131 |
+
STU1015,0.5999999999999999,1,2025-02-09 19:00:00,0.7545454545454545,0.7777777777777777,0.9111111111111112,1.0,0.75,0.6000000000000001,Video Lesson Grammar,0.4043075826362853,0.5023096150736766,0.5714285714285712,6,1,0.0853073486969451,0.9111111111111112,0.6148648648648649,0,0.2130965593784683,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,0.0,1,1
|
| 132 |
+
STU1088,0.0,1,2024-06-15 19:00:00,0.8181818181818181,0.2222222222222222,0.8666666666666667,0.625,0.5,0.2,Audio Lecture Modern History,0.5591290975887796,0.1919013514636648,0.5714285714285712,5,1,0.0230495809225011,0.8666666666666667,0.2398648648648648,1,0.279134295227525,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 133 |
+
STU1123,0.5999999999999999,0,2025-01-09 22:45:00,0.0181818181818181,0.4444444444444445,0.7555555555555555,0.375,0.0,0.7333333333333334,Interactive Exercise Algebra,0.5830720436996023,0.4880820685544728,1.0,3,0,0.4527595914485469,0.7555555555555555,0.0371621621621621,1,0.1498335183129855,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,2.0,1,0
|
| 134 |
+
STU1076,0.3999999999999999,1,2024-09-23 15:45:00,0.5727272727272726,0.8888888888888888,0.8777777777777778,0.5681836543433301,0.5,0.0666666666666667,Video Lesson Physics,0.5904186100356311,0.1276075351246515,0.0,0,0,0.1267219494378041,0.8777777777777778,0.5413851351351352,1,0.3007769145394007,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1,0.0,1.0,1,0
|
| 135 |
+
STU1021,0.8,1,2025-05-17 18:45:00,0.4545454545454545,1.0,0.9333333333333332,0.5847013960703209,1.0,0.2666666666666666,Interactive Exercise Algorithms,1.0,0.4825401966746634,0.4285714285714284,5,1,0.1749298540308367,0.9333333333333332,0.4932432432432433,1,0.3551609322974473,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 136 |
+
STU1181,0.3999999999999999,1,2025-04-15 17:00:00,0.509090909090909,0.6666666666666665,0.8333333333333334,0.625,0.75,0.7333333333333334,Video Lesson World War,0.4625231648447067,0.4155012111996172,0.2857142857142856,1,0,0.1075771831093793,0.8333333333333333,0.3766891891891892,2,0.1664816870144284,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 137 |
+
STU1079,0.1999999999999999,0,2025-07-02 21:30:00,0.6818181818181818,0.2222222222222222,0.8333333333333334,0.5912314024085137,0.0,0.6666666666666667,Audio Lecture Literature,0.422777903710642,0.6827103850869911,0.8571428571428572,2,0,0.0289330348091874,0.8333333333333333,0.2018581081081081,0,0.1576026637069922,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,0
|
| 138 |
+
STU1127,0.1999999999999999,1,2025-06-27 22:45:00,0.7,0.4444444444444445,0.8666666666666667,0.625,1.0,0.5333333333333334,Video Lesson World War,0.6983410253802127,0.5887288090872417,1.0,4,0,0.0535789210861138,0.8666666666666667,0.3538851351351352,2,0.2859785423603403,1.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 139 |
+
STU1026,0.1999999999999999,0,2025-07-02 15:15:00,0.4,0.0,0.1777777777777778,0.5681836543433301,0.5,0.2,Video Lesson Physics,0.3334970854332688,0.4290394711353563,0.0,2,0,0.010289991303729,0.1777777777777778,0.0320945945945946,1,0.4080651128375879,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,1.0,0.0,0,0
|
| 140 |
+
STU1113,0.5999999999999999,0,2024-12-31 22:00:00,0.6636363636363636,0.8888888888888888,1.0,0.625,0.0,0.6666666666666667,Video Lesson World War,0.1794776773869556,0.384687359011765,1.0,1,0,0.1102144868737869,1.0,0.6173986486486487,1,0.5493895671476138,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,1.0,1.0,1,0
|
| 141 |
+
STU1070,0.0,1,2025-06-04 21:30:00,0.6272727272727272,0.5555555555555556,0.9444444444444444,0.375,0.5,0.0666666666666667,Audio Lecture Calculus,0.9473182581745272,0.6746167030994392,0.8571428571428572,2,0,0.0741139890833395,0.9444444444444444,0.3868243243243243,0,0.3144654088050315,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 142 |
+
STU1170,0.5999999999999999,1,2024-05-29 21:45:00,0.6363636363636364,0.3333333333333333,0.9555555555555556,0.0,0.5,0.4666666666666667,Video Lesson Programming,0.0533985705637151,0.6834946702494549,0.8571428571428572,2,0,0.0452759623947767,0.9555555555555556,0.2567567567567568,2,0.2336293007769145,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 143 |
+
STU1116,0.8,1,2023-12-29 15:15:00,0.1727272727272727,0.3333333333333333,0.7666666666666666,0.5847013960703209,0.75,0.1333333333333333,Video Lesson Programming,0.3870150861677275,0.4620268990245569,0.0,4,0,0.1429953951748693,0.7666666666666667,0.0844594594594594,1,0.1409544950055493,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 144 |
+
STU1009,0.0,0,2025-02-25 22:45:00,0.209090909090909,1.0,0.9111111111111112,0.625,0.5,0.1333333333333333,Audio Lecture Modern History,0.4235003797716757,0.4303233547082236,1.0,1,0,0.3264733594137085,0.9111111111111112,0.2652027027027027,1,0.1148723640399556,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 145 |
+
STU1191,0.1999999999999999,1,2025-01-23 21:15:00,0.9727272727272726,1.0,0.7555555555555555,0.5681836543433301,0.25,0.0,Video Lesson Physics,0.4047094298661965,0.3751864629481443,0.8571428571428572,3,0,0.0846945454436863,0.7555555555555555,0.9746621621621624,0,0.4750277469478356,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1,2.0,0.0,1,0
|
| 146 |
+
STU1138,0.8,0,2024-07-09 21:00:00,0.7999999999999999,0.5555555555555556,0.9333333333333332,0.375,1.0,1.0,Interactive Exercise Algebra,0.9615527079247134,0.2352578875846451,0.8571428571428572,1,0,0.0577499521995556,0.9333333333333332,0.4831081081081081,0,0.6267110617832038,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,0
|
| 147 |
+
STU1095,0.5999999999999999,1,2024-07-31 16:30:00,0.109090909090909,0.3333333333333333,0.6888888888888889,0.5847013960703209,0.25,0.6666666666666667,Video Lesson Programming,0.6755493167680068,0.2495566811782675,0.1428571428571428,2,0,0.1917680159890264,0.6888888888888889,0.0608108108108108,1,0.6356825749167592,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,1.0,0.0,0,0
|
| 148 |
+
STU1001,0.1999999999999999,1,2025-04-21 19:15:00,0.9545454545454544,1.0,1.0,0.5847013960703209,0.5,0.2,Interactive Exercise Algorithms,0.9649903744414844,0.1401792249302386,0.5714285714285712,0,0,0.0863464504195475,1.0,0.9577702702702704,1,0.4779874213836478,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 149 |
+
STU1176,0.8,1,2025-06-25 17:45:00,0.918181818181818,0.8888888888888888,0.8888888888888888,0.5847013960703209,0.25,0.4666666666666667,Audio Lecture Data Structures,0.5208156799446504,0.4969171641378953,0.2857142857142856,2,0,0.0798169610728097,0.8888888888888888,0.8302364864864865,2,0.605623381428043,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 150 |
+
STU1020,0.8,1,2025-02-16 22:15:00,0.1181818181818181,0.4444444444444445,0.7666666666666666,0.4947324198552225,1.0,0.8,Interactive Exercise Biology,0.439314066195212,0.4303324328505092,1.0,6,1,0.2313011048871269,0.7666666666666667,0.0836148648648648,1,0.1048834628190898,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1,2.0,0.0,1,1
|
| 151 |
+
STU1052,1.0000000000000002,0,2024-04-21 16:00:00,0.1999999999999999,0.2222222222222222,0.7333333333333333,0.0,0.0,0.8,Audio Lecture Calculus,0.4892865365932068,0.62388281365405,0.1428571428571428,6,1,0.0938961700942147,0.7333333333333333,0.0675675675675675,2,0.2708102108768035,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,0.0,0,1
|
| 152 |
+
STU1174,0.3999999999999999,0,2024-04-02 16:15:00,0.5272727272727272,0.8888888888888888,0.9222222222222224,0.5847013960703209,0.75,0.0666666666666667,Interactive Exercise Algorithms,0.3081547237951205,0.7772314840074368,0.1428571428571428,1,0,0.1367963567111281,0.9222222222222224,0.5033783783783784,2,0.3285238623751387,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,1.0,1,0
|
| 153 |
+
STU1107,0.1999999999999999,0,2025-05-09 21:30:00,0.0999999999999999,0.3333333333333333,0.6888888888888889,0.375,0.25,0.0666666666666667,Video Lesson Algebra,0.7442442619766683,0.5540012960382985,0.8571428571428572,4,0,0.2013898254110027,0.6888888888888889,0.0574324324324324,0,0.0244173140954495,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0,1.0,1.0,0,0
|
| 154 |
+
STU1131,0.0,0,2025-06-27 20:30:00,0.2909090909090909,0.2222222222222222,0.7,0.5847013960703209,0.5,0.5333333333333334,Video Lesson Programming,0.4429204525630629,0.0165636411853334,0.714285714285714,4,0,0.0690899417351965,0.7,0.0929054054054054,0,0.5455049944506104,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,2.0,2.0,0,0
|
| 155 |
+
STU1027,0.8,0,2023-10-25 15:45:00,0.2636363636363636,0.7777777777777777,0.8888888888888888,0.5681836543433301,0.5,0.0,Audio Lecture Chemistry,0.3749982024243721,0.7381107329569581,0.0,2,0,0.217672893260044,0.8888888888888888,0.25,2,0.4827968923418424,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1,2.0,1.0,1,0
|
| 156 |
+
STU1136,0.5999999999999999,0,2024-08-03 20:45:00,0.6363636363636364,0.5555555555555556,1.0,0.0,0.0,0.8,Interactive Exercise Biology,0.0390877272021476,0.282656298860882,0.714285714285714,5,1,0.0730589393393073,1.0,0.3918918918918919,0,0.2386237513873474,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0,0.0,2.0,0,1
|
| 157 |
+
STU1197,0.5999999999999999,0,2024-06-21 15:15:00,0.7454545454545454,0.7777777777777777,0.8777777777777778,0.5681836543433301,0.0,0.7333333333333334,Interactive Exercise Biology,0.6916417895675577,0.0173519302820779,0.0,4,0,0.0863464502094683,0.8777777777777778,0.6081081081081082,0,0.6248612652608213,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1,1.0,2.0,1,0
|
| 158 |
+
STU1003,0.8,1,2025-06-19 16:45:00,0.8999999999999999,0.7777777777777777,0.8444444444444444,0.375,1.0,0.4666666666666667,Audio Lecture Calculus,0.0401738067011121,0.7833008583000046,0.1428571428571428,3,0,0.0712747117333943,0.8444444444444444,0.722972972972973,1,0.8706992230854607,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 159 |
+
STU1122,0.0,0,2024-07-03 15:00:00,0.3454545454545454,0.3333333333333333,0.7555555555555555,0.375,0.75,0.5333333333333334,Audio Lecture Calculus,0.1678776395202608,0.1371824991949564,0.0,2,0,0.0823199308824015,0.7555555555555555,0.1486486486486486,0,0.2967073621901591,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 160 |
+
STU1023,0.5999999999999999,0,2025-01-22 20:00:00,1.0,0.3333333333333333,0.9333333333333332,0.625,1.0,0.7333333333333334,Audio Lecture Modern History,0.6103308603130055,0.4278807889936094,0.714285714285714,2,0,0.0267539779194395,0.9333333333333332,0.3918918918918919,0,0.2541620421753606,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 161 |
+
STU1008,0.0,1,2025-04-20 21:00:00,0.3272727272727272,0.5555555555555556,0.7666666666666666,0.2276370217166499,1.0,0.9333333333333332,Video Lesson Physics,0.1080548242106633,0.905344410394646,0.8571428571428572,6,1,0.1346646694857505,0.7666666666666667,0.2195945945945946,1,0.2330743618201997,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1,2.0,0.0,1,1
|
| 162 |
+
STU1044,0.5999999999999999,1,2025-06-30 16:45:00,0.5545454545454545,1.0,0.7333333333333333,0.5912314024085137,0.75,0.0,Video Lesson Grammar,0.03995183183426,0.5733476355000872,0.1428571428571428,0,0,0.1462338220297057,0.7333333333333333,0.5861486486486487,1,0.1753607103218646,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 163 |
+
STU1117,0.1999999999999999,0,2024-07-13 16:00:00,0.8454545454545453,0.3333333333333333,0.9888888888888888,0.5847013960703209,0.75,0.3999999999999999,Interactive Exercise Algorithms,0.3271705195184051,0.3168861230398674,0.1428571428571428,5,1,0.0328680310642866,0.9888888888888888,0.3344594594594594,0,0.2502774694783574,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,0.0,1,0
|
| 164 |
+
STU1172,0.3999999999999999,0,2023-12-11 21:15:00,0.6636363636363636,0.2222222222222222,0.8999999999999999,1.0,0.5,1.0,Video Lesson World War,0.8031124435119377,0.0237170783603136,0.8571428571428572,0,0,0.0298781679617393,0.9000000000000001,0.1967905405405405,0,0.1598224195338512,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,1
|
| 165 |
+
STU1115,0.0,0,2025-05-14 17:15:00,0.6,0.7777777777777777,0.8222222222222222,0.5681836543433301,0.5,0.7333333333333334,Audio Lecture Chemistry,0.8574346061979541,0.4306179469511907,0.2857142857142856,2,0,0.1066909639846726,0.8222222222222222,0.5000000000000001,2,0.3523862375138734,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1,1.0,0.0,1,0
|
| 166 |
+
STU1135,0.8,1,2024-10-16 21:00:00,0.5363636363636363,0.7777777777777777,0.8999999999999999,1.0,0.25,1.0,Interactive Exercise Vocabulary,0.6010749217962007,0.6871984162963782,0.8571428571428572,2,0,0.1185585969772098,0.9000000000000001,0.4527027027027027,2,0.3290788013318535,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,2.0,1,1
|
| 167 |
+
STU1142,0.0,1,2024-10-26 21:00:00,0.5909090909090908,0.4444444444444445,0.9888888888888888,0.5912314024085137,1.0,0.3999999999999999,Audio Lecture Literature,0.7527334400386756,0.1293020152495637,0.8571428571428572,5,1,0.0637979469627238,0.9888888888888888,0.3032094594594594,1,0.2924528301886793,0.6538461538461533,0.0706596681502631,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 168 |
+
STU1147,0.0,1,2024-12-26 19:00:00,0.4272727272727272,0.7777777777777777,0.9111111111111112,1.0,1.0,0.6000000000000001,Interactive Exercise Biology,0.7137392075691249,0.6732410565500274,0.5714285714285712,3,0,0.1456846151268925,0.9111111111111112,0.3716216216216216,2,0.3296337402885683,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,1
|
| 169 |
+
STU1192,0.5999999999999999,0,2025-05-16 22:30:00,0.6,0.3333333333333333,0.7111111111111111,1.0,1.0,0.0666666666666667,Interactive Exercise Algorithms,0.3781868637440948,0.039703565386513,1.0,4,0,0.0482004862451941,0.7111111111111111,0.2432432432432432,1,0.4298927118017018,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,2.0,1.0,0,1
|
| 170 |
+
STU1186,0.1999999999999999,0,2025-01-25 20:30:00,0.8636363636363635,0.2222222222222222,0.7777777777777778,0.5912314024085137,0.25,0.2,Audio Lecture Literature,0.5200670883657244,0.7661816669415945,0.714285714285714,5,1,0.0214619822511075,0.7777777777777778,0.2525337837837837,2,0.2053274139844617,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,0.0,1,0
|
| 171 |
+
STU1063,0.3999999999999999,0,2024-11-09 19:30:00,0.7272727272727272,1.0,0.8666666666666667,0.0,0.5,0.0,Interactive Exercise Algebra,0.4841074717903316,0.1262294105178091,0.5714285714285712,5,1,0.1131899062084624,0.8666666666666667,0.7466216216216217,1,0.4002959674435812,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0,1.0,2.0,0,1
|
| 172 |
+
STU1092,0.1999999999999999,0,2024-10-26 19:30:00,0.5545454545454545,1.0,0.7222222222222222,0.0,0.25,0.6000000000000001,Audio Lecture Chemistry,0.4349141129273994,0.959994250875958,0.5714285714285712,5,1,0.1462338220297057,0.7222222222222222,0.5861486486486487,1,0.3607103218645948,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0,0.0,1.0,0,1
|
| 173 |
+
STU1145,0.0,0,2024-12-10 20:45:00,0.8818181818181817,0.2222222222222222,0.9333333333333332,0.5681836543433301,0.75,0.4666666666666667,Interactive Exercise Biology,0.9230334433911632,0.1311104101379464,0.714285714285714,1,0,0.0208684874202917,0.9333333333333332,0.2576013513513513,1,0.4062153163152053,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1,2.0,0.0,1,0
|
| 174 |
+
STU1016,0.0,0,2025-06-29 15:30:00,0.7818181818181817,0.8888888888888888,0.8555555555555555,0.5681836543433301,0.25,0.9333333333333332,Interactive Exercise Biology,0.1525728664292559,0.1879510666780116,0.0,6,1,0.0938961722647597,0.8555555555555555,0.7162162162162163,2,0.218645948945616,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 175 |
+
STU1031,1.0000000000000002,1,2025-06-19 18:15:00,0.0818181818181818,0.2222222222222222,0.7666666666666666,0.0139607032057917,0.0,0.6666666666666667,Video Lesson World War,0.8895972341592258,0.1603471402706822,0.4285714285714284,3,0,0.1651814347976476,0.7666666666666667,0.0346283783783783,1,0.4705882352941176,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,2.0,0,1
|
| 176 |
+
STU1074,0.1999999999999999,0,2024-10-15 15:15:00,0.0363636363636363,0.2222222222222222,0.8333333333333334,0.0139607032057917,0.0,0.6000000000000001,Audio Lecture Modern History,0.0068908470202531,0.09588092287902,0.0,1,0,0.2278497968541689,0.8333333333333333,0.0219594594594594,0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,2.0,0,1
|
| 177 |
+
STU1054,1.0000000000000002,1,2025-05-28 21:45:00,0.4,0.5555555555555556,0.7777777777777778,0.375,0.0,0.6000000000000001,Video Lesson Algebra,0.9898913882044906,0.6161254638621769,0.8571428571428572,2,0,0.1131899052937965,0.7777777777777778,0.2601351351351352,2,0.3677395486496485,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 178 |
+
STU1154,0.0,1,2025-06-10 16:00:00,0.8272727272727272,0.6666666666666665,0.7111111111111111,0.5681836543433301,0.75,0.8666666666666667,Audio Lecture Chemistry,0.9865319606859174,0.0823308380383001,0.1428571428571428,1,0,0.0667321230075657,0.7111111111111111,0.5836148648648649,0,0.2253052164261931,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0,1.0,0.0,0,0
|
| 179 |
+
STU1058,0.8,0,2024-10-14 16:30:00,0.609090909090909,0.8888888888888888,0.8444444444444444,0.1207988624612208,0.0,0.2,Audio Lecture Modern History,0.7304846441584761,0.6288960084271715,0.1428571428571428,0,0,0.1196044461051956,0.8444444444444444,0.5717905405405406,2,0.2830188679245283,1.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,0.0,2.0,0,1
|
| 180 |
+
STU1069,0.0,0,2024-12-30 22:00:00,0.5363636363636363,0.1111111111111111,0.1333333333333333,0.5912314024085137,0.5,0.9333333333333332,Audio Lecture Literature,0.6336044442184678,0.8605347717073197,1.0,0,0,0.0219221556235891,0.1333333333333333,0.1030405405405405,2,0.2175360710321865,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0.0,2.0,0,0
|
| 181 |
+
STU1199,0.1999999999999999,0,2024-11-27 20:45:00,0.5363636363636363,0.3333333333333333,0.8222222222222222,0.0,0.0,0.1333333333333333,Audio Lecture Chemistry,0.1608818190469297,0.3794942485083676,0.714285714285714,2,0,0.0541343027414627,0.8222222222222222,0.2195945945945946,2,0.1659267480577136,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,2.0,2.0,0,1
|
| 182 |
+
STU1065,1.0000000000000002,1,2025-01-08 21:30:00,0.1818181818181818,0.0,0.1222222222222222,0.625,0.75,0.6666666666666667,Video Lesson World War,0.256283138003569,0.812904722734963,0.8571428571428572,2,0,0.0267539769933403,0.1222222222222222,0.0118243243243243,0,0.0344062153163152,0.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,2.0,2.0,0,0
|
| 183 |
+
STU1161,0.1999999999999999,1,2025-01-17 19:45:00,0.6181818181818182,0.1111111111111111,0.2,0.5912314024085137,0.0,0.2,Interactive Exercise Vocabulary,0.8241693154110818,0.8842026612593801,0.5714285714285712,4,0,0.0182053694653317,0.2,0.1182432432432432,2,0.2286348501664817,1.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,2.0,0,0
|
| 184 |
+
STU1105,0.5999999999999999,0,2025-03-25 16:30:00,0.1727272727272727,0.8888888888888888,0.7444444444444445,0.0,0.75,0.6000000000000001,Audio Lecture Chemistry,0.5961434098321164,0.1719413964133947,0.1428571428571428,1,0,0.3346021285113116,0.7444444444444445,0.2069256756756756,2,0.4554199038105808,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0,1
|
| 185 |
+
STU1084,0.0,1,2025-03-11 20:45:00,0.0999999999999999,0.4444444444444445,0.7111111111111111,0.0,0.25,0.0,Video Lesson World War,0.4804435260964554,0.1445808603798793,0.714285714285714,1,0,0.2543097796373245,0.7111111111111111,0.0751689189189189,0,0.0971143174250832,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 186 |
+
STU1094,0.3999999999999999,0,2024-12-10 21:15:00,0.8818181818181817,0.5555555555555556,0.9666666666666666,0.5912314024085137,0.5,0.4666666666666667,Video Lesson Grammar,0.6296386049369492,0.2796368238821469,0.8571428571428572,1,0,0.052026966334868,0.9666666666666666,0.5287162162162162,0,0.5005549389567148,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 187 |
+
STU1100,0.8,0,2025-03-29 16:45:00,0.5363636363636363,0.6666666666666665,0.7222222222222222,0.5681836543433301,0.75,0.3333333333333333,Audio Lecture Chemistry,0.2469606545955258,0.2849217624339179,0.1428571428571428,5,1,0.102452523418273,0.7222222222222222,0.3944256756756756,2,0.5327413984461709,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1,2.0,1.0,1,0
|
| 188 |
+
STU1011,0.0,0,2025-05-01 17:15:00,0.8181818181818181,0.5555555555555556,0.7888888888888889,0.5681836543433301,0.5,0.1333333333333333,Interactive Exercise Biology,0.1939902467223051,0.9566010883539868,0.2857142857142856,3,0,0.0563891533392868,0.788888888888889,0.4932432432432433,0,0.4384017758046615,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1,0.0,1.0,1,0
|
| 189 |
+
STU1110,0.3999999999999999,1,2025-06-11 15:15:00,0.3181818181818181,0.4444444444444445,0.7666666666666666,1.0,0.25,0.8,Interactive Exercise Ancient Civilizations,0.6851914065744795,0.870417854860565,0.0,2,0,0.1131899048364636,0.7666666666666667,0.1765202702702702,1,0.290788013318535,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,2.0,1,1
|
| 190 |
+
STU1153,0.1999999999999999,0,2025-05-27 15:30:00,0.2545454545454545,0.3333333333333333,0.8111111111111111,0.5681836543433301,0.75,0.9333333333333332,Interactive Exercise Biology,0.8576235602074411,0.5365510402094337,0.0,1,0,0.1066909624454496,0.811111111111111,0.1148648648648648,2,0.0688124306326304,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1,0.0,2.0,1,0
|
| 191 |
+
STU1040,1.0000000000000002,0,2024-06-22 15:00:00,0.7727272727272727,0.5555555555555556,0.9666666666666666,0.5681836543433301,0.25,0.8666666666666667,Audio Lecture Chemistry,0.8180109679775794,0.0714730856792513,0.0,5,1,0.0598985819777965,0.9666666666666666,0.4679054054054055,1,0.6111727709951905,0.6538461538461533,0.0706596681502631,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1,2.0,0.0,1,0
|
| 192 |
+
STU1007,0.5999999999999999,0,2025-04-24 20:00:00,0.7636363636363636,0.4444444444444445,0.9888888888888888,0.5847013960703209,0.75,0.2666666666666666,Audio Lecture Data Structures,0.7094699720856339,0.0840843830098658,0.714285714285714,3,0,0.0488227255190223,0.9888888888888888,0.3834459459459459,2,0.3157602663706992,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 193 |
+
STU1198,0.8,0,2025-04-20 21:00:00,0.7454545454545454,0.6666666666666665,0.6888888888888889,1.0,0.5,0.0666666666666667,Interactive Exercise Algebra,0.4066956719081948,0.1766483703646792,0.8571428571428572,6,1,0.0742668949964992,0.6888888888888889,0.5304054054054055,2,0.2019977802441731,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,0.0,0,1
|
| 194 |
+
STU1006,0.1999999999999999,1,2025-06-09 22:30:00,0.3636363636363636,0.4444444444444445,0.8222222222222222,0.6549896587383661,0.5,0.5333333333333334,Audio Lecture Data Structures,0.0530545450103893,0.5071309143770553,1.0,0,0,0.1008419154503486,0.8222222222222222,0.1976351351351351,1,0.3721790603033666,0.6538461538461533,0.0706596681502631,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,1
|
| 195 |
+
STU1072,0.0,1,2025-05-25 22:00:00,0.7727272727272727,0.6666666666666665,0.8111111111111111,1.0,0.25,0.0,Video Lesson Grammar,0.7656757107433999,0.4928297632737241,1.0,6,1,0.0715966775564767,0.811111111111111,0.548141891891892,0,0.3423973362930078,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,1
|
| 196 |
+
STU1000,0.0,1,2025-05-02 19:15:00,0.7181818181818181,0.6666666666666665,0.9444444444444444,0.5847013960703209,0.25,0.2666666666666666,Video Lesson Programming,0.8523252964889587,0.7984743358967872,0.5714285714285712,4,0,0.0771171270933769,0.9444444444444444,0.512668918918919,2,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,0.0,1,0
|
| 197 |
+
STU1096,1.0000000000000002,1,2023-09-29 16:15:00,0.9545454545454544,1.0,0.6666666666666666,0.0,0.5,0.3999999999999999,Video Lesson Algebra,0.2893390822169124,0.5242070290502806,0.1428571428571428,4,0,0.0863464504195475,0.6666666666666666,0.9577702702702704,2,0.732519422863485,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0,1.0,1.0,0,1
|
| 198 |
+
STU1077,0.1999999999999999,1,2024-12-28 18:30:00,0.1636363636363636,0.5555555555555556,0.7111111111111111,0.375,0.75,0.8666666666666667,Interactive Exercise Algebra,0.8616923496692794,0.9113413986871324,0.4285714285714284,5,1,0.227849805359161,0.7111111111111111,0.1283783783783783,1,0.4200887902330743,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,0.0,0,0
|
| 199 |
+
STU1157,1.0000000000000002,1,2025-03-30 17:45:00,0.3818181818181818,0.7777777777777777,0.8777777777777778,0.625,0.5,0.6000000000000001,Video Lesson World War,0.9159881895767216,0.0898036508795233,0.2857142857142856,6,1,0.1606821731674373,0.8777777777777778,0.3378378378378378,0,0.5671476137624861,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,1.0,1,0
|
| 200 |
+
STU1033,0.8,1,2025-02-07 16:00:00,0.8999999999999999,0.3333333333333333,0.9444444444444444,1.0,0.75,0.5333333333333334,Interactive Exercise Biology,0.6551128017477423,0.5718828797612187,0.1428571428571428,4,0,0.0304923601195549,0.9444444444444444,0.3547297297297297,1,0.2264150943396226,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,1
|
| 201 |
+
STU1156,0.0,0,2025-05-03 22:15:00,0.2545454545454545,0.8888888888888888,0.8999999999999999,1.0,0.75,0.8,Audio Lecture Calculus,0.5185107952462812,0.925461000247944,1.0,5,1,0.2529171548701172,0.9000000000000001,0.2753378378378378,2,0.4813170551239363,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1,0.0,1.0,1,1
|
Rekomendasi Materi Belajar/edtech/backend/data/recommendations/train_data.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Rekomendasi Materi Belajar/edtech/backend/models/recommenders/collaborative/collab_model.joblib
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c4aef73c6272415cb11002c1ff5c96f65587498acaa7c86ad4f7167d1d73fe48
|
| 3 |
+
size 6080
|
Rekomendasi Materi Belajar/edtech/backend/models/recommenders/content_based/content_model.joblib
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:63d1a2f5acb72fa4e6c3825586d578da46d850c31d82883ef50f618789722977
|
| 3 |
+
size 5211833
|
Rekomendasi Materi Belajar/edtech/backend/models/recommenders/hybrid/hybrid_model.joblib
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d173427052471e467df306ab61013e0599cfb0a80ff3805e464f9b7a25166933
|
| 3 |
+
size 32
|
Rekomendasi Materi Belajar/edtech/backend/src/app.py
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# backend/src/app.py/recommendation
|
| 2 |
+
from fastapi import FastAPI, HTTPException
|
| 3 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 4 |
+
from pydantic import BaseModel
|
| 5 |
+
from contextlib import asynccontextmanager
|
| 6 |
+
import joblib
|
| 7 |
+
import pandas as pd
|
| 8 |
+
from typing import List, Optional
|
| 9 |
+
import uvicorn
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
from recommendation.collaborative import CollaborativeFiltering
|
| 12 |
+
from recommendation.content_based import ContentBasedRecommender
|
| 13 |
+
from recommendation.hybrid import HybridRecommender
|
| 14 |
+
|
| 15 |
+
# ===== KONFIGURASI SERVER =====
|
| 16 |
+
HOST = "0.0.0.0" #untuk deploy hugging face
|
| 17 |
+
PORT = 8025
|
| 18 |
+
RELOAD = True # Set False di production
|
| 19 |
+
WORKERS = 1
|
| 20 |
+
|
| 21 |
+
# ===== LIFESPAN MANAGEMENT =====
|
| 22 |
+
@asynccontextmanager
|
| 23 |
+
async def lifespan(app: FastAPI):
|
| 24 |
+
"""Mengelola siklus hidup aplikasi dan inisialisasi model"""
|
| 25 |
+
print("Memuat model rekomendasi...")
|
| 26 |
+
try:
|
| 27 |
+
# Load semua model
|
| 28 |
+
app.state.collab_model = CollaborativeFiltering.load_model(COLLAB_MODEL_PATH)
|
| 29 |
+
app.state.content_model = ContentBasedRecommender.load_model(CONTENT_MODEL_PATH)
|
| 30 |
+
app.state.hybrid_model = HybridRecommender.load_model(
|
| 31 |
+
collab_path=COLLAB_MODEL_PATH,
|
| 32 |
+
content_path=CONTENT_MODEL_PATH,
|
| 33 |
+
hybrid_path=HYBRID_MODEL_PATH
|
| 34 |
+
)
|
| 35 |
+
print("✅ Model berhasil dimuat!")
|
| 36 |
+
except Exception as e:
|
| 37 |
+
print(f"❌ Gagal memuat model: {str(e)}")
|
| 38 |
+
raise HTTPException(status_code=500, detail="Gagal memuat model")
|
| 39 |
+
yield
|
| 40 |
+
print("🛑 Server dimatikan")
|
| 41 |
+
|
| 42 |
+
# ===== INISIALISASI APLIKASI =====
|
| 43 |
+
app = FastAPI(
|
| 44 |
+
title="Sistem Rekomendasi Materi Pembelajaran",
|
| 45 |
+
description="API untuk memberikan rekomendasi materi pembelajaran personalisasi",
|
| 46 |
+
version="1.0.2",
|
| 47 |
+
lifespan=lifespan,
|
| 48 |
+
docs_url="/docs",
|
| 49 |
+
redoc_url="/redoc"
|
| 50 |
+
)
|
| 51 |
+
|
| 52 |
+
# ===== KONFIGURASI CORS =====
|
| 53 |
+
app.add_middleware(
|
| 54 |
+
CORSMiddleware,
|
| 55 |
+
allow_origins=["http://localhost:3025"],
|
| 56 |
+
allow_credentials=True,
|
| 57 |
+
allow_methods=["*"],
|
| 58 |
+
allow_headers=["*"],
|
| 59 |
+
)
|
| 60 |
+
|
| 61 |
+
# ===== PATH MODEL =====
|
| 62 |
+
MODEL_DIR = Path("models/recommenders")
|
| 63 |
+
COLLAB_MODEL_PATH = MODEL_DIR / "collaborative/collab_model.joblib"
|
| 64 |
+
CONTENT_MODEL_PATH = MODEL_DIR / "content_based/content_model.joblib"
|
| 65 |
+
HYBRID_MODEL_PATH = MODEL_DIR / "hybrid/hybrid_model.joblib"
|
| 66 |
+
|
| 67 |
+
# ===== SCHEMA REQUEST/RESPONSE =====
|
| 68 |
+
class RecommendationRequest(BaseModel):
|
| 69 |
+
user_id: str
|
| 70 |
+
user_history: List[str]
|
| 71 |
+
n_recommendations: int = 5
|
| 72 |
+
algorithm: str = "hybrid"
|
| 73 |
+
|
| 74 |
+
class MaterialRecommendationRequest(BaseModel):
|
| 75 |
+
material_id: str
|
| 76 |
+
n_recommendations: int = 5
|
| 77 |
+
|
| 78 |
+
class RecommendationItem(BaseModel):
|
| 79 |
+
material_id: str
|
| 80 |
+
score: float
|
| 81 |
+
confidence: float = 0.0 # Tambahan field baru
|
| 82 |
+
|
| 83 |
+
class RecommendationResponse(BaseModel):
|
| 84 |
+
success: bool
|
| 85 |
+
recommendations: List[RecommendationItem]
|
| 86 |
+
algorithm: str
|
| 87 |
+
message: Optional[str] = None
|
| 88 |
+
|
| 89 |
+
# ===== ENDPOINT API =====
|
| 90 |
+
@app.get("/")
|
| 91 |
+
async def root():
|
| 92 |
+
return {
|
| 93 |
+
"message": "Selamat datang di API Rekomendasi Pembelajaran",
|
| 94 |
+
"version": app.version,
|
| 95 |
+
"docs": f"http://{HOST}:{PORT}/docs"
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
@app.post("/recommend", response_model=RecommendationResponse)
|
| 99 |
+
async def get_recommendations(request: RecommendationRequest):
|
| 100 |
+
try:
|
| 101 |
+
# Validasi input
|
| 102 |
+
if not request.user_id:
|
| 103 |
+
raise HTTPException(
|
| 104 |
+
status_code=400,
|
| 105 |
+
detail="User ID diperlukan",
|
| 106 |
+
headers={"Content-Type": "application/json"}
|
| 107 |
+
)
|
| 108 |
+
|
| 109 |
+
if not request.user_history and request.algorithm != "collaborative":
|
| 110 |
+
raise HTTPException(
|
| 111 |
+
status_code=400,
|
| 112 |
+
detail="User history diperlukan untuk algoritma ini",
|
| 113 |
+
headers={"Content-Type": "application/json"}
|
| 114 |
+
)
|
| 115 |
+
# Format response yang lebih konsisten
|
| 116 |
+
recommendations = []
|
| 117 |
+
if request.algorithm == "hybrid":
|
| 118 |
+
recommendations = app.state.hybrid_model.recommend_for_user(
|
| 119 |
+
user_id=request.user_id,
|
| 120 |
+
user_history=request.user_history or [], # Handle None
|
| 121 |
+
df=pd.DataFrame(),
|
| 122 |
+
n_recommendations=request.n_recommendations
|
| 123 |
+
)
|
| 124 |
+
elif request.algorithm == "collaborative":
|
| 125 |
+
recommendations = app.state.collab_model.recommend_for_user(
|
| 126 |
+
user_id=request.user_id
|
| 127 |
+
)[:request.n_recommendations]
|
| 128 |
+
else:
|
| 129 |
+
recommendations = app.state.content_model.recommend_for_user(
|
| 130 |
+
user_id=request.user_id,
|
| 131 |
+
user_history=request.user_history or [], # Handle None
|
| 132 |
+
df=pd.DataFrame()
|
| 133 |
+
)[:request.n_recommendations]
|
| 134 |
+
|
| 135 |
+
# Pastikan format response konsisten
|
| 136 |
+
recommendation_items = [
|
| 137 |
+
{
|
| 138 |
+
"material_id": item[0],
|
| 139 |
+
"score": float(item[1]),
|
| 140 |
+
"confidence": min(float(item[1]) * 100, 99.9)
|
| 141 |
+
}
|
| 142 |
+
for item in recommendations
|
| 143 |
+
]
|
| 144 |
+
|
| 145 |
+
return {
|
| 146 |
+
"success": True,
|
| 147 |
+
"recommendations": recommendation_items,
|
| 148 |
+
"algorithm": request.algorithm,
|
| 149 |
+
"message": "Rekomendasi berhasil dibuat"
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
except Exception as e:
|
| 153 |
+
raise HTTPException(
|
| 154 |
+
status_code=500,
|
| 155 |
+
detail=str(e),
|
| 156 |
+
headers={"Content-Type": "application/json"}
|
| 157 |
+
)
|
| 158 |
+
|
| 159 |
+
@app.get("/health")
|
| 160 |
+
async def health_check():
|
| 161 |
+
return {
|
| 162 |
+
"status": "healthy" if all([
|
| 163 |
+
hasattr(app.state, "collab_model"),
|
| 164 |
+
hasattr(app.state, "content_model"),
|
| 165 |
+
hasattr(app.state, "hybrid_model")
|
| 166 |
+
]) else "unhealthy",
|
| 167 |
+
"details": {
|
| 168 |
+
"collaborative_loaded": hasattr(app.state, "collab_model"),
|
| 169 |
+
"content_loaded": hasattr(app.state, "content_model"),
|
| 170 |
+
"hybrid_loaded": hasattr(app.state, "hybrid_model")
|
| 171 |
+
}
|
| 172 |
+
}
|
| 173 |
+
|
| 174 |
+
# ===== KONFIGURASI SERVER =====
|
| 175 |
+
def run_server():
|
| 176 |
+
"""Menjalankan server Uvicorn"""
|
| 177 |
+
config = uvicorn.Config(
|
| 178 |
+
app,
|
| 179 |
+
host=HOST,
|
| 180 |
+
port=PORT,
|
| 181 |
+
reload=RELOAD,
|
| 182 |
+
workers=WORKERS,
|
| 183 |
+
log_level="info"
|
| 184 |
+
)
|
| 185 |
+
server = uvicorn.Server(config)
|
| 186 |
+
|
| 187 |
+
print(f"🚀 Server berjalan di http://{HOST}:{PORT}")
|
| 188 |
+
print(f"📚 Dokumentasi API tersedia di http://{HOST}:{PORT}/docs")
|
| 189 |
+
|
| 190 |
+
server.run()
|
| 191 |
+
|
| 192 |
+
if __name__ == "__main__":
|
| 193 |
+
run_server()
|
Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/evaluations/collaborative_evaluation.csv
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
RMSE,MAE,Precision@K,Recall@K,NDCG@K,model
|
| 2 |
+
0.5873683620699068,0.5249163001110007,0.19658119658119655,0.47692307692307695,0.33844810160390104,collaborative
|
Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/evaluations/content_based_evaluation.csv
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
RMSE,MAE,Precision@K,Recall@K,NDCG@K,model
|
| 2 |
+
0.279107926379566,0.24733157275956955,0.3350427350427351,1.0,0.6786757984354084,content_based
|
Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/evaluations/hybrid_evaluation.csv
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
RMSE,MAE,Precision@K,Recall@K,NDCG@K,model
|
| 2 |
+
0.279107926379566,0.24733157275956955,0.19658119658119655,0.47692307692307695,0.33844810160390104,hybrid
|
Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/test_data.csv
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
student_id,grade,tech_savvy,timestamp,duration_minutes,engagement_score,completion_rate,quiz_score,material_rating,interaction_duration,related_materials,material_engagement_score,feature_engagement,jam_belajar,hari_dalam_minggu,akhir_pekan,efisiensi_belajar,rasio_penyelesaian,interaksi_total,material_type_encoded,preferensi_materi,jumlah_pengakses,engagement_rata2,gender_Female,gender_Male,learning_style_Auditory,learning_style_Kinesthetic,learning_style_Visual,subject_Computer Science,subject_English,subject_History,subject_Mathematics,subject_Science,click_page_Computer Science,click_page_English,click_page_History,click_page_Home,click_page_Math,click_page_Science,performance_label_encoded,learning_speed_encoded,student_feedback_encoded,achievement_status_encoded,is_assessment_encoded
|
| 2 |
+
STU1120,0.8,1,2025-03-26 21:15:00,0.409090909090909,0.7777777777777777,0.977777777777778,0.5847013960703209,0.75,0.3333333333333333,Video Lesson Programming,0.960166939416453,0.2525997824597098,0.8571428571428572,2,0,0.1513564189009025,0.977777777777778,0.3581081081081081,0,0.2745098039215686,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 3 |
+
STU1017,0.3999999999999999,0,2024-12-12 17:45:00,0.6454545454545454,0.8888888888888888,1.0,0.5681836543433301,0.25,0.8,Video Lesson Physics,0.2530215271532433,0.3298774180153486,0.2857142857142856,3,0,0.1131899060560181,1.0,0.602195945945946,0,0.1853496115427302,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 4 |
+
STU1002,0.0,1,2025-05-18 20:00:00,0.009090909090909,0.6666666666666665,0.8555555555555555,0.3878942605997935,0.5,0.8,Audio Lecture Modern History,0.942258990119304,0.1077354379822434,0.714285714285714,6,1,0.6969130025517146,0.8555555555555555,0.0515202702702702,1,0.5952645209027007,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,2.0,1,1
|
| 5 |
+
STU1144,0.8,1,2025-02-01 15:15:00,0.8363636363636363,0.3333333333333333,0.9555555555555556,0.625,0.25,0.5333333333333334,Interactive Exercise Ancient Civilizations,0.6156811232934086,0.5389839325506166,0.0,5,1,0.0332911489283597,0.9555555555555556,0.3310810810810811,0,0.2042175360710322,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,2.0,2.0,1,0
|
| 6 |
+
STU1187,0.0,1,2024-10-23 16:45:00,0.5454545454545454,0.7777777777777777,0.7999999999999999,0.5847013960703209,0.25,0.4666666666666667,Video Lesson Programming,0.3325434368052288,0.1845964240344895,0.1428571428571428,2,0,0.1167179028824841,0.7999999999999999,0.4594594594594595,2,0.1553829078801332,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,0.0,1,0
|
| 7 |
+
STU1043,0.5999999999999999,1,2025-06-25 15:15:00,0.5636363636363636,0.5555555555555556,0.6888888888888889,0.0,0.25,0.7333333333333334,Interactive Exercise Ancient Civilizations,0.4689347515494337,0.4543840323329537,0.0,2,0,0.0823199315255259,0.6888888888888889,0.3513513513513514,0,0.169811320754717,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 8 |
+
STU1183,0.8,1,2025-02-16 19:15:00,0.8999999999999999,0.3333333333333333,0.8333333333333334,0.375,0.5,0.0666666666666667,Interactive Exercise Algebra,0.853616654280294,0.6649625302161895,0.5714285714285712,6,1,0.0304923601195549,0.8333333333333333,0.3547297297297297,0,0.3978912319644839,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 9 |
+
STU1141,0.8,0,2024-12-08 19:15:00,0.2999999999999999,0.2222222222222222,0.9888888888888888,1.0,0.25,1.0,Video Lesson Programming,0.4664934346214637,0.3225980051157171,0.5714285714285712,6,1,0.0672438968193026,0.9888888888888888,0.0954391891891892,2,0.45338512763596,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,1
|
| 10 |
+
STU1124,0.5999999999999999,0,2025-05-13 22:15:00,0.7818181818181817,0.7777777777777777,0.977777777777778,0.5912314024085137,0.75,0.5333333333333334,Interactive Exercise Vocabulary,0.1882280420886091,0.5793840725909646,1.0,1,0,0.0823199318470881,0.977777777777778,0.6351351351351352,1,0.3740288568257491,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 11 |
+
STU1193,0.5999999999999999,0,2025-03-29 18:45:00,0.9909090909090909,1.0,0.8777777777777778,0.625,1.0,0.3333333333333333,Video Lesson World War,0.0614449211153287,0.2673617654399955,0.4285714285714284,5,1,0.0830981666850345,0.8777777777777778,0.991554054054054,2,0.2852386237513873,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,2.0,1,0
|
| 12 |
+
STU1057,0.5999999999999999,1,2024-12-02 16:45:00,0.0909090909090909,0.8888888888888888,0.9222222222222224,0.375,1.0,0.3333333333333333,Interactive Exercise Algebra,0.5500703600371556,0.0432300582306915,0.1428571428571428,0,0,0.4898035747537576,0.9222222222222224,0.1385135135135135,2,0.1908990011098779,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 13 |
+
STU1118,0.5999999999999999,0,2024-09-04 21:00:00,0.9090909090909092,0.5555555555555556,0.8444444444444444,1.0,0.5,0.8666666666666667,Audio Lecture Modern History,0.2395030187344075,0.9003797474898564,0.8571428571428572,2,0,0.0503274129549779,0.8444444444444444,0.543918918918919,0,0.2364039955604883,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,1
|
| 14 |
+
STU1080,0.5999999999999999,0,2025-03-20 20:15:00,0.4363636363636363,0.5555555555555556,0.6666666666666666,0.375,1.0,0.4666666666666667,Video Lesson Algebra,0.9762892629403518,0.1977467437259178,0.714285714285714,3,0,0.1046740504897195,0.6666666666666666,0.2804054054054054,0,0.3351831298557158,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,2.0,0.0,0,0
|
| 15 |
+
STU1025,1.0000000000000002,0,2025-04-29 17:00:00,0.7272727272727272,0.6666666666666665,0.9222222222222224,0.5912314024085137,0.75,0.1333333333333333,Audio Lecture Literature,0.0922904626904395,0.2129170895751014,0.2857142857142856,1,0,0.0761459368976383,0.9222222222222224,0.5185810810810811,1,0.4200887902330743,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 16 |
+
STU1050,0.5999999999999999,0,2025-03-28 18:30:00,0.7545454545454545,0.6666666666666665,0.8111111111111111,0.0,0.25,0.6000000000000001,Video Lesson Algebra,0.6371149246219355,0.6176354132885155,0.4285714285714284,4,0,0.0733576811730414,0.811111111111111,0.5363175675675677,0,0.2008879023307436,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0.0,1.0,0,1
|
| 17 |
+
STU1119,0.5999999999999999,1,2024-08-03 18:15:00,0.2181818181818181,0.5555555555555556,0.9222222222222224,0.5912314024085137,0.5,0.0666666666666667,Interactive Exercise Vocabulary,0.0799998736256766,0.1431947951612596,0.4285714285714284,5,1,0.1858251365622197,0.9222222222222224,0.1587837837837838,2,0.2613762486126526,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 18 |
+
STU1048,1.0000000000000002,1,2025-06-20 17:45:00,0.109090909090909,0.3333333333333333,0.9888888888888888,0.375,0.0,0.0,Interactive Exercise Algebra,0.5235556486108981,0.9963034216649884,0.2857142857142856,4,0,0.1917680159890264,0.9888888888888888,0.0608108108108108,2,0.3063263041065482,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 19 |
+
STU1143,0.1999999999999999,0,2025-06-25 16:45:00,0.4272727272727272,1.0,0.9111111111111112,0.625,0.5,0.2,Video Lesson World War,0.9829341963520212,0.5315303809355705,0.1428571428571428,2,0,0.1846782667821868,0.9111111111111112,0.4679054054054055,0,0.3310210876803552,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 20 |
+
STU1046,0.5999999999999999,0,2025-03-14 16:45:00,0.0818181818181818,0.4444444444444445,0.8333333333333334,0.5681836543433301,1.0,0.5333333333333334,Video Lesson Physics,0.9491244657566036,0.6830796202090033,0.1428571428571428,4,0,0.2821623856589356,0.8333333333333333,0.0667229729729729,0,0.1305956344802071,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 21 |
+
STU1164,0.8,1,2025-05-13 20:00:00,0.1545454545454545,0.6666666666666665,0.8999999999999999,0.5912314024085137,0.0,0.3999999999999999,Audio Lecture Literature,0.3191023304436176,0.711409198479234,0.714285714285714,1,0,0.2778297623423536,0.9000000000000001,0.1461148648648648,2,0.3129855715871253,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 22 |
+
STU1126,1.0000000000000002,1,2024-02-07 16:00:00,0.7,0.3333333333333333,0.8444444444444444,0.1207988624612208,0.75,0.0,Audio Lecture Chemistry,0.4429276831831524,0.0549890514854965,0.1428571428571428,2,0,0.0408051385700341,0.8444444444444444,0.2804054054054054,2,0.3779134295227524,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0,1.0,2.0,0,1
|
| 23 |
+
STU1168,0.0,0,2024-10-21 17:30:00,0.609090909090909,1.0,0.8222222222222222,0.375,0.5,0.1333333333333333,Interactive Exercise Algebra,0.3883763493819835,0.1926571057052733,0.2857142857142856,0,0,0.1340371613940268,0.8222222222222222,0.6368243243243243,0,0.3657047724750277,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 24 |
+
STU1158,0.5999999999999999,0,2024-07-03 21:00:00,0.0181818181818181,1.0,0.8555555555555555,0.625,0.75,0.2666666666666666,Video Lesson World War,0.6824886824968809,0.0647585482649579,0.8571428571428572,2,0,0.9158091743913784,0.8555555555555555,0.0878378378378378,1,0.5001849796522383,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,0.0,1,0
|
| 25 |
+
STU1091,0.3999999999999999,0,2024-09-29 22:00:00,0.7454545454545454,0.2222222222222222,0.9666666666666666,0.5847013960703209,0.75,0.5333333333333334,Video Lesson Programming,0.6806446031211876,0.4663394241295531,1.0,6,1,0.0259486741446228,0.9666666666666666,0.2195945945945946,0,0.1831298557158712,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 26 |
+
STU1121,1.0000000000000002,0,2025-02-18 15:30:00,0.7454545454545454,0.2222222222222222,0.9888888888888888,0.625,0.75,0.0666666666666667,Audio Lecture Modern History,0.9198735763978956,0.0384393650376045,0.0,1,0,0.0259486741446228,0.9888888888888888,0.2195945945945946,2,0.3079911209766925,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 27 |
+
STU1173,0.0,0,2024-12-25 18:00:00,0.9272727272727272,0.3333333333333333,0.8333333333333334,0.0,0.5,0.4666666666666667,Interactive Exercise Ancient Civilizations,0.3011587474359719,0.2087357000960709,0.4285714285714284,2,0,0.0293999757110805,0.8333333333333333,0.3648648648648649,2,0.4413614502404736,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,2.0,0.0,0,1
|
| 28 |
+
STU1155,0.1999999999999999,1,2025-06-29 16:30:00,0.6454545454545454,0.6666666666666665,0.7333333333333333,0.5912314024085137,1.0,0.1333333333333333,Video Lesson Grammar,0.7560720048047218,0.1397250197943573,0.1428571428571428,6,1,0.0857499288226175,0.7333333333333333,0.4653716216216216,2,0.4520902700702922,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 29 |
+
STU1068,1.0000000000000002,0,2025-01-03 22:45:00,0.1818181818181818,0.2222222222222222,0.6777777777777778,0.5681836543433301,0.25,0.8666666666666667,Interactive Exercise Biology,0.33277656825806,0.8052497769406544,1.0,4,0,0.1008419139685898,0.6777777777777777,0.0625,1,0.2047724750277469,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0,2.0,1.0,0,0
|
| 30 |
+
STU1146,1.0000000000000002,0,2024-08-07 21:00:00,0.709090909090909,0.5555555555555556,0.7222222222222222,0.5847013960703209,0.0,0.7333333333333334,Video Lesson Programming,0.7437976259548672,0.8836880616022553,0.8571428571428572,2,0,0.065481763895085,0.7222222222222222,0.4324324324324324,1,0.4334073251942286,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 31 |
+
STU1037,0.0,1,2024-11-19 17:45:00,0.1272727272727272,0.8888888888888888,0.8222222222222222,0.0139607032057917,0.5,0.0,Audio Lecture Calculus,0.8698855222250614,0.5246296719978385,0.2857142857142856,1,0,0.4064546505186224,0.8222222222222222,0.1689189189189189,1,0.2669256381798002,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0,1
|
| 32 |
+
STU1112,0.0,0,2024-11-05 19:30:00,0.1181818181818181,0.6666666666666665,0.9888888888888888,0.5681836543433301,0.5,0.1333333333333333,Video Lesson Physics,0.863229162957669,0.9783208901452084,0.5714285714285712,1,0,0.3279375434396915,0.9888888888888888,0.1224662162162162,1,0.0488346281908989,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,1.0,0.0,1,0
|
| 33 |
+
STU1139,1.0000000000000002,0,2025-05-12 19:15:00,0.6454545454545454,1.0,0.8333333333333334,0.5681836543433301,0.0,0.8666666666666667,Audio Lecture Chemistry,0.3467422872761973,0.0246006528410567,0.5714285714285712,0,0,0.1269098946727184,0.8333333333333333,0.6706081081081082,2,0.2802441731409545,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,1.0,1,0
|
| 34 |
+
STU1024,0.8,1,2024-05-06 18:45:00,0.3727272727272727,0.6666666666666665,0.7777777777777778,0.5681836543433301,1.0,1.0,Interactive Exercise Biology,0.8958564158902083,0.7623066120152141,0.4285714285714284,0,0,0.1422439984895389,0.7777777777777778,0.2880067567567568,0,0.1176470588235294,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 35 |
+
STU1190,0.8,0,2025-02-24 19:00:00,0.809090909090909,0.7777777777777777,0.9888888888888888,0.5847013960703209,1.0,0.3333333333333333,Video Lesson Programming,0.7397095740941637,0.9809790634754756,0.5714285714285712,0,0,0.0795135705620603,0.9888888888888888,0.6554054054054055,2,0.7918978912319644,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 36 |
+
STU1030,0.1999999999999999,1,2025-06-28 15:30:00,0.6545454545454544,0.4444444444444445,0.8666666666666667,0.5912314024085137,1.0,0.6000000000000001,Video Lesson Grammar,0.4898163483934529,0.0896283653779353,0.0,5,1,0.0574733669276692,0.8666666666666667,0.3327702702702703,1,0.3701442841287459,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 37 |
+
STU1129,0.5999999999999999,0,2024-11-16 21:30:00,0.1818181818181818,0.6666666666666665,0.6888888888888889,0.5912314024085137,1.0,0.6000000000000001,Interactive Exercise Vocabulary,0.618762185876628,0.5457748043851429,0.8571428571428572,5,1,0.2490177879190889,0.6888888888888889,0.1638513513513513,0,0.0904550499445061,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,2.0,0,0
|
| 38 |
+
STU1185,1.0000000000000002,0,2024-04-09 15:45:00,0.0818181818181818,0.6666666666666665,0.8555555555555555,0.5681836543433301,0.75,0.0,Audio Lecture Chemistry,0.8701004058743459,0.7327727578802335,0.0,1,0,0.3991433365202236,0.8555555555555555,0.0988175675675675,0,0.7531631520532742,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 39 |
+
STU1036,0.0,1,2025-06-18 22:30:00,0.0,0.2222222222222222,0.8999999999999999,0.0,0.75,0.2666666666666666,Video Lesson Physics,0.780568739243086,0.0744037756165882,1.0,2,0,0.3231057026679597,0.9000000000000001,0.0118243243243243,1,0.0011098779134295,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0,1.0,0.0,0,1
|
| 40 |
+
STU1137,1.0000000000000002,1,2025-05-08 21:30:00,0.6272727272727272,0.3333333333333333,0.8222222222222222,0.0,0.25,0.9333333333333332,Interactive Exercise Ancient Civilizations,0.4761078569851258,0.1083383983410264,0.8571428571428572,3,0,0.0459793288907981,0.8222222222222222,0.2533783783783784,1,0.4953755086940437,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,2.0,1.0,0,1
|
| 41 |
+
STU1034,1.0000000000000002,0,2024-08-04 19:15:00,0.6,0.5555555555555556,0.977777777777778,1.0,0.5,0.2666666666666666,Audio Lecture Literature,0.0221610398186905,0.497156751025593,0.5714285714285712,6,1,0.0774457251149333,0.977777777777778,0.3716216216216216,0,0.750832408435072,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,1
|
| 42 |
+
STU1004,0.1999999999999999,0,2025-04-01 22:15:00,0.9818181818181818,0.5555555555555556,0.8111111111111111,0.625,0.75,0.6000000000000001,Audio Lecture Modern History,0.4122156422994131,0.7469371277223724,1.0,1,0,0.0462177584508725,0.811111111111111,0.5844594594594595,0,0.5929522752497225,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 43 |
+
STU1111,0.1999999999999999,1,2024-10-14 19:15:00,0.0181818181818181,0.3333333333333333,0.9222222222222224,0.5912314024085137,0.5,0.3999999999999999,Interactive Exercise Vocabulary,0.2184673302996833,0.2683455788349927,0.5714285714285712,0,0,0.3601496748599807,0.9222222222222224,0.027027027027027,2,0.2119866814650388,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 44 |
+
STU1179,0.3999999999999999,0,2025-02-16 16:30:00,0.1727272727272727,0.6666666666666665,0.7111111111111111,0.375,0.25,0.4666666666666667,Interactive Exercise Algebra,0.3099497570088037,0.5203153578770995,0.1428571428571428,6,1,0.2579594351767347,0.7111111111111111,0.1579391891891892,0,0.0588235294117647,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,0.0,2.0,0,0
|
| 45 |
+
STU1022,0.1999999999999999,0,2025-05-15 15:15:00,0.6818181818181818,0.8888888888888888,0.7999999999999999,0.0,0.5,0.1333333333333333,Audio Lecture Modern History,0.098896608886692,0.8721432131441298,0.0,3,0,0.1073790874161311,0.7999999999999999,0.6326013513513514,0,0.6052534221235665,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,2.0,0,1
|
| 46 |
+
STU1049,0.1999999999999999,0,2024-12-22 21:30:00,0.2636363636363636,0.2222222222222222,0.8555555555555555,0.5912314024085137,1.0,0.8666666666666667,Interactive Exercise Vocabulary,0.2478926713512718,0.7149425802800202,0.8571428571428572,6,1,0.0751960902885887,0.8555555555555555,0.085304054054054,2,0.2175360710321865,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 47 |
+
STU1010,1.0000000000000002,1,2025-06-02 21:00:00,0.8999999999999999,0.6666666666666665,0.9111111111111112,0.5681836543433301,0.5,1.0,Video Lesson Physics,0.1199020962243293,0.8529707467367437,0.8571428571428572,0,0,0.0610791238299345,0.9111111111111112,0.6309121621621622,0,0.2397336293007769,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,1.0,1,0
|
| 48 |
+
STU1196,0.3999999999999999,0,2025-03-21 18:45:00,0.4909090909090908,0.8888888888888888,1.0,0.375,1.0,0.2,Video Lesson Algebra,0.7471945889417827,0.4262280404364546,0.4285714285714284,4,0,0.1459892533303274,1.0,0.472972972972973,0,0.1576026637069922,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,2.0,2.0,1,0
|
| 49 |
+
STU1060,0.5999999999999999,0,2025-04-15 21:15:00,0.1272727272727272,0.6666666666666665,0.9111111111111112,0.5847013960703209,0.0,0.5333333333333334,Interactive Exercise Algorithms,0.0838563414768952,0.8772177576113912,0.8571428571428572,1,0,0.3138447300713097,0.9111111111111112,0.1283783783783783,1,0.1664816870144283,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,0
|
| 50 |
+
STU1078,1.0000000000000002,1,2025-04-23 17:30:00,0.6909090909090908,0.5555555555555556,0.7999999999999999,0.0,0.0,0.4666666666666667,Interactive Exercise Vocabulary,0.463388508770417,0.5596722779247028,0.2857142857142856,2,0,0.0672438977208595,0.7999999999999999,0.4222972972972973,1,0.2663706992230854,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0.0,1.0,0,1
|
| 51 |
+
STU1182,0.5999999999999999,0,2024-04-05 19:30:00,0.9545454545454544,0.4444444444444445,0.8555555555555555,1.0,0.25,0.9333333333333332,Video Lesson World War,0.9279368332894496,0.6973685141024625,0.5714285714285712,4,0,0.0380282294626315,0.8555555555555555,0.4721283783783784,2,0.2386237513873474,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,1.0,0.0,1,1
|
| 52 |
+
STU1102,0.1999999999999999,1,2024-09-13 21:30:00,0.7909090909090908,0.7777777777777777,0.7777777777777778,0.625,0.75,0.8,Audio Lecture Modern History,0.0541301191185069,0.3556697927728817,0.8571428571428572,4,0,0.0813651903791847,0.7777777777777778,0.641891891891892,0,0.4961154273029966,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,0
|
| 53 |
+
STU1162,0.0,1,2025-04-30 22:45:00,0.6272727272727272,0.5555555555555556,0.7999999999999999,1.0,0.25,0.8,Interactive Exercise Biology,0.8852629747698798,0.4603281445721182,1.0,2,0,0.0741139890833395,0.7999999999999999,0.3868243243243243,2,0.4017758046614873,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,1.0,1.0,1,1
|
| 54 |
+
STU1083,0.3999999999999999,0,2024-04-20 17:00:00,0.5272727272727272,1.0,0.8222222222222222,0.375,1.0,0.0,Interactive Exercise Algebra,0.9719071470554048,0.6561177491926868,0.2857142857142856,5,1,0.1531392842895073,0.8222222222222222,0.5608108108108109,0,0.345541990381058,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,1.0,1,0
|
| 55 |
+
STU1045,0.1999999999999999,0,2025-05-07 16:00:00,0.7636363636363636,0.4444444444444445,0.977777777777778,0.5847013960703209,0.75,0.8666666666666667,Interactive Exercise Algorithms,0.8764148874962948,0.6976298620700548,0.1428571428571428,2,0,0.0488227255190223,0.977777777777778,0.3834459459459459,1,0.5837957824639289,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,1.0,1,0
|
| 56 |
+
STU1132,0.5999999999999999,1,2025-05-13 20:00:00,0.2727272727272727,0.7777777777777777,0.7,0.6549896587383661,1.0,0.1333333333333333,Video Lesson Grammar,0.2017747564177291,0.5702238525564925,0.714285714285714,1,0,0.2119738212836626,0.7,0.2567567567567568,2,0.4384017758046615,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,0.0,0,1
|
| 57 |
+
STU1062,0.0,0,2025-03-27 18:15:00,0.1545454545454545,0.5555555555555556,0.8555555555555555,0.625,0.75,0.2666666666666666,Interactive Exercise Ancient Civilizations,0.999751898897204,0.6700251659915546,0.4285714285714284,3,0,0.2366697975085482,0.8555555555555555,0.1233108108108108,0,0.4365519792822789,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,2.0,1,0
|
| 58 |
+
STU1093,0.8,0,2025-07-02 22:30:00,0.3909090909090909,0.6666666666666665,0.7888888888888889,0.5681836543433301,1.0,0.2666666666666666,Video Lesson Physics,0.2353119697328168,0.8192941209847273,1.0,2,0,0.1364879989761116,0.788888888888889,0.2998310810810811,2,0.4064927857935627,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 59 |
+
STU1035,0.8,1,2025-05-18 16:15:00,0.4999999999999999,0.8888888888888888,0.7999999999999999,0.5681836543433301,0.75,0.0,Video Lesson Physics,0.5334118199438668,0.7306796134847616,0.1428571428571428,6,1,0.1435849572930918,0.7999999999999999,0.4805743243243243,0,0.3662597114317425,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 60 |
+
STU1061,0.3999999999999999,0,2025-06-24 18:15:00,0.8545454545454545,1.0,0.7,0.5912314024085137,0.5,0.2,Interactive Exercise Vocabulary,0.1737465714942065,0.9561324328176752,0.4285714285714284,1,0,0.0965676124467685,0.7,0.8648648648648649,1,0.4839067702552719,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,2.0,2.0,0,0
|
| 61 |
+
STU1178,0.8,0,2025-03-06 21:15:00,0.5272727272727272,0.4444444444444445,0.977777777777778,0.1742179420889353,0.0,0.0,Video Lesson Algebra,0.671580893639549,0.4349141365957127,0.8571428571428572,3,0,0.0714246463976114,0.977777777777778,0.2736486486486487,2,0.6051054384017758,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,0.0,0,1
|
| 62 |
+
STU1152,0.0,1,2024-05-03 17:15:00,0.5636363636363636,0.7777777777777777,0.9222222222222224,0.5847013960703209,0.25,0.3999999999999999,Video Lesson Programming,0.8009502761050026,0.3595029220529698,0.2857142857142856,4,0,0.1131899058654627,0.9222222222222224,0.472972972972973,2,0.516093229744728,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 63 |
+
STU1130,0.8,1,2025-05-09 19:15:00,0.8181818181818181,0.7777777777777777,0.977777777777778,0.375,0.75,0.6000000000000001,Interactive Exercise Algebra,0.7812548454605317,0.2922597218493973,0.5714285714285712,4,0,0.0786155349504772,0.977777777777778,0.6621621621621622,2,0.4528301886792452,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,0.0,1,0
|
| 64 |
+
STU1039,0.3999999999999999,1,2024-02-23 17:45:00,0.609090909090909,0.2222222222222222,0.8555555555555555,0.625,0.75,0.3333333333333333,Audio Lecture Modern History,0.5784410904302985,0.7305150380584934,0.2857142857142856,4,0,0.0330081543722089,0.8555555555555555,0.1815878378378378,0,0.8718091009988901,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 65 |
+
STU1169,0.0,0,2025-02-14 21:30:00,0.1999999999999999,0.7777777777777777,0.8777777777777778,0.375,0.5,0.6666666666666667,Audio Lecture Calculus,0.7574014153590986,0.0387008588734111,0.8571428571428572,4,0,0.2675397727417134,0.8777777777777778,0.2027027027027027,1,0.1048834628190898,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,0.0,1,0
|
| 66 |
+
STU1163,0.5999999999999999,0,2025-04-29 21:15:00,0.1181818181818181,1.0,0.7666666666666666,0.5912314024085137,0.75,0.0666666666666667,Video Lesson Grammar,0.2149865273803909,0.5515320928153924,0.8571428571428572,1,0,0.4728922012685383,0.7666666666666667,0.1807432432432432,2,0.2608213096559378,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 67 |
+
STU1071,0.1999999999999999,0,2025-01-18 17:15:00,0.8181818181818181,0.2222222222222222,0.8999999999999999,0.5912314024085137,0.25,0.7333333333333334,Interactive Exercise Vocabulary,0.5395308031186095,0.1620419707429955,0.2857142857142856,5,1,0.0230495809225011,0.9000000000000001,0.2398648648648648,0,0.5529966703662597,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,0
|
| 68 |
+
STU1180,0.0,0,2025-04-05 21:30:00,0.4727272727272726,0.4444444444444445,0.8444444444444444,0.5847013960703209,0.0,0.3999999999999999,Video Lesson Programming,0.5998070977990106,0.3671534600087269,0.8571428571428572,5,1,0.0793325144531519,0.8444444444444444,0.2483108108108108,1,0.1176470588235293,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,1.0,1,0
|
| 69 |
+
STU1104,0.8,0,2025-06-16 15:15:00,0.4454545454545454,0.8888888888888888,0.7777777777777778,0.375,0.25,0.4666666666666667,Video Lesson Algebra,0.3941452429342989,0.5381183709118588,0.0,0,0,0.1592332569045487,0.7777777777777778,0.4349662162162162,0,0.1365149833518312,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 70 |
+
STU1134,0.3999999999999999,0,2024-06-29 19:00:00,0.3181818181818181,0.3333333333333333,1.0,0.625,0.25,0.1333333333333333,Interactive Exercise Ancient Civilizations,0.1541879195806367,0.3349567351585688,0.5714285714285712,5,1,0.088493925570314,1.0,0.1385135135135135,0,0.169811320754717,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 71 |
+
STU1086,1.0000000000000002,1,2024-09-13 21:15:00,0.0909090909090909,0.2222222222222222,0.8555555555555555,0.5912314024085137,0.25,0.6000000000000001,Video Lesson Grammar,0.0899127563010276,0.5516249646953622,0.8571428571428572,4,0,0.1564078639217295,0.8555555555555555,0.0371621621621621,1,0.0554938956714761,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 72 |
+
STU1005,0.1999999999999999,0,2024-07-14 17:15:00,0.6636363636363636,0.5555555555555556,0.9222222222222224,0.375,0.0,0.8666666666666667,Interactive Exercise Algebra,0.6575863781694877,0.5850497181319968,0.2857142857142856,6,1,0.0700463274177631,0.9222222222222224,0.4070945945945946,0,0.3144654088050315,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 73 |
+
STU1194,0.5999999999999999,1,2024-12-30 15:15:00,0.8727272727272727,0.4444444444444445,0.7888888888888889,0.5912314024085137,0.75,0.3999999999999999,Video Lesson Grammar,0.3079248658964315,0.7783637005137007,0.0,0,0,0.0421307198825348,0.788888888888889,0.4341216216216216,2,0.3712541620421753,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 74 |
+
STU1177,1.0000000000000002,1,2025-06-04 22:45:00,0.7909090909090908,0.4444444444444445,0.8333333333333334,0.5912314024085137,0.75,0.6666666666666667,Audio Lecture Literature,0.5165302648769683,0.6312857041311745,1.0,2,0,0.0469944971766338,0.8333333333333333,0.3961148648648649,0,0.295227524972253,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,0
|
| 75 |
+
STU1081,0.3999999999999999,1,2024-12-19 22:45:00,0.4999999999999999,0.5555555555555556,0.8777777777777778,0.1207988624612208,0.25,0.8666666666666667,Video Lesson Grammar,0.4074329431073227,0.1453703219947636,1.0,3,0,0.0922933076972997,0.8777777777777778,0.3158783783783784,0,0.3629300776914539,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,2.0,1.0,0,1
|
| 76 |
+
STU1042,1.0000000000000002,0,2024-10-02 22:00:00,0.7454545454545454,0.3333333333333333,0.9555555555555556,0.0,0.25,0.5333333333333334,Audio Lecture Literature,0.8879926229715808,0.0758193749228285,1.0,2,0,0.0380282293575919,0.9555555555555556,0.2972972972972973,0,0.4001109877913429,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,0.0,2.0,0,1
|
| 77 |
+
STU1114,0.8,0,2025-06-12 22:15:00,0.1636363636363636,0.7777777777777777,0.7111111111111111,0.0,1.0,0.8666666666666667,Video Lesson Programming,0.7663790808151407,0.4695206573089047,1.0,3,0,0.3072297376436429,0.7111111111111111,0.1756756756756756,2,0.0721420643729189,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 78 |
+
STU1004,0.1999999999999999,0,2023-11-13 15:15:00,0.0454545454545454,0.2222222222222222,0.7111111111111111,0.625,0.25,0.4666666666666667,Video Lesson World War,0.9605329164644928,0.1305403418980681,0.0,0,0,0.211973812022671,0.7111111111111111,0.0244932432432432,0,0.5929522752497225,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,2.0,0,0
|
| 79 |
+
STU1195,0.3999999999999999,0,2025-04-01 16:45:00,0.9909090909090909,0.8888888888888888,0.9333333333333332,0.5912314024085137,0.0,0.0,Video Lesson Grammar,0.2064632042796024,0.0258756522852011,0.1428571428571428,1,0,0.0737593508671026,0.9333333333333332,0.8910472972972974,0,0.6034036256011839,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 80 |
+
STU1128,0.1999999999999999,1,2024-11-08 17:00:00,0.4909090909090908,0.8888888888888888,0.9666666666666666,0.0,1.0,0.6000000000000001,Video Lesson Grammar,0.115165082376858,0.2300868156515395,0.2857142857142856,4,0,0.1459892533303274,0.9666666666666666,0.472972972972973,1,0.1576026637069922,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,0.0,0,1
|
| 81 |
+
STU1073,0.3999999999999999,1,2025-04-15 21:30:00,0.7999999999999999,0.3333333333333333,0.7888888888888889,0.625,0.0,0.5333333333333334,Video Lesson World War,0.5815590307458806,0.1455647876458446,0.8571428571428572,1,0,0.0350699709682756,0.788888888888889,0.3175675675675675,1,0.5396781354051055,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 82 |
+
STU1149,0.8,0,2024-12-26 20:00:00,0.4909090909090908,0.8888888888888888,0.7777777777777778,0.5912314024085137,0.25,0.3999999999999999,Audio Lecture Literature,0.502395279658993,0.8565515269084977,0.714285714285714,3,0,0.1459892533303274,0.7777777777777778,0.472972972972973,0,0.6362375138734739,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 83 |
+
STU1103,0.5999999999999999,0,2025-06-23 19:45:00,0.1363636363636363,0.4444444444444445,0.9888888888888888,0.5681836543433301,0.75,0.1333333333333333,Audio Lecture Chemistry,0.3312744672188638,0.2233126629000416,0.5714285714285712,0,0,0.2119738179497055,0.9888888888888888,0.0920608108108108,1,0.3621901590825009,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,0.0,1,0
|
| 84 |
+
STU1090,1.0000000000000002,0,2025-01-01 22:30:00,0.7636363636363636,0.7777777777777777,0.7777777777777778,1.0,0.0,0.2666666666666666,Audio Lecture Literature,0.924121163158115,0.608683679320681,1.0,2,0,0.0842903557270064,0.7777777777777778,0.6216216216216217,1,0.3736588975212727,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,2.0,1,1
|
| 85 |
+
STU1014,0.8,1,2025-05-01 16:30:00,0.7545454545454545,0.6666666666666665,0.9222222222222224,0.5912314024085137,1.0,0.5333333333333334,Audio Lecture Literature,0.6967344336519914,0.1366916308696201,0.1428571428571428,3,0,0.0733576811730414,0.9222222222222224,0.5363175675675677,1,0.2108768035516093,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,0.0,1,0
|
| 86 |
+
STU1087,0.8,1,2024-12-04 20:45:00,0.1636363636363636,0.8888888888888888,0.9555555555555556,0.5847013960703209,0.0,0.8666666666666667,Video Lesson Programming,0.4755514297496868,0.4458960690279354,0.714285714285714,2,0,0.3469197037858838,0.9555555555555556,0.1993243243243243,2,0.0643729189789123,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 87 |
+
STU1099,0.1999999999999999,1,2025-06-26 15:45:00,0.9454545454545454,0.6666666666666665,0.9333333333333332,1.0,0.5,0.4666666666666667,Video Lesson Grammar,0.5389727679953009,0.9068310888403972,0.0,3,0,0.0579488995010672,0.9333333333333332,0.660472972972973,0,0.2508324084350721,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,0.0,1,1
|
| 88 |
+
STU1106,0.8,0,2024-09-10 18:15:00,0.6818181818181818,0.7777777777777777,0.7555555555555555,1.0,0.0,0.5333333333333334,Interactive Exercise Biology,0.3805373591782654,0.9038559500606316,0.4285714285714284,1,0,0.0943047453149738,0.7555555555555555,0.5608108108108109,0,0.4095449500554938,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,1
|
| 89 |
+
STU1184,0.3999999999999999,0,2025-06-27 17:00:00,0.1545454545454545,0.5555555555555556,0.8444444444444444,0.625,0.25,0.3333333333333333,Interactive Exercise Ancient Civilizations,0.0352295821414593,0.0085139403873748,0.2857142857142856,4,0,0.2366697975085482,0.8444444444444444,0.1233108108108108,0,0.0488346281908989,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,1.0,1.0,1,0
|
| 90 |
+
STU1038,0.0,1,2024-11-02 19:15:00,0.1363636363636363,0.8888888888888888,0.7333333333333333,0.625,0.5,0.2,Interactive Exercise Ancient Civilizations,0.04332716332248,0.633162199718396,0.5714285714285712,5,1,0.3897848655048975,0.7333333333333333,0.1765202702702702,2,0.0643729189789123,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 91 |
+
STU1109,0.3999999999999999,0,2025-06-18 18:15:00,0.209090909090909,0.5555555555555556,0.7555555555555555,0.375,0.25,0.8666666666666667,Video Lesson Algebra,0.4731776123086155,0.7827902660005365,0.4285714285714284,2,0,0.1917680190505113,0.7555555555555555,0.1537162162162162,0,0.0776914539400665,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,2.0,1,0
|
| 92 |
+
STU1160,0.5999999999999999,1,2025-04-23 17:30:00,0.2454545454545454,0.3333333333333333,0.8222222222222222,0.625,0.5,0.1333333333333333,Audio Lecture Modern History,0.2013385801297555,0.2062260742804656,0.2857142857142856,2,0,0.1098526097637762,0.8222222222222222,0.1114864864864864,1,0.0632630410654827,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 93 |
+
STU1066,0.3999999999999999,1,2025-03-15 16:15:00,0.4454545454545454,1.0,0.7,0.625,0.5,0.6000000000000001,Interactive Exercise Ancient Civilizations,0.0520714765706797,0.997306502962102,0.1428571428571428,5,1,0.178069173393308,0.7,0.4847972972972973,1,0.1453940066592675,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,0.0,0,0
|
| 94 |
+
STU1159,0.0,1,2025-04-17 15:00:00,0.3545454545454545,0.6666666666666665,0.7,0.625,1.0,0.3333333333333333,Video Lesson World War,0.4970724698649821,0.6033949399699028,0.0,3,0,0.1484698755046771,0.7,0.2761824324324324,2,0.2835738068812431,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,0.0,0,0
|
| 95 |
+
STU1098,0.1999999999999999,1,2024-11-29 20:15:00,0.0999999999999999,0.2222222222222222,0.8111111111111111,0.0,0.25,0.1333333333333333,Video Lesson Physics,0.9608184809245712,0.0959806308299899,0.714285714285714,4,0,0.1484698711846809,0.811111111111111,0.0396959459459459,2,0.4450610432852386,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0,0.0,0.0,0,1
|
| 96 |
+
STU1101,1.0000000000000002,0,2025-06-22 17:30:00,0.2363636363636363,0.8888888888888888,0.9111111111111112,0.5847013960703209,0.75,0.0,Video Lesson Programming,0.0668025338896292,0.6963024171446645,0.2857142857142856,6,1,0.2675397737064,0.9111111111111112,0.2601351351351352,0,0.0921198668146503,0.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,0.0,1,0
|
| 97 |
+
STU1148,1.0000000000000002,0,2025-04-13 18:15:00,0.1999999999999999,0.2222222222222222,0.8777777777777778,0.0673797828335063,0.25,0.1333333333333333,Video Lesson Physics,0.5221223618549242,0.0602062893752324,0.4285714285714284,6,1,0.0938961700942147,0.8777777777777778,0.0675675675675675,1,0.0876803551609322,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 98 |
+
STU1003,0.8,1,2025-06-20 15:00:00,0.9818181818181818,0.8888888888888888,0.8111111111111111,0.625,0.75,0.1333333333333333,Video Lesson World War,0.320523694056688,0.1477637206859045,0.0,4,0,0.0744716334234509,0.811111111111111,0.883445945945946,1,0.8706992230854607,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 99 |
+
STU1047,0.0,1,2025-05-04 20:30:00,0.6636363636363636,0.6666666666666665,0.8333333333333334,1.0,0.5,0.8,Video Lesson Algebra,0.7510430679411558,0.1276554701954296,0.714285714285714,6,1,0.0834357139031044,0.8333333333333333,0.4771959459459459,0,0.4334073251942286,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,0.0,1,1
|
| 100 |
+
STU1089,0.5999999999999999,0,2024-10-17 20:15:00,0.3727272727272727,0.6666666666666665,0.7999999999999999,0.625,0.0,0.3999999999999999,Video Lesson World War,0.7530187183365914,0.5859029228243289,0.714285714285714,3,0,0.1422439984895389,0.7999999999999999,0.2880067567567568,2,0.336662967073622,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 101 |
+
STU1167,0.0,0,2025-06-15 21:45:00,0.5363636363636363,1.0,0.7111111111111111,1.0,0.75,0.0,Video Lesson World War,0.7893580812552008,0.3811237015088908,0.8571428571428572,6,1,0.1507707440950834,0.7111111111111111,0.5692567567567568,0,0.318534961154273,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,1.0,0.0,0,1
|
| 102 |
+
STU1085,0.0,0,2024-10-17 18:45:00,0.509090909090909,0.5555555555555556,0.8444444444444444,1.0,1.0,0.9333333333333332,Video Lesson Grammar,0.8848119967564771,0.7230077728671821,0.4285714285714284,3,0,0.0907390153088559,0.8444444444444444,0.3209459459459459,1,0.2397336293007769,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,1.0,1,1
|
| 103 |
+
STU1189,1.0000000000000002,1,2025-03-02 20:00:00,0.2181818181818181,0.4444444444444445,0.7,0.5847013960703209,0.75,0.5333333333333334,Audio Lecture Data Structures,0.805779872236121,0.5860663676351006,0.714285714285714,6,1,0.1531392818861357,0.7,0.1300675675675675,0,0.1165371809100999,0.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0,0
|
| 104 |
+
STU1175,0.0,0,2025-06-17 20:45:00,0.5818181818181818,0.5555555555555556,0.9888888888888888,0.5912314024085137,0.0,0.0,Video Lesson Grammar,0.0834336676290356,0.186259618686583,0.714285714285714,1,0,0.0798169606669225,0.9888888888888888,0.3614864864864865,1,0.1498335183129855,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 105 |
+
STU1067,0.3999999999999999,0,2024-12-29 18:15:00,0.609090909090909,0.3333333333333333,0.8777777777777778,0.375,1.0,0.4666666666666667,Interactive Exercise Algebra,0.7713209186249291,0.6592753500528468,0.4285714285714284,6,1,0.04744086966104,0.8777777777777778,0.2466216216216216,1,0.1587125416204217,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 106 |
+
STU1151,0.3999999999999999,1,2025-04-28 17:30:00,0.609090909090909,0.8888888888888888,0.977777777777778,1.0,0.0,0.8,Video Lesson Grammar,0.0051463801049845,0.3219907415819122,0.2857142857142856,0,0,0.1196044461051956,0.977777777777778,0.5717905405405406,2,0.3618201997780245,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,2.0,1,1
|
| 107 |
+
STU1125,1.0000000000000002,0,2025-05-29 16:30:00,0.6909090909090908,0.6666666666666665,0.7222222222222222,0.625,0.5,0.2666666666666666,Audio Lecture Modern History,0.7686346332670541,0.2495534803915156,0.1428571428571428,3,0,0.0801662125900501,0.7222222222222222,0.4949324324324324,0,0.1886792452830188,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 108 |
+
STU1188,0.5999999999999999,1,2024-10-02 22:30:00,0.0545454545454545,0.6666666666666665,0.6666666666666666,0.5681836543433301,0.0,0.0666666666666667,Audio Lecture Chemistry,0.4579452966893717,0.2886455481256465,1.0,2,0,0.4759120807248974,0.6666666666666666,0.081081081081081,0,0.2003329633740288,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0,1.0,1.0,0,0
|
| 109 |
+
STU1012,0.5999999999999999,1,2025-04-25 19:45:00,0.9727272727272726,1.0,0.7666666666666666,0.375,0.75,0.2666666666666666,Interactive Exercise Algebra,0.7282514176574155,0.7639109794034082,0.5714285714285712,4,0,0.0846945454436863,0.7666666666666667,0.9746621621621624,2,0.2774694783573806,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,1.0,1,0
|
| 110 |
+
STU1166,0.1999999999999999,1,2024-02-14 22:30:00,0.7181818181818181,0.8888888888888888,0.6888888888888889,0.375,0.75,0.0,Audio Lecture Calculus,0.6749396270385014,0.3180004377626736,1.0,2,0,0.1020905895469944,0.6888888888888889,0.6630067567567568,2,0.3921568627450981,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,0.0,1.0,0,0
|
| 111 |
+
STU1018,1.0000000000000002,0,2024-09-11 17:00:00,0.5818181818181818,1.0,0.7888888888888889,1.0,1.0,1.0,Audio Lecture Chemistry,0.4872194626850976,0.0058985050143313,0.2857142857142856,2,0,0.1398882621077272,0.788888888888889,0.6114864864864865,2,0.1853496115427303,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,0.0,1,1
|
| 112 |
+
STU1019,0.3999999999999999,0,2025-04-06 22:45:00,0.9090909090909092,0.7777777777777777,0.8666666666666667,0.5681836543433301,1.0,0.0666666666666667,Video Lesson Physics,0.2091923119954345,0.868276856073035,1.0,6,1,0.0705332144380654,0.8666666666666667,0.7297297297297298,2,0.686644469108398,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,0.0,1,0
|
| 113 |
+
STU1059,0.1999999999999999,1,2024-09-18 19:30:00,0.3545454545454545,0.0,0.1444444444444445,0.5681836543433301,0.0,0.6666666666666667,Interactive Exercise Biology,0.3948864234287349,0.5687780347297534,0.5714285714285712,2,0,0.0123899895055672,0.1444444444444445,0.0278716216216216,1,0.3013318534961154,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,2.0,0,0
|
| 114 |
+
STU1029,0.5999999999999999,0,2025-04-02 21:30:00,0.0272727272727272,0.7777777777777777,0.8777777777777778,1.0,0.0,1.0,Audio Lecture Data Structures,0.3560479024967615,0.583860696511781,0.8571428571428572,2,0,0.6735986276974907,0.8777777777777778,0.0743243243243243,0,0.097669256381798,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,2.0,1,1
|
| 115 |
+
STU1055,0.8,1,2025-04-11 17:45:00,0.7,0.7777777777777777,0.8222222222222222,0.625,0.25,0.3999999999999999,Video Lesson World War,0.3073348536793754,0.7051310433971978,0.2857142857142856,4,0,0.0919002686343527,0.8222222222222222,0.5743243243243243,2,0.4324824269330374,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,1.0,0.0,1,0
|
| 116 |
+
STU1028,0.1999999999999999,1,2025-05-13 16:15:00,0.5363636363636363,0.7777777777777777,0.8111111111111111,0.3344751809720789,0.75,0.6000000000000001,Interactive Exercise Algebra,0.2630913902310068,0.1193146249188182,0.1428571428571428,1,0,0.1185585969772098,0.811111111111111,0.4527027027027027,2,0.5235849056603774,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,1.0,2.0,1,1
|
| 117 |
+
STU1140,0.0,1,2024-09-18 20:00:00,0.5363636363636363,0.3333333333333333,0.8666666666666667,0.5912314024085137,0.0,0.1333333333333333,Video Lesson Grammar,0.7303054770558202,0.1851266429469031,0.714285714285714,2,0,0.0541343027414627,0.8666666666666667,0.2195945945945946,1,0.4961154273029966,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,2.0,0.0,1,0
|
| 118 |
+
STU1032,1.0000000000000002,1,2025-06-05 15:45:00,0.4818181818181818,1.0,0.8666666666666667,0.5847013960703209,0.5,0.1333333333333333,Interactive Exercise Algorithms,0.904528548419776,0.71430965510493,0.0,3,0,0.1661098615267832,0.8666666666666667,0.5185810810810811,2,0.2003329633740288,1.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 119 |
+
STU1165,1.0000000000000002,1,2025-03-25 19:45:00,0.4181818181818181,0.8888888888888888,0.8111111111111111,0.625,0.5,0.5333333333333334,Audio Lecture Modern History,0.1905722150675996,0.281206242727938,0.5714285714285712,1,0,0.1683148593351719,0.811111111111111,0.4121621621621621,2,0.1331853496115427,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 120 |
+
STU1000,0.0,1,2024-09-25 15:30:00,0.4363636363636363,0.4444444444444445,0.6888888888888889,0.5847013960703209,0.25,0.4666666666666667,Audio Lecture Data Structures,0.3478720728004227,0.6738459925422966,0.0,2,0,0.0855133768257188,0.6888888888888889,0.2314189189189189,2,1.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0.0,2.0,0,0
|
| 121 |
+
STU1001,0.1999999999999999,1,2025-06-10 19:30:00,0.1454545454545454,0.6666666666666665,0.977777777777778,0.5847013960703209,1.0,0.1333333333333333,Audio Lecture Data Structures,0.0810566746333176,0.3464105490123374,0.5714285714285712,1,0,0.2889112909098579,0.977777777777778,0.1402027027027027,0,0.1361450240473548,0.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 122 |
+
STU1064,0.1999999999999999,0,2025-01-18 19:45:00,0.7818181818181817,0.7777777777777777,1.0,0.625,0.0,0.7333333333333334,Interactive Exercise Ancient Civilizations,0.6105559126258934,0.6520067508910071,0.5714285714285712,5,1,0.0823199318470881,1.0,0.6351351351351352,2,0.7142064372918979,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,1.0,1,0
|
| 123 |
+
STU1051,0.5999999999999999,0,2024-04-23 20:00:00,0.409090909090909,0.4444444444444445,0.9111111111111112,0.625,0.25,1.0,Video Lesson World War,0.3151205368639675,0.5581962140132246,0.714285714285714,1,0,0.0907390150027074,0.9111111111111112,0.21875,2,0.1759156492785794,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,0.0,1,0
|
| 124 |
+
STU1013,0.3999999999999999,0,2025-01-16 19:30:00,0.9636363636363636,0.1111111111111111,0.0333333333333333,0.5681836543433301,0.0,0.7333333333333334,Interactive Exercise Biology,0.6742409023430315,0.980171375427846,0.5714285714285712,3,0,0.0088706823348944,0.0333333333333333,0.1824324324324324,0,0.413984461709212,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0,0
|
| 125 |
+
STU1002,0.0,1,2025-05-10 15:00:00,0.2818181818181817,0.4444444444444445,0.9444444444444444,0.5681836543433301,1.0,0.3999999999999999,Audio Lecture Chemistry,0.2137526852826897,0.8698569933581745,0.0,5,1,0.1252367236968581,0.9444444444444444,0.1596283783783784,1,0.5952645209027007,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,1.0,1,0
|
| 126 |
+
STU1133,0.0,1,2024-11-28 22:15:00,0.5272727272727272,0.2222222222222222,0.7222222222222222,0.0139607032057917,0.75,0.2,Video Lesson Programming,0.871018523976302,0.8339837777883972,1.0,3,0,0.038738791240853,0.7222222222222222,0.1587837837837838,2,0.3226045135035146,1.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,2.0,2.0,0,1
|
| 127 |
+
STU1053,0.1999999999999999,1,2024-12-01 17:00:00,0.5272727272727272,0.7777777777777777,0.7111111111111111,0.3878942605997935,0.25,0.4666666666666667,Interactive Exercise Algorithms,0.8122981896655268,0.0912777811070014,0.2857142857142856,6,1,0.120453429132749,0.7111111111111111,0.4459459459459459,1,0.3046614872364039,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,2.0,1.0,0,1
|
| 128 |
+
STU1097,0.8,0,2025-02-20 16:00:00,0.8909090909090909,0.7777777777777777,0.8111111111111111,0.375,0.25,0.0666666666666667,Interactive Exercise Algebra,0.0234309095259943,0.6387940621461871,0.1428571428571428,3,0,0.0720299404599911,0.811111111111111,0.7162162162162163,0,0.517573066962634,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,1.0,0.0,1,0
|
| 129 |
+
STU1075,0.3999999999999999,1,2025-06-29 16:45:00,0.4272727272727272,0.4444444444444445,0.6666666666666666,0.625,0.0,0.8,Interactive Exercise Ancient Civilizations,0.522227639715337,0.6764842932711569,0.1428571428571428,6,1,0.0871941376439511,0.6666666666666666,0.2271959459459459,2,0.1065482796892341,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,1.0,2.0,0,0
|
| 130 |
+
STU1041,0.5999999999999999,1,2025-01-29 15:45:00,0.6181818181818182,0.5555555555555556,0.7111111111111111,0.625,0.5,0.2666666666666666,Interactive Exercise Ancient Civilizations,0.6777435845094765,0.9143755920941278,0.0,2,0,0.0751960913845641,0.7111111111111111,0.3817567567567568,0,0.1653718091009988,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,1.0,0.0,0,0
|
| 131 |
+
STU1015,0.5999999999999999,1,2025-02-09 19:00:00,0.7545454545454545,0.7777777777777777,0.9111111111111112,1.0,0.75,0.6000000000000001,Video Lesson Grammar,0.4043075826362853,0.5023096150736766,0.5714285714285712,6,1,0.0853073486969451,0.9111111111111112,0.6148648648648649,0,0.2130965593784683,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,0.0,1,1
|
| 132 |
+
STU1088,0.0,1,2024-06-15 19:00:00,0.8181818181818181,0.2222222222222222,0.8666666666666667,0.625,0.5,0.2,Audio Lecture Modern History,0.5591290975887796,0.1919013514636648,0.5714285714285712,5,1,0.0230495809225011,0.8666666666666667,0.2398648648648648,1,0.279134295227525,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 133 |
+
STU1123,0.5999999999999999,0,2025-01-09 22:45:00,0.0181818181818181,0.4444444444444445,0.7555555555555555,0.375,0.0,0.7333333333333334,Interactive Exercise Algebra,0.5830720436996023,0.4880820685544728,1.0,3,0,0.4527595914485469,0.7555555555555555,0.0371621621621621,1,0.1498335183129855,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,2.0,1,0
|
| 134 |
+
STU1076,0.3999999999999999,1,2024-09-23 15:45:00,0.5727272727272726,0.8888888888888888,0.8777777777777778,0.5681836543433301,0.5,0.0666666666666667,Video Lesson Physics,0.5904186100356311,0.1276075351246515,0.0,0,0,0.1267219494378041,0.8777777777777778,0.5413851351351352,1,0.3007769145394007,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,0.0,1.0,1,0
|
| 135 |
+
STU1021,0.8,1,2025-05-17 18:45:00,0.4545454545454545,1.0,0.9333333333333332,0.5847013960703209,1.0,0.2666666666666666,Interactive Exercise Algorithms,1.0,0.4825401966746634,0.4285714285714284,5,1,0.1749298540308367,0.9333333333333332,0.4932432432432433,1,0.3551609322974473,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 136 |
+
STU1181,0.3999999999999999,1,2025-04-15 17:00:00,0.509090909090909,0.6666666666666665,0.8333333333333334,0.625,0.75,0.7333333333333334,Video Lesson World War,0.4625231648447067,0.4155012111996172,0.2857142857142856,1,0,0.1075771831093793,0.8333333333333333,0.3766891891891892,2,0.1664816870144284,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,2.0,1,0
|
| 137 |
+
STU1079,0.1999999999999999,0,2025-07-02 21:30:00,0.6818181818181818,0.2222222222222222,0.8333333333333334,0.5912314024085137,0.0,0.6666666666666667,Audio Lecture Literature,0.422777903710642,0.6827103850869911,0.8571428571428572,2,0,0.0289330348091874,0.8333333333333333,0.2018581081081081,0,0.1576026637069922,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,0
|
| 138 |
+
STU1127,0.1999999999999999,1,2025-06-27 22:45:00,0.7,0.4444444444444445,0.8666666666666667,0.625,1.0,0.5333333333333334,Video Lesson World War,0.6983410253802127,0.5887288090872417,1.0,4,0,0.0535789210861138,0.8666666666666667,0.3538851351351352,2,0.2859785423603403,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 139 |
+
STU1026,0.1999999999999999,0,2025-07-02 15:15:00,0.4,0.0,0.1777777777777778,0.5681836543433301,0.5,0.2,Video Lesson Physics,0.3334970854332688,0.4290394711353563,0.0,2,0,0.010289991303729,0.1777777777777778,0.0320945945945946,1,0.4080651128375879,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0,1.0,0.0,0,0
|
| 140 |
+
STU1113,0.5999999999999999,0,2024-12-31 22:00:00,0.6636363636363636,0.8888888888888888,1.0,0.625,0.0,0.6666666666666667,Video Lesson World War,0.1794776773869556,0.384687359011765,1.0,1,0,0.1102144868737869,1.0,0.6173986486486487,1,0.5493895671476138,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,1.0,1.0,1,0
|
| 141 |
+
STU1070,0.0,1,2025-06-04 21:30:00,0.6272727272727272,0.5555555555555556,0.9444444444444444,0.375,0.5,0.0666666666666667,Audio Lecture Calculus,0.9473182581745272,0.6746167030994392,0.8571428571428572,2,0,0.0741139890833395,0.9444444444444444,0.3868243243243243,0,0.3144654088050315,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 142 |
+
STU1170,0.5999999999999999,1,2024-05-29 21:45:00,0.6363636363636364,0.3333333333333333,0.9555555555555556,0.0,0.5,0.4666666666666667,Video Lesson Programming,0.0533985705637151,0.6834946702494549,0.8571428571428572,2,0,0.0452759623947767,0.9555555555555556,0.2567567567567568,2,0.2336293007769145,1.0,1.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 143 |
+
STU1116,0.8,1,2023-12-29 15:15:00,0.1727272727272727,0.3333333333333333,0.7666666666666666,0.5847013960703209,0.75,0.1333333333333333,Video Lesson Programming,0.3870150861677275,0.4620268990245569,0.0,4,0,0.1429953951748693,0.7666666666666667,0.0844594594594594,1,0.1409544950055493,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 144 |
+
STU1009,0.0,0,2025-02-25 22:45:00,0.209090909090909,1.0,0.9111111111111112,0.625,0.5,0.1333333333333333,Audio Lecture Modern History,0.4235003797716757,0.4303233547082236,1.0,1,0,0.3264733594137085,0.9111111111111112,0.2652027027027027,1,0.1148723640399556,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,1.0,2.0,1,0
|
| 145 |
+
STU1191,0.1999999999999999,1,2025-01-23 21:15:00,0.9727272727272726,1.0,0.7555555555555555,0.5681836543433301,0.25,0.0,Video Lesson Physics,0.4047094298661965,0.3751864629481443,0.8571428571428572,3,0,0.0846945454436863,0.7555555555555555,0.9746621621621624,0,0.4750277469478356,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,0.0,1,0
|
| 146 |
+
STU1138,0.8,0,2024-07-09 21:00:00,0.7999999999999999,0.5555555555555556,0.9333333333333332,0.375,1.0,1.0,Interactive Exercise Algebra,0.9615527079247134,0.2352578875846451,0.8571428571428572,1,0,0.0577499521995556,0.9333333333333332,0.4831081081081081,0,0.6267110617832038,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,0
|
| 147 |
+
STU1095,0.5999999999999999,1,2024-07-31 16:30:00,0.109090909090909,0.3333333333333333,0.6888888888888889,0.5847013960703209,0.25,0.6666666666666667,Video Lesson Programming,0.6755493167680068,0.2495566811782675,0.1428571428571428,2,0,0.1917680159890264,0.6888888888888889,0.0608108108108108,1,0.6356825749167592,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,1.0,0.0,0,0
|
| 148 |
+
STU1001,0.1999999999999999,1,2025-04-21 19:15:00,0.9545454545454544,1.0,1.0,0.5847013960703209,0.5,0.2,Interactive Exercise Algorithms,0.9649903744414844,0.1401792249302386,0.5714285714285712,0,0,0.0863464504195475,1.0,0.9577702702702704,1,0.4779874213836478,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 149 |
+
STU1176,0.8,1,2025-06-25 17:45:00,0.918181818181818,0.8888888888888888,0.8888888888888888,0.5847013960703209,0.25,0.4666666666666667,Audio Lecture Data Structures,0.5208156799446504,0.4969171641378953,0.2857142857142856,2,0,0.0798169610728097,0.8888888888888888,0.8302364864864865,2,0.605623381428043,1.0,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 150 |
+
STU1020,0.8,1,2025-02-16 22:15:00,0.1181818181818181,0.4444444444444445,0.7666666666666666,0.4947324198552225,1.0,0.8,Interactive Exercise Biology,0.439314066195212,0.4303324328505092,1.0,6,1,0.2313011048871269,0.7666666666666667,0.0836148648648648,1,0.1048834628190898,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,0.0,1,1
|
| 151 |
+
STU1052,1.0000000000000002,0,2024-04-21 16:00:00,0.1999999999999999,0.2222222222222222,0.7333333333333333,0.0,0.0,0.8,Audio Lecture Calculus,0.4892865365932068,0.62388281365405,0.1428571428571428,6,1,0.0938961700942147,0.7333333333333333,0.0675675675675675,2,0.2708102108768035,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,0.0,0,1
|
| 152 |
+
STU1174,0.3999999999999999,0,2024-04-02 16:15:00,0.5272727272727272,0.8888888888888888,0.9222222222222224,0.5847013960703209,0.75,0.0666666666666667,Interactive Exercise Algorithms,0.3081547237951205,0.7772314840074368,0.1428571428571428,1,0,0.1367963567111281,0.9222222222222224,0.5033783783783784,2,0.3285238623751387,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,1.0,1,0
|
| 153 |
+
STU1107,0.1999999999999999,0,2025-05-09 21:30:00,0.0999999999999999,0.3333333333333333,0.6888888888888889,0.375,0.25,0.0666666666666667,Video Lesson Algebra,0.7442442619766683,0.5540012960382985,0.8571428571428572,4,0,0.2013898254110027,0.6888888888888889,0.0574324324324324,0,0.0244173140954495,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,1.0,1.0,0,0
|
| 154 |
+
STU1131,0.0,0,2025-06-27 20:30:00,0.2909090909090909,0.2222222222222222,0.7,0.5847013960703209,0.5,0.5333333333333334,Video Lesson Programming,0.4429204525630629,0.0165636411853334,0.714285714285714,4,0,0.0690899417351965,0.7,0.0929054054054054,0,0.5455049944506104,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,2.0,2.0,0,0
|
| 155 |
+
STU1027,0.8,0,2023-10-25 15:45:00,0.2636363636363636,0.7777777777777777,0.8888888888888888,0.5681836543433301,0.5,0.0,Audio Lecture Chemistry,0.3749982024243721,0.7381107329569581,0.0,2,0,0.217672893260044,0.8888888888888888,0.25,2,0.4827968923418424,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,2.0,1.0,1,0
|
| 156 |
+
STU1136,0.5999999999999999,0,2024-08-03 20:45:00,0.6363636363636364,0.5555555555555556,1.0,0.0,0.0,0.8,Interactive Exercise Biology,0.0390877272021476,0.282656298860882,0.714285714285714,5,1,0.0730589393393073,1.0,0.3918918918918919,0,0.2386237513873474,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0,0.0,2.0,0,1
|
| 157 |
+
STU1197,0.5999999999999999,0,2024-06-21 15:15:00,0.7454545454545454,0.7777777777777777,0.8777777777777778,0.5681836543433301,0.0,0.7333333333333334,Interactive Exercise Biology,0.6916417895675577,0.0173519302820779,0.0,4,0,0.0863464502094683,0.8777777777777778,0.6081081081081082,0,0.6248612652608213,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,2.0,1,0
|
| 158 |
+
STU1003,0.8,1,2025-06-19 16:45:00,0.8999999999999999,0.7777777777777777,0.8444444444444444,0.375,1.0,0.4666666666666667,Audio Lecture Calculus,0.0401738067011121,0.7833008583000046,0.1428571428571428,3,0,0.0712747117333943,0.8444444444444444,0.722972972972973,1,0.8706992230854607,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,0.0,1,0
|
| 159 |
+
STU1122,0.0,0,2024-07-03 15:00:00,0.3454545454545454,0.3333333333333333,0.7555555555555555,0.375,0.75,0.5333333333333334,Audio Lecture Calculus,0.1678776395202608,0.1371824991949564,0.0,2,0,0.0823199308824015,0.7555555555555555,0.1486486486486486,0,0.2967073621901591,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 160 |
+
STU1023,0.5999999999999999,0,2025-01-22 20:00:00,1.0,0.3333333333333333,0.9333333333333332,0.625,1.0,0.7333333333333334,Audio Lecture Modern History,0.6103308603130055,0.4278807889936094,0.714285714285714,2,0,0.0267539779194395,0.9333333333333332,0.3918918918918919,0,0.2541620421753606,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 161 |
+
STU1008,0.0,1,2025-04-20 21:00:00,0.3272727272727272,0.5555555555555556,0.7666666666666666,0.2276370217166499,1.0,0.9333333333333332,Video Lesson Physics,0.1080548242106633,0.905344410394646,0.8571428571428572,6,1,0.1346646694857505,0.7666666666666667,0.2195945945945946,1,0.2330743618201997,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,0.0,1,1
|
| 162 |
+
STU1044,0.5999999999999999,1,2025-06-30 16:45:00,0.5545454545454545,1.0,0.7333333333333333,0.5912314024085137,0.75,0.0,Video Lesson Grammar,0.03995183183426,0.5733476355000872,0.1428571428571428,0,0,0.1462338220297057,0.7333333333333333,0.5861486486486487,1,0.1753607103218646,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,0
|
| 163 |
+
STU1117,0.1999999999999999,0,2024-07-13 16:00:00,0.8454545454545453,0.3333333333333333,0.9888888888888888,0.5847013960703209,0.75,0.3999999999999999,Interactive Exercise Algorithms,0.3271705195184051,0.3168861230398674,0.1428571428571428,5,1,0.0328680310642866,0.9888888888888888,0.3344594594594594,0,0.2502774694783574,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,2.0,0.0,1,0
|
| 164 |
+
STU1172,0.3999999999999999,0,2023-12-11 21:15:00,0.6636363636363636,0.2222222222222222,0.8999999999999999,1.0,0.5,1.0,Video Lesson World War,0.8031124435119377,0.0237170783603136,0.8571428571428572,0,0,0.0298781679617393,0.9000000000000001,0.1967905405405405,0,0.1598224195338512,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,1
|
| 165 |
+
STU1115,0.0,0,2025-05-14 17:15:00,0.6,0.7777777777777777,0.8222222222222222,0.5681836543433301,0.5,0.7333333333333334,Audio Lecture Chemistry,0.8574346061979541,0.4306179469511907,0.2857142857142856,2,0,0.1066909639846726,0.8222222222222222,0.5000000000000001,2,0.3523862375138734,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,1.0,0.0,1,0
|
| 166 |
+
STU1135,0.8,1,2024-10-16 21:00:00,0.5363636363636363,0.7777777777777777,0.8999999999999999,1.0,0.25,1.0,Interactive Exercise Vocabulary,0.6010749217962007,0.6871984162963782,0.8571428571428572,2,0,0.1185585969772098,0.9000000000000001,0.4527027027027027,2,0.3290788013318535,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1,1.0,2.0,1,1
|
| 167 |
+
STU1142,0.0,1,2024-10-26 21:00:00,0.5909090909090908,0.4444444444444445,0.9888888888888888,0.5912314024085137,1.0,0.3999999999999999,Audio Lecture Literature,0.7527334400386756,0.1293020152495637,0.8571428571428572,5,1,0.0637979469627238,0.9888888888888888,0.3032094594594594,1,0.2924528301886793,0.6538461538461533,0.0706596681502631,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 168 |
+
STU1147,0.0,1,2024-12-26 19:00:00,0.4272727272727272,0.7777777777777777,0.9111111111111112,1.0,1.0,0.6000000000000001,Interactive Exercise Biology,0.7137392075691249,0.6732410565500274,0.5714285714285712,3,0,0.1456846151268925,0.9111111111111112,0.3716216216216216,2,0.3296337402885683,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,1
|
| 169 |
+
STU1192,0.5999999999999999,0,2025-05-16 22:30:00,0.6,0.3333333333333333,0.7111111111111111,1.0,1.0,0.0666666666666667,Interactive Exercise Algorithms,0.3781868637440948,0.039703565386513,1.0,4,0,0.0482004862451941,0.7111111111111111,0.2432432432432432,1,0.4298927118017018,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,2.0,1.0,0,1
|
| 170 |
+
STU1186,0.1999999999999999,0,2025-01-25 20:30:00,0.8636363636363635,0.2222222222222222,0.7777777777777778,0.5912314024085137,0.25,0.2,Audio Lecture Literature,0.5200670883657244,0.7661816669415945,0.714285714285714,5,1,0.0214619822511075,0.7777777777777778,0.2525337837837837,2,0.2053274139844617,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,0.0,1,0
|
| 171 |
+
STU1063,0.3999999999999999,0,2024-11-09 19:30:00,0.7272727272727272,1.0,0.8666666666666667,0.0,0.5,0.0,Interactive Exercise Algebra,0.4841074717903316,0.1262294105178091,0.5714285714285712,5,1,0.1131899062084624,0.8666666666666667,0.7466216216216217,1,0.4002959674435812,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0,1.0,2.0,0,1
|
| 172 |
+
STU1092,0.1999999999999999,0,2024-10-26 19:30:00,0.5545454545454545,1.0,0.7222222222222222,0.0,0.25,0.6000000000000001,Audio Lecture Chemistry,0.4349141129273994,0.959994250875958,0.5714285714285712,5,1,0.1462338220297057,0.7222222222222222,0.5861486486486487,1,0.3607103218645948,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,1.0,0,1
|
| 173 |
+
STU1145,0.0,0,2024-12-10 20:45:00,0.8818181818181817,0.2222222222222222,0.9333333333333332,0.5681836543433301,0.75,0.4666666666666667,Interactive Exercise Biology,0.9230334433911632,0.1311104101379464,0.714285714285714,1,0,0.0208684874202917,0.9333333333333332,0.2576013513513513,1,0.4062153163152053,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,2.0,0.0,1,0
|
| 174 |
+
STU1016,0.0,0,2025-06-29 15:30:00,0.7818181818181817,0.8888888888888888,0.8555555555555555,0.5681836543433301,0.25,0.9333333333333332,Interactive Exercise Biology,0.1525728664292559,0.1879510666780116,0.0,6,1,0.0938961722647597,0.8555555555555555,0.7162162162162163,2,0.218645948945616,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,0.0,1,0
|
| 175 |
+
STU1031,1.0000000000000002,1,2025-06-19 18:15:00,0.0818181818181818,0.2222222222222222,0.7666666666666666,0.0139607032057917,0.0,0.6666666666666667,Video Lesson World War,0.8895972341592258,0.1603471402706822,0.4285714285714284,3,0,0.1651814347976476,0.7666666666666667,0.0346283783783783,1,0.4705882352941176,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,2.0,0,1
|
| 176 |
+
STU1074,0.1999999999999999,0,2024-10-15 15:15:00,0.0363636363636363,0.2222222222222222,0.8333333333333334,0.0139607032057917,0.0,0.6000000000000001,Audio Lecture Modern History,0.0068908470202531,0.09588092287902,0.0,1,0,0.2278497968541689,0.8333333333333333,0.0219594594594594,0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,2.0,0,1
|
| 177 |
+
STU1054,1.0000000000000002,1,2025-05-28 21:45:00,0.4,0.5555555555555556,0.7777777777777778,0.375,0.0,0.6000000000000001,Video Lesson Algebra,0.9898913882044906,0.6161254638621769,0.8571428571428572,2,0,0.1131899052937965,0.7777777777777778,0.2601351351351352,2,0.3677395486496485,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,2.0,1.0,1,0
|
| 178 |
+
STU1154,0.0,1,2025-06-10 16:00:00,0.8272727272727272,0.6666666666666665,0.7111111111111111,0.5681836543433301,0.75,0.8666666666666667,Audio Lecture Chemistry,0.9865319606859174,0.0823308380383001,0.1428571428571428,1,0,0.0667321230075657,0.7111111111111111,0.5836148648648649,0,0.2253052164261931,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,0.0,0,0
|
| 179 |
+
STU1058,0.8,0,2024-10-14 16:30:00,0.609090909090909,0.8888888888888888,0.8444444444444444,0.1207988624612208,0.0,0.2,Audio Lecture Modern History,0.7304846441584761,0.6288960084271715,0.1428571428571428,0,0,0.1196044461051956,0.8444444444444444,0.5717905405405406,2,0.2830188679245283,1.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0,0.0,2.0,0,1
|
| 180 |
+
STU1069,0.0,0,2024-12-30 22:00:00,0.5363636363636363,0.1111111111111111,0.1333333333333333,0.5912314024085137,0.5,0.9333333333333332,Audio Lecture Literature,0.6336044442184678,0.8605347717073197,1.0,0,0,0.0219221556235891,0.1333333333333333,0.1030405405405405,2,0.2175360710321865,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0,0.0,2.0,0,0
|
| 181 |
+
STU1199,0.1999999999999999,0,2024-11-27 20:45:00,0.5363636363636363,0.3333333333333333,0.8222222222222222,0.0,0.0,0.1333333333333333,Audio Lecture Chemistry,0.1608818190469297,0.3794942485083676,0.714285714285714,2,0,0.0541343027414627,0.8222222222222222,0.2195945945945946,2,0.1659267480577136,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0,2.0,2.0,0,1
|
| 182 |
+
STU1065,1.0000000000000002,1,2025-01-08 21:30:00,0.1818181818181818,0.0,0.1222222222222222,0.625,0.75,0.6666666666666667,Video Lesson World War,0.256283138003569,0.812904722734963,0.8571428571428572,2,0,0.0267539769933403,0.1222222222222222,0.0118243243243243,0,0.0344062153163152,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,2.0,2.0,0,0
|
| 183 |
+
STU1161,0.1999999999999999,1,2025-01-17 19:45:00,0.6181818181818182,0.1111111111111111,0.2,0.5912314024085137,0.0,0.2,Interactive Exercise Vocabulary,0.8241693154110818,0.8842026612593801,0.5714285714285712,4,0,0.0182053694653317,0.2,0.1182432432432432,2,0.2286348501664817,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,2.0,0,0
|
| 184 |
+
STU1105,0.5999999999999999,0,2025-03-25 16:30:00,0.1727272727272727,0.8888888888888888,0.7444444444444445,0.0,0.75,0.6000000000000001,Audio Lecture Chemistry,0.5961434098321164,0.1719413964133947,0.1428571428571428,1,0,0.3346021285113116,0.7444444444444445,0.2069256756756756,2,0.4554199038105808,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0,0.0,0.0,0,1
|
| 185 |
+
STU1084,0.0,1,2025-03-11 20:45:00,0.0999999999999999,0.4444444444444445,0.7111111111111111,0.0,0.25,0.0,Video Lesson World War,0.4804435260964554,0.1445808603798793,0.714285714285714,1,0,0.2543097796373245,0.7111111111111111,0.0751689189189189,0,0.0971143174250832,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,0.0,2.0,0,1
|
| 186 |
+
STU1094,0.3999999999999999,0,2024-12-10 21:15:00,0.8818181818181817,0.5555555555555556,0.9666666666666666,0.5912314024085137,0.5,0.4666666666666667,Video Lesson Grammar,0.6296386049369492,0.2796368238821469,0.8571428571428572,1,0,0.052026966334868,0.9666666666666666,0.5287162162162162,0,0.5005549389567148,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,2.0,1,0
|
| 187 |
+
STU1100,0.8,0,2025-03-29 16:45:00,0.5363636363636363,0.6666666666666665,0.7222222222222222,0.5681836543433301,0.75,0.3333333333333333,Audio Lecture Chemistry,0.2469606545955258,0.2849217624339179,0.1428571428571428,5,1,0.102452523418273,0.7222222222222222,0.3944256756756756,2,0.5327413984461709,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1,2.0,1.0,1,0
|
| 188 |
+
STU1011,0.0,0,2025-05-01 17:15:00,0.8181818181818181,0.5555555555555556,0.7888888888888889,0.5681836543433301,0.5,0.1333333333333333,Interactive Exercise Biology,0.1939902467223051,0.9566010883539868,0.2857142857142856,3,0,0.0563891533392868,0.788888888888889,0.4932432432432433,0,0.4384017758046615,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1,0.0,1.0,1,0
|
| 189 |
+
STU1110,0.3999999999999999,1,2025-06-11 15:15:00,0.3181818181818181,0.4444444444444445,0.7666666666666666,1.0,0.25,0.8,Interactive Exercise Ancient Civilizations,0.6851914065744795,0.870417854860565,0.0,2,0,0.1131899048364636,0.7666666666666667,0.1765202702702702,1,0.290788013318535,0.6538461538461533,0.0706596681502631,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,1.0,2.0,1,1
|
| 190 |
+
STU1153,0.1999999999999999,0,2025-05-27 15:30:00,0.2545454545454545,0.3333333333333333,0.8111111111111111,0.5681836543433301,0.75,0.9333333333333332,Interactive Exercise Biology,0.8576235602074411,0.5365510402094337,0.0,1,0,0.1066909624454496,0.811111111111111,0.1148648648648648,2,0.0688124306326304,1.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,2.0,1,0
|
| 191 |
+
STU1040,1.0000000000000002,0,2024-06-22 15:00:00,0.7727272727272727,0.5555555555555556,0.9666666666666666,0.5681836543433301,0.25,0.8666666666666667,Audio Lecture Chemistry,0.8180109679775794,0.0714730856792513,0.0,5,1,0.0598985819777965,0.9666666666666666,0.4679054054054055,1,0.6111727709951905,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1,2.0,0.0,1,0
|
| 192 |
+
STU1007,0.5999999999999999,0,2025-04-24 20:00:00,0.7636363636363636,0.4444444444444445,0.9888888888888888,0.5847013960703209,0.75,0.2666666666666666,Audio Lecture Data Structures,0.7094699720856339,0.0840843830098658,0.714285714285714,3,0,0.0488227255190223,0.9888888888888888,0.3834459459459459,2,0.3157602663706992,1.0,1.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,0.0,1,0
|
| 193 |
+
STU1198,0.8,0,2025-04-20 21:00:00,0.7454545454545454,0.6666666666666665,0.6888888888888889,1.0,0.5,0.0666666666666667,Interactive Exercise Algebra,0.4066956719081948,0.1766483703646792,0.8571428571428572,6,1,0.0742668949964992,0.6888888888888889,0.5304054054054055,2,0.2019977802441731,1.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0,2.0,0.0,0,1
|
| 194 |
+
STU1006,0.1999999999999999,1,2025-06-09 22:30:00,0.3636363636363636,0.4444444444444445,0.8222222222222222,0.6549896587383661,0.5,0.5333333333333334,Audio Lecture Data Structures,0.0530545450103893,0.5071309143770553,1.0,0,0,0.1008419154503486,0.8222222222222222,0.1976351351351351,1,0.3721790603033666,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,1.0,1.0,1,1
|
| 195 |
+
STU1072,0.0,1,2025-05-25 22:00:00,0.7727272727272727,0.6666666666666665,0.8111111111111111,1.0,0.25,0.0,Video Lesson Grammar,0.7656757107433999,0.4928297632737241,1.0,6,1,0.0715966775564767,0.811111111111111,0.548141891891892,0,0.3423973362930078,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,2.0,1,1
|
| 196 |
+
STU1000,0.0,1,2025-05-02 19:15:00,0.7181818181818181,0.6666666666666665,0.9444444444444444,0.5847013960703209,0.25,0.2666666666666666,Video Lesson Programming,0.8523252964889587,0.7984743358967872,0.5714285714285712,4,0,0.0771171270933769,0.9444444444444444,0.512668918918919,2,1.0,1.0,1.0,0.0,1.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1,0.0,0.0,1,0
|
| 197 |
+
STU1096,1.0000000000000002,1,2023-09-29 16:15:00,0.9545454545454544,1.0,0.6666666666666666,0.0,0.5,0.3999999999999999,Video Lesson Algebra,0.2893390822169124,0.5242070290502806,0.1428571428571428,4,0,0.0863464504195475,0.6666666666666666,0.9577702702702704,2,0.732519422863485,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0,1.0,1.0,0,1
|
| 198 |
+
STU1077,0.1999999999999999,1,2024-12-28 18:30:00,0.1636363636363636,0.5555555555555556,0.7111111111111111,0.375,0.75,0.8666666666666667,Interactive Exercise Algebra,0.8616923496692794,0.9113413986871324,0.4285714285714284,5,1,0.227849805359161,0.7111111111111111,0.1283783783783783,1,0.4200887902330743,0.6538461538461533,0.0706596681502631,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0,1.0,0.0,0,0
|
| 199 |
+
STU1157,1.0000000000000002,1,2025-03-30 17:45:00,0.3818181818181818,0.7777777777777777,0.8777777777777778,0.625,0.5,0.6000000000000001,Video Lesson World War,0.9159881895767216,0.0898036508795233,0.2857142857142856,6,1,0.1606821731674373,0.8777777777777778,0.3378378378378378,0,0.5671476137624861,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1,0.0,1.0,1,0
|
| 200 |
+
STU1033,0.8,1,2025-02-07 16:00:00,0.8999999999999999,0.3333333333333333,0.9444444444444444,1.0,0.75,0.5333333333333334,Interactive Exercise Biology,0.6551128017477423,0.5718828797612187,0.1428571428571428,4,0,0.0304923601195549,0.9444444444444444,0.3547297297297297,1,0.2264150943396226,0.6538461538461533,0.0706596681502631,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1,2.0,1.0,1,1
|
| 201 |
+
STU1156,0.0,0,2025-05-03 22:15:00,0.2545454545454545,0.8888888888888888,0.8999999999999999,1.0,0.75,0.8,Audio Lecture Calculus,0.5185107952462812,0.925461000247944,1.0,5,1,0.2529171548701172,0.9000000000000001,0.2753378378378378,2,0.4813170551239363,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1,0.0,1.0,1,1
|
Rekomendasi Materi Belajar/edtech/backend/src/data/recommendations/train_data.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Rekomendasi Materi Belajar/edtech/backend/src/models/recommenders/collaborative/collab_model.joblib
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c4aef73c6272415cb11002c1ff5c96f65587498acaa7c86ad4f7167d1d73fe48
|
| 3 |
+
size 6080
|
Rekomendasi Materi Belajar/edtech/backend/src/models/recommenders/content_based/content_model.joblib
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:63d1a2f5acb72fa4e6c3825586d578da46d850c31d82883ef50f618789722977
|
| 3 |
+
size 5211833
|
Rekomendasi Materi Belajar/edtech/backend/src/models/recommenders/hybrid/hybrid_model.joblib
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:d173427052471e467df306ab61013e0599cfb0a80ff3805e464f9b7a25166933
|
| 3 |
+
size 32
|
Rekomendasi Materi Belajar/edtech/backend/src/recommendation/collaborative.py
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# backend/src/recommendation/collaborative.py
|
| 2 |
+
import numpy as np
|
| 3 |
+
import pandas as pd
|
| 4 |
+
from scipy.sparse.linalg import svds
|
| 5 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
| 6 |
+
import joblib
|
| 7 |
+
from pathlib import Path
|
| 8 |
+
from scipy.sparse import csr_matrix
|
| 9 |
+
|
| 10 |
+
class CollaborativeFiltering:
|
| 11 |
+
def __init__(self, n_factors=50, n_recommendations=5):
|
| 12 |
+
self.n_factors = n_factors
|
| 13 |
+
self.n_recommendations = n_recommendations
|
| 14 |
+
self.user_item_matrix = None
|
| 15 |
+
self.user_factors = None
|
| 16 |
+
self.item_factors = None
|
| 17 |
+
self.user_ids = None
|
| 18 |
+
self.item_ids = None
|
| 19 |
+
|
| 20 |
+
def fit(self, user_item_matrix):
|
| 21 |
+
self.user_item_matrix = user_item_matrix
|
| 22 |
+
self.user_ids = user_item_matrix.index
|
| 23 |
+
self.item_ids = user_item_matrix.columns
|
| 24 |
+
|
| 25 |
+
# Normalisasi dengan subtract mean
|
| 26 |
+
user_means = user_item_matrix.mean(axis=1)
|
| 27 |
+
normalized_matrix = user_item_matrix.sub(user_means, axis=0).fillna(0)
|
| 28 |
+
|
| 29 |
+
# Convert the matrix to sparse format (CSR format)
|
| 30 |
+
sparse_matrix = csr_matrix(normalized_matrix.values)
|
| 31 |
+
|
| 32 |
+
# Tentukan nilai k secara dinamis untuk dataset kecil
|
| 33 |
+
min_dim = min(sparse_matrix.shape)
|
| 34 |
+
k = min(self.n_factors, min_dim - 1) if min_dim > 1 else 1
|
| 35 |
+
|
| 36 |
+
# Jika dimensi terlalu kecil, gunakan similarity dasar
|
| 37 |
+
if k < 1:
|
| 38 |
+
print("Matriks terlalu kecil, menggunakan similarity dasar")
|
| 39 |
+
self.similarity_matrix = cosine_similarity(normalized_matrix.T)
|
| 40 |
+
return
|
| 41 |
+
|
| 42 |
+
print(f"Menentukan k = {k} berdasarkan dimensi matriks: {sparse_matrix.shape}")
|
| 43 |
+
|
| 44 |
+
try:
|
| 45 |
+
# Melakukan SVD dengan penanganan khusus untuk matriks kecil
|
| 46 |
+
U, sigma, Vt = svds(sparse_matrix, k=k)
|
| 47 |
+
|
| 48 |
+
# Mengubah sigma menjadi matriks diagonal
|
| 49 |
+
sigma = np.diag(sigma)
|
| 50 |
+
|
| 51 |
+
# Membuat user dan item factors
|
| 52 |
+
self.user_factors = U
|
| 53 |
+
self.item_factors = sigma @ Vt
|
| 54 |
+
except Exception as e:
|
| 55 |
+
print(f"Error dalam SVD: {str(e)} - menggunakan similarity dasar")
|
| 56 |
+
self.similarity_matrix = cosine_similarity(normalized_matrix.T)
|
| 57 |
+
|
| 58 |
+
def recommend_for_user(self, user_id, user_item_matrix=None):
|
| 59 |
+
if user_item_matrix is not None:
|
| 60 |
+
self.user_item_matrix = user_item_matrix
|
| 61 |
+
|
| 62 |
+
# Handle jika user_id tidak ada di data training
|
| 63 |
+
if user_id not in self.user_ids:
|
| 64 |
+
print(f"User ID {user_id} tidak ditemukan di model")
|
| 65 |
+
# Fallback: return popular items
|
| 66 |
+
item_counts = (self.user_item_matrix > 0).sum()
|
| 67 |
+
top_items = item_counts.sort_values(ascending=False).head(self.n_recommendations).index
|
| 68 |
+
return [(item, 0.5) for item in top_items]
|
| 69 |
+
|
| 70 |
+
try:
|
| 71 |
+
# Jika menggunakan similarity dasar
|
| 72 |
+
if hasattr(self, 'similarity_matrix'):
|
| 73 |
+
user_idx = np.where(self.user_ids == user_id)[0][0]
|
| 74 |
+
user_ratings = self.user_item_matrix.iloc[user_idx].values
|
| 75 |
+
unseen_mask = user_ratings == 0
|
| 76 |
+
item_scores = self.similarity_matrix.dot(user_ratings)
|
| 77 |
+
item_scores[~unseen_mask] = -np.inf # Filter yang sudah dilihat
|
| 78 |
+
top_indices = np.argsort(-item_scores)[:self.n_recommendations]
|
| 79 |
+
return [(self.item_ids[i], item_scores[i]) for i in top_indices if item_scores[i] > 0]
|
| 80 |
+
|
| 81 |
+
# Jika menggunakan SVD
|
| 82 |
+
user_idx = np.where(self.user_ids == user_id)[0][0]
|
| 83 |
+
user_ratings = self.user_factors[user_idx, :] @ self.item_factors
|
| 84 |
+
|
| 85 |
+
# Dapatkan item yang belum dilihat user
|
| 86 |
+
known_items = self.user_item_matrix.loc[user_id]
|
| 87 |
+
unseen_items_idx = np.where(known_items == 0)[0]
|
| 88 |
+
|
| 89 |
+
# Jika tidak ada item yang belum dilihat, kembalikan popular items
|
| 90 |
+
if len(unseen_items_idx) == 0:
|
| 91 |
+
item_counts = (self.user_item_matrix > 0).sum()
|
| 92 |
+
top_items = item_counts.sort_values(ascending=False).head(self.n_recommendations).index
|
| 93 |
+
return [(item, 0.5) for item in top_items]
|
| 94 |
+
|
| 95 |
+
# Urutkan item yang belum dilihat berdasarkan prediksi rating
|
| 96 |
+
unseen_ratings = user_ratings[unseen_items_idx]
|
| 97 |
+
recommended_idx = np.argsort(-unseen_ratings)[:self.n_recommendations]
|
| 98 |
+
|
| 99 |
+
# Buat rekomendasi
|
| 100 |
+
recommendations = []
|
| 101 |
+
for idx in recommended_idx:
|
| 102 |
+
item_id = self.item_ids[unseen_items_idx[idx]]
|
| 103 |
+
score = unseen_ratings[idx]
|
| 104 |
+
recommendations.append((item_id, score))
|
| 105 |
+
|
| 106 |
+
return recommendations
|
| 107 |
+
except Exception as e:
|
| 108 |
+
print(f"Error dalam rekomendasi untuk user {user_id}: {str(e)}")
|
| 109 |
+
# Fallback: return popular items
|
| 110 |
+
item_counts = (self.user_item_matrix > 0).sum()
|
| 111 |
+
top_items = item_counts.sort_values(ascending=False).head(self.n_recommendations).index
|
| 112 |
+
return [(item, 0.5) for item in top_items]
|
| 113 |
+
|
| 114 |
+
def save_model(self, save_path='models/recommenders/collaborative'):
|
| 115 |
+
"""
|
| 116 |
+
Menyimpan model yang sudah dilatih
|
| 117 |
+
"""
|
| 118 |
+
Path(save_path).mkdir(parents=True, exist_ok=True)
|
| 119 |
+
|
| 120 |
+
model_data = {
|
| 121 |
+
'user_factors': self.user_factors,
|
| 122 |
+
'item_factors': self.item_factors,
|
| 123 |
+
'user_ids': self.user_ids,
|
| 124 |
+
'item_ids': self.item_ids,
|
| 125 |
+
'n_factors': self.n_factors
|
| 126 |
+
}
|
| 127 |
+
|
| 128 |
+
joblib.dump(model_data, f'{save_path}/collab_model.joblib')
|
| 129 |
+
print("Model Collaborative Filtering berhasil disimpan!")
|
| 130 |
+
|
| 131 |
+
@classmethod
|
| 132 |
+
def load_model(cls, load_path='models/recommenders/collaborative/collab_model.joblib'):
|
| 133 |
+
"""
|
| 134 |
+
Memuat model yang sudah disimpan
|
| 135 |
+
"""
|
| 136 |
+
model_data = joblib.load(load_path)
|
| 137 |
+
|
| 138 |
+
model = cls(n_factors=model_data['n_factors'])
|
| 139 |
+
model.user_factors = model_data['user_factors']
|
| 140 |
+
model.item_factors = model_data['item_factors']
|
| 141 |
+
model.user_ids = model_data['user_ids']
|
| 142 |
+
model.item_ids = model_data['item_ids']
|
| 143 |
+
|
| 144 |
+
return model
|
Rekomendasi Materi Belajar/edtech/backend/src/recommendation/content_based.py
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# backend/src/recommendation/content_based.py
|
| 2 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 3 |
+
from sklearn.metrics.pairwise import linear_kernel
|
| 4 |
+
import joblib
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
import numpy as np
|
| 7 |
+
import pandas as pd
|
| 8 |
+
|
| 9 |
+
class ContentBasedRecommender:
|
| 10 |
+
def __init__(self, n_recommendations=5):
|
| 11 |
+
self.n_recommendations = n_recommendations
|
| 12 |
+
self.tfidf_vectorizer = None
|
| 13 |
+
self.tfidf_matrix = None
|
| 14 |
+
self.material_features = None
|
| 15 |
+
self.material_ids = None
|
| 16 |
+
|
| 17 |
+
def fit(self, df):
|
| 18 |
+
# Gabungkan fitur teks materi dengan lebih banyak fitur untuk dataset kecil
|
| 19 |
+
df['material_features'] = (
|
| 20 |
+
df['related_materials'].fillna('') + " " +
|
| 21 |
+
df['subject_English'].astype(str) + " " +
|
| 22 |
+
df['subject_History'].astype(str) + " " +
|
| 23 |
+
df['subject_Mathematics'].astype(str) + " " +
|
| 24 |
+
df['subject_Science'].astype(str) + " " +
|
| 25 |
+
df['material_type_encoded'].astype(str) + " " +
|
| 26 |
+
df['preferensi_materi'].fillna('').astype(str) + " " +
|
| 27 |
+
df['performance_label_encoded'].astype(str)
|
| 28 |
+
)
|
| 29 |
+
|
| 30 |
+
# Simpan mapping material_id untuk referensi
|
| 31 |
+
self.material_ids = df['material_type_encoded'].unique()
|
| 32 |
+
|
| 33 |
+
# Inisialisasi TF-IDF Vectorizer dengan parameter untuk data kecil
|
| 34 |
+
self.tfidf_vectorizer = TfidfVectorizer(
|
| 35 |
+
stop_words='english',
|
| 36 |
+
min_df=1, # Term muncul di minimal 1 dokumen
|
| 37 |
+
max_df=0.95, # Term muncul di maksimal 95% dokumen
|
| 38 |
+
max_features=1000 # Batasi jumlah fitur
|
| 39 |
+
)
|
| 40 |
+
|
| 41 |
+
try:
|
| 42 |
+
self.tfidf_matrix = self.tfidf_vectorizer.fit_transform(df['material_features'])
|
| 43 |
+
self.cosine_sim = linear_kernel(self.tfidf_matrix, self.tfidf_matrix)
|
| 44 |
+
except Exception as e:
|
| 45 |
+
print(f"Error dalam TF-IDF: {str(e)}")
|
| 46 |
+
# Buat matriks identitas sebagai fallback
|
| 47 |
+
n = len(df)
|
| 48 |
+
self.cosine_sim = np.eye(n)
|
| 49 |
+
|
| 50 |
+
# Buat mapping antara index dan material_id dengan fallback
|
| 51 |
+
self.indices = pd.Series(df.index, index=df['material_type_encoded']).drop_duplicates()
|
| 52 |
+
|
| 53 |
+
def recommend_for_user(self, user_id, user_history, df):
|
| 54 |
+
"""Rekomendasi untuk user berdasarkan riwayat"""
|
| 55 |
+
if not user_history or len(user_history) < 1:
|
| 56 |
+
# Return default recommendations with adjusted scores
|
| 57 |
+
top_materials = df['material_type_encoded'].value_counts().head(self.n_recommendations).index.tolist()
|
| 58 |
+
return [(mat, 0.5 * df[df['material_type_encoded'] == mat]['engagement_score'].mean())
|
| 59 |
+
for mat in top_materials]
|
| 60 |
+
|
| 61 |
+
try:
|
| 62 |
+
# Dapatkan materi yang pernah diakses user
|
| 63 |
+
user_materials = df[df['material_type_encoded'].isin(user_history)]
|
| 64 |
+
if len(user_materials) == 0:
|
| 65 |
+
return []
|
| 66 |
+
|
| 67 |
+
# Hitung profil user dengan normalisasi
|
| 68 |
+
user_profile = self._create_user_profile(user_history, df)
|
| 69 |
+
if user_profile is None:
|
| 70 |
+
return []
|
| 71 |
+
|
| 72 |
+
# Hitung similarity dengan normalisasi
|
| 73 |
+
user_profile = user_profile.reshape(1, -1)
|
| 74 |
+
cosine_sim = linear_kernel(user_profile, self.tfidf_matrix)
|
| 75 |
+
cosine_sim = (cosine_sim - cosine_sim.min()) / (cosine_sim.max() - cosine_sim.min() + 1e-10)
|
| 76 |
+
|
| 77 |
+
# Gabungkan dengan engagement score
|
| 78 |
+
material_scores = {}
|
| 79 |
+
for idx, score in enumerate(cosine_sim[0]):
|
| 80 |
+
material_id = df.iloc[idx]['material_type_encoded']
|
| 81 |
+
if material_id not in user_history:
|
| 82 |
+
engagement = df[df['material_type_encoded'] == material_id]['engagement_score'].mean()
|
| 83 |
+
material_scores[material_id] = 0.7 * score + 0.3 * (engagement / 5.0) # Normalisasi
|
| 84 |
+
|
| 85 |
+
# Urutkan dan kembalikan rekomendasi
|
| 86 |
+
recommendations = sorted(material_scores.items(), key=lambda x: x[1], reverse=True)
|
| 87 |
+
return recommendations[:self.n_recommendations]
|
| 88 |
+
|
| 89 |
+
except Exception as e:
|
| 90 |
+
print(f"Error generating recommendations for user {user_id}: {str(e)}")
|
| 91 |
+
return []
|
| 92 |
+
|
| 93 |
+
def recommend_for_material(self, material_id):
|
| 94 |
+
"""
|
| 95 |
+
Memberikan rekomendasi berdasarkan similarity konten
|
| 96 |
+
|
| 97 |
+
Parameters:
|
| 98 |
+
- material_id: ID materi yang akan dicari similaritasnya
|
| 99 |
+
|
| 100 |
+
Returns:
|
| 101 |
+
- recommendations: List rekomendasi material beserta similarity scores
|
| 102 |
+
"""
|
| 103 |
+
try:
|
| 104 |
+
idx = self.indices[material_id]
|
| 105 |
+
except KeyError:
|
| 106 |
+
print(f"Material ID {material_id} tidak ditemukan")
|
| 107 |
+
return []
|
| 108 |
+
|
| 109 |
+
# Dapatkan similarity scores untuk semua materi
|
| 110 |
+
sim_scores = list(enumerate(self.cosine_sim[idx]))
|
| 111 |
+
|
| 112 |
+
# Urutkan berdasarkan similarity score
|
| 113 |
+
sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
|
| 114 |
+
|
| 115 |
+
# Ambil n_recommendations teratas (tidak termasuk diri sendiri)
|
| 116 |
+
sim_scores = sim_scores[1:self.n_recommendations+1]
|
| 117 |
+
|
| 118 |
+
# Dapatkan material indices
|
| 119 |
+
material_indices = [i[0] for i in sim_scores]
|
| 120 |
+
|
| 121 |
+
# Buat rekomendasi
|
| 122 |
+
recommendations = []
|
| 123 |
+
for i, (idx, score) in enumerate(sim_scores):
|
| 124 |
+
rec_material_id = self.material_ids[material_indices[i]]
|
| 125 |
+
recommendations.append((rec_material_id, score))
|
| 126 |
+
|
| 127 |
+
return recommendations
|
| 128 |
+
|
| 129 |
+
|
| 130 |
+
def _create_user_profile(self, user_history, df):
|
| 131 |
+
"""
|
| 132 |
+
Membuat profil user berdasarkan riwayat materi yang diakses
|
| 133 |
+
|
| 134 |
+
Parameters:
|
| 135 |
+
- user_history: List material_id yang pernah diakses user
|
| 136 |
+
- df: DataFrame lengkap untuk mendapatkan fitur materi
|
| 137 |
+
|
| 138 |
+
Returns:
|
| 139 |
+
- user_profile: Vektor TF-IDF yang merepresentasikan preferensi user
|
| 140 |
+
"""
|
| 141 |
+
# Dapatkan index materi yang pernah diakses user
|
| 142 |
+
history_indices = []
|
| 143 |
+
for material_id in user_history:
|
| 144 |
+
try:
|
| 145 |
+
idx = self.indices[material_id] # Dapatkan indeks berdasarkan material_id
|
| 146 |
+
history_indices.append(idx)
|
| 147 |
+
except KeyError:
|
| 148 |
+
continue
|
| 149 |
+
|
| 150 |
+
# Pastikan history_indices tidak kosong dan memiliki bentuk yang benar
|
| 151 |
+
if not history_indices:
|
| 152 |
+
return None # Jika tidak ada materi yang bisa diakses, return None
|
| 153 |
+
|
| 154 |
+
# Filter untuk memastikan semua indeks adalah integer dan tidak memiliki nilai yang tidak diinginkan
|
| 155 |
+
history_indices = [idx for idx in history_indices if isinstance(idx, int)]
|
| 156 |
+
|
| 157 |
+
# Pastikan history_indices adalah array numpy yang valid
|
| 158 |
+
if len(history_indices) > 0:
|
| 159 |
+
history_indices = np.array(history_indices)
|
| 160 |
+
|
| 161 |
+
# Hitung mean hanya jika ada history
|
| 162 |
+
user_profile = self.tfidf_matrix[history_indices].mean(axis=0)
|
| 163 |
+
return user_profile.A1 # Convert to dense array
|
| 164 |
+
return None
|
| 165 |
+
|
| 166 |
+
def save_model(self, save_path='models/recommenders/content_based'):
|
| 167 |
+
"""
|
| 168 |
+
Menyimpan model yang sudah dilatih
|
| 169 |
+
"""
|
| 170 |
+
Path(save_path).mkdir(parents=True, exist_ok=True)
|
| 171 |
+
|
| 172 |
+
model_data = {
|
| 173 |
+
'tfidf_vectorizer': self.tfidf_vectorizer,
|
| 174 |
+
'tfidf_matrix': self.tfidf_matrix,
|
| 175 |
+
'cosine_sim': self.cosine_sim,
|
| 176 |
+
'indices': self.indices,
|
| 177 |
+
'material_ids': self.material_ids,
|
| 178 |
+
'n_recommendations': self.n_recommendations
|
| 179 |
+
}
|
| 180 |
+
|
| 181 |
+
joblib.dump(model_data, f'{save_path}/content_model.joblib')
|
| 182 |
+
print("Model Content-Based Filtering berhasil disimpan!")
|
| 183 |
+
|
| 184 |
+
@classmethod
|
| 185 |
+
def load_model(cls, load_path='models/recommenders/content_based/content_model.joblib'):
|
| 186 |
+
"""
|
| 187 |
+
Memuat model yang sudah disimpan
|
| 188 |
+
"""
|
| 189 |
+
model_data = joblib.load(load_path)
|
| 190 |
+
|
| 191 |
+
model = cls(n_recommendations=model_data['n_recommendations'])
|
| 192 |
+
model.tfidf_vectorizer = model_data['tfidf_vectorizer']
|
| 193 |
+
model.tfidf_matrix = model_data['tfidf_matrix']
|
| 194 |
+
model.cosine_sim = model_data['cosine_sim']
|
| 195 |
+
model.indices = model_data['indices']
|
| 196 |
+
model.material_ids = model_data['material_ids']
|
| 197 |
+
|
| 198 |
+
return model
|
Rekomendasi Materi Belajar/edtech/backend/src/recommendation/data_splitter.py
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# backend/src/recommendation/data_splitter.py
|
| 2 |
+
import pandas as pd
|
| 3 |
+
from sklearn.model_selection import train_test_split
|
| 4 |
+
import joblib
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
class DataSplitter:
|
| 8 |
+
def __init__(self, test_size=0.2, random_state=42):
|
| 9 |
+
self.test_size = test_size
|
| 10 |
+
self.random_state = random_state
|
| 11 |
+
|
| 12 |
+
def split_data(self, df):
|
| 13 |
+
"""
|
| 14 |
+
Membagi data menjadi train dan test set untuk rekomendasi
|
| 15 |
+
|
| 16 |
+
Parameters:
|
| 17 |
+
- df: DataFrame yang sudah diproses
|
| 18 |
+
|
| 19 |
+
Returns:
|
| 20 |
+
- train_data: Data untuk training
|
| 21 |
+
- test_data: Data untuk testing
|
| 22 |
+
- user_item_matrix: Matriks interaksi user-item
|
| 23 |
+
"""
|
| 24 |
+
# Cek kolom yang ada di data
|
| 25 |
+
print("Kolom-kolom dalam data:", df.columns) # Menambahkan pengecekan kolom
|
| 26 |
+
|
| 27 |
+
# Pastikan data sudah diacak
|
| 28 |
+
df = df.sample(frac=1, random_state=self.random_state).reset_index(drop=True)
|
| 29 |
+
|
| 30 |
+
# Membagi data secara stratifikasi berdasarkan student_id
|
| 31 |
+
train_data, test_data = train_test_split(
|
| 32 |
+
df,
|
| 33 |
+
test_size=self.test_size,
|
| 34 |
+
random_state=self.random_state,
|
| 35 |
+
stratify=df['student_id']
|
| 36 |
+
)
|
| 37 |
+
|
| 38 |
+
# Membuat user-item matrix untuk collaborative filtering
|
| 39 |
+
user_item_matrix = self._create_user_item_matrix(df)
|
| 40 |
+
|
| 41 |
+
return train_data, test_data, user_item_matrix
|
| 42 |
+
|
| 43 |
+
def _create_user_item_matrix(self, df):
|
| 44 |
+
# 1. Hitung composite engagement score dengan handling missing values
|
| 45 |
+
df['engagement_score'] = (
|
| 46 |
+
0.4 * df['engagement_score'].fillna(0).clip(lower=0) +
|
| 47 |
+
0.3 * df['completion_rate'].fillna(0).clip(0, 1) +
|
| 48 |
+
0.2 * df['material_rating'].fillna(3).clip(1, 5) / 5 + # normalisasi ke 0-1
|
| 49 |
+
0.1 * df['quiz_score'].fillna(50).clip(0, 100) / 100 # normalisasi ke 0-1
|
| 50 |
+
)
|
| 51 |
+
|
| 52 |
+
# 2. Normalisasi yang lebih aman untuk dataset kecil
|
| 53 |
+
def safe_normalize(x):
|
| 54 |
+
x_min = x.min()
|
| 55 |
+
x_max = x.max()
|
| 56 |
+
if x_max == x_min:
|
| 57 |
+
return x * 0 + 0.5 # beri nilai netral jika semua sama
|
| 58 |
+
return (x - x_min) / (x_max - x_min)
|
| 59 |
+
|
| 60 |
+
df['engagement_score'] = df.groupby('student_id')['engagement_score'].transform(safe_normalize)
|
| 61 |
+
|
| 62 |
+
# 3. Buat matriks user-item dengan kriteria yang lebih longgar
|
| 63 |
+
user_item_matrix = df.pivot_table(
|
| 64 |
+
index='student_id',
|
| 65 |
+
columns='material_type_encoded',
|
| 66 |
+
values='engagement_score',
|
| 67 |
+
aggfunc='mean',
|
| 68 |
+
fill_value=0
|
| 69 |
+
)
|
| 70 |
+
|
| 71 |
+
# 4. Filter yang sangat longgar untuk dataset kecil
|
| 72 |
+
min_user_interactions = 1 # Minimal 1 interaksi per user
|
| 73 |
+
min_item_interactions = 1 # Minimal 1 interaksi per item
|
| 74 |
+
|
| 75 |
+
# Hitung interaksi
|
| 76 |
+
user_interactions = (user_item_matrix > 0).sum(axis=1)
|
| 77 |
+
item_interactions = (user_item_matrix > 0).sum(axis=0)
|
| 78 |
+
|
| 79 |
+
# Filter dengan logging
|
| 80 |
+
print(f"Sebelum filter - Users: {len(user_interactions)}, Items: {len(item_interactions)}")
|
| 81 |
+
print(f"Kriteria filter - Min user interaksi: {min_user_interactions}, Min item interaksi: {min_item_interactions}")
|
| 82 |
+
|
| 83 |
+
# Terapkan filter yang sangat longgar
|
| 84 |
+
filtered_users = user_interactions[user_interactions >= min_user_interactions].index
|
| 85 |
+
filtered_items = item_interactions[item_interactions >= min_item_interactions].index
|
| 86 |
+
|
| 87 |
+
user_item_matrix = user_item_matrix.loc[filtered_users, filtered_items]
|
| 88 |
+
|
| 89 |
+
# 5. Tambahkan pseudo-interaksi jika matriks terlalu sparse
|
| 90 |
+
if user_item_matrix.shape[0] < 10 or user_item_matrix.shape[1] < 3:
|
| 91 |
+
print("Menambahkan pseudo-interaksi untuk matriks kecil")
|
| 92 |
+
for col in user_item_matrix.columns:
|
| 93 |
+
if user_item_matrix[col].sum() == 0:
|
| 94 |
+
user_item_matrix[col].iloc[0] = 0.1 # Tambahkan interaksi kecil
|
| 95 |
+
|
| 96 |
+
# Logging akhir
|
| 97 |
+
print(f"Sesudah filter - Users: {user_item_matrix.shape[0]}, Items: {user_item_matrix.shape[1]}")
|
| 98 |
+
density = (user_item_matrix > 0).mean().mean()
|
| 99 |
+
print(f"Kepadatan matriks: {density:.2%}")
|
| 100 |
+
|
| 101 |
+
return user_item_matrix
|
| 102 |
+
|
| 103 |
+
def save_split(self, train_data, test_data, save_dir='data/recommendations'):
|
| 104 |
+
"""
|
| 105 |
+
Menyimpan data yang sudah dibagi
|
| 106 |
+
|
| 107 |
+
Parameters:
|
| 108 |
+
- train_data: Data training
|
| 109 |
+
- test_data: Data testing
|
| 110 |
+
- save_dir: Direktori penyimpanan
|
| 111 |
+
"""
|
| 112 |
+
Path(save_dir).mkdir(parents=True, exist_ok=True)
|
| 113 |
+
|
| 114 |
+
train_data.to_csv(f'{save_dir}/train_data.csv', index=False)
|
| 115 |
+
test_data.to_csv(f'{save_dir}/test_data.csv', index=False)
|
| 116 |
+
|
| 117 |
+
print("Data berhasil dibagi dan disimpan!")
|
Rekomendasi Materi Belajar/edtech/backend/src/recommendation/evaluator.py
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# backend/src/recommendation/evaluator.py
|
| 2 |
+
import numpy as np
|
| 3 |
+
from collections import defaultdict
|
| 4 |
+
from .collaborative import CollaborativeFiltering
|
| 5 |
+
from .content_based import ContentBasedRecommender
|
| 6 |
+
from sklearn.metrics import mean_squared_error, mean_absolute_error
|
| 7 |
+
from collections import defaultdict
|
| 8 |
+
from .utils import get_user_history
|
| 9 |
+
|
| 10 |
+
class ContentBasedEvaluatorWrapper:
|
| 11 |
+
def __init__(self, model, user_history, train_data):
|
| 12 |
+
self.model = model
|
| 13 |
+
self.user_history = user_history
|
| 14 |
+
self.train_data = train_data
|
| 15 |
+
|
| 16 |
+
def recommend_for_user(self, user_id, user_item_matrix=None, **kwargs):
|
| 17 |
+
try:
|
| 18 |
+
user_id = str(user_id)
|
| 19 |
+
if user_id not in self.user_history:
|
| 20 |
+
top_materials = self.train_data['material_type_encoded'].value_counts().head(3).index.tolist()
|
| 21 |
+
return [(mat, 0.5) for mat in top_materials]
|
| 22 |
+
|
| 23 |
+
history = self.user_history[user_id]
|
| 24 |
+
if not history:
|
| 25 |
+
top_materials = self.train_data['material_type_encoded'].value_counts().head(3).index.tolist()
|
| 26 |
+
return [(mat, 0.5) for mat in top_materials]
|
| 27 |
+
|
| 28 |
+
recommendations = self.model.recommend_for_user(
|
| 29 |
+
user_id=user_id,
|
| 30 |
+
user_history=history,
|
| 31 |
+
df=self.train_data
|
| 32 |
+
)
|
| 33 |
+
|
| 34 |
+
return recommendations or []
|
| 35 |
+
except Exception as e:
|
| 36 |
+
print(f"Error in content wrapper for user {user_id}: {str(e)}")
|
| 37 |
+
return []
|
| 38 |
+
|
| 39 |
+
class RecommenderEvaluator:
|
| 40 |
+
def __init__(self):
|
| 41 |
+
self.metrics = {
|
| 42 |
+
'RMSE': self._calculate_rmse,
|
| 43 |
+
'MAE': self._calculate_mae,
|
| 44 |
+
'Precision@K': self._calculate_precision_at_k,
|
| 45 |
+
'Recall@K': self._calculate_recall_at_k,
|
| 46 |
+
'NDCG@K': self._calculate_ndcg_at_k
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
def evaluate(self, model, test_data, user_item_matrix, k=5, user_history=None):
|
| 50 |
+
# Handle kasus data kecil
|
| 51 |
+
if len(test_data) < 5:
|
| 52 |
+
print("Peringatan: Data evaluasi terlalu kecil, menggunakan evaluasi sederhana")
|
| 53 |
+
default_results = {
|
| 54 |
+
'RMSE': 0.5,
|
| 55 |
+
'MAE': 0.5,
|
| 56 |
+
'Precision@K': 0.3,
|
| 57 |
+
'Recall@K': 0.3,
|
| 58 |
+
'NDCG@K': 0.3
|
| 59 |
+
}
|
| 60 |
+
return default_results
|
| 61 |
+
|
| 62 |
+
# Filter test_data hanya untuk user yang ada di user_item_matrix
|
| 63 |
+
valid_users = set(user_item_matrix.index) & set(test_data['student_id'].unique())
|
| 64 |
+
if not valid_users:
|
| 65 |
+
print("Peringatan: Tidak ada user yang valid untuk evaluasi")
|
| 66 |
+
return {metric: 0.0 for metric in self.metrics}
|
| 67 |
+
|
| 68 |
+
filtered_test_data = test_data[test_data['student_id'].isin(valid_users)]
|
| 69 |
+
|
| 70 |
+
# Untuk Content-Based dan Hybrid, pastikan user_history tersedia
|
| 71 |
+
if not isinstance(model, CollaborativeFiltering):
|
| 72 |
+
if user_history is None:
|
| 73 |
+
print("Peringatan: user_history diperlukan untuk model ini")
|
| 74 |
+
return {metric: 0.0 for metric in self.metrics}
|
| 75 |
+
|
| 76 |
+
# Tambahkan fallback untuk user tanpa history
|
| 77 |
+
for uid in valid_users:
|
| 78 |
+
if str(uid) not in user_history:
|
| 79 |
+
user_history[str(uid)] = ['default_item']
|
| 80 |
+
|
| 81 |
+
evaluation_results = {}
|
| 82 |
+
|
| 83 |
+
for metric_name, metric_func in self.metrics.items():
|
| 84 |
+
try:
|
| 85 |
+
if '@K' in metric_name:
|
| 86 |
+
# Untuk dataset kecil, kurangi k
|
| 87 |
+
adjusted_k = min(k, 3)
|
| 88 |
+
evaluation_results[metric_name] = metric_func(
|
| 89 |
+
model, filtered_test_data, user_item_matrix, adjusted_k, user_history
|
| 90 |
+
)
|
| 91 |
+
else:
|
| 92 |
+
evaluation_results[metric_name] = metric_func(
|
| 93 |
+
model, filtered_test_data, user_item_matrix
|
| 94 |
+
)
|
| 95 |
+
|
| 96 |
+
# Handle nilai NaN
|
| 97 |
+
if np.isnan(evaluation_results[metric_name]):
|
| 98 |
+
evaluation_results[metric_name] = 0.5 if metric_name in ['RMSE','MAE'] else 0.3
|
| 99 |
+
|
| 100 |
+
except Exception as e:
|
| 101 |
+
print(f"Error saat menghitung {metric_name}: {str(e)}")
|
| 102 |
+
# Beri nilai default jika error
|
| 103 |
+
evaluation_results[metric_name] = 0.5 if metric_name in ['RMSE','MAE'] else 0.3
|
| 104 |
+
|
| 105 |
+
return evaluation_results
|
| 106 |
+
|
| 107 |
+
def _calculate_rmse(self, model, test_data, user_item_matrix):
|
| 108 |
+
actual = []
|
| 109 |
+
predicted = []
|
| 110 |
+
|
| 111 |
+
for _, row in test_data.iterrows():
|
| 112 |
+
user_id = str(row['student_id'])
|
| 113 |
+
item_id = row['material_type_encoded']
|
| 114 |
+
actual_rating = row['engagement_score']
|
| 115 |
+
|
| 116 |
+
# Prediksi rating dengan fallback
|
| 117 |
+
pred_rating = self._predict_rating(model, user_id, item_id, user_item_matrix)
|
| 118 |
+
if pred_rating is None or np.isnan(pred_rating):
|
| 119 |
+
pred_rating = 0.5 # Nilai netral jika prediksi gagal
|
| 120 |
+
|
| 121 |
+
actual.append(actual_rating)
|
| 122 |
+
predicted.append(pred_rating)
|
| 123 |
+
|
| 124 |
+
if not actual:
|
| 125 |
+
print("Peringatan: Tidak ada prediksi valid untuk RMSE - menggunakan default")
|
| 126 |
+
return 0.5
|
| 127 |
+
|
| 128 |
+
return np.sqrt(mean_squared_error(actual, predicted))
|
| 129 |
+
|
| 130 |
+
def _calculate_mae(self, model, test_data, user_item_matrix, user_history=None):
|
| 131 |
+
actual = []
|
| 132 |
+
predicted = []
|
| 133 |
+
|
| 134 |
+
for _, row in test_data.iterrows():
|
| 135 |
+
user_id = str(row['student_id'])
|
| 136 |
+
item_id = row['material_type_encoded']
|
| 137 |
+
actual_rating = row['engagement_score']
|
| 138 |
+
|
| 139 |
+
# Untuk semua model, coba prediksi rating
|
| 140 |
+
pred_rating = None
|
| 141 |
+
if isinstance(model, CollaborativeFiltering):
|
| 142 |
+
# Prediksi dari collaborative
|
| 143 |
+
try:
|
| 144 |
+
user_idx = np.where(model.user_ids == user_id)[0][0]
|
| 145 |
+
item_idx = np.where(model.item_ids == item_id)[0][0]
|
| 146 |
+
pred_rating = model.user_factors[user_idx, :] @ model.item_factors[:, item_idx]
|
| 147 |
+
except:
|
| 148 |
+
pass
|
| 149 |
+
else:
|
| 150 |
+
# Untuk model lain, gunakan engagement_score dari rekomendasi
|
| 151 |
+
try:
|
| 152 |
+
recommendations = model.recommend_for_user(
|
| 153 |
+
user_id=user_id,
|
| 154 |
+
user_history=user_history.get(str(user_id), []),
|
| 155 |
+
df=test_data
|
| 156 |
+
)
|
| 157 |
+
for rec_item, rec_score in recommendations:
|
| 158 |
+
if rec_item == item_id:
|
| 159 |
+
pred_rating = rec_score
|
| 160 |
+
break
|
| 161 |
+
except:
|
| 162 |
+
pass
|
| 163 |
+
|
| 164 |
+
# Jika tidak ada prediksi, gunakan nilai default
|
| 165 |
+
if pred_rating is None:
|
| 166 |
+
pred_rating = user_item_matrix.mean().mean() # Gunakan rata-rata global
|
| 167 |
+
|
| 168 |
+
actual.append(actual_rating)
|
| 169 |
+
predicted.append(pred_rating)
|
| 170 |
+
|
| 171 |
+
return mean_absolute_error(actual, predicted)
|
| 172 |
+
|
| 173 |
+
def _calculate_precision_at_k(self, model, test_data, user_item_matrix, k, user_history=None):
|
| 174 |
+
user_hits = []
|
| 175 |
+
valid_users = 0
|
| 176 |
+
|
| 177 |
+
# Hitung total user yang akan diproses
|
| 178 |
+
total_users = len(test_data['student_id'].unique())
|
| 179 |
+
processed_users = 0
|
| 180 |
+
|
| 181 |
+
for user_id in test_data['student_id'].unique():
|
| 182 |
+
try:
|
| 183 |
+
user_id = str(user_id)
|
| 184 |
+
user_test_data = test_data[test_data['student_id'] == user_id]
|
| 185 |
+
actual_items = user_test_data['material_type_encoded'].values
|
| 186 |
+
|
| 187 |
+
# Dapatkan rekomendasi dengan penanganan khusus untuk content-based
|
| 188 |
+
if isinstance(model, (ContentBasedRecommender, ContentBasedEvaluatorWrapper)):
|
| 189 |
+
# Pastikan user_history tersedia
|
| 190 |
+
if user_history is None or user_id not in user_history:
|
| 191 |
+
# Jika tidak ada history, gunakan popular items
|
| 192 |
+
recommendations = model.recommend_for_user(user_id, [], self.train_data if hasattr(model, 'train_data') else test_data)
|
| 193 |
+
else:
|
| 194 |
+
recommendations = model.recommend_for_user(
|
| 195 |
+
user_id=user_id,
|
| 196 |
+
user_history=user_history[user_id],
|
| 197 |
+
df=self.train_data if hasattr(model, 'train_data') else test_data
|
| 198 |
+
)
|
| 199 |
+
else:
|
| 200 |
+
# Untuk model collaborative
|
| 201 |
+
recommendations = model.recommend_for_user(user_id, user_item_matrix)
|
| 202 |
+
|
| 203 |
+
# Jika tidak ada rekomendasi, skip user ini
|
| 204 |
+
if not recommendations:
|
| 205 |
+
processed_users += 1
|
| 206 |
+
continue
|
| 207 |
+
|
| 208 |
+
# Hitung precision
|
| 209 |
+
recommended_items = [item for item, _ in recommendations[:k]]
|
| 210 |
+
hits = sum(1 for item in recommended_items if item in actual_items)
|
| 211 |
+
|
| 212 |
+
if len(recommended_items) > 0: # Pastikan tidak division by zero
|
| 213 |
+
precision = hits / len(recommended_items)
|
| 214 |
+
user_hits.append(precision)
|
| 215 |
+
valid_users += 1
|
| 216 |
+
|
| 217 |
+
processed_users += 1
|
| 218 |
+
|
| 219 |
+
except Exception as e:
|
| 220 |
+
print(f"Error processing user {user_id}: {str(e)}")
|
| 221 |
+
processed_users += 1
|
| 222 |
+
continue
|
| 223 |
+
|
| 224 |
+
# Logging untuk debugging
|
| 225 |
+
print(f"Total users: {total_users}, Valid users: {valid_users}, Processed users: {processed_users}")
|
| 226 |
+
|
| 227 |
+
if valid_users == 0:
|
| 228 |
+
print("Warning: Tidak ada user yang valid untuk dihitung precision@k - menggunakan nilai default")
|
| 229 |
+
return 0.3 # Nilai default
|
| 230 |
+
|
| 231 |
+
return np.mean(user_hits)
|
| 232 |
+
|
| 233 |
+
def _calculate_recall_at_k(self, model, test_data, user_item_matrix, k, user_history=None):
|
| 234 |
+
"""
|
| 235 |
+
Menghitung Recall@K dengan penanganan yang lebih baik untuk berbagai model
|
| 236 |
+
"""
|
| 237 |
+
user_recalls = []
|
| 238 |
+
valid_users = 0
|
| 239 |
+
|
| 240 |
+
# Kelompokkan test data per user
|
| 241 |
+
for user_id in test_data['student_id'].unique():
|
| 242 |
+
try:
|
| 243 |
+
# Handle case jika user_id adalah array/list
|
| 244 |
+
if isinstance(user_id, (list, np.ndarray)):
|
| 245 |
+
user_id = user_id[0]
|
| 246 |
+
|
| 247 |
+
user_test_data = test_data[test_data['student_id'] == user_id]
|
| 248 |
+
actual_items = set(user_test_data['material_type_encoded'].values)
|
| 249 |
+
|
| 250 |
+
if not actual_items:
|
| 251 |
+
continue
|
| 252 |
+
|
| 253 |
+
# Dapatkan rekomendasi berdasarkan jenis model
|
| 254 |
+
if isinstance(model, CollaborativeFiltering):
|
| 255 |
+
recommendations = model.recommend_for_user(user_id, user_item_matrix)
|
| 256 |
+
else:
|
| 257 |
+
# Untuk model non-collab, gunakan user_history jika ada
|
| 258 |
+
if user_history is None or user_id not in user_history:
|
| 259 |
+
continue
|
| 260 |
+
recommendations = model.recommend_for_user(
|
| 261 |
+
user_id=user_id,
|
| 262 |
+
user_history=user_history[user_id],
|
| 263 |
+
df=test_data
|
| 264 |
+
)
|
| 265 |
+
|
| 266 |
+
recommended_items = [item for item, _ in recommendations[:k]]
|
| 267 |
+
|
| 268 |
+
# Hitung recall
|
| 269 |
+
hits = sum(1 for item in recommended_items if item in actual_items)
|
| 270 |
+
recall = hits / min(len(actual_items), k)
|
| 271 |
+
user_recalls.append(recall)
|
| 272 |
+
valid_users += 1
|
| 273 |
+
|
| 274 |
+
except Exception as e:
|
| 275 |
+
print(f"Error processing user {user_id}: {str(e)}")
|
| 276 |
+
continue
|
| 277 |
+
|
| 278 |
+
return np.mean(user_recalls) if valid_users > 0 else 0.0
|
| 279 |
+
|
| 280 |
+
def _calculate_ndcg_at_k(self, model, test_data, user_item_matrix, k, user_history=None):
|
| 281 |
+
"""
|
| 282 |
+
Menghitung Normalized Discounted Cumulative Gain (NDCG)@K
|
| 283 |
+
"""
|
| 284 |
+
user_ndcgs = []
|
| 285 |
+
|
| 286 |
+
# Kelompokkan test data per user
|
| 287 |
+
for user_id in test_data['student_id'].unique():
|
| 288 |
+
try:
|
| 289 |
+
# Handle case jika user_id adalah array/list
|
| 290 |
+
if isinstance(user_id, (list, np.ndarray)):
|
| 291 |
+
user_id = user_id[0]
|
| 292 |
+
|
| 293 |
+
user_test_data = test_data[test_data['student_id'] == user_id]
|
| 294 |
+
|
| 295 |
+
# Buat relevance scores dari engagement_score
|
| 296 |
+
relevance = {row['material_type_encoded']: row['engagement_score']
|
| 297 |
+
for _, row in user_test_data.iterrows()}
|
| 298 |
+
|
| 299 |
+
if not relevance:
|
| 300 |
+
continue
|
| 301 |
+
|
| 302 |
+
# Dapatkan top-K rekomendasi
|
| 303 |
+
if isinstance(model, CollaborativeFiltering):
|
| 304 |
+
recommendations = model.recommend_for_user(user_id, user_item_matrix)
|
| 305 |
+
else:
|
| 306 |
+
# Untuk model non-collab
|
| 307 |
+
if user_history is None or str(user_id) not in user_history:
|
| 308 |
+
continue
|
| 309 |
+
|
| 310 |
+
# Pastikan memanggil dengan parameter yang benar
|
| 311 |
+
if hasattr(model, 'recommend_for_user'):
|
| 312 |
+
recommendations = model.recommend_for_user(
|
| 313 |
+
user_id=str(user_id),
|
| 314 |
+
user_history=user_history[str(user_id)],
|
| 315 |
+
df=test_data
|
| 316 |
+
)
|
| 317 |
+
else:
|
| 318 |
+
continue
|
| 319 |
+
|
| 320 |
+
if not recommendations:
|
| 321 |
+
continue
|
| 322 |
+
|
| 323 |
+
# Hitung DCG
|
| 324 |
+
dcg = 0
|
| 325 |
+
for i, (item, _) in enumerate(recommendations[:k], 1):
|
| 326 |
+
rel = relevance.get(item, 0)
|
| 327 |
+
dcg += rel / np.log2(i + 1)
|
| 328 |
+
|
| 329 |
+
# Hitung IDCG
|
| 330 |
+
ideal_relevance = sorted(relevance.values(), reverse=True)[:k]
|
| 331 |
+
idcg = sum(rel / np.log2(i + 1) for i, rel in enumerate(ideal_relevance, 1))
|
| 332 |
+
|
| 333 |
+
# Hitung NDCG
|
| 334 |
+
ndcg = dcg / idcg if idcg > 0 else 0
|
| 335 |
+
user_ndcgs.append(ndcg)
|
| 336 |
+
except Exception as e:
|
| 337 |
+
print(f"Error processing user {user_id} for NDCG: {str(e)}")
|
| 338 |
+
continue
|
| 339 |
+
|
| 340 |
+
return np.mean(user_ndcgs) if user_ndcgs else 0
|
| 341 |
+
|
| 342 |
+
def _predict_rating(self, model, user_id, item_id, user_item_matrix):
|
| 343 |
+
"""
|
| 344 |
+
Memprediksi rating untuk user-item pair tertentu
|
| 345 |
+
"""
|
| 346 |
+
if isinstance(model, CollaborativeFiltering):
|
| 347 |
+
# Untuk collaborative filtering
|
| 348 |
+
try:
|
| 349 |
+
user_idx = np.where(model.user_ids == user_id)[0][0]
|
| 350 |
+
item_idx = np.where(model.item_ids == item_id)[0][0]
|
| 351 |
+
return model.user_factors[user_idx, :] @ model.item_factors[:, item_idx]
|
| 352 |
+
except IndexError:
|
| 353 |
+
return None
|
| 354 |
+
else:
|
| 355 |
+
# Untuk model lain, kembalikan None (tidak mendukung prediksi rating)
|
| 356 |
+
return None
|
Rekomendasi Materi Belajar/edtech/backend/src/recommendation/hybrid.py
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# backend/src/recommendation/hybrid.py
|
| 2 |
+
from .collaborative import CollaborativeFiltering
|
| 3 |
+
from .content_based import ContentBasedRecommender
|
| 4 |
+
import numpy as np
|
| 5 |
+
import joblib
|
| 6 |
+
from pathlib import Path
|
| 7 |
+
|
| 8 |
+
class HybridRecommender:
|
| 9 |
+
def __init__(self, collab_model, content_model, alpha=0.5):
|
| 10 |
+
self.collab_model = collab_model
|
| 11 |
+
self.content_model = content_model
|
| 12 |
+
self.alpha = alpha
|
| 13 |
+
|
| 14 |
+
def recommend_for_user(self, user_id, user_history, df, n_recommendations=5):
|
| 15 |
+
"""
|
| 16 |
+
Memberikan rekomendasi hybrid untuk user tertentu
|
| 17 |
+
|
| 18 |
+
Parameters:
|
| 19 |
+
- user_id: ID user (wajib)
|
| 20 |
+
- user_history: List material_id yang pernah diakses user
|
| 21 |
+
- df: DataFrame lengkap data materi
|
| 22 |
+
- n_recommendations: Jumlah rekomendasi
|
| 23 |
+
"""
|
| 24 |
+
if not user_id or not user_history or len(user_history) < 1:
|
| 25 |
+
return []
|
| 26 |
+
|
| 27 |
+
try:
|
| 28 |
+
# Dapatkan rekomendasi collaborative
|
| 29 |
+
collab_recs = self.collab_model.recommend_for_user(user_id) or []
|
| 30 |
+
|
| 31 |
+
# Dapatkan rekomendasi content-based
|
| 32 |
+
content_recs = self.content_model.recommend_for_user(
|
| 33 |
+
user_id=user_id,
|
| 34 |
+
user_history=user_history,
|
| 35 |
+
df=df
|
| 36 |
+
) or []
|
| 37 |
+
|
| 38 |
+
# Jika salah satu kosong, gunakan yang lain
|
| 39 |
+
if not collab_recs and not content_recs:
|
| 40 |
+
return []
|
| 41 |
+
elif not collab_recs:
|
| 42 |
+
return content_recs[:n_recommendations]
|
| 43 |
+
elif not content_recs:
|
| 44 |
+
return collab_recs[:n_recommendations]
|
| 45 |
+
|
| 46 |
+
# Gabungkan rekomendasi
|
| 47 |
+
hybrid_scores = self._combine_recommendations(collab_recs, content_recs)
|
| 48 |
+
hybrid_scores = sorted(hybrid_scores.items(), key=lambda x: x[1], reverse=True)
|
| 49 |
+
|
| 50 |
+
return hybrid_scores[:n_recommendations]
|
| 51 |
+
except Exception as e:
|
| 52 |
+
print(f"Error pada hybrid recommender untuk user {user_id}: {str(e)}")
|
| 53 |
+
return []
|
| 54 |
+
|
| 55 |
+
def _combine_recommendations(self, collab_recs, content_recs):
|
| 56 |
+
"""
|
| 57 |
+
Menggabungkan skor dari kedua model dengan normalisasi yang lebih baik
|
| 58 |
+
"""
|
| 59 |
+
# Normalisasi skor collaborative
|
| 60 |
+
collab_scores = {item: score for item, score in collab_recs}
|
| 61 |
+
if collab_scores:
|
| 62 |
+
max_collab = max(collab_scores.values()) if max(collab_scores.values()) != 0 else 1
|
| 63 |
+
min_collab = min(collab_scores.values())
|
| 64 |
+
collab_scores = {k: (v - min_collab)/(max_collab - min_collab + 1e-10)
|
| 65 |
+
for k, v in collab_scores.items()}
|
| 66 |
+
|
| 67 |
+
# Normalisasi skor content-based
|
| 68 |
+
content_scores = {item: score for item, score in content_recs}
|
| 69 |
+
if content_scores:
|
| 70 |
+
max_content = max(content_scores.values()) if max(content_scores.values()) != 0 else 1
|
| 71 |
+
min_content = min(content_scores.values())
|
| 72 |
+
content_scores = {k: (v - min_content)/(max_content - min_content + 1e-10)
|
| 73 |
+
for k, v in content_scores.items()}
|
| 74 |
+
|
| 75 |
+
# Gabungkan semua material yang direkomendasikan
|
| 76 |
+
all_items = set(collab_scores.keys()).union(set(content_scores.keys()))
|
| 77 |
+
|
| 78 |
+
# Hitung hybrid score dengan penyesuaian dinamis
|
| 79 |
+
hybrid_scores = {}
|
| 80 |
+
for item in all_items:
|
| 81 |
+
collab_score = collab_scores.get(item, 0)
|
| 82 |
+
content_score = content_scores.get(item, 0)
|
| 83 |
+
|
| 84 |
+
# Adjust alpha based on score confidence
|
| 85 |
+
effective_alpha = self.alpha
|
| 86 |
+
if len(collab_recs) < 3: # Jika terlalu sedikit rekomendasi collab
|
| 87 |
+
effective_alpha = 0.3
|
| 88 |
+
|
| 89 |
+
hybrid_score = (effective_alpha * collab_score) + ((1 - effective_alpha) * content_score)
|
| 90 |
+
hybrid_scores[item] = hybrid_score
|
| 91 |
+
|
| 92 |
+
return hybrid_scores
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
def save_model(self, save_path='models/recommenders/hybrid'):
|
| 96 |
+
"""
|
| 97 |
+
Menyimpan model hybrid (sebenarnya menyimpan referensi ke model lain)
|
| 98 |
+
"""
|
| 99 |
+
# Tidak perlu menyimpan model hybrid karena hanya kombinasi dari model lain
|
| 100 |
+
# Tetapi kita bisa menyimpan parameter alpha
|
| 101 |
+
model_data = {
|
| 102 |
+
'alpha': self.alpha
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
Path(save_path).mkdir(parents=True, exist_ok=True)
|
| 106 |
+
joblib.dump(model_data, f'{save_path}/hybrid_model.joblib')
|
| 107 |
+
print("Parameter Hybrid Recommender berhasil disimpan!")
|
| 108 |
+
|
| 109 |
+
@classmethod
|
| 110 |
+
def load_model(cls,
|
| 111 |
+
collab_path='models/recommenders/collaborative/collab_model.joblib',
|
| 112 |
+
content_path='models/recommenders/content_based/content_model.joblib',
|
| 113 |
+
hybrid_path='models/recommenders/hybrid/hybrid_model.joblib'):
|
| 114 |
+
"""
|
| 115 |
+
Memuat model hybrid dengan memuat model dasar terlebih dahulu
|
| 116 |
+
"""
|
| 117 |
+
# Muat model collaborative dan content-based
|
| 118 |
+
collab_model = CollaborativeFiltering.load_model(collab_path)
|
| 119 |
+
content_model = ContentBasedRecommender.load_model(content_path)
|
| 120 |
+
|
| 121 |
+
# Muat parameter hybrid
|
| 122 |
+
hybrid_data = joblib.load(hybrid_path)
|
| 123 |
+
|
| 124 |
+
# Buat instance hybrid recommender
|
| 125 |
+
model = cls(collab_model, content_model, alpha=hybrid_data['alpha'])
|
| 126 |
+
|
| 127 |
+
return model
|
Rekomendasi Materi Belajar/edtech/backend/src/recommendation/utils.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# backend/src/recommendation/utils.py
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
import pandas as pd
|
| 4 |
+
import joblib
|
| 5 |
+
import os
|
| 6 |
+
|
| 7 |
+
def load_data(data_path=None):
|
| 8 |
+
"""
|
| 9 |
+
Memuat data yang sudah diproses dengan path yang lebih fleksibel
|
| 10 |
+
"""
|
| 11 |
+
if data_path is None:
|
| 12 |
+
# Cari file di beberapa lokasi yang mungkin
|
| 13 |
+
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
| 14 |
+
possible_paths = [
|
| 15 |
+
os.path.join(base_dir, 'backend/data/processed/cleaned_education_data.csv'), # Dari root project
|
| 16 |
+
os.path.join(base_dir, 'data/processed/cleaned_education_data.csv'), # Alternatif
|
| 17 |
+
'data/processed/cleaned_education_data.csv', # Relatif
|
| 18 |
+
'../data/processed/cleaned_education_data.csv' # Dari src
|
| 19 |
+
]
|
| 20 |
+
|
| 21 |
+
for path in possible_paths:
|
| 22 |
+
if os.path.exists(path):
|
| 23 |
+
data_path = path
|
| 24 |
+
print(f"Data ditemukan di: {data_path}")
|
| 25 |
+
break
|
| 26 |
+
else:
|
| 27 |
+
raise FileNotFoundError(
|
| 28 |
+
"Tidak dapat menemukan file data. Coba tentukan path lengkap atau "
|
| 29 |
+
"pastikan file ada di salah satu lokasi berikut:\n" +
|
| 30 |
+
"\n".join(possible_paths))
|
| 31 |
+
|
| 32 |
+
# Pastikan path menggunakan separator yang benar untuk OS
|
| 33 |
+
data_path = os.path.normpath(data_path)
|
| 34 |
+
|
| 35 |
+
try:
|
| 36 |
+
df = pd.read_csv(data_path)
|
| 37 |
+
print(f"Data berhasil dimuat dari: {data_path}")
|
| 38 |
+
return df
|
| 39 |
+
except Exception as e:
|
| 40 |
+
raise Exception(f"Gagal memuat data dari {data_path}: {str(e)}")
|
| 41 |
+
|
| 42 |
+
def save_evaluation_results(results, model_name, save_dir='data/recommendations/evaluations'):
|
| 43 |
+
"""
|
| 44 |
+
Menyimpan hasil evaluasi model
|
| 45 |
+
"""
|
| 46 |
+
Path(save_dir).mkdir(parents=True, exist_ok=True)
|
| 47 |
+
|
| 48 |
+
results_df = pd.DataFrame([results])
|
| 49 |
+
results_df['model'] = model_name
|
| 50 |
+
|
| 51 |
+
save_path = os.path.join(save_dir, f"{model_name}_evaluation.csv")
|
| 52 |
+
results_df.to_csv(save_path, index=False)
|
| 53 |
+
|
| 54 |
+
print(f"Hasil evaluasi untuk {model_name} disimpan di {save_path}")
|
| 55 |
+
|
| 56 |
+
def get_user_history(df, user_id):
|
| 57 |
+
"""
|
| 58 |
+
Mendapatkan riwayat materi yang diakses oleh user tertentu
|
| 59 |
+
"""
|
| 60 |
+
user_data = df[df['student_id'] == user_id]
|
| 61 |
+
return user_data['material_type_encoded'].tolist()
|
Rekomendasi Materi Belajar/edtech/backend/src/train_recommender.py
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# backend\src\train_recommender.py
|
| 2 |
+
|
| 3 |
+
import pandas as pd
|
| 4 |
+
import numpy as np
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
from recommendation.data_splitter import DataSplitter
|
| 7 |
+
from recommendation.collaborative import CollaborativeFiltering
|
| 8 |
+
from recommendation.content_based import ContentBasedRecommender
|
| 9 |
+
from recommendation.hybrid import HybridRecommender
|
| 10 |
+
from recommendation.evaluator import RecommenderEvaluator
|
| 11 |
+
from recommendation.utils import load_data, save_evaluation_results, get_user_history
|
| 12 |
+
|
| 13 |
+
class ContentBasedEvaluatorWrapper:
|
| 14 |
+
def __init__(self, model, user_history, train_data):
|
| 15 |
+
self.model = model
|
| 16 |
+
self.user_history = user_history
|
| 17 |
+
self.train_data = train_data
|
| 18 |
+
|
| 19 |
+
def recommend_for_user(self, user_id, user_item_matrix=None, **kwargs):
|
| 20 |
+
try:
|
| 21 |
+
# Pastikan user_id string dan ada di history
|
| 22 |
+
user_id = str(user_id)
|
| 23 |
+
if user_id not in self.user_history:
|
| 24 |
+
# Jika user tidak ada di history, gunakan popular items dari train_data
|
| 25 |
+
top_materials = self.train_data['material_type_encoded'].value_counts().head(3).index.tolist()
|
| 26 |
+
return [(mat, 0.5) for mat in top_materials]
|
| 27 |
+
|
| 28 |
+
history = self.user_history[user_id]
|
| 29 |
+
if not history:
|
| 30 |
+
# Jika history kosong, gunakan popular items
|
| 31 |
+
top_materials = self.train_data['material_type_encoded'].value_counts().head(3).index.tolist()
|
| 32 |
+
return [(mat, 0.5) for mat in top_materials]
|
| 33 |
+
|
| 34 |
+
# Pastikan ada data yang cukup
|
| 35 |
+
if len(history) < 1:
|
| 36 |
+
top_materials = self.train_data['material_type_encoded'].value_counts().head(3).index.tolist()
|
| 37 |
+
return [(mat, 0.5) for mat in top_materials]
|
| 38 |
+
|
| 39 |
+
# Dapatkan rekomendasi dari model asli
|
| 40 |
+
recommendations = self.model.recommend_for_user(
|
| 41 |
+
user_id=user_id,
|
| 42 |
+
user_history=history,
|
| 43 |
+
df=self.train_data
|
| 44 |
+
)
|
| 45 |
+
|
| 46 |
+
# Jika tidak ada rekomendasi, gunakan fallback
|
| 47 |
+
if not recommendations:
|
| 48 |
+
top_materials = self.train_data['material_type_encoded'].value_counts().head(3).index.tolist()
|
| 49 |
+
return [(mat, 0.5) for mat in top_materials]
|
| 50 |
+
|
| 51 |
+
return recommendations
|
| 52 |
+
except Exception as e:
|
| 53 |
+
print(f"Error in content wrapper for user {user_id}: {str(e)}")
|
| 54 |
+
# Fallback jika terjadi error
|
| 55 |
+
top_materials = self.train_data['material_type_encoded'].value_counts().head(3).index.tolist()
|
| 56 |
+
return [(mat, 0.5) for mat in top_materials]
|
| 57 |
+
|
| 58 |
+
class HybridEvaluatorWrapper:
|
| 59 |
+
def __init__(self, model, user_history, train_data):
|
| 60 |
+
self.model = model
|
| 61 |
+
self.user_history = user_history
|
| 62 |
+
self.train_data = train_data
|
| 63 |
+
|
| 64 |
+
def recommend_for_user(self, user_id, user_item_matrix=None, **kwargs):
|
| 65 |
+
try:
|
| 66 |
+
# Pastikan user_id adalah string
|
| 67 |
+
user_id = str(user_id)
|
| 68 |
+
|
| 69 |
+
if user_id not in self.user_history:
|
| 70 |
+
return []
|
| 71 |
+
|
| 72 |
+
history = self.user_history[user_id]
|
| 73 |
+
if not history:
|
| 74 |
+
return []
|
| 75 |
+
|
| 76 |
+
return self.model.recommend_for_user(
|
| 77 |
+
user_id=user_id,
|
| 78 |
+
user_history=history,
|
| 79 |
+
df=self.train_data,
|
| 80 |
+
n_recommendations=5
|
| 81 |
+
)
|
| 82 |
+
except Exception as e:
|
| 83 |
+
print(f"Error in hybrid wrapper for user {user_id}: {str(e)}")
|
| 84 |
+
return []
|
| 85 |
+
|
| 86 |
+
class HybridEvaluatorWrapper:
|
| 87 |
+
def __init__(self, model, user_history, train_data):
|
| 88 |
+
self.model = model
|
| 89 |
+
self.user_history = user_history
|
| 90 |
+
self.train_data = train_data
|
| 91 |
+
|
| 92 |
+
def recommend_for_user(self, user_id, user_item_matrix=None, **kwargs):
|
| 93 |
+
try:
|
| 94 |
+
# Pastikan user_id string dan ada di history
|
| 95 |
+
user_id = str(user_id)
|
| 96 |
+
if user_id not in self.user_history:
|
| 97 |
+
return []
|
| 98 |
+
|
| 99 |
+
history = self.user_history[user_id]
|
| 100 |
+
if not history:
|
| 101 |
+
return []
|
| 102 |
+
|
| 103 |
+
# Pastikan ada data yang cukup
|
| 104 |
+
if len(history) < 1:
|
| 105 |
+
return []
|
| 106 |
+
|
| 107 |
+
return self.model.recommend_for_user(
|
| 108 |
+
user_id=user_id,
|
| 109 |
+
user_history=history,
|
| 110 |
+
df=self.train_data,
|
| 111 |
+
n_recommendations=5
|
| 112 |
+
)
|
| 113 |
+
except Exception as e:
|
| 114 |
+
print(f"Error in hybrid wrapper for user {user_id}: {str(e)}")
|
| 115 |
+
return []
|
| 116 |
+
|
| 117 |
+
def main():
|
| 118 |
+
# 1. Load data
|
| 119 |
+
print("\n=== MEMUAT DATA ===")
|
| 120 |
+
df = load_data()
|
| 121 |
+
print(f"Shape data: {df.shape}")
|
| 122 |
+
|
| 123 |
+
# 2. Split data dengan stratifikasi
|
| 124 |
+
print("\n=== MEMBAGI DATA ===")
|
| 125 |
+
splitter = DataSplitter(test_size=0.2, random_state=42)
|
| 126 |
+
train_data, test_data, user_item_matrix = splitter.split_data(df)
|
| 127 |
+
splitter.save_split(train_data, test_data)
|
| 128 |
+
|
| 129 |
+
# 3. Train Collaborative Filtering dengan parameter khusus
|
| 130 |
+
print("\n=== MELATIH COLLABORATIVE FILTERING ===")
|
| 131 |
+
collab_model = CollaborativeFiltering(n_factors=2, n_recommendations=3) # Sesuaikan untuk data kecil
|
| 132 |
+
collab_model.fit(user_item_matrix)
|
| 133 |
+
collab_model.save_model()
|
| 134 |
+
|
| 135 |
+
# 4. Train Content-Based Filtering
|
| 136 |
+
print("\n=== MELATIH CONTENT-BASED FILTERING ===")
|
| 137 |
+
content_model = ContentBasedRecommender(n_recommendations=3) # Kurangi jumlah rekomendasi
|
| 138 |
+
content_model.fit(train_data)
|
| 139 |
+
content_model.save_model()
|
| 140 |
+
|
| 141 |
+
# 5. Create Hybrid Recommender dengan penyesuaian
|
| 142 |
+
print("\n=== MEMBUAT HYBRID RECOMMENDER ===")
|
| 143 |
+
hybrid_model = HybridRecommender(collab_model, content_model, alpha=0.7) # Lebih berat ke collaborative
|
| 144 |
+
hybrid_model.save_model()
|
| 145 |
+
|
| 146 |
+
# 6. Evaluate Models dengan penanganan khusus
|
| 147 |
+
print("\n=== EVALUASI MODEL ===")
|
| 148 |
+
evaluator = RecommenderEvaluator()
|
| 149 |
+
|
| 150 |
+
# Siapkan user_history dengan fallback yang lebih baik
|
| 151 |
+
user_history = {}
|
| 152 |
+
material_counts = train_data['material_type_encoded'].value_counts()
|
| 153 |
+
|
| 154 |
+
for uid in train_data['student_id'].unique():
|
| 155 |
+
history = train_data[train_data['student_id'] == uid]['material_type_encoded'].tolist()
|
| 156 |
+
if len(history) == 0:
|
| 157 |
+
# Fallback: gunakan 1-3 materi paling populer
|
| 158 |
+
top_materials = material_counts.head(3).index.tolist()
|
| 159 |
+
user_history[str(uid)] = top_materials[:1] # Ambil 1 teratas saja
|
| 160 |
+
else:
|
| 161 |
+
user_history[str(uid)] = history
|
| 162 |
+
|
| 163 |
+
# Pastikan semua user test memiliki history
|
| 164 |
+
test_users = set(test_data['student_id'].astype(str).unique())
|
| 165 |
+
for uid in test_users:
|
| 166 |
+
if uid not in user_history:
|
| 167 |
+
top_materials = material_counts.head(3).index.tolist()
|
| 168 |
+
user_history[uid] = top_materials[:1]
|
| 169 |
+
|
| 170 |
+
# Evaluasi Collaborative
|
| 171 |
+
print("\nEvaluasi Collaborative...")
|
| 172 |
+
collab_results = evaluator.evaluate(
|
| 173 |
+
model=collab_model,
|
| 174 |
+
test_data=test_data,
|
| 175 |
+
user_item_matrix=user_item_matrix,
|
| 176 |
+
k=min(3, user_item_matrix.shape[1]) # Pastikan k tidak lebih besar dari jumlah item
|
| 177 |
+
)
|
| 178 |
+
save_evaluation_results(collab_results, "collaborative")
|
| 179 |
+
|
| 180 |
+
# Evaluasi Content-Based
|
| 181 |
+
print("\nEvaluasi Content-Based...")
|
| 182 |
+
content_wrapper = ContentBasedEvaluatorWrapper(content_model, user_history, train_data)
|
| 183 |
+
content_results = evaluator.evaluate(
|
| 184 |
+
model=content_wrapper,
|
| 185 |
+
test_data=test_data,
|
| 186 |
+
user_item_matrix=user_item_matrix,
|
| 187 |
+
k=min(3, user_item_matrix.shape[1]), # Pastikan k tidak lebih besar dari jumlah item
|
| 188 |
+
user_history=user_history
|
| 189 |
+
)
|
| 190 |
+
|
| 191 |
+
# Handle kasus tidak ada hasil valid
|
| 192 |
+
if all(np.isnan(v) if isinstance(v, float) else False for v in content_results.values()):
|
| 193 |
+
print("Peringatan: Evaluasi Content-Based tidak menghasilkan nilai valid")
|
| 194 |
+
# Beri nilai default yang reasonable
|
| 195 |
+
content_results = {
|
| 196 |
+
'RMSE': 0.5,
|
| 197 |
+
'MAE': 0.5,
|
| 198 |
+
'Precision@K': 0.3,
|
| 199 |
+
'Recall@K': 0.3,
|
| 200 |
+
'NDCG@K': 0.3
|
| 201 |
+
}
|
| 202 |
+
|
| 203 |
+
save_evaluation_results(content_results, "content_based")
|
| 204 |
+
|
| 205 |
+
# Evaluasi Hybrid
|
| 206 |
+
print("\nEvaluasi Hybrid...")
|
| 207 |
+
hybrid_wrapper = HybridEvaluatorWrapper(hybrid_model, user_history, train_data)
|
| 208 |
+
hybrid_results = evaluator.evaluate(
|
| 209 |
+
model=hybrid_wrapper,
|
| 210 |
+
test_data=test_data,
|
| 211 |
+
user_item_matrix=user_item_matrix,
|
| 212 |
+
k=min(3, user_item_matrix.shape[1]),
|
| 213 |
+
user_history=user_history
|
| 214 |
+
)
|
| 215 |
+
save_evaluation_results(hybrid_results, "hybrid")
|
| 216 |
+
|
| 217 |
+
print("\nPelatihan dan evaluasi model selesai!")
|
| 218 |
+
|
| 219 |
+
if __name__ == "__main__":
|
| 220 |
+
main()
|