{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Computer Science AP Data Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a [Jupyter notebook](http://jupyter.org/) using Python3 to show how to explore the data mentioned in:\n", "\n", "[Still No African-Americans Taking the AP Computer Science Exam in Nine States](http://blogs.edweek.org/edweek/curriculum/2015/11/no_african-american_students_2015_AP_computer_science_exam_nine_states.html) by [Liana Heitin](http://www.edweek.org/tm/contributors/liana%20.heitin.html) and based on the analysis by Barbara Ericson, Director of Computing Outreach and a senior research scientist at Georgia Tech.\n", "\n", "This post was mentioned in Facebook's [CSEdForum](https://www.facebook.com/groups/CSEdForum/permalink/1510928882538869/) by Mark Guzdial; check out his [Computing Education Blog](https://computinged.wordpress.com/).\n", "\n", "You can replicate (and try variations of) this notebook here:\n", "\n", "* http://mybinder.org/repo/dsblank/cs-ap-analysis - ready to run!\n", "\n", "Or by downloading it (upper right-hand corner) and uploading it to your own Jupyter notebook server:\n", "\n", "* [on your own desktop](http://jupyter.readthedocs.org/en/latest/install.html)\n", "\n", "This notebook was created:\n", "\n", "* by [Doug Blank](http://cs.brynmawr.edu/~dblank/)\n", "* [Bryn Mawr College](http://www.brynmawr.edu/)\n", "* Nov 5, 2015\n", "\n", "Please feel free to copy, explore, and share! If you make corrections or additions, send me [email](mailto:dblank@cs.brynmawr.edu) and I'll update this notebook." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.1 Software\n", "\n", "In addition to using the Jupyter notebook, we assume that you have the following installed:\n", "\n", "* matplotlib\n", "* numpy\n", "\n", "In addition, we will install these lesser-known libraries:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already up-to-date: openpyxl in /home/dblank/.local/lib/python3.4/site-packages\n", "Requirement already up-to-date: jdcal in /home/dblank/.local/lib/python3.4/site-packages (from openpyxl)\n", "Requirement already up-to-date: et-xmlfile in /home/dblank/.local/lib/python3.4/site-packages (from openpyxl)\n" ] } ], "source": [ "!pip install openpyxl --upgrade --user" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting metakernel\n", " Using cached metakernel-0.11.3-py2.py3-none-any.whl\n", "Requirement already up-to-date: IPython>=3.0 in /usr/lib/python3.4/site-packages (from metakernel)\n", "Requirement already up-to-date: pexpect in /home/dblank/.local/lib/python3.4/site-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: decorator in /home/dblank/.local/lib/python3.4/site-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: pickleshare in /usr/lib/python3.4/site-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: traitlets in /usr/lib/python3.4/site-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: simplegeneric>0.8 in /usr/lib/python3.4/site-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: ptyprocess>=0.5 in /usr/lib/python3.4/site-packages (from pexpect->IPython>=3.0->metakernel)\n", "Requirement already up-to-date: path.py in /home/dblank/.local/lib/python3.4/site-packages (from pickleshare->IPython>=3.0->metakernel)\n", "Requirement already up-to-date: ipython-genutils in /usr/lib/python3.4/site-packages (from traitlets->IPython>=3.0->metakernel)\n", "Installing collected packages: metakernel\n", "Successfully installed metakernel-0.10.5\n" ] } ], "source": [ "!pip install metakernel --upgrade --user" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now we can:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import openpyxl ## used in opening Excel spreadsheets" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import metakernel\n", "metakernel.register_ipython_magics() ## used for its %download magic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.2 Data\n", "\n", "As the article above points out, you can get the data from this site:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://research.collegeboard.org/programs/ap/data/participation/ap-2015" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we show downloading one, after getting the link from above:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloaded '2015-Top-200-Colleges.xlsx'.\n" ] } ], "source": [ "%download https://secure-media.collegeboard.org/digitalServices/pdf/research/2015/2015-Top-200-Colleges.xlsx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.3 Analysis\n", "\n", "This is an interesting experiment showing the difficulty in getting and analyzing data. Note:\n", "\n", "* Excel spreadsheets are proprietary, yet used often to disseminate data\n", "* Spreadsheets (of any kind) are good for displaying data for humans; not so good for computer analysis\n", "\n", "Be on the lookout for inconsistent data types. For example, in the following spreadsheet, the year format changes from being an integer to being a string inexplicably in 1997. \n", "\n", "Also note:\n", "\n", "* The College Board's website is marked \"© 2015 The College Board\"\n", "* The data in the spreadsheet is marked with \"© 2015 The College Board. All rights reserved.\"\n", "\n", "I have no idea what the limits to using this data are. Use at your own risk.\n", "\n", "First we download the data file:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloaded 'pennsylvania-summary-2015.xlsx'.\n" ] } ], "source": [ "%download http://media.collegeboard.com/digitalServices/misc/ap/pennsylvania-summary-2015.xlsx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we use the openpyxl library to read in the data, and show the worksheet names. (I don't know this library, but after creating the Python object, you can type a dot followed by a TAB to show the methods. Or [read the sparse docs](http://openpyxl.readthedocs.org/en/latest/).)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['All', '11th', '12th', 'Females', 'Males', 'Public', 'In-State', 'Out-of-State', 'Annual Participation', 'Colleges Receiving Scores']\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/dblank/.local/lib/python3.4/site-packages/openpyxl/workbook/names/named_range.py:124: UserWarning: Discarded range with reserved name\n", " warnings.warn(\"Discarded range with reserved name\")\n" ] } ], "source": [ "workbook = openpyxl.load_workbook('pennsylvania-summary-2015.xlsx')\n", "print(workbook.get_sheet_names())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using trial and error, we write a function that takes a workbook, finds the right sheet, and returns the data. This may perhaps work on any state's summary spreadsheet." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def get_annual_participation(workbook):\n", " worksheet = workbook.get_sheet_by_name(\"Annual Participation\")\n", " data = {}\n", " row_count = 0\n", " for row in worksheet.iter_rows():\n", " year = row[0].value\n", " if (type(year) == str and year.isdigit()) or type(year) == int:\n", " year = str(row[0].value)\n", " students = int(row[2].value)\n", " data[year] = students\n", " row_count += 1\n", " data_keys = sorted(data.keys())\n", " data_values = [data[k] for k in data_keys]\n", " return data_keys, data_values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We call the function to get the data returned as [keys, values] where keys are the years (as strings) and values are the students taking the exam." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data = get_annual_participation(workbook)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For this demo, I'll use the standard library `matplotlib` because it is very common. I don't particularly like the interface, but it is flexible if not easy to use. I also use the standard method (in the sciences, especially Biology and Physics) of aliasing `matplotlib.pyplot` to be `plt`." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now plot our labels/data with this call to `plt.plot()`:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(*data);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is all students, by year, taking the an AP exam in Pennsylvania. \n", "\n", "What about in just a specific field, like Computer science? The data doesn't appear to be year in an annual breakdown, but we can get it for this year.\n", "\n", "The field/topic names are this in the spreadsheet:\n", "\n", "```python\n", "['ART: \\nHISTORY', 'BIOLOGY', 'CALCULUS AB', 'CALCULUS BC', 'CHEMISTRY', 'CHINESE LANG. \\n& CULTURE', 'COMPUTER \\nSCIENCE A', 'ECONOMICS: \\nMACRO', 'ECONOMICS: \\nMICRO', 'ENGLISH LANG-\\n&COMPOSITION', 'ENGLISH LIT-\\n&COMPOSITION', 'ENVIRONMENTAL \\nSCIENCE', 'EUROPEAN \\nHISTORY', 'FRENCH LANG. & CULTURE', 'GERMAN LANG. & CULTURE', 'GOVERNMENT &\\nPOLITICS COMP.', 'GOVERNMENT &\\nPOLITICS U.S.', 'HUMAN\\nGEOGRAPHY', 'ITALIAN LANG. & CULTURE', 'JAPANESE LANG. & CULTURE', 'LATIN\\n', 'MUSIC THEORY', 'PHYSICS 1', 'PHYSICS 2', 'PHYSICS C:\\nELEC. & MAGNET.', 'PHYSICS C:\\nMECHANICS', 'PSYCHOLOGY', 'SEMINAR', 'SPANISH LANG. & CULTURE', 'SPANISH LIT &\\nCULTURE', 'STATISTICS', 'STUDIO ART: \\n2-D DESIGN', 'STUDIO ART: \\n3-D DESIGN', 'STUDIO ART: \\nDRAWING', 'US HISTORY', 'WORLD HISTORY']\n", "```" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def get_ethnic_breakdown_by_topic(workbook, topic):\n", " worksheet = workbook.get_sheet_by_name(\"All\")\n", " data = []\n", " ethnicity = []\n", " last_ethnic_group = None\n", " row_count = 0\n", " topics = None\n", " for row in worksheet.iter_rows():\n", " ethnic_group = row[1]\n", " ap_score = row[2]\n", " if row_count < 5:\n", " pass\n", " elif row_count == 5: ## get topics, remove newlines\n", " topics = [item.value for item in row]\n", " else:\n", " if ethnic_group.value is not None and not ethnic_group.value.startswith(\" \"):\n", " if ethnic_group.value.strip() != last_ethnic_group:\n", " last_ethnic_group = ethnic_group.value.strip()\n", " ethnicity.append(last_ethnic_group)\n", " if ap_score.value == \"T\":\n", " col = topics.index(topic)\n", " data.append(row[col].value)\n", " row_count += 1\n", " ## The sum of all but last should equal last:\n", " assert sum(data[:-1]) == data[-1]\n", " results = data[:-1]\n", " return [v.strip().title() for v in ethnicity[:len(results)]], results" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data = get_ethnic_breakdown_by_topic(workbook, \"COMPUTER \\nSCIENCE A\")" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(['Not Stated',\n", " 'American Indian',\n", " 'Asian',\n", " 'Black',\n", " 'Mexican American',\n", " 'Other',\n", " 'Other Hispanic',\n", " 'Puerto Rican',\n", " 'White'],\n", " [17, 3, 328, 58, 8, 52, 17, 11, 1065])" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's turn that into a bar chart: " ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nEREdlQQfEdFRSfARER2VBB8R0VFJ8BERHZUEHxHRUUnwEREdlQQfEdFRSfARER2VBB8R0VFJ8BER\nHZUEHxHRUUnwEREdlQQfEdFRSfARER2VBB8R0VFJ8BERHZUEHxHRUdNO8JLuJ+kUSZdI+qmk3SU9\nQNJZki6V9E1J9+s7/wRJ8yVdJGmnmQk/IiKWZlVq8B8HvmR7B2Ab4HLgWOB029sDZ9ZjJD0H2Nz2\nNsBLgU+vUtQREbFc00rwkjYEdrR9EoDthbZvBfYDTqynfRbYv97fv1duey4wS9LsVQk8IiKWbbo1\n+H8Efi/pC5Iuk/QZSfcBNrJ9M4Dtm4CN6/mbAtf0Pf5aIAk+ImI1mjXNx60F7AocZfsnkj4AvHk5\nj9GUYw86ac6cOXffn5iYYGJiYpohRkR00+TkJJOTk8s9T/bAPLvsB0mbAefY3qIePw54C/AwYHfb\nN0naCDjP9sMlfRI40/ap9fzLgKfavm7K7/V04omIGAZJLKVuurqfmWXlRknYnlqJnl4Tje1rgJsk\nPaIWPQn4KaVj9dBadihwRr1/BvDCGsjOwF1Tk3tERMysadXgASTtAHwCuCdwFSWBCzgZ2AS4HjjY\n9i31/A8BewN/A15m+6IBvzM1+IgYWeNWg592gl8dkuAjYpSNW4LPTNaIiI5Kgo+I6Kgk+IiIjkqC\nj4joqCT4iIiOSoKPiOioJPiIiI5Kgo+I6Kgk+IiIjkqCj4joqCT4iIiOSoKPiOioJPiIiI5Kgo+I\n6Kgk+IiIjkqCj4joqCT4iIiOSoKPiOioJPiIiI5Kgo+I6Kgk+IiIjkqCj4joqCT4iIiOSoKPiOio\nJPiIiI5Kgo+I6Kgk+IiIjkqCj4joqFVK8JLWljRX0tfq8ZaSzpM0T9LnJa1Ty9eTdHIt/6Gkh85E\n8BERsXSrWoM/CrgccD0+AXi37e2A64EjavkRwO9q+XH1vIiIWI2mneAlzQb2Az5RDrU2sLvtr9RT\nPgvsX+/vB5xY738V2FOSpvvcERGxfKtSg38/8HpgYT3eGLip7+fXAbPr/dnANQC2FwI31/MjImI1\nmTWdB0l6OnCj7bmSJnrFMxHQnDlz7r4/MTHBxMTEUs+NiFgTTU5OMjk5udzzZHu5Jy3xIOkdwGHA\nAuAewAbAl4B9bW9Uz9kVeKftJ0n6DnC07QskrQXcAGxSa/P9v9fTiSciYhhKy3KLHCWWlRslYXuJ\n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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "\n", "width = .35\n", "index = np.arange(len(data[1]))\n", "bars = ax.bar(index, data[1]);\n", "\n", "xTickMarks = data[0]\n", "ax.set_xticks(index+width)\n", "xtickNames = ax.set_xticklabels(xTickMarks)\n", "plt.setp(xtickNames, rotation=90, fontsize=10);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That code is way too complicated for me to produce a bar chart! I'm looking for another solution for me and students.\n", "\n", "Hope this was useful!" ] } ], "metadata": { "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 }