{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7dfe94d8",
   "metadata": {},
   "source": [
    "# 부산 도시철도 시간대별 좌석 확보 가능성 예측 시스템\n",
    "\n",
    "- **팀**: 4J / 3조 (공자빈, 김은희, 박윤성, 최지호)\n",
    "- **문제**: 출퇴근·등하교 시간대 지하철 혼잡으로 좌석 확보가 어려움. 기존 혼잡도 정보는 '앉을 수 있는지'를 직관적으로 알려주지 못함\n",
    "- **목표**: 역별·시간대별 승하차 데이터로 좌석 확보 가능성(여유/보통/혼잡)을 예측\n",
    "- **데이터**: 부산교통공사 시간대별 승하차인원 (2022~2026.06, 공공데이터포털)\n",
    "- **성공 기준**: 분류 정확도 80% 이상, F1-score 0.80 이상\n",
    "\n",
    "### 이 노트북의 진행 순서\n",
    "1. 데이터 로드 및 병합\n",
    "2. 탐색적 데이터 분석(EDA)\n",
    "3. 데이터 구조 변환 (wide → long)\n",
    "4. 노선/방향 파생 및 재차인원(혼잡도) 추정\n",
    "5. 좌석 확보 가능성 라벨링\n",
    "6. 시계열 특성을 반영한 피처 엔지니어링\n",
    "7. 모델 학습 및 평가\n",
    "8. 결론 및 한계"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9706564d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:11.117773Z",
     "iopub.status.busy": "2026-07-29T05:39:11.117773Z",
     "iopub.status.idle": "2026-07-29T05:39:14.831503Z",
     "shell.execute_reply": "2026-07-29T05:39:14.831503Z"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import holidays\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib as mpl\n",
    "\n",
    "from sklearn.ensemble import HistGradientBoostingClassifier\n",
    "from sklearn.inspection import permutation_importance\n",
    "from sklearn.metrics import accuracy_score, f1_score, classification_report, confusion_matrix, ConfusionMatrixDisplay\n",
    "\n",
    "mpl.rcParams[\"axes.unicode_minus\"] = False\n",
    "plt.rcParams[\"font.family\"] = \"Malgun Gothic\"  # Windows 한글 폰트\n",
    "\n",
    "pd.set_option(\"display.max_columns\", 40)\n",
    "RANDOM_STATE = 42"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "392d211c",
   "metadata": {},
   "source": [
    "## 1. 데이터 로드 및 병합\n",
    "\n",
    "`dataset/` 폴더에 연도별(2022~2026.06) CSV 5개가 있다. **파일마다 인코딩이 다르다** (2025년만 UTF-8, 나머지는 CP949) — 그대로 합치면 깨지므로 파일별로 맞는 인코딩을 지정해서 읽는다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "004f76ec",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:14.835515Z",
     "iopub.status.busy": "2026-07-29T05:39:14.835515Z",
     "iopub.status.idle": "2026-07-29T05:39:16.723104Z",
     "shell.execute_reply": "2026-07-29T05:39:16.723104Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(367810, 30)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>역번호</th>\n",
       "      <th>역명</th>\n",
       "      <th>년월일</th>\n",
       "      <th>요일</th>\n",
       "      <th>구분</th>\n",
       "      <th>합계</th>\n",
       "      <th>01시-02시</th>\n",
       "      <th>02시-03시</th>\n",
       "      <th>03시-04시</th>\n",
       "      <th>04시-05시</th>\n",
       "      <th>05시-06시</th>\n",
       "      <th>06시-07시</th>\n",
       "      <th>07시-08시</th>\n",
       "      <th>08시-09시</th>\n",
       "      <th>09시-10시</th>\n",
       "      <th>10시-11시</th>\n",
       "      <th>11시-12시</th>\n",
       "      <th>12시-13시</th>\n",
       "      <th>13시-14시</th>\n",
       "      <th>14시-15시</th>\n",
       "      <th>15시-16시</th>\n",
       "      <th>16시-17시</th>\n",
       "      <th>17시-18시</th>\n",
       "      <th>18시-19시</th>\n",
       "      <th>19시-20시</th>\n",
       "      <th>20시-21시</th>\n",
       "      <th>21시-22시</th>\n",
       "      <th>22시-23시</th>\n",
       "      <th>23시-24시</th>\n",
       "      <th>24시-01시</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>토</td>\n",
       "      <td>승차</td>\n",
       "      <td>5142</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>10</td>\n",
       "      <td>30</td>\n",
       "      <td>46</td>\n",
       "      <td>724</td>\n",
       "      <td>850</td>\n",
       "      <td>310</td>\n",
       "      <td>217</td>\n",
       "      <td>227</td>\n",
       "      <td>219</td>\n",
       "      <td>271</td>\n",
       "      <td>364</td>\n",
       "      <td>371</td>\n",
       "      <td>390</td>\n",
       "      <td>449</td>\n",
       "      <td>249</td>\n",
       "      <td>150</td>\n",
       "      <td>108</td>\n",
       "      <td>105</td>\n",
       "      <td>39</td>\n",
       "      <td>10</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>토</td>\n",
       "      <td>하차</td>\n",
       "      <td>4430</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>36</td>\n",
       "      <td>601</td>\n",
       "      <td>997</td>\n",
       "      <td>67</td>\n",
       "      <td>67</td>\n",
       "      <td>107</td>\n",
       "      <td>155</td>\n",
       "      <td>232</td>\n",
       "      <td>292</td>\n",
       "      <td>322</td>\n",
       "      <td>320</td>\n",
       "      <td>329</td>\n",
       "      <td>283</td>\n",
       "      <td>161</td>\n",
       "      <td>124</td>\n",
       "      <td>83</td>\n",
       "      <td>117</td>\n",
       "      <td>82</td>\n",
       "      <td>36</td>\n",
       "      <td>18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-02</td>\n",
       "      <td>일</td>\n",
       "      <td>승차</td>\n",
       "      <td>3429</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "      <td>24</td>\n",
       "      <td>35</td>\n",
       "      <td>79</td>\n",
       "      <td>146</td>\n",
       "      <td>191</td>\n",
       "      <td>153</td>\n",
       "      <td>238</td>\n",
       "      <td>245</td>\n",
       "      <td>290</td>\n",
       "      <td>342</td>\n",
       "      <td>412</td>\n",
       "      <td>441</td>\n",
       "      <td>344</td>\n",
       "      <td>182</td>\n",
       "      <td>96</td>\n",
       "      <td>109</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-02</td>\n",
       "      <td>일</td>\n",
       "      <td>하차</td>\n",
       "      <td>2992</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>21</td>\n",
       "      <td>41</td>\n",
       "      <td>68</td>\n",
       "      <td>78</td>\n",
       "      <td>89</td>\n",
       "      <td>175</td>\n",
       "      <td>253</td>\n",
       "      <td>259</td>\n",
       "      <td>321</td>\n",
       "      <td>348</td>\n",
       "      <td>304</td>\n",
       "      <td>255</td>\n",
       "      <td>191</td>\n",
       "      <td>158</td>\n",
       "      <td>120</td>\n",
       "      <td>76</td>\n",
       "      <td>104</td>\n",
       "      <td>80</td>\n",
       "      <td>37</td>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-03</td>\n",
       "      <td>월</td>\n",
       "      <td>승차</td>\n",
       "      <td>4323</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>19</td>\n",
       "      <td>62</td>\n",
       "      <td>138</td>\n",
       "      <td>424</td>\n",
       "      <td>422</td>\n",
       "      <td>283</td>\n",
       "      <td>218</td>\n",
       "      <td>243</td>\n",
       "      <td>247</td>\n",
       "      <td>297</td>\n",
       "      <td>352</td>\n",
       "      <td>410</td>\n",
       "      <td>335</td>\n",
       "      <td>371</td>\n",
       "      <td>209</td>\n",
       "      <td>110</td>\n",
       "      <td>75</td>\n",
       "      <td>71</td>\n",
       "      <td>33</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   역번호       역명         년월일 요일  구분    합계  01시-02시  02시-03시  03시-04시  04시-05시  \\\n",
       "0   95  다대포해수욕장  2022-01-01  토  승차  5142        0        0        0       10   \n",
       "1   95  다대포해수욕장  2022-01-01  토  하차  4430        0        0        0        1   \n",
       "2   95  다대포해수욕장  2022-01-02  일  승차  3429        0        0        0        7   \n",
       "3   95  다대포해수욕장  2022-01-02  일  하차  2992        0        0        0        0   \n",
       "4   95  다대포해수욕장  2022-01-03  월  승차  4323        0        0        0       19   \n",
       "\n",
       "   05시-06시  06시-07시  07시-08시  08시-09시  09시-10시  10시-11시  11시-12시  12시-13시  \\\n",
       "0       30       46      724      850      310      217      227      219   \n",
       "1       36      601      997       67       67      107      155      232   \n",
       "2       24       35       79      146      191      153      238      245   \n",
       "3       21       41       68       78       89      175      253      259   \n",
       "4       62      138      424      422      283      218      243      247   \n",
       "\n",
       "   13시-14시  14시-15시  15시-16시  16시-17시  17시-18시  18시-19시  19시-20시  20시-21시  \\\n",
       "0      271      364      371      390      449      249      150      108   \n",
       "1      292      322      320      329      283      161      124       83   \n",
       "2      290      342      412      441      344      182       96      109   \n",
       "3      321      348      304      255      191      158      120       76   \n",
       "4      297      352      410      335      371      209      110       75   \n",
       "\n",
       "   21시-22시  22시-23시  23시-24시  24시-01시  \n",
       "0      105       39       10        3  \n",
       "1      117       82       36       18  \n",
       "2       66       23        6        0  \n",
       "3      104       80       37       14  \n",
       "4       71       33        4        0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DATA_DIR = \"dataset\"\n",
    "files = {\n",
    "    2022: (f\"{DATA_DIR}/부산교통공사_시간대별 승하차인원_2022.csv\", \"cp949\"),\n",
    "    2023: (f\"{DATA_DIR}/부산교통공사_시간대별 승하차인원_2023.csv\", \"cp949\"),\n",
    "    2024: (f\"{DATA_DIR}/부산교통공사_시간대별 승하차인원_2024.csv\", \"cp949\"),\n",
    "    2025: (f\"{DATA_DIR}/부산교통공사_시간대별 승하차인원_2025.csv\", \"utf-8\"),\n",
    "    2026: (f\"{DATA_DIR}/부산교통공사_시간대별 승하차인원_2026.csv\", \"cp949\"),\n",
    "}\n",
    "\n",
    "raw = pd.concat(\n",
    "    [pd.read_csv(path, encoding=enc) for path, enc in files.values()],\n",
    "    ignore_index=True,\n",
    ")\n",
    "print(raw.shape)\n",
    "raw.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7a9da8d4",
   "metadata": {},
   "source": [
    "## 2. 탐색적 데이터 분석 (EDA)\n",
    "\n",
    "기간, 역 개수, 결측치, 범주값을 확인한다. 같은 역(`역번호`)인데 연도마다 `역명` 표기가 다른 경우가 있어(예: `1서면`/`서면`, `국제금융센터`/`국제금융센터부산은행`) 표준화가 필요하다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "d5773719",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:16.723104Z",
     "iopub.status.busy": "2026-07-29T05:39:16.723104Z",
     "iopub.status.idle": "2026-07-29T05:39:16.906473Z",
     "shell.execute_reply": "2026-07-29T05:39:16.905464Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "기간: 2022-01-01 ~ 2026-06-30\n",
      "결측치:\n",
      " 없음\n",
      "구분: <ArrowStringArray>\n",
      "['승차', '하차']\n",
      "Length: 2, dtype: str\n",
      "요일: <ArrowStringArray>\n",
      "['토', '일', '월', '화', '수', '목', '금']\n",
      "Length: 7, dtype: str\n",
      "역번호 하나에 역명이 여러 개인 경우:\n",
      "11 개 역\n",
      "표준화 후 역 개수: 112\n"
     ]
    }
   ],
   "source": [
    "print(\"기간:\", raw[\"년월일\"].min(), \"~\", raw[\"년월일\"].max())\n",
    "null_counts = raw.isnull().sum()\n",
    "print(\"결측치:\\n\", null_counts[null_counts > 0] if null_counts.any() else \"없음\")\n",
    "print(\"구분:\", raw[\"구분\"].unique())\n",
    "print(\"요일:\", raw[\"요일\"].unique())\n",
    "print(\"역번호 하나에 역명이 여러 개인 경우:\")\n",
    "name_counts = raw.groupby(\"역번호\")[\"역명\"].nunique()\n",
    "print(name_counts[name_counts > 1].shape[0], \"개 역\")\n",
    "\n",
    "# 역번호 기준으로 가장 많이 쓰인 역명으로 표준화\n",
    "name_map = raw.groupby(\"역번호\")[\"역명\"].agg(lambda s: s.value_counts().idxmax())\n",
    "raw[\"역명\"] = raw[\"역번호\"].map(name_map)\n",
    "print(\"표준화 후 역 개수:\", raw[\"역번호\"].nunique())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "927bc16f",
   "metadata": {},
   "source": [
    "## 3. 데이터 구조 변환 (wide → long)\n",
    "\n",
    "원본은 한 행이 `역·날짜·구분(승차/하차)`이고 시간대(01시-02시 ~ 24시-01시) 24개가 컬럼으로 펼쳐져 있다(wide). 분석하기 좋게 시간대를 행으로 내리고(long), 승차/하차를 다시 컬럼으로 분리해서 **한 행 = 역·날짜·시간대**가 되도록 만든다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f44c3cf5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:16.908825Z",
     "iopub.status.busy": "2026-07-29T05:39:16.908825Z",
     "iopub.status.idle": "2026-07-29T05:39:30.750218Z",
     "shell.execute_reply": "2026-07-29T05:39:30.750218Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(4413696, 8)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>역번호</th>\n",
       "      <th>역명</th>\n",
       "      <th>년월일</th>\n",
       "      <th>요일</th>\n",
       "      <th>시간대</th>\n",
       "      <th>승차인원</th>\n",
       "      <th>하차인원</th>\n",
       "      <th>시간순</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>토</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>토</td>\n",
       "      <td>02시-03시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>토</td>\n",
       "      <td>03시-04시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>토</td>\n",
       "      <td>04시-05시</td>\n",
       "      <td>10</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>토</td>\n",
       "      <td>05시-06시</td>\n",
       "      <td>30</td>\n",
       "      <td>36</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   역번호       역명        년월일 요일      시간대  승차인원  하차인원  시간순\n",
       "0   95  다대포해수욕장 2022-01-01  토  01시-02시     0     0    1\n",
       "1   95  다대포해수욕장 2022-01-01  토  02시-03시     0     0    2\n",
       "2   95  다대포해수욕장 2022-01-01  토  03시-04시     0     0    3\n",
       "3   95  다대포해수욕장 2022-01-01  토  04시-05시    10     1    4\n",
       "4   95  다대포해수욕장 2022-01-01  토  05시-06시    30    36    5"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hour_cols = [c for c in raw.columns if \"시-\" in c]\n",
    "\n",
    "long_df = raw.melt(\n",
    "    id_vars=[\"역번호\", \"역명\", \"년월일\", \"요일\", \"구분\"],\n",
    "    value_vars=hour_cols,\n",
    "    var_name=\"시간대\",\n",
    "    value_name=\"인원\",\n",
    ")\n",
    "\n",
    "wide = (\n",
    "    long_df.pivot_table(\n",
    "        index=[\"역번호\", \"역명\", \"년월일\", \"요일\", \"시간대\"],\n",
    "        columns=\"구분\",\n",
    "        values=\"인원\",\n",
    "        aggfunc=\"sum\",\n",
    "    )\n",
    "    .reset_index()\n",
    "    .rename_axis(columns=None)\n",
    "    .rename(columns={\"승차\": \"승차인원\", \"하차\": \"하차인원\"})\n",
    ")\n",
    "wide[\"년월일\"] = pd.to_datetime(wide[\"년월일\"])\n",
    "wide[\"시간순\"] = wide[\"시간대\"].str[:2].astype(int)  # 1~24시, 정렬/계산용\n",
    "\n",
    "print(wide.shape)\n",
    "wide.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2cbfddd",
   "metadata": {},
   "source": [
    "### EDA 시각화: 시간대별 평균 승하차 패턴 (서면역)\n",
    "\n",
    "서면역(환승역, 역번호 119)을 예시로 평일 시간대별 평균 승차/하차 인원을 확인한다. 출퇴근 시간대(07~09시, 18~19시)에 뚜렷한 피크가 보인다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5b69457b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:30.750218Z",
     "iopub.status.busy": "2026-07-29T05:39:30.750218Z",
     "iopub.status.idle": "2026-07-29T05:39:31.178628Z",
     "shell.execute_reply": "2026-07-29T05:39:31.178628Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAGGCAYAAACNL1mYAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvctoD+AAAAAlwSFlzAAAPYQAAD2EBqD+naQAArcpJREFUeJzs3Qd4U9X7B/Bv0r0L3RNadtl7CIiyZaMCKktExflz75+KfxX150bFLSAq4mLJENmz7L1HS/eETjqT/3PObUpbOtI2adLk+3mePEnuvUlOb26Svvec874qrVarBREREREREREZhdo4T0tEREREREREDLyJiIiIiIiIjIw93kRERERERERGxMCbiIiIiIiIyIgYeBMREREREREZEQNvIiIiIiIiIiNi4E1ERERERERkRAy8iYiIiIiIiIyIgTcRERERERGRETHwJiIiydHREXl5eUZ7jjNnzuDOO+9E06ZN4eLigptuugn//PNPrZ6jvqp77l27dmHYsGHw9fWFl5cXbr31VmzZsuWG7VQqlUnaZ+zHl32sId4DW1tbk+0nsV68T9VdDNG24uJi2NnZITMz06B/g777v7p9bMzPkT7P/9dff2HAgAHys9SkSRP07dsXP//8c4O2kYjInDDwJiKyEvUNyuoTwJw6dUoGsrfccou8HRUVhVmzZmHy5MlYvnx5ndqkT9v0bd+qVavkSYH77rtPtu/8+fN4/PHHMXPmTPzyyy/1ap8h3oOq/kYR0NT3OWrbnqr+BkOcNDBUoCy21Wq1VV4cHBxgCN9//z2Kiorw3XffwVIcPXoUo0ePhru7uzxBNmTIEERGRtbqOT788EM8++yzeO655+RnSXzeX331Vbz55pv473//a7S2ExGZNS0REVkFBwcH7bVr1+q0vqp1Yrn4KSl7qWy78ePHa+fPn3/D8kWLFt3w+KqewxCq+ju6dOmi/fvvv29YvmPHDm1YWFi5ZfVpX33eg4ouXbqkHT58uN6Pr81rG/NYMITa7CdjPD43N1f75ptvap2dnbX/93//p23SpIn29ddfl8sN0Yba7OOq9nld/sYjR45ofX19tZ9//rk2MTFRm5KSov3222+1Pj4+2p07d+rd/sDAQO3hw4dvWH7x4kWtq6urVqPR1LmNRESNFXu8iYishK63z9CuXbtWY0/i9u3bMW7cuBuWjx8/Ho899li9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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "seomyeon = wide[(wide[\"역번호\"] == 119) & (~wide[\"요일\"].isin([\"토\", \"일\"]))]\n",
    "seomyeon_avg = seomyeon.groupby(\"시간순\")[[\"승차인원\", \"하차인원\"]].mean()\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(10, 4))\n",
    "seomyeon_avg.plot(ax=ax, marker=\"o\")\n",
    "ax.set_title(\"서면역 평일 시간대별 평균 승하차 인원\")\n",
    "ax.set_xlabel(\"시간대(시)\")\n",
    "ax.set_ylabel(\"평균 인원(명)\")\n",
    "ax.set_xticks(range(1, 25))\n",
    "ax.grid(alpha=0.3)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d67d8381",
   "metadata": {},
   "source": [
    "## 4. 노선/방향 파생 및 재차인원(혼잡도) 추정\n",
    "\n",
    "이 데이터는 실제 열차의 좌석 수나 재차인원(열차 안에 타고 있는 인원)을 직접 담고 있지 않다. 대신 `역번호`가 노선 체계를 그대로 반영한다는 점을 이용한다.\n",
    "\n",
    "- 1호선: 95~134, 2호선: 201~243, 3호선: 302~317, 4호선: 402~414\n",
    "- 노선 내에서 역번호는 실제 역 순서대로 증가한다\n",
    "\n",
    "이를 이용해 **누적 순승차인원(Σ(승차−하차), 시발역부터 그 역 직전까지)** 을 그 시간대 열차의 재차인원(혼잡도) 근사치로 계산한다. 역번호가 증가하는 방향(A)과 감소하는 방향(B), 두 방향 모두 계산한다.\n",
    "\n",
    "> **가정/한계**: 시간대별 합산값이라 실제로는 그 1시간 동안 다닌 여러 열차의 승하차가 한 대에 탄 것처럼 누적된다. 따라서 절대적인 재차인원이 아니라 **상대적인 혼잡도 지표**로만 사용한다(5번 라벨링에서 이 점을 반영)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ce658754",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:31.181412Z",
     "iopub.status.busy": "2026-07-29T05:39:31.181412Z",
     "iopub.status.idle": "2026-07-29T05:39:39.942058Z",
     "shell.execute_reply": "2026-07-29T05:39:39.942058Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>노선</th>\n",
       "      <th>역번호</th>\n",
       "      <th>역명</th>\n",
       "      <th>년월일</th>\n",
       "      <th>시간대</th>\n",
       "      <th>승차인원</th>\n",
       "      <th>하차인원</th>\n",
       "      <th>도착재차_A</th>\n",
       "      <th>도착재차_B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>95</td>\n",
       "      <td>다대포해수욕장</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>96</td>\n",
       "      <td>다대포항</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>97</td>\n",
       "      <td>낫개</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>98</td>\n",
       "      <td>신장림</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>99</td>\n",
       "      <td>장림</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1</td>\n",
       "      <td>100</td>\n",
       "      <td>동매</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>101</td>\n",
       "      <td>신평</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>102</td>\n",
       "      <td>하단</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1</td>\n",
       "      <td>103</td>\n",
       "      <td>당리</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1</td>\n",
       "      <td>104</td>\n",
       "      <td>사하</td>\n",
       "      <td>2022-01-01</td>\n",
       "      <td>01시-02시</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   노선  역번호       역명        년월일      시간대  승차인원  하차인원  도착재차_A  도착재차_B\n",
       "0   1   95  다대포해수욕장 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "1   1   96     다대포항 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "2   1   97       낫개 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "3   1   98      신장림 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "4   1   99       장림 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "5   1  100       동매 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "6   1  101       신평 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "7   1  102       하단 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "8   1  103       당리 2022-01-01  01시-02시     0     0     0.0     0.0\n",
       "9   1  104       사하 2022-01-01  01시-02시     0     0     0.0     0.0"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def line_of(station_no):\n",
    "    if 95 <= station_no <= 134:\n",
    "        return 1\n",
    "    if 201 <= station_no <= 243:\n",
    "        return 2\n",
    "    if 302 <= station_no <= 317:\n",
    "        return 3\n",
    "    if 402 <= station_no <= 414:\n",
    "        return 4\n",
    "    raise ValueError(f\"알 수 없는 역번호: {station_no}\")\n",
    "\n",
    "wide[\"노선\"] = wide[\"역번호\"].map(line_of)\n",
    "wide[\"순유입\"] = wide[\"승차인원\"] - wide[\"하차인원\"]\n",
    "wide = wide.sort_values([\"노선\", \"년월일\", \"시간순\", \"역번호\"]).reset_index(drop=True)\n",
    "\n",
    "group_cols = [\"노선\", \"년월일\", \"시간순\"]\n",
    "\n",
    "# 방향 A: 역번호 오름차순으로 이동한다고 가정\n",
    "wide[\"누적A\"] = wide.groupby(group_cols)[\"순유입\"].cumsum()\n",
    "wide[\"도착재차_A\"] = wide.groupby(group_cols)[\"누적A\"].shift(1).fillna(0.0)\n",
    "\n",
    "# 방향 B: 역번호 내림차순으로 이동한다고 가정 (반대로 정렬해서 동일하게 계산)\n",
    "desc = wide.sort_values([\"노선\", \"년월일\", \"시간순\", \"역번호\"], ascending=[True, True, True, False]).copy()\n",
    "desc[\"누적B\"] = desc.groupby(group_cols)[\"순유입\"].cumsum()\n",
    "desc[\"도착재차_B\"] = desc.groupby(group_cols)[\"누적B\"].shift(1).fillna(0.0)\n",
    "\n",
    "wide = wide.merge(\n",
    "    desc[[\"노선\", \"년월일\", \"시간순\", \"역번호\", \"도착재차_B\"]],\n",
    "    on=[\"노선\", \"년월일\", \"시간순\", \"역번호\"],\n",
    "    how=\"left\",\n",
    ")\n",
    "\n",
    "wide[[\"노선\", \"역번호\", \"역명\", \"년월일\", \"시간대\", \"승차인원\", \"하차인원\", \"도착재차_A\", \"도착재차_B\"]].head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a908231f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:39.944559Z",
     "iopub.status.busy": "2026-07-29T05:39:39.944559Z",
     "iopub.status.idle": "2026-07-29T05:39:40.809401Z",
     "shell.execute_reply": "2026-07-29T05:39:40.809401Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(8827392, 11)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "count    8.827392e+06\n",
       "mean     3.704063e+02\n",
       "std      9.134065e+02\n",
       "min      0.000000e+00\n",
       "25%      0.000000e+00\n",
       "50%      0.000000e+00\n",
       "75%      3.100000e+02\n",
       "max      3.037800e+04\n",
       "Name: 도착재차, dtype: float64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 방향(A/B)을 하나의 컬럼으로 만들어 long 형태로 결합 -> 한 행 = 노선·방향·역·날짜·시간대\n",
    "a = wide.rename(columns={\"도착재차_A\": \"도착재차\"}).assign(방향=\"A\")\n",
    "b = wide.rename(columns={\"도착재차_B\": \"도착재차\"}).assign(방향=\"B\")\n",
    "cols = [\"노선\", \"방향\", \"역번호\", \"역명\", \"년월일\", \"요일\", \"시간대\", \"시간순\", \"승차인원\", \"하차인원\", \"도착재차\"]\n",
    "long2 = pd.concat([a[cols], b[cols]], ignore_index=True)\n",
    "long2[\"도착재차\"] = long2[\"도착재차\"].clip(lower=0)\n",
    "\n",
    "print(long2.shape)\n",
    "long2[\"도착재차\"].describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "af71649e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:40.809401Z",
     "iopub.status.busy": "2026-07-29T05:39:40.809401Z",
     "iopub.status.idle": "2026-07-29T05:39:41.281308Z",
     "shell.execute_reply": "2026-07-29T05:39:41.280691Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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xvbNN9/kCgnRbCsZGRnuFrRr1y737/bt2y0zM9MSQb937969ViazlB04yAce/6fMwYDt3XuQcoFsKBcIh3IBykXsNfr7a0lb6f7ll18KXe/Ua6gR3sevv/7q/g0EAskbKFTJr1SpUrb7KlasaHv27CnUtjJ27FgbOXJkrvsbNmxY6P0GYu0y3lJQLsD3BTiPIIcaD1pSULCoXLlycgYKpaWcgeC3336zQw89tFDbyrBhw2zIkCFZPx88eND1TlSvXj1hcy52795t9erVs++++y5XOELqolyAcgG+L8B5BMlYv1DPhMJEnTp18t0uoYGibt267o8MpZ/D9SJEs62kp6e7W6gqVapYMtBBJVCAcgG+L8B5BNQvkOz1zvx6JoJKWQJpYvWUKVPswIEDWfMkNLSpadOm7udt27bZ22+/7XoXCtoWAAAAQNFLaA9Fp06drFy5cnbhhRfa6aefbhMmTLAxY8ZkDUm688477cknn7RZs2YVuC0AAACAFAsUpUqVsjlz5tjjjz9umzdvtscee8w6d+6c9fjVV1/tumhOPfXUArctDjQE6+677841FAupjXIBygX4vgDnERTn+kVaoKB1oAAAAAAgGedQAAAAACjeCBQAAAAAvBEoAAAAAHgjUBQhXfp83759RfkrkSB5XcFddIHF/MpBYR9H8gleWDM/lIvU8/vvv9sff/yR7zaUi9Sli4nl9b1BuUgtmzdvtu+//z7bLVzZSGS5IFAUAR34k046yRo1amSHH364vfzyy0Xxa5Egjz76qF1//fW57v/hhx/s5JNPtqOPPtqVg+effz6mjyP5fPPNN3b++ee7iwIde+yx7t+RI0dm24ZykXp0jSUtga4LtlatWtUuuOACd0XbUD/99JOdcsop7vNes2ZNmzhxYkwfR/Lr2rWrXXfdddnuo1yknoyMDKtfv747/4fehg0blrXNli1b7LTTTsv6vD/zzDPZXqOwj0dEqzwhvs4777zAvffe6/5/8eLFgcqVKwd++ukn3vYSZu3atYFTTz01UL169UCfPn1yPX7BBRcERo0aFTh48GBg6dKlrhxs3rw5Zo8j+cycOTPw5JNPBvbu3et+3rBhQ6BZs2aBF198MWsbykXqmTt3risb+iyrbPTo0SMwbNiwbNt07949cNddd7ltli9f7j7v3377bcweR3KbOnVqIC0tLXDJJZdku59ykXp+/PHHQOPGjfPdpmfPnoHbb7/dfd5XrVoVqFKlSmDjxo0xezwSBIo427JlS6BmzZqBzMzMrPt69eoVmDBhQrx/NYrYjBkzAvfff39g4sSJuQLFtm3bXNDYt29f1n2XXXZZ4KmnnorJ4yg+Hn/88cDAgQPd/1MuIAqdwTIhO3bsCFSrVi2QkZGRdd/ll1/uyk4sHkdy2717d6B+/fqBa665JlugoFykpjVr1gTat2+fb3lRAPj999+z7uvfv3/gkUceicnjkWLIU5wtW7bMWrVqZWXK/P81BFu3bm1r1qyJ969GETvvvPPs1ltvtbJly+Z6bPny5XbCCSdkeyy0HBT2cRSvYVD16tVz/0+5SO35Exs3brT33nvPnnzySevfv3/WYytWrLBmzZrZIYccEvbzXtjHkdxuuukmN9zprLPOynY/5SI17dixww477DA3LEnDn3JauXKlNW3a1MqVKxf2817YxyNFoIizrVu3uvFooWrUqGE7d+6M969GMSoHhX0cxcN//vMfmzJlig0YMMD9TLlIXXPmzLETTzzRzj33XGvXrp21bds26zHKRep6+umn7fPPP7dx48bleoxykZp27txpCxYssBYtWliVKlWsSZMm9uKLLyZdufj/ZnPEzf79+7P9rIQZ2mOB1FBQOSjs40heGl768MMPuwUZpk2b5ibVB1EuUlO3bt3ciXzTpk1u4r4WWejXr1/W45SL1PPZZ5/ZXXfdZZ988olVqFAh7DaUi9TTpUuXrJUjdS6ZN2+e9e3b1w499FDr0aNH0pQLeijirHr16u6kEUo/165dO96/GkmkoHJQ2MeRvLQMn1qhtezf/PnzrXHjxlmPUS6g1Vu0ko/KBuUidWk4iyqHY8eOtfT09KxlQTU0Lrg8KN8XSEtLsw4dOrgVnqZOnZpU5YJAEWeaP6HuS30pBH344YfWvn37eP9qJJGWLVvakiVLsl2fIrQcFPZxJO/1J7Q86KBBg+yBBx5wLUqhKBepSa2MobRkrIYYBGm+lObf6ToE4T7vhX0cydk7oXJx5513Zi0Lqv/X0Dj9K5SL1D2P5KTlg7XktGgo1KpVq2zXrl1hP++FfTxiUU3hhpcLL7zQrcijpfu0ClDz5s0DBw4c4N0sobQkaLhlYy+++OJA7969XTl44IEHAk2bNg3s378/Zo8j+SxatMgtJfzdd99lu23fvj1rG8pF6nnrrbcCo0ePdsszvv3224E6deoEVqxYkW0bre6jpRz1eX/ooYfcspGhqwUW9nEkv0mTJuVaNpZykXreeeedwPXXXx/47LPPAitXrgyMGzfOreKm748g1Tn+/Oc/B5YtW+ZWZzrmmGOyrfJW2McjQaAoAloa8tJLLw0cffTRgW7dukW9ti+KX2Vh0KBBue7/5Zdf3IdW5UDXHtA1CWL5OJLPlClTAnXr1s11Cy0flIvUo+WfhwwZEmjSpEmgU6dOgXnz5uXaRkuE9u3b133eu3btGvjqq69i+jiKx/fHddddl+0+ykXqyczMDAwfPjzQsmXLwAknnBC48sorA+vWrcu2zc6dOwNXXHGF+7x36dIl8OWXX8b08Uik6T/R9WkAAAAAwP9hDgUAAAAAbwQKAAAAAN4IFAAAAAC8ESgAAAAAeCNQAAAAAPBGoAAAAADgjUABAAAAwBuBAgBSxO23325z586NyWvddttt9vHHH8fk+fm91t///vewjxXm9/s+t7B/MwCUVGUSvQMAgPhQBXjevHlZP69fv95ef/11q169erbtxo0bZ2eccUbY5+S13bp166x9+/ZR/f7Q1wl9fn6v9cUXX9hpp52W6/78nvPjjz/a+PHjbfny5XbYYYfZueeea/3797fSpUvn+1yFrZdfftk2bdpkhx56qLVs2dIGDhxo9erVi/hvBoBURKAAgBLqqquusu7du2f9/Je//MXOOussV7kO1bhx47DP+dvf/mbdunWzjh075tou2t+vcNG1a1cXSAp6ndAgokq8gtB9992XK9SE8+2339rJJ5/s/sZbb73Vfv31V3vsscdcWJg8eXKez/v3v/9tjzzyiA0ZMsSOPvpoy8jIsAULFtgpp5xiixcvtlq1akX1twNAKiFQAEAJdeyxx2b9/wsvvGBff/21HX744fb777+7YJHfc/bv3+8q52rtVwU9Z0X/yy+/tH79+kX8+6tWrep+Dr6WTxCRgsKIwsOAAQNs1KhRWffp+ccdd5ytXbvWmjRpEvZ5S5cutXPOOceuuOIKK1Xq/0YDq4di0qRJ7n0gUABA3phDAQAl2ObNm+3aa6+1a665xv75z3/ae++951riL774Yvvoo48sMzMz7PPUE6AwsXLlSlepDlb0H374YXdr3rx5VPvx888/27Zt2yLaNhg8dKtQoYI1atQo62cFk/zodzRs2DDbfYcccogdeeSRtnXr1jyfN2LECDe8SoGrdevWdvzxx1vTpk1daDrxxBMj/CsBIDURKACghHrqqadcZXz37t1uPsGgQYPcnIJ33nnHevfubTfddJPVrFnTfvrpp6zn7Nu3z0aOHGnDhw+30aNH26xZs2zixIkuTKSnp0dcsQ+l3g4NXVIPQbT0nLyep94L7UvoROkuXbq4wPPDDz9k3ffWW2/ZN99844JCXvQ+vPvuu2541bPPPuueozCmiewAgPwx5AkASqgrr7zSBYfKlSvneqxnz57upp4DtcoHTZgwwR599FF75ZVX3HNl+vTpNnToUDcESMEgdPtIKMCol+CNN96w+++/38qUKZMVCDQ3Iq/hUx988IFt3LjR3nzzTbvxxhtdGAqlkJNzTkaPHj1ceGjRooXVrl3bhalKlSq5gFCxYsWw+6fhUTNmzChwKBUAIDwCBQCUQPmt1hROcLKzVjXq06ePq4QHKQxo1aS77747bDjJj3o87rnnHrf8q+Yp/Otf/3I9JaGBQPuak+Z56DnqgdDvvuyyy+y1115zqy8F5TUn45ZbbnEBRHNGFCK0SlNaWlqe+6h5E+edd577O8uVK+f2T79Pk9G1H7o1aNAgqr8bAFIJgQIAUmCFp3ATnEMFW/lV8Q6GCQ2Feumll9wqR1u2bHGV7Tp16tgFF1xgY8aMcf9fEP1O9SwMHjzYzW/QsqtaOSk0EOQcPqWVmS6//HLXe7Jw4UIXCP70pz+5ieRPPPFEvkOXgjQ8S3MgIlG/fn13CypfvrxVqVLFjjrqqKgnogNAKiJQAEAJFLrCks9KS59++qlbMlYt9b169bIaNWq4pVS14pGGROn/NSQpPxo+9f7777ubhjkdccQR9uKLL9pFF13kKut5ee6552zNmjX24YcfZl0DQoFEgaZTp062evXqAvc/v/BU0HPyW3EKAJAbgQIAEHbOgCZma+hQTqpkq5dg/vz5dvbZZ+c7h+OSSy7JNndBF6lTWOjbt2+ez7vhhhvcdSS0wlOov/71ry7g5JxLEU5+F6HT8C5Nws7rOaGPhwazZ555JuzzACDVscoTACAXLZuqSdQbNmzIdv/BgwfdBGb1VOgCcPmeYEqVCjsRuqBAoGFXOcNEpM+NhEJCfqtU5fV4Qc8DgFRFDwUAIOzEZl2jQkOGFAzUMq8J1lpKVXMTdNXpZJ+oHFxFKpy8rrid33Pyex4ApLK0QCAQSPROAADiT5OKFQyiaWVXj4QmZ2uCtOYwaCnWaFd6KmhffParoOfo8e3bt+f5fE1Cz/ncgp6T1/MAINURKAAAAAB4Yw4FAAAAAG8ECgAAAADeCBQAAAAAvBEoAAAAAHgjUAAAAADwRqAAAAAA4I1AAQAAAMAbgQIAAACANwIFAAAAAG8ECgAAAADm638BGkvIL46c7MQAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(8, 4))\n",
    "long2.loc[long2[\"도착재차\"] > 0, \"도착재차\"].clip(upper=long2[\"도착재차\"].quantile(0.99)).hist(bins=50, ax=ax)\n",
    "ax.set_title(\"추정 재차인원(도착재차) 분포 (0 제외, 상위 1% 클리핑)\")\n",
    "ax.set_xlabel(\"추정 재차인원\")\n",
    "ax.set_ylabel(\"빈도\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eb0e5182",
   "metadata": {},
   "source": [
    "## 5. 좌석 확보 가능성 라벨링\n",
    "\n",
    "실제 정원(좌석 수) 데이터가 없어 절대 기준을 쓸 수 없다. 대신 **노선·방향·시간대·요일유형(평일/휴일)별로 그 그룹의 과거 분포 내 백분위**를 기준으로 3단계 라벨을 만든다.\n",
    "\n",
    "- 하위 33% → **여유**, 중간 33% → **보통**, 상위 33% → **혼잡**\n",
    "- 데이터 누수를 막기 위해 임계값(33%, 67% 분위수)은 **학습 기간(2022~2024) 데이터로만** 계산하고, 검증/테스트 기간에는 그 임계값을 그대로 적용한다\n",
    "- **요일유형에 공휴일을 반영한다.** 단순히 토/일만 '휴일'로 보면 평일에 낀 공휴일(예: 화요일 추석)이 평일 기준 분포와 비교되어 라벨이 왜곡된다. `holidays` 패키지로 국내 공휴일을 가져와 토/일 또는 공휴일이면 '휴일'로 묶는다\n",
    "\n",
    "### 시계열 특성을 고려한 분할\n",
    "시간 순서가 있는 데이터이므로 무작위 분할 대신 **시간 기준으로 분할**한다.\n",
    "- Train: 2022-01-01 ~ 2024-12-31 (3년)\n",
    "- Validation: 2025-01-01 ~ 2025-12-31 (1년)\n",
    "- Test: 2026-01-01 ~ 2026-06-30 (최근 6개월, 최종 홀드아웃)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1c61bef2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:41.283405Z",
     "iopub.status.busy": "2026-07-29T05:39:41.283405Z",
     "iopub.status.idle": "2026-07-29T05:39:54.931035Z",
     "shell.execute_reply": "2026-07-29T05:39:54.931035Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train/val/test rows: 5892096 1962240 973056\n",
      "좌석확보\n",
      "여유    0.608546\n",
      "혼잡    0.237372\n",
      "보통    0.154082\n",
      "Name: train, dtype: float64\n",
      "좌석확보\n",
      "여유    0.604323\n",
      "혼잡    0.254021\n",
      "보통    0.141655\n",
      "Name: val, dtype: float64\n",
      "좌석확보\n",
      "여유    0.605531\n",
      "혼잡    0.257751\n",
      "보통    0.136718\n",
      "Name: test, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "TRAIN_END = pd.Timestamp(\"2024-12-31\")\n",
    "VAL_END = pd.Timestamp(\"2025-12-31\")\n",
    "\n",
    "kr_holidays = holidays.KR(years=range(2022, 2027))\n",
    "long2[\"공휴일\"] = long2[\"년월일\"].dt.date.isin(kr_holidays).astype(int)\n",
    "long2[\"요일유형\"] = np.where((long2[\"요일\"].isin([\"토\", \"일\"])) | (long2[\"공휴일\"] == 1), \"휴일\", \"평일\")\n",
    "\n",
    "train_mask = long2[\"년월일\"] <= TRAIN_END\n",
    "val_mask = (long2[\"년월일\"] > TRAIN_END) & (long2[\"년월일\"] <= VAL_END)\n",
    "test_mask = long2[\"년월일\"] > VAL_END\n",
    "print(\"train/val/test rows:\", train_mask.sum(), val_mask.sum(), test_mask.sum())\n",
    "\n",
    "label_group = [\"노선\", \"방향\", \"시간대\", \"요일유형\"]\n",
    "thresholds = (\n",
    "    long2.loc[train_mask]\n",
    "    .groupby(label_group)[\"도착재차\"]\n",
    "    .quantile([0.33, 0.67])\n",
    "    .unstack()\n",
    "    .rename(columns={0.33: \"q33\", 0.67: \"q67\"})\n",
    "    .reset_index()\n",
    ")\n",
    "\n",
    "long2 = long2.merge(thresholds, on=label_group, how=\"left\")\n",
    "long2[\"좌석확보\"] = np.select(\n",
    "    [long2[\"도착재차\"] <= long2[\"q33\"], long2[\"도착재차\"] <= long2[\"q67\"]],\n",
    "    [\"여유\", \"보통\"],\n",
    "    default=\"혼잡\",\n",
    ")\n",
    "\n",
    "print(long2.loc[train_mask, \"좌석확보\"].value_counts(normalize=True).rename(\"train\"))\n",
    "print(long2.loc[val_mask, \"좌석확보\"].value_counts(normalize=True).rename(\"val\"))\n",
    "print(long2.loc[test_mask, \"좌석확보\"].value_counts(normalize=True).rename(\"test\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "598fe815",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:54.931035Z",
     "iopub.status.busy": "2026-07-29T05:39:54.931035Z",
     "iopub.status.idle": "2026-07-29T05:39:55.572276Z",
     "shell.execute_reply": "2026-07-29T05:39:55.572276Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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q+quX78uJ06cMJ+8rpe/AgAAKJ20NzExUSpUqGA+6zIzAROcNDRVrlzZ24cBAAB8VExMjFSqVCnTbQImOGmlyXlSQkNDvX04AADARyQkJJjiijMrZCZggpNzeE5DE8EJAACkZdPKQ3M4AACAJYITAACAJYITAACApYDpcQIAIK+5du2aXLlyxduH4fMKFCgg+fPnz5V9EZwAAPDDeYfi4uLk3Llz3j4UvxEeHi7lypXL8VyOBCcAAPyMMzSVKVNGihQpwsTOWYTMCxcuyKlTp8zt8uXLS04QnAAA8LPhOWdoKlmypLcPxy8ULlzY/KvhSc9bTobtaA4HAMCPOHuatNIEe87zldOeMIITAAB+iM9d9c75IjgBAAC/6VdyOBxePQaCEwAA8Atz586V+fPne/UYaA4HACCPqDZymcee68j4B27ocVoxutFhs169eom3+UTF6aeffpJPPvlEdu7cmeW2v/32m8yZM0e2bNnikWMDAAC54x//+Ie8+eabfn06vV5xeuWVV+Szzz6TFi1ayIgRI2Ty5MkZJsr//Oc/0rVrV7nrrrtk4sSJMm3aNGnSpInkRZ78qyGnfz0AAJCVS5cuyZEjR8zXOp1CoUKFku/Tr8+fPy9FixZNVY3SK+B01u+U+3Bun/Lrq1evSr58+cySp4PTwYMHZcaMGbJ7924JCwuTtWvXSs+ePeWRRx5xWcZ7+umnZeHChXLHHXfI5cuX5ejRo145buSeyH9Fevx0RveJ9vhzAkCge++998zirDyNHDnShB+dnPLnn3+WzZs3y549e6RChQry1VdfyeDBg+X48eNy9913yxdffCEhISEyfvx48/jRo0ebry9evGi2Wbx4sVk/cOBAeeedd/JucFq6dKl069bNhCZ15513mhOjJ65u3bqptl29erVUrlzZhCZVsGBBufnmm71y3HnW6P++Dh4VUcXzzwkA8LiR/z8oOYOP89958+aZpm8deXLSELVmzRqTD5o2bSqLFi1yORr10UcfyfTp02XmzJmyf/9+adWqlbRv317uueeevNnjtG/fvnQBqVatWnL48OF02+oJfOCBB0x1atasWbJp06ZM952UlCQJCQmpFgAA4FtatmyZKjSpUaNGScWKFaVYsWImBB06dMjlYx988EHp3LmzGaLT/NC9e3e390B7NTjFx8dLaGhoqnU6vqllu7S0FKdhqU+fPrJixQrT6/SXv/wlw32PGzfOJFXnotUqAADgW6pXr57uqjsd0tNRqFKlSsmUKVNMD5MrVatWTXVbt//jjz/ybnDShi9tBkspMTHR5TTyWt7TZePGjabiFB0dbcp7e/fudbnvqKgoE8ycS0xMjNu+DwAAYCftBJZpG7oXLFhg+pk1MOnv7h49eogv8WpwqlSpUrpAo7cjIiLSbavNYm3atEluGg8PDzdX1B04cMDlvrVXSqtZKRcAAOA9pUqVkvXr10tcXFxyv1Naep/+ztYRqGXLlsn3338vvsSrwUmnFViyZIn5pGelTeFacapTp07ypxhr8rx+/brpql+5cmXyY/WqOp33qWbNml47fgAAYO/RRx81BZD69eub4TidSiDltARKW3KCg4PNUJ1mBL1SzrlNyu1dPdbVutwW5PDih77oU+tVctqDpCdIpybQDvvevXub+5955hmZOnWqfP3119K2bVuzjTaLaaVJT6Y2lutcTja0OVyfx1VflS/yyjxOhTw/I2ukF66qYzoCAP5MKzV6EZWOzrg7JATKeUvIRkbw6nQEmjqXL19u5nOIjY01ISnlJYQanEqWLGk67pVuq0Hp2LFjMnToUJ8b9wQAAHmb12cOL168uPzf//2fy/saNWpkFicd73z++ec9eHQAAAA+9ll1AAAA/oDgBAAAYIngBAAAYIngBAAAYIngBAAAYIngBAAAYIngBAAAfNbu3bvNp4r4CoITAADwWU8//bRs375dfIXXJ8AEAAC5ZHSY507l6HgJRFScAAAALBGcAACAW8XGxsrRo0fTrdd1ep9TXFycHDhwwKdfDYITAABwq7i4OOnUqVO69Z07d5aTJ0/KtWvXpHfv3nL77bdL8+bNpVevXj77ihCcAACAWzVu3FiKFSsmP/zwQ/K6tWvXStGiRaVRo0Zy8eJFE6y0AqVX0S1ZskSOHDnik68KwQkAALjd0KFDZdKkScm3J0+ebNYpDVU9evSQ69evmxBVqVIlOXHihE++KgQnAADgdl27dpVt27bJ/v375fjx47Jp0ybp0qWLue/w4cPSrl07KV26tNxzzz0SExNjQpQvYjoCAADg/sARHCwDBgyQ999/X8LDw6V///5mnYqKijKBadmyZXL58mWpUKGCz74iBCcAAOARAwYMkAYNGkjJkiVT9TupXbt2ybfffiszZ86UwoUL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AHDHPE42Vafs9jVduHBBJk2aJHv27JGmTZvKoEGDXH4O3rVr1+Tjjz+WDRs2mI97GTBggJlXCgAAwCeDU9o+p99//z3VPE56W2cVz47OnTubsNW2bVv54IMPJCYmRt5666102w0fPtzsu3Xr1rJ9+3YTsqKjo6VMmTLZej4AAACvVJyCgoJSrdPb2bFu3To5efKkLF++3Dz27rvvlvr168vrr78uISEhqbYdNWqU3HTTTebrxx57zISmjRs3SocOHbL1nAAAAH7Z4/TDDz9Ip06dkgNX5cqVJSIiQnbs2JFuW2doUufPn5fDhw9L3bp1PXq8AAAgsGWr4pTbjhw5Ii1atEi1rmrVqnLixAmX27/33nuyYsUKE6zeffddqV69eob7TkpKMotTQkJCLh45AAAIRDluDs/JNAUXL15MNyRXoEABuXLlisvtmzdvLsWLFzcVqrffflu6d+8u+fK5LpqNGzdOxowZc8PHBgAAkKvN4doYnnJddj/wt3DhwnLu3LlU686ePSthYWEut9eGcF2efPJJqVevnumRatmypctto6KiZNiwYakqTjoUCAAA4DPTEWRHzZo1Ze/evcm39aq5ffv2SZ06dTJ9nFaZatSoIYmJiRluo5WstNUsAAAAv20Ob9eunSxYsEBOnTplbi9ZskQqVapkFrV+/XozX5NWoVauXGnmclLHjh2Tn3/+WRo3buzNwwcAAAHGq83hDRo0kJ49e5p/tcqk1aalS5cm3z979myZNm2aPPTQQ3Lw4EHp37+/1KpVS7Zt2yZjx46V8uXLe/PwAQBAgAlyZHfGSjfYunWrxMbGmivswsPDk9fHx8fLli1bzPxOSsOTLg0bNpSyZctm6zm0x0l7p3SfoaGh4uuqjVzm8ec8UqiXx58zMqKKx58zuk+0x58TAOC7spMRvFpxctIhN1fDbvpNOEOT0r4mXQAAALyBD/kFAACwRHACAACwRHACAACwRHACAACwRHACAACwRHACAACwRHACAACwRHACAACwRHACAACwRHACAACwRHACAAAgOAEAAOQuKk4AAACWCE4AAACWgm03BAAA/ivyX5Eef87oPtGS11BxAgAAsETFCQAATxsd5vlzHlHF88+ZB1FxAgAAsERwAgAAsERwAgAAsERwAgAAsERwAgAAsERwAgAAsERwAgAAsMQ8TgCAgFZt5DKPP+eR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",
      "text/plain": [
       "<Figure size 600x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "label_order = [\"여유\", \"보통\", \"혼잡\"]\n",
    "dist = pd.DataFrame({\n",
    "    \"train\": long2.loc[train_mask, \"좌석확보\"].value_counts(normalize=True),\n",
    "    \"val\": long2.loc[val_mask, \"좌석확보\"].value_counts(normalize=True),\n",
    "    \"test\": long2.loc[test_mask, \"좌석확보\"].value_counts(normalize=True),\n",
    "}).reindex(label_order)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(6, 4))\n",
    "dist.plot(kind=\"bar\", ax=ax)\n",
    "ax.set_title(\"분할별 좌석확보 라벨 비율\")\n",
    "ax.set_ylabel(\"비율\")\n",
    "ax.set_xlabel(\"\")\n",
    "plt.xticks(rotation=0)\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "90315ab7",
   "metadata": {},
   "source": [
    "## 6. 시계열 특성을 반영한 피처 엔지니어링\n",
    "\n",
    "같은 역·방향·시간대라도 요일에 따라 패턴이 크게 다르므로(평일 vs 휴일, 같은 평일도 요일마다 다름), **같은 요일의 과거 값**을 지연(lag) 피처로 사용한다.\n",
    "\n",
    "- `공휴일`: 국내 공휴일 여부 (0/1)\n",
    "- `lag_1d`: 하루 전 값 (직전 추세)\n",
    "- `lag_7d`, `lag_14d`, `lag_21d`, `lag_28d`: 1~4주 전 같은 요일의 값 (개별 피처로 사용)\n",
    "- `roll4_주간평균`, `roll4_주간표준편차`: 최근 4주 같은 요일 값의 평균과 변동성(들쭉날쭉한 정도)\n",
    "\n",
    "미래 값을 참조하지 않도록(데이터 누수 방지) 모두 `shift`로 과거 값만 사용한다. 각 역·노선의 첫 4주는 lag 값이 없어 제거한다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "f5032ada",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:39:55.574279Z",
     "iopub.status.busy": "2026-07-29T05:39:55.574279Z",
     "iopub.status.idle": "2026-07-29T05:40:20.669360Z",
     "shell.execute_reply": "2026-07-29T05:40:20.664471Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "lag 결측으로 제거된 행: 150528개 (1.71%)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>노선</th>\n",
       "      <th>방향</th>\n",
       "      <th>요일</th>\n",
       "      <th>요일유형</th>\n",
       "      <th>역순서</th>\n",
       "      <th>시간순</th>\n",
       "      <th>월</th>\n",
       "      <th>공휴일</th>\n",
       "      <th>lag_1d</th>\n",
       "      <th>lag_7d</th>\n",
       "      <th>lag_14d</th>\n",
       "      <th>lag_21d</th>\n",
       "      <th>lag_28d</th>\n",
       "      <th>roll4_주간평균</th>\n",
       "      <th>roll4_주간표준편차</th>\n",
       "      <th>좌석확보</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>1</td>\n",
       "      <td>A</td>\n",
       "      <td>토</td>\n",
       "      <td>휴일</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>여유</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>1</td>\n",
       "      <td>A</td>\n",
       "      <td>일</td>\n",
       "      <td>휴일</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>여유</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>1</td>\n",
       "      <td>A</td>\n",
       "      <td>월</td>\n",
       "      <td>휴일</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>여유</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>1</td>\n",
       "      <td>A</td>\n",
       "      <td>화</td>\n",
       "      <td>휴일</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>여유</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>1</td>\n",
       "      <td>A</td>\n",
       "      <td>수</td>\n",
       "      <td>휴일</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>여유</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   노선 방향 요일 요일유형  역순서  시간순  월  공휴일  lag_1d  lag_7d  lag_14d  lag_21d  lag_28d  \\\n",
       "28  1  A  토   휴일  1.0    1  1    0     0.0     0.0      0.0      0.0      0.0   \n",
       "29  1  A  일   휴일  1.0    1  1    0     0.0     0.0      0.0      0.0      0.0   \n",
       "30  1  A  월   휴일  1.0    1  1    1     0.0     0.0      0.0      0.0      0.0   \n",
       "31  1  A  화   휴일  1.0    1  2    1     0.0     0.0      0.0      0.0      0.0   \n",
       "32  1  A  수   휴일  1.0    1  2    1     0.0     0.0      0.0      0.0      0.0   \n",
       "\n",
       "    roll4_주간평균  roll4_주간표준편차 좌석확보  \n",
       "28         0.0           0.0   여유  \n",
       "29         0.0           0.0   여유  \n",
       "30         0.0           0.0   여유  \n",
       "31         0.0           0.0   여유  \n",
       "32         0.0           0.0   여유  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "long2[\"역순서\"] = long2.groupby(\"노선\")[\"역번호\"].rank(method=\"dense\")  # 노선 내 상대 위치\n",
    "long2[\"월\"] = long2[\"년월일\"].dt.month\n",
    "\n",
    "long2 = long2.sort_values([\"노선\", \"방향\", \"역번호\", \"시간대\", \"년월일\"]).reset_index(drop=True)\n",
    "lag_key = [\"노선\", \"방향\", \"역번호\", \"시간대\"]\n",
    "grouped = long2.groupby(lag_key)[\"도착재차\"]\n",
    "\n",
    "long2[\"lag_1d\"] = grouped.shift(1)\n",
    "long2[\"lag_7d\"] = grouped.shift(7)\n",
    "long2[\"lag_14d\"] = grouped.shift(14)\n",
    "long2[\"lag_21d\"] = grouped.shift(21)\n",
    "long2[\"lag_28d\"] = grouped.shift(28)\n",
    "weekly_lags = long2[[\"lag_7d\", \"lag_14d\", \"lag_21d\", \"lag_28d\"]]\n",
    "long2[\"roll4_주간평균\"] = weekly_lags.mean(axis=1)\n",
    "long2[\"roll4_주간표준편차\"] = weekly_lags.std(axis=1)\n",
    "\n",
    "feature_cols_cat = [\"노선\", \"방향\", \"요일\", \"요일유형\"]\n",
    "feature_cols_num = [\n",
    "    \"역순서\", \"시간순\", \"월\", \"공휴일\",\n",
    "    \"lag_1d\", \"lag_7d\", \"lag_14d\", \"lag_21d\", \"lag_28d\",\n",
    "    \"roll4_주간평균\", \"roll4_주간표준편차\",\n",
    "]\n",
    "\n",
    "before = len(long2)\n",
    "df_model = long2.dropna(subset=feature_cols_num + [\"좌석확보\"]).copy()\n",
    "print(f\"lag 결측으로 제거된 행: {before - len(df_model)}개 ({(before - len(df_model)) / before:.2%})\")\n",
    "\n",
    "for c in feature_cols_cat:\n",
    "    df_model[c] = df_model[c].astype(\"category\")\n",
    "\n",
    "df_model[feature_cols_cat + feature_cols_num + [\"좌석확보\"]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6f9eb15f",
   "metadata": {},
   "source": [
    "## 7. 모델 학습\n",
    "\n",
    "`HistGradientBoostingClassifier`(sklearn)를 사용한다. 데이터가 800만 행 이상으로 크고, 범주형 피처(`categorical_features=\"from_dtype\"`)를 원-핫 인코딩 없이 바로 다룰 수 있어 이 데이터 규모에 적합하다.\n",
    "\n",
    "앞서 정의한 시간 기준 분할(train=2022~2024, val=2025, test=2026 상반기)을 그대로 사용한다.\n",
    "\n",
    "### 하이퍼파라미터 튜닝\n",
    "기본 설정(정확도 85.6%) 대비 개선을 위해 검증셋(2025년) 기준으로 4가지 설정을 비교했다. `early_stopping=True`로 학습 내부에서도 과적합을 억제하고, **학습셋 일부 샘플 정확도와 검증셋 정확도의 차이(gap)** 로 과적합 여부를 확인했다.\n",
    "\n",
    "| 설정 | learning_rate | max_leaf_nodes | min_samples_leaf | l2 | VAL acc | VAL macro-F1 | train-val gap |\n",
    "|---|---|---|---|---|---|---|---|\n",
    "| A (기본형) | 0.1 | 31 | 20 | 0.0 | 0.8653 | 0.8075 | 0.0031 |\n",
    "| B (느리고 깊게) | 0.05 | 63 | 50 | 1.0 | 0.8678 | 0.8113 | 0.0090 |\n",
    "| C (중간) | 0.1 | 63 | 30 | 0.5 | 0.8677 | 0.8114 | 0.0112 |\n",
    "| **D (빠르고 규제 강화)** | **0.15** | **31** | **50** | **1.0** | **0.8667** | **0.8099** | **0.0073** |\n",
    "\n",
    "C가 검증 성능은 근소하게 가장 높지만 gap도 가장 크다. **D는 성능이 C와 거의 같으면서 gap이 더 작아** 과적합 위험이 낮은 쪽을 택해 최종 모델로 선정했다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "e00b73db",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:40:20.669360Z",
     "iopub.status.busy": "2026-07-29T05:40:20.669360Z",
     "iopub.status.idle": "2026-07-29T05:52:09.617174Z",
     "shell.execute_reply": "2026-07-29T05:52:09.611151Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train/val/test: 5741568 1962240 973056\n",
      "실제 학습에 사용된 반복 수(n_iter_): 600\n"
     ]
    }
   ],
   "source": [
    "feature_cols = feature_cols_cat + feature_cols_num\n",
    "\n",
    "train = df_model[df_model[\"년월일\"] <= TRAIN_END]\n",
    "val = df_model[(df_model[\"년월일\"] > TRAIN_END) & (df_model[\"년월일\"] <= VAL_END)]\n",
    "test = df_model[df_model[\"년월일\"] > VAL_END]\n",
    "print(\"train/val/test:\", len(train), len(val), len(test))\n",
    "\n",
    "X_train, y_train = train[feature_cols], train[\"좌석확보\"]\n",
    "X_val, y_val = val[feature_cols], val[\"좌석확보\"]\n",
    "X_test, y_test = test[feature_cols], test[\"좌석확보\"]\n",
    "\n",
    "clf = HistGradientBoostingClassifier(\n",
    "    categorical_features=\"from_dtype\",\n",
    "    learning_rate=0.15,\n",
    "    max_leaf_nodes=31,\n",
    "    min_samples_leaf=50,\n",
    "    l2_regularization=1.0,\n",
    "    max_iter=600,\n",
    "    early_stopping=True,\n",
    "    n_iter_no_change=15,\n",
    "    validation_fraction=0.1,\n",
    "    random_state=RANDOM_STATE,\n",
    ")\n",
    "clf.fit(X_train, y_train)  # 대용량 데이터라 10분 이상 소요될 수 있음\n",
    "print(\"실제 학습에 사용된 반복 수(n_iter_):\", clf.n_iter_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "7bf3e5f6",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:52:09.651686Z",
     "iopub.status.busy": "2026-07-29T05:52:09.641728Z",
     "iopub.status.idle": "2026-07-29T05:53:54.682349Z",
     "shell.execute_reply": "2026-07-29T05:53:54.682349Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TRAIN(sample) accuracy=0.8750  VAL accuracy=0.8672  gap=0.0078\n"
     ]
    }
   ],
   "source": [
    "# 과적합 확인: 학습셋 일부 샘플 정확도 vs 검증셋 정확도 (차이가 크면 과적합 의심)\n",
    "train_sample = X_train.sample(n=200_000, random_state=RANDOM_STATE)\n",
    "train_sample_y = y_train.loc[train_sample.index]\n",
    "train_acc = accuracy_score(train_sample_y, clf.predict(train_sample))\n",
    "val_acc_check = accuracy_score(y_val, clf.predict(X_val))\n",
    "print(f\"TRAIN(sample) accuracy={train_acc:.4f}  VAL accuracy={val_acc_check:.4f}  gap={train_acc - val_acc_check:.4f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3587c376",
   "metadata": {},
   "source": [
    "## 8. 평가\n",
    "\n",
    "성공 기준: **정확도 80% 이상, F1-score 0.80 이상**. macro-F1(클래스별 F1의 단순 평균, 소수 클래스에 민감)과 weighted-F1을 함께 확인한다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ff7ba1bf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:53:54.689198Z",
     "iopub.status.busy": "2026-07-29T05:53:54.689198Z",
     "iopub.status.idle": "2026-07-29T05:57:29.828311Z",
     "shell.execute_reply": "2026-07-29T05:57:29.828311Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--- VAL (2025) ---\n",
      "accuracy=0.8672  macro-F1=0.8108  weighted-F1=0.8649\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "          여유       0.91      0.95      0.93   1185827\n",
      "          보통       0.72      0.67      0.69    277962\n",
      "          혼잡       0.84      0.78      0.81    498451\n",
      "\n",
      "    accuracy                           0.87   1962240\n",
      "   macro avg       0.82      0.80      0.81   1962240\n",
      "weighted avg       0.86      0.87      0.86   1962240\n",
      "\n",
      "\n",
      "--- TEST (2026 상반기) ---\n",
      "accuracy=0.8696  macro-F1=0.8124  weighted-F1=0.8675\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "          여유       0.91      0.95      0.93    589216\n",
      "          보통       0.71      0.67      0.69    133034\n",
      "          혼잡       0.85      0.78      0.82    250806\n",
      "\n",
      "    accuracy                           0.87    973056\n",
      "   macro avg       0.82      0.80      0.81    973056\n",
      "weighted avg       0.87      0.87      0.87    973056\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for name, X, y in [(\"VAL (2025)\", X_val, y_val), (\"TEST (2026 상반기)\", X_test, y_test)]:\n",
    "    pred = clf.predict(X)\n",
    "    acc = accuracy_score(y, pred)\n",
    "    f1_macro = f1_score(y, pred, average=\"macro\")\n",
    "    f1_weighted = f1_score(y, pred, average=\"weighted\")\n",
    "    print(f\"--- {name} ---\")\n",
    "    print(f\"accuracy={acc:.4f}  macro-F1={f1_macro:.4f}  weighted-F1={f1_weighted:.4f}\")\n",
    "    print(classification_report(y, pred, labels=label_order))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3e8d73de",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:57:29.828311Z",
     "iopub.status.busy": "2026-07-29T05:57:29.828311Z",
     "iopub.status.idle": "2026-07-29T05:58:17.164373Z",
     "shell.execute_reply": "2026-07-29T05:58:17.164373Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_pred = clf.predict(X_test)\n",
    "cm = confusion_matrix(y_test, test_pred, labels=label_order)\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(5, 5))\n",
    "ConfusionMatrixDisplay(cm, display_labels=label_order).plot(ax=ax, cmap=\"Blues\", colorbar=False)\n",
    "ax.set_title(\"혼동행렬 (TEST, 2026 상반기)\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2aa16519",
   "metadata": {},
   "source": [
    "## 9. 피처 중요도\n",
    "\n",
    "`HistGradientBoostingClassifier`는 기본 `feature_importances_`를 제공하지 않으므로, 검증셋 일부를 샘플링해 permutation importance(macro-F1 기준)로 어떤 피처가 예측에 가장 크게 기여하는지 확인한다."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "cd329d5d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:58:17.172946Z",
     "iopub.status.busy": "2026-07-29T05:58:17.164373Z",
     "iopub.status.idle": "2026-07-29T05:59:07.384355Z",
     "shell.execute_reply": "2026-07-29T05:59:07.384355Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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ZdGiRZZDhw5ZEhISLAcPHrTMmzfP0rx5c0uNGjUsZ86cSfY5+foYVcWKFS1//fWX2+fp5s2blsOHD1vGjx9vKVKkiGXlypVm+YULFyzly5e3fPLJJ5bTp0+b846Li7PUrl3bvBaqZcuWlqZNm1pmzZpluXbtmm3/jRo1MscdM2aM5ezZs+a56dWrl6V06dLmtZs7d67Z/1dffWXJmzevw2up2y5ZsiTR43C13N26zzzzjOX33383x5g/f74lJibGcv78eb/3p+devHhxS/fu3S3//POP5eLFi5YVK1ZYqlSpYunZs6fDdvfee6/lo48+spw4ccLc9PGWKVPGcv36da+vkatjJ/c5rFevnuX111+37N6925z3qlWrzDl26tQpSY9Pf3/nzJmT6PH88ccflpo1ayZ6PN9//71l2LBhln379pnfHz3n/v37O2xXtGhRS7NmzSxr1qwx7wV6jno++rto75dffrHky5fP8sEHH1j27t1r+ffffy0///yzpUuXLub+UaNGWe6//37ze3758mXL2rVrLXfffbfL3w1P9JwKFixoznXjxo3mnPT3qGTJkpYOHTqYv219HeLj481j1sfnz2P29lj0+Hrezz//vDmOvXbt2lkaNGhgHpue186dO83vub4n+vo7Nnz4cJfvJ/p75bye8zJv1q9fb3nppZcsd9xxh+XLL790u56+h/Tp08flffq8lStXztKjRw/zHLtz6tQpy7vvvmspW7asZdOmTT49Rvub/p16e4z6fE+dOtWnx57WEWRx29N/sDlz5kz0PERERDiEH28hdPTo0ZZ06dJZli9fbpkxY4Z500xOkPUkqfvRf0p6jtWrVzfhKX369OarBojIyEif/+Ek9zzs5ciRI1F4dg7Meo4PP/ywZcOGDbZ19M2+X79+ifZXtWpVy44dO2xBtlu3bonW0eDjvK2GXw0uAwcOdFiuwezvv/8OaJB1VrlyZcvq1av93p/+03388ccT7W///v2WrFmzWs6dO2fbrnfv3g7r6AcEDUXbtm3zen6ujp3c5/Dll19OdAwNR9myZTNBO7mPz1uQdaYf5h588EGH7TJlymQ5fvy4w3oagtq0aePwmDVI/vrrry73q+8h+pw4f1DRUPn00097PS/nx5I5c2YTlOxNnDjRkiVLFtvzoaZPn2556KGH/HrM3h6LHl//3k+ePOmwXP8u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",
      "text/plain": [
       "<Figure size 700x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sample = X_val.sample(n=30_000, random_state=RANDOM_STATE)\n",
    "y_sample = y_val.loc[sample.index]\n",
    "\n",
    "perm = permutation_importance(\n",
    "    clf, sample, y_sample, n_repeats=3, random_state=RANDOM_STATE, scoring=\"f1_macro\", n_jobs=-1\n",
    ")\n",
    "importance = pd.Series(perm.importances_mean, index=feature_cols).sort_values()\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 4))\n",
    "importance.plot(kind=\"barh\", ax=ax)\n",
    "ax.set_title(\"피처 중요도 (Permutation Importance, macro-F1 감소량)\")\n",
    "ax.set_xlabel(\"중요도\")\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70a6e694",
   "metadata": {},
   "source": [
    "## 10. 결론 및 한계\n",
    "\n",
    "### 결과 요약\n",
    "- 공휴일 반영 라벨링 + 확장 피처 + 하이퍼파라미터 튜닝 이후: 검증 정확도 85.6%→**86.7%**(macro-F1 0.794→**0.811**), 테스트 정확도 85.75%→**86.96%**(macro-F1 0.795→**0.812**)로 개선됐다. 성공 기준(정확도 80%, F1 0.80)은 여유 있게 충족하지만, **90%까지는 도달하지 못했다.**\n",
    "- 과적합 확인: 학습셋 샘플 정확도(87.5%)와 검증셋 정확도(86.7%)의 차이는 0.78%p로 작아, 이번에 추가한 피처·하이퍼파라미터가 과적합으로 이어지지는 않았다\n",
    "- 클래스별로는 여전히 '보통'(중간 33% 구간)의 precision·recall이 다른 두 클래스보다 낮다 — 경계에 걸친 애매한 샘플이 몰려 있는 구간이라는, 3등분 라벨링 자체의 근본적 한계다\n",
    "- 피처 중요도 1위는 **`시간순`(시간대)**, 2위는 **`노선`**, 3위는 **`roll4_주간평균`**이었다. `공휴일`은 기여했지만 순위는 중하위였는데, 전체 공휴일 비중 자체가 작아 검증셋 표본에서 영향이 제한적으로 나타난 것으로 보인다\n",
    "\n",
    "### 90%에 못 미친 이유와 남은 개선 여지\n",
    "라벨이 '역·시간대·요일유형별 상대 백분위'로 정의된 이상, 경계값 근방의 샘플은 원리적으로 오분류 여지가 있다. 정확도를 더 끌어올리려면 (1) 실제 열차 배차 간격/정원처럼 지금 없는 데이터를 확보하거나, (2) 클래스 수를 줄이거나 경계를 조정해 문제 자체를 쉽게 만들거나, (3) 인접 역의 동시간대 값처럼 아직 안 쓴 공간적 피처를 추가하는 방향이 남아있다.\n",
    "\n",
    "### 한계\n",
    "1. **좌석 확보 가능성 라벨이 상대적 지표다.** 실제 열차 정원/좌석 수 데이터가 없어 \"그 역·시간대 기준으로 평소보다 여유/혼잡한지\"를 나타낼 뿐, \"실제로 앉을 수 있다\"는 절대적 보장이 아니다.\n",
    "2. **재차인원 추정치는 시간대 합산값 기반 근사치다.** 1시간 동안 운행한 여러 열차의 승하차를 누적해 계산했기 때문에, 실제 한 열차의 재차인원보다 크게 잡힐 수 있다.\n",
    "3. **행사·날씨·지연 운행 등 변수를 반영하지 못했다.** 공휴일은 반영했지만, 문제정의서에 명시된 다른 리스크(돌발 상황 미반영, 시간대별 데이터 불균형)는 여전히 유효하다.\n",
    "4. **역번호 순서를 물리적 역 순서로 가정했다.** 공식 노선도로 교차 검증하지는 않았다.\n",
    "5. **하이퍼파라미터 탐색은 4개 설정으로 제한했다.** 더 넓은 그리드나 베이지안 최적화를 쓰면 추가 개선 여지가 있으나, 데이터 규모상 설정 1개당 학습에 10분 이상 걸려 탐색 범위를 제한했다."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d9d523c",
   "metadata": {},
   "source": [
    "## 11. 모델 저장 (배포용)\n",
    "\n",
    "홈페이지(`model/predict.py`)에서 불러와 쓸 수 있도록 `model/seat_model.pkl`로 저장한다. 저장 형식은 `model/train_reference.md`에 정의된 계약을 따른다:\n",
    "\n",
    "- `model`: 학습된 분류기\n",
    "- `feature_cols_cat` / `feature_cols_num`: 학습에 사용한 피처 목록 (이번에 늘어난 피처 반영)\n",
    "- `label_order`: 클래스 순서\n",
    "- `categories`: 범주형 컬럼별 카테고리 목록 — 추론 시 `pd.Categorical(..., categories=...)`로 동일 인코딩을 재현하기 위해 실제 학습에 쓰인 `X_train` 기준으로 저장한다\n",
    "- `latest_features`: 요청 시점에 날짜별 lag 값을 조회할 수 없으므로, `(노선, 방향, 역번호, 시간대)` 조합별 **가장 최근 시점의 피처값**을 대신 저장해 \"현재 시점 근사치\"로 사용한다"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "84c2ec9a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-29T05:59:07.390771Z",
     "iopub.status.busy": "2026-07-29T05:59:07.390771Z",
     "iopub.status.idle": "2026-07-29T05:59:27.185471Z",
     "shell.execute_reply": "2026-07-29T05:59:27.185471Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "저장 완료: model/seat_model.pkl\n",
      "latest_features shape: (5376, 8)\n"
     ]
    }
   ],
   "source": [
    "import joblib\n",
    "\n",
    "lookup_cols = [\"역순서\", \"lag_1d\", \"lag_7d\", \"lag_14d\", \"lag_21d\", \"lag_28d\", \"roll4_주간평균\", \"roll4_주간표준편차\"]\n",
    "\n",
    "latest_features = (\n",
    "    df_model.sort_values(\"년월일\")\n",
    "    .groupby([\"노선\", \"방향\", \"역번호\", \"시간대\"])\n",
    "    .tail(1)\n",
    "    .set_index([\"노선\", \"방향\", \"역번호\", \"시간대\"])[lookup_cols]\n",
    ")\n",
    "\n",
    "model_bundle = {\n",
    "    \"model\": clf,\n",
    "    \"feature_cols_cat\": feature_cols_cat,\n",
    "    \"feature_cols_num\": feature_cols_num,\n",
    "    \"label_order\": label_order,\n",
    "    \"categories\": {c: X_train[c].cat.categories.tolist() for c in feature_cols_cat},\n",
    "    \"latest_features\": latest_features,\n",
    "}\n",
    "\n",
    "joblib.dump(model_bundle, \"model/seat_model.pkl\")\n",
    "print(\"저장 완료: model/seat_model.pkl\")\n",
    "print(\"latest_features shape:\", latest_features.shape)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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
}
