{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "outputs": [],
      "source": [
        "# Part 6: 머신러닝 기초 실습 (Scikit-learn)\n",
        "\n",
        "이 노트북에서는 **Scikit-learn**을 사용하여 머신러닝의 기본 개념과 실습을 진행합니다.\n",
        "\n",
        "## 학습 목표\n",
        "- Scikit-learn 라이브러리의 기본 사용법 이해\n",
        "- 데이터 전처리 과정 학습\n",
        "- 다양한 머신러닝 알고리즘 실습\n",
        "- 모델 평가 및 시각화\n",
        "\n",
        "## 실습 내용\n",
        "1. 데이터 준비 및 탐색\n",
        "2. 데이터 전처리 (스케일링, 분할)\n",
        "3. 머신러닝 모델 훈련\n",
        "4. 모델 평가 및 시각화\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 필요한 라이브러리 import\n",
        "# pip install scikit-learn matplotlib seaborn\n",
        "\n",
        "import numpy as np\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.preprocessing import StandardScaler\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.tree import DecisionTreeClassifier\n",
        "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n",
        "from sklearn.datasets import load_iris\n",
        "import matplotlib.pyplot as plt\n",
        "import seaborn as sns\n",
        "import os\n",
        "\n",
        "print(\"라이브러리 import 완료!\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "## 1. 데이터 준비 및 탐색\n",
        "\n",
        "Scikit-learn에 내장된 **붓꽃(Iris) 데이터셋**을 사용하여 분류 모델을 구축해보겠습니다.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 데이터 로드\n",
        "iris = load_iris()\n",
        "X = iris.data  # 특성 (꽃받침 길이/너비, 꽃잎 길이/너비)\n",
        "y = iris.target  # 타겟 (품종)\n",
        "\n",
        "print(\"=== 데이터 정보 ===\")\n",
        "print(f\"데이터셋 크기: {X.shape}\")\n",
        "print(f\"타겟 크기: {y.shape}\")\n",
        "print(f\"클래스 종류: {iris.target_names}\")\n",
        "print(f\"특성 이름: {iris.feature_names}\")\n",
        "print(f\"각 클래스별 샘플 수: {np.bincount(y)}\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "## 2. 데이터 전처리 (분할 및 스케일링)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 훈련/테스트 데이터 분리 (80:20 비율)\n",
        "X_train, X_test, y_train, y_test = train_test_split(\n",
        "    X, y, test_size=0.2, random_state=42, stratify=y\n",
        ")\n",
        "\n",
        "print(\"=== 데이터 분할 결과 ===\")\n",
        "print(f\"훈련 데이터 크기: {X_train.shape}\")\n",
        "print(f\"테스트 데이터 크기: {X_test.shape}\")\n",
        "print(f\"훈련 데이터 클래스 분포: {np.bincount(y_train)}\")\n",
        "print(f\"테스트 데이터 클래스 분포: {np.bincount(y_test)}\")\n",
        "\n",
        "# 데이터 스케일링 (표준화)\n",
        "scaler = StandardScaler()\n",
        "X_train_scaled = scaler.fit_transform(X_train)\n",
        "X_test_scaled = scaler.transform(X_test)\n",
        "\n",
        "print(\"\\n=== 스케일링 결과 ===\")\n",
        "print(f\"스케일링 전 훈련 데이터 평균: {X_train.mean(axis=0)}\")\n",
        "print(f\"스케일링 후 훈련 데이터 평균: {X_train_scaled.mean(axis=0)}\")\n",
        "print(f\"스케일링 후 훈련 데이터 표준편차: {X_train_scaled.std(axis=0)}\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "## 3. 머신러닝 모델 훈련\n",
        "\n",
        "두 가지 다른 알고리즘으로 모델을 훈련해보겠습니다:\n",
        "1. **로지스틱 회귀 (Logistic Regression)**: 선형 분류 모델\n",
        "2. **결정 트리 (Decision Tree)**: 비선형 분류 모델\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 모델 1: 로지스틱 회귀\n",
        "log_reg = LogisticRegression(random_state=42)\n",
        "log_reg.fit(X_train_scaled, y_train)\n",
        "print(\"로지스틱 회귀 모델 훈련 완료\")\n",
        "\n",
        "# 모델 2: 결정 트리\n",
        "tree_clf = DecisionTreeClassifier(max_depth=3, random_state=42)\n",
        "tree_clf.fit(X_train_scaled, y_train)\n",
        "print(\"결정 트리 모델 훈련 완료\")\n",
        "\n",
        "# 예측 수행\n",
        "y_pred_log_reg = log_reg.predict(X_test_scaled)\n",
        "y_pred_tree = tree_clf.predict(X_test_scaled)\n",
        "\n",
        "print(\"\\n=== 예측 완료 ===\")\n",
        "print(f\"로지스틱 회귀 예측 결과: {y_pred_log_reg}\")\n",
        "print(f\"결정 트리 예측 결과: {y_pred_tree}\")\n",
        "print(f\"실제 값: {y_test}\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "## 4. 모델 평가 및 성능 분석\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 모델 성능 평가\n",
        "accuracy_log_reg = accuracy_score(y_test, y_pred_log_reg)\n",
        "accuracy_tree = accuracy_score(y_test, y_pred_tree)\n",
        "\n",
        "print(\"=== 모델 성능 비교 ===\")\n",
        "print(f\"로지스틱 회귀 정확도: {accuracy_log_reg:.4f} ({100*accuracy_log_reg:.2f}%)\")\n",
        "print(f\"결정 트리 정확도: {accuracy_tree:.4f} ({100*accuracy_tree:.2f}%)\")\n",
        "\n",
        "print(\"\\n=== 로지스틱 회귀 상세 평가 ===\")\n",
        "print(classification_report(y_test, y_pred_log_reg, target_names=iris.target_names))\n",
        "\n",
        "print(\"\\n=== 결정 트리 상세 평가 ===\")\n",
        "print(classification_report(y_test, y_pred_tree, target_names=iris.target_names))\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "## 5. 결과 시각화\n",
        "\n",
        "혼동 행렬(Confusion Matrix)을 통해 모델의 예측 성능을 시각적으로 분석해보겠습니다.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# 혼동 행렬 시각화\n",
        "fig, axes = plt.subplots(1, 2, figsize=(12, 5))\n",
        "\n",
        "# 로지스틱 회귀 혼동 행렬\n",
        "cm_log_reg = confusion_matrix(y_test, y_pred_log_reg)\n",
        "sns.heatmap(cm_log_reg, annot=True, fmt='d', cmap='Blues', \n",
        "            xticklabels=iris.target_names, yticklabels=iris.target_names,\n",
        "            ax=axes[0])\n",
        "axes[0].set_title('로지스틱 회귀 - 혼동 행렬')\n",
        "axes[0].set_xlabel('예측값')\n",
        "axes[0].set_ylabel('실제값')\n",
        "\n",
        "# 결정 트리 혼동 행렬\n",
        "cm_tree = confusion_matrix(y_test, y_pred_tree)\n",
        "sns.heatmap(cm_tree, annot=True, fmt='d', cmap='Greens', \n",
        "            xticklabels=iris.target_names, yticklabels=iris.target_names,\n",
        "            ax=axes[1])\n",
        "axes[1].set_title('결정 트리 - 혼동 행렬')\n",
        "axes[1].set_xlabel('예측값')\n",
        "axes[1].set_ylabel('실제값')\n",
        "\n",
        "plt.tight_layout()\n",
        "plt.show()\n",
        "\n",
        "print(\"시각화 완료!\")\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "## 요약 및 결론\n",
        "\n",
        "이번 실습에서 다음 내용을 학습했습니다:\n",
        "\n",
        "### 주요 학습 내용\n",
        "1. **데이터 전처리**: 훈련/테스트 분할, 특성 표준화\n",
        "2. **머신러닝 모델**: 로지스틱 회귀, 결정 트리\n",
        "3. **모델 평가**: 정확도, 분류 보고서, 혼동 행렬\n",
        "4. **결과 시각화**: Matplotlib, Seaborn을 활용한 시각화\n",
        "\n",
        "### 추가 실습 제안\n",
        "- 다른 데이터셋으로 실습 (보스턴 주택가격, 와인 데이터 등)\n",
        "- 다른 알고리즘 시도 (SVM, Random Forest, 등)\n",
        "- 교차 검증(Cross-validation) 적용\n",
        "- 하이퍼파라미터 튜닝\n",
        "\n",
        "### 다음 단계\n",
        "Part 7에서는 **딥러닝 기초**를 학습하여 신경망 모델을 구축해보겠습니다!\n"
      ]
    }
  ],
  "metadata": {
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}
