{"cells":[{"metadata":{"trusted":true,"_uuid":"8aca4949062cc031be03f154aa7a8349c3f5ce81"},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sb\n%matplotlib inline\n\nimport warnings\nwarnings.filterwarnings('ignore')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d014e31924ea842960f869dc7e6309f5e7e9cb3e"},"cell_type":"code","source":"train = pd.read_csv('../input/train.csv')\ntest = pd.read_csv('../input/test.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5c2774cac2dfd82b719932ca9aac51c1a62ff278"},"cell_type":"code","source":"train.head(5)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"1b8fc64aab3f953374a7c84687590573807a2f8b"},"cell_type":"markdown","source":"## 1. Exploring Data"},{"metadata":{"trusted":true,"_uuid":"07f97335977a0b058c0af10c22dcd1189900816e"},"cell_type":"code","source":"train.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ebe16eccbc1d39b8c56780bffecae05b2591e52f"},"cell_type":"markdown","source":"**Age** field lost many data  \n**Embarked** just lost 2 cell data so we can easily fill it by the most common data  \n**Cabin** lost the most with around 700 per 900 records"},{"metadata":{"_uuid":"6b2207710b2a2e2b30640297fa791826bcea81de"},"cell_type":"markdown","source":"### 1.1 Survived feature"},{"metadata":{"trusted":true,"_uuid":"e8d21f0bc131d4afd3c37d9ba6bfa28f2d651f1a"},"cell_type":"code","source":"sb.countplot(\"Survived\", data=train)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"56630ec1be9aebb232b713506ccc86b6e8d29f2e"},"cell_type":"code","source":"train['Survived'].mean()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"06dea5c9296fef4436aac13308027c9d266778af"},"cell_type":"code","source":"train.groupby(['Sex','Pclass']).mean()\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f09c1709555ba46f1ed32457aa49c14806504d72"},"cell_type":"markdown","source":"**Female** tended to alive more than **Male**"},{"metadata":{"trusted":true,"_uuid":"d570bd4978f58ce35fd435cfced7593a5e1a84cc"},"cell_type":"code","source":"def bar_chart(feature):\n    survived = train[train['Survived']==1][feature].value_counts()\n    dead = train[train['Survived']==0][feature].value_counts()\n    df = pd.DataFrame([survived,dead])\n    df.index = ['Survived','Dead']\n    df.plot(kind='bar',stacked=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"ca582850aa257b2eeb4653ee4f9310b4447c25b1"},"cell_type":"markdown","source":"### 1.2 Pclass feature"},{"metadata":{"trusted":true,"_uuid":"b23c24ca0529dc4dd8dbbb593c97524e88b1408b"},"cell_type":"code","source":"bar_chart('Pclass')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a3e861a0bef44ec75eb608cabea3f41f8cf9d44f"},"cell_type":"markdown","source":"Pclass = 3 (the lower class) is more likely to be unsurvived  \nPclass = 1 (the higher class) has more chance to overcome the disaster"},{"metadata":{"_uuid":"5b590c7deb231eb1adc205051fd3019580fdc7a9"},"cell_type":"markdown","source":"### 1.3 Sex feature"},{"metadata":{"trusted":true,"_uuid":"adeed7e171af7b2cf8b4a2eb7fb25aedb40fb48a"},"cell_type":"code","source":"bar_chart('Sex')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"81b692aea52c47165ad28ccb0112c367b4b146f5"},"cell_type":"markdown","source":"**Female** has higher chance to survive than **male**"},{"metadata":{"_uuid":"6a930e83a0391cf1a6f7696ab5ad3c9404c8bdb2"},"cell_type":"markdown","source":"### 1.4 Embarked feature"},{"metadata":{"trusted":true,"_uuid":"87bb69176054fb88111ce834fd2bf5b998f8d4fa"},"cell_type":"code","source":"bar_chart('Embarked')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"33c69c911dcd9904f6aa8ffef2ae6a40c9266812"},"cell_type":"markdown","source":"Most of people are come from S, followed by C and Q. The rate of survived/unsurvived people still keep the ratio with number of people from S, C, Q"},{"metadata":{"_uuid":"b0f9b94d90ce7cd7ac0dbb350bd0a5e516e5b932"},"cell_type":"markdown","source":"### 1.5 SibSp feature"},{"metadata":{"trusted":true,"_uuid":"4ebf42b22ca9e0a2490d54435e84095c0198e365"},"cell_type":"code","source":"bar_chart('SibSp')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8909a7c769581c182d1c0801ad827e85bae955c2"},"cell_type":"markdown","source":"Going without or only one Sibling or Spouse has higher chance to survive  \nGoing without any Sibling or Spouse also more likely to be dead"},{"metadata":{"_uuid":"41f0157ddcfaa4ea91a8f9a52c66f5004252c501"},"cell_type":"markdown","source":"### 1.6 Cabin feature"},{"metadata":{"trusted":true,"_uuid":"86aa56b96361fc5da1d71975db3e86eb9280b160"},"cell_type":"code","source":"survived = train[train['Survived']==1][train['Cabin'].isnull()==False]['Survived'].value_counts()\ndead = train[train['Survived']==0][train['Cabin'].isnull()==False]['Survived'].value_counts()\ndf = pd.DataFrame([survived,dead])\ndf.index = ['Survived','Dead']\ndf.plot(kind='bar',stacked=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"36752c684d3a3510a1e5cf42e88aee9c356d3030"},"cell_type":"markdown","source":"People whose cabin numbers are recorded has higher chance to survive"},{"metadata":{"trusted":true,"_uuid":"48fb8d6a80ea4af3478cb9137546a71f332178c7"},"cell_type":"code","source":"survived = train[train['Survived']==1][train['Cabin'].isnull()==True]['Survived'].value_counts()\ndead = train[train['Survived']==0][train['Cabin'].isnull()==True]['Survived'].value_counts()\ndf = pd.DataFrame([survived,dead])\ndf.index = ['Survived','Dead']\ndf.plot(kind='bar',stacked=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"3082ac09d9b2b3f1669757e02dcf3da5686eaba4"},"cell_type":"markdown","source":"People whose cabin numbers not recorded are more likely to be dead"},{"metadata":{"_uuid":"f9d87f41fa68a809616120cf4639958b1fa87efc"},"cell_type":"markdown","source":"## 2. Feature engineering"},{"metadata":{"_uuid":"5c5cb1194f7431b39b079f3743690397854a70ce"},"cell_type":"markdown","source":"### 2.1 Name Feature"},{"metadata":{"trusted":true,"_uuid":"66aa65fa598bfab88ed3b480e057b024b6da1458"},"cell_type":"code","source":"import re\ncombine=[train,test]\n# train_test_df = train.append(test, ignore_index=True)\npattern = re.compile('([A-Za-z]+)\\.')\nfor dataset in combine:\n    dataset['Title'] = dataset['Name'].str.extract('([A-Za-z]+)\\.', expand=False)\ntrain['Title'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":false,"trusted":true,"_uuid":"0117638147f106bcd0bd79c0c3c7409132433581"},"cell_type":"code","source":"title_mapping = {\"Mr\": 1, \"Miss\": 2, \"Mrs\": 3, \n                 \"Master\": 4, \"Dr\": 5, \"Rev\": 5, \"Col\": 5, \"Major\": 5, \"Mlle\": 2,\"Countess\": 4,\n                 \"Ms\": 2, \"Lady\": 4, \"Jonkheer\": 5, \"Don\": 5, \"Dona\" : 5, \"Mme\": 3,\"Capt\": 5,\"Sir\": 4 }\n\nfor dataset in combine:\n    #Mr. is 1\n    dataset['Title'] = dataset['Title'].replace(['Capt.', 'Col.', \n        'Don.', 'Dr.', 'Major.', 'Rev.', 'Jonkheer.', 'Dona.'], 'Other.')    #Other. is 5  \n\n    dataset['Title'] = dataset['Title'].replace(['Ms.', 'Mlle.'], 'Miss.')   #Miss. is 2\n\n    dataset['Title'] = dataset['Title'].replace('Mme.', 'Mrs.') # Mrs. is 4\n\n    dataset['Title'] = dataset['Title'].replace(['Lady.', 'Master.', 'Countess.', 'Sir.'], 'Royal.') # Mrs. is 4\n\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"807fb89f9f725f40b5445d709ae7ef420c644df9"},"cell_type":"code","source":"pd.crosstab(train['Title'], train['Sex'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4b11ee237a4c876259589a8b216f5c40cda55e22"},"cell_type":"code","source":"for dataset in combine:\n    dataset['Title'] = dataset['Title'].map(title_mapping)\ntrain.drop('Name', axis=1, inplace=True)\ntest.drop('Name', axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cc8c8864e300488b47fd2d07fed062a1e707b1c8"},"cell_type":"code","source":"train.sample(10)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"abcc0d96f55c2328221f607cd7d6c4efd951367d"},"cell_type":"markdown","source":"### 2.2 Sex Feature"},{"metadata":{"trusted":true,"_uuid":"ea20d2edd0c9e72613ad5dbb81c9fbcd2f732a43"},"cell_type":"code","source":"sex_mapping = {\"male\":0 , \"female\":1}\nfor dataset in combine:\n    dataset['Sex'] = dataset['Sex'].map(sex_mapping)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f6deab98839b84e393f15b89136c0db90bffb0dc"},"cell_type":"markdown","source":"### 2.3 Ticket Feature"},{"metadata":{"trusted":true,"_uuid":"d5caadb26b31577abdb1ebf5ab7d8c61b12d4a6b"},"cell_type":"code","source":"# I assume that these 2 features does not affect the result\ntrain.drop('Ticket', axis=1, inplace=True)\ntest.drop('Ticket', axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"37e300b0a03fc2ade2312fb7ddfeae5e7eb5c212"},"cell_type":"markdown","source":"### 2.4 Cabin Feature"},{"metadata":{"trusted":true,"_uuid":"a427ebbd1c72313a7e5eb492e57ac88e42e95be7"},"cell_type":"code","source":"train[\"CabinBool\"] = (train[\"Cabin\"].notnull().astype('int'))\ntest[\"CabinBool\"] = (test[\"Cabin\"].notnull().astype('int'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3108d627a084486ebf52450c7021adad19ce97bc"},"cell_type":"code","source":"train.drop('Cabin', axis=1, inplace=True)\ntest.drop('Cabin', axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"68d781563f34deac2961394262064b894f5da08e"},"cell_type":"code","source":"train.sample(10)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"b7463a54c210928c00b5eae0008ce4e28c33b685"},"cell_type":"markdown","source":"### 2.5 Embark Feature"},{"metadata":{"trusted":true,"_uuid":"864e923c3f26e2a95bf5f7212c0550f4b1ac6fb3"},"cell_type":"code","source":"train = train.fillna({\"Embarked\": \"S\"})\ntest = test.fillna({\"Embarked\": \"S\"})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"b5eca4c36d098833b61f19c1704c61a4bb8ddea1"},"cell_type":"code","source":"embark_mapping = {\"S\": 1, \"C\": 2, \"Q\":3}\ntrain['Embarked'] = train['Embarked'].map(embark_mapping)\ntest['Embarked'] = test['Embarked'].map(embark_mapping)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"39123434886a71d575d661e692c84f95445c9867"},"cell_type":"markdown","source":"### 2.6 Age Feature"},{"metadata":{"trusted":true,"_uuid":"51aec8d14aad60fe9c2cd1ef4f8109518ea92e18"},"cell_type":"code","source":"train[\"Age\"].fillna(train.groupby(\"Title\")[\"Age\"].transform(\"median\"), inplace=True)\ntest[\"Age\"].fillna(test.groupby(\"Title\")[\"Age\"].transform(\"median\"), inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7c89b690ecc776acad7b6371c689407b6f549229"},"cell_type":"code","source":"train.loc[ train['Age'] <= 5, 'Age'] = 0, #Baby\ntrain.loc[(train['Age'] > 5) & (train['Age'] <= 12), 'Age'] = 1, #Child\ntrain.loc[(train['Age'] > 12) & (train['Age'] <= 18), 'Age'] = 2, #Teenager\ntrain.loc[(train['Age'] > 18) & (train['Age'] <= 24), 'Age'] = 3, #Student\ntrain.loc[(train['Age'] > 24) & (train['Age'] <= 35), 'Age'] = 4, #Young Adult\ntrain.loc[(train['Age'] > 35) & (train['Age'] <= 60), 'Age'] = 5, #Adult\ntrain.loc[ train['Age'] > 60, 'Age'] = 6 #Senior","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"84120a9b33801fb5b6bae419701c6a89a8e89e66"},"cell_type":"code","source":"test.loc[ test['Age'] <= 5, 'Age'] = 0, #Baby\ntest.loc[(test['Age'] > 5) & (test['Age'] <= 12), 'Age'] = 1, #Child\ntest.loc[(test['Age'] > 12) & (test['Age'] <= 18), 'Age'] = 2, #Teenager\ntest.loc[(test['Age'] > 18) & (test['Age'] <= 24), 'Age'] = 3, #Student\ntest.loc[(test['Age'] > 24) & (test['Age'] <= 35), 'Age'] = 4, #Young Adult\ntest.loc[(test['Age'] > 35) & (test['Age'] <= 60), 'Age'] = 5, #Adult\ntest.loc[ test['Age'] > 60, 'Age'] = 6 #Senior","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ce7614f18b863d79bb73ea7adb28afc692323291"},"cell_type":"code","source":"train.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a8e5494ded2a3ef8786a2e32f03260bd03c497f8"},"cell_type":"markdown","source":"### 2.7 Fare Feature"},{"metadata":{"trusted":true,"_uuid":"f8689a3699dd890e1a25cbbf424745f54c7e01e8"},"cell_type":"code","source":"# I assume that Fare attribute won't affect much to survivor rate so I will drop it.\ntest.drop(['Fare'], axis=1, inplace=True)\ntrain.drop(['Fare'], axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"294dc1d08836c6debe18353bdc147d96d49fe8e9"},"cell_type":"code","source":"train.sample(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cd47a8b3d3dd77999ad89585668da9703ba7ee55"},"cell_type":"code","source":"combine","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a8df4b2348572310ed37dd0e8151494ab7e34ca6"},"cell_type":"markdown","source":"## 3. Modelling"},{"metadata":{"trusted":true,"_uuid":"5e14b20243871deb5f4c95d196b4df01218d95a8"},"cell_type":"code","source":"from sklearn.svm import SVC\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.neighbors import KNeighborsClassifier\nfrom sklearn.linear_model import LogisticRegression\nimport numpy as np","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"980a336e1ced6996172cd0bc043f502a66518041"},"cell_type":"code","source":"train_data = train.drop(['Survived', 'PassengerId'], axis=1)\ntarget = train['Survived']","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4b90f821a1a563ed1e55076b782cc9e0224774a3"},"cell_type":"code","source":"train_data.sample(15)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"506fb8c03b484f4d5fa577f0f2871aa46b8732c8"},"cell_type":"code","source":"from sklearn.model_selection import KFold\nfrom sklearn.model_selection import cross_val_score\nk_fold = KFold(n_splits=10, shuffle=True, random_state=0)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"029d7fcc168ce2b5ef5beee9353d55f745707bc8"},"cell_type":"markdown","source":"### 3.1 Using SVM"},{"metadata":{"trusted":true,"_uuid":"179b2b2f5a0a1c5fd4e4635ff74f8114347cb56a"},"cell_type":"code","source":"clf = SVC()\nscoring = 'accuracy'\nscore = cross_val_score(clf, train_data, target, cv=k_fold, n_jobs=1, scoring=scoring)\nprint(score)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e0d1233c2e491582b89afe01ee55235f959a4497"},"cell_type":"code","source":"round(np.mean(score)*100, 2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"9cd6d490230eaabdc778ca44eaaa6888b73f918e"},"cell_type":"markdown","source":"### 3.2 Using Random Forest"},{"metadata":{"trusted":true,"_uuid":"7eeba903a64e7da7e435140a05484d405115e995"},"cell_type":"code","source":"clf = RandomForestClassifier(n_estimators=13)\nscoring = 'accuracy'\nscore = cross_val_score(clf, train_data, target, cv=k_fold, n_jobs=1, scoring=scoring)\nprint(score)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"198c56cd9916551e58e5879c2a748c5908df58ee"},"cell_type":"code","source":"round(np.mean(score)*100, 2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7f6a3f7f2fff7aa42095235047a22dbae1aeba1c"},"cell_type":"markdown","source":"### 3.3 Using K-NN"},{"metadata":{"trusted":true,"_uuid":"32cf85421f2d929eb84075c6a230d51475a63106"},"cell_type":"code","source":"clf = KNeighborsClassifier(n_neighbors = 13)\nscoring = 'accuracy'\nscore = cross_val_score(clf, train_data, target, cv=k_fold, n_jobs=1, scoring=scoring)\nprint(score)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"96c56880af6ac5159345017109705dad91fd6f51"},"cell_type":"code","source":"round(np.mean(score)*100, 2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"33dd593f3fc49b3e87bd2fbef5cbf39a2e9d5625"},"cell_type":"markdown","source":"### 3.4 Using Logistic Regression"},{"metadata":{"trusted":true,"_uuid":"5e3fffbeba0080b615d301dd30251119e8312445"},"cell_type":"code","source":"clf = LogisticRegression()\nscoring = 'accuracy'\nscore = cross_val_score(clf, train_data, target, cv=k_fold, n_jobs=1, scoring=scoring)\nprint(score)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c022370c956d6231ebdf294109689e25d9b48375"},"cell_type":"code","source":"round(np.mean(score)*100, 2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"533833f41cefdd417d4c260a3af4ca5d6515b5dd"},"cell_type":"markdown","source":"## 4. Testing"},{"metadata":{"trusted":true,"_uuid":"be24be372c7a05a988a30f330bb7a129f7bddcbf"},"cell_type":"code","source":"clf = SVC()\nclf.fit(train_data, target)\n\ntest_data = test.drop(\"PassengerId\", axis=1).copy()\nprediction = clf.predict(test_data)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"5e8bad074fb34141d9fdb722b586e484ea9341e2"},"cell_type":"code","source":"submission = pd.DataFrame({\n        \"PassengerId\": test[\"PassengerId\"],\n        \"Survived\": prediction\n    })\n\nsubmission.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"79030a001b978d6f656a27b8a1eb712087edf60e"},"cell_type":"markdown","source":"## 5. References"},{"metadata":{"_uuid":"cf3de5bf220e27966aacf5b381ea58c59bb61136"},"cell_type":"markdown","source":"- [Titanic Survival Prediction Beginner](https://www.kaggle.com/nadintamer/titanic-survival-predictions-beginner)\n- [Titanic Kaggle Solution by Minsuk](https://github.com/minsuk-heo/kaggle-titanic)"}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}