make-mp-data 3.0.4 → 3.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -0
- package/dungeons/array-of-object-lookup-schema.json +327 -0
- package/dungeons/array-of-object-lookup.js +28 -8
- package/dungeons/capstone/capstone-ic3.js +291 -0
- package/dungeons/capstone/capstone-ic4.js +598 -0
- package/dungeons/capstone/capstone-ic5.js +668 -0
- package/dungeons/capstone/generate-product-lookup.js +309 -0
- package/dungeons/ecommerce-schema.json +462 -0
- package/dungeons/{copilot.js → ecommerce.js} +77 -15
- package/dungeons/education-schema.json +2409 -0
- package/dungeons/education.js +206 -442
- package/dungeons/fintech-schema.json +14034 -0
- package/dungeons/fintech.js +110 -389
- package/dungeons/foobar-schema.json +403 -0
- package/dungeons/foobar.js +27 -4
- package/dungeons/food-delivery-schema.json +192 -0
- package/dungeons/food-delivery.js +602 -0
- package/dungeons/food-schema.json +1152 -0
- package/dungeons/food.js +150 -383
- package/dungeons/gaming-schema.json +1270 -0
- package/dungeons/gaming.js +143 -3
- package/dungeons/insurance-application-schema.json +204 -0
- package/dungeons/insurance-application.js +605 -0
- package/dungeons/media-schema.json +906 -0
- package/dungeons/media.js +221 -391
- package/dungeons/retention-cadence-schema.json +78 -0
- package/dungeons/retention-cadence.js +35 -1
- package/dungeons/rpg-schema.json +4526 -0
- package/dungeons/rpg.js +130 -388
- package/dungeons/sanity-schema.json +255 -0
- package/dungeons/sanity.js +21 -10
- package/dungeons/sass-schema.json +1291 -0
- package/dungeons/sass.js +210 -337
- package/dungeons/scd-schema.json +919 -0
- package/dungeons/scd.js +38 -10
- package/dungeons/simple-schema.json +608 -0
- package/dungeons/simple.js +48 -11
- package/dungeons/simplest-schema.json +1418 -0
- package/dungeons/simplest.js +392 -0
- package/dungeons/social-schema.json +1118 -0
- package/dungeons/social.js +124 -365
- package/dungeons/text-generation-schema.json +3096 -0
- package/dungeons/text-generation.js +71 -0
- package/index.js +6 -3
- package/lib/core/config-validator.js +18 -0
- package/lib/core/storage.js +5 -5
- package/lib/generators/events.js +4 -4
- package/lib/orchestrators/mixpanel-sender.js +12 -7
- package/lib/orchestrators/user-loop.js +14 -6
- package/lib/templates/soup-presets.js +188 -0
- package/lib/utils/utils.js +52 -6
- package/package.json +1 -1
- package/types.d.ts +20 -3
- package/dungeons/adspend.js +0 -117
- package/dungeons/anon.js +0 -128
- package/dungeons/benchmark-heavy.js +0 -240
- package/dungeons/benchmark-light.js +0 -126
- package/dungeons/big.js +0 -226
- package/dungeons/business.js +0 -391
- package/dungeons/complex.js +0 -428
- package/dungeons/experiments.js +0 -137
- package/dungeons/funnels.js +0 -309
- package/dungeons/mil.js +0 -323
- package/dungeons/mirror.js +0 -160
- package/dungeons/soup-test.js +0 -52
- package/dungeons/streaming.js +0 -372
- package/dungeons/strict-event-test.js +0 -30
- package/dungeons/student-teacher.js +0 -438
- package/dungeons/too-big-events.js +0 -203
- package/dungeons/user-agent.js +0 -209
|
@@ -0,0 +1,2409 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": {
|
|
3
|
+
"token": "",
|
|
4
|
+
"seed": "harness-education",
|
|
5
|
+
"numDays": 100,
|
|
6
|
+
"numEvents": 600000,
|
|
7
|
+
"numUsers": 5000,
|
|
8
|
+
"hasAnonIds": false,
|
|
9
|
+
"hasSessionIds": true,
|
|
10
|
+
"format": "json",
|
|
11
|
+
"gzip": true,
|
|
12
|
+
"alsoInferFunnels": false,
|
|
13
|
+
"hasLocation": true,
|
|
14
|
+
"hasAndroidDevices": true,
|
|
15
|
+
"hasIOSDevices": true,
|
|
16
|
+
"hasDesktopDevices": true,
|
|
17
|
+
"hasBrowser": false,
|
|
18
|
+
"hasCampaigns": false,
|
|
19
|
+
"isAnonymous": false,
|
|
20
|
+
"hasAdSpend": false,
|
|
21
|
+
"percentUsersBornInDataset": 50,
|
|
22
|
+
"hasAvatar": true,
|
|
23
|
+
"batchSize": 2500000,
|
|
24
|
+
"concurrency": 1,
|
|
25
|
+
"writeToDisk": false,
|
|
26
|
+
"funnels": [
|
|
27
|
+
{
|
|
28
|
+
"sequence": [
|
|
29
|
+
"account registered",
|
|
30
|
+
"course enrolled",
|
|
31
|
+
"lecture started"
|
|
32
|
+
],
|
|
33
|
+
"isFirstFunnel": true,
|
|
34
|
+
"conversionRate": 75,
|
|
35
|
+
"timeToConvert": 1
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"sequence": [
|
|
39
|
+
"lecture started",
|
|
40
|
+
"lecture completed",
|
|
41
|
+
"practice problem solved"
|
|
42
|
+
],
|
|
43
|
+
"conversionRate": 70,
|
|
44
|
+
"timeToConvert": 4,
|
|
45
|
+
"weight": 5
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"sequence": [
|
|
49
|
+
"quiz started",
|
|
50
|
+
"quiz completed",
|
|
51
|
+
"assignment submitted"
|
|
52
|
+
],
|
|
53
|
+
"conversionRate": 55,
|
|
54
|
+
"timeToConvert": 8,
|
|
55
|
+
"weight": 3
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"sequence": [
|
|
59
|
+
"course enrolled",
|
|
60
|
+
"lecture completed",
|
|
61
|
+
"quiz completed",
|
|
62
|
+
"certificate earned"
|
|
63
|
+
],
|
|
64
|
+
"conversionRate": 30,
|
|
65
|
+
"timeToConvert": 48,
|
|
66
|
+
"weight": 2
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"sequence": [
|
|
70
|
+
"discussion posted",
|
|
71
|
+
"study group joined",
|
|
72
|
+
"resource downloaded"
|
|
73
|
+
],
|
|
74
|
+
"conversionRate": 50,
|
|
75
|
+
"timeToConvert": 12,
|
|
76
|
+
"weight": 2
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"sequence": [
|
|
80
|
+
"assignment submitted",
|
|
81
|
+
"assignment graded",
|
|
82
|
+
"instructor feedback given"
|
|
83
|
+
],
|
|
84
|
+
"conversionRate": 45,
|
|
85
|
+
"timeToConvert": 24,
|
|
86
|
+
"weight": 2
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"sequence": [
|
|
90
|
+
"help requested",
|
|
91
|
+
"subscription purchased",
|
|
92
|
+
"course reviewed"
|
|
93
|
+
],
|
|
94
|
+
"conversionRate": 35,
|
|
95
|
+
"timeToConvert": 24,
|
|
96
|
+
"weight": 1
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"events": [
|
|
100
|
+
{
|
|
101
|
+
"event": "account registered",
|
|
102
|
+
"weight": 1,
|
|
103
|
+
"isFirstEvent": true,
|
|
104
|
+
"properties": {
|
|
105
|
+
"account_type": {
|
|
106
|
+
"functionName": "arrow",
|
|
107
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
108
|
+
},
|
|
109
|
+
"signup_source": [
|
|
110
|
+
"organic",
|
|
111
|
+
"referral",
|
|
112
|
+
"school_partnership",
|
|
113
|
+
"social_ad"
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"event": "course enrolled",
|
|
119
|
+
"weight": 8,
|
|
120
|
+
"properties": {
|
|
121
|
+
"course_id": {
|
|
122
|
+
"functionName": "arrow",
|
|
123
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
124
|
+
},
|
|
125
|
+
"course_category": [
|
|
126
|
+
"CS",
|
|
127
|
+
"Math",
|
|
128
|
+
"Science",
|
|
129
|
+
"Business",
|
|
130
|
+
"Arts",
|
|
131
|
+
"Languages"
|
|
132
|
+
],
|
|
133
|
+
"difficulty": [
|
|
134
|
+
"beginner",
|
|
135
|
+
"intermediate",
|
|
136
|
+
"advanced"
|
|
137
|
+
],
|
|
138
|
+
"is_free": {
|
|
139
|
+
"functionName": "arrow",
|
|
140
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"event": "lecture started",
|
|
146
|
+
"weight": 18,
|
|
147
|
+
"properties": {
|
|
148
|
+
"course_id": {
|
|
149
|
+
"functionName": "arrow",
|
|
150
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
151
|
+
},
|
|
152
|
+
"lecture_id": {
|
|
153
|
+
"functionName": "arrow",
|
|
154
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
155
|
+
},
|
|
156
|
+
"lecture_duration_mins": [
|
|
157
|
+
21,
|
|
158
|
+
23,
|
|
159
|
+
21,
|
|
160
|
+
17,
|
|
161
|
+
26,
|
|
162
|
+
39,
|
|
163
|
+
40,
|
|
164
|
+
23,
|
|
165
|
+
37,
|
|
166
|
+
15,
|
|
167
|
+
27,
|
|
168
|
+
18,
|
|
169
|
+
31,
|
|
170
|
+
19,
|
|
171
|
+
50,
|
|
172
|
+
16,
|
|
173
|
+
32,
|
|
174
|
+
57,
|
|
175
|
+
38,
|
|
176
|
+
22
|
|
177
|
+
],
|
|
178
|
+
"module_number": [
|
|
179
|
+
8,
|
|
180
|
+
3,
|
|
181
|
+
6,
|
|
182
|
+
5,
|
|
183
|
+
4,
|
|
184
|
+
5,
|
|
185
|
+
3,
|
|
186
|
+
3,
|
|
187
|
+
4,
|
|
188
|
+
5,
|
|
189
|
+
6,
|
|
190
|
+
9,
|
|
191
|
+
4,
|
|
192
|
+
5,
|
|
193
|
+
6,
|
|
194
|
+
5,
|
|
195
|
+
5,
|
|
196
|
+
8,
|
|
197
|
+
6,
|
|
198
|
+
4,
|
|
199
|
+
6,
|
|
200
|
+
7,
|
|
201
|
+
8,
|
|
202
|
+
5,
|
|
203
|
+
10,
|
|
204
|
+
4,
|
|
205
|
+
6,
|
|
206
|
+
10,
|
|
207
|
+
4,
|
|
208
|
+
3,
|
|
209
|
+
7,
|
|
210
|
+
6,
|
|
211
|
+
10,
|
|
212
|
+
9,
|
|
213
|
+
10,
|
|
214
|
+
4,
|
|
215
|
+
7,
|
|
216
|
+
3,
|
|
217
|
+
9,
|
|
218
|
+
4,
|
|
219
|
+
11,
|
|
220
|
+
3,
|
|
221
|
+
9,
|
|
222
|
+
9,
|
|
223
|
+
8,
|
|
224
|
+
4,
|
|
225
|
+
9,
|
|
226
|
+
5,
|
|
227
|
+
7,
|
|
228
|
+
11
|
|
229
|
+
]
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"event": "lecture completed",
|
|
234
|
+
"weight": 14,
|
|
235
|
+
"properties": {
|
|
236
|
+
"course_id": {
|
|
237
|
+
"functionName": "arrow",
|
|
238
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
239
|
+
},
|
|
240
|
+
"lecture_id": {
|
|
241
|
+
"functionName": "arrow",
|
|
242
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
243
|
+
},
|
|
244
|
+
"watch_time_mins": [
|
|
245
|
+
41,
|
|
246
|
+
27,
|
|
247
|
+
45,
|
|
248
|
+
23,
|
|
249
|
+
23,
|
|
250
|
+
28,
|
|
251
|
+
27,
|
|
252
|
+
17,
|
|
253
|
+
30,
|
|
254
|
+
25,
|
|
255
|
+
21,
|
|
256
|
+
20,
|
|
257
|
+
17,
|
|
258
|
+
37,
|
|
259
|
+
6,
|
|
260
|
+
9,
|
|
261
|
+
28,
|
|
262
|
+
26,
|
|
263
|
+
32,
|
|
264
|
+
25
|
|
265
|
+
],
|
|
266
|
+
"playback_speed": {
|
|
267
|
+
"functionName": "arrow",
|
|
268
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
269
|
+
},
|
|
270
|
+
"notes_taken": {
|
|
271
|
+
"functionName": "arrow",
|
|
272
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"event": "quiz started",
|
|
278
|
+
"weight": 10,
|
|
279
|
+
"properties": {
|
|
280
|
+
"course_id": {
|
|
281
|
+
"functionName": "arrow",
|
|
282
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
283
|
+
},
|
|
284
|
+
"quiz_id": {
|
|
285
|
+
"functionName": "arrow",
|
|
286
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
287
|
+
},
|
|
288
|
+
"quiz_type": [
|
|
289
|
+
"practice",
|
|
290
|
+
"graded",
|
|
291
|
+
"final_exam"
|
|
292
|
+
],
|
|
293
|
+
"question_count": [
|
|
294
|
+
17,
|
|
295
|
+
18,
|
|
296
|
+
14,
|
|
297
|
+
28,
|
|
298
|
+
21,
|
|
299
|
+
26,
|
|
300
|
+
30,
|
|
301
|
+
35,
|
|
302
|
+
26,
|
|
303
|
+
28,
|
|
304
|
+
16,
|
|
305
|
+
13,
|
|
306
|
+
9,
|
|
307
|
+
15,
|
|
308
|
+
23
|
|
309
|
+
]
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"event": "quiz completed",
|
|
314
|
+
"weight": 8,
|
|
315
|
+
"properties": {
|
|
316
|
+
"course_id": {
|
|
317
|
+
"functionName": "arrow",
|
|
318
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
319
|
+
},
|
|
320
|
+
"quiz_id": {
|
|
321
|
+
"functionName": "arrow",
|
|
322
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
323
|
+
},
|
|
324
|
+
"score_percent": [
|
|
325
|
+
54,
|
|
326
|
+
28,
|
|
327
|
+
62,
|
|
328
|
+
26,
|
|
329
|
+
18,
|
|
330
|
+
22,
|
|
331
|
+
36,
|
|
332
|
+
50,
|
|
333
|
+
27,
|
|
334
|
+
38,
|
|
335
|
+
30,
|
|
336
|
+
27,
|
|
337
|
+
25,
|
|
338
|
+
36,
|
|
339
|
+
42,
|
|
340
|
+
64,
|
|
341
|
+
66,
|
|
342
|
+
21,
|
|
343
|
+
49,
|
|
344
|
+
38,
|
|
345
|
+
37,
|
|
346
|
+
30,
|
|
347
|
+
47,
|
|
348
|
+
11,
|
|
349
|
+
20,
|
|
350
|
+
74,
|
|
351
|
+
32,
|
|
352
|
+
46,
|
|
353
|
+
29,
|
|
354
|
+
46,
|
|
355
|
+
64,
|
|
356
|
+
36,
|
|
357
|
+
24,
|
|
358
|
+
35,
|
|
359
|
+
36,
|
|
360
|
+
23,
|
|
361
|
+
65,
|
|
362
|
+
55,
|
|
363
|
+
67,
|
|
364
|
+
65,
|
|
365
|
+
19,
|
|
366
|
+
57,
|
|
367
|
+
64,
|
|
368
|
+
50,
|
|
369
|
+
63,
|
|
370
|
+
30,
|
|
371
|
+
33,
|
|
372
|
+
24,
|
|
373
|
+
44,
|
|
374
|
+
50
|
|
375
|
+
],
|
|
376
|
+
"time_spent_mins": [
|
|
377
|
+
62,
|
|
378
|
+
25,
|
|
379
|
+
23,
|
|
380
|
+
30,
|
|
381
|
+
104,
|
|
382
|
+
30,
|
|
383
|
+
35,
|
|
384
|
+
33,
|
|
385
|
+
33,
|
|
386
|
+
31,
|
|
387
|
+
26,
|
|
388
|
+
66,
|
|
389
|
+
37,
|
|
390
|
+
96,
|
|
391
|
+
76,
|
|
392
|
+
40,
|
|
393
|
+
40,
|
|
394
|
+
48,
|
|
395
|
+
47,
|
|
396
|
+
32,
|
|
397
|
+
83,
|
|
398
|
+
79,
|
|
399
|
+
87,
|
|
400
|
+
28,
|
|
401
|
+
29
|
|
402
|
+
],
|
|
403
|
+
"attempts": [
|
|
404
|
+
2,
|
|
405
|
+
4,
|
|
406
|
+
4
|
|
407
|
+
]
|
|
408
|
+
}
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"event": "assignment submitted",
|
|
412
|
+
"weight": 6,
|
|
413
|
+
"properties": {
|
|
414
|
+
"course_id": {
|
|
415
|
+
"functionName": "arrow",
|
|
416
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
417
|
+
},
|
|
418
|
+
"assignment_id": {
|
|
419
|
+
"functionName": "arrow",
|
|
420
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
421
|
+
},
|
|
422
|
+
"submission_type": [
|
|
423
|
+
"text",
|
|
424
|
+
"code",
|
|
425
|
+
"file",
|
|
426
|
+
"project"
|
|
427
|
+
],
|
|
428
|
+
"word_count": [
|
|
429
|
+
2245,
|
|
430
|
+
2980,
|
|
431
|
+
1372,
|
|
432
|
+
4022,
|
|
433
|
+
2550,
|
|
434
|
+
1367,
|
|
435
|
+
766,
|
|
436
|
+
362,
|
|
437
|
+
2601,
|
|
438
|
+
3478,
|
|
439
|
+
1169,
|
|
440
|
+
3628,
|
|
441
|
+
3219,
|
|
442
|
+
1494,
|
|
443
|
+
1857,
|
|
444
|
+
3023,
|
|
445
|
+
1755,
|
|
446
|
+
1263,
|
|
447
|
+
1798,
|
|
448
|
+
3619,
|
|
449
|
+
934,
|
|
450
|
+
1873,
|
|
451
|
+
2922,
|
|
452
|
+
731,
|
|
453
|
+
1290,
|
|
454
|
+
923,
|
|
455
|
+
1664,
|
|
456
|
+
973,
|
|
457
|
+
1786,
|
|
458
|
+
1488,
|
|
459
|
+
1192,
|
|
460
|
+
2908,
|
|
461
|
+
1115,
|
|
462
|
+
1455,
|
|
463
|
+
1310,
|
|
464
|
+
1000,
|
|
465
|
+
1670,
|
|
466
|
+
1556,
|
|
467
|
+
1306,
|
|
468
|
+
3596,
|
|
469
|
+
2274,
|
|
470
|
+
1403,
|
|
471
|
+
1919,
|
|
472
|
+
923,
|
|
473
|
+
1162,
|
|
474
|
+
1734,
|
|
475
|
+
887,
|
|
476
|
+
1669,
|
|
477
|
+
3680,
|
|
478
|
+
4095,
|
|
479
|
+
1336,
|
|
480
|
+
2550,
|
|
481
|
+
3512,
|
|
482
|
+
1462,
|
|
483
|
+
1023,
|
|
484
|
+
1249,
|
|
485
|
+
1842,
|
|
486
|
+
936,
|
|
487
|
+
1133,
|
|
488
|
+
1331,
|
|
489
|
+
955,
|
|
490
|
+
3548,
|
|
491
|
+
3578,
|
|
492
|
+
1260,
|
|
493
|
+
1139,
|
|
494
|
+
2422,
|
|
495
|
+
862,
|
|
496
|
+
1166,
|
|
497
|
+
1827,
|
|
498
|
+
3247,
|
|
499
|
+
1983,
|
|
500
|
+
1669,
|
|
501
|
+
3879,
|
|
502
|
+
1298,
|
|
503
|
+
3777,
|
|
504
|
+
1375,
|
|
505
|
+
3290,
|
|
506
|
+
1562,
|
|
507
|
+
2031,
|
|
508
|
+
1577,
|
|
509
|
+
1321,
|
|
510
|
+
3654,
|
|
511
|
+
1294,
|
|
512
|
+
1397,
|
|
513
|
+
3232,
|
|
514
|
+
1305,
|
|
515
|
+
3078,
|
|
516
|
+
3020,
|
|
517
|
+
1692,
|
|
518
|
+
1803,
|
|
519
|
+
2550,
|
|
520
|
+
1399,
|
|
521
|
+
1482,
|
|
522
|
+
1430,
|
|
523
|
+
1618,
|
|
524
|
+
1599,
|
|
525
|
+
1444,
|
|
526
|
+
4271,
|
|
527
|
+
1557,
|
|
528
|
+
2213,
|
|
529
|
+
939,
|
|
530
|
+
2176,
|
|
531
|
+
1909,
|
|
532
|
+
1533,
|
|
533
|
+
3913,
|
|
534
|
+
1467,
|
|
535
|
+
1508,
|
|
536
|
+
1922,
|
|
537
|
+
3104,
|
|
538
|
+
3523,
|
|
539
|
+
2550,
|
|
540
|
+
1392,
|
|
541
|
+
1652,
|
|
542
|
+
1396,
|
|
543
|
+
1940,
|
|
544
|
+
1284,
|
|
545
|
+
3557,
|
|
546
|
+
3432,
|
|
547
|
+
2041,
|
|
548
|
+
3509,
|
|
549
|
+
1560,
|
|
550
|
+
3463,
|
|
551
|
+
1991,
|
|
552
|
+
1568,
|
|
553
|
+
1716,
|
|
554
|
+
2255,
|
|
555
|
+
1128,
|
|
556
|
+
2102,
|
|
557
|
+
2550,
|
|
558
|
+
2251,
|
|
559
|
+
3840,
|
|
560
|
+
3151,
|
|
561
|
+
1556,
|
|
562
|
+
2618,
|
|
563
|
+
1409,
|
|
564
|
+
1695,
|
|
565
|
+
1957,
|
|
566
|
+
1576,
|
|
567
|
+
3497,
|
|
568
|
+
3302,
|
|
569
|
+
1078,
|
|
570
|
+
922,
|
|
571
|
+
1516,
|
|
572
|
+
4023,
|
|
573
|
+
3488,
|
|
574
|
+
1601,
|
|
575
|
+
1741,
|
|
576
|
+
3425,
|
|
577
|
+
1821,
|
|
578
|
+
1507,
|
|
579
|
+
3374,
|
|
580
|
+
1695,
|
|
581
|
+
3431,
|
|
582
|
+
1323,
|
|
583
|
+
1541,
|
|
584
|
+
2550,
|
|
585
|
+
1888,
|
|
586
|
+
1525,
|
|
587
|
+
3909,
|
|
588
|
+
3914,
|
|
589
|
+
1324,
|
|
590
|
+
1906,
|
|
591
|
+
1510,
|
|
592
|
+
1371,
|
|
593
|
+
1452,
|
|
594
|
+
778,
|
|
595
|
+
3618,
|
|
596
|
+
1429,
|
|
597
|
+
1415,
|
|
598
|
+
1524,
|
|
599
|
+
1619,
|
|
600
|
+
1035,
|
|
601
|
+
1811,
|
|
602
|
+
3733,
|
|
603
|
+
1720,
|
|
604
|
+
3288,
|
|
605
|
+
1407,
|
|
606
|
+
1157,
|
|
607
|
+
1190,
|
|
608
|
+
4036,
|
|
609
|
+
2355,
|
|
610
|
+
1391,
|
|
611
|
+
3204,
|
|
612
|
+
1581,
|
|
613
|
+
733,
|
|
614
|
+
3036,
|
|
615
|
+
3628,
|
|
616
|
+
3358,
|
|
617
|
+
1497,
|
|
618
|
+
1145,
|
|
619
|
+
1585,
|
|
620
|
+
1628,
|
|
621
|
+
1198,
|
|
622
|
+
2290,
|
|
623
|
+
1423,
|
|
624
|
+
1455,
|
|
625
|
+
1381,
|
|
626
|
+
2381,
|
|
627
|
+
1022,
|
|
628
|
+
1532,
|
|
629
|
+
2550,
|
|
630
|
+
647,
|
|
631
|
+
3251,
|
|
632
|
+
1978,
|
|
633
|
+
2214,
|
|
634
|
+
939,
|
|
635
|
+
1029,
|
|
636
|
+
3506,
|
|
637
|
+
3733,
|
|
638
|
+
1160,
|
|
639
|
+
572,
|
|
640
|
+
1533,
|
|
641
|
+
742,
|
|
642
|
+
1482,
|
|
643
|
+
2677,
|
|
644
|
+
1305,
|
|
645
|
+
1665,
|
|
646
|
+
3126,
|
|
647
|
+
1230,
|
|
648
|
+
4784,
|
|
649
|
+
3372,
|
|
650
|
+
1886,
|
|
651
|
+
3544,
|
|
652
|
+
1151,
|
|
653
|
+
3589,
|
|
654
|
+
1241,
|
|
655
|
+
3106,
|
|
656
|
+
1570,
|
|
657
|
+
3457,
|
|
658
|
+
1343,
|
|
659
|
+
1416,
|
|
660
|
+
1246,
|
|
661
|
+
2973,
|
|
662
|
+
1529,
|
|
663
|
+
1422,
|
|
664
|
+
1586,
|
|
665
|
+
3886,
|
|
666
|
+
1606,
|
|
667
|
+
3906,
|
|
668
|
+
1135,
|
|
669
|
+
974,
|
|
670
|
+
1375,
|
|
671
|
+
1828,
|
|
672
|
+
1396,
|
|
673
|
+
3398,
|
|
674
|
+
3241,
|
|
675
|
+
1937,
|
|
676
|
+
1144,
|
|
677
|
+
1263,
|
|
678
|
+
3919,
|
|
679
|
+
4024,
|
|
680
|
+
2980,
|
|
681
|
+
804,
|
|
682
|
+
1511,
|
|
683
|
+
1437,
|
|
684
|
+
3052,
|
|
685
|
+
1751,
|
|
686
|
+
1473,
|
|
687
|
+
2840,
|
|
688
|
+
1497,
|
|
689
|
+
3524,
|
|
690
|
+
2003,
|
|
691
|
+
1322,
|
|
692
|
+
1349,
|
|
693
|
+
2988,
|
|
694
|
+
1319,
|
|
695
|
+
2267,
|
|
696
|
+
974,
|
|
697
|
+
1513,
|
|
698
|
+
3758,
|
|
699
|
+
2160,
|
|
700
|
+
2192,
|
|
701
|
+
1720,
|
|
702
|
+
1746,
|
|
703
|
+
835,
|
|
704
|
+
771,
|
|
705
|
+
1398,
|
|
706
|
+
3011,
|
|
707
|
+
1803,
|
|
708
|
+
1914,
|
|
709
|
+
3120,
|
|
710
|
+
2954,
|
|
711
|
+
1426,
|
|
712
|
+
3706,
|
|
713
|
+
1341,
|
|
714
|
+
3907,
|
|
715
|
+
3469,
|
|
716
|
+
1411,
|
|
717
|
+
1678,
|
|
718
|
+
1873,
|
|
719
|
+
899,
|
|
720
|
+
3400,
|
|
721
|
+
2721,
|
|
722
|
+
3724,
|
|
723
|
+
1994,
|
|
724
|
+
3454,
|
|
725
|
+
1833,
|
|
726
|
+
1230,
|
|
727
|
+
2084,
|
|
728
|
+
1459,
|
|
729
|
+
1472,
|
|
730
|
+
2388,
|
|
731
|
+
3799,
|
|
732
|
+
4432,
|
|
733
|
+
1412,
|
|
734
|
+
3035,
|
|
735
|
+
3013,
|
|
736
|
+
1594,
|
|
737
|
+
2747,
|
|
738
|
+
1726,
|
|
739
|
+
3043,
|
|
740
|
+
2034,
|
|
741
|
+
3693,
|
|
742
|
+
1525,
|
|
743
|
+
1014,
|
|
744
|
+
1751,
|
|
745
|
+
1785,
|
|
746
|
+
3791,
|
|
747
|
+
1994,
|
|
748
|
+
3441,
|
|
749
|
+
3574,
|
|
750
|
+
2297,
|
|
751
|
+
4033,
|
|
752
|
+
3024,
|
|
753
|
+
1227,
|
|
754
|
+
2103,
|
|
755
|
+
2785,
|
|
756
|
+
1895,
|
|
757
|
+
2419,
|
|
758
|
+
1378,
|
|
759
|
+
1391,
|
|
760
|
+
3033,
|
|
761
|
+
2359,
|
|
762
|
+
1873,
|
|
763
|
+
1703,
|
|
764
|
+
1207,
|
|
765
|
+
1524,
|
|
766
|
+
831,
|
|
767
|
+
4160,
|
|
768
|
+
1900,
|
|
769
|
+
1518,
|
|
770
|
+
2925,
|
|
771
|
+
3050,
|
|
772
|
+
2648,
|
|
773
|
+
1082,
|
|
774
|
+
2981,
|
|
775
|
+
1269,
|
|
776
|
+
3671,
|
|
777
|
+
1221,
|
|
778
|
+
3833,
|
|
779
|
+
1313,
|
|
780
|
+
1650,
|
|
781
|
+
1842,
|
|
782
|
+
3461,
|
|
783
|
+
1181,
|
|
784
|
+
3527,
|
|
785
|
+
1443,
|
|
786
|
+
1959,
|
|
787
|
+
1299,
|
|
788
|
+
3361,
|
|
789
|
+
3491,
|
|
790
|
+
1947,
|
|
791
|
+
3698,
|
|
792
|
+
1771,
|
|
793
|
+
1321,
|
|
794
|
+
3661,
|
|
795
|
+
1941,
|
|
796
|
+
1405,
|
|
797
|
+
1666,
|
|
798
|
+
2695,
|
|
799
|
+
3283,
|
|
800
|
+
4007,
|
|
801
|
+
1953,
|
|
802
|
+
786,
|
|
803
|
+
3710,
|
|
804
|
+
1499,
|
|
805
|
+
1274,
|
|
806
|
+
2102,
|
|
807
|
+
1838,
|
|
808
|
+
2735,
|
|
809
|
+
681,
|
|
810
|
+
1385,
|
|
811
|
+
2245,
|
|
812
|
+
1810,
|
|
813
|
+
3806,
|
|
814
|
+
3280,
|
|
815
|
+
1527,
|
|
816
|
+
3740,
|
|
817
|
+
3195,
|
|
818
|
+
2898,
|
|
819
|
+
3780,
|
|
820
|
+
1677,
|
|
821
|
+
3883,
|
|
822
|
+
1128,
|
|
823
|
+
4241,
|
|
824
|
+
1531,
|
|
825
|
+
1306,
|
|
826
|
+
1990,
|
|
827
|
+
986,
|
|
828
|
+
1223,
|
|
829
|
+
2190,
|
|
830
|
+
1904,
|
|
831
|
+
1585,
|
|
832
|
+
1218,
|
|
833
|
+
2896,
|
|
834
|
+
2777,
|
|
835
|
+
2216,
|
|
836
|
+
1210,
|
|
837
|
+
2550,
|
|
838
|
+
3504,
|
|
839
|
+
1253,
|
|
840
|
+
3660,
|
|
841
|
+
3773,
|
|
842
|
+
3504,
|
|
843
|
+
1852,
|
|
844
|
+
905,
|
|
845
|
+
987,
|
|
846
|
+
3204,
|
|
847
|
+
3586,
|
|
848
|
+
1681,
|
|
849
|
+
3562,
|
|
850
|
+
2045,
|
|
851
|
+
3222,
|
|
852
|
+
3595,
|
|
853
|
+
2339,
|
|
854
|
+
977,
|
|
855
|
+
3784,
|
|
856
|
+
1880,
|
|
857
|
+
3024,
|
|
858
|
+
3608,
|
|
859
|
+
3828,
|
|
860
|
+
3823,
|
|
861
|
+
1597,
|
|
862
|
+
998,
|
|
863
|
+
2326,
|
|
864
|
+
2791,
|
|
865
|
+
1091,
|
|
866
|
+
4220,
|
|
867
|
+
2197,
|
|
868
|
+
1728,
|
|
869
|
+
2650,
|
|
870
|
+
1225,
|
|
871
|
+
3059,
|
|
872
|
+
2909,
|
|
873
|
+
1272,
|
|
874
|
+
1507,
|
|
875
|
+
3022,
|
|
876
|
+
1083,
|
|
877
|
+
1587,
|
|
878
|
+
1276,
|
|
879
|
+
1176,
|
|
880
|
+
3695,
|
|
881
|
+
2784,
|
|
882
|
+
3209,
|
|
883
|
+
2048,
|
|
884
|
+
3326,
|
|
885
|
+
1476,
|
|
886
|
+
3373,
|
|
887
|
+
2209,
|
|
888
|
+
1283,
|
|
889
|
+
3697,
|
|
890
|
+
3400,
|
|
891
|
+
1317,
|
|
892
|
+
1934,
|
|
893
|
+
1119,
|
|
894
|
+
3006,
|
|
895
|
+
1769,
|
|
896
|
+
1737,
|
|
897
|
+
1627,
|
|
898
|
+
1611,
|
|
899
|
+
2160,
|
|
900
|
+
3142,
|
|
901
|
+
1210,
|
|
902
|
+
3614,
|
|
903
|
+
4289,
|
|
904
|
+
2550,
|
|
905
|
+
1455,
|
|
906
|
+
962,
|
|
907
|
+
1155,
|
|
908
|
+
2550,
|
|
909
|
+
1533,
|
|
910
|
+
2206,
|
|
911
|
+
3481,
|
|
912
|
+
2266,
|
|
913
|
+
3230,
|
|
914
|
+
1644,
|
|
915
|
+
1754,
|
|
916
|
+
1700,
|
|
917
|
+
3859,
|
|
918
|
+
1310,
|
|
919
|
+
3393,
|
|
920
|
+
3325,
|
|
921
|
+
1773,
|
|
922
|
+
1381,
|
|
923
|
+
1463,
|
|
924
|
+
2097,
|
|
925
|
+
2054,
|
|
926
|
+
1722,
|
|
927
|
+
1257,
|
|
928
|
+
1675
|
|
929
|
+
],
|
|
930
|
+
"is_late": {
|
|
931
|
+
"functionName": "arrow",
|
|
932
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
},
|
|
936
|
+
{
|
|
937
|
+
"event": "assignment graded",
|
|
938
|
+
"weight": 5,
|
|
939
|
+
"properties": {
|
|
940
|
+
"course_id": {
|
|
941
|
+
"functionName": "arrow",
|
|
942
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
943
|
+
},
|
|
944
|
+
"assignment_id": {
|
|
945
|
+
"functionName": "arrow",
|
|
946
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
947
|
+
},
|
|
948
|
+
"grade": [
|
|
949
|
+
"A",
|
|
950
|
+
"B",
|
|
951
|
+
"C",
|
|
952
|
+
"D",
|
|
953
|
+
"F"
|
|
954
|
+
],
|
|
955
|
+
"feedback_length": [
|
|
956
|
+
153,
|
|
957
|
+
124,
|
|
958
|
+
357,
|
|
959
|
+
393,
|
|
960
|
+
128,
|
|
961
|
+
141,
|
|
962
|
+
347,
|
|
963
|
+
312,
|
|
964
|
+
127,
|
|
965
|
+
156,
|
|
966
|
+
121,
|
|
967
|
+
112,
|
|
968
|
+
280,
|
|
969
|
+
185,
|
|
970
|
+
105,
|
|
971
|
+
340,
|
|
972
|
+
162,
|
|
973
|
+
111,
|
|
974
|
+
354,
|
|
975
|
+
128,
|
|
976
|
+
391,
|
|
977
|
+
210,
|
|
978
|
+
258,
|
|
979
|
+
304,
|
|
980
|
+
134,
|
|
981
|
+
178,
|
|
982
|
+
130,
|
|
983
|
+
187,
|
|
984
|
+
389,
|
|
985
|
+
317,
|
|
986
|
+
50,
|
|
987
|
+
389,
|
|
988
|
+
184,
|
|
989
|
+
346,
|
|
990
|
+
126,
|
|
991
|
+
151,
|
|
992
|
+
346,
|
|
993
|
+
103,
|
|
994
|
+
103,
|
|
995
|
+
359,
|
|
996
|
+
163,
|
|
997
|
+
153,
|
|
998
|
+
313,
|
|
999
|
+
101,
|
|
1000
|
+
131,
|
|
1001
|
+
124,
|
|
1002
|
+
116,
|
|
1003
|
+
124,
|
|
1004
|
+
202,
|
|
1005
|
+
392,
|
|
1006
|
+
369,
|
|
1007
|
+
168,
|
|
1008
|
+
150,
|
|
1009
|
+
132,
|
|
1010
|
+
106,
|
|
1011
|
+
376,
|
|
1012
|
+
385,
|
|
1013
|
+
187,
|
|
1014
|
+
376,
|
|
1015
|
+
181,
|
|
1016
|
+
194,
|
|
1017
|
+
389,
|
|
1018
|
+
142,
|
|
1019
|
+
296,
|
|
1020
|
+
297,
|
|
1021
|
+
357,
|
|
1022
|
+
353,
|
|
1023
|
+
67,
|
|
1024
|
+
194,
|
|
1025
|
+
166,
|
|
1026
|
+
342,
|
|
1027
|
+
165,
|
|
1028
|
+
101,
|
|
1029
|
+
204,
|
|
1030
|
+
342,
|
|
1031
|
+
185,
|
|
1032
|
+
110,
|
|
1033
|
+
355,
|
|
1034
|
+
175,
|
|
1035
|
+
221,
|
|
1036
|
+
124,
|
|
1037
|
+
380,
|
|
1038
|
+
275,
|
|
1039
|
+
101,
|
|
1040
|
+
381,
|
|
1041
|
+
283,
|
|
1042
|
+
121,
|
|
1043
|
+
148,
|
|
1044
|
+
196,
|
|
1045
|
+
357,
|
|
1046
|
+
151,
|
|
1047
|
+
105,
|
|
1048
|
+
335,
|
|
1049
|
+
224,
|
|
1050
|
+
266,
|
|
1051
|
+
358,
|
|
1052
|
+
130,
|
|
1053
|
+
106,
|
|
1054
|
+
124,
|
|
1055
|
+
134
|
|
1056
|
+
],
|
|
1057
|
+
"grader": [
|
|
1058
|
+
"instructor",
|
|
1059
|
+
"peer",
|
|
1060
|
+
"auto"
|
|
1061
|
+
]
|
|
1062
|
+
}
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
"event": "discussion posted",
|
|
1066
|
+
"weight": 7,
|
|
1067
|
+
"properties": {
|
|
1068
|
+
"course_id": {
|
|
1069
|
+
"functionName": "arrow",
|
|
1070
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1071
|
+
},
|
|
1072
|
+
"post_type": [
|
|
1073
|
+
"question",
|
|
1074
|
+
"answer",
|
|
1075
|
+
"comment"
|
|
1076
|
+
],
|
|
1077
|
+
"word_count": [
|
|
1078
|
+
373,
|
|
1079
|
+
164,
|
|
1080
|
+
157,
|
|
1081
|
+
387,
|
|
1082
|
+
212,
|
|
1083
|
+
171,
|
|
1084
|
+
89,
|
|
1085
|
+
416,
|
|
1086
|
+
169,
|
|
1087
|
+
150,
|
|
1088
|
+
167,
|
|
1089
|
+
85,
|
|
1090
|
+
203,
|
|
1091
|
+
306,
|
|
1092
|
+
149,
|
|
1093
|
+
304,
|
|
1094
|
+
201,
|
|
1095
|
+
159,
|
|
1096
|
+
100,
|
|
1097
|
+
132,
|
|
1098
|
+
101,
|
|
1099
|
+
161,
|
|
1100
|
+
442,
|
|
1101
|
+
173,
|
|
1102
|
+
160,
|
|
1103
|
+
145,
|
|
1104
|
+
391,
|
|
1105
|
+
161,
|
|
1106
|
+
370,
|
|
1107
|
+
111,
|
|
1108
|
+
168,
|
|
1109
|
+
231,
|
|
1110
|
+
320,
|
|
1111
|
+
113,
|
|
1112
|
+
435,
|
|
1113
|
+
185,
|
|
1114
|
+
162,
|
|
1115
|
+
154,
|
|
1116
|
+
101,
|
|
1117
|
+
164,
|
|
1118
|
+
198,
|
|
1119
|
+
277,
|
|
1120
|
+
166,
|
|
1121
|
+
192,
|
|
1122
|
+
160,
|
|
1123
|
+
191,
|
|
1124
|
+
97,
|
|
1125
|
+
102,
|
|
1126
|
+
89,
|
|
1127
|
+
153,
|
|
1128
|
+
219,
|
|
1129
|
+
422,
|
|
1130
|
+
139,
|
|
1131
|
+
243,
|
|
1132
|
+
159,
|
|
1133
|
+
180,
|
|
1134
|
+
333,
|
|
1135
|
+
364,
|
|
1136
|
+
374,
|
|
1137
|
+
163,
|
|
1138
|
+
94,
|
|
1139
|
+
156,
|
|
1140
|
+
319,
|
|
1141
|
+
80,
|
|
1142
|
+
193,
|
|
1143
|
+
380,
|
|
1144
|
+
203,
|
|
1145
|
+
130,
|
|
1146
|
+
171,
|
|
1147
|
+
401,
|
|
1148
|
+
397,
|
|
1149
|
+
401,
|
|
1150
|
+
204,
|
|
1151
|
+
184,
|
|
1152
|
+
212,
|
|
1153
|
+
155,
|
|
1154
|
+
147,
|
|
1155
|
+
170,
|
|
1156
|
+
377,
|
|
1157
|
+
366
|
|
1158
|
+
]
|
|
1159
|
+
}
|
|
1160
|
+
},
|
|
1161
|
+
{
|
|
1162
|
+
"event": "certificate earned",
|
|
1163
|
+
"weight": 2,
|
|
1164
|
+
"properties": {
|
|
1165
|
+
"course_id": {
|
|
1166
|
+
"functionName": "arrow",
|
|
1167
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1168
|
+
},
|
|
1169
|
+
"completion_time_days": [
|
|
1170
|
+
58,
|
|
1171
|
+
58,
|
|
1172
|
+
62,
|
|
1173
|
+
125,
|
|
1174
|
+
48,
|
|
1175
|
+
85,
|
|
1176
|
+
45,
|
|
1177
|
+
123,
|
|
1178
|
+
67,
|
|
1179
|
+
132,
|
|
1180
|
+
58,
|
|
1181
|
+
49,
|
|
1182
|
+
65,
|
|
1183
|
+
72,
|
|
1184
|
+
113,
|
|
1185
|
+
48,
|
|
1186
|
+
130,
|
|
1187
|
+
58,
|
|
1188
|
+
71,
|
|
1189
|
+
66,
|
|
1190
|
+
51,
|
|
1191
|
+
56,
|
|
1192
|
+
65,
|
|
1193
|
+
78,
|
|
1194
|
+
37,
|
|
1195
|
+
124,
|
|
1196
|
+
57,
|
|
1197
|
+
141,
|
|
1198
|
+
141,
|
|
1199
|
+
51,
|
|
1200
|
+
66,
|
|
1201
|
+
45,
|
|
1202
|
+
124,
|
|
1203
|
+
76,
|
|
1204
|
+
54,
|
|
1205
|
+
29,
|
|
1206
|
+
63,
|
|
1207
|
+
119,
|
|
1208
|
+
76,
|
|
1209
|
+
36,
|
|
1210
|
+
54,
|
|
1211
|
+
135,
|
|
1212
|
+
40,
|
|
1213
|
+
150,
|
|
1214
|
+
68
|
|
1215
|
+
],
|
|
1216
|
+
"final_grade": [
|
|
1217
|
+
76,
|
|
1218
|
+
79,
|
|
1219
|
+
71,
|
|
1220
|
+
79,
|
|
1221
|
+
65,
|
|
1222
|
+
70,
|
|
1223
|
+
83,
|
|
1224
|
+
87,
|
|
1225
|
+
91,
|
|
1226
|
+
75,
|
|
1227
|
+
75,
|
|
1228
|
+
90,
|
|
1229
|
+
74,
|
|
1230
|
+
81,
|
|
1231
|
+
66,
|
|
1232
|
+
88,
|
|
1233
|
+
70,
|
|
1234
|
+
83,
|
|
1235
|
+
72,
|
|
1236
|
+
74,
|
|
1237
|
+
77,
|
|
1238
|
+
79,
|
|
1239
|
+
73,
|
|
1240
|
+
68,
|
|
1241
|
+
68,
|
|
1242
|
+
74,
|
|
1243
|
+
74,
|
|
1244
|
+
85,
|
|
1245
|
+
71,
|
|
1246
|
+
86
|
|
1247
|
+
]
|
|
1248
|
+
}
|
|
1249
|
+
},
|
|
1250
|
+
{
|
|
1251
|
+
"event": "study group joined",
|
|
1252
|
+
"weight": 4,
|
|
1253
|
+
"properties": {
|
|
1254
|
+
"group_id": {
|
|
1255
|
+
"functionName": "arrow",
|
|
1256
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1257
|
+
},
|
|
1258
|
+
"group_size": [
|
|
1259
|
+
8,
|
|
1260
|
+
8,
|
|
1261
|
+
12,
|
|
1262
|
+
16,
|
|
1263
|
+
6,
|
|
1264
|
+
6,
|
|
1265
|
+
7,
|
|
1266
|
+
8
|
|
1267
|
+
],
|
|
1268
|
+
"group_type": [
|
|
1269
|
+
"study_circle",
|
|
1270
|
+
"project_team",
|
|
1271
|
+
"tutoring"
|
|
1272
|
+
]
|
|
1273
|
+
}
|
|
1274
|
+
},
|
|
1275
|
+
{
|
|
1276
|
+
"event": "resource downloaded",
|
|
1277
|
+
"weight": 9,
|
|
1278
|
+
"properties": {
|
|
1279
|
+
"resource_type": [
|
|
1280
|
+
"pdf",
|
|
1281
|
+
"slides",
|
|
1282
|
+
"code_sample",
|
|
1283
|
+
"dataset",
|
|
1284
|
+
"cheat_sheet"
|
|
1285
|
+
],
|
|
1286
|
+
"course_id": {
|
|
1287
|
+
"functionName": "arrow",
|
|
1288
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
},
|
|
1292
|
+
{
|
|
1293
|
+
"event": "instructor feedback given",
|
|
1294
|
+
"weight": 3,
|
|
1295
|
+
"properties": {
|
|
1296
|
+
"course_id": {
|
|
1297
|
+
"functionName": "arrow",
|
|
1298
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1299
|
+
},
|
|
1300
|
+
"feedback_type": [
|
|
1301
|
+
"written",
|
|
1302
|
+
"video",
|
|
1303
|
+
"rubric"
|
|
1304
|
+
],
|
|
1305
|
+
"response_time_hours": [
|
|
1306
|
+
18,
|
|
1307
|
+
20,
|
|
1308
|
+
24,
|
|
1309
|
+
25,
|
|
1310
|
+
20,
|
|
1311
|
+
22,
|
|
1312
|
+
57,
|
|
1313
|
+
16,
|
|
1314
|
+
27,
|
|
1315
|
+
20,
|
|
1316
|
+
56,
|
|
1317
|
+
30,
|
|
1318
|
+
20,
|
|
1319
|
+
46,
|
|
1320
|
+
45
|
|
1321
|
+
]
|
|
1322
|
+
}
|
|
1323
|
+
},
|
|
1324
|
+
{
|
|
1325
|
+
"event": "course reviewed",
|
|
1326
|
+
"weight": 3,
|
|
1327
|
+
"properties": {
|
|
1328
|
+
"course_id": {
|
|
1329
|
+
"functionName": "arrow",
|
|
1330
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1331
|
+
},
|
|
1332
|
+
"rating": [
|
|
1333
|
+
3,
|
|
1334
|
+
3,
|
|
1335
|
+
1
|
|
1336
|
+
],
|
|
1337
|
+
"review_length": [
|
|
1338
|
+
714,
|
|
1339
|
+
245,
|
|
1340
|
+
609,
|
|
1341
|
+
844,
|
|
1342
|
+
283,
|
|
1343
|
+
194,
|
|
1344
|
+
208,
|
|
1345
|
+
712,
|
|
1346
|
+
305,
|
|
1347
|
+
410,
|
|
1348
|
+
196,
|
|
1349
|
+
314,
|
|
1350
|
+
589,
|
|
1351
|
+
611,
|
|
1352
|
+
300,
|
|
1353
|
+
279,
|
|
1354
|
+
620,
|
|
1355
|
+
307,
|
|
1356
|
+
777,
|
|
1357
|
+
199,
|
|
1358
|
+
654,
|
|
1359
|
+
234,
|
|
1360
|
+
332,
|
|
1361
|
+
263,
|
|
1362
|
+
315,
|
|
1363
|
+
735,
|
|
1364
|
+
271,
|
|
1365
|
+
315,
|
|
1366
|
+
822,
|
|
1367
|
+
284,
|
|
1368
|
+
225,
|
|
1369
|
+
237,
|
|
1370
|
+
519,
|
|
1371
|
+
290,
|
|
1372
|
+
505,
|
|
1373
|
+
259,
|
|
1374
|
+
238,
|
|
1375
|
+
396,
|
|
1376
|
+
332,
|
|
1377
|
+
263,
|
|
1378
|
+
425,
|
|
1379
|
+
237,
|
|
1380
|
+
238,
|
|
1381
|
+
781,
|
|
1382
|
+
640,
|
|
1383
|
+
387,
|
|
1384
|
+
431,
|
|
1385
|
+
782,
|
|
1386
|
+
274,
|
|
1387
|
+
172,
|
|
1388
|
+
833,
|
|
1389
|
+
202,
|
|
1390
|
+
277,
|
|
1391
|
+
522,
|
|
1392
|
+
744,
|
|
1393
|
+
374,
|
|
1394
|
+
330,
|
|
1395
|
+
282,
|
|
1396
|
+
237,
|
|
1397
|
+
188,
|
|
1398
|
+
799,
|
|
1399
|
+
296,
|
|
1400
|
+
308,
|
|
1401
|
+
250,
|
|
1402
|
+
303,
|
|
1403
|
+
345,
|
|
1404
|
+
191,
|
|
1405
|
+
216,
|
|
1406
|
+
387,
|
|
1407
|
+
294,
|
|
1408
|
+
341,
|
|
1409
|
+
410,
|
|
1410
|
+
263,
|
|
1411
|
+
437,
|
|
1412
|
+
776,
|
|
1413
|
+
204,
|
|
1414
|
+
288,
|
|
1415
|
+
343,
|
|
1416
|
+
313,
|
|
1417
|
+
377,
|
|
1418
|
+
680,
|
|
1419
|
+
295,
|
|
1420
|
+
394,
|
|
1421
|
+
362,
|
|
1422
|
+
254,
|
|
1423
|
+
374,
|
|
1424
|
+
214,
|
|
1425
|
+
220,
|
|
1426
|
+
619,
|
|
1427
|
+
705,
|
|
1428
|
+
216,
|
|
1429
|
+
260,
|
|
1430
|
+
293,
|
|
1431
|
+
297,
|
|
1432
|
+
662,
|
|
1433
|
+
382,
|
|
1434
|
+
720,
|
|
1435
|
+
613,
|
|
1436
|
+
776,
|
|
1437
|
+
308
|
|
1438
|
+
],
|
|
1439
|
+
"would_recommend": {
|
|
1440
|
+
"functionName": "arrow",
|
|
1441
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1442
|
+
}
|
|
1443
|
+
}
|
|
1444
|
+
},
|
|
1445
|
+
{
|
|
1446
|
+
"event": "subscription purchased",
|
|
1447
|
+
"weight": 2,
|
|
1448
|
+
"properties": {
|
|
1449
|
+
"plan": [
|
|
1450
|
+
"monthly",
|
|
1451
|
+
"annual",
|
|
1452
|
+
"lifetime"
|
|
1453
|
+
],
|
|
1454
|
+
"price": {
|
|
1455
|
+
"functionName": "arrow",
|
|
1456
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
},
|
|
1460
|
+
{
|
|
1461
|
+
"event": "help requested",
|
|
1462
|
+
"weight": 4,
|
|
1463
|
+
"properties": {
|
|
1464
|
+
"topic": [
|
|
1465
|
+
"technical",
|
|
1466
|
+
"content",
|
|
1467
|
+
"billing",
|
|
1468
|
+
"accessibility"
|
|
1469
|
+
],
|
|
1470
|
+
"channel": [
|
|
1471
|
+
"chat",
|
|
1472
|
+
"email",
|
|
1473
|
+
"forum"
|
|
1474
|
+
]
|
|
1475
|
+
}
|
|
1476
|
+
},
|
|
1477
|
+
{
|
|
1478
|
+
"event": "practice problem solved",
|
|
1479
|
+
"weight": 12,
|
|
1480
|
+
"properties": {
|
|
1481
|
+
"course_id": {
|
|
1482
|
+
"functionName": "arrow",
|
|
1483
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1484
|
+
},
|
|
1485
|
+
"problem_id": {
|
|
1486
|
+
"functionName": "arrow",
|
|
1487
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1488
|
+
},
|
|
1489
|
+
"difficulty": [
|
|
1490
|
+
"easy",
|
|
1491
|
+
"medium",
|
|
1492
|
+
"hard"
|
|
1493
|
+
],
|
|
1494
|
+
"time_to_solve_sec": [
|
|
1495
|
+
1537,
|
|
1496
|
+
868,
|
|
1497
|
+
2565,
|
|
1498
|
+
1078,
|
|
1499
|
+
869,
|
|
1500
|
+
983,
|
|
1501
|
+
1009,
|
|
1502
|
+
2081,
|
|
1503
|
+
1238,
|
|
1504
|
+
476,
|
|
1505
|
+
1363,
|
|
1506
|
+
797,
|
|
1507
|
+
820,
|
|
1508
|
+
867,
|
|
1509
|
+
2405,
|
|
1510
|
+
736,
|
|
1511
|
+
2340,
|
|
1512
|
+
964,
|
|
1513
|
+
724,
|
|
1514
|
+
829,
|
|
1515
|
+
1359,
|
|
1516
|
+
2369,
|
|
1517
|
+
1029,
|
|
1518
|
+
886,
|
|
1519
|
+
2485,
|
|
1520
|
+
2032,
|
|
1521
|
+
2103,
|
|
1522
|
+
2046,
|
|
1523
|
+
968,
|
|
1524
|
+
2019,
|
|
1525
|
+
1570,
|
|
1526
|
+
1120,
|
|
1527
|
+
2603,
|
|
1528
|
+
2371,
|
|
1529
|
+
1313,
|
|
1530
|
+
955,
|
|
1531
|
+
1077,
|
|
1532
|
+
1158,
|
|
1533
|
+
2218,
|
|
1534
|
+
3080,
|
|
1535
|
+
963,
|
|
1536
|
+
838,
|
|
1537
|
+
980,
|
|
1538
|
+
1028,
|
|
1539
|
+
1491,
|
|
1540
|
+
1044,
|
|
1541
|
+
966,
|
|
1542
|
+
2786,
|
|
1543
|
+
669,
|
|
1544
|
+
3035,
|
|
1545
|
+
753,
|
|
1546
|
+
986,
|
|
1547
|
+
702,
|
|
1548
|
+
656,
|
|
1549
|
+
2808,
|
|
1550
|
+
2813,
|
|
1551
|
+
2226,
|
|
1552
|
+
995,
|
|
1553
|
+
825,
|
|
1554
|
+
824,
|
|
1555
|
+
879,
|
|
1556
|
+
2460,
|
|
1557
|
+
2818,
|
|
1558
|
+
2967,
|
|
1559
|
+
2609,
|
|
1560
|
+
1545,
|
|
1561
|
+
802,
|
|
1562
|
+
2769,
|
|
1563
|
+
1067,
|
|
1564
|
+
1148,
|
|
1565
|
+
1232,
|
|
1566
|
+
937,
|
|
1567
|
+
2803,
|
|
1568
|
+
3048,
|
|
1569
|
+
929,
|
|
1570
|
+
960,
|
|
1571
|
+
1099,
|
|
1572
|
+
2535,
|
|
1573
|
+
1590,
|
|
1574
|
+
2099,
|
|
1575
|
+
1435,
|
|
1576
|
+
736,
|
|
1577
|
+
2249,
|
|
1578
|
+
709,
|
|
1579
|
+
1128,
|
|
1580
|
+
2123,
|
|
1581
|
+
855,
|
|
1582
|
+
2092,
|
|
1583
|
+
921,
|
|
1584
|
+
2311,
|
|
1585
|
+
907,
|
|
1586
|
+
699,
|
|
1587
|
+
669,
|
|
1588
|
+
2691,
|
|
1589
|
+
1126,
|
|
1590
|
+
2346,
|
|
1591
|
+
1232,
|
|
1592
|
+
1343,
|
|
1593
|
+
719,
|
|
1594
|
+
3006,
|
|
1595
|
+
978,
|
|
1596
|
+
936,
|
|
1597
|
+
2614,
|
|
1598
|
+
1166,
|
|
1599
|
+
2714,
|
|
1600
|
+
2476,
|
|
1601
|
+
2744,
|
|
1602
|
+
814,
|
|
1603
|
+
1046,
|
|
1604
|
+
3199,
|
|
1605
|
+
974,
|
|
1606
|
+
2997,
|
|
1607
|
+
3197,
|
|
1608
|
+
1945,
|
|
1609
|
+
1018,
|
|
1610
|
+
694,
|
|
1611
|
+
2573,
|
|
1612
|
+
1234,
|
|
1613
|
+
2797,
|
|
1614
|
+
1097,
|
|
1615
|
+
2619,
|
|
1616
|
+
1180,
|
|
1617
|
+
935,
|
|
1618
|
+
1258,
|
|
1619
|
+
3019,
|
|
1620
|
+
900,
|
|
1621
|
+
1204,
|
|
1622
|
+
1015,
|
|
1623
|
+
843,
|
|
1624
|
+
1140,
|
|
1625
|
+
2197,
|
|
1626
|
+
2715,
|
|
1627
|
+
366,
|
|
1628
|
+
2580,
|
|
1629
|
+
798,
|
|
1630
|
+
2809,
|
|
1631
|
+
767,
|
|
1632
|
+
2562,
|
|
1633
|
+
2656,
|
|
1634
|
+
2183,
|
|
1635
|
+
929,
|
|
1636
|
+
1064,
|
|
1637
|
+
1101,
|
|
1638
|
+
2675,
|
|
1639
|
+
1193,
|
|
1640
|
+
1239,
|
|
1641
|
+
2465,
|
|
1642
|
+
1376,
|
|
1643
|
+
2737,
|
|
1644
|
+
1100,
|
|
1645
|
+
2234,
|
|
1646
|
+
2252,
|
|
1647
|
+
2213,
|
|
1648
|
+
1157,
|
|
1649
|
+
1603,
|
|
1650
|
+
888,
|
|
1651
|
+
1375,
|
|
1652
|
+
1130,
|
|
1653
|
+
1106,
|
|
1654
|
+
610,
|
|
1655
|
+
924,
|
|
1656
|
+
2915,
|
|
1657
|
+
1484,
|
|
1658
|
+
2376,
|
|
1659
|
+
2137,
|
|
1660
|
+
954,
|
|
1661
|
+
1329,
|
|
1662
|
+
809,
|
|
1663
|
+
2193,
|
|
1664
|
+
1518,
|
|
1665
|
+
1060,
|
|
1666
|
+
1126,
|
|
1667
|
+
1286,
|
|
1668
|
+
589,
|
|
1669
|
+
2371,
|
|
1670
|
+
1418,
|
|
1671
|
+
2367,
|
|
1672
|
+
2745,
|
|
1673
|
+
1089,
|
|
1674
|
+
2337,
|
|
1675
|
+
1084,
|
|
1676
|
+
788,
|
|
1677
|
+
756,
|
|
1678
|
+
2888,
|
|
1679
|
+
941,
|
|
1680
|
+
2613,
|
|
1681
|
+
1079,
|
|
1682
|
+
723,
|
|
1683
|
+
885,
|
|
1684
|
+
2529,
|
|
1685
|
+
941,
|
|
1686
|
+
1125,
|
|
1687
|
+
939,
|
|
1688
|
+
1805,
|
|
1689
|
+
998,
|
|
1690
|
+
1805,
|
|
1691
|
+
1294,
|
|
1692
|
+
943,
|
|
1693
|
+
2788,
|
|
1694
|
+
2740,
|
|
1695
|
+
968,
|
|
1696
|
+
1034,
|
|
1697
|
+
922,
|
|
1698
|
+
777,
|
|
1699
|
+
1722,
|
|
1700
|
+
2665,
|
|
1701
|
+
2691,
|
|
1702
|
+
1395,
|
|
1703
|
+
809,
|
|
1704
|
+
1154,
|
|
1705
|
+
931,
|
|
1706
|
+
1805,
|
|
1707
|
+
2494,
|
|
1708
|
+
2082,
|
|
1709
|
+
790,
|
|
1710
|
+
936,
|
|
1711
|
+
970,
|
|
1712
|
+
2392,
|
|
1713
|
+
1326,
|
|
1714
|
+
1964,
|
|
1715
|
+
1528,
|
|
1716
|
+
973,
|
|
1717
|
+
936,
|
|
1718
|
+
1345,
|
|
1719
|
+
965,
|
|
1720
|
+
2128,
|
|
1721
|
+
952,
|
|
1722
|
+
1346,
|
|
1723
|
+
1188,
|
|
1724
|
+
2867,
|
|
1725
|
+
2880,
|
|
1726
|
+
1201,
|
|
1727
|
+
1073,
|
|
1728
|
+
2678,
|
|
1729
|
+
2307,
|
|
1730
|
+
1236,
|
|
1731
|
+
920,
|
|
1732
|
+
2747,
|
|
1733
|
+
2691,
|
|
1734
|
+
2857,
|
|
1735
|
+
2344,
|
|
1736
|
+
1082,
|
|
1737
|
+
994,
|
|
1738
|
+
2337,
|
|
1739
|
+
936,
|
|
1740
|
+
2712,
|
|
1741
|
+
1014,
|
|
1742
|
+
1805,
|
|
1743
|
+
774,
|
|
1744
|
+
781,
|
|
1745
|
+
583,
|
|
1746
|
+
1212,
|
|
1747
|
+
1104,
|
|
1748
|
+
908,
|
|
1749
|
+
1165,
|
|
1750
|
+
1291,
|
|
1751
|
+
735,
|
|
1752
|
+
2860,
|
|
1753
|
+
2172,
|
|
1754
|
+
1088,
|
|
1755
|
+
1476,
|
|
1756
|
+
908,
|
|
1757
|
+
1155,
|
|
1758
|
+
1805,
|
|
1759
|
+
1805,
|
|
1760
|
+
1805,
|
|
1761
|
+
1303,
|
|
1762
|
+
1973,
|
|
1763
|
+
846,
|
|
1764
|
+
960,
|
|
1765
|
+
2647,
|
|
1766
|
+
2791,
|
|
1767
|
+
2940,
|
|
1768
|
+
1153,
|
|
1769
|
+
950,
|
|
1770
|
+
2783,
|
|
1771
|
+
2652,
|
|
1772
|
+
2321,
|
|
1773
|
+
1143,
|
|
1774
|
+
667,
|
|
1775
|
+
2593,
|
|
1776
|
+
747,
|
|
1777
|
+
1071,
|
|
1778
|
+
1338,
|
|
1779
|
+
765,
|
|
1780
|
+
1072,
|
|
1781
|
+
1064,
|
|
1782
|
+
1117,
|
|
1783
|
+
2351,
|
|
1784
|
+
1362,
|
|
1785
|
+
1178,
|
|
1786
|
+
2494,
|
|
1787
|
+
729,
|
|
1788
|
+
1003,
|
|
1789
|
+
3112,
|
|
1790
|
+
977,
|
|
1791
|
+
1398,
|
|
1792
|
+
251,
|
|
1793
|
+
1976,
|
|
1794
|
+
2794
|
|
1795
|
+
],
|
|
1796
|
+
"hint_used": {
|
|
1797
|
+
"functionName": "arrow",
|
|
1798
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
],
|
|
1803
|
+
"superProps": {
|
|
1804
|
+
"platform": [
|
|
1805
|
+
"Web",
|
|
1806
|
+
"iOS",
|
|
1807
|
+
"Android",
|
|
1808
|
+
"iPad"
|
|
1809
|
+
]
|
|
1810
|
+
},
|
|
1811
|
+
"scdProps": {},
|
|
1812
|
+
"userProps": {
|
|
1813
|
+
"account_type": {
|
|
1814
|
+
"functionName": "arrow",
|
|
1815
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1816
|
+
},
|
|
1817
|
+
"subscription_status": {
|
|
1818
|
+
"functionName": "arrow",
|
|
1819
|
+
"body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
|
|
1820
|
+
},
|
|
1821
|
+
"learning_style": [
|
|
1822
|
+
"visual",
|
|
1823
|
+
"reading",
|
|
1824
|
+
"hands_on",
|
|
1825
|
+
"auditory"
|
|
1826
|
+
],
|
|
1827
|
+
"education_level": [
|
|
1828
|
+
"high_school",
|
|
1829
|
+
"bachelors",
|
|
1830
|
+
"masters",
|
|
1831
|
+
"phd",
|
|
1832
|
+
"self_taught"
|
|
1833
|
+
],
|
|
1834
|
+
"timezone": [
|
|
1835
|
+
"US_Eastern",
|
|
1836
|
+
"US_Pacific",
|
|
1837
|
+
"US_Central",
|
|
1838
|
+
"Europe",
|
|
1839
|
+
"Asia"
|
|
1840
|
+
]
|
|
1841
|
+
},
|
|
1842
|
+
"groupKeys": [
|
|
1843
|
+
[
|
|
1844
|
+
"course_id",
|
|
1845
|
+
150,
|
|
1846
|
+
[
|
|
1847
|
+
"course enrolled",
|
|
1848
|
+
"lecture started",
|
|
1849
|
+
"lecture completed",
|
|
1850
|
+
"quiz completed",
|
|
1851
|
+
"certificate earned"
|
|
1852
|
+
]
|
|
1853
|
+
],
|
|
1854
|
+
[
|
|
1855
|
+
"group_id",
|
|
1856
|
+
300,
|
|
1857
|
+
[
|
|
1858
|
+
"study group joined",
|
|
1859
|
+
"discussion posted"
|
|
1860
|
+
]
|
|
1861
|
+
]
|
|
1862
|
+
],
|
|
1863
|
+
"groupProps": {
|
|
1864
|
+
"course_id": {
|
|
1865
|
+
"title": {
|
|
1866
|
+
"functionName": "arrow",
|
|
1867
|
+
"body": "() => `${chance.pickone([\"Introduction to\", \"Advanced\", \"Mastering\", \"Fundamentals of\", \"Applied\"])} ${chance.pickone([\"Algorithms\", \"Data Science\", \"Machine Learning\", \"Statistics\", \"Web Development\", \"Calculus\", \"Biology\", \"Economics\", \"Design Thinking\", \"Creative Writing\"])}`"
|
|
1868
|
+
},
|
|
1869
|
+
"instructor_count": [
|
|
1870
|
+
3,
|
|
1871
|
+
2
|
|
1872
|
+
],
|
|
1873
|
+
"total_enrolled": [
|
|
1874
|
+
3875,
|
|
1875
|
+
1384,
|
|
1876
|
+
1220,
|
|
1877
|
+
1522,
|
|
1878
|
+
4064,
|
|
1879
|
+
1393,
|
|
1880
|
+
1169,
|
|
1881
|
+
4156,
|
|
1882
|
+
3413,
|
|
1883
|
+
1380,
|
|
1884
|
+
1349,
|
|
1885
|
+
3575,
|
|
1886
|
+
3271,
|
|
1887
|
+
2379,
|
|
1888
|
+
1467,
|
|
1889
|
+
1526,
|
|
1890
|
+
3313,
|
|
1891
|
+
3229,
|
|
1892
|
+
1383,
|
|
1893
|
+
1183,
|
|
1894
|
+
1266,
|
|
1895
|
+
2188,
|
|
1896
|
+
3830,
|
|
1897
|
+
3552,
|
|
1898
|
+
2184,
|
|
1899
|
+
1536,
|
|
1900
|
+
1125,
|
|
1901
|
+
3969,
|
|
1902
|
+
1778,
|
|
1903
|
+
1509,
|
|
1904
|
+
1545,
|
|
1905
|
+
1844,
|
|
1906
|
+
3686,
|
|
1907
|
+
1199,
|
|
1908
|
+
3700,
|
|
1909
|
+
2525,
|
|
1910
|
+
2990,
|
|
1911
|
+
3141,
|
|
1912
|
+
2525,
|
|
1913
|
+
1365,
|
|
1914
|
+
3564,
|
|
1915
|
+
1368,
|
|
1916
|
+
1208,
|
|
1917
|
+
1693,
|
|
1918
|
+
1457,
|
|
1919
|
+
1014,
|
|
1920
|
+
3299,
|
|
1921
|
+
1744,
|
|
1922
|
+
1867,
|
|
1923
|
+
3055,
|
|
1924
|
+
822,
|
|
1925
|
+
1061,
|
|
1926
|
+
986,
|
|
1927
|
+
1286,
|
|
1928
|
+
3415,
|
|
1929
|
+
1955,
|
|
1930
|
+
2751,
|
|
1931
|
+
1480,
|
|
1932
|
+
1534,
|
|
1933
|
+
1181,
|
|
1934
|
+
1682,
|
|
1935
|
+
1214,
|
|
1936
|
+
3623,
|
|
1937
|
+
3341,
|
|
1938
|
+
1788,
|
|
1939
|
+
1466,
|
|
1940
|
+
1805,
|
|
1941
|
+
2100,
|
|
1942
|
+
2057,
|
|
1943
|
+
1799,
|
|
1944
|
+
1319,
|
|
1945
|
+
3850,
|
|
1946
|
+
3913,
|
|
1947
|
+
1280,
|
|
1948
|
+
3563,
|
|
1949
|
+
1278,
|
|
1950
|
+
2138,
|
|
1951
|
+
1753,
|
|
1952
|
+
1011,
|
|
1953
|
+
1040,
|
|
1954
|
+
1485,
|
|
1955
|
+
1561,
|
|
1956
|
+
1498,
|
|
1957
|
+
2179,
|
|
1958
|
+
1673,
|
|
1959
|
+
2619,
|
|
1960
|
+
3471,
|
|
1961
|
+
1276,
|
|
1962
|
+
2214,
|
|
1963
|
+
1382,
|
|
1964
|
+
1076,
|
|
1965
|
+
3383,
|
|
1966
|
+
2931,
|
|
1967
|
+
2525,
|
|
1968
|
+
1947,
|
|
1969
|
+
1511,
|
|
1970
|
+
1147,
|
|
1971
|
+
1147,
|
|
1972
|
+
3861,
|
|
1973
|
+
1512,
|
|
1974
|
+
922,
|
|
1975
|
+
2235,
|
|
1976
|
+
884,
|
|
1977
|
+
3175,
|
|
1978
|
+
3747,
|
|
1979
|
+
2207,
|
|
1980
|
+
1156,
|
|
1981
|
+
2183,
|
|
1982
|
+
3687,
|
|
1983
|
+
3117,
|
|
1984
|
+
3718,
|
|
1985
|
+
3990,
|
|
1986
|
+
3035,
|
|
1987
|
+
1062,
|
|
1988
|
+
2629,
|
|
1989
|
+
2290,
|
|
1990
|
+
1742,
|
|
1991
|
+
1359,
|
|
1992
|
+
3018,
|
|
1993
|
+
770,
|
|
1994
|
+
1249,
|
|
1995
|
+
2355,
|
|
1996
|
+
3380,
|
|
1997
|
+
1729,
|
|
1998
|
+
3665,
|
|
1999
|
+
2010,
|
|
2000
|
+
2378,
|
|
2001
|
+
1627,
|
|
2002
|
+
1306,
|
|
2003
|
+
1929,
|
|
2004
|
+
1390,
|
|
2005
|
+
1467,
|
|
2006
|
+
1751,
|
|
2007
|
+
2041,
|
|
2008
|
+
3674,
|
|
2009
|
+
2322,
|
|
2010
|
+
3315,
|
|
2011
|
+
2911,
|
|
2012
|
+
1157,
|
|
2013
|
+
3851,
|
|
2014
|
+
1603,
|
|
2015
|
+
3427,
|
|
2016
|
+
1767,
|
|
2017
|
+
3083,
|
|
2018
|
+
1267,
|
|
2019
|
+
1222,
|
|
2020
|
+
1930,
|
|
2021
|
+
1090,
|
|
2022
|
+
1571,
|
|
2023
|
+
3472,
|
|
2024
|
+
2370,
|
|
2025
|
+
3112,
|
|
2026
|
+
2435,
|
|
2027
|
+
1556,
|
|
2028
|
+
1312,
|
|
2029
|
+
3998,
|
|
2030
|
+
2958,
|
|
2031
|
+
2428,
|
|
2032
|
+
2185,
|
|
2033
|
+
1607,
|
|
2034
|
+
3962,
|
|
2035
|
+
1423,
|
|
2036
|
+
2959,
|
|
2037
|
+
882,
|
|
2038
|
+
3729,
|
|
2039
|
+
773,
|
|
2040
|
+
1612,
|
|
2041
|
+
1402,
|
|
2042
|
+
3013,
|
|
2043
|
+
2739,
|
|
2044
|
+
3168,
|
|
2045
|
+
3519,
|
|
2046
|
+
1048,
|
|
2047
|
+
2499,
|
|
2048
|
+
3181,
|
|
2049
|
+
3922,
|
|
2050
|
+
3529,
|
|
2051
|
+
3041,
|
|
2052
|
+
1351,
|
|
2053
|
+
1057,
|
|
2054
|
+
1517,
|
|
2055
|
+
2484,
|
|
2056
|
+
3542,
|
|
2057
|
+
2872,
|
|
2058
|
+
1737,
|
|
2059
|
+
1341,
|
|
2060
|
+
3696,
|
|
2061
|
+
3710,
|
|
2062
|
+
1529,
|
|
2063
|
+
1900,
|
|
2064
|
+
1519,
|
|
2065
|
+
1817,
|
|
2066
|
+
3463,
|
|
2067
|
+
3639,
|
|
2068
|
+
3263,
|
|
2069
|
+
881,
|
|
2070
|
+
2124,
|
|
2071
|
+
1142,
|
|
2072
|
+
2525,
|
|
2073
|
+
1580,
|
|
2074
|
+
1539,
|
|
2075
|
+
1141,
|
|
2076
|
+
1710,
|
|
2077
|
+
2955,
|
|
2078
|
+
1419,
|
|
2079
|
+
1840,
|
|
2080
|
+
1191,
|
|
2081
|
+
903,
|
|
2082
|
+
1284,
|
|
2083
|
+
1792,
|
|
2084
|
+
3112,
|
|
2085
|
+
1280,
|
|
2086
|
+
2525,
|
|
2087
|
+
2696,
|
|
2088
|
+
1832,
|
|
2089
|
+
4004,
|
|
2090
|
+
2808,
|
|
2091
|
+
2997,
|
|
2092
|
+
1091,
|
|
2093
|
+
830,
|
|
2094
|
+
2525,
|
|
2095
|
+
1065,
|
|
2096
|
+
3115,
|
|
2097
|
+
1732,
|
|
2098
|
+
1816,
|
|
2099
|
+
3680,
|
|
2100
|
+
3008,
|
|
2101
|
+
1782,
|
|
2102
|
+
3583,
|
|
2103
|
+
4142,
|
|
2104
|
+
1426,
|
|
2105
|
+
1248,
|
|
2106
|
+
2964,
|
|
2107
|
+
3552,
|
|
2108
|
+
2980,
|
|
2109
|
+
971,
|
|
2110
|
+
1298,
|
|
2111
|
+
3559,
|
|
2112
|
+
1487,
|
|
2113
|
+
4065,
|
|
2114
|
+
3704,
|
|
2115
|
+
3386,
|
|
2116
|
+
3071,
|
|
2117
|
+
3135,
|
|
2118
|
+
1048,
|
|
2119
|
+
3898,
|
|
2120
|
+
4174,
|
|
2121
|
+
4384,
|
|
2122
|
+
1757,
|
|
2123
|
+
2201,
|
|
2124
|
+
4119,
|
|
2125
|
+
2525,
|
|
2126
|
+
1278,
|
|
2127
|
+
4015,
|
|
2128
|
+
1564,
|
|
2129
|
+
1305,
|
|
2130
|
+
1192,
|
|
2131
|
+
1261,
|
|
2132
|
+
1141,
|
|
2133
|
+
1084,
|
|
2134
|
+
2660,
|
|
2135
|
+
2058,
|
|
2136
|
+
635,
|
|
2137
|
+
1755,
|
|
2138
|
+
1684,
|
|
2139
|
+
4065,
|
|
2140
|
+
1300,
|
|
2141
|
+
1694,
|
|
2142
|
+
3035,
|
|
2143
|
+
1138,
|
|
2144
|
+
3043,
|
|
2145
|
+
1448,
|
|
2146
|
+
1457,
|
|
2147
|
+
1119,
|
|
2148
|
+
631,
|
|
2149
|
+
1506,
|
|
2150
|
+
2774,
|
|
2151
|
+
756,
|
|
2152
|
+
2376,
|
|
2153
|
+
1608,
|
|
2154
|
+
2339,
|
|
2155
|
+
4026,
|
|
2156
|
+
1574,
|
|
2157
|
+
4178,
|
|
2158
|
+
1037,
|
|
2159
|
+
3892,
|
|
2160
|
+
2132,
|
|
2161
|
+
3815,
|
|
2162
|
+
3294,
|
|
2163
|
+
3439,
|
|
2164
|
+
1796,
|
|
2165
|
+
1496,
|
|
2166
|
+
2347,
|
|
2167
|
+
1245,
|
|
2168
|
+
1286,
|
|
2169
|
+
1130,
|
|
2170
|
+
2084,
|
|
2171
|
+
2678,
|
|
2172
|
+
1658,
|
|
2173
|
+
2525,
|
|
2174
|
+
3843,
|
|
2175
|
+
2650,
|
|
2176
|
+
1284,
|
|
2177
|
+
3806,
|
|
2178
|
+
4005,
|
|
2179
|
+
1313,
|
|
2180
|
+
1455,
|
|
2181
|
+
1045,
|
|
2182
|
+
1261,
|
|
2183
|
+
1236,
|
|
2184
|
+
2525,
|
|
2185
|
+
1366,
|
|
2186
|
+
2936,
|
|
2187
|
+
2185,
|
|
2188
|
+
4000,
|
|
2189
|
+
1426,
|
|
2190
|
+
2223,
|
|
2191
|
+
4033,
|
|
2192
|
+
1435,
|
|
2193
|
+
3203,
|
|
2194
|
+
1340,
|
|
2195
|
+
1408,
|
|
2196
|
+
2525,
|
|
2197
|
+
1290,
|
|
2198
|
+
3573,
|
|
2199
|
+
3018,
|
|
2200
|
+
1919,
|
|
2201
|
+
1366,
|
|
2202
|
+
2525,
|
|
2203
|
+
1776,
|
|
2204
|
+
1601,
|
|
2205
|
+
4015,
|
|
2206
|
+
4096,
|
|
2207
|
+
3426,
|
|
2208
|
+
3092,
|
|
2209
|
+
1127,
|
|
2210
|
+
1649,
|
|
2211
|
+
1777,
|
|
2212
|
+
2904,
|
|
2213
|
+
1075,
|
|
2214
|
+
1819,
|
|
2215
|
+
1299,
|
|
2216
|
+
2525,
|
|
2217
|
+
971,
|
|
2218
|
+
2030,
|
|
2219
|
+
1324,
|
|
2220
|
+
1691,
|
|
2221
|
+
1454,
|
|
2222
|
+
4156,
|
|
2223
|
+
707,
|
|
2224
|
+
906,
|
|
2225
|
+
3143,
|
|
2226
|
+
3839,
|
|
2227
|
+
2854,
|
|
2228
|
+
1255,
|
|
2229
|
+
1549,
|
|
2230
|
+
1649,
|
|
2231
|
+
2480,
|
|
2232
|
+
1384,
|
|
2233
|
+
3149,
|
|
2234
|
+
1643,
|
|
2235
|
+
2525,
|
|
2236
|
+
2926,
|
|
2237
|
+
886,
|
|
2238
|
+
1441,
|
|
2239
|
+
3194,
|
|
2240
|
+
1248,
|
|
2241
|
+
1962,
|
|
2242
|
+
1735,
|
|
2243
|
+
1679,
|
|
2244
|
+
2379,
|
|
2245
|
+
1532,
|
|
2246
|
+
2018,
|
|
2247
|
+
1243,
|
|
2248
|
+
1811,
|
|
2249
|
+
1598,
|
|
2250
|
+
3096,
|
|
2251
|
+
1445,
|
|
2252
|
+
1877,
|
|
2253
|
+
1589,
|
|
2254
|
+
1223,
|
|
2255
|
+
1860,
|
|
2256
|
+
3618,
|
|
2257
|
+
1482,
|
|
2258
|
+
1253,
|
|
2259
|
+
3704,
|
|
2260
|
+
4004,
|
|
2261
|
+
1327,
|
|
2262
|
+
2242,
|
|
2263
|
+
1160,
|
|
2264
|
+
2134,
|
|
2265
|
+
1440,
|
|
2266
|
+
1609,
|
|
2267
|
+
1656,
|
|
2268
|
+
2973,
|
|
2269
|
+
2166,
|
|
2270
|
+
1399,
|
|
2271
|
+
1558,
|
|
2272
|
+
3033,
|
|
2273
|
+
1976,
|
|
2274
|
+
1074,
|
|
2275
|
+
3250,
|
|
2276
|
+
1805,
|
|
2277
|
+
3741,
|
|
2278
|
+
3117,
|
|
2279
|
+
1878,
|
|
2280
|
+
3019,
|
|
2281
|
+
2152,
|
|
2282
|
+
2014,
|
|
2283
|
+
3829,
|
|
2284
|
+
1824,
|
|
2285
|
+
1565,
|
|
2286
|
+
1728,
|
|
2287
|
+
1815,
|
|
2288
|
+
1293,
|
|
2289
|
+
1094,
|
|
2290
|
+
3836,
|
|
2291
|
+
751,
|
|
2292
|
+
3334,
|
|
2293
|
+
1450,
|
|
2294
|
+
1865,
|
|
2295
|
+
1580,
|
|
2296
|
+
2232,
|
|
2297
|
+
3273,
|
|
2298
|
+
510,
|
|
2299
|
+
2225,
|
|
2300
|
+
3388,
|
|
2301
|
+
1346,
|
|
2302
|
+
1645,
|
|
2303
|
+
3830,
|
|
2304
|
+
788,
|
|
2305
|
+
2427,
|
|
2306
|
+
1027,
|
|
2307
|
+
3817,
|
|
2308
|
+
2033,
|
|
2309
|
+
3849,
|
|
2310
|
+
1808,
|
|
2311
|
+
3489,
|
|
2312
|
+
3210,
|
|
2313
|
+
1628,
|
|
2314
|
+
3737,
|
|
2315
|
+
3735,
|
|
2316
|
+
2525,
|
|
2317
|
+
1832,
|
|
2318
|
+
3871,
|
|
2319
|
+
1700,
|
|
2320
|
+
3731,
|
|
2321
|
+
3846,
|
|
2322
|
+
1635,
|
|
2323
|
+
3716,
|
|
2324
|
+
3951,
|
|
2325
|
+
770,
|
|
2326
|
+
1533,
|
|
2327
|
+
1651,
|
|
2328
|
+
870,
|
|
2329
|
+
1560,
|
|
2330
|
+
1821,
|
|
2331
|
+
3210,
|
|
2332
|
+
3632,
|
|
2333
|
+
3234,
|
|
2334
|
+
3771,
|
|
2335
|
+
3069,
|
|
2336
|
+
1387,
|
|
2337
|
+
1207,
|
|
2338
|
+
3668,
|
|
2339
|
+
3798,
|
|
2340
|
+
1944,
|
|
2341
|
+
3264,
|
|
2342
|
+
3377,
|
|
2343
|
+
1844,
|
|
2344
|
+
1052,
|
|
2345
|
+
1138,
|
|
2346
|
+
3015,
|
|
2347
|
+
2525,
|
|
2348
|
+
1829,
|
|
2349
|
+
3663,
|
|
2350
|
+
2198,
|
|
2351
|
+
3328,
|
|
2352
|
+
1626,
|
|
2353
|
+
2979,
|
|
2354
|
+
3086,
|
|
2355
|
+
1300,
|
|
2356
|
+
1296,
|
|
2357
|
+
2985,
|
|
2358
|
+
2525,
|
|
2359
|
+
984,
|
|
2360
|
+
1662,
|
|
2361
|
+
4070,
|
|
2362
|
+
1685,
|
|
2363
|
+
1237,
|
|
2364
|
+
3049,
|
|
2365
|
+
1372,
|
|
2366
|
+
1621,
|
|
2367
|
+
3755,
|
|
2368
|
+
1883,
|
|
2369
|
+
3761,
|
|
2370
|
+
1709,
|
|
2371
|
+
3659,
|
|
2372
|
+
1729,
|
|
2373
|
+
416
|
|
2374
|
+
],
|
|
2375
|
+
"avg_rating": [
|
|
2376
|
+
5
|
|
2377
|
+
]
|
|
2378
|
+
},
|
|
2379
|
+
"group_id": {
|
|
2380
|
+
"name": {
|
|
2381
|
+
"functionName": "arrow",
|
|
2382
|
+
"body": "() => `${chance.pickone([\"Study\", \"Learning\", \"Focus\", \"Peer\", \"Cohort\"])} ${chance.pickone([\"Circle\", \"Squad\", \"Team\", \"Hub\", \"Group\"])} ${chance.character({ alpha: true, casing: \"upper\" })}${chance.integer({ min: 1, max: 99 })}`"
|
|
2383
|
+
},
|
|
2384
|
+
"member_count": [
|
|
2385
|
+
4,
|
|
2386
|
+
15,
|
|
2387
|
+
9,
|
|
2388
|
+
5,
|
|
2389
|
+
19,
|
|
2390
|
+
9,
|
|
2391
|
+
11,
|
|
2392
|
+
17
|
|
2393
|
+
],
|
|
2394
|
+
"focus_area": [
|
|
2395
|
+
"CS",
|
|
2396
|
+
"Math",
|
|
2397
|
+
"Science",
|
|
2398
|
+
"Business",
|
|
2399
|
+
"Arts",
|
|
2400
|
+
"Languages"
|
|
2401
|
+
]
|
|
2402
|
+
}
|
|
2403
|
+
},
|
|
2404
|
+
"lookupTables": []
|
|
2405
|
+
},
|
|
2406
|
+
"hooks": "function (record, type, meta) {\n\t\tconst NOW = dayjs();\n\t\tconst DATASET_START = NOW.subtract(days, 'days');\n\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\t// Hook #1: STUDENT VS INSTRUCTOR PROFILES\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\tif (type === \"user\") {\n\t\t\tif (record.account_type === \"instructor\") {\n\t\t\t\trecord.courses_created = chance.integer({ min: 1, max: 15 });\n\t\t\t\trecord.teaching_experience_years = chance.integer({ min: 1, max: 20 });\n\t\t\t\trecord.instructor_rating = Math.round((chance.floating({ min: 3.0, max: 5.0 }) + Number.EPSILON) * 100) / 100;\n\t\t\t} else {\n\t\t\t\trecord.learning_goal = chance.pickone([\"career_change\", \"skill_upgrade\", \"hobby\", \"degree_requirement\"]);\n\t\t\t\trecord.study_hours_per_week = chance.integer({ min: 2, max: 30 });\n\t\t\t}\n\t\t}\n\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\t// Hook #2: DEADLINE CRAMMING\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\tif (type === \"event\") {\n\t\t\tif (record.event === \"assignment submitted\" && record.time) {\n\t\t\t\tconst eventDay = dayjs(record.time).day(); // 0 = Sunday, 1 = Monday\n\t\t\t\tif (eventDay === 0 || eventDay === 1) {\n\t\t\t\t\trecord.is_deadline_rush = true;\n\t\t\t\t\t// 60% chance of being late (only 40% on time)\n\t\t\t\t\trecord.is_late = !chance.bool({ likelihood: 40 });\n\t\t\t\t} else {\n\t\t\t\t\trecord.is_deadline_rush = false;\n\t\t\t\t\trecord.is_late = !chance.bool({ likelihood: 80 });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Quiz score penalty moved to everything hook (after churn removal)\n\t\t\t// to avoid selection bias — the penalty was causing more Sun/Mon\n\t\t\t// quiz-takers to trigger hasLowQuizScore churn, inflating their avg\n\t\t}\n\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\t// Hook #5: HINT DEPENDENCY\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\tif (type === \"event\") {\n\t\t\tif (record.event === \"practice problem solved\") {\n\t\t\t\tif (record.hint_used === true) {\n\t\t\t\t\t// Hint users gravitate toward easy problems\n\t\t\t\t\tif (chance.bool({ likelihood: 60 })) {\n\t\t\t\t\t\trecord.difficulty = \"easy\";\n\t\t\t\t\t}\n\t\t\t\t\trecord.independent_solver = false;\n\t\t\t\t} else if (record.hint_used === false) {\n\t\t\t\t\t// Independent solvers tackle harder problems\n\t\t\t\t\tif (chance.bool({ likelihood: 40 })) {\n\t\t\t\t\t\trecord.difficulty = \"hard\";\n\t\t\t\t\t\trecord.independent_solver = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\trecord.independent_solver = false;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\trecord.independent_solver = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\t// Hook #6: SEMESTER-END SPIKE (tag in event hook, duplicate in everything hook)\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\tif (type === \"event\") {\n\t\t\tif (record.time) {\n\t\t\t\tconst eventTime = dayjs(record.time);\n\t\t\t\tconst dayInDataset = eventTime.diff(DATASET_START, 'days', true);\n\n\t\t\t\tconst spikableEvents = [\"quiz started\", \"quiz completed\", \"assignment submitted\"];\n\t\t\t\tif (spikableEvents.includes(record.event)) {\n\t\t\t\t\tif (dayInDataset >= 75 && dayInDataset <= 85) {\n\t\t\t\t\t\trecord.semester_end_rush = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\trecord.semester_end_rush = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\t// Hook #8: PLAYBACK SPEED CORRELATION\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\tif (type === \"event\") {\n\t\t\tif (record.event === \"lecture completed\") {\n\t\t\t\tconst speed = record.playback_speed;\n\n\t\t\t\tif (speed >= 2.0) {\n\t\t\t\t\trecord.speed_learner = true;\n\t\t\t\t\trecord.thorough_learner = false;\n\t\t\t\t\t// Compress watch time for speed learners\n\t\t\t\t\tif (record.watch_time_mins !== undefined) {\n\t\t\t\t\t\trecord.watch_time_mins = Math.max(3, Math.floor(record.watch_time_mins * 0.6));\n\t\t\t\t\t}\n\t\t\t\t} else if (speed !== undefined && speed <= 1.0) {\n\t\t\t\t\trecord.speed_learner = false;\n\t\t\t\t\trecord.thorough_learner = true;\n\t\t\t\t\t// Extend watch time for thorough learners\n\t\t\t\t\tif (record.watch_time_mins !== undefined) {\n\t\t\t\t\t\trecord.watch_time_mins = Math.min(90, Math.floor(record.watch_time_mins * 1.4));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\trecord.speed_learner = false;\n\t\t\t\t\trecord.thorough_learner = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\t// Hook #3: NOTES-TAKERS SUCCEED\n\t\t// Hook #4: STUDY GROUP RETENTION\n\t\t// Hook #7: FREE VS PAID (funnel-pre handled below)\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\tif (type === \"everything\") {\n\t\t\tconst userEvents = record;\n\t\t\tconst firstEventTime = userEvents.length > 0 ? dayjs(userEvents[0].time) : null;\n\n\t\t\t// ---------------------------------------------------------------\n\t\t\t// First pass: identify user patterns\n\t\t\t// ---------------------------------------------------------------\n\t\t\tlet notesTakenCount = 0;\n\t\t\tlet joinedStudyGroupEarly = false;\n\t\t\tlet hasLowQuizScore = false;\n\n\t\t\tuserEvents.forEach((event) => {\n\t\t\t\tconst eventTime = dayjs(event.time);\n\t\t\t\tconst daysSinceStart = firstEventTime ? eventTime.diff(firstEventTime, 'days', true) : 0;\n\n\t\t\t\t// Hook #3: Count lecture_completed events where notes_taken === true\n\t\t\t\tif (event.event === \"lecture completed\" && event.notes_taken === true) {\n\t\t\t\t\tnotesTakenCount++;\n\t\t\t\t}\n\n\t\t\t\t// Hook #4: Check if user joined a study group within the first 10 days\n\t\t\t\tif (event.event === \"study group joined\" && daysSinceStart <= 10) {\n\t\t\t\t\tjoinedStudyGroupEarly = true;\n\t\t\t\t}\n\n\t\t\t\t// Hook #4: Check for any quiz_completed with score < 60\n\t\t\t\tif (event.event === \"quiz completed\" && event.score_percent < 60) {\n\t\t\t\t\thasLowQuizScore = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// ---------------------------------------------------------------\n\t\t\t// Second pass: modify events based on patterns\n\t\t\t// ---------------------------------------------------------------\n\n\t\t\t// Hook #3: NOTES-TAKERS SUCCEED\n\t\t\tif (notesTakenCount >= 5) {\n\t\t\t\tuserEvents.forEach((event, idx) => {\n\t\t\t\t\t// Boost quiz scores for diligent note-takers\n\t\t\t\t\tif (event.event === \"quiz completed\") {\n\t\t\t\t\t\t\tif (event.score_percent !== undefined) {\n\t\t\t\t\t\t\tevent.score_percent = Math.min(100, event.score_percent + 20);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tevent.diligent_student = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// 40% chance to splice in an extra certificate_earned event\n\t\t\t\tif (chance.bool({ likelihood: 40 })) {\n\t\t\t\t\tconst lastEvent = userEvents[userEvents.length - 1];\n\t\t\t\t\tif (lastEvent) {\n\t\t\t\t\t\tconst certEvent = {\n\t\t\t\t\t\t\tevent: \"certificate earned\",\n\t\t\t\t\t\t\ttime: dayjs(lastEvent.time).add(chance.integer({ min: 1, max: 5 }), 'days').toISOString(),\n\t\t\t\t\t\t\tuser_id: lastEvent.user_id,\n\t\t\t\t\t\t\tcourse_id: chance.pickone(courseIds),\n\t\t\t\t\t\t\tcompletion_time_days: chance.integer({ min: 14, max: 90 }),\n\t\t\t\t\t\t\tfinal_grade: chance.integer({ min: 80, max: 100 }),\n\t\t\t\t\t\t\tdiligent_student: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tuserEvents.push(certEvent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Hook #8 (everything pass): Speed learners (3+ lectures at 2.0x) get higher quiz scores\n\t\t\tlet speedLectureCount = 0;\n\t\t\tuserEvents.forEach((event) => {\n\t\t\t\tif (event.event === \"lecture completed\" && event.speed_learner === true) {\n\t\t\t\t\tspeedLectureCount++;\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst isSpeedLearner = speedLectureCount >= 3;\n\n\t\t\tif (isSpeedLearner) {\n\t\t\t\tuserEvents.forEach((event) => {\n\t\t\t\t\tif (event.event === \"quiz completed\") {\n\t\t\t\t\t\t\tif (event.score_percent !== undefined) {\n\t\t\t\t\t\t\tevent.score_percent = Math.min(100, event.score_percent + 8);\n\t\t\t\t\t\t\tevent.speed_learner_effect = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Hook #6: SEMESTER-END SPIKE - duplicate assessment events in the spike window\n\t\t\tconst duplicates = [];\n\t\t\tuserEvents.forEach((event) => {\n\t\t\t\tif (event.semester_end_rush === true && chance.bool({ likelihood: 80 })) {\n\t\t\t\t\tconst dup = JSON.parse(JSON.stringify(event));\n\t\t\t\t\tdup.time = dayjs(event.time).add(chance.integer({ min: 5, max: 120 }), 'minutes').toISOString();\n\t\t\t\t\tdup.semester_end_rush = true;\n\t\t\t\t\tduplicates.push(dup);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (duplicates.length > 0) {\n\t\t\t\tuserEvents.push(...duplicates);\n\t\t\t}\n\n\t\t\t// Hook #7: FREE VS PAID - reinforce the subscription effect on certificates\n\t\t\tconst subStatus = meta && meta.profile ? meta.profile.subscription_status : \"free\";\n\t\t\tif (subStatus === \"free\") {\n\t\t\t\t// Free users lose 55% of their certificates (simulating lower completion)\n\t\t\t\tfor (let i = userEvents.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (userEvents[i].event === \"certificate earned\" && chance.bool({ likelihood: 55 })) {\n\t\t\t\t\t\tuserEvents.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Hook #4: STUDY GROUP RETENTION (runs LAST to ensure churn removal isn't undone by later hooks)\n\t\t\tif (!joinedStudyGroupEarly && hasLowQuizScore) {\n\t\t\t\t// Non-joiners with low scores: remove ALL events after day 14 from their first event (hard churn)\n\t\t\t\tconst churnCutoff = firstEventTime ? firstEventTime.add(14, 'days') : null;\n\t\t\t\tfor (let i = userEvents.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst evt = userEvents[i];\n\t\t\t\t\tif (churnCutoff && dayjs(evt.time).isAfter(churnCutoff)) {\n\t\t\t\t\t\tuserEvents.splice(i, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (joinedStudyGroupEarly) {\n\t\t\t\t// Study group joiners keep all events and get bonus discussion_posted events\n\t\t\t\tconst lastEvent = userEvents[userEvents.length - 1];\n\t\t\t\tif (lastEvent && chance.bool({ likelihood: 60 })) {\n\t\t\t\t\tconst bonusDiscussion = {\n\t\t\t\t\t\tevent: \"discussion posted\",\n\t\t\t\t\t\ttime: dayjs(lastEvent.time).add(chance.integer({ min: 1, max: 3 }), 'days').toISOString(),\n\t\t\t\t\t\tuser_id: lastEvent.user_id,\n\t\t\t\t\t\tcourse_id: chance.pickone(courseIds),\n\t\t\t\t\t\tpost_type: chance.pickone([\"question\", \"answer\", \"comment\"]),\n\t\t\t\t\t\tword_count: chance.integer({ min: 20, max: 400 }),\n\t\t\t\t\t\tstudy_group_member: true,\n\t\t\t\t\t};\n\t\t\t\t\tuserEvents.push(bonusDiscussion);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Hook #2b: DEADLINE CRAMMING (quiz score penalty)\n\t\t\t// Applied LAST to avoid selection bias — if applied before churn,\n\t\t\t// the penalty pushes Sun/Mon quiz-takers below the hasLowQuizScore\n\t\t\t// threshold, selectively churning them and inflating the avg.\n\t\t\tuserEvents.forEach((event) => {\n\t\t\t\tif (event.event === \"quiz completed\" && event.time) {\n\t\t\t\t\tconst eventDay = dayjs(event.time).day();\n\t\t\t\t\tif (eventDay === 0 || eventDay === 1) {\n\t\t\t\t\t\tif (event.score_percent !== undefined) {\n\t\t\t\t\t\t\tevent.score_percent = Math.max(0, event.score_percent - 25);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\t// Hook #7: FREE VS PAID COURSES (funnel-pre)\n\t\t// ═══════════════════════════════════════════════════════════════════\n\t\tif (type === \"funnel-pre\") {\n\t\t\t// Target funnels containing course completion events\n\t\t\tif (meta && meta.profile && meta.funnel) {\n\t\t\t\tconst subscriptionStatus = meta.profile.subscription_status;\n\n\t\t\t\tif (subscriptionStatus === \"free\") {\n\t\t\t\t\t// Free users convert at 0.5x rate\n\t\t\t\t\trecord.conversionRate = (record.conversionRate || 0.25) * 0.5;\n\t\t\t\t} else if (subscriptionStatus === \"monthly\" || subscriptionStatus === \"annual\") {\n\t\t\t\t\t// Paid subscribers convert at 1.5x rate\n\t\t\t\t\trecord.conversionRate = (record.conversionRate || 0.25) * 1.5;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn record;\n\t}",
|
|
2407
|
+
"timestamp": "2026-04-10T01:39:06.759Z",
|
|
2408
|
+
"version": "4.0"
|
|
2409
|
+
}
|