The request

From Megan Collins, Head of Sales
Your goal
Set result to a dict with two keys: "mean", the mean of completed["order_value"], and "median", its median, both rounded to 2 decimals.
- Use the
ordersDataFramenot done yet - Use the
order_itemsDataFramenot done yet - Store a dict in
resultnot done yet
Each bar counts the orders in a $100 range. The 2% of orders above $3,000 run off to the right, up to $11,103, and are not drawn.
Show the numbers
| Order value ($100 bins) | Orders |
|---|---|
| $0 to $100 | 2,845 |
| $100 to $200 | 1,710 |
| $200 to $300 | 1,201 |
| $300 to $400 | 933 |
| $400 to $500 | 670 |
| $500 to $600 | 528 |
| $600 to $700 | 413 |
| $700 to $800 | 356 |
| $800 to $900 | 287 |
| $900 to $1,000 | 227 |
| $1,000 to $1,100 | 195 |
| $1,100 to $1,200 | 184 |
| $1,200 to $1,300 | 142 |
| $1,300 to $1,400 | 131 |
| $1,400 to $1,500 | 93 |
| $1,500 to $1,600 | 90 |
| $1,600 to $1,700 | 130 |
| $1,700 to $1,800 | 76 |
| $1,800 to $1,900 | 62 |
| $1,900 to $2,000 | 49 |
| $2,000 to $2,100 | 66 |
| $2,100 to $2,200 | 40 |
| $2,200 to $2,300 | 42 |
| $2,300 to $2,400 | 22 |
| $2,400 to $2,500 | 27 |
| $2,500 to $2,600 | 28 |
| $2,600 to $2,700 | 16 |
| $2,700 to $2,800 | 19 |
| $2,800 to $2,900 | 22 |
| $2,900 to $3,000 | 17 |
| above $3,000 (not drawn) | 224 |
Your code
Loading the editor…
Reference solution
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace |
Mote checks your result
Press Run. Each row that matches the goal becomes a firefly in your lantern.
What Megan gets, and why
DataFrames
Loaded for you as pandas DataFrames, plus pd and np.
orders12,000 rows · 7 columns
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NaN |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NaN |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 rows · 6 columns
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
customers2,018 rows · 9 columns
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NaN |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NaN |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NaN |
products120 rows · 8 columns
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NaN | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
returns1,673 rows · 5 columns
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 rows · 8 columns
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NaN | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 rows · 7 columns
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NaN | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 rows · 3 columns
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
The lesson
Two kinds of middle
The mean is the sum of the values divided by how many there are. The median is the value in the middle once you sort them: half the values are below it, half above. On a column without extreme values the two are close. On Harbor & Pine’s order values they are far apart:
completed["order_value"].mean() # 543.30
completed["order_value"].median() # 268.94
The mean is twice the median. That gap is the first thing to notice about any column.
Why the mean moves and the median doesn’t
The mean uses every value’s size. One order of $11,103 adds as much to the total as forty orders of $270, so a few big orders drag the mean up. The median only cares about order: make the biggest order ten times bigger and the median does not move at all.
Look at the chart. Most orders sit on the left, under $500, and a long thin tail stretches right to $3,000 and beyond. Data shaped like this is called right-skewed. Money, quantities, session lengths and salaries are almost always right-skewed, which is why the question “mean or median?” comes up in nearly every analysis.
(completed["order_value"] < completed["order_value"].mean()).mean() # 0.70
Seven in ten orders are below the average. A campaign aimed at “customers who spend $540” is aimed at the top 30%.
Which one to report
- Typical customer, typical order, typical salary: the median. It describes a real, middle case.
- Totals and planning: the mean. Revenue = mean order value × number of orders, which is why finance teams use it, and that is correct for their question.
- Both, side by side, whenever the audience might read one as the other. “Average order $543 (half of orders are under $269)” is one honest line.
Common mistakes
- Calling the mean “typical”. On skewed data the mean is pulled toward the tail and describes nobody in particular.
- Dropping big orders to “fix” the mean. They are real customers. Report the median instead of deleting data you don’t like. (Level 5 covers values that really are errors.)
- Comparing means of groups with different tails. A segment with a few huge orders can have a higher mean and a lower median than another. Check both before you say one group “spends more”.
Interview note
“When would you use the median instead of the mean?” is a standard screening question. The answer they want: when the data is skewed or has outliers, because the median is resistant to extreme values. Add a business example like this one and you have a strong answer.
Lantern lit!
Practised: meanmedianskewcentral tendency
- Solved
- No hints
- First run
