Created
October 6, 2016 01:01
-
-
Save vinceallenvince/7d5ccc1210b29840dde31d15dd885103 to your computer and use it in GitHub Desktop.
Titanic Kaggle competition - Feature EDA - Family
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 119, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"from __future__ import division\n", | |
"import operator\n", | |
"import math\n", | |
"\n", | |
"import pandas as pd\n", | |
"from pandas import Series, DataFrame\n", | |
"import numpy as np\n", | |
"\n", | |
"import matplotlib.pyplot as plt\n", | |
"import seaborn as sns\n", | |
"sns.set_style('whitegrid')\n", | |
"%matplotlib inline\n", | |
"\n", | |
"from sklearn.cross_validation import cross_val_score\n", | |
"from sklearn.linear_model import LogisticRegression\n", | |
"from sklearn.svm import SVC, LinearSVC\n", | |
"from sklearn.ensemble import RandomForestClassifier\n", | |
"from sklearn.neighbors import KNeighborsClassifier\n", | |
"from sklearn.naive_bayes import GaussianNB" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 120, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"colors = ['#3182bd', '#6baed6', '#9ecae1', '#c6dbef', '#e6550d', '#fd8d3c', '#fdae6b', '#fdd0a2', '#31a354', '#74c476', \n", | |
" '#a1d99b', '#c7e9c0', '#756bb1', '#9e9ac8', '#bcbddc']" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"#### Titanic EDA - Family\n", | |
"..." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 121, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def check_classifiers(X_train, Y_train):\n", | |
" \n", | |
" _cv = 5\n", | |
" classifier_score = {}\n", | |
" \n", | |
" scores = cross_val_score(LogisticRegression(), X, y, cv=_cv)\n", | |
" classifier_score['LogisticRegression'] = scores.mean()\n", | |
" \n", | |
" scores = cross_val_score(KNeighborsClassifier(), X, y, cv=_cv)\n", | |
" classifier_score['KNeighborsClassifier'] = scores.mean()\n", | |
" \n", | |
" scores = cross_val_score(RandomForestClassifier(), X, y, cv=_cv)\n", | |
" classifier_score['RandomForestClassifier'] = scores.mean()\n", | |
" \n", | |
" scores = cross_val_score(SVC(), X, y, cv=_cv)\n", | |
" classifier_score['SVC'] = scores.mean()\n", | |
" \n", | |
" scores = cross_val_score(GaussianNB(), X, y, cv=_cv)\n", | |
" classifier_score['GaussianNB'] = scores.mean()\n", | |
"\n", | |
" return sorted(classifier_score.items(), key=operator.itemgetter(1), reverse=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 122, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"X_train = pd.read_csv('data/train.csv', dtype={'Age': np.float64})\n", | |
"y_train = X_train['Survived']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 123, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# update missing ages\n", | |
"_name = 'Name'\n", | |
"_age = 'Age'\n", | |
"_master = 'Master.'\n", | |
"_miss = 'Miss.'\n", | |
"_mrs = 'Mrs.'\n", | |
"_mr = 'Mr.'\n", | |
"_dr = 'Dr.'\n", | |
"\n", | |
"mean_ages = {\n", | |
" 'Master.': int(X_train[X_train[_name].apply(lambda x: x.find(_master)) != -1][_age].dropna().mean()),\n", | |
" 'Miss.': int(X_train[X_train[_name].apply(lambda x: x.find(_miss)) != -1][_age].dropna().mean()),\n", | |
" 'Mrs.': int(X_train[X_train[_name].apply(lambda x: x.find(_mrs)) != -1][_age].dropna().mean()),\n", | |
" 'Mr.': int(X_train[X_train[_name].apply(lambda x: x.find(_mr)) != -1][_age].dropna().mean()),\n", | |
" 'Dr.': int(X_train[X_train[_name].apply(lambda x: x.find(_dr)) != -1][_age].dropna().mean())\n", | |
"}\n", | |
"\n", | |
"def approx_age(nm):\n", | |
" if (nm.find(_master) != -1):\n", | |
" return mean_ages[_master]\n", | |
" elif (nm.find(_miss) != -1):\n", | |
" return mean_ages[_miss]\n", | |
" elif (nm.find(_mrs) != -1):\n", | |
" return mean_ages[_mrs]\n", | |
" elif (nm.find(_mr) != -1):\n", | |
" return mean_ages[_mr]\n", | |
" else:\n", | |
" return mean_ages[_dr]\n", | |
"\n", | |
"# where Age is nan, get the Name and apply approx_age; return a Series as index: Age\n", | |
"updated_ages = X_train[np.isnan(X_train[_age])][_name].apply(approx_age)\n", | |
"\n", | |
"# where Age is nan, update values\n", | |
"X_train[_age].fillna(updated_ages, inplace=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 124, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"child 75\n", | |
"female_adult 280\n", | |
"male_adult 536\n", | |
"Name: person, dtype: int64" | |
] | |
}, | |
"execution_count": 124, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"feature = 'person'\n", | |
"\n", | |
"# It's likely the age threshold for adults was younger in the early 1900s.\n", | |
"# Account of a 9 year-old boy almost getting refused a lifeboat:\n", | |
"# https://www.encyclopedia-titanica.org/titanic-survivor/winnie-coutts.html\n", | |
"# May want to try younger ages here.\n", | |
"child_age = 14\n", | |
"\n", | |
"def get_person(passenger):\n", | |
" \"\"\"\n", | |
" Returns a person value of 'female_adult', 'male_adult', 'child'.\n", | |
" \"\"\"\n", | |
" age, sex = passenger\n", | |
" \n", | |
" if (age < child_age):\n", | |
" return 'child'\n", | |
" elif (sex == 'female'):\n", | |
" return 'female_adult'\n", | |
" else:\n", | |
" return 'male_adult'\n", | |
" \n", | |
"X_train['person'] = X_train[['Age', 'Sex']].apply(get_person, axis=1)\n", | |
"X_train['person'].value_counts().sort_index()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 125, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def traveling_alone(passenger):\n", | |
" sibsp, parch = passenger\n", | |
" return 1.0 if sibsp < 1 and parch < 1 else 0.0\n", | |
"\n", | |
"X_train['Alone'] = X_train[['SibSp','Parch']].apply(traveling_alone,axis=1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 126, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nY0lLzZ4Yg+jxxx/n+eef58ILLxy05NxKtUdWZSbTp09vcTSStHjMyZI0NDz++OPMmTPHfCxpUAzr\nnhjNdswxx/DQQw9xxBFH8Nxzz/HMM88A8NWvfpUNNtiAHXbYgfHjx/Pggw+y1VZbMXv2bO68807W\nXXddTjjhBGbOnMnxxx/PggULeOqppzjmmGPYYostFq4/M5k8eTJQPAv7tNNO49WvfnWPsfS2rvPP\nP5+pU6ey6qqr8u9//xuAadOmcf/993PooYcyd+5cdtxxR6ZPn05XVxcAP/rRj8hMLr30UnbbbbdG\nfoSSNGjMyZI0NBxzzDE89thjTcnHK620Escdd5z5WBrGLGIMoqOPPppDDjmE1772tWy++ebsvvvu\nCxvQF1xwAQ8//DDnnnsur3nNa9hyyy2ZOnUqRx11FNtttx2zZ89m5syZfPnLX2aDDTbgiiuu4LLL\nLntFgv7a177Gcccdx/rrr8+JJ57IGWecwRe/+MUeY+lpXWuvvTbnnHMOV155JQC77rrrwvfXKsrd\nfwY48MADufjii03OkirFnCxJQ8PRRx/NAQcc0JR8PHXqVPOxNMxZxGiAzOT3v/89V111FV1dXcya\nVdwnuNJKK7HaaqsBsPzyy7PeeusBMG7cOF588UVWW201fvCDH7Dccssxe/bsRSrI9913H1//+tcB\nePrpp9lkk016jaGndf3tb39jww03ZNSo4rC/6U1vWmS5WmVZg2f8N6rTzfD2oya2OgRp0JmTJWlo\naEY+nj9/Puuss06vMZiPpeqziNEA66+/Pptuuik77bQT//73v5k6dSqwaPW2pquri66uLiZPnsx3\nv/td1ltvPU499VQeeeSRV7xvvfXW44QTTmD11Vfnwgsv5DWveU2vMfS0rnXWWYeZM2cyd+5clllm\nGe655x4++MEPMmbMGJ544gkA7r777kXWNXLkSF566aUl/TgkqaXMyZI0NDQjH99+++08+eSTvcZg\nPpaqzyLGIBsxYgQHHnggRx55JBdddBHPPfccBx10UL/LjBgxgg984AN84QtfYMUVV2S11Vbj6aef\nfsX7jj76aA4//HBeeuklnnvuOU455ZRe19nTulZZZRX2339/PvrRj7LKKquwwgorAPDOd76TCy+8\nkD322IONN9544YBLtQvK2muvzcyZMznnnHPYe++9l+bjkaSmMidL0tDQrHw8cuTIheNj9MR8LFXf\n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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x11dcbc290>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"fig, (axis1, axis2, axis3) = plt.subplots(1, 3, figsize=(15, 5))\n", | |
"\n", | |
"df_ = X_train['Survived'].groupby([X_train['Alone'], X_train['person']])\n", | |
"\n", | |
"# Counts by companionship\n", | |
"\n", | |
"N = 2\n", | |
"ind = np.arange(N) # the x locations for the groups\n", | |
"width = 0.25 # the total width of the bars\n", | |
"counts = df_.count()\n", | |
"\n", | |
"rects1 = axis1.bar(ind, counts[:, 'male_adult'].values, width, color=colors[0], lw=0.0)\n", | |
"rects2 = axis1.bar(ind + width, counts[:, 'female_adult'].values, width, color=colors[4], lw=0.0)\n", | |
"rects3 = axis1.bar(ind + width*2, counts[:, 'child'].values, width, color=colors[8], lw=0.0)\n", | |
"\n", | |
"axis1.set_ylim(0, 450)\n", | |
"axis1.set_ylabel('Count')\n", | |
"axis1.set_title('Counts by companionship')\n", | |
"axis1.set_xticks(ind + width*1.5)\n", | |
"axis1.set_xticklabels(('With Family', 'Alone'))\n", | |
"\n", | |
"axis1.legend((rects1[0], rects2[0], rects3[0]), ('male_adult', 'female_adult', 'child'), loc=2)\n", | |
"\n", | |
"# Avg survived by Alone\n", | |
"\n", | |
"N = 2\n", | |
"ind = np.arange(N) # the x locations for the groups\n", | |
"width = 0.25 # the total width of the bars\n", | |
"means = df_.mean()\n", | |
"\n", | |
"rects1 = axis2.bar(ind, means[:, 'male_adult'].values, width, color=colors[0], lw=0.0)\n", | |
"rects2 = axis2.bar(ind + width, means[:, 'female_adult'].values, width, color=colors[4], lw=0.0)\n", | |
"rects3 = axis2.bar(ind + width*2, means[:, 'child'].values, width, color=colors[8], lw=0.0)\n", | |
"\n", | |
"axis2.set_ylim(0, 1)\n", | |
"axis2.set_ylabel('mean(Survived)')\n", | |
"axis2.set_title('Average survived by companionship')\n", | |
"axis2.set_xticks(ind + width*1.5)\n", | |
"axis2.set_xticklabels(('With Family', 'Alone'))\n", | |
"\n", | |
"axis2.legend((rects1[0], rects2[0], rects3[0]), ('male_adult', 'female_adult', 'child'), loc=2)\n", | |
"\n", | |
"#\n", | |
"\n", | |
"df_ = X_train['Alone'].groupby([X_train['Pclass'], X_train['person']])\n", | |
"\n", | |
"N = 3\n", | |
"ind = np.arange(N) # the x locations for the groups\n", | |
"width = 0.25 # the total width of the bars\n", | |
"counts = df_.sum()\n", | |
"\n", | |
"rects1 = axis3.bar(ind, counts[:, 'male_adult'].values, width, color=colors[0], lw=0.0)\n", | |
"rects2 = axis3.bar(ind + width, counts[:, 'female_adult'].values, width, color=colors[4], lw=0.0)\n", | |
"rects3 = axis3.bar(ind + width*2, counts[:, 'child'].values, width, color=colors[8], lw=0.0)\n", | |
"\n", | |
"axis3.set_ylim(0, 450)\n", | |
"axis3.set_ylabel('Count')\n", | |
"axis3.set_title('Traveling alone by Pclass')\n", | |
"axis3.set_xticks(ind + width*1.5)\n", | |
"axis3.set_xticklabels(('Pclass 1', 'Pclass 2', 'Pclass 3'))\n", | |
"\n", | |
"axis3.legend((rects1[0], rects2[0], rects3[0]), ('male_adult', 'female_adult', 'child'), loc=2)\n", | |
"\n", | |
"plt.tight_layout()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Many more men traveled alone than women or children. The survival rates between the two groups are not very different. You can see the solo travelers mainly traveled in class 3." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 127, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# drop class3 as it has the lower average of survived passengers\n", | |
"features = ['Alone']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 128, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[('RandomForestClassifier', 0.60951121485417159),\n", | |
" ('GaussianNB', 0.60951121485417159),\n", | |
" ('LogisticRegression', 0.60052245080922773),\n", | |
" ('SVC', 0.60052245080922773),\n", | |
" ('KNeighborsClassifier', 0.56447951565135945)]" | |
] | |
}, | |
"execution_count": 128, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"X = DataFrame(X_train[features])\n", | |
"y = y_train\n", | |
"scores = check_classifiers(X, y)\n", | |
"scores" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 129, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>Features</th>\n", | |
" <th>Coefficient Estimate</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>Alone</td>\n", | |
" <td>-0.836155</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" Features Coefficient Estimate\n", | |
"0 Alone -0.836155" | |
] | |
}, | |
"execution_count": 129, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# get Correlation Coefficient for each feature using Logistic Regression\n", | |
"coeff_df = DataFrame(X.columns)\n", | |
"coeff_df.columns = ['Features']\n", | |
"classifier = LogisticRegression()\n", | |
"coeff_df[\"Coefficient Estimate\"] = pd.Series(classifier.fit(X, y).coef_[0])\n", | |
"\n", | |
"# preview\n", | |
"coeff_df" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"collapsed": true | |
}, | |
"source": [ | |
"'Alone' seems to be a fairly strong predictor. But it's likley due to men traveling alone more than women or children. Male adults already have a low survival rate as seen in the [Person](https://gist.github.com/vinceallenvince/9b1cd6bfbf5b8ad49e696715a8c8f0ad) feature." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 2", | |
"language": "python", | |
"name": "python2" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 2 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython2", | |
"version": "2.7.12" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment