roadmap · learn

The whole roadmap, explained.

Read the idea, study the visual, then hit practice. The cheat sheet is one tap away the whole time.

Module 1

Foundations

Before any tool: what the job actually is, and the mental model everything else hangs on.

The idea

A data analyst turns a fuzzy question — "why did sales drop?" — into a defensible answer backed by data. You don't do that in one leap. You run a loop, every time.

The analyst loop · runs on every question
1
Question
Pin down what you're actually being asked.
2
Get data
Pull the rows that could answer it (usually SQL).
3
Clean
Fix types, gaps, duplicates before you trust anything.
4
Explore
Look at the shape, find where the movement is.
5
Visualize
Make the finding obvious in one chart.
6
Tell
One sentence + a recommendation someone can act on.
In practice

"Why did sales drop?" becomes: pull 12 months of orders → clean the messy dates → group by region → spot that South fell 12% → chart it → "South revenue fell 12% after the May price change — review pricing there."

Deep dive · how data is shaped
Rows are records (one order). Columns are fields (amount, region). A key is the column that uniquely identifies a row (order_id) and lets tables link. Get this model straight and SQL and pandas both stop feeling like magic.
Practice Foundations ›
Module 2

SQL

SQL is how you ask a database a question. Every query is the same skeleton — learn the parts and the order they run in.

The skeleton

You write SELECT first, but the database runs it almost last. That single fact explains most beginner confusion (like why you can't use a SELECT alias inside WHERE).

How a query actually runs (not the order you type it)
1
FROM / JOIN
Grab the tables and combine them.
2
WHERE
Filter individual rows.
3
GROUP BY
Collapse rows into groups.
4
HAVING
Filter the groups.
5
SELECT
Pick columns & compute aggregates.
6
ORDER BY
Sort the result.
7
LIMIT
Keep the top N.
What each part does
Function reference · when to reach for what
SELECT
Choose columns to return, or compute new ones.
WHERE
Keep only rows that match a condition. Runs before grouping.
GROUP BY + SUM/COUNT/AVG
One row per group, with a number rolled up per group.
HAVING
Filter the groups after aggregating (e.g. spend > 250).
ORDER BY
Sort ascending/descending. Sort by an alias you made in SELECT.
RANK() OVER (...)
Rank or run totals across rows without collapsing them.
JOIN types
INNER vs LEFT · the two you use 95% of the time
INNER JOIN
Only rows that match in both tables.
LEFT JOIN
Every left row; right columns are NULL when nothing matches.
GROUP BY vs window
Same math, different shape of result
GROUP BY · collapses
North490
South950
8 rows → 2 rows. You lose the detail.
WINDOW · keeps rows
Ana120490
Diogo200490
8 rows stay 8 rows, with the total added alongside.
See it
-- revenue per region, biggest first
SELECT region, SUM(amount) AS revenue
FROM orders
GROUP BY region
ORDER BY revenue DESC;
Deep dive · the traps that bite everyone
WHERE vs HAVING: WHERE filters rows before grouping; HAVING filters groups after.  COUNT(*) vs COUNT(col): COUNT(*) counts rows, COUNT(col) skips NULLs.  The LEFT JOIN trap: adding WHERE right.col IS NOT NULL silently turns your LEFT JOIN back into an INNER JOIN.
Practice SQL ›
Module 3

Python · pandas

pandas is SQL for your laptop. A DataFrame is just a table — and every operation you know in SQL has a twin here.

The verbs
The six moves that cover most analysis
1
Load  pd.read_csv()
Pull a file into a DataFrame.
2
Inspect  .head() .info()
Look before you touch anything.
3
Select  df["col"]
Pick columns.
4
Filter  df[df.x > 100]
Keep rows matching a mask.
5
Group  .groupby()
Roll up per category.
6
Sort  .sort_values()
Order the result.
SQL ↔ pandas
Same idea, two languages
SQLpandas
WHERE region='South'df[df.region=='South']
SELECT customer, amountdf[['customer','amount']]
GROUP BY regiondf.groupby('region')
ORDER BY amount DESCdf.sort_values('amount', ascending=False)
How a filter really works
Boolean masks · the thing inside the brackets
the mask
120True
80False
540True
df["amount"] > 100 makes a True/False column.
the result
120
540
df[mask] keeps only the True rows.
Deep dive · the two that trip people up
Combine filters with & and | (not and/or), and wrap each condition in parentheses: df[(df.a>1) & (df.b<9)].  .loc selects by label, plain [] is fine for quick column/row grabs.
Practice Python ›
Module 4

Data Cleaning

Real data is dirty. Cleaning is 80% of the job — and it's judgment, not just code.

The order to clean in
Cleaning pipeline · always inspect first
1
Inspect
.info(), .describe(), value counts. Don't fix blind.
2
Types
Numbers-as-text and string dates — the silent killers.
3
Missing
Decide: drop, fill, or flag (see below).
4
Duplicates
drop_duplicates() — but check they're truly dupes.
5
Outliers
Look before you delete — it might be the real story.
The missing-value decision
No default answer — it depends on why it's missing
Drop · few rows, and randomly missing
dropna()
Fill · you can estimate it (median, or qty×price)
fillna()
Flag · the missingness itself means something
is_missing
Deep dive · the silent killer
A column of numbers stored as text will happily "sort" as 1, 100, 2, 20 and silently break every calculation. Check df.dtypes early. Same with dates stored as strings — parse them with pd.to_datetime before you trust any time analysis.
Practice Cleaning ›
Module 5

Exploratory Analysis

Explore before you conclude. Describe the shape, find relationships, and — the real skill — ask sharper questions.

Read the distribution
Shape first · the average lies when data is skewed
Normal
Mean ≈ median. The average is trustworthy.
Right-skewed
A few big values drag the mean up. Use the median.
The one you must say out loud
Correlation ≠ causation

Ice-cream sales and drownings both rise together — but ice cream doesn't cause drowning. Summer (heat) drives both. When two things move together, look for the hidden third thing before you claim one causes the other.

Deep dive · ask a better question
"Explore the data" is a trap — it has no finish line. Convert it into three specific, answerable questions first: "Which region grew fastest?" "What share comes from the top 5 customers?" "Did revenue change after May?" Specific questions get answered; vague ones get abandoned.
Practice EDA ›
Module 6

Visualization

Pick the right chart, strip the clutter, and make the title the takeaway. In that order.

Pick the chart
Chart picker · match the chart to the question
Compare categories  across a few groups
Bar
Trend over time
Line
Relationship  between two numbers
Scatter
Distribution  of one variable
Histogram
The title does the work
Topic title vs takeaway title
✗ topic
"Revenue over time"
Makes the reader do the work.
✓ takeaway
"Revenue fell 18% after May"
The point lands before they read the axes.
Deep dive · the honesty rules
Bar charts must start at zero — a truncated axis exaggerates differences and is misleading. (Line charts don't have to.) Sort bars by value unless the category has a natural order. Color means something — highlight the one series that matters; don't rainbow everything.
Practice Visualization ›
Module 7

Communicating Insights

The best analysis dies in silence if you can't land it. Two tools: the one-sentence takeaway, and a 4-beat structure.

The structure that gets you heard
The 4-beat data story
1
Context
What's normal / what we expected.
2
Conflict
The surprise in the data — the tension.
3
Answer
What the data actually shows, with the number.
4
Recommendation
What to do about it. Never skip this one.

If you can't state the finding in one sentence, you don't have it yet. "Flat revenue is hiding a 30% swing between markets" beats a paragraph every time.

Practice Storytelling ›
Module 8

Leverage AI

AI makes an analyst faster — if you use it for the right things. The rule: AI drafts, you verify.

The prompt pattern
Three parts turn a weak prompt into a strong one
Schema  · the tables & columns you have
+
Goal  · the exact metric / answer you want
+
Format  · dialect, comments, shape of output
=
Where it helps vs hurts
AI drafts, you verify
✓ great for
Boilerplate SQL/pandas · explaining errors · regex · first-draft chart code · renaming things
✗ risky for
Numbers it "calculated" but didn't show · guessing what a column means · skipping your own thinking
Deep dive · a prompt you can steal
"Tables: orders(id, customer, region, amount, order_date). Write SQL for total revenue per region for 2026 only, highest first. Standard SQL, and comment each clause."  — schema, goal, format, all in three lines.
Practice AI prompting ›
Read → practice → repeat · @ask.costafordata