{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Protodash: NHANES (CDC) data example\n",
"- This notebook shows an example of how to use the ProtodashExplainer defined in [AIX360](https://github.com/IBM/AIX360/) to generate prototypes from (training/test) data. The notebook uses one of the [NHANES CDC questionnaire dataset](https://wwwn.cdc.gov/nchs/nhanes/search/datapage.aspx?Component=Questionnaire&CycleBeginYear=2013) related to incomes of individuals.\n",
"- ProtodashExplainer is an implementation of the [Protodash algorithm](https://arxiv.org/abs/1707.01212)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Protodash Explainer examples"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Import statements"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.preprocessing import OneHotEncoder\n",
"\n",
"from aix360.algorithms.protodash import ProtodashExplainer, get_Gaussian_Data\n",
"from aix360.datasets import CDCDataset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Load NHANES dataset from CDC "
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"nhanes = CDCDataset()\n",
"nhanes_files = nhanes.get_csv_file_names()\n",
"(nhanesinfo, _, _) = nhanes._cdc_files_info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"#### Explore NHANES Income questionnaire dataset\n",
"\n",
"Now let us explore the income questionnaire dataset and find out the types of responses received in the survey. Each column in this dataset corresponds to a question and each row denotes the answers given by a respondent to those questions. Both column names and answers by respondents are encoded. For example, 'SEQN' denotes the sequence number assigned to a respondent and 'IND235' corresponds to a question about monthly family income. As seen below, in most cases a value of 1 implies \"Yes\" to the question, while a value of 2 implies \"No\". More details about the income questionaire and how questions and answers are encoded can be seen [here](https://wwwn.cdc.gov/Nchs/Nhanes/2013-2014/INQ_H.htm)\n",
"\n",
"|Column |Description | Values and Meaning|\n",
"|-------|----------------------------|---------|\n",
"|SEQN | Respondent sequence number |\n",
"|INQ020 | Income from wages/salaries |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|INQ012 | Income from self employment|1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|INQ030 | Income from Social Security or RR |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|INQ060 | Income from other disability pension |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|INQ080 | Income from retirement/survivor pension |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|INQ090 | Income from Supplemental Security Income |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|INQ132 | Income from state/county cash assistance |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|INQ140 | Income from interest/dividends or rental |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|INQ150 | Income from other sources |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|IND235 | Monthly family income |1-12->Increasing income brackets, 77->Refused, 99->Don't know|\n",
"|INDFMMPI | Family monthly poverty level index |0-5->Higher value more affluent|\n",
"|INDFMMPC | Family monthly poverty level category |1-3->Increasing INDFMMPI brackets, 7->Refused, 9->Don't know|\n",
"|INQ244 | Family has savings more than $5000 |1->Yes, 2->No, 7->Refused, 9->Don't know|\n",
"|IND247 | Total savings/cash assets for the family |1-6->Increasing savings brackets, 77->Refused, 99->Don't know|"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Answers given by some respondents to the income questionnaire:\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Respondent sequence number
\n",
"
Income from wages/salaries
\n",
"
Income from self employment
\n",
"
Income from Social Security or RR
\n",
"
Income from other disability pension
\n",
"
Income from retirement/survivor pension
\n",
"
Income from Supplemental Security Income
\n",
"
Income from state/county cash assistance
\n",
"
Income from interest/dividends or rental
\n",
"
Income from other sources
\n",
"
Monthly family income
\n",
"
Family monthly poverty level index
\n",
"
Family monthly poverty level category
\n",
"
Family has savings more than $5000
\n",
"
Total savings/cash assets for the family
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
73557.0
\n",
"
2.0
\n",
"
2.0
\n",
"
1.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
4.0
\n",
"
0.86
\n",
"
1.0
\n",
"
9.0
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
73558.0
\n",
"
1.0
\n",
"
1.0
\n",
"
1.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
1.0
\n",
"
2.0
\n",
"
5.0
\n",
"
0.92
\n",
"
1.0
\n",
"
1.0
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
73559.0
\n",
"
2.0
\n",
"
2.0
\n",
"
1.0
\n",
"
2.0
\n",
"
1.0
\n",
"
2.0
\n",
"
2.0
\n",
"
1.0
\n",
"
2.0
\n",
"
10.0
\n",
"
4.37
\n",
"
3.0
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
73560.0
\n",
"
1.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
1.0
\n",
"
9.0
\n",
"
2.52
\n",
"
3.0
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
73561.0
\n",
"
2.0
\n",
"
2.0
\n",
"
1.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
2.0
\n",
"
11.0
\n",
"
5.00
\n",
"
3.0
\n",
"
NaN
\n",
"
NaN
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Respondent sequence number Income from wages/salaries \\\n",
"0 73557.0 2.0 \n",
"1 73558.0 1.0 \n",
"2 73559.0 2.0 \n",
"3 73560.0 1.0 \n",
"4 73561.0 2.0 \n",
"\n",
" Income from self employment Income from Social Security or RR \\\n",
"0 2.0 1.0 \n",
"1 1.0 1.0 \n",
"2 2.0 1.0 \n",
"3 2.0 2.0 \n",
"4 2.0 1.0 \n",
"\n",
" Income from other disability pension \\\n",
"0 2.0 \n",
"1 2.0 \n",
"2 2.0 \n",
"3 2.0 \n",
"4 2.0 \n",
"\n",
" Income from retirement/survivor pension \\\n",
"0 2.0 \n",
"1 2.0 \n",
"2 1.0 \n",
"3 2.0 \n",
"4 2.0 \n",
"\n",
" Income from Supplemental Security Income \\\n",
"0 2.0 \n",
"1 2.0 \n",
"2 2.0 \n",
"3 2.0 \n",
"4 2.0 \n",
"\n",
" Income from state/county cash assistance \\\n",
"0 2.0 \n",
"1 2.0 \n",
"2 2.0 \n",
"3 2.0 \n",
"4 2.0 \n",
"\n",
" Income from interest/dividends or rental Income from other sources \\\n",
"0 2.0 2.0 \n",
"1 1.0 2.0 \n",
"2 1.0 2.0 \n",
"3 2.0 1.0 \n",
"4 2.0 2.0 \n",
"\n",
" Monthly family income Family monthly poverty level index \\\n",
"0 4.0 0.86 \n",
"1 5.0 0.92 \n",
"2 10.0 4.37 \n",
"3 9.0 2.52 \n",
"4 11.0 5.00 \n",
"\n",
" Family monthly poverty level category Family has savings more than $5000 \\\n",
"0 1.0 9.0 \n",
"1 1.0 1.0 \n",
"2 3.0 NaN \n",
"3 3.0 NaN \n",
"4 3.0 NaN \n",
"\n",
" Total savings/cash assets for the family \n",
"0 NaN \n",
"1 NaN \n",
"2 NaN \n",
"3 NaN \n",
"4 NaN "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# replace encoded column names by the associated question text. \n",
"df_inc = nhanes.get_csv_file('INQ_H.csv')\n",
"df_inc.columns[0]\n",
"dict_inc = {\n",
"'SEQN': 'Respondent sequence number', \n",
"'INQ020': 'Income from wages/salaries',\n",
"'INQ012': 'Income from self employment',\n",
"'INQ030':'Income from Social Security or RR',\n",
"'INQ060': 'Income from other disability pension', \n",
"'INQ080': 'Income from retirement/survivor pension',\n",
"'INQ090': 'Income from Supplemental Security Income',\n",
"'INQ132': 'Income from state/county cash assistance', \n",
"'INQ140': 'Income from interest/dividends or rental', \n",
"'INQ150': 'Income from other sources',\n",
"'IND235': 'Monthly family income',\n",
"'INDFMMPI': 'Family monthly poverty level index', \n",
"'INDFMMPC': 'Family monthly poverty level category',\n",
"'INQ244': 'Family has savings more than $5000',\n",
"'IND247': 'Total savings/cash assets for the family'\n",
"}\n",
"qlist = []\n",
"for i in range(len(df_inc.columns)):\n",
" qlist.append(dict_inc[df_inc.columns[i]])\n",
"df_inc.columns = qlist\n",
"print(\"Answers given by some respondents to the income questionnaire:\")\n",
"df_inc.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Number of respondents to Income questionnaire: 10175\n",
"Distribution of answers to 'monthly family income' and 'Family savings' questions:\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"