diff --git a/02_activities/assignments/assignment_1 (1).ipynb b/02_activities/assignments/assignment_1 (1).ipynb new file mode 100644 index 00000000..3e2b3ac4 --- /dev/null +++ b/02_activities/assignments/assignment_1 (1).ipynb @@ -0,0 +1,176 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 469 + }, + "id": "XOe9KOlXbmT1", + "outputId": "902b42af-a146-495a-d1cb-85532cf8a750" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9wAAAJOCAYAAABFiQ/hAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAa9tJREFUeJzt3XdclfX///HnYW9QUcDErUjmRMuVE2eZqxyZilmZOVOz/FqpWWlqzhzlp8SmZZktRw6wMjNzpYm4MCxxoDkQQYHr94c3zs8jqIBcHsDH/XY7t7ze13pd13mf03lyLYthGIYAAAAAAEC+crB3AQAAAAAAFEUEbgAAAAAATEDgBgAAAADABARuAAAAAABMQOAGAAAAAMAEBG4AAAAAAExA4AYAAAAAwAQEbgAAAAAATEDgBgAAAADABARuAMgHH330kapVqyZnZ2f5+fnZuxzkkcVi0YQJE+xdBq4TERGh8uXL22Xd+dkn7Lkd2UlLS9OYMWMUHBwsBwcHde7c+Y6t+8iRI7JYLIqMjLxj6wQAeyBwA7ipyMhIWSwW/fHHH/Yu5batXLnSlDC1b98+RUREqFKlSlq0aJHee++9W86zc+dOPfHEEwoODparq6uKFy+u8PBwLV68WOnp6fleY6Zff/1VEyZM0NmzZ01bhyR9+umnmjVr1i2nmzBhgiwWyy1fzZs3N7Xeu0V0dLTNfnV2dlbFihXVt29fHT582N7lFVqZ4TG7V4MGDUxbb+b7+eWXX+Zp/g8++EDTpk3To48+qiVLluj555/P5wpz/l1wp3333Xdq1qyZSpUqJQ8PD1WsWFHdu3fX6tWr7V0agCLGyd4FAMCdsnLlSs2bNy/fQ3d0dLQyMjI0e/ZsVa5c+ZbT/+9//9Ozzz6rgIAA9enTR1WqVNGFCxe0fv16DRgwQAkJCfq///u/fK0x06+//qqJEycqIiLC1CPxn376qfbs2aMRI0bcdLquXbva7LOkpCQNGjRIXbp0UdeuXa3tAQEBZpVq49KlS3JyKvr/axw2bJjq16+vK1euaPv27Xrvvff0ww8/aPfu3SpdurS9y8ti0aJFysjIsHcZt9SrVy916NDBpq1kyZJ2qubWNmzYoHvuuUczZ840bR03+i4oV66cLl26JGdnZ9PWfSPTp0/XCy+8oGbNmmns2LHy8PDQwYMHtW7dOi1dulTt2rW74zUBKLqK/q8KADDZyZMnJSlHAfa3337Ts88+q4YNG2rlypXy9va2jhsxYoT++OMP7dmzx6xSC5yaNWuqZs2a1uHExEQNGjRINWvW1BNPPHHD+VJSUuTi4iIHh/w9UcvNzS1fl1dQPfjgg3r00UclSf3791fVqlU1bNgwLVmyRGPHjr2tZV+8eFGenp75UaaVPUJZXtStW/em/bagOXnypN0ugbFYLHb5vKWlpWnSpElq3bq1fvzxxyzjM7/P7yQzPjMACg5OKQeQaxEREfLy8lJ8fLwefvhheXl56Z577tG8efMkSbt371bLli3l6empcuXK6dNPP7WZP/M09Z9++kkDBw5UiRIl5OPjo759++q///6zmfabb77RQw89pNKlS8vV1VWVKlXSpEmTsj3tesuWLerQoYOKFSsmT09P1axZU7Nnz7bWnFnftad73sr8+fNVvXp1ubq6qnTp0ho8eLDN6djly5fX+PHjJV09knWr6z0nTpwoi8WiTz75xCZsZ6pXr54iIiKswxcvXtSoUaOsp56HhIRo+vTpMgzDZj6LxaIhQ4ZoxYoVuu++++Tq6qrq1avbnB45YcIEvfDCC5KkChUqWPfBkSNHJEmLFy9Wy5YtVapUKbm6uuree+/VggULst2OVatWqVmzZvL29paPj4/q169vfZ+bN2+uH374QX///bd1Hbdz3WrmabNLly7Vyy+/rHvuuUceHh46f/68zpw5o9GjR6tGjRry8vKSj4+P2rdvr127dmVZTkpKiiZMmKCqVavKzc1NQUFB6tq1qw4dOmSzH699/zJPeT948KD1rABfX1/1799fycnJNsu/dOmShg0bJn9/f3l7e+uRRx7Rv//+m+NrgE+ePKkBAwYoICBAbm5uqlWrlpYsWWIzTeapy9OnT9d7772nSpUqydXVVfXr19fWrVtzt2Ov0bJlS0lSXFyctW3VqlV68MEH5enpKW9vbz300EP666+/bObL/C44dOiQOnToIG9vb/Xu3VuSrGd91KhRQ25ubipZsqTatWuX5fKUjz/+WGFhYXJ3d1fx4sXVs2dPHT16NMt6MvvQlStXVLx4cfXv3z/Ldpw/f15ubm4aPXq0tS01NVXjx49X5cqV5erqquDgYI0ZM0apqak286ampur5559XyZIlre/fP//8k8s9mTuZfTs6Otqm/Xaub85Jn81cflRUlP766y/r5zSzjoyMDM2aNUvVq1eXm5ubAgICNHDgwCzfz1LevwtutI0bNmyw9js/Pz916tRJMTExud7GG0lMTNT58+fVuHHjbMeXKlXKZjgnn8vcvI936jNz4MABdevWTYGBgXJzc1OZMmXUs2dPnTt37qb7B0D+4wg3gDxJT09X+/bt1bRpU02dOlWffPKJhgwZIk9PT40bN069e/dW165dtXDhQvXt21cNGzZUhQoVbJYxZMgQ+fn5acKECYqNjdWCBQv0999/W3+8SFfDuZeXl0aOHCkvLy9t2LBBr776qs6fP69p06ZZl7V27Vo9/PDDCgoK0vDhwxUYGKiYmBh9//33Gj58uAYOHKhjx45p7dq1+uijj3K0jRMmTNDEiRMVHh6uQYMGWWvcunWrNm3aJGdnZ82aNUsffvihvv76ay1YsEBeXl42R2yvlZycrPXr16tp06YqW7bsLddvGIYeeeQRRUVFacCAAapdu7bWrFmjF154Qf/++2+W00B/+eUXLV++XM8995y8vb01Z84cdevWTfHx8SpRooS6du2q/fv367PPPtPMmTPl7+8v6f+f8rpgwQJVr15djzzyiJycnPTdd9/pueeeU0ZGhgYPHmxdT2RkpJ588klVr15dY8eOlZ+fn3bs2KHVq1fr8ccf17hx43Tu3Dn9888/1hq9vLxytM9vZtKkSXJxcdHo0aOVmpoqFxcX7d27VytWrNBjjz2mChUq6MSJE3r33XfVrFkz7d2713p6dHp6uh5++GGtX79ePXv21PDhw3XhwgWtXbtWe/bsUaVKlW667u7du6tChQqaPHmytm/frv/9738qVaqU3nrrLes0ERER+uKLL9SnTx81aNBAGzdu1EMPPZSjbbt06ZKaN2+ugwcPasiQIapQoYKWLVumiIgInT17VsOHD7eZ/tNPP9WFCxc0cOBAWSwWTZ06VV27dtXhw4fzdDQ4848OJUqUkHT1JoD9+vVT27Zt9dZbbyk5OVkLFixQkyZNtGPHDps/oKSlpalt27Zq0qSJpk+fLg8PD0nSgAEDFBkZqfbt2+upp55SWlqafv75Z/3222+qV6+eJOmNN97QK6+8ou7du+upp57SqVOnNHfuXDVt2lQ7duzI9uirs7OzunTpouXLl+vdd9+Vi4uLddyKFSuUmpqqnj17SroaYB555BH98ssveuaZZxQaGqrdu3dr5syZ2r9/v1asWGGd96mnntLHH3+sxx9/XI0aNdKGDRty/P5lSk5OVmJiok2br6+vXY7Q36zPlixZUh999JHeeOMNJSUlafLkyZKk0NBQSdLAgQMVGRmp/v37a9iwYYqLi9M777yjHTt2WL/7pPz/Lli3bp3at2+vihUrasKECbp06ZLmzp2rxo0ba/v27Vn+cJeTz+X1SpUqJXd3d3333XcaOnSoihcvfsNpc/u5zCmzPzOXL19W27ZtlZqaqqFDhyowMFD//vuvvv/+e509e1a+vr55qhtAHhkAcBOLFy82JBlbt261tvXr18+QZLz55pvWtv/++89wd3c3LBaLsXTpUmv7vn37DEnG+PHjsywzLCzMuHz5srV96tSphiTjm2++sbYlJydnqWngwIGGh4eHkZKSYhiGYaSlpRkVKlQwypUrZ/z3338202ZkZFj/PXjwYCOnX3snT540XFxcjDZt2hjp6enW9nfeeceQZHzwwQfWtvHjxxuSjFOnTt10mbt27TIkGcOHD89RDStWrDAkGa+//rpN+6OPPmpYLBbj4MGD1jZJhouLi01b5vrmzp1rbZs2bZohyYiLi8uyvuz2ddu2bY2KFStah8+ePWt4e3sbDzzwgHHp0iWbaa/d1w899JBRrly5HG3ntU6dOpWlv0RFRRmSjIoVK2apMSUlxeb9MQzDiIuLM1xdXY3XXnvN2vbBBx8YkowZM2ZkWee1dV+/7sz39sknn7SZp0uXLkaJEiWsw9u2bTMkGSNGjLCZLiIiIssyszNr1ixDkvHxxx9b2y5fvmw0bNjQ8PLyMs6fP2/dNklGiRIljDNnzlin/eabbwxJxnfffXfT9WTuyw8++MA4deqUcezYMeOHH34wypcvb1gsFmPr1q3GhQsXDD8/P+Ppp5+2mff48eOGr6+vTXvmd8FLL71kM+2GDRsMScawYcOy1JC5v48cOWI4Ojoab7zxhs343bt3G05OTjbt/fr1s+lPa9asyXZ7O3ToYNNfP/roI8PBwcH4+eefbaZbuHChIcnYtGmTYRiGsXPnTkOS8dxzz9lM9/jjj+fo/ct8X7J7RUVF3XA7Mt+Pa6e5dnmLFy++6Xoz51+2bJm1Lad91jAMo1mzZkb16tVt2n7++WdDkvHJJ5/YtK9evdqm/Xa/C7Lbxtq1axulSpUyTp8+bW3btWuX4eDgYPTt2zdP25idV1991ZBkeHp6Gu3btzfeeOMNY9u2bVmmy+nnMjfv4534zOzYsSNLvwBgP5xSDiDPnnrqKeu//fz8FBISIk9PT3Xv3t3aHhISIj8/v2zvgPzMM8/YHPkZNGiQnJyctHLlSmubu7u79d8XLlxQYmKiHnzwQSUnJ2vfvn2SpB07diguLk4jRozIckQsJ6eNZ2fdunW6fPmyRowYYXOd8NNPPy0fHx/98MMPuV7m+fPnJSnbU8mzs3LlSjk6OmrYsGE27aNGjZJhGFq1apVNe3h4uM2R2po1a8rHxyfHd5++dl+fO3dOiYmJatasmQ4fPmw9DXHt2rW6cOGCXnrppSzXX+Z1X+dUv379bGqUJFdXV+v7k56ertOnT8vLy0shISHavn27dbqvvvpK/v7+Gjp0aJbl5qTuZ5991mb4wQcf1OnTp63vaeap+88995zNdNmtLzsrV65UYGCgevXqZW1zdnbWsGHDlJSUpI0bN9pM36NHDxUrVsymHkk5fq+ffPJJlSxZUqVLl9ZDDz2kixcvasmSJapXr57Wrl2rs2fPqlevXkpMTLS+HB0d9cADDygqKirL8gYNGmQz/NVXX8lisVgvt7hW5v5evny5MjIy1L17d5v1BAYGqkqVKtmuJ1PLli3l7++vzz//3Nr233//ae3aterRo4e1bdmyZQoNDVW1atVs1pF5Cn3mOjK/c67/rN3qpn/Xe+aZZ7R27VqbV61atXK1jPxyqz57I8uWLZOvr69at25ts8/CwsLk5eVl3Wf5/V2QkJCgnTt3KiIiwuaoc82aNdW6dWub/y/c7jZOnDhRn376qerUqaM1a9Zo3LhxCgsLU926dW1OX8/t5zI3zPzMZB7BXrNmzS1PsQdgPk4pB5AnmdeXXcvX11dlypTJ8mPL19c322v/qlSpYjPs5eWloKAg6zXFkvTXX3/p5Zdf1oYNG7L8iMoMgZmnw95333153p7r/f3335Ku/sHgWi4uLqpYsaJ1fG74+PhIuvqHg5zWULp06SwBPfO0z+tryO409WLFimW777OzadMmjR8/Xps3b87yI+3cuXPy9fU1ZV/n1PWXJEj//5rH+fPnKy4uzuba/szTo6WrfSQkJCTPdyC/ft9mht3//vtPPj4++vvvv+Xg4JClxpzctV66+l5WqVIly03gcvpeX1tPTrz66qt68MEH5ejoKH9/f4WGhlr3zYEDByT9/+u6r5fZjzM5OTmpTJkyNm2HDh1S6dKlb3q67oEDB2QYRpbvgUw3Ow3byclJ3bp106effqrU1FS5urpq+fLlunLlik3gPnDggGJiYm54p/DMG2Rlvn/XX1pw/ef/VqpUqaLw8PBczWOWW/XZGzlw4IDOnTuX5VrmTJn7LL+/C270nStd/RysWbMmy83F8rqN0tU7yvfq1Uvnz5/Xli1bFBkZqU8//VQdO3bUnj175ObmluvPZU6Z/ZmpUKGCRo4cqRkzZuiTTz7Rgw8+qEceeURPPPEEp5MDdkDgBpAnjo6OuWo3rrvJV06cPXtWzZo1k4+Pj1577TVVqlRJbm5u2r59u1588cVC8Ziga1WuXFlOTk7avXu3Kcu/nX1/6NAhtWrVStWqVdOMGTMUHBwsFxcXrVy5UjNnziwQ+/r6o9uS9Oabb+qVV17Rk08+qUmTJql48eJycHDQiBEj8rXm/OzX+eF266lRo8YNg2Hmfvvoo48UGBiYZfz1f7S49iyD3MjIyJDFYtGqVauy3Z5bXfffs2dPvfvuu1q1apU6d+6sL774QtWqVbM5opyRkaEaNWpoxowZ2S4jODg413XnpxsdCc7uppC5ldc+kpGRoVKlSumTTz7JdnxBesxZfnwufXx81Lp1a7Vu3VrOzs5asmSJtmzZombNmuV4Gbl9H+/EZ+btt99WRESEvvnmG/34448aNmyYJk+erN9++y1L2AdgLgI3ALs5cOCAWrRoYR1OSkpSQkKC9Tm20dHROn36tJYvX66mTZtap7v2TsqSrEel9uzZc9OjS7k5zbFcuXKSpNjYWFWsWNHafvnyZcXFxeXpKJaHh4datmypDRs26OjRo7f8sV+uXDmtW7dOFy5csDnKnXkqfWaNuXGjffDdd98pNTVV3377rc1Ro+tP6712X9/s6K3Zp5dn+vLLL9WiRQu9//77Nu1nz5613hROulr3li1bdOXKFVNuYFWuXDllZGQoLi7O5ujTwYMHczz/n3/+qYyMDJsf4rfzXudV5ntcqlSpPB+trVSpktasWaMzZ87c8IhdpUqVZBiGKlSooKpVq+Z6HU2bNlVQUJA+//xzNWnSRBs2bNC4ceOyrGPXrl1q1arVTftk5vuXeSZEptjY2FzXlRuZR2SvffKBlPcjp/mhUqVKWrdunRo3bpztH7munU7Kv++Ca79zr7dv3z75+/ub/uisevXqacmSJUpISLDWlJPPZX68j2Z8ZmrUqKEaNWro5Zdf1q+//qrGjRtr4cKFev3113NcF4DbxzXcAOzmvffe05UrV6zDCxYsUFpamtq3by/p/x+9uPZoxeXLlzV//nyb5dStW1cVKlTQrFmzsvzguXbezB9r10+TnfDwcLm4uGjOnDk2y3j//fd17ty5XN+9ONP48eNlGIb69OmjpKSkLOO3bdtmfeRMhw4dlJ6ernfeecdmmpkzZ8pisVj3U27caB9kt6/PnTunxYsX20zXpk0beXt7a/LkyUpJSbEZd/2+vhOPn3F0dMxyNGvZsmX6999/bdq6deumxMTELPtSyp+j1G3btpWkLH1z7ty5OZq/Q4cOOn78uM01yWlpaZo7d668vLxydbTtdrVt21Y+Pj568803bT6fmU6dOnXLZXTr1k2GYWjixIlZxmXu765du8rR0VETJ07M8h4YhqHTp0/fdB0ODg569NFH9d133+mjjz5SWlqazenk0tW7WP/7779atGhRlvkvXbqkixcvSpL1szRnzhybaWbNmnXzDb1N5cqVk6Ojo3766Seb9uv70Z3UvXt3paena9KkSVnGpaWlWb878vu7ICgoSLVr19aSJUtsvp/27NmjH3/80fqH2NuVnJyszZs3Zzsu874YmX90yennMj/ex/z8zJw/f15paWk242vUqCEHB4csj8MDYD6OcAOwm8uXL6tVq1bq3r27YmNjNX/+fDVp0kSPPPKIJKlRo0YqVqyY+vXrp2HDhsliseijjz7K8kPDwcFBCxYsUMeOHVW7dm31799fQUFB2rdvn/766y+tWbNGkhQWFibp6o2R2rZtK0dHR+vjg65XsmRJjR07VhMnTlS7du30yCOPWGusX7++nnjiiTxtc6NGjTRv3jw999xzqlatmvr06aMqVarowoULio6O1rfffms9+tCxY0e1aNFC48aN05EjR1SrVi39+OOP+uabbzRixIhbPsoqO5n7YNy4cerZs6ecnZ3VsWNHtWnTRi4uLurYsaMGDhyopKQkLVq0SKVKlbIe7ZGunn45c+ZMPfXUU6pfv74ef/xxFStWTLt27VJycrL1jwVhYWH6/PPPNXLkSNWvX19eXl7q2LFjnvbZzTz88MN67bXX1L9/fzVq1Ei7d+/WJ598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rVq1uq26YmJi1LhxY5u2xo0bKyYm5ob1e3p6ysfHx1r/oEGDtHTpUtWuXVtjxozRr7/+mqdawsLCstTWsGFDm2dAN27cWElJSfrnn3+yrc3R0VElSpRQjRo1rG0BAQGSdNP93bx5c+3fv18JCQmKjo5WkyZN5OjoqGbNmllPE4+OjlajRo3k6uqq3bt3Kz09XVWrVrV5fzZu3Gh9f2JiYvTAAw/YrKdhw4ZZtvFW02TnZv0pNjZWwcHBNn/QyDzzIVNERIR27typkJAQDRs2TD/++OMt1wkAAAAUNRzhLiKcnZ1thi0WizIyMm44fVJSkoKCgrJcEyzJeg32nbxx183qb9++vf7++2+tXLlSa9euVatWrTR48GBNnz49V+vw9PTMt9qubcsM7Dfb340bN5aLi4uioqIUFRWlZs2aSZLq16+vxMREHT58WNHR0Ro4cKCkq++Po6Ojtm3bJkdHR5tleXl55Wk7ciO3/el6devWVVxcnFatWqV169ape/fuCg8P15dffpnfpQIAAAAFFke471J169bV8ePH5eTkpMqVK9u8Mq+PrlmzptavX3/DZbi4uCg9Pf2m6wkNDdWmTZts2jZt2qR77703V/WWLFlS/fr108cff6xZs2bpvffey9X8N6pt8+bNNo/E2rRpk7y9vVWmTJnbXv613N3drTc927hxo5o3by7parBt0KCB3n//fR09etR6mn2dOnWUnp6ukydPZnl/Mo8sh4aGasuWLTbr+e2337Js462mya2QkBAdPXpUJ06csLZde618Jh8fH/Xo0UOLFi3S559/rq+++sp6XT4AAABwN+AI910qPDxcDRs2VOfOnTV16lRVrVpVx44ds94orV69eho/frxatWqlSpUqqWfPnkpLS9PKlSv14osvSrp6LfVPP/2knj17ytXVNdsbmb3wwgvq3r276tSpo/DwcH333Xdavny51q1bl+NaX331VYWFhal69epKTU3V999/r9DQ27+7+3PPPadZs2Zp6NChGjJkiGJjYzV+/HiNHDnSev12fmrRooVmzpwp6eofPDI1a9ZM06dPt95cTbp6PXbv3r3Vt29fvf3226pTp45OnTql9evXq2bNmnrooYc0bNgwNW7cWNOnT1enTp20Zs0am+u3JWn48OGKiIhQvXr11LhxY33yySf666+/VLFixTxvR+vWrVWpUiX1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+MGDBys1NVU//fSTdu/erbfeekteXl6SpLNnz6ply5aqU6eO/vjjD61evVonTpxQ9+7dJV099b5Xr1568sknre9P165dZRjGDbcbAIA8MQAAuIv169fP6NSpk2EYhpGRkWGsXbvWcHV1NUaPHm0dHxAQYKSmplrnee+994xixYoZSUlJ1rYffvjBcHBwMI4fP26dr3jx4sbFixet0yxYsMDw8vIy0tPTjaSkJMPZ2dn45JNPrOMvX75slC5d2pg6daphGIYRFRVlSDJWrFhhU/P48eONWrVqZdkWScbXX3+dqxrLlStnpKWlWad57LHHjB49etxwfzVq1Mh4+umnbdoee+wxo0OHDtbhTp06Gf369bvhMgzDMEqXLm2MGzfuptNca9myZUaJEiWswzVq1DAmTJiQ7bSTJk0y2rRpY9N29OhRQ5IRGxtrbNu2zZBkHDlyJMfrBwAgLzjCDQC4633//ffy8vKSm5ub2rdvrx49emjChAnW8TVq1LC5bjsmJka1atWSp6enta1x48bKyMhQbGysta1WrVry8PCwDjds2FBJSUk6evSoDh06pCtXrqhx48bW8c7Ozrr//vsVExNjU1+9evVyvU05rbF69epydHS0DgcFBenkyZM3Xe61NWcu9/qab+bkyZM6duyYWrVqdcNp1q1bp1atWumee+6Rt7e3+vTpo9OnTys5OVmSNGzYML3++utq3Lixxo8frz///NM6765duxQVFSUvLy/rq1q1apKuXl9eq1YttWrVSjVq1NBjjz2mRYsW6b///stx/QAA5BSBGwBw12vRooV27typAwcO6NKlS1qyZIlNUL323/Zg5vqdnZ1thi0WizIyMkxbn3T1lP2bOXLkiB5++GHVrFlTX331lbZt26Z58+ZJkvVU/6eeekqHDx9Wnz59tHv3btWrV09z586VJCUlJaljx47auXOnzevAgQNq2rSpHB0dtXbtWq1atUr33nuv5s6dq5CQEMXFxZm63QCAuw+BGwBw1/P09FTlypVVtmxZOTnd+gEeoaGh2rVrl81NtjZt2iQHBwfrTdWkq0daL126ZB3+7bff5OXlpeDgYOtNxzZt2mQdf+XKFW3dulX33nvvTdfv4uJy07uV56bG3AoNDbWpOXO5t6r5Wt7e3ipfvrzWr1+f7fht27YpIyNDb7/9tho0aKCqVavq2LFjWaYLDg7Ws88+q+XLl2vUqFFatGiRJKlu3br666+/VL58eVWuXNnmlfnHC4vFosaNG2vixInasWOHXFxc9PXXX+d4GwAAyAkCNwAAudS7d2+5ubmpX79+2rNnj6KiojR06FD16dNHAQEB1ukuX76sAQMGaO/evVq5cqXGjx+vIUOGyMHBQZ6enho0aJBeeOEFrV69Wnv37tXTTz+t5ORkDRgw4KbrL1++vOLi4rRz504lJiYqNTU1zzXm1gsvvKDIyEgtWLBABw4c0IwZM7R8+XKNHj06V8uZMGGC3n77bc2ZM0cHDhzQ9u3brUeoK1eurCtXrmju3Lk6fPiwPvroIy1cuNBm/hEjRmjNmjWKi4vT9u3bFRUVpdDQUElXb6h25swZ9erVS1u3btWhQ4e0Zs0a9e/fX+np6dqyZYvefPNN/fHHH4qPj9fy5ct16tQp6/wAAOQXAjcAALnk4eGhNWvW6MyZM6pfv74effRRtWrVSu+8847NdK1atVKVKlXUtGlT9ejRQ4888ojNteFTpkxRt27d1KdPH9WtW1cHDx7UmjVrVKxYsZuuv1u3bmrXrp1atGihkiVL6rPPPstzjbnVuXNnzZ49W9OnT1f16tX17rvvavHixWrevHmultOvXz/NmjVL8+fPV/Xq1fXwww/rwIEDkq5e+z5jxgy99dZbuu+++/TJJ59o8uTJNvOnp6dr8ODBCg0NVbt27VS1alXNnz9fklS6dGlt2rRJ6enpatOmjWrUqKERI0bIz89PDg4O8vHx0U8//aQOHTqoatWqevnll/X222+rffv2t7VvAAC4nsUweAYGAAD5LSIiQmfPnrV5LjYAALi7cIQbAAAAAAATELgBAAAAADABp5QDAAAAAGACjnADAAAAAGACAjcAAAAAACYgcAMAAAAAYAICNwAAAAAAJiBwAwAAAABgAgI3AAAAAAAmIHADAAAAAGACAjcAAAAAACYgcAMAAAAAYIL/B5Nhd6UzNY+SAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "source": [ + "import numpy as np\n", + "np.random.seed(42)\n", + "# Import necessary libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "# Note: Suppressing FutureWarnings to maintain a clean output. This is specifically to ignore warnings about\n", + "# deprecated features in the libraries we're using (e.g., 'use_inf_as_na' option in Pandas, used by Seaborn),\n", + "# which we currently have no direct control over. This action is taken to ensure that our output remains\n", + "# focused on relevant information, acknowledging that we rely on external library updates to fully resolve\n", + "# these deprecations. Always consider reviewing and removing this suppression after significant library updates.\n", + "import warnings\n", + "warnings.simplefilter(action='ignore', category=FutureWarning)\n", + "\n", + "# Constants representing the parameters of the model\n", + "ATTACK_RATE = 0.10\n", + "TRACE_SUCCESS = 0.20\n", + "SECONDARY_TRACE_THRESHOLD = 2\n", + "\n", + "def simulate_event(m):\n", + " \"\"\"\n", + " Simulates the infection and tracing process for a series of events.\n", + "\n", + " This function creates a DataFrame representing individuals attending weddings and brunches,\n", + " infects a subset of them based on the ATTACK_RATE, performs primary and secondary contact tracing,\n", + " and calculates the proportions of infections and traced cases that are attributed to weddings.\n", + "\n", + " Parameters:\n", + " - m: Dummy parameter for iteration purposes.\n", + "\n", + " Returns:\n", + " - A tuple containing the proportion of infections and the proportion of traced cases\n", + " that are attributed to weddings.\n", + " \"\"\"\n", + " # Create DataFrame for people at events with initial infection and traced status\n", + " events = ['wedding'] * 200 + ['brunch'] * 800\n", + " ppl = pd.DataFrame({\n", + " 'event': events,\n", + " 'infected': False,\n", + " 'traced': np.nan # Initially setting traced status as NaN\n", + " })\n", + "\n", + " # Explicitly set 'traced' column to nullable boolean type\n", + " ppl['traced'] = ppl['traced'].astype(pd.BooleanDtype())\n", + "\n", + " # Infect a random subset of people\n", + " infected_indices = np.random.choice(ppl.index, size=int(len(ppl) * ATTACK_RATE), replace=False)\n", + " ppl.loc[infected_indices, 'infected'] = True\n", + "\n", + " # Primary contact tracing: randomly decide which infected people get traced\n", + " ppl.loc[ppl['infected'], 'traced'] = np.random.rand(sum(ppl['infected'])) < TRACE_SUCCESS\n", + "\n", + " # Secondary contact tracing based on event attendance\n", + " event_trace_counts = ppl[ppl['traced'] == True]['event'].value_counts()\n", + " events_traced = event_trace_counts[event_trace_counts >= SECONDARY_TRACE_THRESHOLD].index\n", + " ppl.loc[ppl['event'].isin(events_traced) & ppl['infected'], 'traced'] = True\n", + "\n", + " # Calculate proportions of infections and traces attributed to each event type\n", + " ppl['event_type'] = ppl['event'].str[0] # 'w' for wedding, 'b' for brunch\n", + " wedding_infections = sum(ppl['infected'] & (ppl['event_type'] == 'w'))\n", + " brunch_infections = sum(ppl['infected'] & (ppl['event_type'] == 'b'))\n", + " p_wedding_infections = wedding_infections / (wedding_infections + brunch_infections)\n", + "\n", + " wedding_traces = sum(ppl['infected'] & ppl['traced'] & (ppl['event_type'] == 'w'))\n", + " brunch_traces = sum(ppl['infected'] & ppl['traced'] & (ppl['event_type'] == 'b'))\n", + " p_wedding_traces = wedding_traces / (wedding_traces + brunch_traces)\n", + "\n", + " return p_wedding_infections, p_wedding_traces\n", + "\n", + "# Run the simulation 1000 times\n", + "results = [simulate_event(m) for m in range(100)]\n", + "props_df = pd.DataFrame(results, columns=[\"Infections\", \"Traces\"])\n", + "\n", + "# Plotting the results\n", + "plt.figure(figsize=(10, 6))\n", + "sns.histplot(props_df['Infections'], color=\"blue\", alpha=0.75, binwidth=0.05, kde=False, label='Infections from Weddings')\n", + "sns.histplot(props_df['Traces'], color=\"red\", alpha=0.75, binwidth=0.05, kde=False, label='Traced to Weddings')\n", + "plt.xlabel(\"Proportion of cases\")\n", + "plt.ylabel(\"Frequency\")\n", + "plt.title(\"Impact of Contact Tracing on Perceived Flu Infection Sources\")\n", + "plt.legend()\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "source": [ + "Question 1: Sampling Stages in the Model\n", + "\n", + "The simulation involves multiple stages of sampling, each of which contributes to variability and potential bias in the results.\n", + "\n", + "First, a random sample of individuals is selected to become infected. From a total population of 1,000 event attendees (200 wedding attendees and 800 brunch attendees), 10% are randomly chosen using np.random.choice() without replacement. This represents the infection process and assumes equal probability of infection across all individuals.\n", + "\n", + "Second, primary contact tracing is applied to infected individuals. For each infected person, tracing success is determined using a Bernoulli trial implemented through np.random.rand() with a success probability of 0.20. This stage samples from the infected population and introduces additional randomness.\n", + "\n", + "Third, secondary contact tracing is applied at the event level. If the number of successfully traced infected individuals at an event reaches or exceeds a predefined threshold, all infected individuals from that event are marked as traced. This step is conditional on earlier sampling and is non-random, leading to systematic overrepresentation of certain events.\n", + "\n", + "Together, these sampling stages demonstrate how non-random tracing mechanisms can bias observed outcomes, even when the initial infection process is random." + ], + "metadata": { + "id": "Ij9sfdKJe8Ij" + } + }, + { + "cell_type": "markdown", + "source": [ + "Question 2\n", + "\n", + "When the simulation is run with only 10 repetitions, the resulting distributions are highly variable and differ substantially between runs. The small number of simulations leads to unstable estimates and noisy histograms, making the results poorly reproducible.\n", + "\n", + "Increasing the number of repetitions to 100 reduces variability and produces smoother distributions; however, noticeable differences between runs remain. This demonstrates that while larger sample sizes improve stability, randomness still influences the results when no reproducibility controls are applied.\n", + "\n", + "With 1,000 repetitions, the distributions become more stable, but repeated executions of the script still produce slightly different outputs due to the use of random sampling without a fixed seed." + ], + "metadata": { + "id": "Ayqm_ss_g7zK" + } + }, + { + "cell_type": "markdown", + "source": [ + "Question 3\n", + "\n", + "To ensure reproducibility, a fixed random seed was set using np.random.seed(42) at the beginning of the script. This change ensures that the sequence of random numbers generated during the simulation remains identical across runs.\n", + "\n", + "By fixing the random seed, the same individuals are selected for infection, the same tracing outcomes occur, and the resulting histograms are identical every time the script is executed. This modification does not remove randomness from the model but ensures that the randomness is controlled and reproducible, which is essential for scientific transparency and verification." + ], + "metadata": { + "id": "uTwLBWM5g-z1" + } + } + ] +} \ No newline at end of file