Dobin Yim commited on
Commit
a39c45e
·
1 Parent(s): d9f3f82

final AIE3

Browse files
Files changed (9) hide show
  1. .DS_Store +0 -0
  2. .chainlit/config.toml +118 -0
  3. .chainlit/translations/en-US.json +229 -0
  4. .env +2 -0
  5. README.md +9 -5
  6. Solution.md +62 -0
  7. final.py +1 -28
  8. process_docs.py +31 -0
  9. rubric.md +55 -0
.DS_Store ADDED
Binary file (6.15 kB). View file
 
.chainlit/config.toml ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ # Whether to enable telemetry (default: true). No personal data is collected.
3
+ enable_telemetry = true
4
+
5
+
6
+ # List of environment variables to be provided by each user to use the app.
7
+ user_env = []
8
+
9
+ # Duration (in seconds) during which the session is saved when the connection is lost
10
+ session_timeout = 3600
11
+
12
+ # Enable third parties caching (e.g LangChain cache)
13
+ cache = false
14
+
15
+ # Authorized origins
16
+ allow_origins = ["*"]
17
+
18
+ # Follow symlink for asset mount (see https://github.com/Chainlit/chainlit/issues/317)
19
+ # follow_symlink = false
20
+
21
+ [features]
22
+ # Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript)
23
+ unsafe_allow_html = false
24
+
25
+ # Process and display mathematical expressions. This can clash with "$" characters in messages.
26
+ latex = false
27
+
28
+ # Automatically tag threads with the current chat profile (if a chat profile is used)
29
+ auto_tag_thread = true
30
+
31
+ # Authorize users to spontaneously upload files with messages
32
+ [features.spontaneous_file_upload]
33
+ enabled = true
34
+ accept = ["*/*"]
35
+ max_files = 20
36
+ max_size_mb = 500
37
+
38
+ [features.audio]
39
+ # Threshold for audio recording
40
+ min_decibels = -45
41
+ # Delay for the user to start speaking in MS
42
+ initial_silence_timeout = 3000
43
+ # Delay for the user to continue speaking in MS. If the user stops speaking for this duration, the recording will stop.
44
+ silence_timeout = 1500
45
+ # Above this duration (MS), the recording will forcefully stop.
46
+ max_duration = 15000
47
+ # Duration of the audio chunks in MS
48
+ chunk_duration = 1000
49
+ # Sample rate of the audio
50
+ sample_rate = 44100
51
+
52
+ [UI]
53
+ # Name of the assistant.
54
+ name = "Assistant"
55
+
56
+ # Description of the assistant. This is used for HTML tags.
57
+ # description = ""
58
+
59
+ # Large size content are by default collapsed for a cleaner ui
60
+ default_collapse_content = true
61
+
62
+ # Hide the chain of thought details from the user in the UI.
63
+ hide_cot = false
64
+
65
+ # Link to your github repo. This will add a github button in the UI's header.
66
+ # github = ""
67
+
68
+ # Specify a CSS file that can be used to customize the user interface.
69
+ # The CSS file can be served from the public directory or via an external link.
70
+ # custom_css = "/public/test.css"
71
+
72
+ # Specify a Javascript file that can be used to customize the user interface.
73
+ # The Javascript file can be served from the public directory.
74
+ # custom_js = "/public/test.js"
75
+
76
+ # Specify a custom font url.
77
+ # custom_font = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap"
78
+
79
+ # Specify a custom meta image url.
80
+ # custom_meta_image_url = "https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png"
81
+
82
+ # Specify a custom build directory for the frontend.
83
+ # This can be used to customize the frontend code.
84
+ # Be careful: If this is a relative path, it should not start with a slash.
85
+ # custom_build = "./public/build"
86
+
87
+ [UI.theme]
88
+ default = "dark"
89
+ #layout = "wide"
90
+ #font_family = "Inter, sans-serif"
91
+ # Override default MUI light theme. (Check theme.ts)
92
+ [UI.theme.light]
93
+ #background = "#FAFAFA"
94
+ #paper = "#FFFFFF"
95
+
96
+ [UI.theme.light.primary]
97
+ #main = "#F80061"
98
+ #dark = "#980039"
99
+ #light = "#FFE7EB"
100
+ [UI.theme.light.text]
101
+ #primary = "#212121"
102
+ #secondary = "#616161"
103
+
104
+ # Override default MUI dark theme. (Check theme.ts)
105
+ [UI.theme.dark]
106
+ #background = "#FAFAFA"
107
+ #paper = "#FFFFFF"
108
+
109
+ [UI.theme.dark.primary]
110
+ #main = "#F80061"
111
+ #dark = "#980039"
112
+ #light = "#FFE7EB"
113
+ [UI.theme.dark.text]
114
+ #primary = "#EEEEEE"
115
+ #secondary = "#BDBDBD"
116
+
117
+ [meta]
118
+ generated_by = "1.1.302"
.chainlit/translations/en-US.json ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "components": {
3
+ "atoms": {
4
+ "buttons": {
5
+ "userButton": {
6
+ "menu": {
7
+ "settings": "Settings",
8
+ "settingsKey": "S",
9
+ "APIKeys": "API Keys",
10
+ "logout": "Logout"
11
+ }
12
+ }
13
+ }
14
+ },
15
+ "molecules": {
16
+ "newChatButton": {
17
+ "newChat": "New Chat"
18
+ },
19
+ "tasklist": {
20
+ "TaskList": {
21
+ "title": "\ud83d\uddd2\ufe0f Task List",
22
+ "loading": "Loading...",
23
+ "error": "An error occurred"
24
+ }
25
+ },
26
+ "attachments": {
27
+ "cancelUpload": "Cancel upload",
28
+ "removeAttachment": "Remove attachment"
29
+ },
30
+ "newChatDialog": {
31
+ "createNewChat": "Create new chat?",
32
+ "clearChat": "This will clear the current messages and start a new chat.",
33
+ "cancel": "Cancel",
34
+ "confirm": "Confirm"
35
+ },
36
+ "settingsModal": {
37
+ "settings": "Settings",
38
+ "expandMessages": "Expand Messages",
39
+ "hideChainOfThought": "Hide Chain of Thought",
40
+ "darkMode": "Dark Mode"
41
+ },
42
+ "detailsButton": {
43
+ "using": "Using",
44
+ "used": "Used"
45
+ },
46
+ "auth": {
47
+ "authLogin": {
48
+ "title": "Login to access the app.",
49
+ "form": {
50
+ "email": "Email address",
51
+ "password": "Password",
52
+ "noAccount": "Don't have an account?",
53
+ "alreadyHaveAccount": "Already have an account?",
54
+ "signup": "Sign Up",
55
+ "signin": "Sign In",
56
+ "or": "OR",
57
+ "continue": "Continue",
58
+ "forgotPassword": "Forgot password?",
59
+ "passwordMustContain": "Your password must contain:",
60
+ "emailRequired": "email is a required field",
61
+ "passwordRequired": "password is a required field"
62
+ },
63
+ "error": {
64
+ "default": "Unable to sign in.",
65
+ "signin": "Try signing in with a different account.",
66
+ "oauthsignin": "Try signing in with a different account.",
67
+ "redirect_uri_mismatch": "The redirect URI is not matching the oauth app configuration.",
68
+ "oauthcallbackerror": "Try signing in with a different account.",
69
+ "oauthcreateaccount": "Try signing in with a different account.",
70
+ "emailcreateaccount": "Try signing in with a different account.",
71
+ "callback": "Try signing in with a different account.",
72
+ "oauthaccountnotlinked": "To confirm your identity, sign in with the same account you used originally.",
73
+ "emailsignin": "The e-mail could not be sent.",
74
+ "emailverify": "Please verify your email, a new email has been sent.",
75
+ "credentialssignin": "Sign in failed. Check the details you provided are correct.",
76
+ "sessionrequired": "Please sign in to access this page."
77
+ }
78
+ },
79
+ "authVerifyEmail": {
80
+ "almostThere": "You're almost there! We've sent an email to ",
81
+ "verifyEmailLink": "Please click on the link in that email to complete your signup.",
82
+ "didNotReceive": "Can't find the email?",
83
+ "resendEmail": "Resend email",
84
+ "goBack": "Go Back",
85
+ "emailSent": "Email sent successfully.",
86
+ "verifyEmail": "Verify your email address"
87
+ },
88
+ "providerButton": {
89
+ "continue": "Continue with {{provider}}",
90
+ "signup": "Sign up with {{provider}}"
91
+ },
92
+ "authResetPassword": {
93
+ "newPasswordRequired": "New password is a required field",
94
+ "passwordsMustMatch": "Passwords must match",
95
+ "confirmPasswordRequired": "Confirm password is a required field",
96
+ "newPassword": "New password",
97
+ "confirmPassword": "Confirm password",
98
+ "resetPassword": "Reset Password"
99
+ },
100
+ "authForgotPassword": {
101
+ "email": "Email address",
102
+ "emailRequired": "email is a required field",
103
+ "emailSent": "Please check the email address {{email}} for instructions to reset your password.",
104
+ "enterEmail": "Enter your email address and we will send you instructions to reset your password.",
105
+ "resendEmail": "Resend email",
106
+ "continue": "Continue",
107
+ "goBack": "Go Back"
108
+ }
109
+ }
110
+ },
111
+ "organisms": {
112
+ "chat": {
113
+ "history": {
114
+ "index": {
115
+ "showHistory": "Show history",
116
+ "lastInputs": "Last Inputs",
117
+ "noInputs": "Such empty...",
118
+ "loading": "Loading..."
119
+ }
120
+ },
121
+ "inputBox": {
122
+ "input": {
123
+ "placeholder": "Type your message here..."
124
+ },
125
+ "speechButton": {
126
+ "start": "Start recording",
127
+ "stop": "Stop recording"
128
+ },
129
+ "SubmitButton": {
130
+ "sendMessage": "Send message",
131
+ "stopTask": "Stop Task"
132
+ },
133
+ "UploadButton": {
134
+ "attachFiles": "Attach files"
135
+ },
136
+ "waterMark": {
137
+ "text": "Built with"
138
+ }
139
+ },
140
+ "Messages": {
141
+ "index": {
142
+ "running": "Running",
143
+ "executedSuccessfully": "executed successfully",
144
+ "failed": "failed",
145
+ "feedbackUpdated": "Feedback updated",
146
+ "updating": "Updating"
147
+ }
148
+ },
149
+ "dropScreen": {
150
+ "dropYourFilesHere": "Drop your files here"
151
+ },
152
+ "index": {
153
+ "failedToUpload": "Failed to upload",
154
+ "cancelledUploadOf": "Cancelled upload of",
155
+ "couldNotReachServer": "Could not reach the server",
156
+ "continuingChat": "Continuing previous chat"
157
+ },
158
+ "settings": {
159
+ "settingsPanel": "Settings panel",
160
+ "reset": "Reset",
161
+ "cancel": "Cancel",
162
+ "confirm": "Confirm"
163
+ }
164
+ },
165
+ "threadHistory": {
166
+ "sidebar": {
167
+ "filters": {
168
+ "FeedbackSelect": {
169
+ "feedbackAll": "Feedback: All",
170
+ "feedbackPositive": "Feedback: Positive",
171
+ "feedbackNegative": "Feedback: Negative"
172
+ },
173
+ "SearchBar": {
174
+ "search": "Search"
175
+ }
176
+ },
177
+ "DeleteThreadButton": {
178
+ "confirmMessage": "This will delete the thread as well as it's messages and elements.",
179
+ "cancel": "Cancel",
180
+ "confirm": "Confirm",
181
+ "deletingChat": "Deleting chat",
182
+ "chatDeleted": "Chat deleted"
183
+ },
184
+ "index": {
185
+ "pastChats": "Past Chats"
186
+ },
187
+ "ThreadList": {
188
+ "empty": "Empty...",
189
+ "today": "Today",
190
+ "yesterday": "Yesterday",
191
+ "previous7days": "Previous 7 days",
192
+ "previous30days": "Previous 30 days"
193
+ },
194
+ "TriggerButton": {
195
+ "closeSidebar": "Close sidebar",
196
+ "openSidebar": "Open sidebar"
197
+ }
198
+ },
199
+ "Thread": {
200
+ "backToChat": "Go back to chat",
201
+ "chatCreatedOn": "This chat was created on"
202
+ }
203
+ },
204
+ "header": {
205
+ "chat": "Chat",
206
+ "readme": "Readme"
207
+ }
208
+ }
209
+ },
210
+ "hooks": {
211
+ "useLLMProviders": {
212
+ "failedToFetchProviders": "Failed to fetch providers:"
213
+ }
214
+ },
215
+ "pages": {
216
+ "Design": {},
217
+ "Env": {
218
+ "savedSuccessfully": "Saved successfully",
219
+ "requiredApiKeys": "Required API Keys",
220
+ "requiredApiKeysInfo": "To use this app, the following API keys are required. The keys are stored on your device's local storage."
221
+ },
222
+ "Page": {
223
+ "notPartOfProject": "You are not part of this project."
224
+ },
225
+ "ResumeButton": {
226
+ "resumeChat": "Resume Chat"
227
+ }
228
+ }
229
+ }
.env ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ OPENAI_API_KEY=
2
+ PYTHONPATH=.
README.md CHANGED
@@ -1,11 +1,15 @@
1
  ---
2
- title: Autograder
3
- emoji: 📈
4
- colorFrom: green
5
- colorTo: red
6
  sdk: docker
7
  pinned: false
8
  license: mit
9
  ---
10
 
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
1
  ---
2
+ title: Aie3 Midterm
3
+ emoji: 🏆
4
+ colorFrom: indigo
5
+ colorTo: purple
6
  sdk: docker
7
  pinned: false
8
  license: mit
9
  ---
10
 
11
+ # Final - GradeAssistant: Automating Assessment of Learning (AoL
12
+ - Simple RAG app using Chainlit, LangChain, and Openai
13
+ - There are some sample files, including rubric and sample homework Solution, also as PDF (Excel Review.pdf).
14
+ - For privacy reason, a zip file of student submissions are not included. Each student has a directory of submission files.
15
+ - The app handles Word or PDF as text document.
Solution.md ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### Questions and Answers
2
+
3
+ **Snapshot**
4
+
5
+ **Assignment**: 50 points
6
+ **Due**: Sunday, 11:59 PM ET
7
+
8
+ **Scenario**:
9
+ You have been hired as a Data Analyst for Abercrombie and Fitch's marketing department. You are tasked with evaluating sales changes over time for the fall, spring, and summer advertising campaigns using data from 2011-2017. You will use Excel features such as formulas, functions, graphs, and Pivot Tables.
10
+
11
+ **Instructions**:
12
+ 1. Download the Excel file from the Assignment page and rename it as “AF-Sales-Your Name.xlsx”.
13
+ 2. Complete the table by calculating Total Units Sold, Largest # of Units Sold, and Smallest # of Units Sold for Women’s Clothing, Women’s Shoes, Men’s Clothing, and Men’s Shoes. Use the example provided for Women’s Clothing sales metrics.
14
+ 3. Calculate average sales for Men and Women product categories for each season and determine the trend. Fill in the cell ranges as specified.
15
+ 4. Create a graph to compare sales revenue over time by creating a line graph for Spring sales revenues for the four product categories.
16
+ 5. Use the VLOOKUP function to determine sales rank for Men’s and Women’s Average Sales.
17
+ 6. Create a Pivot Table to determine seasonal sales performance.
18
+
19
+ **Questions and Answers:**
20
+
21
+ **Question #1**: Which product category performed best in terms of (a) total units sold, (b) largest # of units sold, and (c) smallest # of units sold?
22
+
23
+ **Answer**:
24
+ (a) Women's Clothing
25
+ (b) Men's Shoes
26
+ (c) Men's Clothing
27
+
28
+ **Question #2**: Which product category performed best in terms of gross profit?
29
+
30
+ **Answer**:
31
+ Women's Clothing
32
+
33
+ **Question #3**: Will the sales be better in 2018 than 2011?
34
+
35
+ **Answer**:
36
+ Based on the trends observed from 2011 to 2017, we predict that sales in 2018 will be worse than in 2011 due to the consistent decrease in sales performance over the years for all and each product category.
37
+
38
+ **Question #4**: Which product category is likely to perform best in 2018?
39
+
40
+ **Answer**:
41
+ According to time trend graph, the Women's Clothing is likely to perform best in 2018, given its sales trend over the previous years is at the top of the graph or highest line.
42
+
43
+ **Question #5**: Compare Men vs. Women’s Average Sales Rank. Which performed better?
44
+
45
+ **Answer**:
46
+ Using COUNTIF function, there were 20 seasons of Exceptional average sales rank for Women's products compared to 7 seasons of Exceptional average rank for Men's products. Therefore, Women's Average Sales Rank performed better than Men's.
47
+
48
+ **Question #6**: How many seasons did Men’s Average Sales Rank achieve “Exceptional”? Use the COUNTIF function to calculate this number.
49
+
50
+ **Answer**:
51
+ Men’s Average Sales Rank achieved “Exceptional” in 7 seasons.
52
+
53
+ **Question #7**: Which season had the highest sales in terms of (a) overall sales and (b) average sales?
54
+
55
+ **Answer**:
56
+ (a) Spring had the highest overall or total sales.
57
+ (b) Spring had the highest average sales.
58
+
59
+ **Question #8**: Which year had the highest seasonal variation in total sales? (Hint: you will need to remove Quarter from Columns and change the field value)
60
+
61
+ **Answer**:
62
+ Using Standard Deviation or Variance of Season Total per year, 2011 had the highest seasonal variation in total sales.
final.py CHANGED
@@ -33,6 +33,7 @@ from promptsplitembed import create_prompt, split_documents, generate_embeddings
33
  from extractjson import extract_json
34
  from calcscore import compute_cosine_similarity, llm_similarity
35
  from prompt_templates import ref_prompt, student_prompt, llm_score_prompt_template
 
36
 
37
  # Load environment variables
38
  load_dotenv()
@@ -42,34 +43,6 @@ openai.api_key = OPENAI_API_KEY
42
  # Set up logging
43
  logging.basicConfig(level=logging.INFO)
44
  logger = logging.getLogger(__name__)
45
-
46
- qa_chat_model = create_qamodel(model="gpt-4o-mini", temperature=0
47
- )
48
- def process_reference(reference_document, ref_prompt):
49
- ref_prompt_template = create_prompt(ref_prompt)
50
- ref_generation_chain = ref_prompt_template | qa_chat_model
51
- result = ref_generation_chain.invoke({"source": reference_document})
52
- ref_gen_tokens = result.usage_metadata["total_tokens"]
53
- reference = dict(extract_json(result)[0])
54
-
55
- answers = {}
56
- for key in reference:
57
- if key.startswith('Question'):
58
- question_number = key.split('#')[1]
59
- answer_key = f'Answer #{question_number}'
60
- answers[key] = reference[answer_key]
61
- print("Processed reference document")
62
- return reference, answers, ref_gen_tokens
63
-
64
- def process_student(documents, reference, student_prompt):
65
- test_doc = documents[0]
66
- student_prompt_template = create_prompt(student_prompt)
67
- student_response_chain = student_prompt_template | qa_chat_model
68
- student_result = student_response_chain.invoke({"source": reference.keys(),"student": test_doc })
69
- student_gen_tokens = student_result.usage_metadata["total_tokens"]
70
- student_result = dict(extract_json(student_result)[0])
71
- print("Processed student document")
72
- return student_result, student_gen_tokens
73
 
74
  def compare_docs(answers, student_result):
75
  split_reference_docs, ref_tokens = {}, 0
 
33
  from extractjson import extract_json
34
  from calcscore import compute_cosine_similarity, llm_similarity
35
  from prompt_templates import ref_prompt, student_prompt, llm_score_prompt_template
36
+ from process_docs import process_reference, process_student
37
 
38
  # Load environment variables
39
  load_dotenv()
 
43
  # Set up logging
44
  logging.basicConfig(level=logging.INFO)
45
  logger = logging.getLogger(__name__)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
  def compare_docs(answers, student_result):
48
  split_reference_docs, ref_tokens = {}, 0
process_docs.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from promptsplitembed import create_qamodel, create_prompt
2
+ from extractjson import extract_json
3
+ from langchain_openai import ChatOpenAI
4
+
5
+ qa_chat_model = create_qamodel(model="gpt-4o-mini", temperature=0)
6
+
7
+ def process_reference(reference_document, ref_prompt):
8
+ ref_prompt_template = create_prompt(ref_prompt)
9
+ ref_generation_chain = ref_prompt_template | qa_chat_model
10
+ result = ref_generation_chain.invoke({"source": reference_document})
11
+ ref_gen_tokens = result.usage_metadata["total_tokens"]
12
+ reference = dict(extract_json(result)[0])
13
+
14
+ answers = {}
15
+ for key in reference:
16
+ if key.startswith('Question'):
17
+ question_number = key.split('#')[1]
18
+ answer_key = f'Answer #{question_number}'
19
+ answers[key] = reference[answer_key]
20
+ print("Processed reference document")
21
+ return reference, answers, ref_gen_tokens
22
+
23
+ def process_student(documents, reference, student_prompt):
24
+ test_doc = documents[0]
25
+ student_prompt_template = create_prompt(student_prompt)
26
+ student_response_chain = student_prompt_template | qa_chat_model
27
+ student_result = student_response_chain.invoke({"source": reference.keys(),"student": test_doc })
28
+ student_gen_tokens = student_result.usage_metadata["total_tokens"]
29
+ student_result = dict(extract_json(student_result)[0])
30
+ print("Processed student document")
31
+ return student_result, student_gen_tokens
rubric.md ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ ### Rubric for Excel Review – Sales Data Analysis (General Evaluation Criteria)
3
+
4
+
5
+
6
+ #### Evaluation Criteria
7
+
8
+ Each criterion is rated on a scale from 1 (lowest) to 4 (highest).
9
+
10
+
11
+ 1. **Data Analysis and Interpretation:**
12
+
13
+ - **1:** Minimal or incorrect answers, including numerical and qualitative answers, interpretation of data, failure to identify key trends or insights.
14
+
15
+ - **2:** Basic interpretation with some correct insights, but with notable errors or omissions.
16
+
17
+ - **3:** Good interpretation and analysis with accurate identification of most trends and patterns.
18
+
19
+ - **4:** Excellent and thorough analysis, with insightful and comprehensive identification of trends and key insights.
20
+
21
+
22
+
23
+ 2. **Problem Solving:**
24
+
25
+ - **1:** Lacks a clear strategy, minimal or ineffective problem-solving approach.
26
+
27
+ - **2:** Basic problem-solving skills, some effective strategies but lacking in creativity or thoroughness.
28
+
29
+ - **3:** Good problem-solving ability, demonstrates effective and strategic approach.
30
+
31
+ - **4:** Excellent problem-solving skills, highly creative and strategic, achieving outstanding analytical goals.
32
+
33
+
34
+
35
+ 3. **Critical Thinking:**
36
+
37
+ - **1:** Minimal critical engagement, accepting data without questioning or exploration.
38
+
39
+ - **2:** Some evidence of critical thinking, but surface-level exploration and incomplete reasoning.
40
+
41
+ - **3:** Good critical thinking, with comprehensive exploration and well-reasoned conclusions.
42
+
43
+ - **4:** Excellent critical thinking skills, deeply questioning and rigorously evaluating data before forming conclusions.
44
+
45
+
46
+
47
+ 4. **Written Communication:**
48
+
49
+ - **1:** Poorly structured, unclear, and ineffective communication of ideas.
50
+
51
+ - **2:** Basic communication, some clarity and structure but with errors or lack of coherence.
52
+
53
+ - **3:** Good communication, clear and well-structured expression of ideas, minor imperfections.
54
+
55
+ - **4:** Excellent written communication, clear, coherent, and compelling expression of ideas, integrating various writing styles and media effectively.