{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "1d195ca8",
   "metadata": {},
   "source": [
    "# Day 1 — The Data Detective 🔍\n",
    "\n",
    "> **Mission briefing:** Welcome to the Lab, recruit. Before we let you anywhere near an AI model, you have to pass the entrance exam — and it isn't about code. Every powerful AI system is built on top of *data*, and a researcher who can't **read** their data ships broken models. This morning a crate of penguin measurements arrived from a field station in Antarctica. Interrogate it.\n",
    "\n",
    "**Today you will:**\n",
    "- Load a real dataset with **pandas** and size it up (`.head`, `.info`, `.describe`)\n",
    "- Hunt down **missing values** and clean the data\n",
    "- **Filter, group, and count** to answer real questions\n",
    "- **Plot** the data — and spot a pattern a machine could learn tomorrow\n",
    "\n",
    "*No neural networks today. Just you, the data, and a magnifying glass. Every researcher here will tell you the same thing: **AI is 80% understanding your data, and 20% everything else.***\n",
    "\n",
    "<details data-resource-precision=\"1\"><summary>A precise reading</summary><p>This course focuses on learning from data. AI also includes rule-based and search systems. Tables are a useful starting point, but images, audio and text need representations suited to their structure.</p></details>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ab94664c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ╔═══════════════════════════════════════════════════════════════════╗\n",
    "# ║ SETUP — run me first! (identical in every Lab notebook)           ║\n",
    "# ╚═══════════════════════════════════════════════════════════════════╝\n",
    "import os, sys, pathlib\n",
    "\n",
    "IN_COLAB = \"google.colab\" in sys.modules\n",
    "SMOKE = os.environ.get(\"SMOKE_TEST\", \"0\") == \"1\"   # tiny fast run for automated tests\n",
    "\n",
    "REPO_URL = \"https://github.com/A-Halimi/ai-studio-internship.git\"  # instructor: set once\n",
    "\n",
    "if IN_COLAB:\n",
    "    if not pathlib.Path(\"/content/ai-studio-internship\").exists():\n",
    "        !git clone -q {REPO_URL} /content/ai-studio-internship\n",
    "    %cd /content/ai-studio-internship/notebooks/day01\n",
    "\n",
    "HERE = pathlib.Path.cwd()\n",
    "REPO = HERE.parents[1]                       # .../notebooks/dayNN -> repo root\n",
    "DATA_DIR = pathlib.Path(os.environ.get(\"COURSE_DATA_DIR\", REPO / \"data\"))\n",
    "SAMPLES_DIR = REPO / \"data_samples\"          # small datasets shipped with the repo\n",
    "MODELS_DIR = REPO / \"ai_studio\" / \"models\"   # where your Studio modules unlock\n",
    "for p in (REPO / \"data\", MODELS_DIR):\n",
    "    p.mkdir(parents=True, exist_ok=True)\n",
    "\n",
    "import random\n",
    "import numpy as np\n",
    "SEED = 42\n",
    "random.seed(SEED); np.random.seed(SEED)\n",
    "print(f\"✅ Setup done | Colab: {IN_COLAB} | Smoke test: {SMOKE}\")\n",
    "print(f\"   data: {DATA_DIR}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "929e8249",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "pd.set_option(\"display.max_columns\", None)   # never hide a column when we print\n",
    "print(\"Detective toolkit loaded 🕵️\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8415d2ab",
   "metadata": {},
   "source": [
    "## 🐧 Meet the suspects\n",
    "\n",
    "Our data comes from **Palmer Station, Antarctica**, where researchers measured hundreds of penguins from **three species**:\n",
    "\n",
    "| Species | How to spot it |\n",
    "|---|---|\n",
    "| **Adelie** | The classic tuxedo penguin, found all over the peninsula |\n",
    "| **Chinstrap** | Named for the thin black line under its chin |\n",
    "| **Gentoo** | The big one, with a bright orange bill |\n",
    "\n",
    "For each penguin they recorded four **body measurements**, plus which **island** it lived on and its **sex**:\n",
    "\n",
    "- `bill_length_mm`, `bill_depth_mm` — the beak\n",
    "- `flipper_length_mm` — the \"wing\"\n",
    "- `body_mass_g` — weight in grams\n",
    "\n",
    "One **row** is one penguin. One **column** is one thing we measured. Rows are examples, columns are features — this is *exactly* how almost all machine-learning data is organized. Get comfortable with the shape."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f0a543c5",
   "metadata": {},
   "source": [
    "### Step 1 — Load the evidence\n",
    "\n",
    "`pandas` is the tool every data scientist reaches for first. It reads a spreadsheet-like file into a **DataFrame** — think of it as a programmable Excel sheet. `.head()` shows the first few rows so we can eyeball what we are dealing with."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c5d43565",
   "metadata": {},
   "outputs": [],
   "source": [
    "penguins = pd.read_csv(SAMPLES_DIR / \"penguins.csv\")\n",
    "print(f\"Loaded {len(penguins)} penguins, {penguins.shape[1]} columns each.\")\n",
    "penguins.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8e450a7",
   "metadata": {},
   "source": [
    "### Step 2 — Size it up\n",
    "\n",
    "Two commands you will run on *every* new dataset for the rest of your career:\n",
    "\n",
    "- **`.info()`** — how many rows, the type of each column, and how many values are actually *present* (non-null). The place to spot **missing** data.\n",
    "- **`.describe()`** — count, mean, min, max, and quartiles for every number column. The place to spot **weird** values (a penguin weighing 0 g? a typo?)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "810f6e17",
   "metadata": {},
   "outputs": [],
   "source": [
    "penguins.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c83c308a",
   "metadata": {},
   "outputs": [],
   "source": [
    "penguins.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b41d8e1",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 1 — Count the gaps\n",
    "\n",
    "Real data is messy. Some penguins are missing measurements — maybe a pen ran dry, maybe a bird wriggled free before the scale settled.\n",
    "\n",
    "- Compute how many values are **missing** in each column and store it in `missing_per_column`.\n",
    "- **Expected:** a couple of missing body measurements, and about a dozen missing `sex` values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "57939a6d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# How many values are missing in each column?\n",
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: penguins.isna() marks every cell True (missing) or False\n",
    "### HINT: chain .sum() on that to count the missing values per column\n",
    "...\n",
    "print(missing_per_column)\n",
    "\n",
    "assert missing_per_column.sum() == 19, \"Expected 19 missing values in total across all columns.\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1b9e8535",
   "metadata": {},
   "source": [
    "### Step 3 — Clean it up\n",
    "\n",
    "For today's investigation we want only penguins with a **complete** record. `dropna()` removes any row that has at least one missing value. We keep the original around and work on a clean copy called `df`.\n",
    "\n",
    "> ⚠️ Dropping rows is the quick fix, not always the *right* one — throwing away data can bias your results. Later in the Lab you will learn gentler repairs (filling a gap with a sensible guess). For 11 rows out of 344, dropping is fine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9a891ce5",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = penguins.dropna().reset_index(drop=True)\n",
    "print(f\"Before: {len(penguins)} penguins\")\n",
    "print(f\"After : {len(df)} penguins   ({len(penguins) - len(df)} dropped)\")\n",
    "assert len(df) == 333, \"A clean dataset should have 333 complete records.\"\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "14383426",
   "metadata": {},
   "source": [
    "## Ask questions, get answers\n",
    "\n",
    "A DataFrame is not just for looking at — it is for **interrogating**. Three moves answer almost any question about a dataset:\n",
    "\n",
    "- **Filter** — keep only the rows that match a condition\n",
    "- **Group** — split rows into buckets (e.g. by species) and summarize each bucket\n",
    "- **Count** — tally how often each value appears\n",
    "\n",
    "Let's use all three."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c343eeeb",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 2 — The heavyweights\n",
    "\n",
    "Find every penguin heavier than **5000 grams** (that's 5 kg — a chunky bird).\n",
    "\n",
    "- Build a filtered DataFrame called `heavy`.\n",
    "- **Expected:** around 60 penguins — and if you peek at their species, they will almost all be the *same* one. Remember which; it comes up again."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c5dd6410",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: a condition like df[\"body_mass_g\"] > 5000 gives True/False for every row\n",
    "### HINT: put that condition inside df[ ... ] to keep only the True rows\n",
    "...\n",
    "print(f\"{len(heavy)} penguins over 5000 g\")\n",
    "print(heavy[\"species\"].value_counts())\n",
    "\n",
    "assert len(heavy) > 40, \"That is fewer heavyweights than expected — check your condition.\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d34ddda4",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 3 — The average penguin, by species\n",
    "\n",
    "Split the penguins by species and compute the **mean** of every numeric column for each group.\n",
    "\n",
    "- Produce a table called `species_means`.\n",
    "- **Hint:** `.groupby(\"species\")` makes the buckets; `.mean(numeric_only=True)` averages the numbers (the `numeric_only=True` skips text columns like `island`).\n",
    "- **Expected:** one row per species, with Gentoo standing out as the biggest on nearly every measurement."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5fdcf63d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ==================== YOUR CODE HERE ====================\n",
    "...\n",
    "species_means"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e68891d3",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 4 — Who lives where?\n",
    "\n",
    "Count how many penguins were recorded on each **island**.\n",
    "\n",
    "- Store the result in `island_counts`.\n",
    "- **Expected:** three islands (Biscoe, Dream, Torgersen), with Biscoe hosting the most."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "26dec1c0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: .value_counts() on a single column tallies each distinct value\n",
    "...\n",
    "print(island_counts)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a2a83620",
   "metadata": {},
   "source": [
    "## See it to believe it\n",
    "\n",
    "Tables are precise but slow to read. A good plot shows a pattern in a glance. Start with a **histogram**: it slices a numeric column into bins and shows how many penguins land in each — the *shape* of the data.\n",
    "\n",
    "Here is one we made for you: body mass, drawn separately for each species so you can compare. Run it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5bb7c4a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.figure(figsize=(8, 5))\n",
    "for species, group in df.groupby(\"species\"):\n",
    "    plt.hist(group[\"body_mass_g\"], bins=20, alpha=0.6, label=species)\n",
    "plt.xlabel(\"Body mass (g)\")\n",
    "plt.ylabel(\"Number of penguins\")\n",
    "plt.title(\"Body mass by species\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fadb4d04",
   "metadata": {},
   "source": [
    "See how **Gentoo** (heavier) sits clearly to the right, while **Adelie** and **Chinstrap** overlap almost completely? Body mass alone can pick out a Gentoo — but it can't tell an Adelie from a Chinstrap. We need a smarter view."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fee6b6c5",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 5 — The scatter plot that changes everything\n",
    "\n",
    "A **scatter plot** puts one measurement on the x-axis and another on the y-axis, one dot per penguin. The magic move: **color each dot by species**. If the species land in separate regions, we have found structure a machine could learn.\n",
    "\n",
    "Plot **bill length** (x) against **bill depth** (y), one color per species.\n",
    "\n",
    "- Loop over the species; for each one, call `plt.scatter(...)` on just that group's rows with a `label=`.\n",
    "- The scaffold handles the axis labels and legend — you write the scatter loop.\n",
    "- **Expected:** three fairly distinct blobs of color."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2919246c",
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: for species, group in df.groupby(\"species\"):\n",
    "### HINT:     plt.scatter(group[\"bill_length_mm\"], group[\"bill_depth_mm\"], label=species, alpha=0.7)\n",
    "...\n",
    "plt.xlabel(\"Bill length (mm)\")\n",
    "plt.ylabel(\"Bill depth (mm)\")\n",
    "plt.title(\"Bill shape separates the species\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "36754286",
   "metadata": {},
   "source": [
    "### 🔍 The revelation\n",
    "\n",
    "Look at that. Each species forms its **own cluster** — a region of the plot where its penguins live. You could almost draw the dividing lines with a ruler.\n",
    "\n",
    "That is the whole idea behind tomorrow's mission. **If *you* can see the boundary, a machine can *learn* it.** Hand a computer these dots and their colors, and it can work out the dividing lines on its own — then color in a brand-new, unlabeled dot for you. That's called **classification**, and it's the first AI superpower you'll build. 🐧\n",
    "\n",
    "> **Why bill *length* and *depth*?** Because together they capture *shape*, not just size. Size (mass, flipper) mostly separates Gentoo from the rest; shape is what finally splits Adelie from Chinstrap."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "958a791b",
   "metadata": {},
   "source": [
    "### 🧪 Exercise 6 — What moves together?\n",
    "\n",
    "When one measurement goes up, do the others go up too? **Correlation** measures exactly that, from **+1** (perfect lockstep), through **0** (unrelated), to **−1** (perfect opposites).\n",
    "\n",
    "- Compute the correlation matrix of the four numeric columns and store it in `corr`.\n",
    "- We'll draw it as a **heatmap** so the strong pairs jump out.\n",
    "- **Hint:** select the four columns, then call `.corr()`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6725cbba",
   "metadata": {},
   "outputs": [],
   "source": [
    "numeric_cols = [\"bill_length_mm\", \"bill_depth_mm\", \"flipper_length_mm\", \"body_mass_g\"]\n",
    "# ==================== YOUR CODE HERE ====================\n",
    "...\n",
    "\n",
    "plt.figure(figsize=(6, 5))\n",
    "sns.heatmap(corr, annot=True, cmap=\"coolwarm\", vmin=-1, vmax=1, fmt=\".2f\")\n",
    "plt.title(\"Correlation between measurements\")\n",
    "plt.show()\n",
    "corr"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8488ccd",
   "metadata": {},
   "source": [
    "**Read the map.** The brightest off-diagonal square is **flipper length ↔ body mass** at about **+0.87** — long-flippered penguins are heavy penguins. That makes sense: both grow with the overall size of the bird.\n",
    "\n",
    "Notice that `bill_length` and `bill_depth` are only weakly (even negatively) correlated — which is *exactly* why they made such a good scatter plot. Two measurements that *don't* move together carry **independent** information, and independent information is what pulls the species apart."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e7b8bb2",
   "metadata": {},
   "source": [
    "## 🗒️ The Detective's Report\n",
    "\n",
    "Time to prove you can work solo.\n",
    "\n",
    "### 🧪 Exercise 7 — Close the case\n",
    "\n",
    "Answer three questions with **one line of pandas each** — no plots, just the value. Everything you need you have already used above.\n",
    "\n",
    "1. Which species is **heaviest on average**?\n",
    "2. Which **island** hosts the most **Gentoo** penguins?\n",
    "3. What is the **mean flipper length** of **Chinstrap** penguins?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d10478da",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1) Heaviest species on average\n",
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: group by species, take the mean body_mass_g, then .idxmax() names the winner\n",
    "...\n",
    "\n",
    "# 2) Island with the most Gentoo penguins\n",
    "# ==================== YOUR CODE HERE ====================\n",
    "### HINT: keep only Gentoo rows first, then value_counts the island column, then .idxmax()\n",
    "...\n",
    "\n",
    "# 3) Mean flipper length of Chinstrap penguins\n",
    "# ==================== YOUR CODE HERE ====================\n",
    "...\n",
    "\n",
    "print(f\"1. Heaviest species on average : {heaviest_species}\")\n",
    "print(f\"2. Island with most Gentoo     : {top_gentoo_island}\")\n",
    "print(f\"3. Chinstrap mean flipper (mm) : {chinstrap_flipper:.1f}\")\n",
    "\n",
    "assert heaviest_species == \"Gentoo\"\n",
    "assert top_gentoo_island == \"Biscoe\"\n",
    "assert round(chinstrap_flipper, 1) == 195.8\n",
    "print(\"\\n✅ Case closed — all three answers check out.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7cc1ab41",
   "metadata": {},
   "source": [
    "## 🏁 Checkpoint\n",
    "\n",
    "Case closed, Detective. You just did what every AI project starts with — long before a single model is trained:\n",
    "\n",
    "- ✅ Loaded and inspected a real dataset (`.head`, `.info`, `.describe`)\n",
    "- ✅ Found and removed missing data\n",
    "- ✅ Filtered, grouped, and counted to answer real questions\n",
    "- ✅ Visualized the data — and spotted **species clusters** with your own eyes\n",
    "- ✅ Measured which features carry independent information\n",
    "\n",
    "You proved the Lab's motto: **understand your data before you model it.**\n",
    "\n",
    "**Next up — Notebook 1b: \"Meet the Machines.\" 🤖** You've earned a reward: a hands-on tour of four finished AI systems — vision, mood-reading, story-writing, and a sorting hat. Play with them today; you will *build* every one over the next two weeks.\n",
    "\n",
    "> **Tomorrow (Day 2):** those penguin clusters you found? You'll hand them to a machine, train it to identify a brand-new penguin on its own, and unlock the very first tab of your **AI Studio**. 🔓"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91997f6b-e71e-4e71-9308-0ed8c6639041",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "330f9ff7-f27e-4a07-9bb8-4cc4e1dd7df6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "f9c486a6",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "<div align=\"center\" style=\"background:#14161E;border-radius:12px;padding:18px 12px 14px;margin-top:6px\">\n",
    "  <a href=\"https://ahalimi.com\" target=\"_blank\">\n",
    "    <img src=\"data:image/webp;base64,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\" alt=\"Dr. Abdelghafour HALIMI\" width=\"260\"/>\n",
    "  </a>\n",
    "</div>\n",
    "\n",
    "<div align=\"center\" style=\"text-align:center;margin-top:8px\"><sub>The Lab · AI Studio — Intro to AI · © 2026 <b>Dr. Abdelghafour HALIMI</b> · <a href=\"https://ahalimi.com\">ahalimi.com</a> · All rights reserved.</sub></div>"
   ]
  }
 ],
 "metadata": {
  "authors": [
   {
    "name": "Dr. Abdelghafour HALIMI"
   }
  ],
  "copyright": "© 2026 Dr. Abdelghafour HALIMI · ahalimi.com · All rights reserved",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
