The request

From Jordan Reyes, Head of Marketing
Your goal
Build a table with one row per day of 2025 on which marketing_spend has a 'paid' row: paid_spend (that day's amount) and paid_sessions (the number of web sessions that day with source 'paid', 0 if none). Set result to the correlation between paid_spend and paid_sessions (pandas' default, Pearson), a float rounded to 2. Draw it with sns.regplot.
- Use the
web_sessionsDataFramenot done yet - Use the
marketing_spendDataFramenot done yet - Store a number in
resultnot done yet
Your code
Loading the editor…
Reference solution
| session_id | customer_id | started_at | device | source |
|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic |
Mote checks your result
Press Run. Each row that matches the goal becomes a firefly in your lantern.
What Jordan gets, and why
DataFrames
Loaded for you as pandas DataFrames, plus pd and np.
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 |
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 |
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 |
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 |
The lesson
One number for “moving together”
The correlation coefficient r measures how closely two numbers follow a straight-line relationship. It runs from -1 to +1:
- the sign is the direction: + means they rise together, - means one rises as the other falls;
- the size is the strength: as a rough guide, above 0.7 is strong, 0.3 to 0.7 moderate, below 0.3 weak;
- 0 means no straight-line relationship (there could still be a curved one).
In pandas it’s one call on two Series of the same length, lined up row by row:
daily["paid_spend"].corr(daily["paid_sessions"]) # about 0.65
That’s pandas’ default, Pearson’s r. method="spearman" gives a rank-based version that is less
sensitive to a few extreme days.
Lining the data up first
Correlation compares row 1 with row 1, row 2 with row 2. So both numbers must describe the same thing, here the same day. Spend has one row per day and channel; sessions have one row per visit. Count the visits per day, then merge them onto the spend days:
per_day = visits.groupby("day").size().rename("paid_sessions").reset_index()
spend_days = paid[["spend_date", "amount"]].rename(columns={"spend_date": "day", "amount": "paid_spend"})
daily = spend_days.merge(per_day, on="day", how="left").fillna({"paid_sessions": 0})
The left merge keeps every spend day, and fillna gives 0 to days with no paid visits. Those zero
days are real observations; dropping them would hide the low end of the relationship.
Seeing it: scatterplot and regplot
sns.scatterplot(data=daily, x="paid_spend", y="paid_sessions") draws one dot per day.
sns.regplot draws the same dots plus a fitted straight line and a shaded band around it showing
how uncertain the line is. It’s the np.polyfit line from chapter 11 in one call:
ax = sns.regplot(data=daily, x="paid_spend", y="paid_sessions",
scatter_kws={"alpha": 0.35}, line_kws={"color": "#c0392b"})
With r around +0.65, days with higher spend tend to have more paid visits, but the dots are far from a line: plenty of high-spend days had few visits. Report it as “paid spend and paid visits are clearly associated”, with the number. Both also rise in November and December, so part of this link is the season itself, which the next levels deal with.
Common mistakes
- Correlating columns that aren’t aligned on the same unit (one row per day on both sides).
- Calling r = 0.65 “65% of visits are explained by spend”. r is not a percentage.
- Reading only the size and forgetting the sign, or the other way round.
- Writing “spend causes visits”. Correlation shows that they move together, not why.
Lantern lit!
Practised: correlationcorrregplotscatterplotpearson r
- Solved
- No hints
- First run
