{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":36363,"databundleVersionId":4050810,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Лабораторна робота № 3: Обробка та розпізнавання медичних зображень","metadata":{}},{"cell_type":"markdown","source":"Імпорт бібліотек","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport os\nimport pydicom\nimport matplotlib.pyplot as plt","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T19:23:13.360181Z","iopub.execute_input":"2024-12-02T19:23:13.360633Z","iopub.status.idle":"2024-12-02T19:23:13.365961Z","shell.execute_reply.started":"2024-12-02T19:23:13.3606Z","shell.execute_reply":"2024-12-02T19:23:13.364713Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Завантаження даних","metadata":{}},{"cell_type":"code","source":"data_path = \"/kaggle/input/rsna-2022-cervical-spine-fracture-detection/\"\ntrain_csv_path = os.path.join(data_path, \"train.csv\")\ntrain_images_path = os.path.join(data_path, \"train_images\")\n\n# Завантаження таблиці з даними\ntrain_df = pd.read_csv(train_csv_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T19:23:13.368742Z","iopub.execute_input":"2024-12-02T19:23:13.369197Z","iopub.status.idle":"2024-12-02T19:23:13.399377Z","shell.execute_reply.started":"2024-12-02T19:23:13.369158Z","shell.execute_reply":"2024-12-02T19:23:13.398271Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Оцінка основної статистики даних","metadata":{}},{"cell_type":"code","source":"# Перегляд перших рядків\nprint(train_df.head())\n\n# Основна інформація про дані\nprint(train_df.info())\nprint(train_df.describe())\n\n# Перевірка кількості унікальних зображень\nprint(f\"Унікальних зображень: {train_df['StudyInstanceUID'].nunique()}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T19:23:13.401448Z","iopub.execute_input":"2024-12-02T19:23:13.401881Z","iopub.status.idle":"2024-12-02T19:23:13.441176Z","shell.execute_reply.started":"2024-12-02T19:23:13.401843Z","shell.execute_reply":"2024-12-02T19:23:13.439912Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Пояснювальний аналіз даних набору","metadata":{}},{"cell_type":"code","source":"# Перевірка кількості прикладів для кожного класу\nclass_columns = [col for col in train_df.columns if col.startswith('C')]\nclass_distribution = train_df[class_columns].sum()\n\n# Візуалізація розподілу класів\nclass_distribution.plot(kind='bar', figsize=(10, 6), color='skyblue')\nplt.title('Розподіл класів')\nplt.ylabel('Кількість')\nplt.xlabel('Клас')\nplt.show()\n\n# Аналіз збалансованості класів\ntotal_images = len(train_df)\nbalance = class_distribution / total_images * 100\nprint(\"Процентний розподіл класів:\")\nprint(balance)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T19:23:13.442764Z","iopub.execute_input":"2024-12-02T19:23:13.443171Z","iopub.status.idle":"2024-12-02T19:23:13.680801Z","shell.execute_reply.started":"2024-12-02T19:23:13.443134Z","shell.execute_reply":"2024-12-02T19:23:13.679671Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Визначення збалансованості класів","metadata":{}},{"cell_type":"code","source":"# Інформація про наявність будь-якої травми\ntrain_df['AnyFracture'] = train_df[class_columns].sum(axis=1) > 0\n\n# Розподіл між \"травма\" та \"без травми\"\nfracture_distribution = train_df['AnyFracture'].value_counts(normalize=True) * 100\n\n# Візуалізація\nfracture_distribution.plot(kind='bar', figsize=(7, 5), color=['skyblue', 'orange'])\nplt.title('Розподіл травма/без травми')\nplt.ylabel('Відсоток')\nplt.xlabel('Травма')\nplt.xticks(ticks=[0, 1], labels=[\"Без травми\", \"Травма\"], rotation=0)\nplt.show()\n\n# Друк розподілу\nprint(fracture_distribution)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T19:23:13.683668Z","iopub.execute_input":"2024-12-02T19:23:13.684014Z","iopub.status.idle":"2024-12-02T19:23:13.871892Z","shell.execute_reply.started":"2024-12-02T19:23:13.68398Z","shell.execute_reply":"2024-12-02T19:23:13.870712Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Розподіл для кожного класу окремо","metadata":{}},{"cell_type":"code","source":"# Перевірка розподілу для кожного класу\nclass_distribution = train_df[class_columns].sum()\n\n# Візуалізація розподілу\nclass_distribution.plot(kind='bar', figsize=(10, 6), color='lightblue')\nplt.title('Розподіл за типами травм (C1-C7)')\nplt.ylabel('Кількість')\nplt.xlabel('Тип травми')\nplt.xticks(rotation=0)\nplt.show()\n\n# Друк процентного розподілу\nclass_percentage = class_distribution / len(train_df) * 100\nprint(\"Процентний розподіл за типами травм:\")\nprint(class_percentage)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T19:23:13.873505Z","iopub.execute_input":"2024-12-02T19:23:13.873898Z","iopub.status.idle":"2024-12-02T19:23:14.163539Z","shell.execute_reply.started":"2024-12-02T19:23:13.873862Z","shell.execute_reply":"2024-12-02T19:23:14.162211Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Загальний розподіл (травма/без травми)","metadata":{}},{"cell_type":"code","source":"# Візуалізація травма/без травми \nfracture_distribution.plot(kind='pie', labels=[\"Без травми\", \"Травма\"], autopct='%1.1f%%', \n                           startangle=90, colors=['skyblue', 'orange'], figsize=(7, 7))\nplt.title('Розподіл травма/без травми')\nplt.ylabel('') \nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T19:23:14.165013Z","iopub.execute_input":"2024-12-02T19:23:14.165392Z","iopub.status.idle":"2024-12-02T19:23:14.28152Z","shell.execute_reply.started":"2024-12-02T19:23:14.165357Z","shell.execute_reply":"2024-12-02T19:23:14.280021Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":" Аналіз залежності між травмами та кількома характеристиками","metadata":{}},{"cell_type":"code","source":"# Кількість зображень на UID\nimages_per_uid = train_df.groupby('StudyInstanceUID').size()\n\n# Перевірка середньої кількості зображень у випадках з травмою та без\ntrain_df['NumImages'] = train_df['StudyInstanceUID'].map(images_per_uid)\nprint(train_df.groupby('AnyFracture')['NumImages'].describe())\n\n# Візуалізація\ntrain_df.boxplot(column='NumImages', by='AnyFracture', grid=False, figsize=(8, 6))\nplt.title('Кількість зображень для травми/без травми')\nplt.suptitle('')\nplt.xlabel('Травма')\nplt.ylabel('Кількість зображень')\nplt.xticks(ticks=[1, 2], labels=[\"Без травми\", \"Травма\"])\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-02T19:23:14.283203Z","iopub.execute_input":"2024-12-02T19:23:14.283774Z","iopub.status.idle":"2024-12-02T19:23:14.582784Z","shell.execute_reply.started":"2024-12-02T19:23:14.283712Z","shell.execute_reply":"2024-12-02T19:23:14.581607Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Висновок про збалансованість класів","metadata":{}},{"cell_type":"markdown","source":"Класи вважаються збалансованими, коли кількість прикладів у кожній категорії приблизно однакова. Якщо одна категорія значно переважає над іншою, класи є незбалансованими. Частка кожного класу наближається до 50% (52,4% та 47,6%), тому можемо зробити висновок, що класи збалансовані.","metadata":{}}]}