mirror of
https://github.com/donnemartin/data-science-ipython-notebooks.git
synced 2024-03-22 13:30:56 +08:00
257 lines
46 KiB
Python
257 lines
46 KiB
Python
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"<!--BOOK_INFORMATION-->\n",
|
||
|
"<img align=\"left\" style=\"padding-right:10px;\" src=\"figures/PDSH-cover-small.png\">\n",
|
||
|
"*This notebook contains an excerpt from the [Python Data Science Handbook](http://shop.oreilly.com/product/0636920034919.do) by Jake VanderPlas; the content is available [on GitHub](https://github.com/jakevdp/PythonDataScienceHandbook).*\n",
|
||
|
"\n",
|
||
|
"*The text is released under the [CC-BY-NC-ND license](https://creativecommons.org/licenses/by-nc-nd/3.0/us/legalcode), and code is released under the [MIT license](https://opensource.org/licenses/MIT). If you find this content useful, please consider supporting the work by [buying the book](http://shop.oreilly.com/product/0636920034919.do)!*\n",
|
||
|
"\n",
|
||
|
"*No changes were made to the contents of this notebook from the original.*"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"<!--NAVIGATION-->\n",
|
||
|
"< [Simple Scatter Plots](04.02-Simple-Scatter-Plots.ipynb) | [Contents](Index.ipynb) | [Density and Contour Plots](04.04-Density-and-Contour-Plots.ipynb) >"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"# Visualizing Errors"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"For any scientific measurement, accurate accounting for errors is nearly as important, if not more important, than accurate reporting of the number itself.\n",
|
||
|
"For example, imagine that I am using some astrophysical observations to estimate the Hubble Constant, the local measurement of the expansion rate of the Universe.\n",
|
||
|
"I know that the current literature suggests a value of around 71 (km/s)/Mpc, and I measure a value of 74 (km/s)/Mpc with my method. Are the values consistent? The only correct answer, given this information, is this: there is no way to know.\n",
|
||
|
"\n",
|
||
|
"Suppose I augment this information with reported uncertainties: the current literature suggests a value of around 71 $\\pm$ 2.5 (km/s)/Mpc, and my method has measured a value of 74 $\\pm$ 5 (km/s)/Mpc. Now are the values consistent? That is a question that can be quantitatively answered.\n",
|
||
|
"\n",
|
||
|
"In visualization of data and results, showing these errors effectively can make a plot convey much more complete information."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Basic Errorbars\n",
|
||
|
"\n",
|
||
|
"A basic errorbar can be created with a single Matplotlib function call:"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 1,
|
||
|
"metadata": {
|
||
|
"collapsed": true
|
||
|
},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"%matplotlib inline\n",
|
||
|
"import matplotlib.pyplot as plt\n",
|
||
|
"plt.style.use('seaborn-whitegrid')\n",
|
||
|
"import numpy as np"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 2,
|
||
|
"metadata": {
|
||
|
"collapsed": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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\nIrcsSzt27NDly5dVVVW
|
||
|
"text/plain": [
|
||
|
"<matplotlib.figure.Figure at 0x10bf54080>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"x = np.linspace(0, 10, 50)\n",
|
||
|
"dy = 0.8\n",
|
||
|
"y = np.sin(x) + dy * np.random.randn(50)\n",
|
||
|
"\n",
|
||
|
"plt.errorbar(x, y, yerr=dy, fmt='.k');"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Here the ``fmt`` is a format code controlling the appearance of lines and points, and has the same syntax as the shorthand used in ``plt.plot``, outlined in [Simple Line Plots](04.01-Simple-Line-Plots.ipynb) and [Simple Scatter Plots](04.02-Simple-Scatter-Plots.ipynb).\n",
|
||
|
"\n",
|
||
|
"In addition to these basic options, the ``errorbar`` function has many options to fine-tune the outputs.\n",
|
||
|
"Using these additional options you can easily customize the aesthetics of your errorbar plot.\n",
|
||
|
"I often find it helpful, especially in crowded plots, to make the errorbars lighter than the points themselves:"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 3,
|
||
|
"metadata": {
|
||
|
"collapsed": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD/CAYAAADsfV27AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGjxJREFUeJzt3X9slWf9//FXC2tLoYOOsMYuUguEGSWZAbYsGswgVqGf\nLLqsmurKiCxRt5DgxmznWDexIRWSjsVQIhtTCTVWrSTjj2YLZGQ6wiI2jqVLJAondOM0TUdVTkGE\n0vP9g28PPeXc58d97l/XfT8fSZNyn3Pu++rFdb/P+75+3HdJMplMCgBgrFK/CwAAKA6BHAAMRyAH\nAMMRyAHAcARyADAcgRwADDfb7gcnJyf1wgsvKBaLqbS0VDt27NCyZcucLBsAIA+2M/K3335bJSUl\n+u1vf6utW7fq5ZdfdrJcAIA82c7Iv/KVr2jdunWSpAsXLmj+/PmOFQoAkD/bgVySSktL9dxzz+nY\nsWP6+c9/7lSZAAAFKHFiif7Fixf1zW9+U/39/aqoqHCiXACAPNnOyN944w2NjIzoe9/7nsrLy1Va\nWqrS0vQu94GBgaILCABRtGrVqrzfazuQf/WrX9WPf/xjtbS0aGJiQtu3b1dZWVlRhQmzeDyu2tpa\nv4sRCNTFLdTFLdTFLYUmwbYD+Zw5c/TKK6/Y/TgAwCEsCAIAwxHIAcBwBHIAMByBHAAMRyAHAMMR\nyAHAcARyADAcgRwADEcgBwDDFXX3QwCIspGRkdTvNTU1vpUj9IE8KBUNIHxGR0dTvxPIXRSUigYA\nt4Q+kJuAqwYAxSCQBwBXDQCKwawVADAcgRwADEcgBwDDEcgBwHAEcgAwHIEcAAwXiumHzMMGEGWh\nCOTMwwYQZXStAIDhCOQAYDhbXSsTExN6/vnndeHCBV2/fl0/+MEPtG7dOqfLBgCOCut4mq1AfuTI\nEVVXV2v37t36z3/+o2984xsEcgCBkC1Yh3U8zVYg37Bhg9avXy9Jmpyc1OzZoRgzBRACYQ3W2diK\nwHPmzJEkjY+Pa+vWrXr66acdLRQAIH+2U+nh4WFt2bJFLS0tamxstHxfPB63ewhbsh3P67JMl0gk\n8jq+n2X0Sr51EQWm1cWVK1dSv1dWVjq6bzfqwst44Of/o61A/sknn+iJJ57Qiy++qAcffDDre2tr\na20VrBBjY2OWx8v2mtOy9c3F43HL43tZxiDIVhdRk29dBGWQbnBwMPX7smXLHN23U+3Cy3jg1rk7\nPDxc0PttBfL9+/fr0qVL2rdvn7q7u1VSUqIDBw6orKzMzu5CI4p9c/AGbQvZ2Ark27dv1/bt250u\nC4CImX6lYZpYLKa2tjaNjo5q0aJF2rt3r+rr630pS6inmwSpogHcbvqVxl133eVjSQoTi8XU0NCg\ns2fPprY1NDTo6NGjvsSY0AbyoFU0gPBob29Piy2SdPbsWbW3t6unp8fz8oR2iX62ig6SqauGzZs3\nq62tTbFYzO8iwScjIyOpHwTbhQsXMm73a+ZKaDPyoFV0JvlcNQRltgLcx4CmOe65556M2/2ajRXa\njDxoFZ1JPlcNo6OjqR8AwdDR0aGlS5embVu6dKk6Ojp8KU9oM/KOjg699957aYHSz4rOpNirBrJ1\nuMHpdhXGdlpfX6+jR49qy5YtgZhMEdpAHrSKzqTYqwYuxeEGp9tVWNtpfX29du3alfZvv4Q2kEvB\nquhMTLhqABB8oQ7kQWfCVQOA4COQ+yzoVw0Ags/4QM7qTSB6wjiAWgyjAzmrN4FoCusAql1GzyM3\nZfUmALjJ6IzchNWbADCT011DRgdyE1ZvAgiGII2nOd01ZHQgZx42YE/UBgvDPp5mdCBnHjZgT1gH\nC62y7qDddtZpRgdyiXnYAG7KlnWHfTzN+EDulqhdeqIwUWwfQepjziRb1h328TQCuYWwXnrCGV62\njyAEUBP6mLNl3a+//nqox9MI5A4JwsmG8AlKADWhjzlb1h328TQCuQOCcrIhfIISQN3oY56Z/LS3\ntxfV1ZFrFluYx9MI5A7I52S7cuVKql+VrhrkKyiDdE73MWdKfj788EMdP37c9mMOw551Z0MgL1Cm\nxpXPyXb16lVdvXo17XPILIoDiVaCMkjn9JqNTMnP+fPn05IfO+MQYc66synqXiunT5/Wxo0bnSqL\nETI9QzMoJ1tYRPE5pVPdDJs3b1ZbW5tisZik4DwbcirbbWxs1P3336/Gxsaiug6DcqURFrYz8gMH\nDuiNN97Q3LlznSyPp5zK/NxaYcoAajTkGmMJSneBk9kuyY+zbAfyuro6dXd3q7W11cnyeMqpKWRu\nnGwMoEZHrjGWMHYXZEp+6urqfJsOaHp3nu1A3tDQYHl55IagV7TTJ1tQZivAfWHuZrC6qsyU/LS3\nt4fmJlZec32w06nGODY2lvr9xo0bto7n9GtuHuvcuXMZX4/FYorH4xoaGlJHR0faSbB48WLL/QZJ\nIpHIu12YEMyKKWMikVB1dXXG1xYsWJBx3/ke78qVK6nfKysrLd83fX+FtKtc5RgaGlJzc7POnz+f\n2rZ27Vr19vZq8eLFKi8vT0t+7rjjDl/OtUI+M1NFRYWtz9k9npWiA3kymcz6eqY+L6vsOlvWPT2Q\nz9xnttdmzZrl6D7tlqPQ15YsWaKTJ09qpvr6ev3vf/9TS0tLWsZ+5swZY7pd4vF41r7QbHUVFE6V\nMR6Pq6urSx988MFtYyxdXV2pfds53uDgYOr3ZcuWpb2WaX+xWCxnuyqkHK2trWlBXLo5M2Xv3r2p\nq8rp+6uqqvLlXMv1GTfkOt7w8HBB+yv6CUElJSUFf8ZqVoIbsxVqampSPybJNluBJyOFi9MzQuxy\nul2FucsoaIrKyO+55x719vY6VZbIWrRo0W3bsg2gBu0ECfr4hQmCMKDpdLtiZop3WBAUAFbBz+rk\nDtoJYvpAEW5yul3x4BfvGP3w5agKyiIRhIvT7cqtLiOrxVNRRkZuoCAtEkF4uNGunO4yYn1FZgRy\nQwWhTxXhE/R2xfqKzAjkAIwRtIF+O9y49QaBHIAxgjbQXyi3uoYY7AQixuTBQtMH+t1aAxKKjDzT\nPGwAtzN9sND0gX63uoZCEcidnrvM7WNvx6KfcAjDYGHQB2SzcatrKBSB3EmmZyxuYdHPLSZ/0bs5\nWMiXfW5uLZIikM8QhowF7jH9i97NwUK+7HNzq2uIQD5DGKY3wT2mf9FHfdl8EMbT3OgaIpDPYPr0\nJrjL9C960wcL85EtWIf1SoFAPkO2jMVu36jJfapIF4YvehMGC4s5Z8IarLMhkM9glbFIstU3anqf\nqteC/qUX9a4JL3DOFI5AnkGmjGXmk1Ok/PpGTe9T9VLQTuBMszCi0DWRjRd9zJwzhYtsIC8088un\nbzRTIze9T9VLQTuBrWZh+NE1EYRBOsmbbguvz5mgXwXmw4hA7nRF28n88ukbzdTIw9Cn6hW+9KxF\nqd/Xy3MmaFeBdgX+XitTFd3f369Tp06pv79fDQ0NRd0fws79Duze48H0e0N4iS+96Fm0aFHqZ4qX\n50xYnn8bmIzcKut243LbTuZnt2806n2qhWAg0TmmdBdMv9KYOv+8PGfCchXoeSDP1MAk6xkhblS0\n3czPbt+oCdO9goAvPWeEobvAq3MmLFeBngZyqwb2+c9/3jLrdqOiyfyCK8pfek4NaAZt0DjI8okF\nJtxDxtNAbtXAEolExvfH43G9/vrrjgddkzK/oMxWsGLKJbwJnAoSYeku8EI+scCEe8h4GsitGlhJ\nSUnG7bW1ta4FXVMyP6cbjpPZRRgu4cMoLN0FXglaLJh+jubLViBPJpP6yU9+ojNnzqisrEw7d+7U\npz/96Zyfs2pgDz74oAYHBy2z7qBVdFDYydadzC64hA+mYrsOnb4KDPpVZdBMP0fzZSuQHzt2TNeu\nXVNvb69Onz6tzs5O7du3L+fnrBrYnj17JMmIro4g8fsyj0v4wnnR31rsVazT5fK7nUaBrUA+MDCg\nNWvWSJLuu+8+DQ4O5vW
|
||
|
"text/plain": [
|
||
|
"<matplotlib.figure.Figure at 0x10bec4d30>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"plt.errorbar(x, y, yerr=dy, fmt='o', color='black',\n",
|
||
|
" ecolor='lightgray', elinewidth=3, capsize=0);"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"In addition to these options, you can also specify horizontal errorbars (``xerr``), one-sided errorbars, and many other variants.\n",
|
||
|
"For more information on the options available, refer to the docstring of ``plt.errorbar``."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Continuous Errors\n",
|
||
|
"\n",
|
||
|
"In some situations it is desirable to show errorbars on continuous quantities.\n",
|
||
|
"Though Matplotlib does not have a built-in convenience routine for this type of application, it's relatively easy to combine primitives like ``plt.plot`` and ``plt.fill_between`` for a useful result.\n",
|
||
|
"\n",
|
||
|
"Here we'll perform a simple *Gaussian process regression*, using the Scikit-Learn API (see [Introducing Scikit-Learn](05.02-Introducing-Scikit-Learn.ipynb) for details).\n",
|
||
|
"This is a method of fitting a very flexible non-parametric function to data with a continuous measure of the uncertainty.\n",
|
||
|
"We won't delve into the details of Gaussian process regression at this point, but will focus instead on how you might visualize such a continuous error measurement:"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 4,
|
||
|
"metadata": {
|
||
|
"collapsed": false
|
||
|
},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from sklearn.gaussian_process import GaussianProcess\n",
|
||
|
"\n",
|
||
|
"# define the model and draw some data\n",
|
||
|
"model = lambda x: x * np.sin(x)\n",
|
||
|
"xdata = np.array([1, 3, 5, 6, 8])\n",
|
||
|
"ydata = model(xdata)\n",
|
||
|
"\n",
|
||
|
"# Compute the Gaussian process fit\n",
|
||
|
"gp = GaussianProcess(corr='cubic', theta0=1e-2, thetaL=1e-4, thetaU=1E-1,\n",
|
||
|
" random_start=100)\n",
|
||
|
"gp.fit(xdata[:, np.newaxis], ydata)\n",
|
||
|
"\n",
|
||
|
"xfit = np.linspace(0, 10, 1000)\n",
|
||
|
"yfit, MSE = gp.predict(xfit[:, np.newaxis], eval_MSE=True)\n",
|
||
|
"dyfit = 2 * np.sqrt(MSE) # 2*sigma ~ 95% confidence region"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"We now have ``xfit``, ``yfit``, and ``dyfit``, which sample the continuous fit to our data.\n",
|
||
|
"We could pass these to the ``plt.errorbar`` function as above, but we don't really want to plot 1,000 points with 1,000 errorbars.\n",
|
||
|
"Instead, we can use the ``plt.fill_between`` function with a light color to visualize this continuous error:"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 5,
|
||
|
"metadata": {
|
||
|
"collapsed": false
|
||
|
},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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\ntm3b5O9Pnz6N/fv3Y/X
|
||
|
"text/plain": [
|
||
|
"<matplotlib.figure.Figure at 0x10e55bba8>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Visualize the result\n",
|
||
|
"plt.plot(xdata, ydata, 'or')\n",
|
||
|
"plt.plot(xfit, yfit, '-', color='gray')\n",
|
||
|
"\n",
|
||
|
"plt.fill_between(xfit, yfit - dyfit, yfit + dyfit,\n",
|
||
|
" color='gray', alpha=0.2)\n",
|
||
|
"plt.xlim(0, 10);"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Note what we've done here with the ``fill_between`` function: we pass an x value, then the lower y-bound, then the upper y-bound, and the result is that the area between these regions is filled.\n",
|
||
|
"\n",
|
||
|
"The resulting figure gives a very intuitive view into what the Gaussian process regression algorithm is doing: in regions near a measured data point, the model is strongly constrained and this is reflected in the small model errors.\n",
|
||
|
"In regions far from a measured data point, the model is not strongly constrained, and the model errors increase.\n",
|
||
|
"\n",
|
||
|
"For more information on the options available in ``plt.fill_between()`` (and the closely related ``plt.fill()`` function), see the function docstring or the Matplotlib documentation.\n",
|
||
|
"\n",
|
||
|
"Finally, if this seems a bit too low level for your taste, refer to [Visualization With Seaborn](04.14-Visualization-With-Seaborn.ipynb), where we discuss the Seaborn package, which has a more streamlined API for visualizing this type of continuous errorbar."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"<!--NAVIGATION-->\n",
|
||
|
"< [Simple Scatter Plots](04.02-Simple-Scatter-Plots.ipynb) | [Contents](Index.ipynb) | [Density and Contour Plots](04.04-Density-and-Contour-Plots.ipynb) >"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"metadata": {
|
||
|
"anaconda-cloud": {},
|
||
|
"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
|
||
|
}
|