{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "outputs": [],
      "source": [
        "# Part 5: AI 핵심 라이브러리 (NumPy & Pandas)\n",
        "\n",
        "이 노트북에서는 AI 개발의 핵심이 되는 NumPy와 Pandas 라이브러리를 실습을 통해 학습합니다.\n",
        "\n",
        "## 학습 목표\n",
        "- NumPy의 다차원 배열(ndarray)을 이해하고 벡터화 연산을 수행할 수 있습니다.\n",
        "- Pandas의 DataFrame과 Series를 활용하여 데이터를 효율적으로 처리할 수 있습니다.\n",
        "- 실제 데이터를 사용한 기본적인 데이터 분석을 수행할 수 있습니다.\n",
        "\n",
        "## 핵심 용어\n",
        "- **NumPy**: 고성능 과학 계산을 위한 파이썬 라이브러리\n",
        "- **ndarray**: NumPy의 N차원 배열 객체\n",
        "- **Pandas**: 구조화된 데이터 처리를 위한 라이브러리\n",
        "- **DataFrame**: 행과 열로 구성된 2차원 데이터 구조\n",
        "- **Series**: 1차원 레이블이 있는 배열\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "\n",
        "# NumPy 버전 확인\n",
        "print(f\"NumPy 버전: {np.__version__}\")\n",
        "print(f\"Pandas 버전: {pd.__version__}\")\n",
        "\n",
        "# 한글 폰트 설정 (matplotlib에서 한글 표시를 위해)\n",
        "plt.rcParams['font.family'] = 'DejaVu Sans'\n",
        "plt.rcParams['axes.unicode_minus'] = False\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "outputs": [],
      "source": [
        "## NumPy 실습"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# --- Numpy (Numerical Python) ---\n",
        "print(\"--- Numpy 실습 ---\")\n",
        "\n",
        "# Numpy 배열 생성\n",
        "arr = np.array([1, 2, 3, 4, 5])\n",
        "print(f\"1차원 배열: {arr}\")\n",
        "\n",
        "arr2d = np.array([[1, 2, 3], [4, 5, 6]])\n",
        "print(f\"2차원 배열:\\n{arr2d}\")\n",
        "\n",
        "# 배열의 형태, 차원, 타입 확인\n",
        "print(f\"형태(shape): {arr2d.shape}\")\n",
        "print(f\"차원(ndim): {arr2d.ndim}\")\n",
        "print(f\"타입(dtype): {arr2d.dtype}\")\n",
        "\n",
        "# Numpy 연산 (브로드캐스팅)\n",
        "arr_a = np.array([1, 2, 3])\n",
        "arr_b = np.array([4, 5, 6])\n",
        "print(f\"배열 A: {arr_a}\")\n",
        "print(f\"배열 B: {arr_b}\")\n",
        "print(f\"A + B = {arr_a + arr_b}\")\n",
        "print(f\"A * 2 = {arr_a * 2}\")\n",
        "\n",
        "# 다양한 배열 생성\n",
        "zeros_arr = np.zeros((2, 3))\n",
        "print(f\"0으로 채워진 배열:\\n{zeros_arr}\")\n",
        "ones_arr = np.ones((3, 2))\n",
        "print(f\"1로 채워진 배열:\\n{ones_arr}\")\n",
        "range_arr = np.arange(0, 10, 2)  # 0부터 10 전까지 2의 간격으로\n",
        "print(f\"arange(0, 10, 2): {range_arr}\")\n",
        "print(\"-\" * 30)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "outputs": [],
      "source": [
        "## Pandas 실습"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# --- Pandas (Python Data Analysis Library) ---\n",
        "print(\"\\n--- Pandas 실습 ---\")\n",
        "\n",
        "# Pandas Series 생성 (1차원 데이터)\n",
        "s = pd.Series([1, 3, 5, np.nan, 6, 8])\n",
        "print(f\"Pandas Series:\\n{s}\")\n",
        "\n",
        "# Pandas DataFrame 생성 (2차원 데이터)\n",
        "data = {\n",
        "    \"이름\": [\"Alice\", \"Bob\", \"Charlie\", \"David\"],\n",
        "    \"나이\": [25, 30, 35, 28],\n",
        "    \"도시\": [\"서울\", \"부산\", \"서울\", \"대전\"],\n",
        "}\n",
        "df = pd.DataFrame(data)\n",
        "\n",
        "print(f\"\\nPandas DataFrame:\\n{df}\")\n",
        "\n",
        "# 데이터 확인\n",
        "print(\"\\nDataFrame 정보 (info):\")\n",
        "df.info()\n",
        "\n",
        "print(f\"\\n상위 2개 데이터 (head):\\n{df.head(2)}\")\n",
        "print(f\"\\n기술 통계 (describe):\\n{df.describe()}\")\n",
        "\n",
        "# 데이터 선택\n",
        "print(f\"\\n'이름' 컬럼 선택:\\n{df['이름']}\")\n",
        "print(f\"\\n0번, 1번 행 선택 (iloc):\\n{df.iloc[0:2]}\")\n",
        "print(f\"\\n'나이'가 30 이상인 데이터 필터링:\\n{df[df['나이'] >= 30]}\")\n",
        "\n",
        "# 데이터 추가 및 수정\n",
        "df[\"월급\"] = [300, 400, 500, 350]\n",
        "print(f\"\\n'월급' 컬럼 추가 후:\\n{df}\")\n",
        "print(\"-\" * 30)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "vscode": {
          "languageId": "plaintext"
        }
      },
      "outputs": [],
      "source": [
        "## Maplotlib 실습"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "# --- Matplotlib (Data Visualization Library) ---\n",
        "print(\"\\n--- Matplotlib 실습 ---\")\n",
        "\n",
        "# 저장할 디렉터리 생성\n",
        "output_dir = \"plot_outputs\"\n",
        "if not os.path.exists(output_dir):\n",
        "    os.makedirs(output_dir)\n",
        "print(f\"그래프는 '{output_dir}' 폴더에 저장됩니다.\")\n",
        "\n",
        "# 1. 라인 플롯 (Line Plot)\n",
        "x = np.arange(0, 10, 0.1)\n",
        "y = np.sin(x)\n",
        "\n",
        "plt.figure(figsize=(10, 5))\n",
        "plt.plot(x, y, label=\"sin(x)\")\n",
        "plt.title(\"Sine Wave\")\n",
        "plt.xlabel(\"x-axis\")\n",
        "plt.ylabel(\"y-axis\")\n",
        "plt.grid(True)\n",
        "plt.legend()\n",
        "\n",
        "# 그래프를 파일로 저장\n",
        "line_plot_path = os.path.join(output_dir, \"line_plot.png\")\n",
        "plt.savefig(line_plot_path)\n",
        "print(f\"라인 플롯 저장 완료: {line_plot_path}\")\n",
        "plt.close()  # 플롯 창을 닫아 다음 플롯에 영향이 없도록 함\n",
        "\n",
        "# 2. 바 차트 (Bar Chart)\n",
        "cities = df[\"도시\"].value_counts()\n",
        "\n",
        "plt.figure(figsize=(8, 6))\n",
        "cities.plot(kind=\"bar\", color=[\"skyblue\", \"salmon\", \"lightgreen\"])\n",
        "plt.title(\"City Distribution\")\n",
        "plt.xlabel(\"City\")\n",
        "plt.ylabel(\"Number of People\")\n",
        "plt.xticks(rotation=0)  # x축 레이블 회전 방지\n",
        "\n",
        "bar_chart_path = os.path.join(output_dir, \"bar_chart.png\")\n",
        "plt.savefig(bar_chart_path)\n",
        "print(f\"바 차트 저장 완료: {bar_chart_path}\")\n",
        "plt.close()\n",
        "\n",
        "# 3. 스캐터 플롯 (Scatter Plot)\n",
        "x_rand = np.random.rand(50)\n",
        "y_rand = np.random.rand(50)\n",
        "colors = np.random.rand(50)\n",
        "area = (30 * np.random.rand(50)) ** 2\n",
        "\n",
        "plt.figure(figsize=(10, 6))\n",
        "plt.scatter(x_rand, y_rand, s=area, c=colors, alpha=0.5)\n",
        "plt.title(\"Scatter Plot\")\n",
        "plt.xlabel(\"Random X\")\n",
        "plt.ylabel(\"Random Y\")\n",
        "\n",
        "scatter_plot_path = os.path.join(output_dir, \"scatter_plot.png\")\n",
        "plt.savefig(scatter_plot_path)\n",
        "print(f\"스캐터 플롯 저장 완료: {scatter_plot_path}\")\n",
        "plt.close()\n",
        "\n",
        "print(\"-\" * 30)\n"
      ]
    }
  ],
  "metadata": {
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}
