{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "source": [
        "import math\n",
        "import random\n",
        "import pandas as pd\n",
        "import numpy as np"
      ],
      "metadata": {
        "id": "EacxbXJRyLs2"
      },
      "execution_count": 2,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def encode_class(mydata):\n",
        "    classes = []\n",
        "    for i in range(len(mydata)):\n",
        "        if mydata[i][-1] not in classes:\n",
        "            classes.append(mydata[i][-1])\n",
        "    for i in range(len(classes)):\n",
        "        for j in range(len(mydata)):\n",
        "            if mydata[j][-1] == classes[i]:\n",
        "                mydata[j][-1] = i\n",
        "    return mydata"
      ],
      "metadata": {
        "id": "P1EZsJT46OcT"
      },
      "execution_count": 3,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def splitting(mydata, ratio):\n",
        "    train_num = int(len(mydata) * ratio)\n",
        "    train = []\n",
        "    test = list(mydata)\n",
        "\n",
        "    while len(train) < train_num:\n",
        "        index = random.randrange(len(test))\n",
        "        train.append(test.pop(index))\n",
        "    return train, test"
      ],
      "metadata": {
        "id": "eMtyGnmJ6Psq"
      },
      "execution_count": 4,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def groupUnderClass(mydata):\n",
        "    data_dict = {}\n",
        "    for i in range(len(mydata)):\n",
        "        if mydata[i][-1] not in data_dict:\n",
        "            data_dict[mydata[i][-1]] = []\n",
        "        data_dict[mydata[i][-1]].append(mydata[i])\n",
        "    return data_dict"
      ],
      "metadata": {
        "id": "ShtINN-U6RG7"
      },
      "execution_count": 5,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def MeanAndStdDev(numbers):\n",
        "    avg = np.mean(numbers)\n",
        "    stddev = np.std(numbers)\n",
        "    return avg, stddev\n",
        "\n",
        "def MeanAndStdDevForClass(mydata):\n",
        "    info = {}\n",
        "    data_dict = groupUnderClass(mydata)\n",
        "    for classValue, instances in data_dict.items():\n",
        "        info[classValue] = [MeanAndStdDev(attribute) for attribute in zip(*instances)]\n",
        "    return info"
      ],
      "metadata": {
        "id": "B0XsEtrZ6SQX"
      },
      "execution_count": 6,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def calculateGaussianProbability(x, mean, stdev):\n",
        "    epsilon = 1e-10\n",
        "    expo = math.exp(-(math.pow(x - mean, 2) / (2 * math.pow(stdev + epsilon, 2))))\n",
        "    return (1 / (math.sqrt(2 * math.pi) * (stdev + epsilon))) * expo\n",
        "\n",
        "def calculateClassProbabilities(info, test):\n",
        "    probabilities = {}\n",
        "    for classValue, classSummaries in info.items():\n",
        "        probabilities[classValue] = 1\n",
        "        for i in range(len(classSummaries)):\n",
        "            mean, std_dev = classSummaries[i]\n",
        "            x = test[i]\n",
        "            probabilities[classValue] *= calculateGaussianProbability(x, mean, std_dev)\n",
        "    return probabilities"
      ],
      "metadata": {
        "id": "_mpZcBqE6Tlm"
      },
      "execution_count": 7,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def predict(info, test):\n",
        "    probabilities = calculateClassProbabilities(info, test)\n",
        "    bestLabel = max(probabilities, key=probabilities.get)\n",
        "    return bestLabel\n",
        "\n",
        "def getPredictions(info, test):\n",
        "    predictions = [predict(info, instance) for instance in test]\n",
        "    return predictions"
      ],
      "metadata": {
        "id": "8fJ8TV4o6XKQ"
      },
      "execution_count": 8,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def accuracy_rate(test, predictions):\n",
        "    correct = sum(1 for i in range(len(test)) if test[i][-1] == predictions[i])\n",
        "    return (correct / float(len(test))) * 100.0"
      ],
      "metadata": {
        "id": "QVafgHwk6Ytc"
      },
      "execution_count": 9,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "filename = 'diabetes.csv'\n",
        "df = pd.read_csv(filename, comment='#')\n",
        "mydata = df.values.tolist()\n",
        "\n",
        "mydata = encode_class(mydata)\n",
        "for i in range(len(mydata)):\n",
        "    for j in range(len(mydata[i]) - 1):\n",
        "        mydata[i][j] = float(mydata[i][j])"
      ],
      "metadata": {
        "id": "lOuYKPin6a3b"
      },
      "execution_count": 11,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "ratio = 0.7\n",
        "train_data, test_data = splitting(mydata, ratio)\n",
        "\n",
        "print('Total number of examples:', len(mydata))\n",
        "print('Training examples:', len(train_data))\n",
        "print('Test examples:', len(test_data))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "r4hwoOKx6i2A",
        "outputId": "a54bf6dd-3c93-4487-80d6-bcd398a1c253"
      },
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Total number of examples: 1000\n",
            "Training examples: 700\n",
            "Test examples: 300\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "info = MeanAndStdDevForClass(train_data)\n",
        "\n",
        "predictions = getPredictions(info, test_data)\n",
        "accuracy = accuracy_rate(test_data, predictions)\n",
        "print('Accuracy of the model:', accuracy)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "znjO63Ce645G",
        "outputId": "d09dedde-e26f-4ff8-fb39-299d6c014cd3"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Accuracy of the model: 100.0\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n",
        "\n",
        "y_true = [row[-1] for row in test_data]\n",
        "y_pred = predictions\n",
        "\n",
        "cm = confusion_matrix(y_true, y_pred)\n",
        "disp = ConfusionMatrixDisplay(confusion_matrix=cm)\n",
        "disp.plot(cmap='Blues')"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 466
        },
        "id": "CfuAea_p6-er",
        "outputId": "2e79df9b-2c3f-48bf-b401-19a687e0074d"
      },
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x7c98caa10770>"
            ]
          },
          "metadata": {},
          "execution_count": 14
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import matplotlib.pyplot as plt\n",
        "from sklearn.metrics import precision_score, recall_score, f1_score\n",
        "\n",
        "actual = [0, 1, 1, 0, 1, 0, 1, 1]\n",
        "predicted = [0, 1, 0, 0, 1, 0, 1, 0]\n",
        "\n",
        "precision = precision_score(actual, predicted)\n",
        "recall = recall_score(actual, predicted)\n",
        "f1 = f1_score(actual, predicted)\n",
        "\n",
        "metrics = ['Precision', 'Recall', 'F1 Score']\n",
        "values = [precision, recall, f1]\n",
        "\n",
        "plt.figure(figsize=(6, 4))\n",
        "plt.bar(metrics, values, color=['skyblue', 'lightgreen', 'salmon'])\n",
        "plt.ylim(0, 1)\n",
        "plt.title('Precision, Recall, and F1 Score')\n",
        "plt.ylabel('Score')\n",
        "for i, v in enumerate(values):\n",
        "    plt.text(i, v + 0.02, f\"{v:.2f}\", ha='center', fontweight='bold')\n",
        "\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 391
        },
        "id": "MTKSbmXp7AGE",
        "outputId": "c75388ad-ece8-41ea-f42c-ad5cc1582875"
      },
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 600x400 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhgAAAF2CAYAAAAskuGnAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPAFJREFUeJzt3XlcFfX+x/E3IBxAFhcEhVTcccsFcUuzBUUry9QyW0QstRJbuC1SuXYT65ppaVqm6c26mlpey5VQWlzSNP2lISpimgaIGiAmKMzvDx+c6wlQwIEj+no+HuchZ+b7nfnMOJzzZlYHwzAMAQAAmMjR3gUAAIDrDwEDAACYjoABAABMR8AAAACmI2AAAADTETAAAIDpCBgAAMB0BAwAAGA6AgYAADAdAQMohaFDhyowMLBUfeLj4+Xg4KD4+Phyqel65ODgoAkTJljfL1iwQA4ODjp8+LDdaiqJsmwfwPWKgIFrWsEXS8HL1dVVTZs2VWRkpFJTU+1dXqX093VapUoVBQQEaOjQoTp27Ji9y7sh3HbbbTb/B5e+9u3bZ233xhtv6N5775Wfn1+h0FUSv/zyiwYOHKj69evL1dVVAQEB6tmzp9577z2TlwgorIq9CwBKYtKkSWrQoIHOnTunH374QbNnz9bq1au1Z88eubu7V1gdc+fOVX5+fqn63Hrrrfrrr7/k4uJSTlWVzaXrdOvWrVqwYIF++OEH7dmzR66urvYu77p30003KSYmptBwf39/68+vvfaaateurXbt2mndunWlmv7mzZt1++23q169eho+fLhq166to0ePauvWrZoxY4ZGjx591csAXA4BA5VCnz591KFDB0nSE088oZo1a2ratGn673//q8GDBxfZJzs7W1WrVjW1Dmdn51L3cXR0vCa/sP++Tn18fPTmm29q5cqVevDBB+1c3fXP29tbjz766GXbJCcnKzAwUOnp6apVq1appv/GG2/I29tb27dvV7Vq1WzGpaWllbbcq3L27NkK/UMA1wYOkaBSuuOOOyRd/ACWLh779vDwUFJSku666y55enrqkUcekSTl5+dr+vTpatmypVxdXeXn56eRI0fq9OnThaa7Zs0a9ejRQ56envLy8lJISIg+++wz6/iijrEvXrxYwcHB1j6tW7fWjBkzrOOLOwdj6dKlCg4Olpubm3x8fPToo48WOkRRsFzHjh1Tv3795OHhoVq1aumFF15QXl5emddfUbp37y5JSkpKshm+b98+DRw4UDVq1JCrq6s6dOiglStXFur/559/6vnnn1dgYKAsFotuuukmDRkyROnp6ZKk3NxcjRs3TsHBwfL29lbVqlXVvXt3bdy40dTl+LuSzvfw4cNycHDQ1KlT9eGHH6pRo0ayWCwKCQnR9u3bC013xYoVatWqlVxdXdWqVSt9+eWXptd+NedzJCUlqWXLloXChST5+voWGrZo0SJ17NhR7u7uql69um699VatX7/eps3777+vli1bymKxyN/fX6NGjdKff/5p0+a2225Tq1attGPHDt16661yd3fXK6+8IknKycnR+PHj1bhxY1ksFtWtW1cvvfSScnJyyrycuHaxBwOVUsGXYM2aNa3DLly4oLCwMHXr1k1Tp061/sU0cuRILViwQBEREXrmmWeUnJysmTNn6ueff9amTZuseyUWLFigYcOGqWXLloqOjla1atX0888/a+3atXr44YeLrCM2NlaDBw/WnXfeqTfffFOSlJCQoE2bNunZZ58ttv6CekJCQhQTE6PU1FTNmDFDmzZt0s8//2zzpZCXl6ewsDB16tRJU6dO1TfffKO3335bjRo10lNPPXVV6/FSBSdQVq9e3Tps7969uuWWWxQQEKAxY8aoatWq+vzzz9WvXz8tX75c999/vyTpzJkz6t69uxISEjRs2DC1b99e6enpWrlypX7//Xf5+PgoMzNTH330kQYPHqzhw4crKytL8+bNU1hYmLZt26a2bduatiyXKu18P/vsM2VlZWnkyJFycHDQW2+9pf79++vQoUPWbWX9+vUaMGCAWrRooZiYGJ08eVIRERG66aabSlxXXl6eNXwVcHV1lYeHx1UvsyTVr19fW7Zs0Z49e9SqVavLtp04caImTJigrl27atKkSXJxcdGPP/6oDRs2qFevXpKkCRMmaOLEiQoNDdVTTz2lxMREzZ49W9u3b7f5PZKkkydPqk+fPnrooYf06KOPys/PT/n5+br33nv1ww8/aMSIEWrevLl++eUXvfPOO9q/f79WrFhhynLjGmLghvXtt98affr0MXx8fAxJhiRj9uzZJer7n//8x2jXrp3h6upqVK9e3RgwYIBx8OBBmzaZmZnGc889ZwQEBBjOzs5Gw4YNjQkTJhjnz58vcY0ff/yxIcn45ptv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Bx9UXl6eXn/99ULjLly4YL3ErlevXvL09FRMTIzOnTtn0+5ydZ88edLmvaOjo26++WZJKvbSuw4dOsjX11dz5syxabNmzRolJCTo7rvvLtGyme22225Tx44dNX36dJ07d06+vr667bbb9MEHH1i/jC514sQJ688DBgzQ7t27i7xUs2D9FewZuHR9/vjjj9qyZYvZi2LD7PnWqVNHbdu21cKFC20OscTGxloPO1wLNm7cWOS2u3r1akn/O9zRr18/OTo6atKkSYVuIlfQPzQ0VC4uLnr33Xdtpjlv3jxlZGSUaJt98MEHdezYMc2dO7fQuL/++kvZ2dklXzhUCuzBQKlcuhvz0mOmBT8XHL8uaJeenq78/Hw5OjratP/7ce7y0qNHD40cOVIxMTHatWuXevXqJWdnZx04cEBLly7VjBkzNHDgQHl5eemdd97RE088oZCQED388MOqXr26du/erbNnzxZ7uOOJJ57QqVOndMcdd+imm27Sb7/9pvfee09t27ZV8+bNi+zj7OysN998UxEREerRo4cGDx5svUw1MDBQzz//fJmWdejQoVq4cKH15kxl8eKLL+qBBx7QggUL9OSTT2rWrFnq1q2bWrdureHDh6thw4ZKTU3Vli1b9Pvvv2v37t3WfsuWLdMDDzygYcOGKTg4WKdOndLKlSs1Z84ctWnTRvfcc4+++OIL3X///br77ruVnJysOXPmqEWLFjpz5kypay241Pfjjz/W0KFDi21n9nwlKSYmRnfffbe6deumYcOG6dSpU3rvvffUsmXLMk+zKJ988ol+++03nT17VpL03Xff6Z///Keki+dQXW5v1+jRo3X27Fndf//9CgoKUm5urjZv3qwlS5YoMDDQehJm48aN9eqrr+r1119X9+7d1b9/f1ksFm3fvl3+/v6KiYlRrVq1FB0drYkTJ6p379669957lZiYqPfff18hISFXvGFYQb2ff/65nnzySW3cuFG33HKL8vLytG/fPn3++edat27dFQ+DopKx09UruIYUXJ6nIi5TveOOO4xmzZpZL//MyckxatasaUgyBgwYYBiGYRw7dszw9PQ0JBmjR482DMMwli1bZp1mweV97777rnXYjh07SlRbweWJ27dvv2y78PBwo2rVqsWO//DDD43g4GDDzc3N8PT0NFq3bm289NJLxvHjx23arVy50ujatavh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uPSzoSxatGihPXv2aMeOHdq0aZP1RNGhQ4fqo48+UkJCgnJycor9fCvpZ1RpP1dvRASM60TBL6mLi4v8/f1Vpcr//mv//gt75swZBQcH69NPPy00nVq1atk8+6Uk2rdvr+TkZK1Zs0bffPONHnzwQYWGhhY6xl4af/+icXBwUH5+fpmnh/JXtWpV62G0+fPnq02bNpo3b571OUGrVq1SQECATZ+CZ0K4ublddtrh4eE6efKkZsyYofr168tisahLly437q7n68il241ZHB0dFRISopCQED333HNatGiRHnvsMb366qtX3NZKqrSfqzciAsZ1ojS/pO3bt9eSJUvk6+srLy+vItsEBgYqLi5Ot99+e4mm6eXlpUGDBmnQoEEaOHCgevfurVOnTqlGjRo27Zo3b64FCxYoOzvb+gu6adMmOTo6Wk+UQuXn6OioV155RVFRUdq/f78sFouOHDmiHj16FNn+5ptv1sKFC3X+/Pki92Js2rRJ77//vu666y5JF0+mS09PL9dlwPWjRYsWki6eX9GkSRO5ubkpLi5OTzzxRKG2Zf2MKsnn6o2GkzxvQI888oh8fHx033336fvvv1dycrLi4+P1zDPP6Pfff5ckTZgwQW+//bbeffddHThwQDt37tR7771X5PSmTZum//znP9q3b5/279+vpUuXqnbt2qpWrVqR83Z1dVV4eLj27NmjjRs3avTo0Xrsscesux5xfXjggQfk5OSkDz74QC+88IKef/55LVy4UElJSdbtaeHChZKkyMhIZWZm6qGHHtJPP/2kAwcO6JNPPlFiYqIkqUmTJvrkk0+UkJCgH3/8UY888ohpf4ni2nXmzBnt2rXLesO05ORk7dq167KHxgYOHKh33nlHP/74o3777TfFx8dr1KhRatq0qYKCguTq6qqXX35ZL730kv79738rKSlJW7du1bx58ySV/TOqJJ+rNxoCxg3I3d1d3333nerVq6f+/furefPmevzxx3Xu3Dlr8g4PD9f06dP1/vvvq2XLlrrnnnt04MCBIqfn6empt956Sx06dFBISIgOHz6s1atXF3moxd3dXevWrdOpU6cUEhKigQMH6s4779TMmTPLdZlR8apUqaLIyEi99dZbio6O1tixYxUTE6PmzZurd+/eWrVqlRo0aCBJqlmzpjZs2KAzZ86oR48eCg4O1ty5c617M+bNm6fTp0+rffv2euyxx/TMM8/I19fXnouHCvDTTz+pXbt21nN1oqKi1K5dO40bN67YPmFhYfrqq6/Ut29fNW3aVOHh4QoKCtL69euth47Hjh2rf/zjHxo3bpyaN2+uQYMGKS0tTVLZP6NK8rl6o+Fx7QAAwHTswQAAAKYjYAAAANMRMAAAgOkIGAAAwHQEDAAAYDoCBgAAMB0BAwAAmI6AAQAATEfAAAAApiNgAAAA0xEwAACA6QgYAADAdP8P3j2dpWpFTxcAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "HY27413w7By0"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}