Free through lesson 3

Practical Data Analysis Course

From framing questions and defining metrics, through SQL aggregation, joins, and window functions, pandas preprocessing, and matplotlib visualization, all the way to cohorts, funnels, RFM, and A/B testing. Across 30 lessons you'll go from looking at data to actually making decisions with it. Every result shown comes from real output run against a fixed dataset from a fictional e-commerce shop.

Curriculum

The 30 lessons are split into 6 chapters. We recommend working through them in order starting from Chapter 1, but feel free to skim just the parts you're curious about. * Lessons that use SQL, pandas, or matplotlib can't run in the browser. Try them in the Python 3.14 virtual environment you set up in lesson 1 (SQL uses the standard library's sqlite3). Small calculations that only need the standard library can still run right there.

Chapter 1 — What to Decide Before You Analyze (lessons 1–4)

Before writing a query, break your question down into a metric, a target, and a time period, define that metric in code, and build a map of which tables hold how many rows. We finish by covering pitfalls that can throw off your conclusions even with a correct query, like cancelled orders sneaking into totals and the trap of averaging averages.

Chapter 2 — Extracting Data with SQL (lessons 5–11)

Use aggregate functions and GROUP BY to see the whole picture and its breakdown, then shape the data you need with joins, subqueries, window functions, and date rounding. We finish by combining revenue, order count, AOV, and the top category into a single summary.

5

Summarize the Whole Table in One Row with Aggregates

Summarize a products table into a single row with COUNT, SUM, AVG, MIN, and MAX. The difference between COUNT(*) and COUNT(column), and how AVG excludes NULLs from its denominator.

🔒 Basic
6

Break Down Data with GROUP BY and Conditional Aggregates

Get revenue by category with GROUP BY, and counts of completed vs. cancelled orders via conditional aggregation. Which columns you can put in SELECT, and the difference between WHERE and HAVING.

🔒 Basic
7

Connect Orders, Line Items, and Products with JOIN

When quantity, price, and status live in separate tables, use JOIN to compute the amount per order. The difference between INNER and LEFT, and the granularity trap where a join multiplies your rows.

🔒 Basic
8

Use Subqueries and CTEs to Filter on an Aggregate

Find customers who ordered more than average using a subquery. Use NOT IN to find products that have never sold, and clean up nested queries with a CTE.

🔒 Basic
9

Add Running Totals Alongside Rows with Window Functions

Unlike GROUP BY, a window function attaches an aggregate without collapsing rows. Use SUM() OVER for a running monthly total, plus rankings, moving averages, and month-over-month comparisons.

🔒 Basic
10

Round Dates to Year-Month for Monthly Aggregates

Round dates to year-month with strftime to get monthly revenue and find April's peak. String comparison, time zones, how periods close, and zero-revenue months disappearing from results.

🔒 Basic
11

[Project] Build a Revenue Summary in SQL

Combine aggregation, joins, and exclusions into one summary of revenue, order count, AOV, and top category. Why you count orders after a join with COUNT(DISTINCT), split between SQL and pandas.

🔒 Basic

Chapter 3 — Cleaning Up the Data (lessons 12–17)

Load the data you pulled with SQL into pandas and shape it into an analyzable form by handling missing values, outliers, merges, and pivots. We finish by wrapping the whole process into a function so preprocessing gives the same result every time you run it.

Chapter 4 — Showing the Data (lessons 18–22)

Pick the right chart for your question and draw line, bar, and histogram charts with matplotlib, then combine two of them into a dashboard. We finish by looking at misleading chart tricks — like truncating the y-axis to exaggerate a difference — and how to avoid them.

Chapter 5 — Standard Analyses (lessons 23–27)

Try out the analysis patterns you'll use again and again on the job — cohorts, funnels, RFM, time-series trends, and A/B testing — all on the same e-commerce data. We finish by using a statistical test to tell whether the difference between two options is real or just chance, so you don't adopt something just because the number went up.

Chapter 6 — Communicating Results (lessons 28–30)

Turn your analysis into a report structured as conclusion → evidence → next step, going beyond a mere observation to a recommendation that drives a decision. We finish by combining everything from extraction to write-up into a single pipeline that can run automatically on a schedule.

Once you finish all 30 lessons, move on to Intro to Python & Machine Learning, where you'll build predictive models on the same pandas foundation. All courses unlock with a membership.