Skip to content

Instantly share code, notes, and snippets.

@vinceallenvince
Last active October 6, 2016 15:00
Show Gist options
  • Save vinceallenvince/c4689f91f20db4a307f830cf67cd9793 to your computer and use it in GitHub Desktop.
Save vinceallenvince/c4689f91f20db4a307f830cf67cd9793 to your computer and use it in GitHub Desktop.
Titanic Kaggle competition - Feature EDA - Surname and officer bias
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 75,
"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": 76,
"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 - Surname and officer bias\n",
"There is anecdotal evidence officers were biased toward non-English speakers in their management of the evacuation. [Masabumi Hosono's](https://www.encyclopedia-titanica.org/titanic-survivor/masabumi-hosono.html) story is just one example.\n",
"\n",
"Is bias reflected in the data?\n",
"\n",
"To answer, I downloaded a csv of ~14,000 [British surnames from 1849](http://surnamestudies.org.uk/statistics/engwales.htm) and plotted survival rates against names matching an English surname. There's likely a fair amount of error in this process. But the plot below indicates there were many more people traveling with a non-English surname which is not surprising. However, it is interesting non-English passsengers had a lower survival rate in class 3 than English passengers. The situation in the other classes is the opposite.\n",
"\n",
"Is this a hint of bias? Would a more precise examination of country of origin render more detail? Probably."
]
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<img src='http://i.imgur.com/LDcNdcm.gif'>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%HTML\n",
"<img src='http://i.imgur.com/LDcNdcm.gif'>"
]
},
{
"cell_type": "code",
"execution_count": 77,
"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": 78,
"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": 79,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def process_surname(nm):\n",
" return nm.split(',')[0].lower()\n",
"\n",
"X_train['surname'] = X_train['Name'].apply(process_surname)"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"english_surnames = pd.read_csv('uk_surnames.csv')['Name'].tolist()\n",
"# downloaded from surnamestudies.org.uk\n",
"# \"Surname Studies is devoted to the resources available for the study of the distribution,\n",
"# incidence and statistical analysis of the surnames of Britain, mainly post-1837, and\n",
"# primarily as a mass phenomenon.\"\n",
"# http://surnamestudies.org.uk/statistics/soundex.csv"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['abberley',\n",
" 'abbey',\n",
" 'abbis',\n",
" 'abble',\n",
" 'abbot',\n",
" 'abbots',\n",
" 'abbott',\n",
" 'abbotts',\n",
" 'abbs']"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"english_surnames = [surname.lower() for surname in english_surnames]\n",
"english_surnames[1:10]"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def check_surname(nm):\n",
" if nm in english_surnames:\n",
" return 1.0\n",
" else:\n",
" return 0.0\n",
"\n",
"X_train['surname_english'] = X_train['surname'].apply(check_surname)"
]
},
{
"cell_type": "code",
"execution_count": 141,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nfWN3XtgPRHXC8khmnkfVsDW3blsId1JdvRtahk+lOp5as31U3TKhqutvr5l2EdXxdE1z6+9CuhvY\nu+yX/qW8/6qZvi5VA8fx5YRjO6oTigHl6uXPMvO3pVHpTuAjZfzlLce/h9g6lclx95vvC56Zr1J1\nCRgdEX+mquz3LQnJi1RnsE9SJZSTIiIjopHq0tAbNWfH75LVHc1XAb8vZS9H1eJ8CdWX9JFymWx9\n5vXdO5nqksifqZLp2sv4bfWTmxtnzZe32WFUiczjVGeUf2FeX+n27qpt4t19jh+LiI4eF3c4sGGJ\n/zqqGxKmtba+zJxN1T9qbNmmPwe+nJnvtPNZF3T597IdWw6fDRxWyr4TeIR5l4Y7jK84FFiuZvs/\nSutdP5qo+h4+VOa5KzN/XjP9cqrW6TvbWE9HDgU2iog/Ab8DflD6uzXHfQ3VjSRPlPW/AXygJOon\nAV+OiP+jOpm8LjP/t53x6ju+TovjtbTIng8ckdWNVY8Bf85yc1LpbvVV4LpybJxE9QjI1roTnQyc\nGxGPULXAPgisU77DnwdOKt+/I4GXgWkLUf7tVK3JT5Tyt6A67qdQ9Ze/o3S56KhV9DGq1r8b20lo\nLqW67F7bsnw4VUth83f/z8BZ5WrO3lT3tjxKdaNhW5qAtcpl9kuAL5VuUWTma1Tf1WvL9mpLa32O\nj68pv+X6oEr0/0i1b8dRta62Wo8XpwD7lP3xB6ouLA+0E1NLJ7ex/DXAaxHxDFXDQm39sqD1+LVU\nddmTVNtrCrB8SbZbaqsev6ys/w9lf36Etk9q/gL8tMz3QcoJUnElVQPCxW0s25GLqVqEG6mOpxep\nvosAZOafqU5sshxbu1P1VV6HKrcZEBFPle/DUKounVe2Mb6u+jU11fMJYFLniohDgT+Wvn1DqJK9\n72TmPXUOrdcqLQSjqfrG/7De8UjdISLOonrizGulJe5PVDdcTalzaD1CuTL3MNWNZgv97PkOyt4J\nGFZa9ImI84B/l5ZFvUcRMYKq8W23esfS03lDnvqap4CLSkI3iKpVw8T4PYrqUXATqFpM2rshRj1c\nVDcbnZGZ27cYvwfVFaVZVJc323085CLkeeDeiGjuA3qQiXElqpv8RlI9TrRTE+PiSeCYiDiGKk/5\nE/CNLljPIiOqG96GAZ+rdyy9gS3HktTHlSRjP2BqZm5ZM34gVf/aBqqbiR4CdiuXzCVpkWSfY0nq\n+56luhGopfWoHg82pTw2axwL/oxXSeqTTI4lqY/L6vW9s1uZtDTVnfnN3gKW6ZagJKmH6rV9jhsb\nG+0PIqnXa2hoeK+PLewMU6gS5GZDqR411i7rX0l9QVv1b69NjgEaGhrqHcJcjY2NPSoeVdwvPZP7\npdLY2Njdq2z5Q/A01RuxlqV6VNY2VI8Q7FBP338eYz2T+6VnWhT3S3v1b69OjiVJC6UJ5j7SacnM\nvCwijqJ6jno/4LLMfLmeAUpSvZkcS9IioLxYaMvy97U142+lenC/JAlvyJMkSZLmMjmWJEmSCpNj\nSZIkqTA5liRJkgqTY0mSJKno00+r2OSUezu1vMdO2KFTy2vNsccey2677UZTUxOvvPIKX/jCF1qd\nb6uttmLcuHFdHo8kvRfWv5J6qz6dHPdmW2+9db1DkKRFkvWvtGgzOe5Es2fP5sQTT2TixInMmTOH\nI444gk033ZRPf/rTbLbZZmQm/fr148ILL2SppZbipJNO4sknn2SFFVbghRdeYPTo0XPLuummm5gw\nYQKHHXYY3/rWt3j77beZPn06Rx55JFtuuSUzZ87k29/+Ni+99BLLLbcc559/PgMGDJi7/DXXXMOv\nf/1r+vfvzwYbbMD3vve9ua0iW221FQ8++CC33XYbp59+Ottvvz1rr70266yzDpMnT2bQoEG8+OKL\nTJo0iTPOOIP11luPa665hrvuuovp06ez3HLLccEFF3DzzTdz3333MX36dCZNmsR+++3HPffcw/jx\n4/nOd77DDjvswO23384VV1zBgAEDaGho4KijjqrHrpHUx7Wsf3fZZRcaGhqsf61/pYVmn+NOdMMN\nN7D88stz1VVX8ZOf/ISTTjoJgKlTp7LHHntw1VVXMWzYMB544AHuueceJk+ezNixYxk5ciT//Oc/\n6ddv/je79uvXj4kTJzJ58mRGjx7Nueeey+zZswGYNm0aRx99ND//+c+ZMmUKTz311HzL/upXv+L7\n3/8+1113HWuvvTbvvPNOm3G/8sorjBo1iu9+97sArLrqqowZM4Z9992X66+/HoA33niDK664guuv\nv55Zs2bx+OOPA/D2229zySWXcPDBB3PddddxwQUXcPLJJ/PLX/6SyZMnc8EFF3DFFVdwzTXX8Mor\nr/D73/++cza2JNVoWf9efvnlgPWv9a+08Gw57kTPPPMMjY2N/PnPf6apqYl33nmHN954A4D11lsP\ngOHDhzNz5kxeeOEFPvrRjwKw/PLLs9Zaa7Va5jrrrMOXvvQljjrqKGbPns3+++8PwLLLLsvw4cMB\n+MAHPsD06dPnW+60007jpz/9KS+88AIbb7wxTU1N802vHV5++eVZeuml5w43x7ryyivz2GOPATB4\n8GCOOuooFl98cV599dW5PxLrr78+AEOHDp37GZZZZhlmzJjB888/z7/+9S8OOeQQmpqamDZtGhMn\nTmSLLbZYqO0qSR1pWf/OmTPH+tf6V3pPTI470VprrcXw4cP56le/yowZMxg9ejTLLrtsq/NGBL/+\n9a/Zf//9mTx5Ms8991yr8z3zzDO8/fbbXHzxxbz22muMGDGCbbfdtsNYxo4dy0knncTgwYM56KCD\n+NOf/sSQIUN47bXXAOZr6WitxaRWZnL33XczduxYpk+fzl577TW3cm85b60PfvCDDB8+nMsvv5wB\nAwZw0003za34Jakztax/TzzxROtf61/pPTE57kRf+tKXOOGEE9hvv/14++23GTFiBP369ZuvAmv+\ne9ttt+X+++9nxIgRrLjiiiy++OIMHPju3bHGGmtwwQUXcPvtt9PU1MThhx/+rnlaqyD/4z/+g733\n3psll1ySlVdemQ033JDFFluM4447jptvvpk11lhjgT/XGmuswRJLLMHee+9NU1MTw4YN49VXX+1w\nueWWW44vf/nL7LPPPsyZM4dVV12VXXfddYHXK0kLqmX9u+WWW1r/Wv9K70m/lpd7eovGxsamhoaG\neocxV2NjIwsTz4QJE/jrX//Krrvuyptvvsnuu+/Offfdx6BBg7owykXPwu4XdQ/3S6Vsh7ab/3qo\nnlb/tqa9Y8z6t3787vdMi+J+aa/+teW4ToYPH84555zDFVdcwZw5czjmmGOsmCWpG1j/SmqPyXGd\nLL744lx44YX1DkOSFjnWv5La46PcJEmSpMLkWJIkSSpMjiVJkqTC5FiSJEkq+vQNeS9/cemOZ1oI\nw8dO6dTyusNNN93Ec889x/7778+FF17I97///Vbn22+//Tj55JNZc801uzlCSX2R9a/1r9RbdXly\nHBGNwOQy+BxwGvAzYA7wRGYeWuY7BPgqMAsYmZm3dnVsi5IVV1yxzYpZktR1rH+l3qVLk+OIGAKQ\nmTvUjPs1cFxmPhgRF0XEZ4A/AIcBmwBLAOMi4q7MnNWV8XW2m266ifvvv5/p06fzj3/8g0MOOYQ9\n99yTp556ilNPPZUBAwYwZMgQTj31VN555x2OPvpohg8fzvPPP8+GG27ID37wg3eVefXVV3PLLbfQ\nr18/dtttN/bdd1+OPfZYBg0axIsvvsikSZM444wzWG+99bjhhhv4+c9/zrLLLsvAgQPZbbfd5pbz\n4osvctRRR3H99dfzwx/+kIcffpg5c+aw8847c/DBBwNwwQUXMGnSJKZPn865557LqquuOnf5xx57\njDPPPJNBgwax2GKLcf7553PnnXcyYcIEjj76aGbOnMmnPvUp7r33Xvbbbz9WWGEFpkyZwq677sq4\ncePetU0eeeQRLrjgApqampg2bRrnnnsuAwcO5Mgjj2TllVfmpZdeYtddd2X8+PE89dRTbLfddhx5\n5JE888wznHrqqQAsu+yynHbaaSy11FJdu2Ml9Xgt698dd9yRhoYG61/rX2mhdXWf442AJSPizoi4\nOyI2BzbJzAfL9NuBnYDNgHGZOTszpwDjgQ27OLYuMXXqVEaPHs2FF17IJZdcAsAJJ5zAiSeeyFVX\nXcWIESM47bTTAPj73//Oaaedxo033sgDDzzA66+/Pl9Zf/vb37jtttu49tprueaaa/jtb3/Lc889\nB8Cqq67KmDFj2Hfffbn++ut54403uOyyy7j++usZM2YM06dPf1dsza85veWWWxg1ahRXX301Sy89\n79Ln9ttvzxVXXMHWW2/NnXfeOd+yd999N7vsssvczzBlypT5ymz59x577MFPf/pTBgwYMN82ufji\niwEYP34855xzDldeeSU77bQTd9xxBwAvvPACp59+OqNHj+ZHP/oRxx13HDfccAO/+MUv5tuWV155\nJdtssw2XXnrpwu4iSX1UbV1z8803A9a/1r/SwuvqbhXTgLMzc0xErEuVDNe+qu8tYGlgKPO6XgBM\nBZbp4ti6xHrrrQdUb2CaMWMGAK+++ioRAcCmm27KqFGjAFh99dVZfPHFARg2bBgzZszg+OOP5/nn\nn2eFFVbgk5/8JC+99BIHHHAATU1NvPXWW0ycOHG+9ay88so89thjTJw4kXXXXZfBgwcD8NGPfrTN\nGM8++2zOOeccJk2axDbbbDN3/Prrrw9UlwAnTZo03zJf//rXueiiizjggANYeeWV2XDD+c9dWr6G\nfI011mh1m8ycOROAlVZaiVNOOYUll1ySf/7zn2yyySYAfPCDH2TJJZdk0KBBrLjiigwdOnS+cv/2\n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\n/I0Wo5+p+duriJJUdPXTKp4FPlsz3JCZD5a/bwd2AjYDxmXm7MycAowHNuziuCRJkqR36dLkODNv\nAmbXjOpX8/dbVHdQD2X+u6inAj5iQJIkSd2uuy+lzan5eyjwJtVd1Eu3Mr7X8Q7Xnsn9oo54jEiS\nmnV3cvxYRGyTmQ8AuwD3Ao8AIyNiMLA48CHgiW6Oq1N0+h2uvVEPvCvX/UKP3C89Sb2OEZNySep5\nujs5/jZwaUQMAp4GbszMpog4HxhH1e3iuMyc2c1xSZIkSV2fHGfm88CW5e/xwHatzDMGGNPVsUiS\nJEnt8fE9nWSVM7fn5XoHUWP42Cn1DkGSJKnX6epHuUmSJEm9hsmxJEmSVJgcS5IkSYXJsSRJklSY\nHEuSJEmFybEkSZJUmBxLkiRJhcmxJEmSVJgcS5IkSYXJsSRJklT4+mj1ab7WW5IkLQxbjiVJkqTC\n5FiSJEkqTI4lSZKkwuRYkiRJKkyOJUmSpMLkWJIkSSpMjiVJkqTC5FiSJEkqTI4lSZKkwuRYkiRJ\nKkyOJUmSpMLkWJIkSSpMjiVJkqTC5FiSJEkqTI4lSZKkwuRYkiRJKkyOJUmSpMLkWJIkSSpMjiVJ\nkqTC5FiSJEkqTI4lSZKkwuRYkiRJKkyOJUmSpMLkWJIkSSpMjiVJkqTC5FiSJEkqTI4lSZKkwuRY\nkiRJKkyOJUmSpMLkWJIkSSpMjiVJkqTC5FiSJEkqTI4lSZKkwuRYkiRJKkyOJUmSpMLkWJIkSSoG\n1juAZhHRD7gQ2AiYDhycmRPqG5Uk9X4d1a8RsQdwAjALuDwzL6tLoJLUA/SkluM9gSGZuSVwLDCq\nzvFIUl/RZv0aEQPL8I7AdsBXI+ID9QhSknqCnpQcbwXcAZCZDwMfq284ktRntFe/rgeMz8wpmTkL\nGAds0/0hSlLP0JOS46WByTXDsyOiJ8UnSb1Ve/Vry2lvAct0V2CS1NP0a2pqqncMAETEucDvM/PG\nMjwxM1dra/7GxsaeEbgkvQ8NDQ39unod7dWvEbEBcEZm7laGRwHjMvOXbZVn/SupL2ir/u0xN+QB\nDwG7AzdGxMeBx9ubuTt+UCSpj2ivfn0aWCcilgWmUXWpOLu9wqx/JfVlPanluPlu6g3LqAMz85k6\nhiRJfUJr9SvQACyZmZdFxG7AiUA/YExmjq5PpJJUfz0mOZYkSZLqzRveJEmSpMLkWJIkSSpMjiVJ\nkqSiJz2tottFxLbAWODJMmox4OeZeUEb898HfK2zbxSMiAHAdcClmXlXZ5bdG/WE/RIRnwBOAWYC\nrwL7Z+b0ziq/N+oh+2VrqicpzAHuz8xjO6ts1V9POMZKudbJNXrCfrFOfrcesl/6ZJ1syzHck5k7\nZOYOVK9OPToilu6ulUfEWsD9+EbAluq6X4ALgE9n5nbAs8DB3bjunqze+2UU8MXyGuTNI2Kjbly3\nuod1cs9U7+++dXLr6r1f+mSdvEi3HBe1z+tcGphN9faozYEflukvAvs2zxQR/w+4CBgCDAeOz8zf\nRMRIqoNzAPCLzDw7Ir4J7A+8AzySmUe0WP+SwEHAd7rgs/Vm9d4v22XmpPL3QGCRbqGoUe/9snlm\nzomIpaje4ja1Cz6j6qvex5h1cuvqvV+sk1tX7/3SJ+tkW45hh4i4NyLuAa4C/jszpwGjgS9n5hbA\nrcB6QPNz7z4EnJOZnwS+Bhxaxo8o/7YB3izjDgAOzcz/BJ5u+UrszHw8M5P5D3DVf7/8EyAi9qKq\nLK7skk/Z+9R7v8wplf7jwMvAC130OVU/9T7GrJNbV+/9Yp3cunrvlz5ZJ9tyXF2S2LuV8Ss198vJ\nzMth7oP0oToAjo+Ig8rwoPL/vsCZwErA7WXcV4BvR8QawO+xwl1Qdd8vEXEE8Dngk5k5831/or6h\n7vslMx8G1oyIU4DvAie93w+lHqXux5haVff9Yp3cqrrvl75YJ9ty3LaXImJtgIj4n4jYk+qsqx/V\nTQFXZOYBwH1Av4gYBHwhM0eUvj8H/v/27hilYiiIAuhdhFgI1tOKpdgIfyviIgQ3IH8NLsAFaCli\noUt4tZWNFpY2FpnCRhDkx6jn9CEMLxkumTxeVe0mOc70A/xRkv0kBz9RzB8yy7pU1WmSwySrMcbL\nXMX9YnOty20fc5wkr5k2gfA/6MnLpCcvk578DcLx506SXPTuzr1MY4lkerguk6yr6ibJKsnWGOMt\nyXNV3fc112OMx0yjhrseeTwlefjkfo4q/JqNr0tVbSc5S7KT5LpHVifzlPdrzfW+nCe5+nCf9Ybr\nYjn05GXSk5dJT/4Gx0cDAEDz5RgAAJpwDAAATTgGAIAmHAMAQBOOAQCgCccAANCEYwAAaMIxAAC0\nd9F8s6iy9XOzAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11a847b50>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, (axis1, axis2) = plt.subplots(1, 2, figsize=(10, 5))\n",
"\n",
"df_ = X_train['Survived'].groupby([X_train['Pclass'], X_train['surname_english']])\n",
"\n",
"# Count survived by English surname\n",
"\n",
"N = 3\n",
"ind = np.arange(N) # the x locations for the groups\n",
"width = 0.35 # the total width of the bars\n",
"\n",
"rects1 = axis1.bar(ind, df_.count()[:, 1], width, color=colors[0], lw=0.0)\n",
"rects2 = axis1.bar(ind+width, df_.count()[:, 0], width, color=colors[4], lw=0.0)\n",
"\n",
"axis1.set_ylim(0, 550)\n",
"axis1.set_ylabel('Count')\n",
"axis1.set_title('Total count of English surname by Pclass')\n",
"axis1.set_xticks(ind + width)\n",
"axis1.set_xticklabels(('Pclass 1', 'Pclass 2', 'Pclass 3'))\n",
"\n",
"axis1.legend((rects1[0], rects2[0]), ('english surname', 'non-english surname'), loc=2)\n",
"\n",
"\n",
"# Avg survived by English surname in class 3\n",
"\n",
"N = 3\n",
"ind = np.arange(N) # the x locations for the groups\n",
"width = 0.4 # the total width of the bars\n",
"\n",
"rects1 = axis2.bar(ind, df_.mean()[:, 1], width, color=colors[0], lw=0.0)\n",
"rects2 = axis2.bar(ind+width, df_.mean()[:, 0], width, color=colors[4], lw=0.0)\n",
"\n",
"axis2.set_ylim(0, 1)\n",
"axis2.set_ylabel('mean(Survived)')\n",
"axis2.set_title('Average survived by English surname by Pclass')\n",
"axis2.set_xticks(ind + width)\n",
"axis2.set_xticklabels(('Pclass 1', 'Pclass 2', 'Pclass 3'))\n",
"\n",
"axis2.legend((rects1[0], rects2[0]), ('english surname', 'non-english surname'), loc=2)\n",
"\n",
"plt.tight_layout()\n",
"\n",
"plt.savefig('plots/surname_by_class.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"More people in class 3 had non-English surnames. However, unlike the other classes, they had a slightly lower survival rate than people with English surnames."
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"features = ['surname_english']"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[('RandomForestClassifier', 0.61616490890978648),\n",
" ('LogisticRegression', 0.61616490890978648),\n",
" ('SVC', 0.61616490890978648),\n",
" ('GaussianNB', 0.61616490890978648),\n",
" ('KNeighborsClassifier', 0.53541668218202298)]"
]
},
"execution_count": 88,
"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": 89,
"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>surname_english</td>\n",
" <td>0.287834</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Features Coefficient Estimate\n",
"0 surname_english 0.287834"
]
},
"execution_count": 89,
"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": [
"Having an english surname is not a strong predictor of survival."
]
},
{
"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