{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data visualization example\n",
"\n",
"In a [recent blog post](https://www.allendowney.com/blog/2019/01/30/data-visualization-for-academics/), I showed figures from [a recent paper](https://osf.io/preprints/socarxiv/j2tw9/) and invited readers to redesign them to communicate their message more effectively.\n",
"\n",
"This notebook shows one way we might redesign the figures. At the same time, it demonstrates a simple use of a Pandas MultiIndex."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The study reports the distribution of student evaluation scores for instructors under eight conditions. At the top level, they report scores from evaluations with a 10-point of 6-points scale."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"scale = ['10-point', '6-point']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"At the next level, they distinguish fields of study as \"least\" or \"most\" male-dominated."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"area = ['LeastMaleDominated', 'MostMaleDominated']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And they distinguish between male and female instructors."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"instructor = ['Male', 'Female']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can assemble those levels into a MultiIndex like this:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"MultiIndex(levels=[['10-point', '6-point'], ['LeastMaleDominated', 'MostMaleDominated'], ['Female', 'Male']],\n",
" labels=[[0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0, 1, 0]],\n",
" names=['Scale', 'Area', 'Instructor'])"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"index = pd.MultiIndex.from_product([scale, area, instructor], \n",
" names=['Scale', 'Area', 'Instructor'])\n",
"index"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For each of these eight conditions, the original paper reports the entire distribution of student evaluation scores. To make a simpler and clearer visualization of the results, I am going to present a summary of these distributions.\n",
"\n",
"I could take the mean of each distribution, and that would show the effect. But to make it even clearer, I will use the fraction of \"top\" scores, meaning a 9 or 10 on the 10-point scale and a 6 on the 6-point scale. \n",
"\n",
"Now, to get the data, I used the figures from the paper and estimated numbers by eye. **So these numbers are only approximate!**"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
\n",
"
TopScore%
\n",
"
\n",
"
\n",
"
Scale
\n",
"
Area
\n",
"
Instructor
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
10-point
\n",
"
LeastMaleDominated
\n",
"
Male
\n",
"
60
\n",
"
\n",
"
\n",
"
Female
\n",
"
60
\n",
"
\n",
"
\n",
"
MostMaleDominated
\n",
"
Male
\n",
"
54
\n",
"
\n",
"
\n",
"
Female
\n",
"
38
\n",
"
\n",
"
\n",
"
6-point
\n",
"
LeastMaleDominated
\n",
"
Male
\n",
"
43
\n",
"
\n",
"
\n",
"
Female
\n",
"
42
\n",
"
\n",
"
\n",
"
MostMaleDominated
\n",
"
Male
\n",
"
41
\n",
"
\n",
"
\n",
"
Female
\n",
"
41
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TopScore%\n",
"Scale Area Instructor \n",
"10-point LeastMaleDominated Male 60\n",
" Female 60\n",
" MostMaleDominated Male 54\n",
" Female 38\n",
"6-point LeastMaleDominated Male 43\n",
" Female 42\n",
" MostMaleDominated Male 41\n",
" Female 41"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = [60, 60, 54, 38, 43, 42, 41, 41]\n",
"df = pd.DataFrame(data, columns=['TopScore%'], index=index)\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To extract the subset of the data on a 10-point scale, we can use `loc` in the usual way."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
TopScore%
\n",
"
\n",
"
\n",
"
Area
\n",
"
Instructor
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
LeastMaleDominated
\n",
"
Male
\n",
"
60
\n",
"
\n",
"
\n",
"
Female
\n",
"
60
\n",
"
\n",
"
\n",
"
MostMaleDominated
\n",
"
Male
\n",
"
54
\n",
"
\n",
"
\n",
"
Female
\n",
"
38
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TopScore%\n",
"Area Instructor \n",
"LeastMaleDominated Male 60\n",
" Female 60\n",
"MostMaleDominated Male 54\n",
" Female 38"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.loc['10-point']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To extract subsets at other levels, we can use `xs`. This example takes a cross-section of the second level."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
TopScore%
\n",
"
\n",
"
\n",
"
Scale
\n",
"
Instructor
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
10-point
\n",
"
Male
\n",
"
54
\n",
"
\n",
"
\n",
"
Female
\n",
"
38
\n",
"
\n",
"
\n",
"
6-point
\n",
"
Male
\n",
"
41
\n",
"
\n",
"
\n",
"
Female
\n",
"
41
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TopScore%\n",
"Scale Instructor \n",
"10-point Male 54\n",
" Female 38\n",
"6-point Male 41\n",
" Female 41"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.xs('MostMaleDominated', level='Area')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This example takes a cross-section of the third level."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
TopScore%
\n",
"
\n",
"
\n",
"
Scale
\n",
"
Area
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
10-point
\n",
"
LeastMaleDominated
\n",
"
60
\n",
"
\n",
"
\n",
"
MostMaleDominated
\n",
"
54
\n",
"
\n",
"
\n",
"
6-point
\n",
"
LeastMaleDominated
\n",
"
43
\n",
"
\n",
"
\n",
"
MostMaleDominated
\n",
"
41
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TopScore%\n",
"Scale Area \n",
"10-point LeastMaleDominated 60\n",
" MostMaleDominated 54\n",
"6-point LeastMaleDominated 43\n",
" MostMaleDominated 41"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.xs('Male', level='Instructor')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ok, now to think about presenting the data. At the top level, the 10-point scale and the 6-point scale are different enough that I want to put them on different axes. So I'll start by splitting the data at the top level."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
"
TopScore%
\n",
"
\n",
"
\n",
"
Area
\n",
"
Instructor
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
LeastMaleDominated
\n",
"
Male
\n",
"
60
\n",
"
\n",
"
\n",
"
Female
\n",
"
60
\n",
"
\n",
"
\n",
"
MostMaleDominated
\n",
"
Male
\n",
"
54
\n",
"
\n",
"
\n",
"
Female
\n",
"
38
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" TopScore%\n",
"Area Instructor \n",
"LeastMaleDominated Male 60\n",
" Female 60\n",
"MostMaleDominated Male 54\n",
" Female 38"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ten = df.loc['10-point']\n",
"ten"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, the primary thing I want the reader to see is a discrepancy in percentages. For comparison of two or more values, a bar plot is often a good choice.\n",
"\n",
"As a starting place, I'll try the Pandas default for showing a bar plot of this data."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAFqCAYAAAAKv6G4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl4FeXZx/HvzSJYFdmFghLk1SpkAyIlSEEgslSLVEEBFxRbXEAUeK1YEbG2b1UUUVvFDaSWFim4oFUroIio7IS9igsiSpG9KIss9/vHOTkkEJIQkgxnzu9zXVznzDPLuROGH3OemXnG3B0REYl/5YIuQERESoYCXUQkJBToIiIhoUAXEQkJBbqISEgo0EVEQkKBLiISEgp0EZGQUKCLiISEAl1EJCQqlOWH1axZ05OSksryI0VE4t7ChQs3uXutwpYr00BPSkpiwYIFZfmRIiJxz8y+LMpy6nIREQkJBbqISEgo0EVEQqJM+9BFEsXevXtZt24du3fvDroUiSOVK1emfv36VKxYsVjrFynQzawq8CyQDDjQF/gYeBFIAtYAl7v71mJVIRIy69at45RTTiEpKQkzC7ociQPuzubNm1m3bh0NGzYs1jaK2uXyKPCWu58DpAGrgKHADHc/C5gRnRYRYPfu3dSoUUNhLkVmZtSoUeOYvtUVGuhmVgVoAzwH4O4/uPs24BJgfHSx8UC3YlchEkIKczlax7rPFOUI/UxgIzDOzBab2bNmdhJwmruvB4i+1j6mSkSkxJkZQ4YMiU0/9NBDjBgxolQ/MykpiU2bNh31ejNnzuTDDz8ssTpeeeUVVq5cWWLbiwdF6UOvADQDbnH3uWb2KEfRvWJm/YB+AGeccUaxiixrSUP/GXQJRbKmcu+gSyjciO1BV5DQKlWqxEsvvcSdd95JzZo1gy6nQDNnzuTkk0+mVatWh83bt28fFSoc3TUcr7zyChdffDGNGzcu8jrF+ZzjSVGO0NcB69x9bnR6MpGA32BmdQGir9/mt7K7P+3uGe6eUatWoXeuikgJqlChAv369eORRx45bN6XX35Jhw4dSE1NpUOHDqxduxaAa6+9loEDB9KqVSvOPPNMJk+eHFtn5MiRnHfeeaSmpnLPPfcU+Nlr1qzh3HPP5de//jVNmjShY8eO7Nq1C4DHHnuMxo0bk5qaSs+ePVmzZg1jxozhkUceIT09nffff59rr72WwYMH065dO+644w5GjBjBQw89FNt+cnIya9asAeAvf/kLqamppKWlcfXVV/Phhx8ydepUbr/9dtLT0/nss8/Izs6mZcuWpKam8stf/pKtWyPXcFxwwQX89re/pW3btjz66KPH9PsOWqGB7u7/Ab4ys59EmzoAK4GpQJ9oWx/g1VKpUESOSf/+/ZkwYQLbt+f9tjRgwACuueYali5dypVXXsnAgQNj89avX8/s2bN5/fXXGTo08oX87bffZvXq1cybN4/s7GwWLlzIrFmzCvzs1atX079/f1asWEHVqlWZMmUKAPfffz+LFy9m6dKljBkzhqSkJG688UYGDRpEdnY2P/vZzwD45JNPmD59Og8//PARP2PFihX84Q9/4J133mHJkiU8+uijtGrViq5duzJy5Eiys7Np1KgR11xzDQ888ABLly4lJSWFe++9N7aNbdu28d577+XpnopHRb3K5RZggpktBdKB/wPuBy40s9XAhdFpETnOVKlShWuuuYbHHnssT/tHH31E796Rbrurr76a2bNnx+Z169aNcuXK0bhxYzZs2ABEAv3tt9+madOmNGvWjH//+9+sXr26wM9u2LAh6enpADRv3jx2RJ2amsqVV17JX//61wK7OHr06EH58uUL/Ix33nmH7t27x7qUqlevftgy27dvZ9u2bbRt2xaAPn365PnP6IorrijwM+JFkTqL3D0byMhnVoeSLUdESsNtt91Gs2bNuO666464TO4rLCpVqhR77+6x1zvvvJMbbrihyJ+bezvly5ePdbn885//ZNasWUydOpX77ruPFStW5Lv+SSedFHtfoUIFDhw4EJvOubzP3Y/56pDcnxPPdOu/SAKoXr06l19+Oc8991ysrVWrVkycOBGACRMm0Lp16wK30alTJ8aOHct3330HwNdff82330ZOnXXo0IGvv/66SLUcOHCAr776inbt2vHggw+ybds2vvvuO0455RR27NhxxPWSkpJYtGgRAIsWLeKLL76IffakSZPYvHkzAFu2bAHIs71TTz2VatWq8f777wPwwgsvxI7Ww0SBLpIghgwZkudywscee4xx48aRmprKCy+8UOgJwY4dO9K7d28yMzNJSUmhe/fu7NixgwMHDvDpp5/m29WRn/3793PVVVeRkpJC06ZNGTRoEFWr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\n",
"text/plain": [
"