From b6f9a2d18408efce3bd039348ad992ed9365f4b8 Mon Sep 17 00:00:00 2001 From: Tara Menon Date: Fri, 29 May 2026 23:17:47 +0530 Subject: [PATCH] feat: initial FDP content - Data Science Pipeline with Colab notebook --- README.md | 38 ++ .../FDP_PreRead_StudentStress.pdf | Bin 0 -> 47127 bytes .../FDP_Student_Stress_Prediction.ipynb | 486 ++++++++++++++++++ fdp-colab-content/generate_dataset.py | 42 ++ fdp-colab-content/pre_read.html | 396 ++++++++++++++ fdp-colab-content/student_stress_data.csv | 301 +++++++++++ 6 files changed, 1263 insertions(+) create mode 100644 README.md create mode 100644 fdp-colab-content/FDP_PreRead_StudentStress.pdf create mode 100644 fdp-colab-content/FDP_Student_Stress_Prediction.ipynb create mode 100644 fdp-colab-content/generate_dataset.py create mode 100644 fdp-colab-content/pre_read.html create mode 100644 fdp-colab-content/student_stress_data.csv diff --git a/README.md b/README.md new file mode 100644 index 0000000..8944de5 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# FDP - Data Science Pipeline: End-to-End Workflow + +**Topic:** Data Science Pipeline | **Host:** Jodhpur Institute of Engineering & Technology (JIET) + +## ๐Ÿ“‚ Contents + +| File | Description | +|------|-------------| +| `fdp-colab-content/student_stress_data.csv` | Synthetic dataset of 300 student records for stress level prediction | +| `fdp-colab-content/FDP_Student_Stress_Prediction.ipynb` | Google Colab notebook โ€” zero setup required | +| `fdp-colab-content/FDP_PreRead_StudentStress.pdf` | Pre-read material for FDP attendees | +| `fdp-colab-content/generate_dataset.py` | Dataset generator script | +| `fdp-colab-content/pre_read.html` | Pre-read material source (HTML) | + +## ๐ŸŽฏ Dataset Overview + +**300 student records ร— 8 columns** +- **Target:** `Stress_Level` (0 = Not Stressed, 1 = Stressed) +- **Features:** Department, Attendance_Level, Favorite_Color, Weekly_Study_Hours, Assignment_Submission_Pct, Backlogs_Count + +## ๐Ÿš€ Using the Colab Notebook + +1. Open the notebook in [Google Colab](https://colab.research.google.com/) +2. Run all cells โ€” no installation needed +3. Dataset auto-loads from raw GitHub URL + +## ๐Ÿ“Š Pipeline Steps + +1. Data Loading +2. Exploratory Data Analysis +3. One-Hot Encoding (Department, Attendance_Level, Favorite_Color) +4. Random Forest Classification +5. Model Evaluation +6. Feature Importance Visualization + +--- + +*Part of Gyannetra's FDP workshop series* diff --git a/fdp-colab-content/FDP_PreRead_StudentStress.pdf b/fdp-colab-content/FDP_PreRead_StudentStress.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4d7eb60cee9e515c2e5cc6e8a2d017b5d3b1e320 GIT binary patch literal 47127 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 **No installation needed. Just press Shift+Enter on each cell!**" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 1: Import Libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n", + "\n", + "print(\"โœ… All libraries loaded successfully!\")\n", + "print(f\"pandas: {pd.__version__}\")\n", + "print(f\"numpy: {np.__version__}\")" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Step 1: Load the Dataset ๐Ÿ“‚\n", + "\n", + "We're using a dataset of **300 college students**. It contains information about their department,\n", + "attendance, favorite color, study habits, and whether they have high stress or not." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 2: Load Data\n", + "# Option A: From GitHub (recommended)\n", + "url = \"https://raw.githubusercontent.com/gnpl_admin/fdp-data-science-pipeline/main/fdp-colab-content/student_stress_data.csv\"\n", + "\n", + "# Option B: If you have the file locally (upload to Colab)\n", + "# from google.colab import files\n", + "# uploaded = files.upload()\n", + "# df = pd.read_csv('student_stress_data.csv')\n", + "\n", + "df = pd.read_csv(url)\n", + "print(f\"โœ… Dataset loaded! Shape: {df.shape[0]} rows ร— {df.shape[1]} columns\")\n", + "df.head(10)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ๐Ÿ“Š What does each column mean?\n", + "\n", + "| Column | Type | Description |\n", + "|--------|------|-------------|\n", + "| Student_ID | ID | Unique student identifier |\n", + "| Department | Categorical | Science, Commerce, Arts, Engineering |\n", + "| Attendance_Level | Categorical | Regular, Irregular, Borderline |\n", + "| Favorite_Color | Categorical | Red, Blue, Green, Yellow, Purple, Orange |\n", + "| Weekly_Study_Hours | Numerical | Hours studied per week (2-25) |\n", + "| Assignment_Submission_Pct | Numerical | Assignment submission rate (40-100%) |\n", + "| Backlogs_Count | Numerical | Number of pending backlogs (0-5) |\n", + "| Stress_Level | **Target** | 0 = Low Stress, 1 = High Stress |" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 3: Explore Data Types & Missing Values\n", + "print(\"๐Ÿ“‹ Data Info:\")\n", + "print(\"-\" * 40)\n", + "df.info()\n", + "print()\n", + "print(\"๐Ÿ“Š Missing values:\")\n", + "print(df.isnull().sum())\n", + "print()\n", + "print(\"โœ… No missing values! Clean data.\")" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 4: Statistical Summary\n", + "print(\"๐Ÿ“ˆ Statistical Summary (Numerical Columns):\")\n", + "print(\"-\" * 40)\n", + "df.describe()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Step 2: Exploratory Data Analysis (EDA) ๐Ÿ”\n", + "\n", + "Let's understand our data before building a model." + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 5: Target Distribution\n", + "stress_counts = df['Stress_Level'].value_counts()\n", + "print(\"๐ŸŽฏ Stress Level Distribution:\")\n", + "print(f\"Low Stress (0): {stress_counts[0]} students\")\n", + "print(f\"High Stress (1): {stress_counts[1]} students\")\n", + "print()\n", + "\n", + "# Simple bar chart\n", + "plt.figure(figsize=(6, 4))\n", + "colors = ['#4CAF50', '#F44336']\n", + "bars = plt.bar(['Low Stress (0)', 'High Stress (1)'], [stress_counts[0], stress_counts[1]], color=colors)\n", + "plt.title('Student Stress Level Distribution', fontsize=14, fontweight='bold')\n", + "plt.ylabel('Number of Students')\n", + "for bar in bars:\n", + " height = bar.get_height()\n", + " plt.text(bar.get_x() + bar.get_width()/2, height, f'{int(height)}', ha='center', va='bottom')\n", + "plt.show()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 6: Favorite Color Distribution\n", + "print(\"๐ŸŒˆ Favorite Color Distribution:\")\n", + "color_counts = df['Favorite_Color'].value_counts()\n", + "print(color_counts)\n", + "print()\n", + "\n", + "# Bar chart with actual colors\n", + "plt.figure(figsize=(8, 4))\n", + "color_map = {'Red': '#FF0000', 'Blue': '#2196F3', 'Green': '#4CAF50',\n", + " 'Yellow': '#FFEB3B', 'Purple': '#9C27B0', 'Orange': '#FF9800'}\n", + "bar_colors = [color_map[c] for c in color_counts.index]\n", + "bars = plt.bar(color_counts.index, color_counts.values, color=bar_colors, edgecolor='black', linewidth=0.5)\n", + "plt.title('Favorite Color Distribution', fontsize=14, fontweight='bold')\n", + "plt.ylabel('Number of Students')\n", + "for bar in bars:\n", + " height = bar.get_height()\n", + " plt.text(bar.get_x() + bar.get_width()/2, height, f'{int(height)}', ha='center', va='bottom')\n", + "plt.show()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 7: Department vs Stress Level\n", + "print(\"๐Ÿซ Stress by Department:\")\n", + "dept_stress = pd.crosstab(df['Department'], df['Stress_Level'])\n", + "print(dept_stress)\n", + "print()\n", + "\n", + "# Stacked bar chart\n", + "dept_stress.plot(kind='bar', stacked=True, color=['#4CAF50', '#F44336'], figsize=(8, 4))\n", + "plt.title('Stress Level by Department', fontsize=14, fontweight='bold')\n", + "plt.xlabel('Department')\n", + "plt.ylabel('Number of Students')\n", + "plt.legend(['Low Stress', 'High Stress'])\n", + "plt.xticks(rotation=0)\n", + "plt.show()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Step 3: Feature Engineering โ€” One-Hot Encoding ๐Ÿ”„\n", + "\n", + "### ๐ŸŽฏ Why Do We Need This?\n", + "\n", + "Machine learning models understand **numbers**, not words like \"Red\" or \"Science\".\n", + "But we can't just assign Red=1, Blue=2 because that implies an order (Blue > Red).\n", + "\n", + "### โœ… Solution: One-Hot Encoding\n", + "\n", + "Creates a separate column for each category with 0 or 1.\n", + "\n", + "**Example โ€” Favorite Color encoding:**\n", + "\n", + "| Original | Red | Blue | Green | Yellow | Purple | Orange |\n", + "|----------|-----|------|-------|--------|--------|--------|\n", + "| Red | 1 | 0 | 0 | 0 | 0 | 0 |\n", + "| Blue | 0 | 1 | 0 | 0 | 0 | 0 |\n", + "| Green | 0 | 0 | 1 | 0 | 0 | 0 |\n", + "\n", + "**Think of it like a light switch panel** โ€” each color has its own switch, exactly one is ON!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 8: One-Hot Encode Categorical Columns\n", + "print(\"๐Ÿ”„ Before One-Hot Encoding โ€” Categorical columns:\")\n", + "print(df[['Department', 'Attendance_Level', 'Favorite_Color']].head())\n", + "print()\n", + "\n", + "# Apply one-hot encoding\n", + "categorical_cols = ['Department', 'Attendance_Level', 'Favorite_Color']\n", + "df_encoded = pd.get_dummies(df, columns=categorical_cols, drop_first=False)\n", + "\n", + "print(f\"โœ… After encoding: {df_encoded.shape[1]} columns (was {df.shape[1]})\")\n", + "print()\n", + "\n", + "# Show the new columns that start with 'Favorite_Color'\n", + "color_cols = [c for c in df_encoded.columns if c.startswith('Favorite_Color')]\n", + "print(f\"๐ŸŒˆ New one-hot columns for Favorite_Color ({len(color_cols)} total):\")\n", + "print(color_cols)\n", + "print()\n", + "\n", + "# Show a sample of the encoded color columns\n", + "print(\"Sample of one-hot encoded colors:\")\n", + "df_encoded[['Student_ID', 'Favorite_Color_Red', 'Favorite_Color_Blue', \n", + " 'Favorite_Color_Green', 'Favorite_Color_Yellow',\n", + " 'Favorite_Color_Purple', 'Favorite_Color_Orange']].head(10)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 9: Visualize One-Hot Encoding\n", + "print(\"๐ŸŽฏ Let's see which colors have more stressed students:\")\n", + "\n", + "# Create a cross-tabulation\n", + "color_stress = pd.crosstab(df['Favorite_Color'], df['Stress_Level'])\n", + "color_stress['Stress_Rate'] = (color_stress[1] / (color_stress[0] + color_stress[1]) * 100).round(1)\n", + "color_stress = color_stress.sort_values('Stress_Rate', ascending=False)\n", + "print(color_stress)\n", + "print()\n", + "\n", + "# Bar chart\n", + "plt.figure(figsize=(8, 4))\n", + "ax = color_stress['Stress_Rate'].plot(kind='bar', color=['#FF0000', '#2196F3', '#4CAF50', '#FFEB3B', '#9C27B0', '#FF9800'],\n", + " edgecolor='black', linewidth=0.5)\n", + "plt.title('Stress Rate by Favorite Color', fontsize=14, fontweight='bold')\n", + "plt.xlabel('Favorite Color')\n", + "plt.ylabel('Stress Rate (%)')\n", + "plt.xticks(rotation=0)\n", + "for i, v in enumerate(color_stress['Stress_Rate']):\n", + " plt.text(i, v + 0.5, f'{v}%', ha='center', fontweight='bold')\n", + "plt.ylim(0, 100)\n", + "plt.show()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Step 4: Train a Machine Learning Model ๐Ÿค–\n", + "\n", + "We'll use a **Random Forest Classifier** โ€” it's like asking 100 mini-experts to vote, then taking the majority decision. Easy to understand and very powerful!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 10: Prepare Features & Target\n", + "# Drop Student_ID (not useful) and Stress_Level (our target)\n", + "X = df_encoded.drop(['Student_ID', 'Stress_Level'], axis=1)\n", + "y = df_encoded['Stress_Level']\n", + "\n", + "print(f\"Features (X): {X.shape[1]} columns, {X.shape[0]} rows\")\n", + "print(f\"Target (y): {y.shape[0]} values\")\n", + "print(f\"\\nFeature columns: {list(X.columns)[:10]}... (+ {len(X.columns)-10} more)\")\n", + "print(f\"\\nTarget distribution:\\n{y.value_counts().to_string()}\")" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 11: Split Data into Train & Test\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " X, y, test_size=0.3, random_state=42, stratify=y\n", + ")\n", + "\n", + "print(f\"๐Ÿ“š Training set: {X_train.shape[0]} students ({X_train.shape[0]/len(df)*100:.0f}%)\")\n", + "print(f\"๐Ÿงช Test set: {X_test.shape[0]} students ({X_test.shape[0]/len(df)*100:.0f}%)\")\n", + "print()\n", + "print(\"โœ… Training target distribution:\")\n", + "print(y_train.value_counts().to_string())\n", + "print()\n", + "print(\"โœ… Test target distribution:\")\n", + "print(y_test.value_counts().to_string())" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 12: Train Random Forest Model\n", + "model = RandomForestClassifier(n_estimators=100, random_state=42)\n", + "model.fit(X_train, y_train)\n", + "\n", + "print(\"๐ŸŒฒโœ… Model trained successfully!\")\n", + "print(f\"Using {model.n_estimators} decision trees\")" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Step 5: Evaluate the Model ๐Ÿ“Š" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 13: Make Predictions\n", + "y_pred = model.predict(X_test)\n", + "accuracy = accuracy_score(y_test, y_pred)\n", + "\n", + "print(f\"๐ŸŽฏ Model Accuracy: {accuracy*100:.1f}%\")\n", + "print()\n", + "print(\"๐Ÿ“‹ Classification Report:\")\n", + "print(classification_report(y_test, y_pred, target_names=['Low Stress', 'High Stress']))" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 14: Confusion Matrix\n", + "cm = confusion_matrix(y_test, y_pred)\n", + "\n", + "plt.figure(figsize=(6, 5))\n", + "sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n", + " xticklabels=['Low Stress', 'High Stress'],\n", + " yticklabels=['Low Stress', 'High Stress'])\n", + "plt.title('Confusion Matrix', fontsize=14, fontweight='bold')\n", + "plt.xlabel('Predicted')\n", + "plt.ylabel('Actual')\n", + "plt.show()\n", + "\n", + "print(\"๐Ÿ“Š Confusion Matrix Breakdown:\")\n", + "print(f\"โœ… True Low Stress: {cm[0][0]} students correctly predicted\")\n", + "print(f\"โŒ False High Stress: {cm[0][1]} low-stress students predicted as high\")\n", + "print(f\"โŒ False Low Stress: {cm[1][0]} high-stress students predicted as low\")\n", + "print(f\"โœ… True High Stress: {cm[1][1]} students correctly predicted\")" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## Step 6: Feature Importance ๐Ÿ”‘\n", + "\n", + "What factors most influence student stress? Let's find out!" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Cell 15: Feature Importance\n", + "importance = pd.DataFrame({\n", + " 'Feature': X.columns,\n", + " 'Importance': model.feature_importances_\n", + "}).sort_values('Importance', ascending=False)\n", + "\n", + "print(\"๐Ÿ”‘ Top 10 Most Important Factors:\")\n", + "print(\"-\" * 40)\n", + "for i, row in importance.head(10).iterrows():\n", + " bar = 'โ–ˆ' * int(row['Importance'] * 50)\n", + " print(f\"{row['Feature']:40s} {bar} {row['Importance']*100:.1f}%\")\n", + "print()\n", + "\n", + "# Plot top 10\n", + "plt.figure(figsize=(10, 6))\n", + "top10 = importance.head(10)\n", + "bars = plt.barh(range(len(top10)), top10['Importance'].values, color='#8ab4f8')\n", + "plt.yticks(range(len(top10)), top10['Feature'].values)\n", + "plt.xlabel('Importance Score')\n", + "plt.title('Top 10 Features Influencing Student Stress', fontsize=14, fontweight='bold')\n", + "plt.gca().invert_yaxis()\n", + "for i, v in enumerate(top10['Importance']):\n", + " plt.text(v + 0.005, i, f'{v*100:.1f}%', va='center', fontweight='bold')\n", + "plt.tight_layout()\n", + "plt.show()" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "## ๐ŸŽฏ Summary โ€” What We Learned Today\n", + "\n", + "| Step | What We Did | Key Takeaway |\n", + "|------|-------------|--------------|\n", + "| 1 | Loaded data | CSV files are the standard format |\n", + "| 2 | EDA | Visualized patterns before modeling |\n", + "| 3 | **One-Hot Encoding** | Converted colors (Red/Blue/Green) to numbers ๐Ÿ“Œ |\n", + "| 4 | Trained model | Random Forest โ€” simple yet powerful |\n", + "| 5 | Evaluated | Measured accuracy & confusion matrix |\n", + "| 6 | Interpreted | Found most influential factors |\n", + "\n", + "### ๐Ÿ“Œ Key Concept: One-Hot Encoding\n", + "- Categorical data (like **Favorite Color**) cannot directly go into ML models\n", + "- One-hot encoding creates **separate 0/1 columns** for each category\n", + "- In pandas: pd.get_dummies(df['Favorite_Color'])\n", + "- Think of it as a **light switch panel** โ€” one switch per color!\n", + "\n", + "---\n", + "### ๐Ÿ™ Thank You!\n", + "\n", + "**Kapil Panwar** \n", + "Gyannetra Pvt Ltd, Pune, Maharashtra \n", + "*India's Premier AI Consultancy*" + ] + } + ] +} \ No newline at end of file diff --git a/fdp-colab-content/generate_dataset.py b/fdp-colab-content/generate_dataset.py new file mode 100644 index 0000000..b63924c --- /dev/null +++ b/fdp-colab-content/generate_dataset.py @@ -0,0 +1,42 @@ +import pandas as pd +import numpy as np + +np.random.seed(42) +n = 300 + +departments = np.random.choice(["Science", "Commerce", "Arts", "Engineering"], n) +attendance = np.random.choice(["Regular", "Irregular", "Borderline"], n, p=[0.4, 0.3, 0.3]) +fav_colors = np.random.choice(["Red", "Blue", "Green", "Yellow", "Purple", "Orange"], n) +study_hours = np.round(np.random.uniform(2, 25, n), 1) +assign_sub = np.round(np.random.uniform(40, 100, n), 0) +backlogs = np.random.randint(0, 6, n) + +# Stress logic +# High if: irregular attendance OR backlogs>=3 OR study_hours<5 OR assign_sub<55 +stress = ((attendance == "Irregular") | + (backlogs >= 3) | + (study_hours < 5) | + (assign_sub < 55)).astype(int) + +# Add some noise so it's not 100% predictable +flip = np.random.choice([0, 1], n, p=[0.9, 0.1]) +stress = stress ^ flip # XOR flip 10% + +df = pd.DataFrame({ + "Student_ID": ["S{:03d}".format(i+1) for i in range(n)], + "Department": departments, + "Attendance_Level": attendance, + "Favorite_Color": fav_colors, + "Weekly_Study_Hours": study_hours, + "Assignment_Submission_Pct": assign_sub.astype(int), + "Backlogs_Count": backlogs, + "Stress_Level": stress +}) + +df.to_csv("/root/fdp-workshop/fdp-colab-content/student_stress_data.csv", index=False) +print("Dataset generated: {} rows, {} cols".format(len(df), len(df.columns))) +print("Stress distribution:") +print(df["Stress_Level"].value_counts().to_string()) +print("\nSample:") +print(df.head(3).to_string()) +print("\nUnique colors: {}".format(df["Favorite_Color"].unique())) diff --git a/fdp-colab-content/pre_read.html b/fdp-colab-content/pre_read.html new file mode 100644 index 0000000..4cb3966 --- /dev/null +++ b/fdp-colab-content/pre_read.html @@ -0,0 +1,396 @@ + + + + + + + + + +
+

FDP Pre-Read Material

+

Data Science Pipeline — Hands-on with Google Colab

+
+

+ Speaker: Kapil Panwar
+ Organization: Gyannetra Pvt Ltd, Pune
+ Date: 30 May 2026
+ Venue: JIET, Jodhpur +

+ +
+ + +
+
FDP Pre-Read • Data Science Pipeline
+ +

1. Introduction

+ +

+ Welcome to the Data Science Pipeline Faculty Development Program session! + This pre-read document will prepare you for a completely hands-on, no-installation-needed workshop. +

+ +
+ Good News: You do not need to install Python, Docker, or any software on your laptop. + Everything runs in your browser via Google Colab. +
+ +

What is a Data Science Pipeline?

+

+ A Data Science Pipeline is the end-to-end process of taking raw data and transforming it into + actionable insights. The standard pipeline has these stages: +

+
    +
  1. Data Collection – Gathering data from CSV, databases, APIs, etc.
  2. +
  3. Data Cleaning & Preprocessing – Handling missing values, fixing data types
  4. +
  5. Feature Engineering – Creating new features, encoding categorical variables
  6. +
  7. Exploratory Data Analysis (EDA) – Visualizing patterns and relationships
  8. +
  9. Model Training – Applying machine learning algorithms
  10. +
  11. Evaluation – Measuring how well the model performs
  12. +
  13. Interpretation – Understanding what the model tells us
  14. +
+ +
+ Session Tip: Don't worry if some terms feel new. The session is designed for + beginners. Just bring curiosity and a working internet connection. +
+ + +
+ + +
+
FDP Pre-Read • Data Science Pipeline
+ +

2. Google Colab — Your Browser-Based Lab

+ +

+ Google Colaboratory (Colab) is a free, cloud-based Jupyter notebook environment + that runs entirely in your browser. No installation. No setup. +

+ +

Why Colab for this FDP?

+
    +
  • โœ… Zero setup – Works on any laptop (i3, i5, any OS)
  • +
  • โœ… Free GPU/CPU – Google servers do the heavy lifting
  • +
  • โœ… Pre-written code – Just run each cell with Shift+Enter
  • +
  • โœ… Auto-saves to your Google Drive
  • +
  • โœ… Works offline after initial load
  • +
+ +

How to Open a Colab Notebook

+
    +
  1. Open your browser (Chrome / Firefox recommended)
  2. +
  3. Go to colab.research.google.com
  4. +
  5. Click File → Upload Notebook
  6. +
  7. Select the .ipynb file we share during the session
  8. +
+ +
+ Shortcut: We will also share a direct Colab link — just click and it opens + automatically. No upload needed. +
+ +

Colab Cell Types

+ + + + +
Cell TypeUseExample
Code CellRuns Python codeprint("Hello")
Text CellMarkdown documentationExplanations, headings
+ + +
+ + +
+
FDP Pre-Read • Data Science Pipeline
+ +

3. Categorical Data & One-Hot Encoding

+ +

What is Categorical Data?

+

+ Categorical data represents groups or categories rather than numbers. Examples: Department + (Science, Commerce), Gender (Male, Female), or Favorite Color (Red, Blue, Green). +

+

+ Machine learning models understand only numbers. So we must convert text categories to + numbers. This is called encoding. +

+ +

The Problem with Simple Numbering

+

+ If we encode Red=1, Blue=2, Green=3, the model might think Green > Blue > Red (i.e., + order/ranking). But colors have no inherent order. This is why we use one-hot encoding. +

+ +

How One-Hot Encoding Works

+

+ One-hot encoding creates a separate column for each category, with 1 (present) or 0 (absent). +

+ + + + + + + +
OriginalRedBlueGreenYellow
Red1000
Blue0100
Green0010
Yellow0001
+ +

In Python with pandas, it's just one line:

+
import pandas as pd
+encoded = pd.get_dummies(df['Favorite_Color'], prefix='Color')
+ +
+ Visual Memory Aid: Think of one-hot like a light switch panel — + each color has its own switch, and exactly one switch is ON at a time. +
+ + +
+ + +
+
FDP Pre-Read • Data Science Pipeline
+ +

4. Session Dataset — Student Stress Prediction

+ +

+ During the session, we will use a dataset about college student stress levels. + This dataset is specially designed to be relatable for faculty members. +

+ + + + + + + + + + +
FeatureTypeDescriptionExample
DepartmentCategoricalStudent's departmentScience, Arts, Commerce, Engineering
Attendance LevelCategoricalAttendance categoryRegular, Irregular, Borderline
Favorite ColorCategoricalSelf-reported favorite color ๐ŸŒˆRed, Blue, Green, Yellow, Purple, Orange
Weekly Study HoursNumericalHours studied per week2 – 25 hours
Assignment Submission %NumericalAssignment submission rate40% – 100%
Backlogs CountNumericalNumber of pending backlogs0 – 5
Stress LevelBinary (Target)0 = Low Stress, 1 = High Stress0 or 1
+ +

Session Outline (Hands-On)

+
    +
  1. Open Colab & Load Data — 5 min
  2. +
  3. Explore the Data (EDA) — 10 min
  4. +
  5. One-Hot Encode Categorical Columns — 10 min
  6. +
  7. Train a Machine Learning Model — 10 min
  8. +
  9. Evaluate & Interpret Results — 10 min
  10. +
  11. Q&A / Open Discussion — 10 min
  12. +
+

Total: ~55 minutes

+ +
+ No prior coding experience needed. All code is pre-written. + You just click "Run" and watch the magic happen. +
+ +

What You Will Learn

+
    +
  • โœ… How to load and view data in Python
  • +
  • โœ… How to handle categorical data (one-hot encoding with colors!)
  • +
  • โœ… How to train a simple ML model
  • +
  • โœ… How to check if the model is accurate
  • +
  • โœ… How these skills apply to your own courses & research
  • +
+ + +
+ + +
+
FDP Pre-Read • Data Science Pipeline
+ +

5. Quick Reference — Python & Colab Cheatsheet

+ +

Common Colab Shortcuts

+ + + + + + + +
ActionShortcut
Run current cellShift + Enter
Add a code cellClick + Code button
Add a text cellClick + Text button
Delete a cellClick cell → Trash icon (top-right)
Toggle cell outputDouble-click output area
+ +

Key Python Commands We'll Use

+ + + + + + + + + + +
CommandWhat it does
df.head()Show first 5 rows of data
df.info()Show data types and missing values
df.describe()Show statistical summary
df['col'].value_counts()Count unique values in a column
pd.get_dummies()One-hot encode categorical columns
train_test_split()Split data into train/test
RandomForestClassifier()Create a Random Forest model
accuracy_score()Calculate model accuracy
+ +

Before the Session, Please:

+
    +
  • โœ… Ensure you have a working internet connection
  • +
  • โœ… Have a Google account (Gmail) logged in your browser
  • +
  • โœ… Open Chrome / Firefox browser (latest version)
  • +
  • โœ… Keep this pre-read handy for reference
  • +
+ +
+ See you at the session! If you have questions beforehand, please reach out + via the FDP coordination team. We're here to help. +
+ + +
+ + +
+

See You at the Session!

+

+ Data Science Pipeline • 30 May 2026 • JIET Jodhpur +

+

+ Kapil Panwar
+ Gyannetra Pvt Ltd, Pune, Maharashtra
+ Gyannetra — India's Premier AI Consultancy +

+
+ + + diff --git a/fdp-colab-content/student_stress_data.csv b/fdp-colab-content/student_stress_data.csv new file mode 100644 index 0000000..6117c28 --- /dev/null +++ b/fdp-colab-content/student_stress_data.csv @@ -0,0 +1,301 @@ +Student_ID,Department,Attendance_Level,Favorite_Color,Weekly_Study_Hours,Assignment_Submission_Pct,Backlogs_Count,Stress_Level +S001,Arts,Borderline,Purple,22.5,41,2,1 +S002,Engineering,Regular,Yellow,15.7,48,4,1 +S003,Science,Regular,Orange,17.6,94,3,1 +S004,Arts,Irregular,Green,20.2,92,4,1 +S005,Arts,Borderline,Blue,13.5,76,3,1 +S006,Engineering,Regular,Blue,4.0,76,1,1 +S007,Science,Irregular,Green,14.4,80,2,1 +S008,Science,Borderline,Orange,15.5,51,3,0 +S009,Arts,Regular,Green,19.1,95,5,1 +S010,Commerce,Borderline,Purple,11.9,65,0,0 +S011,Arts,Regular,Purple,4.9,63,5,1 +S012,Arts,Irregular,Blue,8.5,71,5,1 +S013,Arts,Irregular,Yellow,10.4,43,0,1 +S014,Arts,Irregular,Orange,16.9,50,5,1 +S015,Engineering,Regular,Blue,15.1,84,3,0 +S016,Science,Borderline,Yellow,10.2,45,3,1 +S017,Engineering,Regular,Yellow,24.7,76,3,1 +S018,Engineering,Regular,Purple,15.9,55,0,0 +S019,Engineering,Regular,Red,7.5,63,5,1 +S020,Arts,Irregular,Red,4.3,57,0,1 +S021,Commerce,Irregular,Green,5.5,61,3,1 +S022,Science,Regular,Purple,7.7,83,5,1 +S023,Commerce,Irregular,Yellow,5.7,58,5,1 +S024,Engineering,Regular,Orange,6.3,74,4,0 +S025,Engineering,Irregular,Red,8.6,69,4,1 +S026,Commerce,Regular,Yellow,6.0,80,1,1 +S027,Commerce,Irregular,Red,22.6,96,2,1 +S028,Commerce,Regular,Red,3.8,84,4,1 +S029,Engineering,Borderline,Red,14.1,53,0,1 +S030,Engineering,Regular,Orange,11.4,42,4,1 +S031,Science,Regular,Purple,24.6,56,1,0 +S032,Science,Regular,Orange,4.6,76,5,1 +S033,Engineering,Borderline,Blue,11.2,43,1,1 +S034,Commerce,Borderline,Yellow,24.3,70,5,1 +S035,Commerce,Regular,Purple,21.9,76,5,1 +S036,Science,Irregular,Purple,20.8,60,2,1 +S037,Engineering,Borderline,Purple,7.9,86,4,1 +S038,Science,Irregular,Purple,5.9,46,0,1 +S039,Science,Irregular,Orange,17.4,45,0,1 +S040,Arts,Regular,Purple,23.4,84,3,1 +S041,Arts,Regular,Green,14.8,70,5,1 +S042,Arts,Borderline,Yellow,15.1,81,0,0 +S043,Commerce,Borderline,Purple,8.4,66,2,0 +S044,Engineering,Irregular,Yellow,19.7,55,5,1 +S045,Engineering,Regular,Green,6.3,89,2,0 +S046,Engineering,Regular,Green,9.4,88,0,0 +S047,Engineering,Borderline,Yellow,11.8,82,0,0 +S048,Arts,Borderline,Red,13.7,56,3,1 +S049,Commerce,Borderline,Blue,7.6,75,0,0 +S050,Commerce,Borderline,Red,4.6,62,5,1 +S051,Arts,Irregular,Red,16.0,45,5,1 +S052,Commerce,Regular,Orange,8.6,95,5,1 +S053,Arts,Regular,Red,15.4,48,3,1 +S054,Engineering,Borderline,Purple,5.6,97,3,1 +S055,Arts,Irregular,Orange,13.1,67,0,1 +S056,Engineering,Regular,Orange,14.2,51,1,1 +S057,Engineering,Regular,Green,3.2,73,1,1 +S058,Science,Irregular,Red,9.7,92,3,1 +S059,Arts,Regular,Green,5.1,84,0,0 +S060,Science,Regular,Yellow,3.5,88,1,1 +S061,Arts,Irregular,Blue,24.8,80,0,1 +S062,Arts,Irregular,Orange,9.4,82,0,1 +S063,Science,Irregular,Yellow,20.6,91,0,1 +S064,Science,Regular,Yellow,7.9,55,4,1 +S065,Arts,Borderline,Purple,17.7,69,5,1 +S066,Commerce,Regular,Blue,19.5,53,0,1 +S067,Engineering,Regular,Yellow,15.7,99,4,1 +S068,Science,Borderline,Yellow,12.8,97,3,1 +S069,Engineering,Irregular,Blue,11.5,42,1,1 +S070,Commerce,Borderline,Blue,10.0,82,5,1 +S071,Commerce,Irregular,Yellow,23.4,96,1,1 +S072,Commerce,Irregular,Blue,21.1,51,5,0 +S073,Science,Regular,Yellow,24.2,74,1,0 +S074,Commerce,Regular,Yellow,4.9,95,5,1 +S075,Science,Regular,Purple,18.8,42,1,1 +S076,Commerce,Regular,Red,23.6,82,1,0 +S077,Engineering,Borderline,Yellow,6.2,58,1,0 +S078,Engineering,Regular,Green,3.5,95,1,1 +S079,Arts,Borderline,Orange,19.0,98,3,0 +S080,Engineering,Irregular,Red,15.2,97,0,1 +S081,Arts,Borderline,Red,21.4,68,2,1 +S082,Engineering,Irregular,Red,5.2,92,4,1 +S083,Science,Irregular,Purple,20.3,91,2,1 +S084,Engineering,Irregular,Yellow,6.6,59,2,1 +S085,Arts,Regular,Purple,5.8,90,5,1 +S086,Arts,Borderline,Yellow,5.8,42,0,1 +S087,Commerce,Regular,Purple,20.7,76,5,1 +S088,Science,Regular,Purple,17.3,54,0,1 +S089,Engineering,Irregular,Orange,14.0,47,0,1 +S090,Commerce,Regular,Green,10.3,45,1,1 +S091,Engineering,Borderline,Purple,22.2,82,3,1 +S092,Engineering,Borderline,Orange,11.0,60,1,0 +S093,Commerce,Borderline,Blue,20.8,83,3,1 +S094,Commerce,Regular,Green,12.1,44,5,1 +S095,Commerce,Regular,Purple,10.7,59,3,1 +S096,Commerce,Borderline,Red,12.6,72,5,1 +S097,Commerce,Irregular,Blue,8.9,87,2,1 +S098,Engineering,Borderline,Blue,19.2,59,2,0 +S099,Commerce,Borderline,Orange,13.6,78,3,1 +S100,Science,Borderline,Blue,7.3,93,3,1 +S101,Arts,Regular,Green,22.7,77,5,1 +S102,Commerce,Regular,Purple,10.8,54,1,1 +S103,Commerce,Borderline,Purple,14.5,41,5,1 +S104,Engineering,Regular,Red,22.8,92,1,1 +S105,Commerce,Regular,Orange,16.4,41,2,1 +S106,Commerce,Irregular,Red,4.7,92,0,1 +S107,Commerce,Borderline,Blue,23.6,72,3,1 +S108,Engineering,Irregular,Red,16.4,96,1,1 +S109,Commerce,Irregular,Green,9.7,88,5,1 +S110,Arts,Regular,Purple,5.2,100,2,1 +S111,Engineering,Irregular,Blue,20.3,61,1,1 +S112,Arts,Borderline,Red,16.3,86,5,1 +S113,Engineering,Regular,Orange,14.3,64,3,1 +S114,Commerce,Irregular,Green,22.6,69,3,1 +S115,Arts,Borderline,Green,20.1,78,4,1 +S116,Engineering,Borderline,Red,5.5,92,0,0 +S117,Science,Irregular,Purple,9.2,99,4,1 +S118,Commerce,Borderline,Red,7.7,86,2,0 +S119,Engineering,Regular,Blue,19.1,65,1,1 +S120,Science,Regular,Red,2.8,65,2,1 +S121,Engineering,Borderline,Green,15.1,84,5,1 +S122,Science,Borderline,Red,19.5,54,3,1 +S123,Commerce,Borderline,Purple,22.2,47,4,1 +S124,Arts,Borderline,Orange,9.9,61,4,1 +S125,Science,Irregular,Yellow,20.9,57,4,1 +S126,Engineering,Irregular,Red,4.5,58,2,1 +S127,Commerce,Borderline,Purple,21.5,54,3,1 +S128,Science,Irregular,Purple,4.9,43,1,1 +S129,Engineering,Borderline,Orange,11.1,41,5,1 +S130,Engineering,Borderline,Green,20.3,99,1,0 +S131,Engineering,Borderline,Purple,5.4,66,2,0 +S132,Science,Regular,Purple,7.3,63,5,1 +S133,Science,Regular,Purple,18.6,81,4,1 +S134,Science,Regular,Purple,18.6,53,0,1 +S135,Arts,Irregular,Blue,16.7,97,2,1 +S136,Science,Regular,Blue,18.0,87,2,0 +S137,Science,Irregular,Green,14.5,45,3,1 +S138,Science,Irregular,Red,7.8,65,1,1 +S139,Arts,Regular,Purple,10.0,93,2,0 +S140,Science,Irregular,Orange,6.2,97,2,1 +S141,Engineering,Regular,Red,22.9,68,4,1 +S142,Science,Regular,Orange,15.4,77,4,1 +S143,Engineering,Borderline,Red,11.2,50,5,1 +S144,Engineering,Regular,Green,12.6,99,0,1 +S145,Engineering,Regular,Purple,23.8,54,3,1 +S146,Arts,Irregular,Purple,5.5,97,0,1 +S147,Arts,Borderline,Yellow,15.5,79,5,1 +S148,Arts,Regular,Orange,13.6,76,4,1 +S149,Science,Irregular,Red,16.1,71,1,1 +S150,Engineering,Regular,Red,2.4,54,4,1 +S151,Arts,Regular,Blue,22.1,51,3,0 +S152,Arts,Irregular,Yellow,23.4,53,4,1 +S153,Science,Irregular,Blue,15.0,51,3,1 +S154,Arts,Irregular,Blue,18.0,87,3,1 +S155,Science,Borderline,Blue,23.2,61,3,1 +S156,Commerce,Borderline,Orange,18.3,43,5,1 +S157,Arts,Irregular,Orange,5.5,98,3,1 +S158,Commerce,Regular,Green,15.3,93,3,1 +S159,Science,Borderline,Green,16.0,96,1,0 +S160,Engineering,Regular,Blue,11.8,100,0,0 +S161,Arts,Irregular,Yellow,18.9,50,2,1 +S162,Science,Regular,Red,23.5,64,0,0 +S163,Engineering,Regular,Orange,23.3,85,3,1 +S164,Engineering,Borderline,Yellow,12.4,82,1,0 +S165,Commerce,Borderline,Purple,4.6,49,4,1 +S166,Science,Irregular,Orange,24.7,89,1,1 +S167,Engineering,Irregular,Orange,21.3,53,3,1 +S168,Arts,Regular,Green,4.9,53,1,1 +S169,Arts,Regular,Red,23.2,72,1,0 +S170,Commerce,Regular,Red,22.0,76,3,1 +S171,Engineering,Irregular,Purple,13.9,75,5,1 +S172,Science,Borderline,Purple,15.6,45,1,1 +S173,Arts,Irregular,Orange,11.2,93,2,1 +S174,Engineering,Regular,Blue,3.3,56,2,1 +S175,Engineering,Borderline,Green,9.7,48,1,1 +S176,Commerce,Borderline,Green,20.5,93,5,0 +S177,Arts,Irregular,Orange,2.1,97,4,1 +S178,Arts,Irregular,Yellow,9.7,92,3,1 +S179,Science,Irregular,Blue,11.2,89,2,1 +S180,Arts,Regular,Orange,14.4,79,4,1 +S181,Science,Regular,Blue,23.2,73,1,0 +S182,Arts,Borderline,Blue,10.0,45,4,1 +S183,Commerce,Regular,Blue,10.0,65,0,1 +S184,Arts,Regular,Orange,19.0,62,2,0 +S185,Science,Regular,Green,12.4,56,1,0 +S186,Science,Regular,Green,7.2,83,3,1 +S187,Commerce,Borderline,Blue,12.4,70,5,1 +S188,Arts,Borderline,Yellow,5.2,45,1,1 +S189,Arts,Irregular,Red,6.1,53,3,1 +S190,Commerce,Regular,Orange,13.5,81,5,1 +S191,Arts,Irregular,Red,11.6,45,5,1 +S192,Arts,Irregular,Yellow,23.0,91,1,1 +S193,Science,Regular,Orange,10.3,70,4,1 +S194,Arts,Irregular,Blue,15.4,69,4,0 +S195,Arts,Regular,Green,16.5,76,5,1 +S196,Commerce,Irregular,Red,2.3,89,4,1 +S197,Commerce,Irregular,Purple,17.3,61,0,1 +S198,Engineering,Regular,Purple,6.1,81,5,0 +S199,Science,Regular,Yellow,24.1,74,5,0 +S200,Arts,Irregular,Blue,5.4,56,3,1 +S201,Arts,Irregular,Red,11.5,93,4,1 +S202,Engineering,Borderline,Blue,4.0,88,5,1 +S203,Arts,Irregular,Red,24.9,80,0,1 +S204,Science,Regular,Yellow,13.6,91,3,1 +S205,Engineering,Regular,Yellow,15.7,92,1,0 +S206,Science,Irregular,Purple,3.5,83,5,1 +S207,Engineering,Regular,Blue,19.2,90,0,0 +S208,Engineering,Irregular,Orange,6.8,82,2,1 +S209,Commerce,Borderline,Purple,22.7,81,0,0 +S210,Science,Irregular,Blue,6.7,77,0,1 +S211,Arts,Regular,Purple,6.4,85,3,1 +S212,Arts,Irregular,Orange,2.8,50,1,1 +S213,Science,Irregular,Green,12.9,93,2,1 +S214,Arts,Irregular,Green,15.0,92,4,1 +S215,Arts,Borderline,Green,3.5,42,4,0 +S216,Science,Regular,Green,19.8,90,0,0 +S217,Engineering,Borderline,Red,12.4,48,3,1 +S218,Science,Borderline,Green,14.1,60,3,1 +S219,Engineering,Regular,Orange,12.1,85,4,1 +S220,Arts,Regular,Yellow,11.2,50,2,1 +S221,Arts,Regular,Yellow,14.9,89,1,0 +S222,Arts,Regular,Red,5.6,90,2,1 +S223,Commerce,Regular,Green,6.2,70,5,1 +S224,Engineering,Irregular,Green,21.8,40,5,0 +S225,Commerce,Regular,Green,23.8,57,1,0 +S226,Commerce,Regular,Purple,10.6,77,4,1 +S227,Science,Borderline,Blue,8.2,99,1,1 +S228,Commerce,Regular,Purple,16.8,78,3,1 +S229,Science,Borderline,Blue,11.4,56,5,1 +S230,Science,Regular,Green,2.6,78,0,1 +S231,Commerce,Regular,Green,5.6,72,0,0 +S232,Engineering,Irregular,Purple,18.5,87,4,1 +S233,Engineering,Irregular,Purple,17.2,46,3,1 +S234,Engineering,Borderline,Blue,2.6,86,2,1 +S235,Engineering,Borderline,Yellow,7.1,72,3,1 +S236,Engineering,Borderline,Blue,7.3,98,0,0 +S237,Commerce,Regular,Purple,17.5,61,0,0 +S238,Commerce,Regular,Orange,2.5,78,5,1 +S239,Arts,Borderline,Purple,4.4,96,3,1 +S240,Engineering,Borderline,Orange,20.4,46,3,1 +S241,Commerce,Borderline,Red,6.1,96,0,1 +S242,Arts,Irregular,Purple,17.0,81,2,1 +S243,Engineering,Regular,Red,7.5,44,4,1 +S244,Science,Borderline,Yellow,4.3,58,4,1 +S245,Arts,Regular,Blue,7.6,82,3,1 +S246,Commerce,Borderline,Orange,18.6,44,4,0 +S247,Science,Borderline,Blue,21.7,75,0,0 +S248,Science,Irregular,Red,21.1,61,0,1 +S249,Science,Borderline,Orange,11.1,77,3,1 +S250,Arts,Borderline,Blue,17.4,43,3,1 +S251,Commerce,Regular,Purple,6.7,92,5,1 +S252,Science,Borderline,Green,8.7,98,3,1 +S253,Engineering,Irregular,Red,22.6,98,2,1 +S254,Science,Borderline,Blue,2.3,85,4,1 +S255,Science,Regular,Red,4.0,48,3,1 +S256,Arts,Borderline,Red,6.8,85,1,0 +S257,Arts,Regular,Orange,2.6,41,5,1 +S258,Commerce,Regular,Orange,6.2,41,1,0 +S259,Engineering,Borderline,Green,15.4,59,0,0 +S260,Arts,Regular,Purple,11.7,69,4,0 +S261,Science,Regular,Red,22.5,86,3,1 +S262,Commerce,Borderline,Blue,20.8,81,1,0 +S263,Science,Borderline,Yellow,9.9,67,4,1 +S264,Science,Irregular,Red,8.0,56,0,1 +S265,Arts,Irregular,Red,10.7,100,2,1 +S266,Commerce,Irregular,Green,15.6,66,5,1 +S267,Engineering,Regular,Purple,8.2,67,4,1 +S268,Engineering,Regular,Yellow,16.4,50,4,1 +S269,Arts,Irregular,Orange,11.4,88,2,1 +S270,Arts,Borderline,Orange,14.7,82,4,1 +S271,Commerce,Borderline,Blue,12.0,53,0,1 +S272,Engineering,Borderline,Yellow,8.8,45,0,1 +S273,Engineering,Regular,Orange,23.8,81,2,0 +S274,Engineering,Irregular,Blue,19.6,79,5,1 +S275,Science,Regular,Purple,5.2,56,3,0 +S276,Engineering,Irregular,Blue,22.0,97,1,1 +S277,Science,Irregular,Orange,13.2,49,3,1 +S278,Commerce,Borderline,Green,22.6,66,4,0 +S279,Science,Regular,Green,20.4,97,1,0 +S280,Commerce,Regular,Green,11.8,65,2,0 +S281,Engineering,Regular,Orange,2.5,78,2,1 +S282,Engineering,Borderline,Green,8.2,64,5,1 +S283,Commerce,Irregular,Yellow,14.5,56,1,1 +S284,Arts,Regular,Purple,16.6,99,0,0 +S285,Commerce,Regular,Blue,7.9,65,1,0 +S286,Arts,Borderline,Blue,5.2,94,4,1 +S287,Science,Regular,Orange,21.2,54,0,0 +S288,Science,Borderline,Green,24.6,53,2,1 +S289,Science,Borderline,Green,14.1,42,1,1 +S290,Engineering,Regular,Red,5.9,79,3,1 +S291,Science,Regular,Purple,8.3,62,5,1 +S292,Arts,Borderline,Yellow,2.4,92,3,1 +S293,Science,Regular,Blue,23.0,68,5,1 +S294,Commerce,Regular,Red,4.7,98,4,1 +S295,Commerce,Borderline,Red,15.3,51,3,1 +S296,Engineering,Borderline,Orange,8.3,92,1,0 +S297,Commerce,Borderline,Blue,14.7,87,1,0 +S298,Arts,Borderline,Orange,17.0,86,3,1 +S299,Science,Regular,Yellow,21.1,91,1,0 +S300,Engineering,Regular,Red,6.7,86,4,1