{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\\npclass: A proxy for socio-economic status (SES)\\n1st = Upper\\n2nd = Middle\\n3rd = Lower\\n\\nage: Age is fractional if less than 1. If the age is estimated, is it in the form of xx.5\\n\\nsibsp: The dataset defines family relations in this way...\\nSibling = brother, sister, stepbrother, stepsister\\nSpouse = husband, wife (mistresses and fiancés were ignored)\\n\\nparch: The dataset defines family relations in this way...\\nParent = mother, father\\nChild = daughter, son, stepdaughter, stepson\\nSome children travelled only with a nanny, therefore parch=0 for them.\\n'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# inference: https://www.kaggle.com/startupsci/titanic-data-science-solutions/notebook\n", "'''\n", "pclass: A proxy for socio-economic status (SES)\n", "1st = Upper\n", "2nd = Middle\n", "3rd = Lower\n", "\n", "age: Age is fractional if less than 1. If the age is estimated, is it in the form of xx.5\n", "\n", "sibsp: The dataset defines family relations in this way...\n", "Sibling = brother, sister, stepbrother, stepsister\n", "Spouse = husband, wife (mistresses and fiancés were ignored)\n", "\n", "parch: The dataset defines family relations in this way...\n", "Parent = mother, father\n", "Child = daughter, son, stepdaughter, stepson\n", "Some children travelled only with a nanny, therefore parch=0 for them.\n", "'''" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# data analysis and wrangling\n", "import pandas as pd\n", "import numpy as np\n", "import random as rnd\n", "\n", "# visualization\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# acquire data\n", "train_df = pd.read_csv('https://github.com/TA-aiacademy/course_3.0/releases/download/Python/titanic_train.csv')\n", "test_df = pd.read_csv('https://github.com/TA-aiacademy/course_3.0/releases/download/Python/titanic_test.csv')\n", "combine = [train_df, test_df]\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\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": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df.head()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\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" ] } ], "source": [ "train_df.info()\n", "# Cabin > Age > Embarked features contain a number of null values" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 418 entries, 0 to 417\n", "Data columns (total 11 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 PassengerId 418 non-null int64 \n", " 1 Pclass 418 non-null int64 \n", " 2 Name 418 non-null object \n", " 3 Sex 418 non-null object \n", " 4 Age 332 non-null float64\n", " 5 SibSp 418 non-null int64 \n", " 6 Parch 418 non-null int64 \n", " 7 Ticket 418 non-null object \n", " 8 Fare 417 non-null float64\n", " 9 Cabin 91 non-null object \n", " 10 Embarked 418 non-null object \n", "dtypes: float64(2), int64(4), object(5)\n", "memory usage: 36.0+ KB\n" ] } ], "source": [ "test_df.head()\n", "test_df.info()\n", "# Cabin > Age are incomplete in case of test dataset " ] }, { "cell_type": "code", "execution_count": 7, "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" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\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": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# print column names\n", "print(train_df.columns) \n", "\n", "# preview the data\n", "train_df.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
88688702Montvila, Rev. Juozasmale27.00021153613.00NaNS
88788811Graham, Miss. Margaret Edithfemale19.00011205330.00B42S
88888903Johnston, Miss. Catherine Helen \"Carrie\"femaleNaN12W./C. 660723.45NaNS
88989011Behr, Mr. Karl Howellmale26.00011136930.00C148C
89089103Dooley, Mr. Patrickmale32.0003703767.75NaNQ
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name \\\n", "886 887 0 2 Montvila, Rev. Juozas \n", "887 888 1 1 Graham, Miss. Margaret Edith \n", "888 889 0 3 Johnston, Miss. Catherine Helen \"Carrie\" \n", "889 890 1 1 Behr, Mr. Karl Howell \n", "890 891 0 3 Dooley, Mr. Patrick \n", "\n", " Sex Age SibSp Parch Ticket Fare Cabin Embarked \n", "886 male 27.0 0 0 211536 13.00 NaN S \n", "887 female 19.0 0 0 112053 30.00 B42 S \n", "888 female NaN 1 2 W./C. 6607 23.45 NaN S \n", "889 male 26.0 0 0 111369 30.00 C148 C \n", "890 male 32.0 0 0 370376 7.75 NaN Q " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df.tail()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassAgeSibSpParchFare
count891.000000891.000000891.000000714.000000891.000000891.000000891.000000
mean446.0000000.3838382.30864229.6991180.5230080.38159432.204208
std257.3538420.4865920.83607114.5264971.1027430.80605749.693429
min1.0000000.0000001.0000000.4200000.0000000.0000000.000000
25%223.5000000.0000002.00000020.1250000.0000000.0000007.910400
50%446.0000000.0000003.00000028.0000000.0000000.00000014.454200
75%668.5000001.0000003.00000038.0000001.0000000.00000031.000000
max891.0000001.0000003.00000080.0000008.0000006.000000512.329200
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Age SibSp \\\n", "count 891.000000 891.000000 891.000000 714.000000 891.000000 \n", "mean 446.000000 0.383838 2.308642 29.699118 0.523008 \n", "std 257.353842 0.486592 0.836071 14.526497 1.102743 \n", "min 1.000000 0.000000 1.000000 0.420000 0.000000 \n", "25% 223.500000 0.000000 2.000000 20.125000 0.000000 \n", "50% 446.000000 0.000000 3.000000 28.000000 0.000000 \n", "75% 668.500000 1.000000 3.000000 38.000000 1.000000 \n", "max 891.000000 1.000000 3.000000 80.000000 8.000000 \n", "\n", " Parch Fare \n", "count 891.000000 891.000000 \n", "mean 0.381594 32.204208 \n", "std 0.806057 49.693429 \n", "min 0.000000 0.000000 \n", "25% 0.000000 7.910400 \n", "50% 0.000000 14.454200 \n", "75% 0.000000 31.000000 \n", "max 6.000000 512.329200 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# observe the numerical data\n", "train_df.describe()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NameSexTicketCabinEmbarked
count891891891204889
unique89126811473
topCorn, Mr. Harrymale1601G6S
freq157774644
\n", "
" ], "text/plain": [ " Name Sex Ticket Cabin Embarked\n", "count 891 891 891 204 889\n", "unique 891 2 681 147 3\n", "top Corn, Mr. Harry male 1601 G6 S\n", "freq 1 577 7 4 644" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# observe the categorical data\n", "train_df.describe(include=['O']) # string stype data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To confirm some of our observations and assumptions, we can quickly analyze our feature correlations by pivoting features against each other. We can only do so at this stage for features which do not have any empty values. It also makes sense doing so only for features which are categorical (Sex), ordinal (Pclass) or discrete (SibSp, Parch) type.\n", "\n", "Pclass We observe significant correlation (>0.5) among Pclass=1 and Survived. We decide to include this feature in our model.\n", "\n", "Sex We confirm the observation during problem definition that Sex=female had very high survival rate at 74%.\n", "\n", "SibSp and Parch These features have zero correlation for certain values. It may be best to derive a feature or a set of features from these individual features." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PclassSurvived
010.629630
120.472826
230.242363
\n", "
" ], "text/plain": [ " Pclass Survived\n", "0 1 0.629630\n", "1 2 0.472826\n", "2 3 0.242363" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df[[\"Pclass\", \"Survived\"]].groupby(['Pclass'], as_index=False).mean().sort_values(by=\"Survived\", ascending=False)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SexSurvived
0female0.742038
1male0.188908
\n", "
" ], "text/plain": [ " Sex Survived\n", "0 female 0.742038\n", "1 male 0.188908" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df[[\"Sex\", \"Survived\"]].groupby(['Sex'], as_index=False).mean().sort_values(by=\"Survived\", ascending=False)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SibSpSurvived
110.535885
220.464286
000.345395
330.250000
440.166667
550.000000
680.000000
\n", "
" ], "text/plain": [ " SibSp Survived\n", "1 1 0.535885\n", "2 2 0.464286\n", "0 0 0.345395\n", "3 3 0.250000\n", "4 4 0.166667\n", "5 5 0.000000\n", "6 8 0.000000" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df[['SibSp', \"Survived\"]].groupby(['SibSp'], as_index=False).mean().sort_values(by=\"Survived\", ascending=False)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ParchSurvived
330.600000
110.550847
220.500000
000.343658
550.200000
440.000000
660.000000
\n", "
" ], "text/plain": [ " Parch Survived\n", "3 3 0.600000\n", "1 1 0.550847\n", "2 2 0.500000\n", "0 0 0.343658\n", "5 5 0.200000\n", "4 4 0.000000\n", "6 6 0.000000" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df[['Parch', 'Survived']].groupby(['Parch'], as_index=False).mean().sort_values(by=\"Survived\", ascending=False)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ParchSurvivedSex
330.6000005
110.550847118
220.50000080
000.343658678
550.2000005
440.0000004
660.0000001
\n", "
" ], "text/plain": [ " Parch Survived Sex\n", "3 3 0.600000 5\n", "1 1 0.550847 118\n", "2 2 0.500000 80\n", "0 0 0.343658 678\n", "5 5 0.200000 5\n", "4 4 0.000000 4\n", "6 6 0.000000 1" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df.groupby(['Parch'], as_index=False).agg({'Survived':'mean', \"Sex\": 'count'}).sort_values(by = \"Survived\", ascending = False)\n", "\n", "# train_df[\"Parch\"] == 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A histogram chart is useful for analyzing continous numerical variables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Correlating numerical features\n", "Let us start by understanding correlations between numerical features and our solution goal (Survived).\n", "\n", "A histogram chart is useful for analyzing continous numerical variables like Age where banding or ranges will help identify useful patterns. The histogram can indicate distribution of samples using automatically defined bins or equally ranged bands. This helps us answer questions relating to specific bands (Did infants have better survival rate?)\n", "\n", "### Observations.\n", "\n", "Infants (Age <=4) had high survival rate.\n", "\n", "Oldest passengers (Age = 80) survived.\n", "\n", "Large number of 15-25 year olds did not survive.\n", "\n", "Most passengers are in 15-35 age range.\n", "\n", "### Decisions.\n", "\n", "This simple analysis confirms our assumptions as decisions for subsequent workflow stages.\n", "\n", "We should consider Age in our model training.\n", "\n", "Complete the Age feature for null values.\n", "\n", "We should band age groups ." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([27., 9., 4., 15., 27., 36., 30., 35., 35., 17., 12., 12., 14.,\n", " 7., 5., 4., 0., 0., 0., 1.]),\n", " array([ 0.42 , 4.399, 8.378, 12.357, 16.336, 20.315, 24.294, 28.273,\n", " 32.252, 36.231, 40.21 , 44.189, 48.168, 52.147, 56.126, 60.105,\n", " 64.084, 68.063, 72.042, 76.021, 80. ]),\n", " )" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "\n", "axes1 = plt.subplot(1, 2, 1)\n", "axes1.hist(train_df.Age[train_df.Survived == 0].dropna(), bins=20)\n", "axes1.set_title(\"survived = 0\")\n", "\n", "axes2 = plt.subplot(1, 2, 2)\n", "axes2.set_ylim(0, 50)\n", "axes2.set_title(\"survived = 1\")\n", "axes2.hist(train_df.Age[train_df.Survived == 1].dropna(), bins=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Correlating numerical and ordinal features\n", "\n", "We can combine multiple features for identifying correlations using a single plot. This can be done with numerical and categorical features which have numeric values.\n", "\n", "### Observations.\n", "\n", "Pclass=3 had most passengers, however most did not survive.\n", "\n", "Confirms our classifying assumption .\n", "\n", "Infant passengers in Pclass=2 and Pclass=3 mostly survived. Further qualifies our classifying assumption .\n", "\n", "Most passengers in Pclass=1 survived. Confirms our classifying assumption.\n", "\n", "Pclass varies in terms of Age distribution of passengers.\n", "\n", "### Decisions.\n", "\n", "Consider Pclass for model training." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(0, 1), (1, 1), (0, 2), (1, 2), (0, 3), (1, 3)]\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(12, 6))\n", "survived = [0, 1]\n", "pclass = [1, 2, 3]\n", "tuples = [(y, x) for x in pclass for y in survived]\n", "print(tuples)\n", "\n", "for i, value in enumerate(tuples):\n", " survived, pclass = value[0], value[1]\n", " axes = plt.subplot(3, 2, i+1)\n", " axes.hist(train_df.Age[np.logical_and(train_df.Survived == survived, train_df.Pclass == pclass)].dropna(), bins=20)\n", " axes.set_title(f\"survived = {survived} |pclass = {pclass}\")\n", " axes.set_ylim(0, 40)\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Correlating categorical features\n", "Now we can correlate categorical features with our solution goal.\n", "\n", "### Observations.\n", "\n", "Female passengers had much better survival rate than males. Confirms classifying.\n", " \n", "Exception in Embarked=C where males had higher survival rate. This could be a correlation between Pclass \n", "and Embarked and in turn Pclass and Survived, not necessarily direct correlation between Embarked and Survived.\n", " \n", "Males had better survival rate in Pclass=3 when compared with Pclass=2 for C and Q ports. Completing.\n", " \n", "Ports of embarkation have varying survival rates for Pclass=3 and among male passengers. Correlating.\n", " \n", "### Decisions.\n", "\n", "Add Sex feature to model training.\n", " \n", "Complete and add Embarked feature to model training." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\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": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df.head()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(6, 12))\n", "embarked = ['S', 'C', 'Q']\n", "\n", "for i, value in enumerate(embarked):\n", " on = value[0]\n", " axes = plt.subplot(3, 1, i+1)\n", " train_df[np.logical_and(train_df[\"Embarked\"] == on, train_df[\"Sex\"] == \"male\")].groupby([\"Pclass\"]).mean()[\"Survived\"].plot()\n", " train_df[np.logical_and(train_df[\"Embarked\"] == on, train_df[\"Sex\"] == \"female\")].groupby([\"Pclass\"]).mean()[\"Survived\"].plot()\n", " axes.set_title(f\"Embarked = {on}\")\n", " axes.set_xticks([1, 2, 3])\n", " axes.legend([\"male\", \"female\"], fontsize=12, loc=\"upper right\")\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Correlating categorical and numerical features\n", "We may also want to correlate categorical features (with non-numeric values) and numeric features. We can consider correlating Embarked (Categorical non-numeric), Sex (Categorical non-numeric), Fare (Numeric continuous), with Survived (Categorical numeric).\n", "\n", "### Observations.\n", "\n", "Higher fare paying passengers had better survival. Confirms our assumption for creating fare ranges.\n", "\n", "Port of embarkation correlates with survival rates. Confirms correlating and completing.\n", " \n", "### Decisions.\n", "\n", "Consider banding Fare feature." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(0, 'S'), (1, 'S'), (0, 'C'), (1, 'C'), (0, 'Q'), (1, 'Q')]\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(12, 6))\n", "survived = [0, 1]\n", "embarked = ['S', 'C', 'Q']\n", "tuples = [(y, x) for x in embarked for y in survived]\n", "print(tuples)\n", "\n", "for i, value in enumerate(tuples):\n", " survived, embarked = value[0], value[1]\n", " axes = plt.subplot(3, 2, i+1)\n", " train_df[np.logical_and(train_df.Survived == survived, train_df.Embarked == embarked)].groupby([\"Sex\"])['Fare'].mean().plot(kind=\"bar\")\n", " axes.set_title(f\"survived = {survived} |Embarked = {embarked}\")\n", " axes.set_ylim(0, 80)\n", " plt.xticks(rotation='horizontal')\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "we want to drop the Cabin and Ticket features." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Before (891, 12) (418, 11) (891, 12) (418, 11)\n", "After (891, 10) (418, 9) (891, 10) (418, 9)\n" ] } ], "source": [ "print(\"Before\", train_df.shape, test_df.shape, combine[0].shape, combine[1].shape)\n", "\n", "train_df = train_df.drop(['Ticket', 'Cabin'], axis=1)\n", "test_df = test_df.drop(['Ticket', 'Cabin'], axis=1)\n", "combine = [train_df, test_df]\n", "\n", "print(\"After\", train_df.shape, test_df.shape, combine[0].shape, combine[1].shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating new feature extracting from existing\n", "We want to analyze if Name feature can be engineered to extract titles and test correlation between titles and survival, before dropping Name and PassengerId features.\n", "\n", "In the following code we extract Title feature using regular expressions. The RegEx pattern (\\w+\\.) matches the first word which ends with a dot character within Name feature. The expand=False flag returns a DataFrame.\n", "\n", "### Observations.\n", "\n", "When we plot Title, Age, and Survived, we note the following observations.\n", "\n", "Most titles band Age groups accurately. For example: Master title has Age mean of 5 years.\n", "Survival among Title Age bands varies slightly.\n", "Certain titles mostly survived (Mme, Lady, Sir) or did not (Don, Rev, Jonkheer).\n", "### Decision.\n", "\n", "We decide to retain the new Title feature for model training." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sexfemalemale
Title
Capt01
Col02
Countess10
Don01
Dr16
Jonkheer01
Lady10
Major02
Master040
Miss1820
Mlle20
Mme10
Mr0517
Mrs1250
Ms10
Rev06
Sir01
\n", "
" ], "text/plain": [ "Sex female male\n", "Title \n", "Capt 0 1\n", "Col 0 2\n", "Countess 1 0\n", "Don 0 1\n", "Dr 1 6\n", "Jonkheer 0 1\n", "Lady 1 0\n", "Major 0 2\n", "Master 0 40\n", "Miss 182 0\n", "Mlle 2 0\n", "Mme 1 0\n", "Mr 0 517\n", "Mrs 125 0\n", "Ms 1 0\n", "Rev 0 6\n", "Sir 0 1" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Creating new feature extracting from existing\n", "\n", "for dataset in combine:\n", " dataset['Title'] = dataset.Name.str.extract(' ([A-Za-z]+)\\.', expand=False)\n", "pd.crosstab(train_df['Title'], train_df['Sex']) # from A to Z more than one + ." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can replace many titles with a more common name or classify them as Rare." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TitleSurvived
0Master0.575000
1Miss0.702703
2Mr0.156673
3Mrs0.793651
4Rare0.347826
\n", "
" ], "text/plain": [ " Title Survived\n", "0 Master 0.575000\n", "1 Miss 0.702703\n", "2 Mr 0.156673\n", "3 Mrs 0.793651\n", "4 Rare 0.347826" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')\n", "\n", " dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')\n", " dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')\n", " dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')\n", "\n", "train_df[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can convert the categorical titles to ordinal." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchFareEmbarkedTitle
0103Braund, Mr. Owen Harrismale22.0107.2500S1
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.01071.2833C3
2313Heikkinen, Miss. Lainafemale26.0007.9250S2
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01053.1000S3
4503Allen, Mr. William Henrymale35.0008.0500S1
\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 Fare Embarked Title \n", "0 0 7.2500 S 1 \n", "1 0 71.2833 C 3 \n", "2 0 7.9250 S 2 \n", "3 0 53.1000 S 3 \n", "4 0 8.0500 S 1 " ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "title_mapping = {\"Mr\": 1, \"Miss\": 2, \"Mrs\": 3, \"Master\": 4, \"Rare\": 5}\n", "for dataset in combine:\n", " dataset['Title'] = dataset['Title'].map(title_mapping)\n", " dataset['Title'] = dataset['Title'].fillna(0)\n", "\n", "train_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also do not need the PassengerId feature in the training dataset." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((891, 9), (418, 9))" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df = train_df.drop(['Name', 'PassengerId'], axis=1)\n", "test_df = test_df.drop(['Name'], axis=1)\n", "combine = [train_df, test_df]\n", "train_df.shape, test_df.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Converting a categorical feature" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SurvivedPclassSexAgeSibSpParchFareEmbarkedTitle
003022.0107.2500S1
111138.01071.2833C3
213126.0007.9250S2
311135.01053.1000S3
403035.0008.0500S1
\n", "
" ], "text/plain": [ " Survived Pclass Sex Age SibSp Parch Fare Embarked Title\n", "0 0 3 0 22.0 1 0 7.2500 S 1\n", "1 1 1 1 38.0 1 0 71.2833 C 3\n", "2 1 3 1 26.0 0 0 7.9250 S 2\n", "3 1 1 1 35.0 1 0 53.1000 S 3\n", "4 0 3 0 35.0 0 0 8.0500 S 1" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset['Sex'] = dataset['Sex'].map({'female': 1, 'male': 0}).astype(int)\n", "\n", "train_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us start by preparing an empty array to contain guessed Age values based on Pclass x Gender combinations." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 0., 0.],\n", " [0., 0., 0.]])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "guess_ages = np.zeros((2, 3))\n", "guess_ages" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we iterate over Sex (0 or 1) and Pclass (1, 2, 3) to calculate guessed values of Age for the six combinations." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SurvivedPclassSexAgeSibSpParchFareEmbarkedTitle
003022107.2500S1
1111381071.2833C3
213126007.9250S2
3111351053.1000S3
403035008.0500S1
\n", "
" ], "text/plain": [ " Survived Pclass Sex Age SibSp Parch Fare Embarked Title\n", "0 0 3 0 22 1 0 7.2500 S 1\n", "1 1 1 1 38 1 0 71.2833 C 3\n", "2 1 3 1 26 0 0 7.9250 S 2\n", "3 1 1 1 35 1 0 53.1000 S 3\n", "4 0 3 0 35 0 0 8.0500 S 1" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " for i in range(0, 2):\n", " for j in range(0, 3):\n", " guess_df = dataset[(dataset['Sex'] == i) & (dataset['Pclass'] == j+1)]['Age'].dropna()\n", " age_guess = guess_df.median()\n", " # convert random age float to nearest .5 age\n", " guess_ages[i, j] = int(age_guess / 0.5 + 0.5) * 0.5\n", " for i in range(0, 2):\n", " for j in range(0, 3):\n", " dataset.loc[(dataset.Age.isnull() & (dataset.Sex == i)) & (dataset.Pclass == j+1), 'Age'] = guess_ages[i, j]\n", " dataset['Age'] = dataset['Age'].astype(int)\n", "\n", "train_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us create Age bands and determine correlations with Survived." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AgeBandSurvived
0(-0.08, 16.0]0.550000
1(16.0, 32.0]0.337374
2(32.0, 48.0]0.412037
3(48.0, 64.0]0.434783
4(64.0, 80.0]0.090909
\n", "
" ], "text/plain": [ " AgeBand Survived\n", "0 (-0.08, 16.0] 0.550000\n", "1 (16.0, 32.0] 0.337374\n", "2 (32.0, 48.0] 0.412037\n", "3 (48.0, 64.0] 0.434783\n", "4 (64.0, 80.0] 0.090909" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df['AgeBand'] = pd.cut(train_df['Age'], 5) # cut into same width\n", "train_df[['AgeBand', 'Survived']].groupby(['AgeBand'], as_index=False).mean().sort_values(by='AgeBand', ascending=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us replace Age with ordinals based on these bands." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SurvivedPclassSexAgeSibSpParchFareEmbarkedTitleAgeBand
00301107.2500S1(16.0, 32.0]
111121071.2833C3(32.0, 48.0]
21311007.9250S2(16.0, 32.0]
311121053.1000S3(32.0, 48.0]
40302008.0500S1(32.0, 48.0]
\n", "
" ], "text/plain": [ " Survived Pclass Sex Age SibSp Parch Fare Embarked Title \\\n", "0 0 3 0 1 1 0 7.2500 S 1 \n", "1 1 1 1 2 1 0 71.2833 C 3 \n", "2 1 3 1 1 0 0 7.9250 S 2 \n", "3 1 1 1 2 1 0 53.1000 S 3 \n", "4 0 3 0 2 0 0 8.0500 S 1 \n", "\n", " AgeBand \n", "0 (16.0, 32.0] \n", "1 (32.0, 48.0] \n", "2 (16.0, 32.0] \n", "3 (32.0, 48.0] \n", "4 (32.0, 48.0] " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset.loc[dataset['Age'] <= 16, 'Age'] = 0\n", " dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1\n", " dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2\n", " dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3\n", " dataset.loc[dataset['Age'] > 64, 'Age'] = 4\n", "train_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can remove the AgeBand feature" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SurvivedPclassSexAgeSibSpParchFareEmbarkedTitle
00301107.2500S1
111121071.2833C3
21311007.9250S2
311121053.1000S3
40302008.0500S1
\n", "
" ], "text/plain": [ " Survived Pclass Sex Age SibSp Parch Fare Embarked Title\n", "0 0 3 0 1 1 0 7.2500 S 1\n", "1 1 1 1 2 1 0 71.2833 C 3\n", "2 1 3 1 1 0 0 7.9250 S 2\n", "3 1 1 1 2 1 0 53.1000 S 3\n", "4 0 3 0 2 0 0 8.0500 S 1" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df = train_df.drop(['AgeBand'], axis=1)\n", "combine = [train_df, test_df]\n", "train_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can create a new feature for FamilySize which combines Parch and SibSp. This will enable us to drop Parch and SibSp from our datasets." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FamilySizeSurvived
340.724138
230.578431
120.552795
670.333333
010.303538
450.200000
560.136364
780.000000
8110.000000
\n", "
" ], "text/plain": [ " FamilySize Survived\n", "3 4 0.724138\n", "2 3 0.578431\n", "1 2 0.552795\n", "6 7 0.333333\n", "0 1 0.303538\n", "4 5 0.200000\n", "5 6 0.136364\n", "7 8 0.000000\n", "8 11 0.000000" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1\n", "train_df[['FamilySize', 'Survived']].groupby(['FamilySize'], as_index=False).mean().sort_values(by='Survived', ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can create another feature called IsAlone." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
IsAloneSurvived
000.505650
110.303538
\n", "
" ], "text/plain": [ " IsAlone Survived\n", "0 0 0.505650\n", "1 1 0.303538" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset['IsAlone'] = 0\n", " dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1\n", "\n", "train_df[['IsAlone', 'Survived']].groupby(['IsAlone'], as_index=False).mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let us drop Parch, SibSp, and FamilySize features in favor of IsAlone." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SurvivedPclassSexAgeFareEmbarkedTitleIsAlone
003017.2500S10
1111271.2833C30
213117.9250S21
3111253.1000S30
403028.0500S11
\n", "
" ], "text/plain": [ " Survived Pclass Sex Age Fare Embarked Title IsAlone\n", "0 0 3 0 1 7.2500 S 1 0\n", "1 1 1 1 2 71.2833 C 3 0\n", "2 1 3 1 1 7.9250 S 2 1\n", "3 1 1 1 2 53.1000 S 3 0\n", "4 0 3 0 2 8.0500 S 1 1" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df = train_df.drop(['Parch', 'SibSp', 'FamilySize'], axis=1)\n", "test_df = test_df.drop(['Parch', 'SibSp', 'FamilySize'], axis=1)\n", "combine = [train_df, test_df]\n", "\n", "train_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also create an artificial feature combining Pclass and Age." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Age*ClassAgePclass
0313
1221
2313
3221
4623
5313
6331
7003
8313
9002
\n", "
" ], "text/plain": [ " Age*Class Age Pclass\n", "0 3 1 3\n", "1 2 2 1\n", "2 3 1 3\n", "3 2 2 1\n", "4 6 2 3\n", "5 3 1 3\n", "6 3 3 1\n", "7 0 0 3\n", "8 3 1 3\n", "9 0 0 2" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset['Age*Class'] = dataset.Age * dataset.Pclass\n", "\n", "train_df.loc[:, ['Age*Class', 'Age', 'Pclass']].head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Completing a categorical feature\n", "Embarked feature takes S, Q, C values based on port of embarkation. Our training dataset has two missing values. We simply fill these with the most common occurance." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'S'" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "freq_port = train_df.Embarked.dropna().mode()[0]\n", "freq_port" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
EmbarkedSurvived
0C0.553571
1Q0.389610
2S0.339009
\n", "
" ], "text/plain": [ " Embarked Survived\n", "0 C 0.553571\n", "1 Q 0.389610\n", "2 S 0.339009" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset['Embarked'] = dataset['Embarked'].fillna(freq_port)\n", "\n", "train_df[['Embarked', 'Survived']].groupby(['Embarked'], as_index=False).mean().sort_values(by='Survived', ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Converting categorical feature to numeric\n", "We can now convert the EmbarkedFill feature by creating a new numeric Port feature." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SurvivedPclassSexAgeFareEmbarkedTitleIsAloneAge*Class
003017.25000103
1111271.28331302
213117.92500213
3111253.10000302
403028.05000116
\n", "
" ], "text/plain": [ " Survived Pclass Sex Age Fare Embarked Title IsAlone Age*Class\n", "0 0 3 0 1 7.2500 0 1 0 3\n", "1 1 1 1 2 71.2833 1 3 0 2\n", "2 1 3 1 1 7.9250 0 2 1 3\n", "3 1 1 1 2 53.1000 0 3 0 2\n", "4 0 3 0 2 8.0500 0 1 1 6" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset['Embarked'] = dataset['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}).astype(int)\n", "\n", "train_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quick completing and converting a numeric feature\n", "We can now complete the Fare feature for single missing value in test dataset using mode to get the value that occurs most frequently for this feature. We do this in a single line of code.\n", "\n", "Note that we are not creating an intermediate new feature or doing any further analysis for correlation to guess missing feature as we are replacing only a single value. The completion goal achieves desired requirement for model algorithm to operate on non-null values.\n", "\n", "We may also want round off the fare to two decimals as it represents currency.\n", "\n" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdPclassSexAgeFareEmbarkedTitleIsAloneAge*Class
08923027.82922116
18933127.00000306
28942039.68752116
38953018.66250113
489631112.28750303
\n", "
" ], "text/plain": [ " PassengerId Pclass Sex Age Fare Embarked Title IsAlone Age*Class\n", "0 892 3 0 2 7.8292 2 1 1 6\n", "1 893 3 1 2 7.0000 0 3 0 6\n", "2 894 2 0 3 9.6875 2 1 1 6\n", "3 895 3 0 1 8.6625 0 1 1 3\n", "4 896 3 1 1 12.2875 0 3 0 3" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_df['Fare'].fillna(test_df['Fare'].dropna().median(), inplace=True)\n", "test_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can not create FareBand." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
FareBandSurvived
0(-0.001, 7.91]0.197309
1(7.91, 14.454]0.303571
2(14.454, 31.0]0.454955
3(31.0, 512.329]0.581081
\n", "
" ], "text/plain": [ " FareBand Survived\n", "0 (-0.001, 7.91] 0.197309\n", "1 (7.91, 14.454] 0.303571\n", "2 (14.454, 31.0] 0.454955\n", "3 (31.0, 512.329] 0.581081" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df['FareBand'] = pd.qcut(train_df['Fare'], 4)\n", "train_df[['FareBand', 'Survived']].groupby(['FareBand'], as_index=False).mean().sort_values(by='FareBand', ascending=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Convert the Fare feature to ordinal values based on the FareBand.\n" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SurvivedPclassSexAgeFareEmbarkedTitleIsAloneAge*Class
0030100103
1111231302
2131110213
3111230302
4030210116
5030112113
6010330113
7030020400
8131110303
9121021300
\n", "
" ], "text/plain": [ " Survived Pclass Sex Age Fare Embarked Title IsAlone Age*Class\n", "0 0 3 0 1 0 0 1 0 3\n", "1 1 1 1 2 3 1 3 0 2\n", "2 1 3 1 1 1 0 2 1 3\n", "3 1 1 1 2 3 0 3 0 2\n", "4 0 3 0 2 1 0 1 1 6\n", "5 0 3 0 1 1 2 1 1 3\n", "6 0 1 0 3 3 0 1 1 3\n", "7 0 3 0 0 2 0 4 0 0\n", "8 1 3 1 1 1 0 3 0 3\n", "9 1 2 1 0 2 1 3 0 0" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "for dataset in combine:\n", " dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0\n", " dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1\n", " dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare'] = 2\n", " dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3\n", " dataset['Fare'] = dataset['Fare'].astype(int)\n", "\n", "train_df = train_df.drop(['FareBand'], axis=1)\n", "combine = [train_df, test_df]\n", "\n", "train_df.head(10)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SurvivedPclassSexAgeFareEmbarkedTitleIsAloneAge*Class
0030100103
1111231302
2131110213
3111230302
4030210116
5030112113
6010330113
7030020400
8131110303
9121021300
\n", "
" ], "text/plain": [ " Survived Pclass Sex Age Fare Embarked Title IsAlone Age*Class\n", "0 0 3 0 1 0 0 1 0 3\n", "1 1 1 1 2 3 1 3 0 2\n", "2 1 3 1 1 1 0 2 1 3\n", "3 1 1 1 2 3 0 3 0 2\n", "4 0 3 0 2 1 0 1 1 6\n", "5 0 3 0 1 1 2 1 1 3\n", "6 0 1 0 3 3 0 1 1 3\n", "7 0 3 0 0 2 0 4 0 0\n", "8 1 3 1 1 1 0 3 0 3\n", "9 1 2 1 0 2 1 3 0 0" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_df.head(10)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdPclassSexAgeFareEmbarkedTitleIsAloneAge*Class
089230202116
189331200306
289420312116
389530110113
489631110303
589730010110
689831102213
789920120102
890031101313
990130120103
\n", "
" ], "text/plain": [ " PassengerId Pclass Sex Age Fare Embarked Title IsAlone Age*Class\n", "0 892 3 0 2 0 2 1 1 6\n", "1 893 3 1 2 0 0 3 0 6\n", "2 894 2 0 3 1 2 1 1 6\n", "3 895 3 0 1 1 0 1 1 3\n", "4 896 3 1 1 1 0 3 0 3\n", "5 897 3 0 0 1 0 1 1 0\n", "6 898 3 1 1 0 2 2 1 3\n", "7 899 2 0 1 2 0 1 0 2\n", "8 900 3 1 1 0 1 3 1 3\n", "9 901 3 0 1 2 0 1 0 3" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_df.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ....to be continue" ] } ], "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.7.10" } }, "nbformat": 4, "nbformat_minor": 4 }