{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Pexp and qexp Tutorial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Motivation for Exponential Functions\n", "\n", "The Exponential distribution is used to model events that occur randomly and independently at a constant rate, such as customer arrivals. It is tailored for positive random variables often interpreted as the wait time for a specific event. This family of distributions is defined by a single parameter, typically representing either the mean wait time \\(β > 0\\) or its reciprocal, the average rate \\(λ > 0\\) at which an event happens.\n", "\n", "The Probability Density Function (PDF) of the exponential distribution illustrates the probability distribution of a continuous random variable, whereas the Cumulative Distribution Function (CDF), obtained through the integral of the PDF, conveys the probability that a random variable is equal to or less than a specified value.\n", "\n", "The functions pexp and qexp calculate the cumulative probability for a specified quantile and vice versa. Additionally, these functions allow you to plot both the PDF and CDF, providing a visual representation of the cumulative probability associated with a particular quantile. The CDF graph plots the cumulative probability against the specific quantile, while the PDF graph illustrates the cumulative probability up to that quantile through the area under the curve." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Usage of pexp and qexp\n", "\n", "In this section, we demonstrate the usage of `pexp` and `qexp` for addressing statistical questions concerning the exponential distribution. The dataset utilized in this tutorial is the `lung` dataset from the `survival` package in R, a comprehensive and widely utilized package for survival analysis. The package is publicly available and distributed under LGPL-2, LGPL-2.1, or LGPL-3 licenses, making it a popular resource in statistical analyses and academic research. For the purpose of this tutorial, we have exported the `lung` dataset from the `survival` package and saved it as a CSV file in the `docs/data/` directory to ensure ease of access and transparency in data usage.\n", "\n", "Specifically, the `lung` dataset includes data on the survival of patients with advanced lung cancer, featuring variables such as survival time, patient status, age, sex, and various clinical measures. This dataset's rich, real-world context makes it a go-to choice for demonstrating survival analysis techniques. In this tutorial, we will delve into the dataset, specifically focusing on the `time` variable, which typically represents the survival time of the patients." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
insttimestatusagesexph.ecogph.karnopat.karnomeal.calwt.loss
03.030627411.090.0100.01175.0NaN
13.045526810.090.090.01225.015.0
23.0101015610.090.090.0NaN15.0
35.021025711.090.060.01150.011.0
41.088326010.0100.090.0NaN0.0
\n", "
" ], "text/plain": [ " inst time status age sex ph.ecog ph.karno pat.karno meal.cal \\\n", "0 3.0 306 2 74 1 1.0 90.0 100.0 1175.0 \n", "1 3.0 455 2 68 1 0.0 90.0 90.0 1225.0 \n", "2 3.0 1010 1 56 1 0.0 90.0 90.0 NaN \n", "3 5.0 210 2 57 1 1.0 90.0 60.0 1150.0 \n", "4 1.0 883 2 60 1 0.0 100.0 90.0 NaN \n", "\n", " wt.loss \n", "0 NaN \n", "1 15.0 \n", "2 15.0 \n", "3 11.0 \n", "4 0.0 " ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "# Load the dataset\n", "file_path = \"../docs/data/lung_dataset.csv\"\n", "lung_df = pd.read_csv(file_path)\n", "lung_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's assume we want to answer two questions:\n", "\n", "- What is the cumulative probability of survival up to the median survival time?\n", "- What is the survival time above which only the top 5% of patients survive?\n", "\n", "First, let's look at the distribution of survival times. We can visualize this with a histogram and determine if it closely resembles an exponential distribution." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAHHCAYAAACle7JuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABHxUlEQVR4nO3deVyU5f7/8fcgMoAsLiiILIKYO1ZqRpmZSy5l5VJqWmq2a7mUFZXZcgrLSq1MPedXmqfcj9qqZq6n1FJzSTNzRxNF3EA44sL1+8MH83UEFXCGmdtez8djHo/u677muj9zMcK7e677HpsxxggAAMCCfDxdAAAAQEkRZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZAAAgGURZOAVXn31VdlstlI5VosWLdSiRQvH9tKlS2Wz2TRr1qxSOX6fPn1UvXr1UjlWSZ04cUIPP/ywIiIiZLPZNGjQIE+XpOrVq6tPnz6eLuOqVRrvS5vNpldffdUlY02aNEk2m027d+92yXiwLoIMXC7/F0z+w9/fX5GRkWrbtq0++OADZWVlueQ4+/fv16uvvqr169e7ZDxX8ubaiuKtt97SpEmT9MQTT+jf//63HnjggYv2rV69utPPu0qVKrrllls0Z86cYh93xYoVevXVV3Xs2LErqL7kvvvuuxL/oc0PxEX5w/rbb7+pa9euio2Nlb+/v6pVq6Y2bdroww8/LNGxrxYtWrRwei9d7OGqMISrg43vWoKrTZo0SX379tXrr7+uuLg4nT59WgcOHNDSpUu1cOFCxcTE6KuvvlJiYqLjOWfOnNGZM2fk7+9f5OOsWbNGTZo00cSJE4v1f+qnTp2SJPn5+Uk69wfotttu08yZM9W1a9cij1PS2k6fPq28vDzZ7XaXHMsdbrzxRvn6+urHH3+8bN/q1aurQoUKeuaZZySdC3ETJkzQzp07NW7cOD3++ONFPu67776roUOHateuXQXODuTm5srHx0dly5Yt1mspjgEDBmjs2LEqya/F/PdRYbWfb8WKFbrtttsUExOj3r17KyIiQnv37tWqVau0Y8cObd++/QpeQcmVxvvSZrNp+PDhFw0iCxcu1MGDBx3bq1ev1gcffKAXX3xRderUcbQnJiaqXr16On36tOx2e6mdzYV38vV0Abh6tW/fXo0bN3ZsJycna/Hixbrzzjt11113acuWLQoICJAk+fr6ytfXvW/HnJwcBQYGOgKMp7jzD7GrpKenq27dukXuX61aNfXq1cux/eCDDyohIUGjRo0qVpC5FG8OfsXx5ptvKjQ0VKtXr1b58uWd9qWnp7vsONnZ2SpXrlyR+3vD+7JNmzZO2/7+/vrggw/Upk0bp4+D85UpU6aUKoM346MllKqWLVtq2LBh2rNnjz7//HNHe2FrZBYuXKhmzZqpfPnyCgoKUq1atfTiiy9KOvd/v02aNJEk9e3b13HKedKkSZLOnaKuX7++1q5dq+bNmyswMNDx3AvXyOQ7e/asXnzxRUVERKhcuXK66667tHfvXqc+F1uncf6Yl6utsLUI2dnZeuaZZxQdHS273a5atWrp3XffLXBmwGazacCAAZo7d67q168vu92uevXqaf78+YVP+AXS09PVr18/hYeHy9/fXw0bNtRnn33m2J//8ciuXbv07bffOmov7jqEiIgI1alTR7t27ZIkbdy4UX369FF8fLz8/f0VERGhhx56SIcPH3Y859VXX9XQoUMlSXFxcQWOXdjcHzt2TIMGDXLMW0JCgt5++23l5eU5+uzevVs2m03vvvuu/vnPf6pGjRqy2+1q0qSJVq9e7ejXp08fjR07VpKcPsbIN23aNDVq1EjBwcEKCQlRgwYNNGbMmGLNiyTt2LFD9erVKxBiJKlKlSoF6s5/35zvwo9X8v/9/P7777r//vtVoUIFNWvWTO+++65sNpv27NlTYIzk5GT5+fnp6NGjjtef/748ffq0KlasqL59+xZ4XmZmpvz9/fXss89KOneG85VXXlGjRo0UGhqqcuXK6ZZbbtGSJUuKMSvFV9gamerVq+vOO+/U0qVL1bhxYwUEBKhBgwZaunSpJGn27Nlq0KCB/P391ahRI61bt67AuH/88Ye6du2qihUryt/fX40bN9ZXX33l1teCK8MZGZS6Bx54QC+++KK+//57PfLII4X22bx5s+68804lJibq9ddfl91u1/bt2/XTTz9JkurUqaPXX39dr7zyih599FHdcsstkqSbbrrJMcbhw4fVvn17de/eXb169VJ4ePgl63rzzTdls9n0/PPPKz09XaNHj1br1q21fv16x5mjoihKbeczxuiuu+7SkiVL1K9fP1177bVasGCBhg4dqr/++kujRo1y6v/jjz9q9uzZevLJJxUcHKwPPvhAXbp0UWpqqipVqnTRuv73v/+pRYsW2r59uwYMGKC4uDjNnDlTffr00bFjxzRw4EDVqVNH//73vzV48GBFRUU5Pi6qXLlykV+/dO4P4d69ex31LFy4UDt37lTfvn0VERGhzZs365///Kc2b96sVatWyWazqXPnzvrzzz81depUjRo1SmFhYZc8dk5Ojm699Vb99ddfeuyxxxQTE6MVK1YoOTlZaWlpGj16tFP/KVOmKCsrS4899phsNpveeecdde7cWTt37lTZsmX12GOPaf/+/Vq4cKH+/e9/Oz134cKF6tGjh1q1aqW3335bkrRlyxb99NNPGjhwYLHmJjY2VitXrtSmTZtUv379Yj33cu69917VrFlTb731lowxuvPOO/Xcc89pxowZjpCYb8aMGbr99ttVoUKFAuOULVtWnTp10uzZszVhwgSns5hz585Vbm6uunfvLulcsPl//+//qUePHnrkkUeUlZWlTz75RG3bttUvv/yia6+91qWv8XK2b9+u+++/X4899ph69eqld999Vx07dtT48eP14osv6sknn5QkpaSk6L777tPWrVvl43Pu/+k3b96sm2++WdWqVdMLL7ygcuXKacaMGbrnnnv0n//8R506dSrV14IiMoCLTZw40Ugyq1evvmif0NBQc9111zm2hw8fbs5/O44aNcpIMocOHbroGKtXrzaSzMSJEwvsu/XWW40kM378+EL33XrrrY7tJUuWGEmmWrVqJjMz09E+Y8YMI8mMGTPG0RYbG2t69+592TEvVVvv3r1NbGysY3vu3LlGkvnHP/7h1K9r167GZrOZ7du3O9okGT8/P6e2DRs2GEnmww8/LHCs840ePdpIMp9//rmj7dSpUyYpKckEBQU5vfbY2Fhzxx13XHK88/vefvvt5tChQ+bQoUNmw4YNpnv37kaSeeqpp4wxxuTk5BR43tSpU40ks3z5ckfbyJEjjSSza9euQo9z/ty/8cYbply5cubPP/906vfCCy+YMmXKmNTUVGOMMbt27TKSTKVKlcyRI0cc/b788ksjyXz99deOtv79+5vCfi0OHDjQhISEmDNnzhRpTi7l+++/N2XKlDFlypQxSUlJ5rnnnjMLFiwwp06dcuqXX3dh7yFJZvjw4Y7t/H8/PXr0KNA3KSnJNGrUyKntl19+MZLM5MmTHW0Xvi8X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1VeXvIvv66+/ruXLl+uOO+5QbGys0tPT9fHHHysqKkrNmjWTdC5UlC9fXuPHj1dwcLDKlSunpk2bFrpOoCgqVqyoZs2aqW/fvjp48KBGjx6thIQEp0vEH374Yc2aNUvt2rXTfffdpx07dujzzz93Wnxb3No6duyo2267TS+99JJ2796thg0b6vvvv9eXX36pQYMGFRi7pB599FFNmDBBffr00dq1a1W9enXNmjVLP/30k0aPHn3JNUtXIiQkRM2bN9c777yj06dPq1q1avr+++8d95g5X6NGjSRJL730krp3766yZcuqY8eOhf7RHTp0qL766ivdeeed6tOnjxo1aqTs7Gz99ttvmjVrlnbv3u24hLuo8o//9NNPq23btipTpoy6d++uhx9+WEeOHFHLli0VFRWlPXv26MMPP9S1117rdMfZonjqqaeUk5OjTp06qXbt2jp16pRWrFih6dOnq3r16k4L1B9++GGNGDFCDz/8sBo3bqzly5frzz//LNbxpHN/pG+77Ta9//77ysrKKhBGLqVbt2768MMPNXz4cDVo0KDA673zzjs1e/ZsderUSXfccYd27dql8ePHq27dujpx4kSxa/WksWPHqlmzZmrQoIEeeeQRxcfH6+DBg1q5cqX27dunDRs2eLpEFMZTl0vh6pV/WWT+w8/Pz0RERJg2bdqYMWPGOF3mm+/Cy68XLVpk7r77bhMZGWn8/PxMZGSk6dGjR4FLbb/88ktTt25d4+vr63Sp6q233mrq1atXaH0Xu/x66tSpJjk52VSpUsUEBASYO+64w+lyzXzvvfeeqVatmrHb7ebmm282a9asKTDmpWq78DJXY4zJysoygwcPNpGRkaZs2bKmZs2aZuTIkSYvL8+pnyTTv3//AjVd7LLwCx08eND07dvXhIWFGT8/P9OgQYNCL+8t7uXXl+u7b98+06lTJ1O+fHkTGhpq7r33XrN///5CL8d94403TLVq1YyPj4/T5bWFvcasrCyTnJxsEhISjJ+fnwkLCzM33XSTeffddx2XM+dfxjxy5MgCdV14/DNnzpinnnrKVK5c2dhsNsd7ctasWeb22283VapUMX5+fiYmJsY89thjJi0trUhzdL558+aZhx56yNSuXdsEBQUZPz8/k5CQYJ566ilz8OBBp745OTmmX79+JjQ01AQHB5v77rvPpKenX/Ty60vdruBf//qXkWSCg4PN//73vwL7C3tfGnPu8uPo6OhCbxGQv/+tt94ysbGxxm63m+uuu8588803hY5X2M/7Ukpy+XVh78XC/t1c7H2xY8cO8+CDD5qIiAhTtmxZU61aNXPnnXeaWbNmFblulC6+awkAAFgWa2QAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlXfU3xMvLy9P+/fsVHBzs8lvaAwAA9zDGKCsrS5GRkQW+7PZ8V32Q2b9/f4FvPQUAANawd+9eRUVFXXT/VR9k8m+7vnfv3kt+ZT0AAPAemZmZio6OvuzXp1z1QSb/46SQkBCCDAAAFnO5ZSEs9gUAAJblNUFmxIgRstlsGjRokKPt5MmT6t+/vypVqqSgoCB16dJFBw8e9FyRAADAq3hFkFm9erUmTJigxMREp/bBgwfr66+/1syZM7Vs2TLt379fnTt39lCVAADA23g8yJw4cUI9e/bUv/71L1WoUMHRfvz4cX3yySd6//331bJlSzVq1EgTJ07UihUrtGrVKg9WDAAAvIXHg0z//v11xx13qHXr1k7ta9eu1enTp53aa9eurZiYGK1cubK0ywQAAF7Io1ctTZs2Tb/++qtWr15dYN+BAwfk5+en8uXLO7WHh4frwIEDFx0zNzdXubm5ju3MzEyX1QsAALyLx87I7N27VwMHDtQXX3whf39/l42bkpKi0NBQx4Ob4QEAcPXyWJBZu3at0tPTdf3118vX11e+vr5atmyZPvjgA/n6+io8PFynTp3SsWPHnJ538OBBRUREXHTc5ORkHT9+3PHYu3evm18JAADwFI99tNSqVSv99ttvTm19+/ZV7dq19fzzzys6Olply5bVokWL1KVLF0nS1q1blZqaqqSkpIuOa7fbZbfb3Vo7AADwDh4LMsHBwapfv75TW7ly5VSpUiVHe79+/TRkyBBVrFhRISEheuqpp5SUlKQbb7zREyUDAAAv49VfUTBq1Cj5+PioS5cuys3NVdu2bfXxxx97uiwAAOAlbMYY4+ki3CkzM1OhoaE6fvw437UEAIBFFPXvt8fvIwMAAFBSBBkAAGBZXr1GBtaSmpqqjIwMt4wdFhammJgYt4wNALAuggxcIjU1VXXq1FFOTo5bxg8MDNSWLVsIMwAAJwQZuERGRoZycnI0cORHiopPcOnY+3Zu15ihA5SRkUGQAQA4IcjApaLiExRfL9HTZQAA/iZY7AsAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACyLIAMAACzLo0Fm3LhxSkxMVEhIiEJCQpSUlKR58+Y59rdo0UI2m83p8fjjj3uwYgAA4E18PXnwqKgojRgxQjVr1pQxRp999pnuvvturVu3TvXq1ZMkPfLII3r99dcdzwkMDPRUuQAAwMt4NMh07NjRafvNN9/UuHHjtGrVKkeQCQwMVEREhCfKAwAAXs5r1sicPXtW06ZNU3Z2tpKSkhztX3zxhcLCwlS/fn0lJycrJyfnkuPk5uYqMzPT6QEAAK5OHj0jI0m//fabkpKSdPLkSQUFBWnOnDmqW7euJOn+++9XbGysIiMjtXHjRj3//PPaunWrZs+efdHxUlJS9Nprr5VW+QAAwIM8HmRq1aql9evX6/jx45o1a5Z69+6tZcuWqW7dunr00Ucd/Ro0aKCqVauqVatW2rFjh2rUqFHoeMnJyRoyZIhjOzMzU9HR0W5/HQAAoPR5PMj4+fkpISFBktSoUSOtXr1aY8aM0YQJEwr0bdq0qSRp+/btFw0ydrtddrvdfQUDAACv4TVrZPLl5eUpNze30H3r16+XJFWtWrUUKwIAAN7Ko2dkkpOT1b59e8XExCgrK0tTpkzR0qVLtWDBAu3YsUNTpkxRhw4dVKlSJW3cuFGDBw9W8+bNlZiY6MmyAQCAl/BokElPT9eDDz6otLQ0hYaGKjExUQsWLFCbNm20d+9e/fDDDxo9erSys7MVHR2tLl266OWXX/ZkyQAAwIt4NMh88sknF90XHR2tZcuWlWI1AADAarxujQwAAEBREWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBlEWQAAIBleTTIjBs3TomJiQoJCVFISIiSkpI0b948x/6TJ0+qf//+qlSpkoKCgtSlSxcdPHjQgxUDAABv4tEgExUVpREjRmjt2rVas2aNWrZsqbvvvlubN2+WJA0ePFhff/21Zs6cqWXLlmn//v3q3LmzJ0sGAABexNeTB+/YsaPT9ptvvqlx48Zp1apVioqK0ieffKIpU6aoZcuWkqSJEyeqTp06WrVqlW688UZPlAwAALyIR4PM+c6ePauZM2cqOztbSUlJWrt2rU6fPq3WrVs7+tSuXVsxMTFauXLlRYNMbm6ucnNzHduZmZlurx3WlZqaqoyMDLeMHRYWppiYGLeMDQA4x+NB5rffflNSUpJOnjypoKAgzZkzR3Xr1tX69evl5+en8uXLO/UPDw/XgQMHLjpeSkqKXnvtNTdXjatBamqq6tSpo5ycHLeMHxgYqC1bthBmAMCNPB5katWqpfXr1+v48eOaNWuWevfurWXLlpV4vOTkZA0ZMsSxnZmZqejoaFeUiqtMRkaGcnJyNHDkR4qKT3Dp2Pt2bteYoQOUkZFBkAEAN/J4kPHz81NCwrk/Io0aNdLq1as1ZswYdevWTadOndKxY8eczsocPHhQERERFx3PbrfLbre7u2xcRaLiExRfL9HTZQAASsDr7iOTl5en3NxcNWrUSGXLltWiRYsc+7Zu3arU1FQlJSV5sEIAAOAtPHpGJjk5We3bt1dMTIyysrI0ZcoULV26VAsWLFBoaKj69eunIUOGqGLFigoJCdFTTz2lpKQkrlgCAACSPBxk0tPT9eCDDyotLU2hoaFKTEzUggUL1KZNG0nSqFGj5OPjoy5duig3N1dt27bVxx9/7MmSAQCAF/FokPnkk08uud/f319jx47V2LFjS6kiAABgJV63RgYAAKCoCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyCDIAAMCyPBpkUlJS1KRJEwUHB6tKlSq65557tHXrVqc+LVq0kM1mc3o8/vjjHqoYAAB4E48GmWXLlql///5atWqVFi5cqNOnT+v2229Xdna2U79HHnlEaWlpjsc777zjoYoBAIA38fXkwefPn++0PWnSJFWpUkVr165V8+bNHe2BgYGKiIgo7fIAAICX86o1MsePH5ckVaxY0an9iy++UFhYmOrXr6/k5GTl5ORcdIzc3FxlZmY6PQAAwNXJo2dkzpeXl6dBgwbp5ptvVv369R3t999/v2JjYxUZGamNGzfq+eef19atWzV79uxCx0lJSdFrr71WWmUDAAAP8pog079/f23atEk//vijU/ujjz7q+O8GDRqoatWqatWqlXbs2KEaNWoUGCc5OVlDhgxxbGdmZio6Otp9hQMAAI/xiiAzYMAAffPNN1q+fLmioqIu2bdp06aSpO3btxcaZOx2u+x2u1vqBAAA3sWjQcYYo6eeekpz5szR0qVLFRcXd9nnrF+/XpJUtWpVN1cHAAC8nUeDTP/+/TVlyhR9+eWXCg4O1oEDByRJoaGhCggI0I4dOzRlyhR16NBBlSpV0saNGzV48GA1b95ciYmJniwdAAB4AY8GmXHjxkk6d9O7802cOFF9+vSRn5+ffvjhB40ePVrZ2dmKjo5Wly5d9PLLL3ugWgAA4G08/tHSpURHR2vZsmWlVA0AALAar7qPDAAAQHGU6IzMzp07FR8f7+pagEvasmWLV48HACh9JQoyCQkJuvXWW9WvXz917dpV/v7+rq4LcDh6KF02Hx/16tXL06UAALxMiYLMr7/+qokTJ2rIkCEaMGCAunXrpn79+umGG25wdX2AsrOOy+TlaeDIjxQVn+CycX9dvkRTx7ztsvEAAKWvREHm2muv1ZgxY/Tee+/pq6++0qRJk9SsWTNdc801euihh/TAAw+ocuXKrq4Vf3NR8QmKr+e6y+737dzmsrEAAJ5xRYt9fX191blzZ82cOVNvv/22tm/frmeffVbR0dF68MEHlZaW5qo6AQAACriiILNmzRo9+eSTqlq1qt5//309++yz2rFjhxYuXKj9+/fr7rvvdlWdAAAABZToo6X3339fEydO1NatW9WhQwdNnjxZHTp0kI/PuVwUFxenSZMmqXr16q6sFQAAwEmJgsy4ceP00EMPqU+fPhf9zqMqVarok08+uaLiAAAALqVEQWbbtssvkvTz81Pv3r1LMjwAAECRlGiNzMSJEzVz5swC7TNnztRnn312xUUBAAAURYmCTEpKisLCwgq0V6lSRW+99dYVFwUAAFAUJQoyqampiouLK9AeGxur1NTUKy4KAACgKEoUZKpUqaKNGzcWaN+wYYMqVap0xUUBAAAURYmCTI8ePfT0009ryZIlOnv2rM6ePavFixdr4MCB6t69u6trBAAAKFSJrlp64403tHv3brVq1Uq+vueGyMvL04MPPsgaGQAAUGpKFGT8/Pw0ffp0vfHGG9qwYYMCAgLUoEEDxcbGuro+AACAiypRkMl3zTXX6JprrnFVLQAAAMVSoiBz9uxZTZo0SYsWLVJ6erry8vKc9i9evNglxQEAAFxKiYLMwIEDNWnSJN1xxx2qX7++bDabq+sCAAC4rBIFmWnTpmnGjBnq0KGDq+sBAAAoshJdfu3n56eEhARX1wIAAFAsJQoyzzzzjMaMGSNjjKvrAQAAKLISfbT0448/asmSJZo3b57q1aunsmXLOu2fPXu2S4oDAAC4lBIFmfLly6tTp06urgUAAKBYShRkJk6c6Oo6AAAAiq1Ea2Qk6cyZM/rhhx80YcIEZWVlSZL279+vEydOuKw4AACASynRGZk9e/aoXbt2Sk1NVW5urtq0aaPg4GC9/fbbys3N1fjx411dJwAAQAElOiMzcOBANW7cWEePHlVAQICjvVOnTlq0aJHLigMAALiUEp2R+e9//6sVK1bIz8/Pqb169er666+/XFIYAADA5ZTojExeXp7Onj1boH3fvn0KDg6+4qIAAACKokRB5vbbb9fo0aMd2zabTSdOnNDw4cP52gIAAFBqSvTR0nvvvae2bduqbt26OnnypO6//35t27ZNYWFhmjp1qqtrBAAAKFSJgkxUVJQ2bNigadOmaePGjTpx4oT69eunnj17Oi3+BQAAcKcSBRlJ8vX1Va9eva7o4CkpKZo9e7b++OMPBQQE6KabbtLbb7+tWrVqOfqcPHlSzzzzjKZNm6bc3Fy1bdtWH3/8scLDw6/o2AAAwPpKFGQmT558yf0PPvhgkcZZtmyZ+vfvryZNmujMmTN68cUXdfvtt+v3339XuXLlJEmDBw/Wt99+q5kzZyo0NFQDBgxQ586d9dNPP5WkdAAAcBUpUZAZOHCg0/bp06eVk5MjPz8/BQYGFjnIzJ8/32l70qRJqlKlitauXavmzZvr+PHj+uSTTzRlyhS1bNlS0rmvR6hTp45WrVqlG2+8sSTlAwCAq0SJgszRo0cLtG3btk1PPPGEhg4dWuJijh8/LkmqWLGiJGnt2rU6ffq0Wrdu7ehTu3ZtxcTEaOXKlYUGmdzcXOXm5jq2MzMzS1yPJ6WmpiojI8MtY4eFhSkmJsYtYwMAUJpKvEbmQjVr1tSIESPUq1cv/fHHH8V+fl5engYNGqSbb75Z9evXlyQdOHBAfn5+Kl++vFPf8PBwHThwoNBxUlJS9NprrxX7+N4kNTVVderUUU5OjlvGDwwM1JYtWwgzAADLc1mQkc4tAN6/f3+Jntu/f39t2rRJP/744xXVkJycrCFDhji2MzMzFR0dfUVjlraMjAzl5ORo4MiPFBWf4NKx9+3crjFDBygjI4MgAwCwvBIFma+++spp2xijtLQ0ffTRR7r55puLPd6AAQP0zTffaPny5YqKinK0R0RE6NSpUzp27JjTWZmDBw8qIiKi0LHsdrvsdnuxa/BGUfEJiq+X6OkyAADwWiUKMvfcc4/Tts1mU+XKldWyZUu99957RR7HGKOnnnpKc+bM0dKlSxUXF+e0v1GjRipbtqwWLVqkLl26SJK2bt2q1NRUJSUllaR0AABwFSlRkMnLy3PJwfv3768pU6boyy+/VHBwsGPdS2hoqAICAhQaGqp+/fppyJAhqlixokJCQvTUU08pKSmJK5YAAIBr18gU17hx4yRJLVq0cGqfOHGi+vTpI0kaNWqUfHx81KVLF6cb4gEAAJQoyJy/mPZy3n///YvuM8Zc9vn+/v4aO3asxo4dW+RjAgCAv4cSBZl169Zp3bp1On36tOPrBP7880+VKVNG119/vaOfzWZzTZUAAACFKFGQ6dixo4KDg/XZZ5+pQoUKks7dJK9v37665ZZb9Mwzz7i0SAAAgML4lORJ7733nlJSUhwhRpIqVKigf/zjH8W6agkAAOBKlCjIZGZm6tChQwXaDx06pKysrCsuCgAAoChKFGQ6deqkvn37avbs2dq3b5/27dun//znP+rXr586d+7s6hoBAAAKVaI1MuPHj9ezzz6r+++/X6dPnz43kK+v+vXrp5EjR7q0QAAAgIspUZAJDAzUxx9/rJEjR2rHjh2SpBo1aqhcuXIuLQ4AAOBSSvTRUr60tDSlpaWpZs2aKleuXJHuCwMAAOAqJQoyhw8fVqtWrXTNNdeoQ4cOSktLkyT169ePS68BAECpKVGQGTx4sMqWLavU1FQFBgY62rt166b58+e7rDgAAIBLKdEame+//14LFixQVFSUU3vNmjW1Z88elxQG99qyZYtXjwcAQFGUKMhkZ2c7nYnJd+TIEdnt9isuCu5z9FC6bD4+6tWrl6dLAQDgipUoyNxyyy2aPHmy3njjDUnnvlMpLy9P77zzjm677TaXFgjXys46LpOXp4EjP1JUfILLxv11+RJNHfO2y8YDAKAoShRk3nnnHbVq1Upr1qzRqVOn9Nxzz2nz5s06cuSIfvrpJ1fXCDeIik9QfL1El423b+c2l40FAEBRlWixb/369fXnn3+qWbNmuvvuu5Wdna3OnTtr3bp1qlGjhqtrBAAAKFSxz8icPn1a7dq10/jx4/XSSy+5oyYAAIAiKfYZmbJly2rjxo3uqAUAAKBYSvTRUq9evfTJJ5+4uhYAAIBiKdFi3zNnzujTTz/VDz/8oEaNGhX4jqX333/fJcUBAABcSrGCzM6dO1W9enVt2rRJ119/vSTpzz//dOpjs9lcVx0AAMAlFCvI1KxZU2lpaVqyZImkc19J8MEHHyg8PNwtxQEAAFxKsdbIXPjt1vPmzVN2drZLCwIAACiqEi32zXdhsAEAAChNxQoyNputwBoY1sQAAABPKdYaGWOM+vTp4/hiyJMnT+rxxx8vcNXS7NmzXVchAADARRQryPTu3dtpm29QBgAAnlSsIDNx4kR31QEAAFBsV7TYFwAAwJMIMgAAwLIIMgAAwLIIMgAAwLIIMgAAwLIIMgAAwLIIMgAAwLI8GmSWL1+ujh07KjIyUjabTXPnznXa36dPH8fXIuQ/2rVr55liAQCA1/FokMnOzlbDhg01duzYi/Zp166d0tLSHI+pU6eWYoUAAMCbFevOvq7Wvn17tW/f/pJ97Ha7IiIiSqkiAABgJV6/Rmbp0qWqUqWKatWqpSeeeEKHDx++ZP/c3FxlZmY6PQAAwNXJq4NMu3btNHnyZC1atEhvv/22li1bpvbt2+vs2bMXfU5KSopCQ0Mdj+jo6FKsGAAAlCaPfrR0Od27d3f8d4MGDZSYmKgaNWpo6dKlatWqVaHPSU5O1pAhQxzbmZmZhBkAAK5SXn1G5kLx8fEKCwvT9u3bL9rHbrcrJCTE6QEAAK5Olgoy+/bt0+HDh1W1alVPlwIAALyARz9aOnHihNPZlV27dmn9+vWqWLGiKlasqNdee01dunRRRESEduzYoeeee04JCQlq27atB6sGAADewqNBZs2aNbrtttsc2/lrW3r37q1x48Zp48aN+uyzz3Ts2DFFRkbq9ttv1xtvvCG73e6pkgEAgBfxaJBp0aKFjDEX3b9gwYJSrAYAAFiNpdbIAAAAnM+rL7/2dqmpqcrIyHD5uFu2bHH5mLh6uOt9J0lhYWGKiYlxy9gA4A4EmRJKTU1VnTp1lJOT4+lS8Dfi7vddYGCgtmzZQpgBYBkEmRLKyMhQTk6OBo78SFHxCS4d+9flSzR1zNsuHRNXB3e+7/bt3K4xQwcoIyODIAPAMggyVygqPkHx9RJdOua+ndtcOh6uPu543wGAFbHYFwAAWBZBBgAAWBZBBgAAWBZBBgAAWBZBBgAAWBZXLQFu5OqbG5bGzRLdcQxutAfAXQgygBscPZQum4+PevXq5elSisydNXOjPQDuQpAB3CA767hMXp7Lb1znzpsluqtmbrQHwJ0IMoAbufrGdaVxs0RutgfASljsCwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALIsgAwAALMvX0wUAwJVITU1VRkaGy8cNCwtTTEyMy8cF4FoEGQCWlZqaqjp16ignJ8flYwcGBmrLli2EGcDLEWQAWFZGRoZycnI0cORHiopPcNm4+3Zu15ihA5SRkUGQAbwcQQaA5UXFJyi+XqKnywDgASz2BQAAlkWQAQAAluXRILN8+XJ17NhRkZGRstlsmjt3rtN+Y4xeeeUVVa1aVQEBAWrdurW2bdvmmWIBAIDX8WiQyc7OVsOGDTV27NhC97/zzjv64IMPNH78eP38888qV66c2rZtq5MnT5ZypQAAwBt5dLFv+/bt1b59+0L3GWM0evRovfzyy7r77rslSZMnT1Z4eLjmzp2r7t27l2apAADAC3ntGpldu3bpwIEDat26taMtNDRUTZs21cqVKy/6vNzcXGVmZjo9AADA1clrg8yBAwckSeHh4U7t4eHhjn2FSUlJUWhoqOMRHR3t1joBAIDneG2QKank5GQdP37c8di7d6+nSwIAAG7itUEmIiJCknTw4EGn9oMHDzr2FcZutyskJMTpAQAArk5eG2Ti4uIUERGhRYsWOdoyMzP1888/KykpyYOVAQAAb+HRq5ZOnDih7du3O7Z37dql9evXq2LFioqJidGgQYP0j3/8QzVr1lRcXJyGDRumyMhI3XPPPZ4rGgAAeA2PBpk1a9botttuc2wPGTJEktS7d29NmjRJzz33nLKzs/Xoo4/q2LFjatasmebPny9/f39PlQwAALyIR4NMixYtZIy56H6bzabXX39dr7/+eilWBQAArMJr18gAAABcDkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYFkEGAABYllcHmVdffVU2m83pUbt2bU+XBQAAvISvpwu4nHr16umHH35wbPv6en3JAACglHh9KvD19VVERISnywAAAF7Iqz9akqRt27YpMjJS8fHx6tmzp1JTUz1dEgAA8BJefUamadOmmjRpkmrVqqW0tDS99tpruuWWW7Rp0yYFBwcX+pzc3Fzl5uY6tjMzM0urXABXmS1btrhl3NzcXNntdreMHRYWppiYGJePm5qaqoyMDJePK7mvZvw9eHWQad++veO/ExMT1bRpU8XGxmrGjBnq169foc9JSUnRa6+9VlolArgKHT2ULpuPj3r16uWW8X18fJSXl+eWsQMDA7VlyxaXBoPU1FTVqVNHOTk5LhvzfO6oGX8fXh1kLlS+fHldc8012r59+0X7JCcna8iQIY7tzMxMRUdHl0Z5AK4S2VnHZfLyNHDkR4qKT3Dp2L8uX6KpY952y9j7dm7XmKEDlJGR4dJQkJGRoZycHEvVjL8PSwWZEydOaMeOHXrggQcu2sdut7vtlC2Av5eo+ATF10t06Zj7dm5z29juZsWacfXz6sW+zz77rJYtW6bdu3drxYoV6tSp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eSYiIsKMHDnS0Xbs2DFjt9vN1KlTjTHG/P7770aSWb16taPPvHnzjM1mM3/99Zf7ireIO+64wzz00ENObZ07dzY9e/Y0xjDHV+rCIOOq+fz4449NhQoVnH5PPP/886ZWrVpufkXn8NFSEZ06dUpr165V69atHW0+Pj5q3bq1Vq5c6cHKrOn48eOSpIoVK0qS1q5dq9OnTzvNb+3atRUTE+OY35UrV6pBgwZOd3Vu27atMjMztXnz5lKs3nv1799fd9xxh9M8SsyvK3z11Vdq3Lix7r33XlWpUkXXXXed/vWvfzn279q1SwcOHHCa49DQUDVt2tRpjsuXL6/GjRs7+rRu3Vo+Pj76+eefS+/FeKmbbrpJixYt0p9//ilJ2rBhg3788Ue1b99eEnPsaq6az5UrV6p58+by8/Nz9Gnbtq22bt2qo0ePuv11WOLOvt4gIyNDZ8+eLfDVCOHh4frjjz88VJU15eXladCgQbr55ptVv359SdKBAwfk5+dX4As+w8PDdeDAAUefwuY/f9/f3bRp0/Trr79q9erVBfYxv1du586dGjdunIYMGaIXX3xRq1ev1tNPPy0/Pz/17t3bMUeFzeH5c1ylShWn/b6+vqpYsSJzLOmFF15QZmamateurTJlyujs2bN688031bNnT0lijl3MVfN54MABxcXFFRgjf1+FChXcUr+jHreODhSif//+2rRpk3788UdPl3LV2Lt3rwYOHKiFCxfK39/f0+VclfLy8tS4cWO99dZbkqTrrrtOmzZt0vjx49W7d28PV3d1mDFjhr744gtNmTJF9erV0/r16zVo0CBFRkYyx7goPloqorCwMJUpU6bAVR4HDx5URESEh6qyngEDBuibb77RkiVLFBUV5WiPiIjQqVOndOzYMaf+589vREREofOfv+/vbO3atUpPT9f1118vX19f+fr6atmyZfrggw/k6+ur8PBw5vcKVa1aVXXr1nVqq1OnjlJTUyX93xxd6ndERESE0tPTnfafOXNGR44cYY4lDR06VC+88IK6d++uBg0a6IEHHtDgwYOVkpIiiTl2NVfNp6d/dxBkisjPz0+NGjXSokWLHG15eXlatGiRkpKSPFiZNRhjNGDAAM2ZM0eLFy8ucBqyUaNGKlu2rNP8bt26VampqY75TUpK0m+//eb0j2rhwoUKCQkp8Afm76ZVq1b67bfftH79esejcePG6tmzp+O/md8rc/PNNxe4ZcCff/6p2NhYSVJcXJwiIiKc5jgzM1M///yz0xwfO3ZMa9eudfRZvHix8vLy1LRp01J4Fd4tJydHPj7Of5bKlCmjvLw8Scyxq7lqPpOSkrR8+XKdPn3a0WfhwoWqVauW2z9WksTl18Uxbdo0Y7fbzaRJk8zvv/9uHn30UVO+fHmnqzxQuCeeeMKEhoaapUuXmrS0NMcjJyfH0efxxx83MTExZvHixWbNmjUmKSnJJCUlOfbnXx58++23m/Xr15v58+ebypUrc3nwRZx/1ZIxzO+V+uWXX4yvr6958803zbZt28wXX3xhAgMDzeeff+7oM2LECFO+fHnz5Zdfmo0bN5q777670EtZr7vuOvPzzz+bH3/80dSsWfNve2nwhXr37m2qVavmuPx69uzZJiwszDz33HOOPsxx8WRlZZl169aZdevWGUnm/fffN+vWrTN79uwxxrhmPo8dO2bCw8PNAw88YDZt2mSmTZtmAgMDufzaW3344YcmJibG+Pn5mRtuuMGsWrXK0yVZgqRCHxMnTnT0+d///meefPJJU6FCBRMYGGg6depk0tLSnMbZvXu3ad++vQkICDBhYWHmmWeeMadPny7lV2MNFwYZ5vfKff3116Z+/frGbreb2rVrm3/+859O+/Py8sywYcNMeHi4sdvtplWrVmbr1q1OfQ4fPmx69OhhgoKCTEhIiOnbt6/JysoqzZfhtTIzM83AgQNNTEyM8ff3N/Hx8eall15yuqyXOS6eJUuWFPq7t3fv3sYY183nhg0bTLNmzYzdbjfVqlUzI0aMKK2XaGzGnHfLRAAAAAthjQwAALAsggwAALAsggwAALAsggwAALAsggwAALAsggwAALAsggwAALAsggwAj1u6dKlsNluB74K6Eq+++qquvfbaEj9/9+7dstlsWr9+vctqAuB6BBkAkqRDhw7piSeeUExMjOx2uyIiItS2bVv99NNPbj/2TTfdpLS0NIWGhrr9WNK5kGOz2S75iI6OVlpamurXr18qNQEoGV9PFwDAO3Tp0kWnTp3SZ599pvj4eB08eFCLFi3S4cOHSzymMUZnz56Vr++lf9X4+fmV6jcTP/vss3r88ccd202aNNGjjz6qRx55xNFWpkwZvi0ZsADOyADQsWPH9N///ldvv/22brvtNsXGxuqGG25QcnKy7rrrLkmFf9Ry7Ngx2Ww2LV26VNL/fUQ0b948NWrUSHa7XZ9++qlsNpv++OMPp2OOGjVKNWrUcHresWPHlJmZqYCAAM2bN8+p/5w5cxQcHKycnBxJ0vPPP69rrrlGgYGBio+P17Bhw5y+ffdSgoKCFBER4XiUKVNGwcHBTm0Xvt78GhcsWKDrrrtOAQEBatmypdLT0zVv3jzVqVNHISEhuv/++x01SlJeXp5SUlIUFxengIAANWzYULNmzSryzwbApRFkACgoKEhBQUGaO3eucnNzr3i8F154QSNGjNCWLVvUtWtXNW7cWF988YVTny+++EL3339/geeGhITozjvv1JQpUwr0v+eeexQYGChJCg4O1qRJk/T7779rzJgx+te//qVRo0Zdce2X8+qrr+qjjz7SihUrtHfvXt13330aPXq0pkyZom+//Vbff/+9PvzwQ0f/lJQUTZ48WePHj9fmzZs1ePBg9erVS8uWLXN7rcDfQql9PSUArzZr1ixToUIF4+/vb2666SaTnJxsNmzY4Ni/a9cuI8msW7fO0Xb06FEjySxZssQY83/ftDt37lynsUeNGmVq1Kjh2N66dauRZLZs2eL0vKNHjxpjjJkzZ44JCgoy2dnZxhhjjh8/bvz9/c28efMuWv/IkSNNo0aNHNvDhw83DRs2LNJrj42NNaNGjXJqu/D15tf4ww8/OPqkpKQYSWbHjh2Otscee8y0bdvWGGPMyZMnTWBgoFmxYoXT2P369TM9evQoUm0ALo0zMgAknVsjs3//fn311Vdq166dli5dquuvv16TJk0q9liNGzd22u7evbt2796tVatWSTp3duX6669X7dq1C31+hw4dVLZsWX311VeSpP/85z8KCQlR69atHX2mT5+um2++WREREQoKCtLLL7+s1NTUYtdaXImJiY7/Dg8Pd3y0dX5benq6JGn79u3KyclRmzZtHGe9goKCNHnyZO3YscPttQJ/BwQZAA7+/v5q06aNhg0bphUrVqhPnz4aPny4JMnH59yvC2OMo//F1qSUK1fOaTsiIkItW7Z0fFw0ZcoU9ezZ86J1+Pn5qWvXrk79u3Xr5lg0vHLlSvXs2VMdOnTQN998o3Xr1umll17SqVOnSvjKi65s2bKO/7bZbE7b+W15eXmSpBMnTkiSvv32W61fv97x+P3331knA7gIQQbARdWtW1fZ2dmSpMqVK0uS0tLSHPuLc4+Vnj17avr06Vq5cqV27typ7t27X7b//PnztXnzZi1evNgp+KxYsUKxsbF66aWX1LhxY9WsWVN79uwpxisrHXXr1pXdbldqaqoSEhKcHtHR0Z4uD7gqcPk1AB0+fFj33nuvHnroISUmJio4OFhr1qzRO++8o7vvvluSFBAQoBtvvFEjRoxQXFyc0tPT9fLLLxf5GJ07d9YTTzyhJ554QrfddpsiIyMv2b958+aKiIhQz549FRcXp6ZNmzr21axZU6mpqZo2bZqaNGmib7/9VnPmzCnZi3ej4OBgPfvssxo8eLDy8vLUrFkzHT9+XD/99JNCQkLUu3dvT5cIWB5nZAAoKChITZs21ahRo9S8eXPVr19fw4YN0yOPPKKPPvrI0e/TTz/VmTNn1KhRIw0aNEj/+Mc/inyM4OBgdezYURs2bLjkx0r5bDabevToUWj/u+66S4MHD9aAAQN07bXXasWKFRo2bFjRX3ApeuONNzRs2DClpKSoTp06ateunb799lvFxcV5ujTgqmAz53/gDQAAYCGckQEAAJZFkAEAAJZFkAEAAJZFkAEAAJZFkAEAAJZFkAEAAJZFkAEAAJZFkAEAAJZFkAEAAJZFkAEAAJZFkAEAAJZFkAEAAJb1/wG8oYO01aAz/AAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Visualize the distribution of survival times\n", "plt.hist(lung_df['time'], bins=20, color='lightblue', edgecolor='black')\n", "plt.title(\"Distribution of Patients' Survival Time\")\n", "plt.xlabel('Survival Time')\n", "plt.ylabel('Frequency')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the plot above, we could see the distribution closely resemble an exponential pattern, making it suitable for analysis using our pexp and qexp functions to address our statistical inquiries." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
QuantileCumulative probability
0255.50.567021
\n", "
" ], "text/plain": [ " Quantile Cumulative probability\n", "0 255.5 0.567021" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from mathdistops import pexp, qexp\n", "# Calculate the rate as the reciprocal of the mean time\n", "rate = 1 / lung_df['time'].mean()\n", "\n", "# Calculate the cumulative probability up to the median survival time\n", "q = lung_df['time'].median()\n", "df, fig = pexp(q, rate, graph=True)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's analyze the results and address the first question.\n", "\n", "Question: What is the cumulative probability of survival up to the median survival time?\n", "\n", "Answer: Based on the output from the `pexp` function, we find that the cumulative probability of survival up to the median survival time (255.5 days) is approximately 0.567 or 56.7%. This indicates that about 56.7% of patients in this dataset are expected to survive up to 255.5 days.\n", "\n", "(Note: we would anticipate the cumulative probability of the median to e 0.5. However, it's important to remember that the exponential distribution doesn't perfectly describe the data; it merely serves as an approximation. This explains why we observe a value of 0.567 instead of 0.5.)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.HConcatChart(...)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the output charts, the Probability Density Function (PDF) presents the distribution of survival times. The shaded area under the curve shows the cumulative probability of the median survival time of 255.5 days. On the Cumulative Distribution Function (CDF), the same vertical line intersects the curve, denoting that approximately 56.7% of patients are expected to survive up to this point. This visual distinction in the charts, with the shaded area under the PDF curve and the corresponding point on the CDF, provides a clear and intuitive understanding of the distribution of survival times and the cumulative probability up to the median survival time.\n", "\n", "Now, let's address the second question by using the qexp function to find the survival time above which only the top 5% of patients are expected to survive." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ProbabilityQuantile
00.95914.39472
\n", "
" ], "text/plain": [ " Probability Quantile\n", "0 0.95 914.39472" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Find the survival time corresponding to the top 5 percentile\n", "df, fig = qexp(0.95, rate=rate, graph=True)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output from the `qexp` function reveals the `quantile` value for the top 5% of patients, setting a survival time benchmark above which patients are considered to be among the longest survivors.\n", "\n", "Question: What is the threshold of survival time that marks the longest surviving top 5% of patients?\n", "\n", "Answer: The calculated `quantile` value from the `qexp` function indicates that patients surviving beyond 914.39472 days are within the top 5% in terms of survival time." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "" ], "text/plain": [ "alt.HConcatChart(...)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the chart from the `qexp` function, the top 5% survival time threshold is visualized as a horizontal dotted line at 914.39472 days on the `CDF` chart. The point where this line meets the cumulative distribution curve emphasizes that only 5% of patients survive longer than this time. In the PDF the 95% percentile corresponds to the blue shaded area under the PDF.\n", "\n", "Through this tutorial, we've navigated the practical applications of the `pexp` and `qexp` functions from our Python package, gaining both numerical insights and visual interpretations. We hope this tutorial serves as a valuable guide in your data analysis efforts, enabling you to use these functions to discover important patterns and make informed decisions in your work." ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:mathdistops]", "language": "python", "name": "conda-env-mathdistops-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.18" } }, "nbformat": 4, "nbformat_minor": 4 }