{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"<h1><center>RSNA Breast: 🧠 Full comprehension and EDA </center></h1>\n                                                      \n<center><img src = \"https://blogs.nvidia.com/wp-content/uploads/2018/01/AI_Mammographie.jpg\" width = \"375\" height = \"250\"/></center>                                                                          ","metadata":{}},{"cell_type":"markdown","source":"<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h3 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:maroon; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Please vote up if you find this notebook useful, it helps me stay motivated. Keep checking for further developments on this notebook, as it will be updated frequently.</center></h3>","metadata":{}},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:cyan; border:0; color:black' role=\"tab\" aria-controls=\"home\"><center>Contents</center></h2>","metadata":{}},{"cell_type":"markdown","source":"\n1. [**Introduction**](#1)\n    * 1.1 [Analysing the topic of the project](#2)\n        * 1.1.1 [What Is a Mammogram?](#2.1)\n        * 1.1.2 [Which advantages outweigh which risks?](#2.2)\n    * 1.2 [An understanding of dataset's variables](#3)\n    * 1.3 [Evalution Metrics](#1.2)\n    * 1.4 [Code requirements](#1.3)\n2. [📚 **Import Libraries**](#4)\n3. [🍚 **Dataset**](#5)\n    * 3.1 [Initial analysis](#6)\n        * 3.1.1 [First Impressions](#7)\n4. [🧠 **Exploratory Data Analysis (EDA)**](#8)\n    * 4.1 [Analyzing Unique Values](#9)\n        * 4.1.1 [Result 1](#10)\n    * 4.2 [Seprating variables to Numeric or Categorical](#11) \n    * 4.3 [Analyzing variables statistically](#12)\n        * 4.3.1 [Result 2](#12.1)\n5. [**Train Images**](#13)\n    * 5.1 [What is Dicom?](#14)\n    * 5.2 [Investigating the images](#15)\n6. [**References**](#references)   \n \n      ","metadata":{}},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:cyan; border:0; color:black' role=\"tab\" aria-controls=\"home\">\n1. Introduction <a id = 1></a>","metadata":{}},{"cell_type":"markdown","source":"<center><img src = \"https://greenimaging.net/wp-content/uploads/2018/02/greenimaging-screening-mammograpy-1.jpg\" width = \"750\" height = \"500\"/></center> \n","metadata":{}},{"cell_type":"markdown","source":"#### 1.1 Analysing the topic of the project <a id = 2></a>","metadata":{}},{"cell_type":"markdown","source":"#### 1.1.1 What Is a Mammogram? <a id = 2.1></a>","metadata":{}},{"cell_type":"markdown","source":"A mammogram is an X-ray picture of the breast.. Mammograms are used by doctors to look for breast cancer early symptoms. The best test available to doctors to detect breast cancer early, often **up to three years** before it can be felt, is a routine mammography.","metadata":{}},{"cell_type":"markdown","source":"#### 1.1.2 Which advantages outweigh which risks? <a id = 2.2></a>\n","metadata":{}},{"cell_type":"markdown","source":"**Advantages:**\n* Breast cancer fatality risk is decreased with screening mammography. All forms of breast cancer, including invasive ductal and invasive lobular cancer, can be found using it.\n* The screening mammogram increases a doctor's capacity to spot tiny cancers. The woman has more therapy options when the cancer is smaller.\n\n* The use of screening mammography promotes the diagnosis of ductal carcinoma in situ, which are small abnormal tissue growths restricted to the milk ducts of the breast (DCIS).\n* Following an x-ray examination, your body absorbs no radiation.\n\n**Risks:**\n* Radiation exposure can cause cancer in some cases.\n* False Positive Mammography. **5 to 15** percent of screening mammography need extra testing, such as ultrasonography or repeat mammograms. The majority of these tests come out clean. If there is an aberrant discovery, a biopsy or other testing may be necessary. The majority of the biopsies show no evidence of malignancy. A woman who receives yearly mammograms between the ages of **40 and 49** is thought to have a **30%** probability of experiencing a false-positive mammography at some point in that decade and a **7–8%** likelihood of undergoing a breast biopsy during that time.","metadata":{}},{"cell_type":"markdown","source":"#### 1.2 An understanding of dataset's variables <a id = 3></a>","metadata":{}},{"cell_type":"markdown","source":"**Varaible definitions in this dataset**\n* **_Age_** : Age of the patient in years\n\n* **site_id** : ID code for the source hospital.\n\n* **patient_id**: ID code for the patient.\n\n* **image_id**: ID code for the image.\n\n* **laterality**: Whether the image is of the left or right breast.\n\n* **view**: The orientation of the image. The default for a screening exam is to capture two views per breast.\n\n* **implant**: Whether or not the patient had breast implants. Site 1 only provides breast implant information at the patient level, not at the breast level.\n\n* **density**: A rating for how dense the breast tissue is, with A being the least dense and D being the most dense. Extremely dense tissue can make diagnosis more difficult.\n\n* **machine_id**: An ID code for the imaging device.\n\n* **cancer**: The target value. Only provided for train.\n\n* **biopsy**: Whether or not a follow-up biopsy was performed on the breast. Only provided for train.\n\n* **invasive**: If the breast is positive for cancer, whether or not the cancer proved to be invasive. Only provided for train.\n\n\n* **BIRADS**: 0 if the breast required follow-up, 1 if the breast was rated as negative for cancer, and 2 if the breast was rated as normal. Only provided for train.\n\n* **prediction_id**: The ID for the matching submission row. Multiple images will share the same prediction ID. Test only.\n\n* **difficult_negative_case**: True if the case was unusually difficult. Only provided for train.\n","metadata":{}},{"cell_type":"markdown","source":"#### 1.3 Evalution Matrics <a id = 1.2></a>","metadata":{}},{"cell_type":"markdown","source":"Popular metrics such as Accuracy, Precision, and Recall are often insufficient as they fail to give a complete picture of the model’s behavior. [This article](https://aclanthology.org/2020.eval4nlp-1.9.pdf) present a probabilistic extension of Precision, Recall, and F1 score, which we refer to as confidence-Precision (cPrecision), confidence-Recall (cRecall), and confidenceF1 (cF1) respectively. The proposed metrics address some of the challenges faced when evaluating large-scale NLP systems, specifically when the model’s confidence score assignments have an impact on the system’s behavior.","metadata":{}},{"cell_type":"markdown","source":"\n\n![Evaluation_metrics.png](attachment:fd6b8d8a-3d07-4b55-b7f1-d3a3aaab9941.png)","metadata":{},"attachments":{"fd6b8d8a-3d07-4b55-b7f1-d3a3aaab9941.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAtQAAAEWCAIAAADJh5eFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAFnvSURBVHhe7d15XE35/wdw7VGUpESbNYmsWVOUrbEbsjdjCTP2XWT7msa+78MIIWvRDCZLZKzJFCFJlhAhJVsb/V5zP6f7u1NKtku8nn943PM+n3PuOec2836de889t1DmFywkJCQ4ODg9PV2a/jbcvXt39+7djx8/lqaJiIi+Ll90+CAiIqKvD8MHERERKRXDBxERESkVwwcREREpFcMHERERKRXDBxERESkVwwcREREpFcMHERERKRXDBxERESkVwwcREREpFcMHERERKRXDBxERESkVwwcREREpFcMHERERKRXDBxERESkVwwcREREpFcMHERERKRXDBxERESkVwwcREREpFcMHERERKRXDBxERESkVwwcREREpFcMHEVHBtmLFimbNmjVp0sTe3r5+/frNs6DYpUuXbdu2PXr06PXr19JopcCT6unpYcOk6XfxIct+XrNnz65Xr17NmjWrVatWp04dvCICXggvL6+IiIjU1FRp6KeXkZGxZMmSCRMmtGnTxtTUVBTxZxAaGurp6Tlq1KgGDRqUKVNG1JWP4YOIqGDbtWvXjBkz7OzsChUqZGFhMSfLL7/8gsZTokSJbt26xcXFSaOVAj1YS0sLWyVNv4sPWfbzOnz48MqVKxs1aoQXwsHBYaOMt7f3iBEjbGxsSpcu/dtvvyktf6Snp+Pp+vfvr6Ki4uLiIoqvXr0KCwubNm1a1apVUe/YsaOoKx/DBxFRgYds0aFDB/S8sWPHSiWZhISEHj16oM0sXLhQKinFunXrBg4ceOvWLWn6XXzIsp/d7du3W7dujRfCx8dHKskcOHBAV1cX+eOff/6RSkqB58Wrny3JJSYmInagvmTJEqmkdAwfREQFXkRERM2aNdHzgoKCpJLM8+fPR48ejbq9vb1Uok8pLCzMxsZGTU0tPj5eKslcu3atbNmyeCGUnAJ79eqlqqp69OhRaVpm//79VlZW2MjLly9LJaVj+CAiKvCQOfT19YsUKfLy5UupJJOQkNC9e3f0vOrVq0sl+pQOHDiAV6FixYrSdJbIyMjixYvjhZg7d65UUooyZcqYmppev35dmpZZtGiR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gQMYA3gwYMAA8e1c5I9NmzZ17979/Pnz0gJERERUQLw9fIivpWzYsEF+bzGRJLZu3Sp/4+Gt4QMePny4YMECpBYBj1ERs3KGD8jIyAgODh44cKAYjweYFN+8xZbs2rUL0eTq1atiMBERERUUbw8fHxdiSnJyMv6Vpt8G+eapTLZPWDCp+LVeIiIiKiiUHT6IiIjoG8fwQURERErF8EFERERKxfBBRERESsXwQURERErF8EFERERKxfBBRERESsXwQURERErF8EFERERKxfBBRERESsXwQURERErF8EFERERKxfBBRERESsXwQURERErF8EFERERKxfBBRERESsXwQURERErF8EFERERKxfBBRERESsXwQURERErF8EFERERKxfBBRERESsXwQURERErF8EFERERKxfBBRERESsXwQURERErF8EFERCS5fPly3bp1NTQ0ihYtqieDx4UKFVJXV5dXtLW1URk9erS0jMyff/7Ztm1bZ2fnhg0b1q9f39HRsUWW5s2b9+nTx9/f/9GjR69fv5YW+LYxfBAREf0LycDPz69y5cqDBg1CVjgoY2tri6jRqFEjUfnrr78mTJhgYGAwf/58aTGZ0NDQdevWjRo1CoOLFy8+ZMiQtTJr1qyZN29ex44dDQ0NXV1db9++LS3wbWP4ICIi+ldKSsqMGTM8PT1fvHghKklJSWXLllVXV1d8nyM6Otre3v7w4cPStIKlS5cifNjZ2YWEhEglmZiYGBcXFxUVFaxfKn3bGD6IiIj+9fDhw4EDB549e1aazsw8ceKEoaFh0aJFfXx8pFJm5vXr15s1a4Y8IU0r6Ny5M8JH165dsSqpJBMbG9uuXTvMqlmzplT6tjF8EBER/SsqKsrd3f3ly5fSdGbmqlWrdHR0jIyMwsPDpVJmZkRERJcuXeLi4qTpLBkZGfr6+pqamh4eHlIpy7lz5xo0aCA+vpFK3zaGDyIion8FBQXt3LlTmpBdAjJw4EBVVVUrKyupJIOMsmLFiuTkZGk6S0hICOJF6dKlfX19pVKWXbt2mZiYYFUbNmyQSt82hg8iIvom3Lt3r1u3bubm5k5OTqGhobt3727atKmFhYWdnd327dvT0tKkcVnu37/v4uKCPNG3b1+plKc5c+ZgcNWqVc+fPy+VZG7fvu3q6ork0atXr6SkJKn6bWP4ICKir19KSsrkyZOn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IK7KRKvOz/c4nj59am5urqGhcfToUakk+yjHwcGhcOHCrVq1iomJyf8FpO8UPt5p116+fFmqVCkMK1asWK1atWrXro10VaJECQQX+T1acvq4e6d8DB9ERPQZ4LTe0dER/XX06NFovfKbvl+7ds3Y2PjHH38UwxSVL18e5/QjR47M9gnLG2E9GKytrW1qamopY2FhIT6nW758eR59/Y3eKXy8064dOHCgaNGiqqqqRkZGYjuxkZjs2bOnNOJNPu7eKR/DBxERfQYbN25ER09KSurUqRM6tPxXaaKioooVK2ZjYyMm5W7evImWnPN+HrkRl0S0bds2MjLyUZaEhITU1FRpxJsgJURERBzOwc3NbciQIYGBgdJ0FsWb6Mu906798ssvWlpaenp68s+SsKChoaGPj4+YfKP327svB8MHERF9NleuXEE/NjExkaYzM8+cOYOQkfPX6VatWoV2W7lyZbR8qZSnpk2bqqioeHp6vlM/FveQHZkDtsfZ2Xn48OHSdBZslbRkDvnctXbt2qFoZmYmzyj37983MjJS/C5xTu+3d18Ohg8iIvpsjh8/jkih+GbGuHHjUBk2bJg0naVr166oOzg4KN5eLDdoyZqamkWLFl27dq1Uyp/Xr18nJibezgFtfu7cuXhqaTrLw4cPpSVzyM+uIaBUr14dxW7dukkl2e35T506JU28yXvv3ZeD4YOIiD4bHx8fnPdfunRJms7MrFGjhpqaWnBwsDQt8/z5c0NDQ9R/+OEHxR+7yc2+ffvQ0StVqvTW3/HJp3nz5qHTv9NXbfOza3v27DE3N8em/v7771IpHz763ikfwwcREX02devW1dbWjoyMFJNJSUloq23bts32y8PosuJcX/E2XHnw8PDAeho1apTztqfv5z3CR352bdq0aeKn48RPIufTR9875WP4ICKiz+PFixcqKioaGhp///03Ju/du9e0aVNTU9PAwEBMZmRkXLp06ciRI3v37v3hhx/QoYsVKzZlyhRUjh07hmVl6/iP1NTU06dP79u3r2rVqqI9Y3B+PqZ5q3cNH3nv2rNnz3x9fX/77TdsIbazSJEi2MejR4/m/GEXRZ9u75SP4YOIiD6PixcvokOjlXbo0MHLy6tjx47o0OjK4oOVhISEGjVq6OvrI3OIH83HYB0dHVQMDQ2vvemetjdu3ChZsmTx4sXV1NQwHkuV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"}}},{"cell_type":"markdown","source":"[**Implementation:** ](https://www.kaggle.com/code/sohier/probabilistic-f-score)","metadata":{}},{"cell_type":"code","source":"def pfbeta(labels, predictions, beta):\n    y_true_count = 0\n    ctp = 0\n    cfp = 0\n\n    for idx in range(len(labels)):\n        prediction = min(max(predictions[idx], 0), 1)\n        if (labels[idx]):\n            y_true_count += 1\n            ctp += prediction\n            cfp += 1 - prediction\n        else:\n            cfp += prediction\n\n    beta_squared = beta * beta\n    c_precision = ctp / (ctp + cfp)\n    c_recall = ctp / y_true_count\n    if (c_precision > 0 and c_recall > 0):\n        result = (1 + beta_squared) * (c_precision * c_recall) / (beta_squared * c_precision + c_recall)\n        return result\n    else:\n        return 0","metadata":{"execution":{"iopub.status.busy":"2022-11-30T17:35:23.975142Z","iopub.execute_input":"2022-11-30T17:35:23.975692Z","iopub.status.idle":"2022-11-30T17:35:24.017641Z","shell.execute_reply.started":"2022-11-30T17:35:23.975582Z","shell.execute_reply":"2022-11-30T17:35:24.016086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### 1.4 Code Requirments <a id = 1.3></a>","metadata":{}},{"cell_type":"markdown","source":"Since this is a code competition, entries must be submitted using **notebooks**. The submission notebook is also subject to the following restrictions:\n\n* **External data**, including **pre-trained models**, is permitted during the **run-time (CPU/GPU)** of less than **nine hours**. The submission file's name must begin with submission.\n\n* The test set is **hidden** and will be filled in when you submit your notebook, so take note of that.","metadata":{}},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:cyan; border:0; color:black' role=\"tab\" aria-controls=\"home\">\n📚 2. Import Libraries <a id = 4></a>","metadata":{}},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport pydicom\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom glob import glob\nimport re","metadata":{"execution":{"iopub.status.busy":"2022-11-30T18:05:02.545781Z","iopub.execute_input":"2022-11-30T18:05:02.546186Z","iopub.status.idle":"2022-11-30T18:05:02.551922Z","shell.execute_reply.started":"2022-11-30T18:05:02.54615Z","shell.execute_reply":"2022-11-30T18:05:02.551022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:cyan; border:0; color:black' role=\"tab\" aria-controls=\"home\">\n🍚 3. Dataset <a id = 5></a>","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/rsna-breast-cancer-detection/train.csv')\ndf","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:14:26.398678Z","iopub.execute_input":"2022-11-30T14:14:26.399074Z","iopub.status.idle":"2022-11-30T14:14:26.528533Z","shell.execute_reply.started":"2022-11-30T14:14:26.39904Z","shell.execute_reply":"2022-11-30T14:14:26.527291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### 3.1 Initial analysis <a id = 6></a>","metadata":{}},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:15:57.643876Z","iopub.execute_input":"2022-11-30T14:15:57.644792Z","iopub.status.idle":"2022-11-30T14:15:57.664997Z","shell.execute_reply.started":"2022-11-30T14:15:57.644749Z","shell.execute_reply":"2022-11-30T14:15:57.663401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('The dataset shape:', df.shape)","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:16:27.479844Z","iopub.execute_input":"2022-11-30T14:16:27.480656Z","iopub.status.idle":"2022-11-30T14:16:27.487881Z","shell.execute_reply.started":"2022-11-30T14:16:27.480545Z","shell.execute_reply":"2022-11-30T14:16:27.486502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.info()","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:16:51.781038Z","iopub.execute_input":"2022-11-30T14:16:51.782075Z","iopub.status.idle":"2022-11-30T14:16:51.81663Z","shell.execute_reply.started":"2022-11-30T14:16:51.782017Z","shell.execute_reply":"2022-11-30T14:16:51.815083Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### 3.1.1 First Impressions <a id = 7></a>\n","metadata":{}},{"cell_type":"markdown","source":"\n- The dataset contatins 54706 rows and 14 columns.\n- There is missing value in BIRADS, age, and density.\n- The variables types are in numerical format, object, and bool.\n","metadata":{}},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:cyan; border:0; color:black' role=\"tab\" aria-controls=\"home\">\n4. 🧠 Exploratory Data Analysis (EDA) <a id = 8></a>","metadata":{}},{"cell_type":"markdown","source":"#### 4.1 Analyzing Unique Values <a id = 9></a>","metadata":{}},{"cell_type":"code","source":"unique_number = []\nfor i in df.columns:\n    x = df[i].value_counts().count()\n    unique_number.append(x)\n    \npd.DataFrame(unique_number, index=df.columns, columns=[\"Total Unique values\"])","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:19:25.783416Z","iopub.execute_input":"2022-11-30T14:19:25.783873Z","iopub.status.idle":"2022-11-30T14:19:25.849772Z","shell.execute_reply.started":"2022-11-30T14:19:25.783838Z","shell.execute_reply":"2022-11-30T14:19:25.848391Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 4.1.1 Result 1 <a id = 10></a>","metadata":{}},{"cell_type":"markdown","source":"* **The bigest advantage of Unique Values is helping determining which variables are numeric or categorical. The variables with high number of Unique Values are generally numeric variables.**\n* **Numeric variables** are: age and machine_id.\n* **Categrical variables** are: view, laternity, cancer, etc.","metadata":{}},{"cell_type":"markdown","source":"#### 4.2 Seprating variables to Numeric or Categorical <a id = 11></a>","metadata":{}},{"cell_type":"code","source":"numeric_var = ['age', 'machine_id']\ncategoric_var = ['laterality', 'view', 'biopsy', 'cancer', 'invasive', 'BIRADS', 'implant', 'density', 'difficult_negative']","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:40:01.383366Z","iopub.execute_input":"2022-11-30T14:40:01.383798Z","iopub.status.idle":"2022-11-30T14:40:01.389224Z","shell.execute_reply.started":"2022-11-30T14:40:01.383762Z","shell.execute_reply":"2022-11-30T14:40:01.388312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### 4.3 Analyzing variables statistically <a id = 12></a>","metadata":{}},{"cell_type":"code","source":"df[numeric_var].describe()","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:40:21.164471Z","iopub.execute_input":"2022-11-30T14:40:21.164848Z","iopub.status.idle":"2022-11-30T14:40:21.193274Z","shell.execute_reply.started":"2022-11-30T14:40:21.164817Z","shell.execute_reply":"2022-11-30T14:40:21.192041Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.histplot(df['age'], kde=True, stat='density', kde_kws=dict(cut=3))","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:41:35.933609Z","iopub.execute_input":"2022-11-30T14:41:35.933998Z","iopub.status.idle":"2022-11-30T14:41:36.612192Z","shell.execute_reply.started":"2022-11-30T14:41:35.933968Z","shell.execute_reply":"2022-11-30T14:41:36.611252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x, y = plt.subplots(figsize=(8,6))\nsns.kdeplot(df['age'], ax=y)\ny.axvline(df['age'].mean(), color='r', ls='--')","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:43:52.59862Z","iopub.execute_input":"2022-11-30T14:43:52.599512Z","iopub.status.idle":"2022-11-30T14:43:53.141894Z","shell.execute_reply.started":"2022-11-30T14:43:52.599455Z","shell.execute_reply":"2022-11-30T14:43:53.140584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.histplot(df['machine_id'], kde=True, stat='density', kde_kws=dict(cut=3))","metadata":{"execution":{"iopub.status.busy":"2022-11-30T14:45:56.757919Z","iopub.execute_input":"2022-11-30T14:45:56.758388Z","iopub.status.idle":"2022-11-30T14:45:57.634163Z","shell.execute_reply.started":"2022-11-30T14:45:56.758348Z","shell.execute_reply":"2022-11-30T14:45:57.632814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### 4.3.1 Results 2 <a id = 12.1></a>","metadata":{}},{"cell_type":"markdown","source":"* **People's age do not have a Normal Distribution. Most of the patients are older than 55 years old**\n* **Machine id** : Images are taken by 10 different machines. Most of them were taken by machine 49. It may be important because as you know it may cause domain discrepancy which is a common problem in clinics when their machines and settings change. \n","metadata":{}},{"cell_type":"markdown","source":"<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:cyan; border:0; color:black' role=\"tab\" aria-controls=\"home\">\n5. Train Images <a id = 13></a>","metadata":{}},{"cell_type":"markdown","source":"#### 5.1 What is Dicom? <a id = 14></a>","metadata":{}},{"cell_type":"markdown","source":"A .dcm file adheres to the DICOM (Digital Imaging and Communications in Medicine) standard. It is the accepted format for archiving medical images and associated metadata. Despite numerous revisions, it was originally published in 1983. For more information about it check this [discusion](https://www.kaggle.com/competitions/rsna-2022-cervical-spine-fracture-detection/discussion/340398).\n\nThese files can be opened and explored using the [pydicom library](https://pydicom.github.io/).","metadata":{}},{"cell_type":"code","source":"ex_path = \"/kaggle/input/rsna-breast-cancer-detection/train_images/10006/1459541791.dcm\"\ndcm_example = pydicom.dcmread(ex_path)\ndcm_example","metadata":{"execution":{"iopub.status.busy":"2022-11-30T17:50:54.54323Z","iopub.execute_input":"2022-11-30T17:50:54.543642Z","iopub.status.idle":"2022-11-30T17:50:54.674783Z","shell.execute_reply.started":"2022-11-30T17:50:54.543605Z","shell.execute_reply":"2022-11-30T17:50:54.673538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Under \"**Pixel Data**\" an array contains the **image data**. All other information is **metadata**. Metadata means data about data!\n\n* The values for \"**Rows**\" and \"**Columns**\" indicate the **size** of the image.","metadata":{}},{"cell_type":"markdown","source":"#### 5.2 Investigating the images <a id = 15></a>","metadata":{}},{"cell_type":"markdown","source":"Let's take a closer look at the image data in the dcm files.","metadata":{}},{"cell_type":"code","source":"# Adapted from https://www.kaggle.com/code/andradaolteanu/rsna-fracture-detection-dicom-images-explore\n\nbase_path = \"/kaggle/input/rsna-breast-cancer-detection/train_images\"\npatient_id = '10006'\ndcm_paths = glob(f\"{base_path}/{patient_id}/*\")\ndef atoi(text):\n    return int(text) if text.isdigit() else text\ndef natural_keys(text):\n    return [atoi(c) for c in re.split(r'(\\d+)', text)]\ndcm_paths.sort(key=natural_keys)\n\n# Get images\nfiles = [pydicom.dcmread(path) for path in dcm_paths]\nimages = [apply_voi_lut(file.pixel_array, file) for file in files]\n\nprint(dcm_paths)\n# Plot images\nfig, axes = plt.subplots(nrows=2, ncols=2, figsize=(24,12))\nfig.suptitle(f'ID: {patient_id}', weight=\"bold\", size=20)\n\nstart = 0\nfor i in range(start,start+4):\n    img = images[i]\n    file = files[i]\n    slice_no = i\n    # Plot the image\n    x = (i-start) // 2\n    y = (i-start) % 2\n\n    axes[x, y].imshow(img, cmap=\"bone\")\n    axes[x, y].set_title(f\"Slice: {slice_no}\", fontsize=14, weight='bold')\n    axes[x, y].axis('off')","metadata":{"execution":{"iopub.status.busy":"2022-11-30T18:07:20.49526Z","iopub.execute_input":"2022-11-30T18:07:20.495682Z","iopub.status.idle":"2022-11-30T18:07:38.676719Z","shell.execute_reply.started":"2022-11-30T18:07:20.495647Z","shell.execute_reply":"2022-11-30T18:07:38.675568Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<a id=\"references\"></a>\n<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h2 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:cyan; border:0; color:black' role=\"tab\" aria-controls=\"home\">\nReferences","metadata":{}},{"cell_type":"markdown","source":"1. [**Mammograms: basic info**](https://www.cdc.gov/cancer/breast/basic_info/mammograms.htm)\n\n2. [**Mammograms: details**](https://www.cdc.gov/cancer/breast/basic_info/mammograms.htm)","metadata":{}},{"cell_type":"markdown","source":"[](http://)","metadata":{}},{"cell_type":"markdown","source":"<h1><center>Stay tuned for more plots!</center></h1>\n                                                      \n<center><img src = \"https://cdn-icons-png.flaticon.com/512/5578/5578703.png\" width = \"375\" height = \"250\"/></center> \n\n","metadata":{}},{"cell_type":"markdown","source":"<div class=\"list-group\" id=\"list-tab\" role=\"tablist\">\n<h3 class=\"list-group-item list-group-item-action active\" data-toggle=\"list\" style='background:maroon; border:0; color:white' role=\"tab\" aria-controls=\"home\"><center>Please vote up if you find this notebook useful, it helps me stay motivated. Keep checking for further developments on this notebook, as it will be updated frequently.</center></h3>","metadata":{}}]}