learn-python-data-analysis-with-phoebe / Session 1 of 8
Learn Python Data Analysis with Phoebe · Session 1 of 8

Set up, and meet the mission

Get a real data-analysis workspace running - conda, Jupyter, pandas - and load the one dataset you'll carry through all eight sessions: 124,000 real LinkedIn job postings. By Session 8 you turn it into a shareable "state of the data job market" report. Today, you load it and take your first look.

🟢 Easiest Builders Knows a little Python 45 min live + self-study
0-3 · Welcome 3-18 · Concepts 18-40 · Set up & first look 40-45 · Q&A
Part 0

Why this course exists

Most people learn pandas as a pile of disconnected tricks - a groupby here, a plot there - and never feel like an analyst. This course fixes that with one real, messy dataset and one real question: what does the data job market actually look like? You'll load it, clean it, interrogate it, chart it, and by Session 8 ship a report you'd be proud to post. Every method you learn earns its place by moving that project forward. This is the hands-on sequel to learn-python-with-phoebe - if you can write a loop and a function, you're ready.

Live - presented in session Self-study - read after class ★ Build-along demo The project: the data job market
★ What you walk out with today A clean conda environment with the full analysis stack installed, Jupyter running, the 124k-row LinkedIn dataset loaded into a DataFrame, and your first honest look at it - shape, dtypes, and a one-line automated profile that already tells you where the mess is.
Part 1 · covers the pandas / NumPy stack intro

The data-analysis stack 5 min live

Four libraries do 95% of Python data analysis, and they stack. Understand the stack once and every tutorial you read afterward slots into place.

Jupyter notebook the workbench - code, output, and charts in one place matplotlib the plotting engine seaborn statistical charts, prettier pandas tables you actually work in - the DataFrame - load, clean, group, join NumPy the fast numeric core - arrays and vectorized math under everything above You'll touch all four this course - bottom to top, one session at a time.
🔍 Click to zoom - the stack: NumPy at the base, pandas on top, matplotlib + seaborn to see it, Jupyter to hold it all
LiveWhy the stack, not one giant library3 min

Each layer does one thing well and hands off to the next. pandas doesn't reinvent fast math - it sits on NumPy. seaborn doesn't redraw pixels - it drives matplotlib. That separation is why the ecosystem moves fast and why your skills transfer: learn the DataFrame once and it works whether you're plotting, modeling, or exporting.

  • NumPy is the base: arrays and vectorized math, thousands of times faster than Python loops (Session 2).
  • pandas is where you live: labeled tables - the DataFrame - for loading, cleaning, grouping, joining (Sessions 3-5).
  • matplotlib + seaborn turn tables into pictures (Sessions 6-7).
  • Jupyter is the workbench: you write a line, run it, see the table or chart immediately - the tight feedback loop that makes analysis feel alive.
Real world

Ask an analyst what tool they use and they'll say "pandas" - but every pandas session is quietly standing on NumPy, and every chart they paste into a deck came out of matplotlib. Knowing the stack means when something breaks, you know which layer to look at.

Self-studyWhere the profiling libraries fit2 min read

Three small libraries save hours by showing you the mess before you touch it - we install them today and lean on them in Session 4:

LibraryWhat it gives youUsed in
ydata-profilingOne line -> a full HTML report: every column's distribution, missing %, correlations, warningsSession 1 first look
missingnoVisual maps of missingness - matrix, bar, heatmap - so gaps become patterns you can seeSession 4 cleaning
sweetvizA prettier profile + easy two-dataset comparisonSelf-study alternative
Profile before you fix The discipline this whole course teaches: look at the data honestly first, decide second. Guessing at cleaning steps before you've seen the shape of the mess is how analyses go wrong quietly.
Part 2 · covers the environment setup

Your workspace, cleanly 5 min live

One isolated environment with everything pinned. Do this once and you never fight version conflicts mid-analysis. We use conda - it handles Python and the scientific packages together.

LiveCreate the environment3 min · then Demo 1
★ Create + activate the analysis environment# one environment, everything this course needs, pinned to Python 3.11 conda create -n data-analysis python=3.11 pandas numpy matplotlib seaborn jupyter scikit-learn -y # turn it on (do this every time you sit down to work) conda activate data-analysis # the two profiling helpers live on pip pip install ydata-profiling missingno sweetviz

An environment is a sealed box of package versions. Naming it after the project (data-analysis) means next month's project gets its own box and nothing collides. If you prefer plain venv and pip, that works too - the package list is the same.

LiveLaunch Jupyter and sanity-check2 min
★ Start the workbench# from your project folder, with the env active: jupyter lab # a browser tab opens - make a new notebook, then run this in the first cell:
★ First cell - prove the stack is aliveimport pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns print("pandas", pd.__version__) print("numpy", np.__version__) # no errors = you're ready
pd, np, plt, sns These four import aliases are universal - every tutorial, every Stack Overflow answer uses them. Type them enough this week that they become muscle memory.
Self-studyNotebook habits that keep you sane2 min read
  • Run top to bottom before you trust it. Out-of-order cells lie. Restart kernel + Run All is your reality check.
  • One idea per cell. Small cells make it obvious which line broke and let you re-run cheaply.
  • Keep the raw file untouched. Never overwrite the CSV you downloaded - load it, transform a copy, save outputs under new names. Your ground truth stays clean.
  • Markdown cells are free. A one-line note above a block ("parsing salary into a number") turns a notebook into something future-you can read.
Part 3 · covers the analysis lifecycle

The analysis workflow 3 min live

Every real analysis walks the same six steps. This course is those steps, one per session block - so the skill you build is the workflow itself, not just the syntax.

1 · Load 2 · Profile 3 · Clean 4 · Explore 5 · Visualize 6 · Report read the CSVs in see the mess honestly fix types, NAs, salaries, dupes group, join, ask questions charts that carry the point findings + a model, shared Sessions map onto these steps: 1 load - 2 numpy - 3 pandas - 4 clean - 5 explore - 6/7 visualize - 8 report.
🔍 Click to zoom - the six steps every analysis walks, and where each session lands
LiveThe step people skip - and pay for2 min

Step 2, profile, is the one beginners skip and experts never do. Jumping from load straight to charts means you plot dirty data and draw confident wrong conclusions. Ten minutes profiling saves ten hours of "wait, why is the average salary $2 million?" (answer: three rows had salary in cents, and you never looked).

Real world

A classic job-market analysis went viral for claiming a median data-science salary far above reality. The cause: the dataset mixed hourly, monthly, and yearly pay in one column and nobody profiled it. Correct step 2, correct headline. Skip it, mislead thousands.

Part 4 · the running project

One dataset, eight sessions 2 min live

The whole course is one build. No toy tables - by Session 8 you've produced a real report on a real labor market, from a dataset with real problems.

1 · Setup 2 · NumPy 3 · pandas 4 · Clean 5 · Explore 6 · Matplotlib 7 · Seaborn 8 · Report load 124k postings fast arrays under pandas select, filter NAs, dtypes, salary parse groupby, join tables plot the market polish + stats charts findings + salary model Missed a session? Each page stands alone, and the dataset is one download away - jump back in at any step.
🔍 Click to zoom - the roadmap: one dataset carried from raw download to shareable report
LiveThe dataset and the deliverable2 min

We use LinkedIn Job Postings (2023-2024) from Kaggle - about 124,000 postings across several linked tables (postings, companies, skills, salaries). It's genuinely messy: roughly 70% of postings have no salary, pay is split across min/max/period columns, job titles are free text, and there are duplicates. That mess is not a bug - it's the curriculum.

  • The question: what does the data / analytics / AI job market look like - which roles, which skills, what pay, where?
  • The deliverable (Session 8): a tight report - five charts, five findings, and a simple model that predicts salary from role and location - clean enough to post on LinkedIn with your name on it.
Get the data before next session Download it in Demo 2's steps. It's free with a Kaggle account. If versions have shifted, the column names in later sessions still map - we profile first every time.
Demo 1 of 3

Environment + Jupyter, live ★ 8 min · everyone sets up

Run the Part 2 create command. While it resolves (a minute or two), make a project folder: mkdir data-job-market && cd data-job-market.

conda activate data-analysis, then pip install ydata-profiling missingno sweetviz.

jupyter lab - a browser tab opens. New notebook, rename it 01-first-look.ipynb.

Run the Part 2 "prove the stack is alive" cell. Two version numbers, no errors - you're operational.

Install stuck or slow? conda solving can be slow on older machines. Keep going in a neighbor's notebook or use pip install for everything - fix conda after class. Today's win is the first look, not the plumbing.
Demo 2 of 3

Load the data, take the first look ★ 10 min · everyone loads

Download the dataset from Kaggle (kaggle.com/datasets/arshkon/linkedin-job-postings), unzip it into your project folder.

Load the main table and look at its shape and first rows:

★ Load + first lookimport pandas as pd jobs = pd.read_csv("postings.csv") jobs.shape # (rows, columns) - how big is this thing? jobs.head() # first 5 rows - what do the columns look like? jobs.columns.tolist() # the full column list
★ The three questions every dataset answersjobs.info() # dtypes + non-null counts per column -> where are the gaps? jobs.describe() # summary stats for numeric columns jobs.isna().mean().sort_values(ascending=False).head(10) # % missing, worst columns first
Real world

Watch what isna().mean() shows: the salary columns light up near 70% missing. You haven't written a cleaning line yet and the data has already told you its biggest problem. That's the whole point of looking first - the dataset briefs you if you let it.

Demo 3 of 3

One-line automated profile ★ 4 min · follow along

Let ydata-profiling do in one line what would take an hour by hand:

★ Full profile reportfrom ydata_profiling import ProfileReport # sample for speed on 124k rows - full run works too, just slower report = ProfileReport(jobs.sample(5000, random_state=42), title="LinkedIn jobs - first profile", minimal=True) report.to_notebook_iframe() # renders inline in Jupyter # or: report.to_file("first-profile.html") # a shareable HTML file

Scroll the report: distributions, missing-value counts, correlations, and a "Warnings" tab that flags high-cardinality and missing columns for you.

Write one markdown cell: the three things this profile tells me about the data. That note is your cleaning to-do list for Session 4.

random_state=42 Pinning the seed means your sample - and everyone else's - is identical and reproducible. Every analysis in this course sets a seed. Reproducible or it didn't happen.
After the session

This week ◐ 30 min total

Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · In the analysis stack, what sits at the base, under pandas?

pandas is built on NumPy arrays. Learn the base and everything above it makes more sense - that's Session 2.

2 · Why profile the data (step 2) before cleaning or charting?

Skip the look and you plot dirty data. Ten minutes profiling saves ten hours of chasing a wrong headline.

3 · What did isna().mean() reveal about the LinkedIn dataset?

The dataset briefs you if you let it. Missing salary is the mess Session 4 tackles head-on.

Source material

Official sources covered

This session teaches the working content of the official pandas and NumPy docs, the free Kaggle micro-courses, and Wes McKinney's open-access Python for Data Analysis (3e). Certificates, graded exercises, and videos stay on those platforms - links provided.

Environment + Jupyter setup (pandas / conda docs)create env, launch Jupyter, import aliases - Part 2 + Demo 1
Kaggle Pandas L1 - Creating, Reading and Writingread_csv, shape, head - Demo 2
McKinney ch1-2 - Preliminaries, IPython & Jupyterthe stack, the notebook workflow - Parts 1-2
ydata-profiling quickstartProfileReport, minimal mode, to_file - Demo 3
McKinney ch6 - Data Loading, Storage, File Formatsread_csv here; full IO options in Sessions 4-5

Session 1 cheat sheet · pin this

The stackNumPy (base) -> pandas (tables) -> matplotlib + seaborn (charts) -> Jupyter (workbench). Bottom to top.
Set upconda create -n data-analysis python=3.11 pandas numpy matplotlib seaborn jupyter scikit-learn; then conda activate + jupyter lab.
Importsimport pandas as pd, numpy as np; import matplotlib.pyplot as plt, seaborn as sns. Universal aliases.
Loaddf = pd.read_csv("file.csv") - then df.shape, df.head(), df.columns.tolist().
First lookdf.info() for dtypes + nulls · df.describe() for numeric stats · df.isna().mean() for % missing.
Profile firstProfileReport(df.sample(5000, random_state=42)).to_notebook_iframe(). Look before you fix.