{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "from __future__ import division, print_function\n", "\n", "# to suppress warnings of Seaborn's deprecated usage of Matplotlib\n", "import warnings\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "
\n", "

The Python Data Science Stack

\n", "
\n", "

Dr. Florian Wilhelm

\n", "

Senior Professional: Data Scientist @ CSC

\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# What is Python?\n", "\n", "* multi-purpose\n", "* focused on readability and productivity\n", "* easy to learn\n", "* object oriented\n", "* interpreted\n", "* strongely and dynamically typed\n", "* cross platform" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Features\n", "\n", "* indentation is part of the syntax \n", "* high level data types (tuples, lists, dictionaries, sets)\n", "* Python Standard Library (Batteries included)\n", " * string sevices, regular expressions\n", " * mathematical modules\n", " * IO, file formats and data persistence\n", " * OS, threading, multiprocessing\n", " * networking, email, html, webserver\n", " * ...\n", "* easily extensible with C/C++ (glue language)\n", "* tons of external libraries" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Why Python for Analytics?\n", "\n", "Besides the features already mentioned, Python has:\n", "\n", "* large communities for data science, analytics, visualisation etc.,\n", "* many and well-established libraries,\n", "* lots of examples and documentation,\n", "* **huge** demand from the industry.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "
\n", "

Python 2 vs. 3

\n", "
\n", "Source: LearnToCodeWithMe

\n", "

Use Python 3! All relevant libraries are ported!

\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "
\n", "

Installation

\n", "
\n", "\n", "### Linux & Mac \n", "\n", "
\n", "*It is already installed!* Use [virtualenv](http://virtualenv.readthedocs.org/) and [pip](https://pip.pypa.io/) to setup isolated environments and install more packages. [Conda](http://conda.pydata.org/docs/) is an alternative.\n", "\n", "### Windows \n", "
\n", "\n", "*A bit trickier!* Best use the [Anaconda distribution](https://www.continuum.io/downloads) from Continuum Analytics to install everything you need to get going.\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Primer on Python\n", "\n", "Strong and dynamically typed" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "69" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = 23\n", "3*x" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello World!\n" ] } ], "source": [ "x = \"Hello \"\n", "y = \"World!\"\n", "print(x + y)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "TypeError", "evalue": "Can't convert 'int' object to str implicitly", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: Can't convert 'int' object to str implicitly" ] } ], "source": [ "print(x + 1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Indentation matters!" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Positive, odd number!\n" ] } ], "source": [ "x = 3\n", "\n", "if x > 0:\n", " if x % 2 == 0:\n", " print(\"Positive, even number!\")\n", " else:\n", " print(\"Positive, odd number!\")\n", "else:\n", " print(\"Non-positive number!\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The BMI is: 23.1\n" ] } ], "source": [ "def bmi(height, weight):\n", " return weight / height**2\n", "\n", "print(\"The BMI is: {:.3}\".format(bmi(1.85, 79)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Tuples" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 3, 5)\n" ] } ], "source": [ "x = (1, 3, 5)\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[2]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9\n" ] } ], "source": [ "a, b, c = x\n", "print(a + b + c)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 and [3, 5]\n" ] } ], "source": [ "a, *others = x\n", "print(a, 'and', others)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Lists" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 3, 5]\n" ] } ], "source": [ "x = [1, 3, 5]\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 3, 5, 7]\n" ] } ], "source": [ "x.append(7)\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3, 5, 7]\n" ] } ], "source": [ "del x[0]\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Dictionaries" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "x = {'a': 1, 'b': 2, 'c': 3}" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "print(x['b'])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'a': 1, 'd': 4, 'b': 2, 'c': 3}\n" ] } ], "source": [ "x['d'] = 4\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "42" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x['dispatch'] = lambda x: x + 41\n", "x['dispatch'](1)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Powerful and easy to use data structures like lists and dictionaries allow **declarative programming**." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Loops and list comprehension" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 4, 9, 16]\n" ] } ], "source": [ "x = []\n", "for i in range(5):\n", " x.append(i**2)\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 4, 9, 16]\n" ] } ], "source": [ "# better\n", "x = [i**2 for i in range(5)]\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Many more *high-level* concepts available to express an algorithm as *natural* as possible. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Python Data Science Stack

\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "

Python Data Science Stack

\n", "
\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "

Python Data Science Stack

\n", "\n", "\n", "* **NumPy** to work efficiently with multi-dimensional arrays and matrices. Includes some high-level mathematical operations.\n", "* **SciPy** extends NumPy with additional modules (optimization, linear algebra, integration, interpolation, special functions, FFT, signal and image processing, ODE solvers etc.).\n", "* **Pandas** builds upon NumPy and provides high-performance, easy-to-use data structures and data analysis tools.\n", "* **Scikit-Learn** provides simple and efficient machine learning tools for data mining and data analysis.\n", "* **matplotlib** provides 2d plotting capabilities. Use additionally **Seaborn** for statistical plots.\n", "* **IPython** is a powerful interactive shell and a kernel for *Jupyter*.\n", "* **Jupyter** Notebook is a web application that allows you to create and share documents that contain live code, equations, visualizations and explanatory text. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Many libraries internally use efficient C/C++ and FORTRAN implementations!" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "slideshow": { "slide_type": "subslide" } }, "source": [ "

Jupyter/IPython Notebook

\n", "
\n", "Live demonstration\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Titanic: Analysis of a Disaster

\n", "
\n", "Painting from Willy Stöwer, source & more information: Kaggle\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "

Can we predict who survived on the Titanic?

\n", "

\n", "Based on the properties of a passenger like:\n", "

    \n", "
  • gender,
  • \n", "
  • age,
  • \n", "
  • passenger class,
  • \n", "
  • number of siblings,
  • \n", "
  • ...
  • \n", "
\n", "\n", "

\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Setting things up and reading in the data" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "%matplotlib inline\n", "\n", "df = pd.read_csv('./input/train.csv')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "# Drop unnecessary colum and rename some for better readability\n", "df = df.drop('PassengerId', axis=1)\n", "df = df.rename(columns={'Survived': 'Alive', 'Pclass': 'Class', 'Embarked': 'Port'})\n", "df['Name'] = df['Name'].str[:10]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false, "scrolled": false, "slideshow": { "slide_type": "fragment" } }, "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", "
AliveClassNameSexAgeSibSpParchTicketFareCabinPort
003Braund, Mrmale2210A/5 211717.2500NaNS
111Cumings, Mfemale3810PC 1759971.2833C85C
213Heikkinen,female2600STON/O2. 31012827.9250NaNS
311Futrelle,female351011380353.1000C123S
403Allen, Mr.male35003734508.0500NaNS
\n", "
" ], "text/plain": [ " Alive Class Name Sex Age SibSp Parch Ticket \\\n", "0 0 3 Braund, Mr male 22 1 0 A/5 21171 \n", "1 1 1 Cumings, M female 38 1 0 PC 17599 \n", "2 1 3 Heikkinen, female 26 0 0 STON/O2. 3101282 \n", "3 1 1 Futrelle, female 35 1 0 113803 \n", "4 0 3 Allen, Mr. male 35 0 0 373450 \n", "\n", " Fare Cabin Port \n", "0 7.2500 NaN S \n", "1 71.2833 C85 C \n", "2 7.9250 NaN S \n", "3 53.1000 C123 S \n", "4 8.0500 NaN S " ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Preprocessing" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "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", "
AliveClassSexAgeSibSpParchFarePort
003male22107.2500S
111female381071.2833C
213female26007.9250S
311female351053.1000S
403male35008.0500S
\n", "
" ], "text/plain": [ " Alive Class Sex Age SibSp Parch Fare Port\n", "0 0 3 male 22 1 0 7.2500 S\n", "1 1 1 female 38 1 0 71.2833 C\n", "2 1 3 female 26 0 0 7.9250 S\n", "3 1 1 female 35 1 0 53.1000 S\n", "4 0 3 male 35 0 0 8.0500 S" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# We drop some hard to use columns and define 'Port', 'Sex' and 'Class' as categories\n", "df = df.drop(['Name', 'Ticket', 'Cabin'], axis=1)\n", "df['Port'] = df['Port'].astype('category')\n", "df['Sex'] = df['Sex'].astype('category')\n", "df['Class'] = df['Class'].astype('category')\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(891, 8)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Data cleansing" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "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", "
AliveAgeSibSpParchFare
count891.000000714.000000891.000000891.000000891.000000
mean0.38383829.6991180.5230080.38159432.204208
std0.48659214.5264971.1027430.80605749.693429
min0.0000000.4200000.0000000.0000000.000000
25%0.00000020.1250000.0000000.0000007.910400
50%0.00000028.0000000.0000000.00000014.454200
75%1.00000038.0000001.0000000.00000031.000000
max1.00000080.0000008.0000006.000000512.329200
\n", "
" ], "text/plain": [ " Alive Age SibSp Parch Fare\n", "count 891.000000 714.000000 891.000000 891.000000 891.000000\n", "mean 0.383838 29.699118 0.523008 0.381594 32.204208\n", "std 0.486592 14.526497 1.102743 0.806057 49.693429\n", "min 0.000000 0.420000 0.000000 0.000000 0.000000\n", "25% 0.000000 20.125000 0.000000 0.000000 7.910400\n", "50% 0.000000 28.000000 0.000000 0.000000 14.454200\n", "75% 1.000000 38.000000 1.000000 0.000000 31.000000\n", "max 1.000000 80.000000 8.000000 6.000000 512.329200" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "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", "
SexPort
count891889
unique23
topmaleS
freq577644
\n", "
" ], "text/plain": [ " Sex Port\n", "count 891 889\n", "unique 2 3\n", "top male S\n", "freq 577 644" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['Sex', 'Port']].describe()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Fill not available observations\n", "age_mean = df['Age'].mean()\n", "df['Age'] = df['Age'].fillna(age_mean)\n", "df['Port'] = df['Port'].fillna('S')" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "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", "
SexPort
count891891
unique23
topmaleS
freq577646
\n", "
" ], "text/plain": [ " Sex Port\n", "count 891 891\n", "unique 2 3\n", "top male S\n", "freq 577 646" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['Sex', 'Port']].describe()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Some analysis plots" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 1, figsize=(12, 5))\n", "ax.axes.set_xlim(0, 80)\n", "g = sns.distplot(df['Age'], color=\"b\", ax=ax)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Draw a nested barplot to show survival for class and sex\n", "g = sns.factorplot(x=\"Class\", y=\"Alive\", hue=\"Sex\", data=df, size=7, kind=\"bar\", palette=\"muted\")\n", "g.set_ylabels(\"survival probability\")\n", "g.set_xlabels(\"passenger class\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Fitting a simple predictive model" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "from sklearn.cross_validation import train_test_split\n", "\n", "# Define features and target variables\n", "X = df.drop('Alive', axis=1)\n", "y = df['Alive']\n", "# Convert categories to integer values\n", "X['Sex'] = X['Sex'].cat.codes\n", "X['Port'] = X['Port'].cat.codes\n", "# Convert to NumPy arrays\n", "X = X.values\n", "y = y.values" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Split the data into train and test sets\n", "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Create and train the model\n", "model = RandomForestClassifier(n_estimators = 100, random_state=0)\n", "model.fit(X_train, y_train)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 83.4%\n" ] } ], "source": [ "# Make some predictions on the test set and compare with the truth\n", "preds = model.predict(X_test)\n", "print(\"Accuracy: {:.1%}\".format(np.mean(preds == y_test)))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

And there is much, much more!

\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Additional libraries for Data Science\n", "\n", "#### Visualisation\n", "* **Bokeh** allows interactive visualization like plots, dashboards in web browsers.\n", "* **Pygal** for standard but sexy charts in SVG.\n", "\n", "#### High-performance computing\n", "* **Theano** evaluate mathematical expressions involving multi-dimensional arrays efficiently.\n", "* **Spark** is fast and general-purpose cluster computing system with PySpark as Python interface.\n", "* **Cython** is an optimising static compiler for writing C-extensions in a Python-like language.\n", "* **Dask** enables parallel computing through task scheduling and blocked algorithms (Out-of-Core).\n", "* **TensorFlow** is a library for numerical computation using data flow graphs often used for AI.\n", "\n", "#### Miscellaneous\n", "* **scikit-image** provides tools for image processing.\n", "* **SQLAlchemy** is an SQL toolkit and Object Relational Mapper.\n", "* **SymPy** is library for symbolic mathematics, i.e. computer algebra system like Maple.\n", "* **PyMC** features Bayesian statistical models including Markov chain Monte Carlo.\n", "* **NetworkX** for working with structure, dynamics, and functions of complex networks." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "

Questions?


\n", "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "# Credits\n", "\n", "
\n", "This presentation was inspired by:\n", "\n", "* [Savarin's PyCon UK Tutorial](http://nbviewer.jupyter.org/github/savarin/pyconuk-introtutorial/blob/master/notebooks/Section%201-1%20-%20Filling-in%20Missing%20Values.ipynb)\n", "* [Thomas Wiecki's Introduction to Data Analysis with Python](http://nbviewer.jupyter.org/github/twiecki/pydata_ninja/blob/master/PyData%20Ninja.ipynb)\n", "* [Kaggle's Titantic: Machine Learning from Disaster](https://www.kaggle.com/c/titanic/)" ] }, { "cell_type": "raw", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "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.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }