diff --git a/P4/.ipynb_checkpoints/Jupyter_Notebook_Setup_P4-checkpoint.ipynb b/P4/.ipynb_checkpoints/Jupyter_Notebook_Setup_P4-checkpoint.ipynb index 7b3b6ff4..2eca3323 100644 --- a/P4/.ipynb_checkpoints/Jupyter_Notebook_Setup_P4-checkpoint.ipynb +++ b/P4/.ipynb_checkpoints/Jupyter_Notebook_Setup_P4-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 256, + "execution_count": 147, "id": "28c7a0ed", "metadata": {}, "outputs": [], @@ -21,12 +21,12 @@ "warnings.filterwarnings(action='ignore', category=UserWarning)\n", "warnings.filterwarnings(action='ignore', category=DataConversionWarning)\n", "# Loading the test dataset\n", - "test_data = pd.read_csv('/Users/zainab/student_data.csv')\n" + "test_data = pd.read_csv('student_data.csv')\n" ] }, { "cell_type": "code", - "execution_count": 221, + "execution_count": 148, "id": "e911c179", "metadata": { "scrolled": true @@ -152,7 +152,7 @@ "4 0 " ] }, - "execution_count": 221, + "execution_count": 148, "metadata": {}, "output_type": "execute_result" } @@ -163,8 +163,8 @@ }, { "cell_type": "code", - "execution_count": 222, - "id": "a5d76762", + "execution_count": 149, + "id": "94b15a3d", "metadata": {}, "outputs": [ { @@ -295,7 +295,7 @@ "max 4.000000 1.000000 " ] }, - "execution_count": 222, + "execution_count": 149, "metadata": {}, "output_type": "execute_result" } @@ -306,8 +306,8 @@ }, { "cell_type": "code", - "execution_count": 223, - "id": "9aa9b85b", + "execution_count": 150, + "id": "d1c29453", "metadata": {}, "outputs": [], "source": [ @@ -317,8 +317,8 @@ }, { "cell_type": "code", - "execution_count": 224, - "id": "4791c7a2", + "execution_count": 151, + "id": "79228d8e", "metadata": {}, "outputs": [], "source": [ @@ -328,8 +328,8 @@ }, { "cell_type": "code", - "execution_count": 225, - "id": "3a64f2c7", + "execution_count": 38, + "id": "412b261b", "metadata": {}, "outputs": [ { @@ -356,8 +356,28 @@ }, { "cell_type": "code", - "execution_count": 226, - "id": "127ba006", + "execution_count": 45, + "id": "4f022baf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Index(['Age', 'Major', 'GPA', 'Extra Curricular', 'Num Programming Languages',\n", + " 'Num Past Internships', 'Good Candidate'],\n", + " dtype='object')\n" + ] + } + ], + "source": [ + "print(test_data.columns)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ba1c9cb2", "metadata": {}, "outputs": [ { @@ -384,8 +404,51 @@ }, { "cell_type": "code", - "execution_count": 227, - "id": "1863ba26", + "execution_count": 152, + "id": "d27a24a9", + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Could not interpret input 'Gender'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [152]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m#Plotting the distribution of the test dataset (Gender)\u001b[39;00m\n\u001b[1;32m 2\u001b[0m plt\u001b[38;5;241m.\u001b[39mtitle(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mGender\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m----> 3\u001b[0m \u001b[43msns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcountplot\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mGender\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtest_data\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4\u001b[0m plt\u001b[38;5;241m.\u001b[39mylabel(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mDistribution\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 5\u001b[0m plt\u001b[38;5;241m.\u001b[39mxticks(rotation\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m90\u001b[39m) \n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/seaborn/_decorators.py:46\u001b[0m, in \u001b[0;36m_deprecate_positional_args..inner_f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 36\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 37\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPass the following variable\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m as \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124mkeyword arg\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 38\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFrom version 0.12, the only valid positional argument \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 43\u001b[0m \u001b[38;5;167;01mFutureWarning\u001b[39;00m\n\u001b[1;32m 44\u001b[0m )\n\u001b[1;32m 45\u001b[0m kwargs\u001b[38;5;241m.\u001b[39mupdate({k: arg \u001b[38;5;28;01mfor\u001b[39;00m k, arg \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(sig\u001b[38;5;241m.\u001b[39mparameters, args)})\n\u001b[0;32m---> 46\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/seaborn/categorical.py:3598\u001b[0m, in \u001b[0;36mcountplot\u001b[0;34m(x, y, hue, data, order, hue_order, orient, color, palette, saturation, dodge, ax, **kwargs)\u001b[0m\n\u001b[1;32m 3595\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m x \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m y \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 3596\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCannot pass values for both `x` and `y`\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 3598\u001b[0m plotter \u001b[38;5;241m=\u001b[39m \u001b[43m_CountPlotter\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 3599\u001b[0m \u001b[43m \u001b[49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhue_order\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3600\u001b[0m \u001b[43m \u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mci\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mn_boot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munits\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mseed\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3601\u001b[0m \u001b[43m \u001b[49m\u001b[43morient\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcolor\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpalette\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msaturation\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 3602\u001b[0m \u001b[43m \u001b[49m\u001b[43merrcolor\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43merrwidth\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcapsize\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdodge\u001b[49m\n\u001b[1;32m 3603\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3605\u001b[0m plotter\u001b[38;5;241m.\u001b[39mvalue_label \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcount\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 3607\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ax \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/seaborn/categorical.py:1584\u001b[0m, in \u001b[0;36m_BarPlotter.__init__\u001b[0;34m(self, x, y, hue, data, order, hue_order, estimator, ci, n_boot, units, seed, orient, color, palette, saturation, errcolor, errwidth, capsize, dodge)\u001b[0m\n\u001b[1;32m 1579\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, x, y, hue, data, order, hue_order,\n\u001b[1;32m 1580\u001b[0m estimator, ci, n_boot, units, seed,\n\u001b[1;32m 1581\u001b[0m orient, color, palette, saturation, errcolor,\n\u001b[1;32m 1582\u001b[0m errwidth, capsize, dodge):\n\u001b[1;32m 1583\u001b[0m \u001b[38;5;124;03m\"\"\"Initialize the plotter.\"\"\"\u001b[39;00m\n\u001b[0;32m-> 1584\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mestablish_variables\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morient\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1585\u001b[0m \u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mhue_order\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munits\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1586\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mestablish_colors(color, palette, saturation)\n\u001b[1;32m 1587\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mestimate_statistic(estimator, ci, n_boot, seed)\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/seaborn/categorical.py:153\u001b[0m, in \u001b[0;36m_CategoricalPlotter.establish_variables\u001b[0;34m(self, x, y, hue, data, orient, order, hue_order, units)\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(var, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 152\u001b[0m err \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCould not interpret input \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mformat(var)\n\u001b[0;32m--> 153\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(err)\n\u001b[1;32m 155\u001b[0m \u001b[38;5;66;03m# Figure out the plotting orientation\u001b[39;00m\n\u001b[1;32m 156\u001b[0m orient \u001b[38;5;241m=\u001b[39m infer_orient(\n\u001b[1;32m 157\u001b[0m x, y, orient, require_numeric\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrequire_numeric\n\u001b[1;32m 158\u001b[0m )\n", + "\u001b[0;31mValueError\u001b[0m: Could not interpret input 'Gender'" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "#Plotting the distribution of the test dataset (Gender)\n", + "plt.title('Gender')\n", + "sns.countplot(x='Gender', data=test_data)\n", + "plt.ylabel('Distribution')\n", + "plt.xticks(rotation=90) \n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "57624579", "metadata": {}, "outputs": [ { @@ -412,8 +475,8 @@ }, { "cell_type": "code", - "execution_count": 228, - "id": "214dd318", + "execution_count": 15, + "id": "ccf66e8b", "metadata": {}, "outputs": [ { @@ -442,8 +505,8 @@ }, { "cell_type": "code", - "execution_count": 229, - "id": "d3a74385", + "execution_count": 16, + "id": "83b82ec6", "metadata": {}, "outputs": [ { @@ -471,8 +534,8 @@ }, { "cell_type": "code", - "execution_count": 230, - "id": "92d36835", + "execution_count": 17, + "id": "4c65532f", "metadata": {}, "outputs": [ { @@ -500,13 +563,13 @@ }, { "cell_type": "code", - "execution_count": 231, - "id": "8ff8d8a5", + "execution_count": 141, + "id": "85a840d1", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -520,17 +583,16 @@ "source": [ "#Plotting the distribution of the test dataset (Number of Programming Languages)\n", "plt.title('Number of Programming Languages')\n", - "sns.countplot(x='Num Programming Languages', data=test_data )\n", + "sns.countplot(x='Num Programming Languages', data=test_data)\n", "plt.ylabel('Distribution')\n", "plt.xlabel('Number of Programming Languages')\n", - "plt.tight_layout()\n", - "plt.show()" + "plt.show()\n" ] }, { "cell_type": "code", - "execution_count": 257, - "id": "4b81b623", + "execution_count": 19, + "id": "0e8bc628", "metadata": {}, "outputs": [], "source": [ @@ -542,8 +604,8 @@ }, { "cell_type": "code", - "execution_count": 279, - "id": "e22cb1c5", + "execution_count": 51, + "id": "a7037861", "metadata": {}, "outputs": [ { @@ -553,29 +615,23 @@ "The accuracy score for this model is: 0.832\n", "Confusion matrix\n", "[[221 42]\n", - " [ 42 195]]\n" + " [ 42 195]]\n", + "Confusion matrix in percentages\n", + "[[33.33333333 16.66666667]\n", + " [16.66666667 33.33333333]]\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "
" + "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Confusion matrix in percentages\n", - "[[33.33333333 16.66666667]\n", - " [16.66666667 33.33333333]]\n" - ] } ], "source": [ @@ -588,35 +644,18 @@ "accuracy = accuracy_score(Y_true, prediction)\n", "print(\"The accuracy score for this model is\" + \":\", accuracy)\n", "\n", - "conf_matrix= confusion_matrix(Y_true, prediction)\n", - "print('Confusion matrix')\n", - "print(conf_matrix)\n", "\n", - "classes = [\"1\", \"2\"] # Modify this based on your actual class labels\n", "\n", - "# Calculate the confusion matrix\n", - "confusion_matrix = confusion_matrix(y_test, prediction) # Assuming 'y_test' and 'prediction' are the actual and predicted labels\n", "\n", - "# Plot the confusion matrix\n", - "plt.figure(figsize=(8, 6))\n", - "plt.imshow(confusion_matrix, interpolation='nearest', cmap=plt.get_cmap('Blues'))\n", - "plt.title('Confusion Matrix')\n", - "plt.colorbar()\n", "\n", - "# Add labels and ticks\n", - "tick_marks = np.arange(len(classes))\n", - "plt.xticks(tick_marks, classes, rotation=90)\n", - "plt.yticks(tick_marks, classes)\n", + "conf_matrix= confusion_matrix(Y_true, prediction)\n", + "print('Confusion matrix')\n", + "print(conf_matrix)\n", "\n", - "# Display the values on the plot\n", - "thresh = confusion_matrix.max() / 2.\n", - "for i, j in itertools.product(range(confusion_matrix.shape[0]), range(confusion_matrix.shape[1])):\n", - " plt.text(j, i, format(confusion_matrix[i, j], 'd'), horizontalalignment=\"center\", color=\"white\" if confusion_matrix[i, j] > thresh else \"black\")\n", + "classes = [\"1\", \"2\"] \n", "\n", - "plt.tight_layout()\n", - "plt.ylabel('True label')\n", - "plt.xlabel('Predicted label')\n", - "plt.show()\n", + "# Computing the confusion matrix (Regular numbers)\n", + "confusion_matrix = confusion_matrix(Y_true, prediction) \n", "\n", "\n", "# Compute the confusion matrix percentage\n", @@ -627,36 +666,858 @@ "Y_true = np.array([0, 1, 1, 0, 1, 0])\n", "predictions = np.array([0, 1, 0, 0, 1, 1])\n", "conf_matrix = confusion_matrix(Y_true, predictions)\n", - "conf_matrix_percent = (conf_matrix / conf_matrix.sum()) * 100\n", + "conf_matrix_percentage = (conf_matrix / conf_matrix.sum()) * 100\n", "\n", "\n", "print(\"Confusion matrix in percentages\")\n", - "print(conf_matrix_percent)\n", + "print(conf_matrix_percentage)\n", + "\n", + "plt.figure(figsize=(6, 4))\n", + "sns.heatmap(conf_matrix_percentage, annot=True, fmt=\"0.2f\", cmap=\"Blues\", cbar=False, square=True)\n", + "plt.xlabel(\"Predicted\")\n", + "plt.ylabel(\"True\")\n", + "plt.title(\"Confusion Matrix in Percentages\")\n", + "plt.show()\n", + "\n", + "\n", " " ] }, { "cell_type": "code", - "execution_count": 234, - "id": "9afef01c", + "execution_count": 56, + "id": "8f9869f6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The accuracy score for this model is: 0.832\n", + "Confusion matrix\n", + "[[221 42]\n", + " [ 42 195]]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "#Performance Evaluation Section\n", + "\n", + "from sklearn.metrics import accuracy_score, confusion_matrix\n", + "Y_true= test_data['Good Candidate']\n", + "accuracy = accuracy_score(Y_true, prediction)\n", + "print(\"The accuracy score for this model is\" + \":\", accuracy)\n", + "\n", + "conf_matrix= confusion_matrix(Y_true, prediction)\n", + "print('Confusion matrix')\n", + "print(conf_matrix)\n", + "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')\n", + "plt.xlabel('Predicted')\n", + "plt.ylabel('True')\n", + "plt.title('Confusion Matrix')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "id": "091bbc00", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "done with Performance Evaluation Section\n" + ] + } + ], + "source": [ + "print (\"done with Performance Evaluation Section\")" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "id": "59a603ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Starting fairness evaluation seciton\n" + ] + } + ], + "source": [ + "print (\"Starting fairness evaluation seciton\")" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "684fd7a0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.84 0.84 0.84 263\n", + " 1 0.82 0.82 0.82 237\n", + "\n", + " accuracy 0.83 500\n", + " macro avg 0.83 0.83 0.83 500\n", + "weighted avg 0.83 0.83 0.83 500\n", + "\n" + ] + } + ], + "source": [ + "# Classification Report\n", + "from sklearn.metrics import classification_report\n", + "report = classification_report(Y_true, prediction)\n", + "print(report)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "283e22ea", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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M2bo2LFjVVV19+7dOmDAAO3QoYN2795dd+zYoaqOg9OIESM0MjJSIyMj9eeff1ZV1ffff187d+6sUVFReuedd2b9ABo2bKixsbH697//XadPn561rqeeekqnTJmiqqqvvPKKdurUSdu2batPPvmkqqpGR0dry5YtdezYsdquXTvdu3dv1rxnzpzRqlWr6unT5yfP7t276/fff6/R0dHaokULvemmm7Rt27Z69dVX65kzZ1RVdf369dqzZ0/t0KGD9u/fXw8dOqSqjgPfo48+qj179tQpU6boggULtEuXLtquXTvt27evHjlyRKOjo7VWrVpat25djYqK0pUrV553YOvVq5f+/e9/186dO2uzZs105cqVWfFec8012rZtWx01apR26dIlx0E2r21y/Zwee+wxjYyM1K5du+qRI0dUVXONM3P/3nHHHdqvXz+97rrrNDo6Wrt3767t27fX9u3bZ31uqqqTJk3SNm3aaGRkpE6YMEE/++wzrVChgjZv3lyjoqI0KSnJ7f3muj+mTp2ql1xyibZt21avvfbaAvffrl27tG/fvhoZGant27fX3bt359gP7777rrZt21YjIyP1hhtuUFXVm2++WT/77LPz9pWq6o8//qi9e/fW6667Ti+55JJCfwezu+666/THH3/MGr7qqqu0Q4cO2qpVK/3Xv/513vr/8Y9/aJcuXXTVqlV5/jbuvvtu7dixo7Zq1SrPdRbGRx99pHfeeWfW8J133qkfffRRjunuvPNOffnll1VVdfXq1dqtW7cc0xw/flwbNGiQlQjS09M1IiIi12RviSAfX365S2Gydu36gaqqxifH6z3f3KPvbnw3axrXHejtRJCWlqYjR47UxYsXq6rqFVdcoTt37lRV1bVr12qfPn1UVXXUqFH6+uuvZ81z6tQp3b59uw4dOlRTUlJUVXXs2LH67ruO7cxMBL/++qv27Nkza72XXHKJ7tu3T7/99lu94447ss76hwwZoitWrNDo6GgVEV2zZk2OmDdt2qTt2rXL8f5DDz2kU6dO1ejoaAX0p59+UlXVMWPG6OTJkzUlJUW7deumx44dU1XVefPm6ZgxY1TVcUDLTIKqqnFxcVlXF2+//bY+/PDDqprzjDZ7IsicbuHChdq3b19VVZ08eXLWD3TLli3q7++fIxHktU2ZAF2wYIGqqo4fP16fe+65AuPs0KGD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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import roc_curve, auc, precision_recall_curve\n", + "#Receiver Operating Characteristic curve plotting \n", + "fpr, tpr, _ = roc_curve(Y_true, prediction)\n", + "roc_auc = auc(fpr, tpr)\n", + "\n", + "plt.figure()\n", + "plt.plot(fpr, tpr, color='darkblue', lw=2, label=f'Receiver Operating Characteristic curve (area = {roc_auc:.2f})')\n", + "plt.plot([0, 1], [0, 1], color='green', lw=2, linestyle='--')\n", + "plt.xlabel('False Positive')\n", + "plt.ylabel('True Positive')\n", + "plt.title('Receiver Operating Characteristic')\n", + "plt.legend(loc=\"lower right\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "6d44244d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Precision-Recall Curve\n", + "precision, recall, _ = precision_recall_curve(Y_true, prediction)\n", + "\n", + "plt.figure()\n", + "plt.plot(recall, precision, color='darkblue', lw=2, label='Precision Recall curve')\n", + "plt.xlabel('Recall')\n", + "plt.ylabel('Precision')\n", + "plt.title('Precision-Recall Curve')\n", + "plt.legend(loc=\"lower left\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8270b981", + "metadata": {}, + "outputs": [], + "source": [ + "#Fairness Evaluation Section\n" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "cf13e617", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'Gender'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/indexes/base.py:3621\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3620\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m-> 3621\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcasted_key\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3622\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/_libs/index.pyx:136\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/_libs/index.pyx:163\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:5198\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", + "File \u001b[0;32mpandas/_libs/hashtable_class_helper.pxi:5206\u001b[0m, in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 'Gender'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [76]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m evaluation_using_gender[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPrediction\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m prediction\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# Ensure 'Gender' column is present in the DataFrame\u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m evaluation_using_gender[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mGender\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m \u001b[43mtest_data\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mGender\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# Calculate true positive by 'Gender'\u001b[39;00m\n\u001b[1;32m 13\u001b[0m tpr_gender \u001b[38;5;241m=\u001b[39m evaluation_using_gender[evaluation_using_gender[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mGood Candidate\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m]\u001b[38;5;241m.\u001b[39mgroupby(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mGender\u001b[39m\u001b[38;5;124m'\u001b[39m)[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPrediction\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmean()\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/frame.py:3505\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3503\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcolumns\u001b[38;5;241m.\u001b[39mnlevels \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 3504\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_multilevel(key)\n\u001b[0;32m-> 3505\u001b[0m indexer \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcolumns\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_loc\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3506\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m is_integer(indexer):\n\u001b[1;32m 3507\u001b[0m indexer \u001b[38;5;241m=\u001b[39m [indexer]\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/indexes/base.py:3623\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 3621\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine\u001b[38;5;241m.\u001b[39mget_loc(casted_key)\n\u001b[1;32m 3622\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m-> 3623\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 3624\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 3625\u001b[0m \u001b[38;5;66;03m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[1;32m 3626\u001b[0m \u001b[38;5;66;03m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[1;32m 3627\u001b[0m \u001b[38;5;66;03m# the TypeError.\u001b[39;00m\n\u001b[1;32m 3628\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_indexing_error(key)\n", + "\u001b[0;31mKeyError\u001b[0m: 'Gender'" + ] + } + ], + "source": [ + "# True positives for gender\n", + "x_test = test_data.drop(columns=['Good Candidate'], axis=1)\n", + "\n", + "prediction = model.predict(x_test)\n", + "\n", + "evaluation_using_gender = test_data.copy()\n", + "evaluation_using_gender['Prediction'] = prediction\n", + "\n", + "# Ensure 'Gender' column is present in the DataFrame\n", + "evaluation_using_gender['Gender'] = test_data['Gender']\n", + "\n", + "# Calculate true positive by 'Gender'\n", + "tpr_gender = evaluation_using_gender[evaluation_using_gender['Good Candidate'] == 1].groupby('Gender')['Prediction'].mean()\n", + "\n", + "print(\"TP classification by Gender:\")\n", + "print(tpr_gender)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "c244b83c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TP classification by Major:\n", + "Major\n", + "Business 0.875000\n", + "Computer Science 0.837838\n", + "Electrical and Computer Engineering 0.775000\n", + "Information Systems 0.756098\n", + "Math 0.844444\n", + "Statistics and Machine Learning 0.852941\n", + "Name: Prediction, dtype: float64\n" + ] + } + ], + "source": [ + "# True positives for majors\n", + "x_test = test_data.drop(columns=['Good Candidate'], axis=1)\n", + "prediction = model.predict(x_test)\n", + "\n", + "# Add the 'Prediction' column to evaluation_using_major\n", + "evaluation_using_major['Prediction'] = prediction\n", + "\n", + "# Filterring rows where 'Good Candidate' is 1 \n", + "tpr_major = evaluation_using_major[evaluation_using_major['Good Candidate'] == 1].groupby('Major')['Prediction'].mean()\n", + "\n", + "print(\"TP classification by Major:\")\n", + "print(tpr_major)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "63372c1b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TP classification by Age\n", + "Age\n", + "18 0.818182\n", + "19 0.869565\n", + "20 0.720000\n", + "21 0.892857\n", + "22 0.891304\n", + "23 0.875000\n", + "24 0.666667\n", + "25 0.250000\n", + "Name: Prediction, dtype: float64\n" + ] + } + ], + "source": [ + "# True positives for AGE\n", + "\n", + "evaluation_using_age = test_data.copy()\n", + "\n", + "x_test = test_data.drop(columns=['Good Candidate'], axis=1)\n", + "prediction = model.predict(x_test) \n", + "\n", + "# Add the 'Prediction' column to evaluation_using_age\n", + "evaluation_using_age['Prediction'] = prediction\n", + "\n", + "# Filter rows where 'Good Candidate' is 1 \n", + "tpr_age = evaluation_using_age[evaluation_using_age['Good Candidate'] == 1].groupby('Age')['Prediction'].mean()\n", + "\n", + "print(\"TP classification by Age\")\n", + "print(tpr_age)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "ce84922a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Precision by Major:\n", + "Major\n", + "Business 0.897436\n", + "Computer Science 0.775000\n", + "Electrical and Computer Engineering 0.861111\n", + "Information Systems 0.794872\n", + "Math 0.844444\n", + "Statistics and Machine Learning 0.763158\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "from sklearn.metrics import precision_score\n", + "\n", + "x_test = test_data.drop(columns=['Good Candidate'], axis=1)\n", + "prediction = model.predict(x_test) \n", + "\n", + "# Add the 'Prediction' column to evaluation_using_major\n", + "evaluation_using_major['Prediction'] = prediction\n", + "\n", + "# Calculate precision by 'Major'\n", + "precision_major = evaluation_using_major.groupby('Major').apply(\n", + " lambda x: precision_score(x['Good Candidate'], x['Prediction'], zero_division=0)\n", + ")\n", + "\n", + "print(\"Precision by Major:\")\n", + "print(precision_major)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "a2cb18bb", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'Gender'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [81]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m evaluation_using_major[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPrediction\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m prediction\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# Calculate precision by 'Major'\u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m precision_major \u001b[38;5;241m=\u001b[39m \u001b[43mevaluation_using_major\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroupby\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mGender\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mapply(\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28;01mlambda\u001b[39;00m x: precision_score(x[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mGood Candidate\u001b[39m\u001b[38;5;124m'\u001b[39m], x[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPrediction\u001b[39m\u001b[38;5;124m'\u001b[39m], zero_division\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m 12\u001b[0m )\n\u001b[1;32m 14\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPrecision by Gender:\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28mprint\u001b[39m(precision_gender)\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/frame.py:7718\u001b[0m, in \u001b[0;36mDataFrame.groupby\u001b[0;34m(self, by, axis, level, as_index, sort, group_keys, squeeze, observed, dropna)\u001b[0m\n\u001b[1;32m 7713\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_axis_number(axis)\n\u001b[1;32m 7715\u001b[0m \u001b[38;5;66;03m# https://github.com/python/mypy/issues/7642\u001b[39;00m\n\u001b[1;32m 7716\u001b[0m \u001b[38;5;66;03m# error: Argument \"squeeze\" to \"DataFrameGroupBy\" has incompatible type\u001b[39;00m\n\u001b[1;32m 7717\u001b[0m \u001b[38;5;66;03m# \"Union[bool, NoDefault]\"; expected \"bool\"\u001b[39;00m\n\u001b[0;32m-> 7718\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mDataFrameGroupBy\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 7719\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7720\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mby\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7721\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7722\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7723\u001b[0m \u001b[43m \u001b[49m\u001b[43mas_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mas_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7724\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7725\u001b[0m \u001b[43m \u001b[49m\u001b[43mgroup_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7726\u001b[0m \u001b[43m \u001b[49m\u001b[43msqueeze\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msqueeze\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 7727\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7728\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7729\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/groupby/groupby.py:882\u001b[0m, in \u001b[0;36mGroupBy.__init__\u001b[0;34m(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, squeeze, observed, mutated, dropna)\u001b[0m\n\u001b[1;32m 879\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m grouper \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 880\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mgroupby\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mgrouper\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m get_grouper\n\u001b[0;32m--> 882\u001b[0m grouper, exclusions, obj \u001b[38;5;241m=\u001b[39m \u001b[43mget_grouper\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 883\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 884\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 885\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 886\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 887\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 888\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 889\u001b[0m \u001b[43m \u001b[49m\u001b[43mmutated\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmutated\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 890\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 891\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 893\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj \u001b[38;5;241m=\u001b[39m obj\n\u001b[1;32m 894\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis \u001b[38;5;241m=\u001b[39m obj\u001b[38;5;241m.\u001b[39m_get_axis_number(axis)\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/groupby/grouper.py:882\u001b[0m, in \u001b[0;36mget_grouper\u001b[0;34m(obj, key, axis, level, sort, observed, mutated, validate, dropna)\u001b[0m\n\u001b[1;32m 880\u001b[0m in_axis, level, gpr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m, gpr, \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 881\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 882\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(gpr)\n\u001b[1;32m 883\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(gpr, Grouper) \u001b[38;5;129;01mand\u001b[39;00m gpr\u001b[38;5;241m.\u001b[39mkey \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 884\u001b[0m \u001b[38;5;66;03m# Add key to exclusions\u001b[39;00m\n\u001b[1;32m 885\u001b[0m exclusions\u001b[38;5;241m.\u001b[39madd(gpr\u001b[38;5;241m.\u001b[39mkey)\n", + "\u001b[0;31mKeyError\u001b[0m: 'Gender'" + ] + } + ], + "source": [ + "\n", + "from sklearn.metrics import precision_score\n", + "\n", + "x_test = test_data.drop(columns=['Good Candidate'], axis=1)\n", + "prediction = model.predict(x_test) \n", + "\n", + "# Add the 'Prediction' column to evaluation_using_major\n", + "evaluation_using_major['Prediction'] = prediction\n", + "\n", + "# Calculate precision by 'Major'\n", + "precision_major = evaluation_using_major.groupby('Gender').apply(\n", + " lambda x: precision_score(x['Good Candidate'], x['Prediction'], zero_division=0)\n", + ")\n", + "\n", + "print(\"Precision by Gender:\")\n", + "print(precision_gender)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "221162a5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Precision for Age:\n", + "Age\n", + "18 0.900000\n", + "19 0.909091\n", + "20 0.782609\n", + "21 0.833333\n", + "22 0.732143\n", + "23 0.875000\n", + "24 1.000000\n", + "25 1.000000\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "from sklearn.metrics import precision_score\n", + "\n", + "x_test = test_data.drop(columns=['Good Candidate'], axis=1)\n", + "prediction = model.predict(x_test) \n", + "\n", + "# Add the 'Prediction' column to evaluation_using_age\n", + "evaluation_using_age['Prediction'] = prediction\n", + "\n", + "# Calculate precision by 'Age'\n", + "precision_age = evaluation_using_age.groupby('Age').apply(\n", + " lambda x: precision_score(x['Good Candidate'], x['Prediction'], zero_division=0)\n", + ")\n", + "\n", + "print(\"Precision for Age:\")\n", + "print(precision_age)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "c7292c69", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Precision for Major:\n", + "Major\n", + "Business 0.897436\n", + "Computer Science 0.775000\n", + "Electrical and Computer Engineering 0.861111\n", + "Information Systems 0.794872\n", + "Math 0.844444\n", + "Statistics and Machine Learning 0.763158\n", + "dtype: float64\n" + ] + } + ], + "source": [ + "from sklearn.metrics import precision_score\n", + "\n", + "x_test = test_data.drop(columns=['Good Candidate'], axis=1)\n", + "\n", + "prediction = model.predict(x_test) \n", + "\n", + "# Add the 'Prediction' column to evaluation_using_major\n", + "evaluation_using_age['Prediction'] = prediction\n", + "precision_major = evaluation_using_major.groupby('Major').apply(\n", + " lambda x: precision_score(x['Good Candidate'], x['Prediction'], zero_division=0)\n", + ")\n", + "\n", + "print(\"Precision for Major:\")\n", + "print(precision_major)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f18be1b", + "metadata": {}, + "outputs": [], + "source": [ + "#First Fairness evaluation tool: Group Unaware" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "fe7fafdb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The model is Group Aware for Age attribute.\n" + ] + } + ], + "source": [ + "is_age_used = 'Age' in x_test.columns\n", + "group_unaware_status_age = \"Group Unaware\" if not is_age_used else \"Group Aware\"\n", + "print(\"The model is \" + group_unaware_status_age + \" for Age attribute.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "e515a4f4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "done\n" + "The model is Group Aware for Major attribute.\n" + ] + } + ], + "source": [ + "is_major_used = 'Major' in x_test.columns\n", + "group_unaware_status_major = \"Group Unaware\" if not is_major_used else \"Group Aware\"\n", + "print(\"The model is \" + group_unaware_status_major + \" for Major attribute.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "791586bc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The model is Group Aware for Gender attribute.\n" + ] + } + ], + "source": [ + "is_gender_used = 'Gender' in x_test.columns\n", + "group_unaware_status = \"Group Unaware\" if not is_gender_used else \"Group Aware\"\n", + "print(\"The model is \" + group_unaware_status_major + \" for Gender attribute.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "id": "76e42835", + "metadata": {}, + "outputs": [], + "source": [ + "#2nd : Demographic Parity \n", + "\n", + "def demographic_parity(data, feature):\n", + "\n", + " selection_feature = data.groupby(feature)['Good Candidate'].mean()\n", + "\n", + " # Check demographic parity\n", + " demographic_parity = selection_feature / selection_feature.mean()\n", + "\n", + " print(f\"Demographic Parity for {feature}:\")\n", + " print(demographic_parity)" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "id": "97a221c5", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'Gender'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [136]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mdemographic_parity\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtest_data\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mGender\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", + "Input \u001b[0;32mIn [135]\u001b[0m, in \u001b[0;36mdemographic_parity\u001b[0;34m(data, feature)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdemographic_parity\u001b[39m(data, feature):\n\u001b[0;32m----> 5\u001b[0m selection_feature \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroupby\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfeature\u001b[49m\u001b[43m)\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mGood Candidate\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmean()\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m# Check demographic parity\u001b[39;00m\n\u001b[1;32m 8\u001b[0m demographic_parity \u001b[38;5;241m=\u001b[39m selection_feature \u001b[38;5;241m/\u001b[39m selection_feature\u001b[38;5;241m.\u001b[39mmean()\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/frame.py:7718\u001b[0m, in \u001b[0;36mDataFrame.groupby\u001b[0;34m(self, by, axis, level, as_index, sort, group_keys, squeeze, observed, dropna)\u001b[0m\n\u001b[1;32m 7713\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_axis_number(axis)\n\u001b[1;32m 7715\u001b[0m \u001b[38;5;66;03m# https://github.com/python/mypy/issues/7642\u001b[39;00m\n\u001b[1;32m 7716\u001b[0m \u001b[38;5;66;03m# error: Argument \"squeeze\" to \"DataFrameGroupBy\" has incompatible type\u001b[39;00m\n\u001b[1;32m 7717\u001b[0m \u001b[38;5;66;03m# \"Union[bool, NoDefault]\"; expected \"bool\"\u001b[39;00m\n\u001b[0;32m-> 7718\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mDataFrameGroupBy\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 7719\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7720\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mby\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7721\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7722\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7723\u001b[0m \u001b[43m \u001b[49m\u001b[43mas_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mas_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7724\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7725\u001b[0m \u001b[43m \u001b[49m\u001b[43mgroup_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7726\u001b[0m \u001b[43m \u001b[49m\u001b[43msqueeze\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msqueeze\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 7727\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7728\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7729\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/groupby/groupby.py:882\u001b[0m, in \u001b[0;36mGroupBy.__init__\u001b[0;34m(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, squeeze, observed, mutated, dropna)\u001b[0m\n\u001b[1;32m 879\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m grouper \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 880\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mgroupby\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mgrouper\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m get_grouper\n\u001b[0;32m--> 882\u001b[0m grouper, exclusions, obj \u001b[38;5;241m=\u001b[39m \u001b[43mget_grouper\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 883\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 884\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 885\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 886\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 887\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 888\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 889\u001b[0m \u001b[43m \u001b[49m\u001b[43mmutated\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmutated\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 890\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 891\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 893\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj \u001b[38;5;241m=\u001b[39m obj\n\u001b[1;32m 894\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis \u001b[38;5;241m=\u001b[39m obj\u001b[38;5;241m.\u001b[39m_get_axis_number(axis)\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/groupby/grouper.py:882\u001b[0m, in \u001b[0;36mget_grouper\u001b[0;34m(obj, key, axis, level, sort, observed, mutated, validate, dropna)\u001b[0m\n\u001b[1;32m 880\u001b[0m in_axis, level, gpr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m, gpr, \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 881\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 882\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(gpr)\n\u001b[1;32m 883\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(gpr, Grouper) \u001b[38;5;129;01mand\u001b[39;00m gpr\u001b[38;5;241m.\u001b[39mkey \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 884\u001b[0m \u001b[38;5;66;03m# Add key to exclusions\u001b[39;00m\n\u001b[1;32m 885\u001b[0m exclusions\u001b[38;5;241m.\u001b[39madd(gpr\u001b[38;5;241m.\u001b[39mkey)\n", + "\u001b[0;31mKeyError\u001b[0m: 'Gender'" + ] + } + ], + "source": [ + "demographic_parity(test_data, 'Gender')" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "id": "dd45687e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Demographic Parity for Age:\n", + "Age\n", + "18 0.770865\n", + "19 0.703334\n", + "20 0.757607\n", + "21 0.672755\n", + "22 0.781483\n", + "23 1.055301\n", + "24 1.576769\n", + "25 1.681887\n", + "Name: Good Candidate, dtype: float64\n" + ] + } + ], + "source": [ + "demographic_parity(test_data, 'Age')" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "5537c6e1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Demographic Parity for Major:\n", + "Major\n", + "Business 1.039182\n", + "Computer Science 0.865119\n", + "Electrical and Computer Engineering 1.002068\n", + "Information Systems 1.106129\n", + "Math 1.007398\n", + "Statistics and Machine Learning 0.980105\n", + "Name: Good Candidate, dtype: float64\n" + ] + } + ], + "source": [ + "demographic_parity(test_data, 'Major')" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "0ad9f500", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Good candidates for men (predicted): 0.6\n", + "Good candidates for women, predicted: 0.6\n" + ] + } + ], + "source": [ + "# #Demographic Parity\n", + "# import numpy as np\n", + "\n", + "# # Example: Define predicted and actual values for men\n", + "# predicted_men = [1, 0, 1, 1, 0]\n", + "# actual_men = [1, 1, 0, 1, 0]\n", + "\n", + "# # Function to calculate positive rate\n", + "# def calculate_positive_rate(predictions, actuals):\n", + "# numpy_predictions = np.array(predictions)\n", + "# positive_count = np.sum(numpy_predictions == 1)\n", + "# total_count = len(predictions)\n", + "# return positive_count / total_count\n", + "\n", + "# # Calculate and print positive rates for men\n", + "# prediction_men = calculate_positive_rate(predicted_men, actual_men)\n", + "# print(f\"Good candidates for men (predicted): {prediction_men}\")\n", + "\n", + "# # Example: Define predicted and actual values for women\n", + "# predicted_women = [0, 1, 0, 1, 1]\n", + "# actual_women = [1, 0, 1, 0, 1]\n", + "\n", + "# # Calculate and print positive rates for women\n", + "# prediction_women = calculate_positive_rate(predicted_women, actual_women)\n", + "# print(f\"Good candidates for women, predicted: {prediction_women}\")\n", + "# x\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6007c896", + "metadata": {}, + "outputs": [], + "source": [ + "#equality odds" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "67ca6bd5", + "metadata": {}, + "outputs": [], + "source": [ + "def equality_odds(data, target_variable, sensitive_feature, predicted_prob_column):\n", + "\n", + " data['Prediction'] = prediction\n", + "\n", + " # Calculate true positive rates\n", + " tpr_by_group = data[data[target_variable] == 1].groupby(sensitive_feature)['Prediction'].mean()\n", + "\n", + " # Print true positive rates\n", + " print(f\"\\nTrue Positive Rates by {sensitive_feature}:\")\n", + " print(tpr_by_group)\n", + "\n", + " # Calculate false positive rates\n", + " fpr_by_group = data[data[target_variable] == 0].groupby(sensitive_feature)['Prediction'].mean()\n", + "\n", + " # Print false positive rates\n", + " print(f\"\\nFalse Positive Rates by {sensitive_feature}:\")\n", + " print(fpr_by_group)" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "id": "342a5098", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "True Positive Rates by Age:\n", + "Age\n", + "18 0.818182\n", + "19 0.869565\n", + "20 0.720000\n", + "21 0.892857\n", + "22 0.891304\n", + "23 0.875000\n", + "24 0.666667\n", + "25 0.250000\n", + "Name: Prediction, dtype: float64\n", + "\n", + "False Positive Rates by Age:\n", + "Age\n", + "18 0.076923\n", + "19 0.062500\n", + "20 0.163934\n", + "21 0.119048\n", + "22 0.283019\n", + "23 0.210526\n", + "24 0.000000\n", + "Name: Prediction, dtype: float64\n" + ] + } + ], + "source": [ + "equality_odds(test_data, 'Good Candidate', 'Age', 'Prediction')" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "id": "9f0a7b95", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "True Positive Rates by Major:\n", + "Major\n", + "Business 0.875000\n", + "Computer Science 0.837838\n", + "Electrical and Computer Engineering 0.775000\n", + "Information Systems 0.756098\n", + "Math 0.844444\n", + "Statistics and Machine Learning 0.852941\n", + "Name: Prediction, dtype: float64\n", + "\n", + "False Positive Rates by Major:\n", + "Major\n", + "Business 0.097561\n", + "Computer Science 0.169811\n", + "Electrical and Computer Engineering 0.113636\n", + "Information Systems 0.216216\n", + "Math 0.142857\n", + "Statistics and Machine Learning 0.230769\n", + "Name: Prediction, dtype: float64\n" + ] + } + ], + "source": [ + "equality_odds(test_data, 'Good Candidate', 'Major', 'Prediction')" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "id": "a2d5335d", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'Gender'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [127]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mequality_odds\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtest_data\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mGood Candidate\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mGender\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mPrediction\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\n", + "Input \u001b[0;32mIn [124]\u001b[0m, in \u001b[0;36mequality_odds\u001b[0;34m(data, target_variable, sensitive_feature, predicted_prob_column)\u001b[0m\n\u001b[1;32m 3\u001b[0m data[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPrediction\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m prediction\n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# Calculate true positive rates\u001b[39;00m\n\u001b[0;32m----> 6\u001b[0m tpr_by_group \u001b[38;5;241m=\u001b[39m \u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[43mtarget_variable\u001b[49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroupby\u001b[49m\u001b[43m(\u001b[49m\u001b[43msensitive_feature\u001b[49m\u001b[43m)\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPrediction\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mmean()\n\u001b[1;32m 8\u001b[0m \u001b[38;5;66;03m# Print true positive rates\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;124mTrue Positive Rates by \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msensitive_feature\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m:\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/frame.py:7718\u001b[0m, in \u001b[0;36mDataFrame.groupby\u001b[0;34m(self, by, axis, level, as_index, sort, group_keys, squeeze, observed, dropna)\u001b[0m\n\u001b[1;32m 7713\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_axis_number(axis)\n\u001b[1;32m 7715\u001b[0m \u001b[38;5;66;03m# https://github.com/python/mypy/issues/7642\u001b[39;00m\n\u001b[1;32m 7716\u001b[0m \u001b[38;5;66;03m# error: Argument \"squeeze\" to \"DataFrameGroupBy\" has incompatible type\u001b[39;00m\n\u001b[1;32m 7717\u001b[0m \u001b[38;5;66;03m# \"Union[bool, NoDefault]\"; expected \"bool\"\u001b[39;00m\n\u001b[0;32m-> 7718\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mDataFrameGroupBy\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 7719\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7720\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mby\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7721\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7722\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7723\u001b[0m \u001b[43m \u001b[49m\u001b[43mas_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mas_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7724\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7725\u001b[0m \u001b[43m \u001b[49m\u001b[43mgroup_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7726\u001b[0m \u001b[43m \u001b[49m\u001b[43msqueeze\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msqueeze\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;66;43;03m# type: ignore[arg-type]\u001b[39;49;00m\n\u001b[1;32m 7727\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7728\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7729\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/groupby/groupby.py:882\u001b[0m, in \u001b[0;36mGroupBy.__init__\u001b[0;34m(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, squeeze, observed, mutated, dropna)\u001b[0m\n\u001b[1;32m 879\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m grouper \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 880\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mgroupby\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mgrouper\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m get_grouper\n\u001b[0;32m--> 882\u001b[0m grouper, exclusions, obj \u001b[38;5;241m=\u001b[39m \u001b[43mget_grouper\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 883\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 884\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 885\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 886\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 887\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 888\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 889\u001b[0m \u001b[43m \u001b[49m\u001b[43mmutated\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmutated\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 890\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 891\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 893\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj \u001b[38;5;241m=\u001b[39m obj\n\u001b[1;32m 894\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis \u001b[38;5;241m=\u001b[39m obj\u001b[38;5;241m.\u001b[39m_get_axis_number(axis)\n", + "File \u001b[0;32m~/miniconda3/lib/python3.9/site-packages/pandas/core/groupby/grouper.py:882\u001b[0m, in \u001b[0;36mget_grouper\u001b[0;34m(obj, key, axis, level, sort, observed, mutated, validate, dropna)\u001b[0m\n\u001b[1;32m 880\u001b[0m in_axis, level, gpr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m, gpr, \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 881\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 882\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(gpr)\n\u001b[1;32m 883\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(gpr, Grouper) \u001b[38;5;129;01mand\u001b[39;00m gpr\u001b[38;5;241m.\u001b[39mkey \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 884\u001b[0m \u001b[38;5;66;03m# Add key to exclusions\u001b[39;00m\n\u001b[1;32m 885\u001b[0m exclusions\u001b[38;5;241m.\u001b[39madd(gpr\u001b[38;5;241m.\u001b[39mkey)\n", + "\u001b[0;31mKeyError\u001b[0m: 'Gender'" ] } ], "source": [ - "print(\"done\") " + "equality_odds(test_data, 'Good Candidate', 'Gender', 'Prediction')" ] }, { "cell_type": "code", "execution_count": null, - "id": "f9ada5bf", + "id": "d0fe341c", "metadata": {}, "outputs": [], "source": []