{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "7cb8e432-c199-40fd-9087-ab0cf7abca7a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" PassengerId | \n",
" Survived | \n",
" Pclass | \n",
" Name | \n",
" Sex | \n",
" Age | \n",
" SibSp | \n",
" Parch | \n",
" Ticket | \n",
" Fare | \n",
" Cabin | \n",
" Embarked | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 3 | \n",
" Braund, Mr. Owen Harris | \n",
" male | \n",
" 22.0 | \n",
" 1 | \n",
" 0 | \n",
" A/5 21171 | \n",
" 7.2500 | \n",
" NaN | \n",
" S | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
" 1 | \n",
" Cumings, Mrs. John Bradley (Florence Briggs Th... | \n",
" female | \n",
" 38.0 | \n",
" 1 | \n",
" 0 | \n",
" PC 17599 | \n",
" 71.2833 | \n",
" C85 | \n",
" C | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" 1 | \n",
" 3 | \n",
" Heikkinen, Miss. Laina | \n",
" female | \n",
" 26.0 | \n",
" 0 | \n",
" 0 | \n",
" STON/O2. 3101282 | \n",
" 7.9250 | \n",
" NaN | \n",
" S | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" PassengerId Survived Pclass \\\n",
"0 1 0 3 \n",
"1 2 1 1 \n",
"2 3 1 3 \n",
"\n",
" Name Sex Age SibSp \\\n",
"0 Braund, Mr. Owen Harris male 22.0 1 \n",
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n",
"2 Heikkinen, Miss. Laina female 26.0 0 \n",
"\n",
" Parch Ticket Fare Cabin Embarked \n",
"0 0 A/5 21171 7.2500 NaN S \n",
"1 0 PC 17599 71.2833 C85 C \n",
"2 0 STON/O2. 3101282 7.9250 NaN S "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 필요한 라이브러리, 시각화 패키지, 파일 불러오기\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"%matplotlib inline\n",
"\n",
"titanic_df = pd.read_csv('C:/Users/niceq/Documents/DataScience/Python ML Guide/Data/01. titanic_train.csv')\n",
"titanic_df.head(3)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "6cf81697-3c57-442a-9f40-fe620015db82",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
" ### 학습 데이터 정보 ### \n",
"\n",
"\n",
"RangeIndex: 891 entries, 0 to 890\n",
"Data columns (total 12 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 PassengerId 891 non-null int64 \n",
" 1 Survived 891 non-null int64 \n",
" 2 Pclass 891 non-null int64 \n",
" 3 Name 891 non-null object \n",
" 4 Sex 891 non-null object \n",
" 5 Age 714 non-null float64\n",
" 6 SibSp 891 non-null int64 \n",
" 7 Parch 891 non-null int64 \n",
" 8 Ticket 891 non-null object \n",
" 9 Fare 891 non-null float64\n",
" 10 Cabin 204 non-null object \n",
" 11 Embarked 889 non-null object \n",
"dtypes: float64(2), int64(5), object(5)\n",
"memory usage: 83.7+ KB\n",
"None\n"
]
}
],
"source": [
"# 로딩된 데이터 칼럼 타입 확인\n",
"print('\\n ### 학습 데이터 정보 ### \\n')\n",
"print(titanic_df.info())"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "7494ee6b-9922-40c7-ae00-67ae13577f22",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"데이터 세트 Null 값 개수 0\n"
]
}
],
"source": [
"# 결손값 처리\n",
"titanic_df['Age'].fillna(titanic_df['Age'].mean(), inplace=True)\n",
"titanic_df['Cabin'].fillna('N', inplace=True)\n",
"titanic_df['Embarked'].fillna('N', inplace=True)\n",
"# 결손값 처리 후 확인\n",
"print('데이터 세트 Null 값 개수 ', titanic_df.isnull().sum().sum())"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "878a4536-8178-4e53-af08-636b9004256f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sex 값 분포:\n",
" Sex\n",
"male 577\n",
"female 314\n",
"Name: count, dtype: int64\n",
"Cabin 값 분포:\n",
" Cabin\n",
"N 687\n",
"C23 C25 C27 4\n",
"G6 4\n",
"B96 B98 4\n",
"C22 C26 3\n",
" ... \n",
"E34 1\n",
"C7 1\n",
"C54 1\n",
"E36 1\n",
"C148 1\n",
"Name: count, Length: 148, dtype: int64\n",
"Embarked 값 분포:\n",
" Embarked\n",
"S 644\n",
"C 168\n",
"Q 77\n",
"N 2\n",
"Name: count, dtype: int64\n"
]
}
],
"source": [
"# 문자열 피처들의 값 분류 파악\n",
"print('Sex 값 분포:\\n', titanic_df['Sex'].value_counts())\n",
"print('Cabin 값 분포:\\n', titanic_df['Cabin'].value_counts())\n",
"print('Embarked 값 분포:\\n', titanic_df['Embarked'].value_counts())"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "4768ff7b-aeea-48a7-9645-104bdef4b103",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0 N\n",
"1 C\n",
"2 N\n",
"Name: Cabin, dtype: object\n"
]
}
],
"source": [
"# cabin 앞 문자 추출\n",
"titanic_df['Cabin'] = titanic_df['Cabin'].str[:1]\n",
"print(titanic_df['Cabin'].head(3))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "97e2a27c-4b50-4e55-a12e-92b08452d1b3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Sex Survived\n",
"female 0 81\n",
" 1 233\n",
"male 0 468\n",
" 1 109\n",
"Name: Survived, dtype: int64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 성별 기준 생존자 확인\n",
"titanic_df.groupby(['Sex', 'Survived'])['Survived'].count()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "40cad9e5-8b9c-413d-9043-45dd54d163eb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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R+EGAADAap0ONzNmzAj+PHPmzN6oBQAA4Lh163tuzjjjDN166616//33e6SIkpISJSUlKTIyUhkZGaqqqurUuK1bt8pms2n+/Pk9UgcAAOj/uhVuli1bpm3btunMM8/U1KlTtWnTJnk8nm4VUF5eLqfTqaKiItXU1GjSpEnKzs5WfX39Mcd99NFHuu6663T++ed367gAAMBM3Qo31157rV555RW98847mjNnjkpKSpSYmKjZs2frwQcf7NK+Nm7cqKVLlyo/P1/JyckqLS1VVFSUysrKjjqmra1NP/vZz3Tbbbdp7Nix3TkFAABgqON6/MK4ceN022236b333tMLL7yghoYG5efnd3p8a2urqqurlZWV9V1BYWHKyspSZWXlUcetXbtWo0aN0uLFi3/wGC0tLfL5fO02AABgrm59id/3VVVVacuWLSovL5fP59OCBQs6PbaxsVFtbW1yOBzt2h0Oh959990Ox7z44ou6//779dprr3XqGC6Xi4d5AgBwAunWzM17772noqIijRs3Tueee67eeecdbdiwQV6vV1u3bu3pGoMOHDigRYsWafPmzYqLi+vUmIKCAjU1NQW3urq6XqsPAABYr1szN98uJF6+fLmuuOKKI2ZeOisuLk7h4eHyer3t2r1er+Lj44/ov3fvXn300UeaN29esM3v90uSBgwYoD179ui0005rN8Zut8tut3erPgAA0P90Ody0tbXp97//vS677DINGzbsuA4eERGh1NRUud3u4O3cfr9fbrdbK1asOKL/mWeeqd27d7dru/nmm3XgwAFt2rRJiYmJx1UPAADo/7ocbsLDw7Vy5UplZWUdd7iRJKfTqby8PKWlpSk9PV3FxcVqbm4OLkzOzc1VQkKCXC6XIiMjNWHChHbjhw4dKklHtAMAgBNTty5LTZgwQR9++KFOPfXU4y4gJydHDQ0NKiwslMfjUUpKiioqKoKXumpraxUWdlw3dQEAgBOILRAIBLo6qKKiQgUFBVq3bp1SU1M1ePDgdu+H8lPBfT6fYmNj1dTUFNJ1AghdtWsnWl0CEHJOKdz9w52OQ1f+fndr5mbOnDmSpJ/85CftHqDJU8EBAIDVuhVunnvuuZ6uAwAAoEd0K9x8/wnhAAAAoaRb4eYvf/nLMd+fPn16t4oBAAA4Xt0KNzNnzjyi7ftrb1hzAwAArNKte6y/+OKL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wsCBA9u9ttls7dpsNpukv62d2bp1q6677jrdddddyszM1JAhQ3THHXfo5Zdf7nDfBw8elCRt27ZNCQkJ7d7jmTVAz+vKZ+7vP+cd/V/w/UtO8+bN05gxY7R582addNJJ8vv9mjBhglpbW49ay7x587Rhw4Yj3hs9enTXTgwhg3AD47z00kuaNm2ali1bFmw71oLC5ORk2e121dbWasaMGX1RInBC663P3GeffaY9e/Zo8+bNOv/88yVJL7744jHHTJkyRY899piSkpI0YAB/Ek3BvySMc8YZZ+jBBx/U008/rVNPPVUPPfSQXnnlFZ166qkd9h8yZIiuu+46XXvttfL7/TrvvPPU1NSkl156STExMcrLy+vjMwDM1lufuWHDhmnEiBG69957NXr0aNXW1mr16tXHHLN8+XJt3rxZCxcu1A033KDhw4frgw8+0NatW3XfffcpPDy8W7XAWoQbGOcXv/iFXn31VeXk5Mhms2nhwoVatmxZ8Fbxjqxbt04jR46Uy+XShx9+qKFDh2rKlClas2ZNH1YOnDh64zMXFhamrVu36le/+pUmTJig8ePH67e//a1mzpx51DEnnXSSXnrpJd14442aPXu2WlpaNGbMGF100UUKC+OG4v7KFggEAlYXAQAA0FOIpQAAwCiEGwAAYBTCDQAAMArhBgAAGIVwAwAAjEK4AQAARiHcAAAAoxBuAACAUQg3AADAKIQbAP1CQ0ODrrnmGp1yyimy2+2Kj49Xdna2XnrpJatLAxBieLYUgH7h0ksvVWtrqx544AGNHTtWXq9Xbrdbn332mdWlAQgxzNwACHlffvmlXnjhBW3YsEH/8A//oDFjxig9PV0FBQX6yU9+EuyzZMkSjRw5UjExMbrgggv0+uuvS/rbrE98fLxuv/324D537typiIgIud1uS84JQO8h3AAIedHR0YqOjtYTTzyhlpaWDvssWLBA9fX1euqpp1RdXa0pU6bowgsv1Oeff66RI0eqrKxMt956q3bt2qUDBw5o0aJFWrFihS688MI+PhsAvY2nggPoFx577DEtXbpUX331laZMmaIZM2boiiuu0Nlnn60XX3xRc+fOVX19vex2e3DM6aefrhtuuEFXX321JGn58uV69tlnlZaWpt27d+uVV15p1x+AGQg3APqNw4cP64UXXtD//d//6amnnlJVVZXuu+8+NTc361e/+pUGDRrUrv9XX32l6667Ths2bAi+njBhgurq6lRdXa2JEydacRoAehnhBkC/tWTJEj3zzDNatmyZ7r77bu3YseOIPkOHDlVcXJwk6c0339TUqVP19ddf6z//8z81b968Pq4YQF/gbikA/VZycrKeeOIJTZkyRR6PRwMGDFBSUlKHfVtbW3XVVVcpJydH48eP15IlS7R7926NGjWqb4sG0OuYuQEQ8j777DMtWLBA//iP/6izzz5bQ4YM0a5du7Ry5UrNnTtX9913n6ZPn64DBw7oN7/5jcaNG6d9+/Zp27ZtuuSSS5SWlqbrr79ejz76qF5//XVFR0drxowZio2N1Z///GerTw9ADyPcAAh5LS0tuvXWW7V9+3bt3btXX3/9tRITE7VgwQKtWbNGgwYN0oEDB3TTTTfpscceC976PX36dLlcLu3du1ezZs3Sc889p/POO0+S9NFHH2nSpElav369rrnmGovPEEBPItwAAACj8D03AADAKIQbAABgFMINAAAwCuEGAAAYhXADAACMQrgBAABGIdwAAACjEG4AAIBRCDcAAMAohBsAAGAUwg0AADDK/wMqsqkYuVUB7gAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 그래프로 확인하기\n",
"sns.barplot(x='Sex', y='Survived', data=titanic_df)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "77a41f86-4753-4021-a027-737af9905887",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAulklEQVR4nO3de1xVdb7/8fcGBTRuKrDxAoKTWo6KKGpYqRlK2lh29UQXJbOTt0x+NoYVlnbESh2snCgbUpvM20zWyWuRWCaTipFW00XS8KQg3kBQQYHfH+WeeIjGZcuCL6/n47Efj72/+/td67NwFW/W+q61bOXl5eUCAAAwhIvVBQAAADgT4QYAABiFcAMAAIxCuAEAAEYh3AAAAKMQbgAAgFEINwAAwChNrC6grpWVlengwYPy8vKSzWazuhwAAFAF5eXlOnnypNq0aSMXl0sfm2l04ebgwYMKCgqyugwAAFADBw4cULt27S7Zp9GFGy8vL0m//HC8vb0trgYAAFRFQUGBgoKCHL/HL6XRhZvzp6K8vb0JNwAANDBVmVLChGIAAGAUwg0AADAK4QYAABil0c25AQDgUkpLS3X27Fmry2iU3Nzcfvcy76og3AAAoF/uo5KTk6MTJ05YXUqj5eLiotDQULm5udVqOYQbAAAkR7AJCAhQ8+bNudFrHTt/k91Dhw4pODi4Vj9/wg0AoNErLS11BJtWrVpZXU6j5e/vr4MHD+rcuXNq2rRpjZfDhGIAQKN3fo5N8+bNLa6kcTt/Oqq0tLRWyyHcAADwK05FWctZP3/CDQAAMArhBgAAGMXScPPJJ59o+PDhatOmjWw2m9asWfO7Y9LS0tSzZ0+5u7vryiuv1OLFiy97nQAAoOGwNNwUFRUpLCxMCxcurFL/ffv26eabb9YNN9ygzMxMPfbYY3rooYe0cePGy1wpAADWycvL07hx4xQcHCx3d3cFBgYqOjpan332mdWl1UuWXgo+dOhQDR06tMr9k5OTFRoaqnnz5kmSrr76am3dulV/+ctfFB0dfbnKRD01efJk5eXlSfrl8sEFCxZYXBEAXB533HGHSkpKtGTJEnXo0EG5ublKTU3V0aNHrS6tXmpQc27S09MVFRVVoS06Olrp6ekXHVNcXKyCgoIKL5ghLy9Pubm5ys3NdYQcADDNiRMn9Omnn+r555/XDTfcoPbt26tPnz6Kj4/XLbfc4ujz0EMPyd/fX97e3ho0aJC+/PJLSb/8vzIwMFCzZ892LHPbtm1yc3NTamqqJdt0uTWocJOTkyO73V6hzW63q6CgQKdPn650TGJionx8fByvoKCguigVAACn8PT0lKenp9asWaPi4uJK+9x11106fPiw1q9fr4yMDPXs2VM33nijjh07Jn9/f6WkpOiZZ57Rzp07dfLkSd1///2aOHGibrzxxjremrrRoMJNTcTHxys/P9/xOnDggNUlAQBQZU2aNNHixYu1ZMkS+fr66tprr9X06dO1e/duSdLWrVu1fft2rVq1ShEREerYsaPmzp0rX19frV69WpI0bNgwjR07Vvfee68eeeQRXXHFFUpMTLRysy6rBvX4hcDAQOXm5lZoy83Nlbe3t5o1a1bpGHd3d7m7u9dFeQAAXBZ33HGHbr75Zn366af617/+pfXr1+uFF17QG2+8oaKiIhUWFl7w2IjTp08rKyvL8Xnu3Lnq2rWrVq1apYyMDKN/NzaocBMZGal169ZVaPvwww8VGRlpUUUAANQNDw8PDR48WIMHD9bTTz+thx56SDNmzND48ePVunVrpaWlXTDG19fX8T4rK0sHDx5UWVmZ9u/fr27dutVd8XXM0nBTWFiovXv3Oj7v27dPmZmZatmypYKDgxUfH6+ff/5ZS5culSQ98sgjeuWVV/TnP/9ZDz74oD7++GOtXLlSa9eutWoTAACwRJcuXbRmzRr17NlTOTk5atKkiUJCQirtW1JSovvuu08jR45U586d9dBDD2nPnj0KCAio26LriKVzbnbu3Knw8HCFh4dLkuLi4hQeHq6EhARJ0qFDh5Sdne3oHxoaqrVr1+rDDz9UWFiY5s2bpzfeeIPLwAEAxjp69KgGDRqkv//979q9e7f27dunVatW6YUXXtCtt96qqKgoRUZGasSIEdq0aZP279+vbdu26cknn9TOnTslSU8++aTy8/P10ksvadq0aerUqZMefPBBi7fs8rH0yM3AgQNVXl5+0e8ru/vwwIED9cUXX1zGqgAAqD88PT3Vt29f/eUvf1FWVpbOnj2roKAgjR07VtOnT5fNZtO6dev05JNPKjY21nHpd//+/WW325WWlqakpCRt3rxZ3t7ekqS33npLYWFhevXVVzVu3DiLt9D5bOWXShcGKigokI+Pj/Lz8x3/yGiYYmJiHBPM7Xa7li1bZnFFaOy4sWTDdebMGe3bt0+hoaHy8PCwupxG61L/DtX5/d2gJhQDQH12/saSAKxl/H1uAABA40K4AQAARuG0FGole6Z190k4d6KVJNdf3x+0tJbghD2WrRsAUBFHbgAAgFEINwAAwCiEGwAAYBTCDQAAMArhBgAAVDB69GiNGDHC6jJqjKulAAC4hF6PL63T9WW8+ECdrs9EHLkBAABGIdwAANCADRw4UJMmTdJjjz2mFi1ayG63a9GiRSoqKlJsbKy8vLx05ZVXav369ZKk0tJSjRkzRqGhoWrWrJk6d+78u89BKysrU2JiomNMWFiYVq9eXRebVyOEGwAAGrglS5bIz89P27dv16RJkzRu3Djddddd6tevn3bt2qUhQ4bo/vvv16lTp1RWVqZ27dpp1apV+uabb5SQkKDp06dr5cqVF11+YmKili5dquTkZH399deaMmWK7rvvPm3ZsqUOt7LqmHMDAEADFxYWpqeeekqSFB8frzlz5sjPz09jx46VJCUkJOjVV1/V7t27dc011+jZZ591jA0NDVV6erpWrlypu++++4JlFxcXa/bs2froo48UGRkpSerQoYO2bt2q1157TQMGDKiDLawewg0AAA1c9+7dHe9dXV3VqlUrdev2n0fS2O12SdLhw4clSQsXLlRKSoqys7N1+vRplZSUqEePHpUue+/evTp16pQGDx5cob2kpETh4eFO3hLnINwAANDANW3atMJnm81Woc1ms0n6Ze7M8uXLNXXqVM2bN0+RkZHy8vLSiy++qM8//7zSZRcWFkqS1q5dq7Zt21b4zt3d3Zmb4TSEGwAAGpHPPvtM/fr10/jx4x1tWVlZF+3fpUsXubu7Kzs7u16egqoM4QYAgEakY8eOWrp0qTZu3KjQ0FC99dZb2rFjh0JDQyvt7+XlpalTp2rKlCkqKyvTddddp/z8fH322Wfy9vbWqFGj6ngLfh/hBgCARuS///u/9cUXX2jkyJGy2Wy65557NH78eMel4pWZNWuW/P39lZiYqB9//FG+vr7q2bOnpk+fXoeVV52tvLy83Ooi6lJBQYF8fHyUn58vb29vq8tp8LJndvv9TpfJ7C98dazYVZLU0r1U08NPWFZLcMIey9aN+iMmJka5ubmSfpnAuWzZMosrQlWdOXNG+/btU2hoqDw8PKwup9G61L9DdX5/c+QG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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 성별 + 객실등급\n",
"sns.barplot(x='Pclass', y='Survived', hue='Sex', data=titanic_df)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "324d5813-4543-4ee5-8518-b81247a567bb",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA04AAAINCAYAAAAJGy/3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABNpElEQVR4nO3deVhUdf//8dcAAiKLG5uGUu7eJS6oobdbaVhmaZbeZrmkZq4YuaSpaGZYamp3mmWi1q2pWS7fNK3bxNwKd61cSdMUEFdEDRTO749+zu0EehAHBuT5uK5zXTPnfM6Z95wzDPOa8zmfsRiGYQgAAAAAcEtOji4AAAAAAAo6ghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmCA4AQAAAIAJghMAAAAAmHBxdAH5LTMzU6dOnZKXl5csFoujywEAAADgIIZh6NKlSypXrpycnG5/TqnIBadTp04pKCjI0WUAAAAAKCBOnDih++6777Ztilxw8vLykvTXzvH29nZwNQAAAAAcJSUlRUFBQdaMcDtFLjjd6J7n7e1NcAIAAACQo0t4GBwCAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEw4NDj98MMPatu2rcqVKyeLxaLly5ebrhMbG6u6devKzc1NlStX1rx58/K8TgAAAABFm0OD0+XLlxUSEqIZM2bkqP3Ro0fVpk0btWjRQrt379bgwYPVq1cvrV27No8rBQAAAFCUuTjywR9//HE9/vjjOW4/a9Ys3X///ZoyZYokqUaNGtq0aZOmTp2q8PDwvCoTAAAAQBFXqK5x2rp1q1q2bGkzLzw8XFu3br3lOmlpaUpJSbGZAAAAAOBOOPSM051KTEyUv7+/zTx/f3+lpKTo6tWrKl68eJZ1oqOjNW7cuPwqEQAAAChSjr/5kKNLuKUKY/bZbVuF6oxTbowYMUIXL160TidOnHB0SQAAAAAKmUJ1xikgIEBJSUk285KSkuTt7Z3t2SZJcnNzk5ubW36UBwAAAOAeVajOOIWFhWndunU287777juFhYU5qCIAAAAARYFDg1Nqaqp2796t3bt3S/pruPHdu3fr+PHjkv7qZte1a1dr+1deeUW//fabhg0bpgMHDmjmzJlasmSJXn31VUeUDwAAAKCIcGhw2r59u+rUqaM6depIkiIjI1WnTh2NGTNGkpSQkGANUZJ0//33a9WqVfruu+8UEhKiKVOm6JNPPmEocgAAAAB5ymIYhuHoIvJTSkqKfHx8dPHiRXl7ezu6HAAAAKBQK8yj6t1JNihU1zgBAAAAgCMQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADAhIujCwCKsoiICCUnJ0uSfH19NX36dAdXBAAAgOwQnAAHSk5OVlJSkqPLAAAAgAm66gEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACYITAAAAAJhwcXQBAICiLSIiQsnJyZIkX19fTZ8+3cEVAQCQFcEJAOBQycnJSkpKcnQZAADcFl31AAAAAMAEwQkAAAAATBCcAAAAAMAEwQkAAAAATBCcAAAAAMAEwQkAAAAATDAcOQAARRy/pQUA5ghOAAAUcfyWFgCYo6seAAAAAJggOAEAAACACYITAAAAAJggOAEAAACACQaHAAAAQJHGyJLICYITAAAAijRGlkRO0FUPAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEy4OLoAAACAoiwiIkLJycmSJF9fX02fPt3BFQHIDsEJAADAgZKTk5WUlOToMgCYIDjhnsc3eQAAALhbBCfc8/gmDwAAAHeLwSEAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMODw4zZgxQ8HBwXJ3d1fDhg0VFxd32/bTpk1TtWrVVLx4cQUFBenVV1/Vn3/+mU/VAgAAACiKHBqcFi9erMjISEVFRWnnzp0KCQlReHi4Tp8+nW37hQsX6vXXX1dUVJT279+vOXPmaPHixRo5cmQ+Vw4AAACgKHFocHrvvffUu3dv9ejRQzVr1tSsWbPk4eGhmJiYbNtv2bJFjRs31vPPP6/g4GA99thj6ty5s+lZKgAAAAC4Gw4LTunp6dqxY4datmz5v2KcnNSyZUtt3bo123UaNWqkHTt2WIPSb7/9ptWrV+uJJ5645eOkpaUpJSXFZgIAAACAO+HiqAc+c+aMMjIy5O/vbzPf399fBw4cyHad559/XmfOnNE///lPGYah69ev65VXXrltV73o6GiNGzfOrrUDAAAAKFocPjjEnYiNjdXbb7+tmTNnaufOnfrqq6+0atUqjR8//pbrjBgxQhcvXrROJ06cyMeKAQAAANwLHHbGqWzZsnJ2dlZSUpLN/KSkJAUEBGS7zujRo/Xiiy+qV69ekqSHHnpIly9f1ssvv6w33nhDTk5Zc6Cbm5vc3Nzs/wQAAAAAFBkOO+Pk6uqqevXqad26ddZ5mZmZWrduncLCwrJd58qVK1nCkbOzsyTJMIy8KxYAAABAkeawM06SFBkZqW7duik0NFQNGjTQtGnTdPnyZfXo0UOS1LVrV5UvX17R0dGSpLZt2+q9995TnTp11LBhQx05ckSjR49W27ZtrQEKAAAAAOzNocGpU6dOSk5O1pgxY5SYmKjatWtrzZo11gEjjh8/bnOGadSoUbJYLBo1apROnjwpX19ftW3bVhMmTHDUUwAAAABQBDg0OEnSgAEDNGDAgGyXxcbG2tx3cXFRVFSUoqKi8qEyAAAAAPhLoRpVDwAAAAAcgeAEAAAAACYITgAAAABgguAEAAAAACYITgAAAABgwuGj6gEAAAC5dfzNh+56G9cvlJHk/P9vn7LLNiWpwph9dtkOCgbOOAEAAACACYITAAAAAJggOAEAAACACa5xAnKpoPappj81AACA/XHGCQAAAABMcMYJAIBCyl4jf3H2GwDMccYJAAAAAEwQnAAAAADABMEJAAAAAExwjRMAIFe4vgYAUJQQnAAAAHKpoP40hcQXCIC90VUPAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEy4OLoAAPe+iIgIJScnS5J8fX01ffp0B1cEAABwZwhOAPJccnKykpKSHF0GAABArtFVDwAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwATBCQAAAABMEJwAAAAAwISLowsAAAAoykq7ZWR7G/mHY4CcIDgBAAA40Mg6FxxdQpHHMUBO0FUPAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMORo0CrN/TTu96G9/lU6zcECedT7bJNSVrmZZfNAAAAoBDgjBMAAAAAmCA4AQAAAIAJuuoBAFDElXbLyPY2AOB/CE4AABRxI+tccHQJAFDg0VUPAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADABMEJAAAAAEwQnAAAAADAhMOD04wZMxQcHCx3d3c1bNhQcXFxt21/4cIF9e/fX4GBgXJzc1PVqlW1evXqfKoWAGBvpd0yVOb/T6XdMhxdDgAA2XJx5IMvXrxYkZGRmjVrlho2bKhp06YpPDxcBw8elJ+fX5b26enpatWqlfz8/LR06VKVL19ev//+u0qWLJn/xQMA7GJknQuOLgEAAFMODU7vvfeeevfurR49ekiSZs2apVWrVikmJkavv/56lvYxMTE6d+6ctmzZomLFikmSgoOD87NkAAAA4I5lZGTo2rVrji4jT1wvEejoEm7pzz//lKurq5yc7r6jncOCU3p6unbs2KERI0ZY5zk5Oally5baunVrtuusXLlSYWFh6t+/v1asWCFfX189//zzGj58uJydnbNdJy0tTWlpadb7KSkp9n0iAAAAwC0YhqHExERduHDB0aXkmeuNhju6hFs6evSonJycdP/998vV1fWutuWw4HTmzBllZGTI39/fZr6/v78OHDiQ7Tq//fabvv/+e3Xp0kWrV6/WkSNH1K9fP127dk1RUVHZrhMdHa1x48bZvX4AAADAzI3Q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nJCQoGnTpsnb29tm3pAhQxxdYp5JT093dAm31aFDB+3atUvz58/XoUOHtHLlSjVv3lxnz551dGmFhsVi0dy5c/XTTz/po48+ss4/evSohg0bpn//+9+67777HFihuZiYGA0bNkwxMTGOLqVAmzNnjgYOHKgffvhBp06dcnQ596ybP/vcmD7//PN8e/yC/r5thuDkYNu2bZOvr6/eeecdSf87/fzZZ58pODhYPj4++te//qVLly5Z10lLS9OgQYPk5+cnd3d3/fOf/9S2bdusy0NDQzV58mTr/Xbt2qlYsWJKTU2VJP3xxx+yWCw6cuSIpL9OX7/99tt66aWX5OXlpQoVKhSJHxS+8Q1wQECAateurddff10nTpxQcnKyJGn48OGqWrWqPDw89MADD2j06NG6du1alu189NFHCgoKkoeHhzp27KiLFy9Kkn744QcVK1ZMiYmJNu0HDx6sJk2a5P0TLAT69esni8WiuLg4dejQQVWrVtU//vEPRUZG6scff7S2O3PmjNq3by8PDw9VqVJFK1eutC7LyberEydOlL+/v7y8vNSzZ0/9+eefefm08tWN13BAQIB8fHxksVhs5i1atEg1atSQu7u7qlevrpkzZ9qsf+LECXXs2FElS5ZU6dKl9fTTT+vYsWPW5TfOOkyePFmBgYEqU6aM+vfvb/O38Nlnnyk0NFReXl4KCAjQ888/r9OnT9s8zsqVK1WlShW5u7urRYsWmj9/fpbjtmnTJjVp0kTFixdXUFCQBg0apMuXL1uXBwcHa/z48eratau8vb318ssv23dn2tGFCxe0ceNGvfPOO2rRooUqVqyoBg0aaMSIEXrqqacUHBwsSWrfvr0sFov1fnZneQYPHqzmzZtb71++fFldu3aVp6enAgMDNWXKlCyPn5aWpiFDhqh8+fIqUaKEGjZsqNjYWOvyGz0h1q5dqxo1asjT09P6gUr663/R/PnztWLFCuu30jevn5+CgoI0ffp0DRkyREePHpVhGOrZs6cee+wxVahQQQ0aNJCbm5sCAwP1+uuv6/r169Z1s+ueVbt2bZszsRaLRZ988skt32OknL1+s7NhwwZdvXpVb775plJSUrRlyxab5Tk5ltmdGSlZsqTmzZuXpe2xY8fUokULSVKpUqVksVjUvXv329ZYEKSmpmrx4sXq27ev2rRpk+W5mb2HZ9fjp127drd87rf6+ysKbv7sc2MqVapUtm3j4uJUp04dubu7KzQ0VLt27crS5ueff9bjjz8uT09P+fv768UXX9SZM2esy5s3b64BAwZo8ODBKlu2bLZnjx955BENGDDAZl5ycrJcXV1z3PskvxCcHOj7779Xq1atNGHCBA0fPtw6Pz4+XsuXL9fXX3+tr7/+Whs2bNDEiROty4cNG6Yvv/xS8+fP186dO1W5cmWFh4fr3LlzkqRmzZpZ/8EZhqGNGzeqZMmS2rRpk6S/3sjLly+vypUrW7c5ZcoU6x9Fv3791LdvXx08eDAf9kLBkJqaqv/85z+qXLmyypQpI0ny8vLSvHnz9Ouvv2r69OmaPXu2pk6darPekSNHtGTJEv3f//2f1qxZY91/ktS0aVM98MAD+uyzz6ztr127pgULFuill17KvydXQJ07d05r1qxR//79VaJEiSzLb+7eOm7cOHXs2FF79+7VE088oS5dulhf72aWLFmisWPH6u2339b27dsVGBiYJTzcqxYsWKAxY8ZowoQJ2r9/v95++22NHj1a8+fPl/TX6zE8PFxeXl7auHGjNm/ebP0AffO3guvXr1d8fLzWr1+v+fPna968eTYfbK5du6bx48drz549Wr58uY4dO2bzgeXo0aN69tln1a5dO+3Zs0d9+vTRG2+8YVNrfHy8WrdurQ4dOmjv3r1avHixNm3alOWf6eTJkxUSEqJdu3Zp9OjR9t9pduLp6SlPT08tX75caWlpWZbf+LJr7ty5SkhIsPnyy8zQoUO1YcMGrVixQt9++61iY2O1c+dOmzYDBgzQ1q1btWjRIu3du1fPPfecWrdurcOHD1vbXLlyRZMnT9Znn32mH374QcePH7eeoRwyZIg6duxo8+10o0aNcrMr7KJbt2569NFH9dJLL+mDDz7Qzz//rKlTp+qJJ55Q/fr1tWfPHn344YeaM2eO3nrrrTve/u3eY3Ly+r2VOXPmqHPnzipWrJg6d+6sOXPm2CzPybG8E0FBQfryyy8lSQcPHlRCQoKmT5+e6+3llyVLlqh69eqqVq2aXnjhBcXExOjGz4zmxXv43fz9FRWpqal68sknVbNmTe3YsUNjx47N0oPhwoULeuSRR1SnTh1t375da9asUVJSkjp27GjTbv78+XJ1ddXmzZs1a9asLI/Vq1cvLVy40Oa98j//+Y/Kly+vRx55JG+eYG4ZsJtmzZoZERERWebPnTvX8PHxMQzDMLp162Y8/fTTxldffWV4enoaixYtsmkbFRVleHh4GCkpKdZ5Q4cONRo2bGgYhmGkpqYaxYoVMxYsWGBdnp6ebpQrV8549913DcMwjJUrVxo+Pj7G9evXjd27dxsBAQFGRESEMXz4cMMwDKNXr17G888/b12/YsWKxgsvvGC9n5mZafj5+Rkffvjh3e2QAqxbt26Gs7OzUaJECaNEiRKGJCMwMNDYsWPHLdeZNGmSUa9ePev9qKgow9nZ2fjjjz+s87755hvDycnJSEhIMAzDMN555x2jRo0a1uVffvml4enpaaSmpubBsypcfvrpJ0OS8dVXX922nSRj1KhR1vupqamGJOObb74xDMMw1q9fb0gyzp8/bxiG7d+bYRhGWFiY0a9fP5ttNmzY0AgJCbHL8yhI/v7cK1WqZCxcuNCmzfjx442wsDDDMAzjs88+M6pVq2ZkZmZal6elpRnFixc31q5daxjGX38rFStWNK5fv25t89xzzxmdOnW6ZR3btm0zJBmXLl0yDMMwhg8fbjz44IM2bd544w2b49azZ0/j5ZdftmmzceNGw8nJybh69aphGH+9V7Vr1y4nu6JAWLp0qVGqVCnD3d3daNSokTFixAhjz5491uWSjGXLltmsc+N/xM0iIiKMZs2aGYZhGJcuXTJcXV2NJUuWWJefPXvWKF68uPX/z++//244OzsbJ0+etNnOo48+aowYMcIwjL9eK5KMI0eOWJfPmDHD8Pf3v20tjpSUlGSULVvWcHJyMpYtW2aMHDkyy+t3xowZhqenp5GRkWEYxl+vmalTp9psJyQkxIiKirLeN3uPycnrNzsXL140ihcvbuzevdswDMPYtWuX4enpaf27yMmxvFHf318nPj4+xty5cw3DMIyjR48akoxdu3YZhpH1PbEwaNSokTFt2jTDMAzj2rVrRtmyZY3169cbhpGz9/DsPn89/fTTRrdu3az3//5ayG6/3uv+/tnnxjRhwgTDMGz3yUcffWSUKVPG+v5rGIbx4Ycf2rzWxo8fbzz22GM2j3HixAlDknHw4EHDMP46NnXq1MlSy82PdfXqVaNUqVLG4sWLrctr1apljB071l5P3W444+QAP/30k5577jl99tln6tSpU5blwcHB8vLyst4PDAy0dnuJj4/XtWvX1LhxY+vyYsWKqUGDBtq/f78kqUmTJrp06ZJ27dqlDRs2qFmzZmrevLn1LNSGDRtsun1IUq1atay3b3T1+XtXm3tNixYttHv3bu3evVtxcXEKDw/X448/rt9//12StHjxYjVu3FgBAQHy9PTUqFGjdPz4cZttVKhQQeXLl7feDwsLU2ZmpvVsXffu3XXkyBFrt7N58+apY8eO2Z5hKWqM//9tYk7c/PosUaKEvL29c/z63L9/vxo2bGgzLywsLMePXVhdvnxZ8fHx6tmzp/Xsh6enp9566y3Fx8dLkvbs2aMjR47Iy8vLurx06dL6888/rW0k6R//+IecnZ2t929+T5KkHTt2qG3btqpQoYK8vLzUrFkzSbL+vRw8eFD169e3qa9BgwY29/fs2aN58+bZ1BoeHq7MzEwdPXrU2i40NNROeyjvdejQQadOndLKlSvVunVrxcbGqm7dutl2scqp+Ph4paen27ymS5curWrVqlnv79u3TxkZGapatarN/tywYYPNcfXw8FClSpWs9/9+XAsaPz8/9enTRzVq1FC7du20f/9+hYWF2Vzf2LhxY6Wmpt7xgBG3e4/Jyes3O59//rkqVaqkkJAQSX91EaxYsaIWL14sKWfHsig4ePCg4uLi1LlzZ0mSi4uLOnXqZD07V1Tfw/PKzZ99bkyvvPJKlnb79+9XrVq15O7ubp339/2+Z88erV+/3uZ9pnr16pJk815Tr16929bk7u6uF1980Xod4M6dO/Xzzz8XyG6mLo4u4F7i7e1tvb7lZhcuXLAZ8atSpUoqU6aMYmJi1KZNGxUrVsym/d/vWywWZWZm5riOkiVLKiQkRLGxsdq6datatWqlpk2bqlOnTjp06JAOHz5s/WBjr8csjEqUKGHTXfGTTz6Rj4+PZs+erTZt2qhLly4aN26cwsPD5ePjo0WLFmXb//x2/Pz81LZtW82dO1f333+/vvnmG4ddJ1DQVKlSRRaLRQcOHDBtWxRfn3frxjWNs2fPzvKh40YISk1NVb169bRgwYIs6/v6+lpv327/X758WeHh4QoPD9eCBQvk6+ur48ePKzw8/I4uAk5NTVWfPn00aNCgLMsqVKhgvV3YvnRwd3dXq1at1KpVK40ePVq9evVSVFTULT8QODk5ZflSIbtrK28nNTVVzs7O2rFjh03glf7qQnhDdsf1Tr7QcAQXFxe5uOT8o0tO92devMfMmTNHv/zyi029mZmZiomJUc+ePXO8neyOy52+JgqyOXPm6Pr16ypXrpx1nmEYcnNz0wcffJCjbdjj76ao+Ptnn7uRmpqqtm3bWq/Tv1lgYKDNY5rp1auXateurT/++ENz587VI488oooVK9qlTnvijJMdVatWLdu+yTt37lTVqlWt98uWLavvv/9eR44cUceOHe/oj7tSpUrWfqI3XLt2Tdu2bVPNmjWt85o1a6b169frhx9+UPPmzVW6dGnVqFFDEyZMUGBgoE09+IvFYpGTk5OuXr2qLVu2qGLFinrjjTcUGhqqKlWqWM9E3ez48eM2o//8+OOPcnJysvnGsFevXlq8eLE+/vhjVapUyeZsYVFWunRphYeHa8aMGTYDANxgr6F0a9SooZ9++slm3s0DT9yr/P39Va5cOf3222+qXLmyzXT//fdLkurWravDhw/Lz88vS5ucDu9+4MABnT17VhMnTlSTJk1UvXr1LGctqlWrpu3bt9vM+/s1BXXr1tWvv/6apY7KlSvL1dX1LvZEwVKzZk3r671YsWLKyMiwWe7r62sdoOGGm38zpVKlSipWrJjNa/r8+fM6dOiQ9X6dOnWUkZGh06dPZ9mXAQEBOa7V1dU1S30FSY0aNbR161abD8ybN2+Wl5eXdaS9v+/PlJQUmzOYOZGT1+/f7du3T9u3b1dsbKzNN/s3vtA8cOBAjo5lds/h8OHDunLlyi0f+8bfS0E+djdcv35dn376qaZMmWKzn/bs2aNy5crp888/z9F7+N/3UUZGhn7++efbPnZ2f3/4nxo1amjv3r02A3H8fb/XrVtXv/zyi4KDg7O819zpl1wPPfSQQkNDNXv2bC1cuLDAXgtOcLKjvn376tChQxo0aJD27t2rgwcP6r333tPnn3+u1157zaatn5+fvv/+ex04cECdO3e2GQXodkqUKKG+fftq6NChWrNmjX799Vf17t1bV65csfkGq3nz5lq7dq1cXFysp02bN2+uBQsWZDnbVFSlpaUpMTFRiYmJ2r9/vwYOHGj99qRKlSo6fvy4Fi1apPj4eL3//vtatmxZlm24u7urW7du2rNnjzZu3KhBgwapY8eONh9OwsPD5e3trbfeeks9evTIz6dY4M2YMUMZGRlq0KCBvvzySx0+fFj79+/X+++/b7euGBEREYqJidHcuXN16NAh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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 연령+성별\n",
"# 입력 age에 따라 구분 값 반환하는 함수 설정. DataFrame의 apply lambda 식\n",
"def get_category(age):\n",
" cat = ''\n",
" if age <= -1: cat = 'Unknown'\n",
" elif age <= 5: cat = 'Baby'\n",
" elif age <= 12: cat = 'Child'\n",
" elif age <= 18: cat = 'Teenager'\n",
" elif age <= 25: cat = 'Student'\n",
" elif age <= 35: cat = 'Young Adult'\n",
" elif age <= 60: cat = 'Adult'\n",
" else : cat = 'Elderly'\n",
"\n",
" return cat\n",
"\n",
"# 막대그래프의 크기 figure를 더 크게 설정\n",
"plt.figure(figsize=(10, 6))\n",
"\n",
"# X축의 값을 순차적으로 표시하기 위한 설정\n",
"group_names = ['Uknown', 'Baby', 'Child', 'Teenager', 'Student', 'Young Adult', 'Adult', 'Elderly']\n",
"\n",
"# lambda 식에 위에서 생성한 get_category( ) 함수를 반환값으로 설정\n",
"#get_category(X)는 입력값으로 'Age' 칼럼 값을 받아서 해당하는 cat 반환\n",
"titanic_df['Age_cat'] = titanic_df['Age'].apply(lambda x : get_category(x))\n",
"sns.barplot(x='Age_cat', y='Survived', hue='Sex', data=titanic_df, order=group_names)\n",
"titanic_df.drop('Age_cat', axis=1, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "e7238533-6e54-4490-a613-b1b041a65792",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" PassengerId | \n",
" Survived | \n",
" Pclass | \n",
" Name | \n",
" Sex | \n",
" Age | \n",
" SibSp | \n",
" Parch | \n",
" Ticket | \n",
" Fare | \n",
" Cabin | \n",
" Embarked | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 3 | \n",
" Braund, Mr. Owen Harris | \n",
" 1 | \n",
" 22.0 | \n",
" 1 | \n",
" 0 | \n",
" A/5 21171 | \n",
" 7.2500 | \n",
" 7 | \n",
" 3 | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
" 1 | \n",
" Cumings, Mrs. John Bradley (Florence Briggs Th... | \n",
" 0 | \n",
" 38.0 | \n",
" 1 | \n",
" 0 | \n",
" PC 17599 | \n",
" 71.2833 | \n",
" 2 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" 1 | \n",
" 3 | \n",
" Heikkinen, Miss. Laina | \n",
" 0 | \n",
" 26.0 | \n",
" 0 | \n",
" 0 | \n",
" STON/O2. 3101282 | \n",
" 7.9250 | \n",
" 7 | \n",
" 3 | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" 1 | \n",
" 1 | \n",
" Futrelle, Mrs. Jacques Heath (Lily May Peel) | \n",
" 0 | \n",
" 35.0 | \n",
" 1 | \n",
" 0 | \n",
" 113803 | \n",
" 53.1000 | \n",
" 2 | \n",
" 3 | \n",
"
\n",
" \n",
" 4 | \n",
" 5 | \n",
" 0 | \n",
" 3 | \n",
" Allen, Mr. William Henry | \n",
" 1 | \n",
" 35.0 | \n",
" 0 | \n",
" 0 | \n",
" 373450 | \n",
" 8.0500 | \n",
" 7 | \n",
" 3 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" PassengerId Survived Pclass \\\n",
"0 1 0 3 \n",
"1 2 1 1 \n",
"2 3 1 3 \n",
"3 4 1 1 \n",
"4 5 0 3 \n",
"\n",
" Name Sex Age SibSp Parch \\\n",
"0 Braund, Mr. Owen Harris 1 22.0 1 0 \n",
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... 0 38.0 1 0 \n",
"2 Heikkinen, Miss. Laina 0 26.0 0 0 \n",
"3 Futrelle, Mrs. Jacques Heath (Lily May Peel) 0 35.0 1 0 \n",
"4 Allen, Mr. William Henry 1 35.0 0 0 \n",
"\n",
" Ticket Fare Cabin Embarked \n",
"0 A/5 21171 7.2500 7 3 \n",
"1 PC 17599 71.2833 2 0 \n",
"2 STON/O2. 3101282 7.9250 7 3 \n",
"3 113803 53.1000 2 3 \n",
"4 373450 8.0500 7 3 "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 문자열 카테고리 피처 > 숫자형 (인코딩)\n",
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
"def encode_features(dataDF):\n",
" features = ['Cabin', 'Sex', 'Embarked']\n",
" for feature in features:\n",
" le = LabelEncoder()\n",
" le = le.fit(dataDF[feature])\n",
" dataDF[feature] = le.transform(dataDF[feature])\n",
"\n",
" return dataDF\n",
"\n",
"titanic_df = encode_features(titanic_df)\n",
"titanic_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "28555c84-f547-44d7-85c0-e409de4e3f81",
"metadata": {},
"outputs": [],
"source": [
"# Null 처리 함수\n",
"def fillna(df):\n",
" df['Age'].fillna(df['Age'].mean(), inplace=True)\n",
" df['Cabin'].fillna('N', inplace=True)\n",
" df['Embarked'].fillna('N', inplace=True)\n",
" df['Fare'].fillna(0, inplace=True)\n",
" return df\n",
"\n",
"# 머신러닝 알고리즘에 불필요한 피처 제거\n",
"def drop_features(df):\n",
" df.drop(['PassengerId', 'Name', 'Ticket'], axis=1, inplace=True)\n",
" return df\n",
"\n",
"# 레이블 인코딩 수행\n",
"def format_features(df):\n",
" df['Cabin'] = df['Cabin'].str[:1]\n",
" features = ['Cabin', 'Sex', 'Embarked']\n",
" for feature in features:\n",
" le = LabelEncoder()\n",
" le = le.fit(df[feature])\n",
" df[feature] = le.transform(df[feature])\n",
" return df\n",
"\n",
"# 앞에서 설정한 데이터 전처리 함수 호출\n",
"def transform_features(df):\n",
" df = fillna(df)\n",
" df = drop_features(df)\n",
" df = format_features(df)\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 28,
"id": "5b2ca2d2-6a08-42be-bd4e-3841922c88d2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" PassengerId | \n",
" Survived | \n",
" Pclass | \n",
" Name | \n",
" Sex | \n",
" Age | \n",
" SibSp | \n",
" Parch | \n",
" Ticket | \n",
" Fare | \n",
" Cabin | \n",
" Embarked | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 0 | \n",
" 3 | \n",
" Braund, Mr. Owen Harris | \n",
" male | \n",
" 22.0 | \n",
" 1 | \n",
" 0 | \n",
" A/5 21171 | \n",
" 7.2500 | \n",
" NaN | \n",
" S | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" 1 | \n",
" 1 | \n",
" Cumings, Mrs. John Bradley (Florence Briggs Th... | \n",
" female | \n",
" 38.0 | \n",
" 1 | \n",
" 0 | \n",
" PC 17599 | \n",
" 71.2833 | \n",
" C85 | \n",
" C | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" 1 | \n",
" 3 | \n",
" Heikkinen, Miss. Laina | \n",
" female | \n",
" 26.0 | \n",
" 0 | \n",
" 0 | \n",
" STON/O2. 3101282 | \n",
" 7.9250 | \n",
" NaN | \n",
" S | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" 1 | \n",
" 1 | \n",
" Futrelle, Mrs. Jacques Heath (Lily May Peel) | \n",
" female | \n",
" 35.0 | \n",
" 1 | \n",
" 0 | \n",
" 113803 | \n",
" 53.1000 | \n",
" C123 | \n",
" S | \n",
"
\n",
" \n",
" 4 | \n",
" 5 | \n",
" 0 | \n",
" 3 | \n",
" Allen, Mr. William Henry | \n",
" male | \n",
" 35.0 | \n",
" 0 | \n",
" 0 | \n",
" 373450 | \n",
" 8.0500 | \n",
" NaN | \n",
" S | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" PassengerId Survived Pclass \\\n",
"0 1 0 3 \n",
"1 2 1 1 \n",
"2 3 1 3 \n",
"3 4 1 1 \n",
"4 5 0 3 \n",
"\n",
" Name Sex Age SibSp \\\n",
"0 Braund, Mr. Owen Harris male 22.0 1 \n",
"1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n",
"2 Heikkinen, Miss. Laina female 26.0 0 \n",
"3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n",
"4 Allen, Mr. William Henry male 35.0 0 \n",
"\n",
" Parch Ticket Fare Cabin Embarked \n",
"0 0 A/5 21171 7.2500 NaN S \n",
"1 0 PC 17599 71.2833 C85 C \n",
"2 0 STON/O2. 3101282 7.9250 NaN S \n",
"3 0 113803 53.1000 C123 S \n",
"4 0 373450 8.0500 NaN S "
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"titanic_df = pd.read_csv('C:/Users/niceq/Documents/DataScience/Python ML Guide/Data/01. titanic_train.csv')\n",
"titanic_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "0375ce63-fb42-4a30-8591-d7e0f917fc45",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',\n",
" 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],\n",
" dtype='object')\n"
]
}
],
"source": [
"print(titanic_df.columns)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "0f93ec30-075b-4cc1-b1f1-d98dae0ef225",
"metadata": {},
"outputs": [],
"source": [
"# Survived 속성 처리\n",
"# 원본 데이터를 재로딩하고, 피처 데이터 세트와 레이블 데이터 세트 추출\n",
"titanic_df = pd.read_csv('C:/Users/niceq/Documents/DataScience/Python ML Guide/Data/01. titanic_train.csv')\n",
"y_titanic_df = titanic_df['Survived']\n",
"X_titanic_df = titanic_df.drop('Survived', axis=1)\n",
"\n",
"X_titanic_df = transform_features(X_titanic_df)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "43be8e39-7caf-43df-8b01-257c14f1d6ac",
"metadata": {},
"outputs": [],
"source": [
"# 테스트 데이터 추출\n",
"from sklearn.model_selection import train_test_split\n",
"X_train, X_test, y_train, y_test = train_test_split(X_titanic_df, y_titanic_df,\n",
" test_size=0.2, random_state=11)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "6e5a22f1-83e0-4306-a71b-8092178efbd0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DecisionTreeClassifier 정확도: 0.7877\n",
"RandomForestClassifier 정확도: 0.8547\n",
"LogisticRegression 정확도: 0.8659\n"
]
}
],
"source": [
"# 알고리즘을 활용하여 생존자 예측\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"#결정트리, Random Forest, 로지스틱 회귀를 위한 사이킷런 Classifier 클래스 생성\n",
"dt_clf = DecisionTreeClassifier(random_state=11)\n",
"rf_clf = RandomForestClassifier(random_state=11)\n",
"lr_clf = LogisticRegression(solver='liblinear')\n",
"\n",
"#DecisionTreeClassifier 학습/예측/평가\n",
"dt_clf.fit(X_train, y_train)\n",
"dt_pred = dt_clf.predict(X_test)\n",
"print('DecisionTreeClassifier 정확도: {0:.4f}'.format(accuracy_score(y_test, dt_pred)))\n",
"\n",
"# RandomForestClassifier 학습/예측/평가\n",
"rf_clf.fit(X_train, y_train)\n",
"rf_pred = rf_clf.predict(X_test)\n",
"print('RandomForestClassifier 정확도: {0:.4f}'.format(accuracy_score(y_test, rf_pred)))\n",
"\n",
"# LogisticRegression 학습/예측/평가\n",
"lr_clf.fit(X_train, y_train)\n",
"lr_pred = lr_clf.predict(X_test)\n",
"print('LogisticRegression 정확도: {0:.4f}'.format(accuracy_score(y_test, lr_pred)))"
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "656a7e00-6ec4-4854-9f82-e6f5de4b1917",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"교차 검증 0 정확도: 0.7542\n",
"교차 검증 1 정확도: 0.7809\n",
"교차 검증 2 정확도: 0.7865\n",
"교차 검증 3 정확도: 0.7697\n",
"교차 검증 4 정확도: 0.8202\n",
"평균 정확도: 0.7823\n"
]
}
],
"source": [
"# 교차 검증 수행 (폴드 개수는 5개) - kfold\n",
"from sklearn.model_selection import KFold\n",
"\n",
"def exec_kfold(clf, folds=5):\n",
" # 폴드 세트를 5개인 KFold 객체를 생성, 폴드 수만큼 예측결과 저장을 위한 리스트 객체 생성\n",
" kfold = KFold(n_splits=folds)\n",
" scores = []\n",
"\n",
" # KFold 교차 검증 수행\n",
" for iter_count, (train_index, test_index) in enumerate(kfold.split(X_titanic_df)):\n",
" #X_titanic_df 데이터에서 교차 검증별로 학습과 검증 데이터를 가리키는 index 생성\n",
" X_train, X_test = X_titanic_df.values[train_index], X_titanic_df.values[test_index]\n",
" y_train, y_test = y_titanic_df.values[train_index], y_titanic_df.values[test_index]\n",
" # Classifier 학습, 예측, 정확도 계산\n",
" clf.fit(X_train, y_train)\n",
" predictions = clf.predict(X_test)\n",
" accuracy = accuracy_score(y_test, predictions)\n",
" scores.append(accuracy)\n",
" print(\"교차 검증 {0} 정확도: {1:.4f}\".format(iter_count, accuracy))\n",
"\n",
" # 5개 fold 에서의 평균 정확도 계산\n",
" mean_score = np.mean(scores)\n",
" print(\"평균 정확도: {0:.4f}\".format(mean_score))\n",
"\n",
"#exec_kfold 호출\n",
"exec_kfold(dt_clf, folds=5)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "151fd525-b425-4934-8a0b-8f58d40d80f2",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"교차 검증 0 정확도: 0.7430\n",
"교차 검증 1 정확도: 0.7753\n",
"교차 검증 2 정확도: 0.7921\n",
"교차 검증 3 정확도: 0.7865\n",
"교차 검증 4 정확도: 0.8427\n",
"평균 정확도: 0.7879\n"
]
}
],
"source": [
"# 교차 검증 수행 (폴드 개수는 5개) - cross_val_score\n",
"from sklearn.model_selection import cross_val_score\n",
"\n",
"scores = cross_val_score(dt_clf, X_titanic_df, y_titanic_df, cv=5)\n",
"for iter_count, accuracy in enumerate(scores):\n",
" print(\"교차 검증 {0} 정확도: {1:.4f}\".format(iter_count, accuracy))\n",
"\n",
"print(\"평균 정확도: {0:.4f}\".format(np.mean(scores)))"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "0050d6be-cc9a-4799-8478-00de3bb9be94",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GridSearchCV 최적 하이퍼 파라미터: {'max_depth': 3, 'min_samples_leaf': 5, 'min_samples_split': 2}\n",
"GridSearchCV 최고 정확도: 0.7992\n",
"테스트 세트에서의 DecisionTreeClassifier 정확도: 0.8715\n"
]
}
],
"source": [
"# 교차 검증 수행 (폴드 개수는 5개) - GridSearchCV\n",
"from sklearn.model_selection import GridSearchCV\n",
"\n",
"parameters = {'max_depth': [2, 3, 5, 10],\n",
" 'min_samples_split': [2, 3, 5], 'min_samples_leaf': [1, 5, 8]}\n",
"\n",
"grid_dclf = GridSearchCV(dt_clf, param_grid=parameters, scoring='accuracy', cv=5)\n",
"grid_dclf.fit(X_train, y_train)\n",
"\n",
"print('GridSearchCV 최적 하이퍼 파라미터:', grid_dclf.best_params_)\n",
"print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dclf.best_score_))\n",
"best_dclf = grid_dclf.best_estimator_\n",
"\n",
"#GridSearchCV의 최적 하이퍼 파라미터로 학습된 Estimator로 예측 및 평가 수행\n",
"dpredictions = best_dclf.predict(X_test)\n",
"accuracy = accuracy_score(y_test, dpredictions)\n",
"print('테스트 세트에서의 DecisionTreeClassifier 정확도: {0:.4f}'.format(accuracy))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "33e7c145-07b4-48d1-8e82-b5023134732b",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}