{ "cells": [ { "cell_type": "markdown", "id": "d164e323-7d5e-4525-8db9-c0a9a1a83b81", "metadata": {}, "source": [ "# ITSM Incident Management" ] }, { "cell_type": "markdown", "id": "58781227-8a7c-4637-9fbe-226f90e47605", "metadata": {}, "source": [ "## Project Objective\n", "\n", "The primary objective of this project is to build a machine learning model that can accurately predict high-priority IT incidents before they escalate, enabling ABC Tech to improve its incident management process and enhance overall service quality.\n", "\n", "Specific Objectives\n", "Extract and analyze ITSM incident data from the MySQL database.\n", "Perform data cleaning, preprocessing, and feature engineering.\n", "Handle class imbalance using SMOTE.\n", "\n", "#### Develop and compare multiple machine learning models:\n", "Logistic Regression\n", "Decision Tree\n", "Random Forest\n", "\n", "#### Evaluate model performance using appropriate metrics.\n", "Identify the most influential factors contributing to high-priority incidents.\n", "Recommend a suitable predictive solution for deployment within ABC Tech's ITSM environment." ] }, { "cell_type": "markdown", "id": "54c05c2a-d453-43dd-a27a-a7cb99d290d8", "metadata": {}, "source": [ "### ‼️ Loading The Dataset " ] }, { "cell_type": "code", "execution_count": 38, "id": "e8b18a7c-94b4-46f2-8485-67a8042f33f0", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import LabelEncoder" ] }, { "cell_type": "code", "execution_count": 39, "id": "1eafc7c1-d85a-4847-a9d2-23624c68b36f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Connected Successfully\n" ] } ], "source": [ "import mysql.connector\n", "\n", "conn = mysql.connector.connect(\n", " host=\"18.136.157.135\",\n", " user=\"dm_team\",\n", " password=\"DM!$Team@&27920!\",\n", " database=\"project_itsm\"\n", ")\n", "\n", "print(\"Connected Successfully\")" ] }, { "cell_type": "code", "execution_count": 40, "id": "81980b99-8737-40bb-affd-e9dc2be250c9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('dataset_list',)\n" ] } ], "source": [ "cursor = conn.cursor()\n", "\n", "cursor.execute(\"SHOW TABLES\")\n", "\n", "for table in cursor:\n", " print(table)" ] }, { "cell_type": "code", "execution_count": 41, "id": "c6d7bf4e-a1c8-478b-bff2-144c42ee688d", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\Admin\\AppData\\Local\\Temp\\ipykernel_14252\\3788507943.py:3: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", " df = pd.read_sql(query, conn)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "(46606, 25)\n" ] } ], "source": [ "query = \"SELECT * FROM dataset_list\"\n", "\n", "df = pd.read_sql(query, conn)\n", "\n", "print(df.shape)" ] }, { "cell_type": "code", "execution_count": 42, "id": "b960db92-ebc2-41e1-a091-39e99517af02", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dataset Saved Successfully\n" ] } ], "source": [ "df.to_csv(\"itsm_dataset.csv\", index=False)\n", "\n", "print(\"Dataset Saved Successfully\")" ] }, { "cell_type": "markdown", "id": "c804e189-3fc3-47c5-8d84-9e79824deff0", "metadata": {}, "source": [ "### ‼️ Understanding The Dataset " ] }, { "cell_type": "code", "execution_count": 43, "id": "d284cccd-8368-4abe-a587-f324de4fc06e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 46606 entries, 0 to 46605\n", "Data columns (total 25 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 CI_Name 46606 non-null object\n", " 1 CI_Cat 46606 non-null object\n", " 2 CI_Subcat 46606 non-null object\n", " 3 WBS 46606 non-null object\n", " 4 Incident_ID 46606 non-null object\n", " 5 Status 46606 non-null object\n", " 6 Impact 46606 non-null object\n", " 7 Urgency 46606 non-null object\n", " 8 Priority 46606 non-null object\n", " 9 number_cnt 46606 non-null object\n", " 10 Category 46606 non-null object\n", " 11 KB_number 46606 non-null object\n", " 12 Alert_Status 46606 non-null object\n", " 13 No_of_Reassignments 46606 non-null object\n", " 14 Open_Time 46606 non-null object\n", " 15 Reopen_Time 46606 non-null object\n", " 16 Resolved_Time 46606 non-null object\n", " 17 Close_Time 46606 non-null object\n", " 18 Handle_Time_hrs 46606 non-null object\n", " 19 Closure_Code 46606 non-null object\n", " 20 No_of_Related_Interactions 46606 non-null object\n", " 21 Related_Interaction 46606 non-null object\n", " 22 No_of_Related_Incidents 46606 non-null object\n", " 23 No_of_Related_Changes 46606 non-null object\n", " 24 Related_Change 46606 non-null object\n", "dtypes: object(25)\n", "memory usage: 8.9+ MB\n" ] }, { "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", " \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", "
CI_NameCI_CatCI_SubcatWBSIncident_IDStatusImpactUrgencyPrioritynumber_cnt...Reopen_TimeResolved_TimeClose_TimeHandle_Time_hrsClosure_CodeNo_of_Related_InteractionsRelated_InteractionNo_of_Related_IncidentsNo_of_Related_ChangesRelated_Change
count46606466064660646606466064660646606466064660646606...46606466064660646606466064660646606466064660646606
unique3019136527446606266646606...2245336283452830639155043060255233
topSUB000456applicationServer Based ApplicationWBS000073IM0047057Closed4440.902319509...02-10-2013 15:200Other1#MULTIVALUE
freq30503290018811133421465972255622588227171...4432217802123616470430583434453844604646046
\n", "

4 rows × 25 columns

\n", "
" ], "text/plain": [ " CI_Name CI_Cat CI_Subcat WBS \\\n", "count 46606 46606 46606 46606 \n", "unique 3019 13 65 274 \n", "top SUB000456 application Server Based Application WBS000073 \n", "freq 3050 32900 18811 13342 \n", "\n", " Incident_ID Status Impact Urgency Priority number_cnt ... \\\n", "count 46606 46606 46606 46606 46606 46606 ... \n", "unique 46606 2 6 6 6 46606 ... \n", "top IM0047057 Closed 4 4 4 0.902319509 ... \n", "freq 1 46597 22556 22588 22717 1 ... \n", "\n", " Reopen_Time Resolved_Time Close_Time Handle_Time_hrs \\\n", "count 46606 46606 46606 46606 \n", "unique 2245 33628 34528 30639 \n", "top 02-10-2013 15:20 0 \n", "freq 44322 1780 21 236 \n", "\n", " Closure_Code No_of_Related_Interactions Related_Interaction \\\n", "count 46606 46606 46606 \n", "unique 15 50 43060 \n", "top Other 1 #MULTIVALUE \n", "freq 16470 43058 3434 \n", "\n", " No_of_Related_Incidents No_of_Related_Changes Related_Change \n", "count 46606 46606 46606 \n", "unique 25 5 233 \n", "top \n", "freq 45384 46046 46046 \n", "\n", "[4 rows x 25 columns]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()\n", "df.info()\n", "df.columns\n", "df.isnull().sum()\n", "df.describe(include='all')" ] }, { "cell_type": "code", "execution_count": 44, "id": "a10680ea-431b-4290-89df-481d55931a07", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rows: 46606\n", "Columns: 25\n" ] } ], "source": [ "print(\"Rows:\", df.shape[0])\n", "print(\"Columns:\", df.shape[1])" ] }, { "cell_type": "code", "execution_count": 45, "id": "831465c8-bd16-4f75-a9e5-5bb5e65117d3", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "CI_Name object\n", "CI_Cat object\n", "CI_Subcat object\n", "WBS object\n", "Incident_ID object\n", "Status object\n", "Impact object\n", "Urgency object\n", "Priority object\n", "number_cnt object\n", "Category object\n", "KB_number object\n", "Alert_Status object\n", "No_of_Reassignments object\n", "Open_Time object\n", "Reopen_Time object\n", "Resolved_Time object\n", "Close_Time object\n", "Handle_Time_hrs object\n", "Closure_Code object\n", "No_of_Related_Interactions object\n", "Related_Interaction object\n", "No_of_Related_Incidents object\n", "No_of_Related_Changes object\n", "Related_Change object\n", "dtype: object" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 46, "id": "cd0f45cc-7405-4f47-a039-9a1a1c8a1b1a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Priority\n", "4 22717\n", "5 16486\n", "3 5323\n", "NA 1380\n", "2 697\n", "1 3\n", "Name: count, dtype: int64" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Priority'].value_counts(dropna=False)" ] }, { "cell_type": "markdown", "id": "60549219-1508-468f-afa7-acbe40754894", "metadata": {}, "source": [ "### ‼️ Exploring The Dataset " ] }, { "cell_type": "code", "execution_count": 47, "id": "52e4cd1a-6cce-4ec2-9168-0936efd3f9c6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['4', '3', 'NA', '5', '2', '1'], dtype=object)" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Priority'].unique()" ] }, { "cell_type": "code", "execution_count": 48, "id": "85afc522-4c0e-429d-b253-4df9471fe23a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Impact\n", "4 22556\n", "5 16741\n", "3 5234\n", "NS 1380\n", "2 692\n", "1 3\n", "Name: count, dtype: int64" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Impact'].value_counts(dropna=False)" ] }, { "cell_type": "code", "execution_count": 49, "id": "861bd90c-56fa-4381-bd1b-874e418e5431", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Urgency\n", "4 22588\n", "5 16779\n", "3 6536\n", "2 696\n", "1 6\n", "5 - Very Low 1\n", "Name: count, dtype: int64" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Urgency'].value_counts(dropna=False)" ] }, { "cell_type": "code", "execution_count": 50, "id": "c1bf817a-e7cb-4b6e-8b7c-b2d1fd25fef4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 26\n", "1 33\n", "2 3\n", "3 13\n", "4 2\n", "5 4\n", "6 2\n", "7 5\n", "8 2\n", "9 2\n", "10 6\n", "11 8\n", "12 5\n", "13 17\n", "14 1\n", "15 3\n", "16 1\n", "17 7\n", "18 17\n", "19 5\n", "Name: No_of_Reassignments, dtype: object" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['No_of_Reassignments'].head(20)" ] }, { "cell_type": "code", "execution_count": 51, "id": "ee92b320-ca54-4f12-82c6-80b1b8a227fe", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 3,87,16,91,111\n", "1 4,35,47,86,389\n", "2 4,84,31,19,444\n", "3 4,32,18,33,333\n", "4 3,38,39,03,333\n", "5 3,38,34,36,944\n", "6 3,70,31,91,389\n", "7 3,29,46,24,167\n", "8 0,862777778\n", "9 3,21,15,26,944\n", "10 3,06,74,49,167\n", "11 1,32,26,19,167\n", "12 1,13,24,28,333\n", "13 6,67,54,16,667\n", "14 3,11,43,58,056\n", "15 2,83,79,50,556\n", "16 1,22,37,48,333\n", "17 3,79,27,77,778\n", "18 2,62,67,33,889\n", "19 9,31,78,08,333\n", "Name: Handle_Time_hrs, dtype: object" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Handle_Time_hrs'].head(20)" ] }, { "cell_type": "code", "execution_count": 52, "id": "eeaa9ea8-2df9-48b7-bb24-3c18503202dc", "metadata": {}, "outputs": [], "source": [ "date_cols = [\n", " 'Open_Time',\n", " 'Reopen_Time',\n", " 'Resolved_Time',\n", " 'Close_Time'\n", "]\n", "\n", "for col in date_cols:\n", " df[col] = pd.to_datetime(\n", " df[col],\n", " errors='coerce',\n", " dayfirst=True\n", " )" ] }, { "cell_type": "code", "execution_count": 53, "id": "fa05c4c8-20ec-4071-85e8-60320542d606", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 46606 entries, 0 to 46605\n", "Data columns (total 4 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Open_Time 46606 non-null datetime64[ns]\n", " 1 Reopen_Time 2284 non-null datetime64[ns]\n", " 2 Resolved_Time 44826 non-null datetime64[ns]\n", " 3 Close_Time 46606 non-null datetime64[ns]\n", "dtypes: datetime64[ns](4)\n", "memory usage: 1.4 MB\n" ] } ], "source": [ "df[date_cols].info()" ] }, { "cell_type": "code", "execution_count": 54, "id": "60460d75-2c44-49f1-b019-2bdf1d859873", "metadata": {}, "outputs": [], "source": [ "df['Open_Year'] = df['Open_Time'].dt.year\n", "\n", "df['Open_Month'] = df['Open_Time'].dt.month\n", "\n", "df['Open_DayOfWeek'] = df['Open_Time'].dt.dayofweek\n", "\n", "df['Open_Hour'] = df['Open_Time'].dt.hour" ] }, { "cell_type": "code", "execution_count": 55, "id": "ec909c96-ffb5-4f99-b304-12b52aacfb31", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['4', '3', 'NA', '5', '2', '1'], dtype=object)" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Priority'].unique()" ] }, { "cell_type": "code", "execution_count": 56, "id": "6de976ed-3084-4e25-87fc-756bad96ec96", "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 57, "id": "31e050fc-59f2-470c-829c-236e90f9695b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Priority\n", "4 22717\n", "5 16486\n", "3 5323\n", "NaN 1380\n", "2 697\n", "1 3\n", "Name: count, dtype: int64" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Priority'] = df['Priority'].replace('NA', np.nan)\n", "\n", "df['Priority'].value_counts(dropna=False)" ] }, { "cell_type": "code", "execution_count": 65, "id": "a49e49e3-5b79-49a7-a0a4-3547a527a5c0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Impact\n", "4 22556\n", "5 16741\n", "3 5234\n", "NS 1380\n", "2 692\n", "1 3\n", "Name: count, dtype: int64" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Impact'].value_counts(dropna=False)" ] }, { "cell_type": "code", "execution_count": 66, "id": "e354f7b9-e18e-495f-acb6-411477df4b0d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Urgency\n", "4 22588\n", "5 16779\n", "3 6536\n", "2 696\n", "1 6\n", "5 - Very Low 1\n", "Name: count, dtype: int64" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Urgency'].value_counts(dropna=False)" ] }, { "cell_type": "code", "execution_count": 67, "id": "bb70a757-29cf-404b-b6b0-5d8447890fe4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Status\n", "Closed 46597\n", "Work in progress 9\n", "Name: count, dtype: int64" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Status'].value_counts(dropna=False)" ] }, { "cell_type": "code", "execution_count": 68, "id": "61d7e9df-b741-499f-a09d-7432797e7674", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Reopen_Time 44322\n", "Resolved_Time 1780\n", "Priority 1380\n", "CI_Cat 0\n", "CI_Subcat 0\n", "Incident_ID 0\n", "Status 0\n", "Impact 0\n", "Urgency 0\n", "number_cnt 0\n", "Category 0\n", "WBS 0\n", "CI_Name 0\n", "Alert_Status 0\n", "KB_number 0\n", "Open_Time 0\n", "No_of_Reassignments 0\n", "Close_Time 0\n", "Handle_Time_hrs 0\n", "Closure_Code 0\n", "No_of_Related_Interactions 0\n", "Related_Interaction 0\n", "No_of_Related_Incidents 0\n", "No_of_Related_Changes 0\n", "Related_Change 0\n", "Open_Year 0\n", "Open_Month 0\n", "Open_DayOfWeek 0\n", "Open_Hour 0\n", "dtype: int64" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum().sort_values(ascending=False)" ] }, { "cell_type": "code", "execution_count": 69, "id": "9b8fa585-11ce-4322-9694-28a0f3fdc3c9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 3,87,16,91,111\n", "1 4,35,47,86,389\n", "2 4,84,31,19,444\n", "3 4,32,18,33,333\n", "4 3,38,39,03,333\n", "5 3,38,34,36,944\n", "6 3,70,31,91,389\n", "7 3,29,46,24,167\n", "8 0,862777778\n", "9 3,21,15,26,944\n", "10 3,06,74,49,167\n", "11 1,32,26,19,167\n", "12 1,13,24,28,333\n", "13 6,67,54,16,667\n", "14 3,11,43,58,056\n", "15 2,83,79,50,556\n", "16 1,22,37,48,333\n", "17 3,79,27,77,778\n", "18 2,62,67,33,889\n", "19 9,31,78,08,333\n", "Name: Handle_Time_hrs, dtype: object" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Handle_Time_hrs'].head(20)" ] }, { "cell_type": "code", "execution_count": 71, "id": "09d9a0bc-54c5-41ad-9a4f-da8b0f4d5255", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(45226, 29)\n" ] } ], "source": [ "df = df[df['Priority'].notna()]\n", "\n", "print(df.shape)" ] }, { "cell_type": "code", "execution_count": 72, "id": "fb722fa0-282e-491c-b284-9e1ea4a636b9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Impact\n", "4 22556\n", "5 16741\n", "3 5234\n", "2 692\n", "1 3\n", "Name: count, dtype: int64" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Impact'].value_counts(dropna=False)" ] }, { "cell_type": "code", "execution_count": 73, "id": "ade3616f-a162-454a-977b-5bd2ccfa9f6c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Urgency\n", "4 22556\n", "5 16779\n", "3 5188\n", "2 696\n", "1 6\n", "5 - Very Low 1\n", "Name: count, dtype: int64" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Urgency'].value_counts(dropna=False)" ] }, { "cell_type": "code", "execution_count": 74, "id": "6833d0a5-e4f1-4a37-a52b-ff868c20739e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['4', '3', '5', '2', '1', '5 - Very Low'], dtype=object)" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Impact'].unique()\n", "df['Urgency'].unique()" ] }, { "cell_type": "code", "execution_count": 75, "id": "a45c9719-a9d4-4574-b0e0-63ddd7f5a7f1", "metadata": {}, "outputs": [], "source": [ "df['Urgency'] = df['Urgency'].replace(\n", " '5 - Very Low',\n", " '5'\n", ")" ] }, { "cell_type": "code", "execution_count": 76, "id": "3b8f1ea8-3faa-4657-813e-e15892e2ae80", "metadata": {}, "outputs": [], "source": [ "\n", "df['Urgency'] = pd.to_numeric(\n", " df['Urgency'],\n", " errors='coerce'\n", ")\n" ] }, { "cell_type": "code", "execution_count": 77, "id": "268ca307-6a87-44af-a5b0-b36b0746d395", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('int64')" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "df['Urgency'].dtype" ] }, { "cell_type": "code", "execution_count": 70, "id": "7aae08a0-819f-4afd-831c-0ebecdb7c41c", "metadata": {}, "outputs": [], "source": [ "df_original = df.copy()" ] }, { "cell_type": "code", "execution_count": 59, "id": "c4542185-e923-4e25-bd35-2df43ba04862", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Reopen_Time 44322\n", "Resolved_Time 1780\n", "Priority 1380\n", "CI_Cat 0\n", "CI_Subcat 0\n", "Incident_ID 0\n", "Status 0\n", "Impact 0\n", "Urgency 0\n", "number_cnt 0\n", "Category 0\n", "WBS 0\n", "CI_Name 0\n", "Alert_Status 0\n", "KB_number 0\n", "Open_Time 0\n", "No_of_Reassignments 0\n", "Close_Time 0\n", "Handle_Time_hrs 0\n", "Closure_Code 0\n", "No_of_Related_Interactions 0\n", "Related_Interaction 0\n", "No_of_Related_Incidents 0\n", "No_of_Related_Changes 0\n", "Related_Change 0\n", "Open_Year 0\n", "Open_Month 0\n", "Open_DayOfWeek 0\n", "Open_Hour 0\n", "dtype: int64" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum().sort_values(ascending=False)" ] }, { "cell_type": "code", "execution_count": 60, "id": "f9aa1c96-0292-49ee-9169-ccd646cf17ff", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(46606, 29)\n" ] } ], "source": [ "print(df.shape)" ] }, { "cell_type": "code", "execution_count": 78, "id": "d40646cb-84a3-43e2-92bd-4246d11d23c9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['CI_Name', 'CI_Cat', 'CI_Subcat', 'WBS', 'Incident_ID', 'Status',\n", " 'Impact', 'Urgency', 'Priority', 'number_cnt', 'Category', 'KB_number',\n", " 'Alert_Status', 'No_of_Reassignments', 'Open_Time', 'Reopen_Time',\n", " 'Resolved_Time', 'Close_Time', 'Handle_Time_hrs', 'Closure_Code',\n", " 'No_of_Related_Interactions', 'Related_Interaction',\n", " 'No_of_Related_Incidents', 'No_of_Related_Changes', 'Related_Change',\n", " 'Open_Year', 'Open_Month', 'Open_DayOfWeek', 'Open_Hour'],\n", " dtype='object')" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 81, "id": "05637506-01d9-4bb9-ba26-d492a261ee9a", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Index: 45226 entries, 0 to 46605\n", "Data columns (total 29 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 CI_Name 45226 non-null object \n", " 1 CI_Cat 45226 non-null object \n", " 2 CI_Subcat 45226 non-null object \n", " 3 WBS 45226 non-null object \n", " 4 Incident_ID 45226 non-null object \n", " 5 Status 45226 non-null object \n", " 6 Impact 45226 non-null object \n", " 7 Urgency 45226 non-null int64 \n", " 8 Priority 45226 non-null object \n", " 9 number_cnt 45226 non-null object \n", " 10 Category 45226 non-null object \n", " 11 KB_number 45226 non-null object \n", " 12 Alert_Status 45226 non-null object \n", " 13 No_of_Reassignments 45226 non-null object \n", " 14 Open_Time 45226 non-null datetime64[ns]\n", " 15 Reopen_Time 2239 non-null datetime64[ns]\n", " 16 Resolved_Time 43582 non-null datetime64[ns]\n", " 17 Close_Time 45226 non-null datetime64[ns]\n", " 18 Handle_Time_hrs 45226 non-null object \n", " 19 Closure_Code 45226 non-null object \n", " 20 No_of_Related_Interactions 45226 non-null object \n", " 21 Related_Interaction 45226 non-null object \n", " 22 No_of_Related_Incidents 45226 non-null object \n", " 23 No_of_Related_Changes 45226 non-null object \n", " 24 Related_Change 45226 non-null object \n", " 25 Open_Year 45226 non-null int32 \n", " 26 Open_Month 45226 non-null int32 \n", " 27 Open_DayOfWeek 45226 non-null int32 \n", " 28 Open_Hour 45226 non-null int32 \n", "dtypes: datetime64[ns](4), int32(4), int64(1), object(20)\n", "memory usage: 9.7+ MB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 80, "id": "4d28dc21-334f-40b0-a574-558f85717718", "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", " \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", "
CI_NameCI_CatCI_SubcatWBSIncident_IDStatusImpactUrgencyPrioritynumber_cnt...Closure_CodeNo_of_Related_InteractionsRelated_InteractionNo_of_Related_IncidentsNo_of_Related_ChangesRelated_ChangeOpen_YearOpen_MonthOpen_DayOfWeekOpen_Hour
0SUB000508subapplicationWeb Based ApplicationWBS000162IM0000004Closed4440.601292279...Other1SD0000007220122613
1WBA000124applicationWeb Based ApplicationWBS000088IM0000005Closed3330.415049969...Software1SD0000011120123015
3WBA000124applicationWeb Based ApplicationWBS000088IM0000011Closed4440.642927218...Operator error1SD000002520127111
4WBA000124applicationWeb Based ApplicationWBS000088IM0000012Closed4440.345258343...Other1SD000002920128411
5WBA000124applicationWeb Based ApplicationWBS000088IM0000013Closed4440.006675648...Other1SD000003120128411
\n", "

5 rows × 29 columns

\n", "
" ], "text/plain": [ " CI_Name CI_Cat CI_Subcat WBS Incident_ID \\\n", "0 SUB000508 subapplication Web Based Application WBS000162 IM0000004 \n", "1 WBA000124 application Web Based Application WBS000088 IM0000005 \n", "3 WBA000124 application Web Based Application WBS000088 IM0000011 \n", "4 WBA000124 application Web Based Application WBS000088 IM0000012 \n", "5 WBA000124 application Web Based Application WBS000088 IM0000013 \n", "\n", " Status Impact Urgency Priority number_cnt ... Closure_Code \\\n", "0 Closed 4 4 4 0.601292279 ... Other \n", "1 Closed 3 3 3 0.415049969 ... Software \n", "3 Closed 4 4 4 0.642927218 ... Operator error \n", "4 Closed 4 4 4 0.345258343 ... Other \n", "5 Closed 4 4 4 0.006675648 ... Other \n", "\n", " No_of_Related_Interactions Related_Interaction No_of_Related_Incidents \\\n", "0 1 SD0000007 2 \n", "1 1 SD0000011 1 \n", "3 1 SD0000025 \n", "4 1 SD0000029 \n", "5 1 SD0000031 \n", "\n", " No_of_Related_Changes Related_Change Open_Year Open_Month Open_DayOfWeek \\\n", "0 2012 2 6 \n", "1 2012 3 0 \n", "3 2012 7 1 \n", "4 2012 8 4 \n", "5 2012 8 4 \n", "\n", " Open_Hour \n", "0 13 \n", "1 15 \n", "3 11 \n", "4 11 \n", "5 11 \n", "\n", "[5 rows x 29 columns]" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "id": "bf9f9cc3-f111-4cab-b9fd-b3c0a0f7d438", "metadata": {}, "source": [ "# ==================================================
\n", "##
DATA CLEANING

\n", "# ==================================================" ] }, { "cell_type": "code", "execution_count": 82, "id": "b9a20984-28b7-4f6a-b600-c6db6be4237d", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 83, "id": "215af04d-d681-45ee-95a7-14bc0de89a24", "metadata": {}, "outputs": [], "source": [ "df_original = df.copy()" ] }, { "cell_type": "code", "execution_count": 84, "id": "998df8f3-9250-4871-9ea1-946eab7f3d15", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Reopen_Time 42987\n", "Resolved_Time 1644\n", "CI_Subcat 0\n", "CI_Cat 0\n", "CI_Name 0\n", "Status 0\n", "Impact 0\n", "Urgency 0\n", "Priority 0\n", "number_cnt 0\n", "Category 0\n", "WBS 0\n", "Incident_ID 0\n", "Alert_Status 0\n", "KB_number 0\n", "Open_Time 0\n", "No_of_Reassignments 0\n", "Close_Time 0\n", "Handle_Time_hrs 0\n", "Closure_Code 0\n", "No_of_Related_Interactions 0\n", "Related_Interaction 0\n", "No_of_Related_Incidents 0\n", "No_of_Related_Changes 0\n", "Related_Change 0\n", "Open_Year 0\n", "Open_Month 0\n", "Open_DayOfWeek 0\n", "Open_Hour 0\n", "dtype: int64" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum().sort_values(ascending=False)" ] }, { "cell_type": "code", "execution_count": 85, "id": "12fe12e3-42b3-4a29-bd85-1ada4fa98139", "metadata": {}, "outputs": [], "source": [ "df = df[df['Priority'].notna()]" ] }, { "cell_type": "code", "execution_count": 86, "id": "0d8d221c-5b7b-4a18-bf9e-bd3be5aae73f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(45226, 29)\n" ] } ], "source": [ "print(df.shape)" ] }, { "cell_type": "code", "execution_count": 87, "id": "cc194504-8ef6-4ff3-aee5-b7b8948486e7", "metadata": {}, "outputs": [], "source": [ "df['Urgency'] = df['Urgency'].replace(\n", " '5 - Very Low',\n", " '5'\n", ")" ] }, { "cell_type": "code", "execution_count": 88, "id": "0f214beb-13ae-4de6-a3ec-286464983534", "metadata": {}, "outputs": [], "source": [ "df['Priority'] = pd.to_numeric(\n", " df['Priority'],\n", " errors='coerce'\n", ")\n", "\n", "df['Impact'] = pd.to_numeric(\n", " df['Impact'],\n", " errors='coerce'\n", ")\n", "\n", "df['Urgency'] = pd.to_numeric(\n", " df['Urgency'],\n", " errors='coerce'\n", ")" ] }, { "cell_type": "code", "execution_count": 89, "id": "488546f2-9d60-47de-9775-3b1dce29edba", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Priority int64\n", "Impact int64\n", "Urgency int64\n", "dtype: object" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[['Priority','Impact','Urgency']].dtypes" ] }, { "cell_type": "code", "execution_count": 90, "id": "4c96bfff-8390-4c82-97ca-b18f4fe41e27", "metadata": {}, "outputs": [], "source": [ "df['High_Priority'] = np.where(\n", " df['Priority'].isin([1,2]),\n", " 1,\n", " 0\n", ")" ] }, { "cell_type": "code", "execution_count": 91, "id": "c57ee8db-ab6f-41db-b005-3eb40305f3f5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "High_Priority\n", "0 44526\n", "1 700\n", "Name: count, dtype: int64" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['High_Priority'].value_counts()" ] }, { "cell_type": "code", "execution_count": 92, "id": "f6062a69-b363-497c-a878-ce82ae4d0814", "metadata": {}, "outputs": [], "source": [ "date_cols = [\n", " 'Open_Time',\n", " 'Reopen_Time',\n", " 'Resolved_Time',\n", " 'Close_Time'\n", "]\n", "\n", "for col in date_cols:\n", " df[col] = pd.to_datetime(\n", " df[col],\n", " errors='coerce',\n", " dayfirst=True\n", " )" ] }, { "cell_type": "code", "execution_count": 93, "id": "84a50f74-bf23-4b4f-8324-88281c0e05dc", "metadata": {}, "outputs": [], "source": [ "df['Open_Year'] = df['Open_Time'].dt.year\n", "\n", "df['Open_Month'] = df['Open_Time'].dt.month\n", "\n", "df['Open_DayOfWeek'] = df['Open_Time'].dt.dayofweek\n", "\n", "df['Open_Hour'] = df['Open_Time'].dt.hour" ] }, { "cell_type": "code", "execution_count": 94, "id": "dc86891c-fff5-430e-9124-c76994fb69bc", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAskAAAHUCAYAAADIlbU1AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAM4NJREFUeJzt3X1UVWXe//HPCQSR4CQgIIlmZqSh2ZC3YlmaiqJITk3Z0E1ihpamMko61kzhjMVdPmQzTo45+azRvW7TLIvRMjFL0yjGMHOsLHUEMYODIgLS+f1R7l/nwicQPEd5v9Y6a7Gv/T17f/fZq7U+Xl1nH5vT6XQKAAAAgOUKdzcAAAAAeBpCMgAAAGAgJAMAAAAGQjIAAABgICQDAAAABkIyAAAAYCAkAwAAAAZCMgAAAGAgJAMAAAAGQjKAy9qiRYtks9msl7e3t1q1aqXhw4frP//5z3kdIyUlRddcc02993bNNdcoJSXF2j548KAyMjKUl5dXr+cxP4OmTZsqPDxcvXv3VmZmpoqKimq8JyMjQzabrVbnOX78uDIyMrRx48Zave9057rmmmuUkJBQq+Ocy4oVKzR79uzT7rPZbMrIyKjX8wG4tHm7uwEAuBgWLlyoG264QeXl5dq0aZMyMzOVk5Ojzz//XP7+/md97x//+EeNHz++3ntatWqVAgMDre2DBw9q6tSpuuaaa9SlS5d6P9+pz6CqqkpFRUXavHmznnvuOc2YMUOvvfaa+vbta9U+/PDDGjBgQK2Of/z4cU2dOlWS1KtXr/N+X13OVRcrVqxQfn6+0tLSauzbsmWLWrVq1eA9ALh0EJIBNArR0dG65ZZbJEm9e/dWdXW1/vznP2v16tV64IEHTvue48ePq1mzZmrXrl299lJeXi4/Pz/dfPPN9Xrcc/nlZyBJ99xzj373u9/ptttu09133609e/YoLCxMktSqVasGD42nPt+Lca5z6d69u1vPD8DzsNwCQKN0KhR99913kn5aUnHllVfq888/V1xcnAICAtSnTx9rn7nc4sSJE5oyZYratm0rHx8fXX311RozZoxKSkpc6k4tG3j99dd18803q2nTptZs6y+XW2zcuFFdu3aVJA0fPtxaGpGRkaGlS5fKZrNpy5YtNa7jT3/6k5o0aaKDBw/W6XNo3bq1Zs6cqaNHj2revHnW+OmWQGzYsEG9evVScHCw/Pz81Lp1a91zzz06fvy4vv32W7Vo0UKSNHXqVKv/U9d36niffvqpfvOb36h58+bWPz7OtrRj1apV6ty5s5o2baprr71Wf/nLX1z2n1pK8u2337qMb9y4UTabzVr60atXL61du1bfffedy9KTU0633CI/P1933XWXmjdvrqZNm6pLly5avHjxac/z6quv6sknn1RERIQCAwPVt29f7d69+8wfPACPx0wygEbpq6++kiQr2ElSZWWlEhMTNWrUKP3+97/XyZMnT/tep9OpIUOG6L333tOUKVPUs2dP7dixQ08//bS2bNmiLVu2yNfX16r/9NNPtWvXLv3hD39Q27ZtT7u841e/+pUWLlyo4cOH6w9/+IMGDRok6acZ3dDQUE2aNEl/+9vfFBsba73n5MmTmjdvnn79618rIiKizp/FwIED5eXlpU2bNp2x5ttvv9WgQYPUs2dPLViwQFdddZX+85//KDs7W5WVlWrZsqWys7M1YMAAjRgxQg8//LAk189Xku6++27df//9euSRR1RWVnbWvvLy8pSWlqaMjAyFh4dr+fLlGj9+vCorK5Wenl6ra3zppZc0cuRIff3111q1atU563fv3q0ePXooNDRUf/nLXxQcHKxly5YpJSVFhw4d0qRJk1zqn3jiCd166636xz/+odLSUk2ePFmDBw/Wrl275OXlVateAXgGQjKARqG6ulonT57UiRMnlJOTo2nTpikgIECJiYlWTVVVlZ566ikNHz78rMdat26d/vnPf+r555/X448/Lknq16+fIiMjNXToUC1ZskSpqalWfVFRkb744gtdf/31ZzxmYGCgoqOjJUnt2rWr8b//R40apczMTM2aNUuhoaGSpNdff10HDx7UY489VrsPw+Dv76+QkJCzzkbn5ubqxIkTmj59um666SZrPCkpyfo7JiZG0k/B/kzLF4YNG2bNpJ/LwYMH9dlnn1nni4+PV1FRkf785z9r9OjRatas2XkdR5I6duyoq666Sr6+vue1tCIjI0OVlZV6//33FRkZKemnf0yUlJRo6tSpGjVqlOx2u8vxly1bZm17eXnpvvvu0/bt21nKAVyiWG4BoFHo3r27mjRpooCAACUkJCg8PFzvvPOOtQb3lHvuueecx9qwYYMkuTyZQpLuvfde+fv767333nMZ79y581kD8vl49NFHJUnz58+3xubM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FRsbq9TUVBUUFKigoECtW7fWQw89pIULF7rULliwQD179lS7du3q98IBoJ6w3AIALjPbtm3TihUr1KdPH0lSZWWlli5dqhYtWpy2fs+ePVqzZo0+/PBD9ejRQ5K0fPlyRUZGavXq1br33nsl/bRU46WXXtJNN9102uPY7Xb5+PioWbNmCg8Pt8aHDx+up556Stu2bdN//dd/qaqqSsuWLdP06dPr87IBoF4xkwwAl4G33npLV155pZo2barY2Fjdfvvt+utf/ypJatOmzRkDsiTt2rVL3t7e6tatmzUWHBysqKgo7dq1yxrz8fFR586da91by5YtNWjQIC1YsMDq9cSJE1b4BgBPREgGgMtA7969lZeXp927d+vEiRN6/fXXreUQZ3rCxSlnesiR0+mUzWaztv38/Fy2a+Phhx9WVlaWysvLtXDhQg0dOlTNmjWr07EA4GJguQUAXAb8/f113XXX1em9HTt21MmTJ/Xxxx9byy2OHDmif//73+rQoUOtjuXj46Pq6uoa4wMHDpS/v7/mzp2rd955R5s2bapTrwBwsTCTDACNXPv27XXXXXcpNTVVmzdv1r/+9S/993//t66++mrdddddtTrWNddco48//ljffvutvv/+e/3444+SJC8vL6WkpGjKlCm67rrrFBsb2xCXAgD1hpAMANDChQsVExOjhIQExcbGyul06u2331aTJk1qdZz09HR5eXmpY8eOatGihfbt22ftGzFihCorK/XQQw/Vd/sAUO/4xT0AwEXx4YcfqlevXjpw4IDCwsLc3Q4AnBUhGQDQoCoqKrR//36NHDlSLVu21PLly93dEgCcE8stAAAN6tVXX1VUVJQcDoeef/55d7cDAOeFmWQAAADAwEwyAAAAYCAkAwAAAAZCMgAAAGAgJAMAAAAGQjIAAABgICQDAAAABkIyAAAAYCAkAwAAAIb/B5CgaDH17TbsAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(8,5))\n", "\n", "sns.countplot(\n", " x='Priority',\n", " data=df\n", ")\n", "\n", "plt.title(\"Priority Distribution\")\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 95, "id": "462303d4-88f4-4767-aad1-8abff79b13c2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "45704 0,467222222\n", "32352 2,09,01,38,889\n", "29772 0,297777778\n", "16993 0,026666667\n", "23451 0,082777778\n", "4993 0,884166667\n", "14627 6,93,63,88,889\n", "15593 0,331388889\n", "3155 1,02,99,44,444\n", "21018 1,21,97,27,778\n", "Name: Handle_Time_hrs, dtype: object" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Handle_Time_hrs'].sample(10)" ] }, { "cell_type": "code", "execution_count": 96, "id": "0375a78f-5906-4fa2-a7bb-38349ca358e9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "6703 0\n", "39315 0\n", "31418 2\n", "10286 1\n", "18511 0\n", "20751 3\n", "15754 0\n", "20184 0\n", "36724 2\n", "18146 0\n", "Name: No_of_Reassignments, dtype: object" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['No_of_Reassignments'].sample(10)" ] }, { "cell_type": "markdown", "id": "ecd90d38-de0d-4e42-972a-d68928a09f5b", "metadata": {}, "source": [ "##### ======================================\n", "##### HANDLE_TIME_HRS CLEANING\n", "##### ======================================" ] }, { "cell_type": "code", "execution_count": 97, "id": "78f04147-8442-439d-8359-81f68384fefc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 3.871691e+09\n", "1 4.354786e+09\n", "3 4.321833e+09\n", "4 3.383903e+09\n", "5 3.383437e+09\n", "Name: Handle_Time_hrs, dtype: float64\n" ] } ], "source": [ "df['Handle_Time_hrs'] = (\n", " df['Handle_Time_hrs']\n", " .astype(str)\n", " .str.replace(',', '', regex=False)\n", ")\n", "\n", "df['Handle_Time_hrs'] = pd.to_numeric(\n", " df['Handle_Time_hrs'],\n", " errors='coerce'\n", ")\n", "\n", "print(df['Handle_Time_hrs'].head())" ] }, { "cell_type": "markdown", "id": "fc150fc9-3640-4fcb-8516-2b50ce5d71b6", "metadata": {}, "source": [ "##### ======================================\n", "##### NUMERIC COLUMN CONVERSION\n", "##### ======================================" ] }, { "cell_type": "code", "execution_count": 159, "id": "0c225768-f355-41fa-99d4-47f81255dc15", "metadata": {}, "outputs": [], "source": [ "numeric_cols = [\n", " 'No_of_Reassignments',\n", " 'No_of_Related_Interactions',\n", " 'No_of_Related_Incidents',\n", " 'No_of_Related_Changes'\n", "]\n", "\n", "for col in numeric_cols:\n", " df[col] = pd.to_numeric(\n", " df[col],\n", " errors='coerce'\n", " )" ] }, { "cell_type": "markdown", "id": "9c583bdc-3d88-4b2d-a281-345b7d0c573e", "metadata": {}, "source": [ "##### ======================================\n", "##### FILL MISSING VALUES\n", "##### ======================================" ] }, { "cell_type": "code", "execution_count": 99, "id": "9c9f8936-5fc5-439a-be07-e3f39a4b8551", "metadata": {}, "outputs": [], "source": [ "\n", "df['Reopen_Time'] = df['Reopen_Time'].fillna(pd.NaT)\n", "\n", "df['Resolved_Time'] = df['Resolved_Time'].fillna(pd.NaT)\n", "\n", "df['No_of_Reassignments'] = (\n", " df['No_of_Reassignments']\n", " .fillna(0)\n", ")\n", "\n", "df['No_of_Related_Interactions'] = (\n", " df['No_of_Related_Interactions']\n", " .fillna(0)\n", ")\n", "\n", "df['No_of_Related_Incidents'] = (\n", " df['No_of_Related_Incidents']\n", " .fillna(0)\n", ")\n", "\n", "df['No_of_Related_Changes'] = (\n", " df['No_of_Related_Changes']\n", " .fillna(0)\n", ")" ] }, { "cell_type": "code", "execution_count": 100, "id": "119d87a9-f143-4476-a08e-680a58f7f11d", "metadata": {}, "outputs": [], "source": [ "drop_cols = [\n", " 'Incident_ID',\n", " 'Related_Interaction',\n", " 'Related_Change',\n", " 'KB_number',\n", " 'WBS'\n", "]\n", "\n", "df.drop(\n", " columns=drop_cols,\n", " inplace=True,\n", " errors='ignore'\n", ")" ] }, { "cell_type": "markdown", "id": "3bf7b0c7-575a-48e0-a2a3-815f29fdc447", "metadata": {}, "source": [ "#### PRE-PROCESSING " ] }, { "cell_type": "code", "execution_count": 101, "id": "b1cccc58-7cdb-4dc3-8c22-1ef34291e038", "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import LabelEncoder\n", "\n", "le = LabelEncoder()\n", "\n", "for col in df.columns:\n", " \n", " if df[col].dtype == 'object':\n", " \n", " df[col] = le.fit_transform(\n", " df[col].astype(str)\n", " )" ] }, { "cell_type": "code", "execution_count": 102, "id": "247becaf-fa7d-48ef-8a76-dc5e3a1c979b", "metadata": {}, "outputs": [], "source": [ "X = df.drop(\n", " ['Priority', 'High_Priority'],\n", " axis=1\n", ")\n", "\n", "y = df['High_Priority']" ] }, { "cell_type": "code", "execution_count": 112, "id": "0c7ef3fa-cd86-4dbe-839c-767701c6103f", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " X,\n", " y,\n", " test_size=0.2,\n", " random_state=42,\n", " stratify=y\n", ")" ] }, { "cell_type": "code", "execution_count": 105, "id": "06fef80b-b237-4a32-8f95-340356d46617", "metadata": {}, "outputs": [], "source": [ "# Remove datetime columns\n", "\n", "df = df.drop(\n", " columns=[\n", " 'Open_Time',\n", " 'Reopen_Time',\n", " 'Resolved_Time',\n", " 'Close_Time'\n", " ],\n", " errors='ignore'\n", ")" ] }, { "cell_type": "code", "execution_count": 107, "id": "16900d6c-f4a2-48b5-af81-82d9e2a427be", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "CI_Name int64\n", "CI_Cat int64\n", "CI_Subcat int64\n", "Status int64\n", "Impact int64\n", "Urgency int64\n", "Priority int64\n", "number_cnt int64\n", "Category int64\n", "Alert_Status int64\n", "No_of_Reassignments float64\n", "Handle_Time_hrs float64\n", "Closure_Code int64\n", "No_of_Related_Interactions float64\n", "No_of_Related_Incidents float64\n", "No_of_Related_Changes float64\n", "Open_Year int32\n", "Open_Month int32\n", "Open_DayOfWeek int32\n", "Open_Hour int32\n", "High_Priority int64\n", "dtype: object" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": 109, "id": "57050274-8bb8-4c1d-9de5-29f8713ce508", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index([], dtype='object')\n" ] } ], "source": [ "print(df.select_dtypes(include=['datetime']).columns)" ] }, { "cell_type": "code", "execution_count": 111, "id": "8801f5a5-b953-4f55-9916-a008941125ab", "metadata": {}, "outputs": [], "source": [ "X = df.drop(\n", " ['Priority', 'High_Priority'],\n", " axis=1\n", ")\n", "\n", "y = df['High_Priority']" ] }, { "cell_type": "code", "execution_count": 114, "id": "baa8eba0-0840-4f29-b4e0-44271e06a493", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CI_Name int64\n", "CI_Cat int64\n", "CI_Subcat int64\n", "Status int64\n", "Impact int64\n", "Urgency int64\n", "number_cnt int64\n", "Category int64\n", "Alert_Status int64\n", "No_of_Reassignments float64\n", "Handle_Time_hrs float64\n", "Closure_Code int64\n", "No_of_Related_Interactions float64\n", "No_of_Related_Incidents float64\n", "No_of_Related_Changes float64\n", "Open_Year int32\n", "Open_Month int32\n", "Open_DayOfWeek int32\n", "Open_Hour int32\n", "dtype: object\n" ] } ], "source": [ "print(X.dtypes)" ] }, { "cell_type": "code", "execution_count": 115, "id": "f6293342-d6b6-4e3a-af73-f1001b5f172d", "metadata": {}, "outputs": [], "source": [ "X = df.drop(\n", " ['Priority', 'High_Priority'],\n", " axis=1\n", ")\n", "\n", "y = df['High_Priority']" ] }, { "cell_type": "code", "execution_count": 140, "id": "513b5432-8c2d-47c1-8501-f79ec9e9feca", "metadata": {}, "outputs": [], "source": [ "X = df.drop(\n", " columns=[\n", " 'Priority',\n", " 'High_Priority',\n", " 'Impact',\n", " 'Urgency'\n", " ],\n", " errors='ignore'\n", ")\n", "\n", "y = df['High_Priority']" ] }, { "cell_type": "code", "execution_count": 141, "id": "9b5f1238-ee87-4869-9776-0f69d0fc53e2", "metadata": {}, "outputs": [], "source": [ "X = X.fillna(0)\n", "\n", "y = y.fillna(0)" ] }, { "cell_type": "code", "execution_count": 142, "id": "0a366899-aa62-40b7-90e5-2902077630d8", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " X,\n", " y,\n", " test_size=0.2,\n", " random_state=42,\n", " stratify=y\n", ")" ] }, { "cell_type": "code", "execution_count": 143, "id": "d7c68044-d501-40d9-bb73-7694d01ab65e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(45226, 17)\n", "0\n", "[dtype('int64') dtype('float64') dtype('int32')]\n" ] } ], "source": [ "print(X.shape)\n", "\n", "print(X.isnull().sum().sum())\n", "\n", "print(X.dtypes.unique())" ] }, { "cell_type": "code", "execution_count": 144, "id": "edff7d64-6714-49b9-a192-76c03a2f8c93", "metadata": {}, "outputs": [], "source": [ "X = X.fillna(0)\n" ] }, { "cell_type": "code", "execution_count": 145, "id": "39e3e544-bc20-4454-8602-36d05d41aa70", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "High_Priority\n", "0 35620\n", "1 35620\n", "Name: count, dtype: int64\n" ] } ], "source": [ "from imblearn.over_sampling import SMOTE\n", "\n", "smote = SMOTE(\n", " random_state=42\n", ")\n", "\n", "X_train_smote, y_train_smote = smote.fit_resample(\n", " X_train,\n", " y_train\n", ")\n", "\n", "print(y_train_smote.value_counts())" ] }, { "cell_type": "markdown", "id": "b00f03b7-7470-4947-8cbb-0fa5916ec2d5", "metadata": {}, "source": [ "##### 1. Data Extraction\n", "##### 2. Data Cleaning\n", "##### 3. Feature Engineering\n", "##### 4. Train-Test Split\n", "##### 5. SMOTE Balancing" ] }, { "cell_type": "markdown", "id": "fbd7b616-749a-4766-aaf0-3d0a8ed0c3fa", "metadata": {}, "source": [ "# Model Building" ] }, { "cell_type": "markdown", "id": "a6be4513-4e1b-46fb-823c-d4f7d2a68a9a", "metadata": {}, "source": [ "\n", "## *Logistic Regression*" ] }, { "cell_type": "code", "execution_count": 146, "id": "55377a2e-f581-4578-91fd-43fcb6a48087", "metadata": {}, "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression\n", "\n", "lr = LogisticRegression(max_iter=1000)\n", "\n", "lr.fit(X_train_smote, y_train_smote)\n", "\n", "pred_lr = lr.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 147, "id": "e441c431-362a-45e2-96c5-396d6d4ef44e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Logistic Regression Accuracy\n", "0.8243422507185496\n", " precision recall f1-score support\n", "\n", " 0 0.99 0.83 0.90 8906\n", " 1 0.06 0.73 0.11 140\n", "\n", " accuracy 0.82 9046\n", " macro avg 0.53 0.78 0.51 9046\n", "weighted avg 0.98 0.82 0.89 9046\n", "\n" ] } ], "source": [ "from sklearn.metrics import classification_report, accuracy_score\n", "\n", "print(\"Logistic Regression Accuracy\")\n", "print(accuracy_score(y_test, pred_lr))\n", "\n", "print(classification_report(y_test, pred_lr))" ] }, { "cell_type": "markdown", "id": "82a365f0-1d42-4f37-8d96-104809920a22", "metadata": {}, "source": [ "## *Decision Tree*" ] }, { "cell_type": "code", "execution_count": 148, "id": "43707f97-a43a-42fe-9d20-d48c32c43d30", "metadata": {}, "outputs": [], "source": [ "from sklearn.tree import DecisionTreeClassifier\n", "\n", "dt = DecisionTreeClassifier(\n", " random_state=42\n", ")\n", "\n", "dt.fit(X_train_smote, y_train_smote)\n", "\n", "pred_dt = dt.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 149, "id": "f5425b5e-b290-4400-9e96-5a4ba7521037", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Decision Tree Accuracy\n", "0.9784435109440637\n", " precision recall f1-score support\n", "\n", " 0 0.99 0.99 0.99 8906\n", " 1 0.35 0.46 0.40 140\n", "\n", " accuracy 0.98 9046\n", " macro avg 0.67 0.73 0.69 9046\n", "weighted avg 0.98 0.98 0.98 9046\n", "\n" ] } ], "source": [ "print(\"Decision Tree Accuracy\")\n", "print(accuracy_score(y_test, pred_dt))\n", "\n", "print(classification_report(y_test, pred_dt))" ] }, { "cell_type": "markdown", "id": "9dc08b19-c045-4a43-84ee-b36dd224e465", "metadata": {}, "source": [ "## *Random Forest*" ] }, { "cell_type": "code", "execution_count": 150, "id": "b37a70a2-6242-45bf-80d4-eadc052a8bc1", "metadata": {}, "outputs": [], "source": [ "from sklearn.ensemble import RandomForestClassifier\n", "\n", "rf = RandomForestClassifier(\n", " n_estimators=200,\n", " random_state=42\n", ")\n", "\n", "rf.fit(X_train_smote, y_train_smote)\n", "\n", "pred_rf = rf.predict(X_test)" ] }, { "cell_type": "code", "execution_count": 151, "id": "c2b94ff4-54b0-47ac-bdc5-215a92016a9f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Random Forest Accuracy\n", "0.9878399292504975\n", " precision recall f1-score support\n", "\n", " 0 0.99 0.99 0.99 8906\n", " 1 0.61 0.61 0.61 140\n", "\n", " accuracy 0.99 9046\n", " macro avg 0.80 0.80 0.80 9046\n", "weighted avg 0.99 0.99 0.99 9046\n", "\n" ] } ], "source": [ "print(\"Random Forest Accuracy\")\n", "print(accuracy_score(y_test, pred_rf))\n", "\n", "print(classification_report(y_test, pred_rf))" ] }, { "cell_type": "markdown", "id": "975ee47d-68f6-4f0c-91bb-78466c88b26f", "metadata": {}, "source": [ "# Confusion Matrix" ] }, { "cell_type": "code", "execution_count": 152, "id": "7bf4d84e-325d-46c6-bad2-4ff5d15a74d9", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.metrics import confusion_matrix\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "cm = confusion_matrix(y_test, pred_rf)\n", "\n", "plt.figure(figsize=(6,4))\n", "\n", "sns.heatmap(\n", " cm,\n", " annot=True,\n", " fmt='d'\n", ")\n", "\n", "plt.title(\"Random Forest Confusion Matrix\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "cee9eaf1-bed1-4e2c-b524-f010c60b28fb", "metadata": {}, "source": [ "# Feature Importance" ] }, { "cell_type": "code", "execution_count": 153, "id": "44f1988a-8148-4dba-8fd2-4f15458594e1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Feature Importance\n", "2 CI_Subcat 0.240397\n", "0 CI_Name 0.186192\n", "9 Closure_Code 0.121076\n", "11 No_of_Related_Incidents 0.097424\n", "1 CI_Cat 0.089744\n", "14 Open_Month 0.042758\n", "7 No_of_Reassignments 0.040874\n", "12 No_of_Related_Changes 0.032726\n", "8 Handle_Time_hrs 0.031191\n", "13 Open_Year 0.030333\n", "5 Category 0.024331\n", "10 No_of_Related_Interactions 0.022285\n", "16 Open_Hour 0.017934\n", "4 number_cnt 0.013872\n", "15 Open_DayOfWeek 0.008763\n" ] } ], "source": [ "importance = pd.DataFrame({\n", " 'Feature': X.columns,\n", " 'Importance': rf.feature_importances_\n", "})\n", "\n", "importance = importance.sort_values(\n", " 'Importance',\n", " ascending=False\n", ")\n", "\n", "print(importance.head(15))" ] }, { "cell_type": "markdown", "id": "f4676460-45bc-4c0c-94d6-7d354d1aa512", "metadata": {}, "source": [ "## Plot" ] }, { "cell_type": "code", "execution_count": 154, "id": "f41fd2ff-4e94-4b8d-80fb-a6c2e50af45b", "metadata": {}, "outputs": [ { "data": { "image/png": "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992yZYtmzpypmjVravr06SpatKg++ugjWSwWlShRQgcPHtS4ceNSfa73unXrlmbMmKFixYpJkrp3767hw4dbt48cOVL9+vVTr169rOsqV66cYl/z589XQkKCZs+erRw5cqhUqVL6/fff9fbbb1vbpPZ6lilTRu+//74kqXjx4po6darWr1+v+vXrK0+ePJIkT09Pm3/n2NhYvfPOOwoMDLTu9yADBw5U3759ra/j4+MJ6gAAAAAyTJaPpCcZN26c5s6dq6ioKJv10dHRqlGjhs26GjVq6NixY0pISHhgn9HR0XJwcFDVqlWt63LlyqUSJUooOjr6kerdvHmz9u7dqwULFqhw4cKKiIiwjsBGRkZq48aNcnV1tS5JIfDEiRMp9rdv3z41bdpUhQsXlpubm2rVqiXpToi8n6ioKF2/fl3169e3OdYXX3xhPU50dLSee+45mwfxJQX69MqRI4c1oEtS/vz5rVPzz549qz///NP6gcXDREdHq2zZssqRI8d960vt9SxTpozNfnfXdT99+/bVG2+8oXr16mns2LH3/fdJ4ujoKHd3d5sFAAAAADKKKUbSJenFF19USEiI3nvvPZsRcsMwkj3p3TCMVPV5v3Yp9ZlWRYoUkaenpwICAnT9+nW98sor+vXXX+Xo6KjExEQ1adIkxdHq/PnzJ1t39epVvfTSS3rppZf05ZdfKk+ePIqNjVVISIhu3rx53xoSExMlST/88IMKFChgsy3pwWypvVZpce90cIvFYj2Os7NzmvpKTX2pvZ4p1ZV0je4nPDxcrVu31g8//KAff/xR77//vhYuXKhXXnkllWcAAAAAABnHNCPpkjR27FgtX75c27Zts64LCgrSli1bbNpt27ZNAQEBsre3f2B/QUFBun37ts0D3c6fP6+jR4+qZMmSGVZ3u3btlJiYqGnTpkmSKlSooEOHDsnPz0/+/v42i4uLS7L9Dx8+rHPnzmns2LF64YUXFBgYmGwEOHv27JJkM3sgKChIjo6Oio2NTXacpCnYQUFB2rFjh01f977OSG5ubvLz89P69etT1T4oKEgHDhzQv//+a113b31pvZ73ky1bthRnXwQEBKhPnz5as2aNmjdvbn3GAAAAAAA8bqYK6aVLl1abNm00ZcoU67p+/fpp/fr1GjFihI4ePaq5c+dq6tSpyR4ulpLixYuradOmevPNN7Vl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5ht99NFHmjlzpo4dO6alS5eqdOnSKdaXmJioZs2aKUeOHNq5c6c+/fRTDRo0KMW2gwYNUv/+/bV//34FBASoVatWun37ts25Tp48WQsXLtSqVau0adMmNW/eXCtXrtTKlSs1b948ffrpp/rmm2+s+3Ts2FFbt27VwoUL9csvv+jVV1/Vyy+/bP2gJKnfDz74QPPmzdPPP/+s2NhY9e/fX5LUv39/hYaGWoN70r/Rg65PSm7cuKH4+HibBQAAAAAyikNWF5CRXnnlFZUrV07vv/++Pv/8c5ttH374oerWrashQ4ZIkgICAhQVFaUJEyYoLCzsgf0eO3ZMy5Yt09atW63he/78+fL19dXSpUv16quvKm/evJIkLy8veXt7p7rmggULSroTMA3DUMWKFVW3bl1J0vTp01WhQgWNHj3a2n727Nny9fXV0aNHFRAQoP/+9782/X3++efKmzevoqKiFBwcrNjYWBUvXlzPP/+8LBaLChcubG0bGxsrb29v1atXT9myZVOhQoVUpUqVFOtcs2aNTpw4oU2bNlnPb9SoUapfv36ytv3791ejRo0kScOGDVOpUqV0/PhxBQYGSpJu3bql6dOnq1ixYpKkFi1aaN68efrrr7/k6uqqoKAg1a5dWxs3blTLli114sQJLViwQL///rt8fHysx1i1apXmzJljvT63bt3SjBkzrP12795dw4cPlyS5urrK2dlZN27csPn3edD1ScmYMWM0bNiwB7YBAAAAgPR6akbSk4wbN05z585VVFSUzfro6GjVqFHDZl2NGjV07Ngxm2nVKYmOjpaDg4OqVq1qXZcrVy6VKFFC0dHRj1Tv5s2btXfvXi1YsECFCxdWRESEdSQ9MjJSGzdulKurq3VJCrpJU9pPnDih1q1bq2jRonJ3d1eRIkUk3Qmf0p0ZAPv371eJEiXUs2dPrVmzxnrsV199Vf/++6+KFi2qN998U999953NiPfdjhw5Il9fX5uAe79AX6ZMGevf+fPnlySb79nnyJHDGqQlKV++fPLz85Orq6vNuqR99u7dK8MwFBAQYHMtfvrpJ5up/ff2mz9//od+v/9B1yclAwcO1KVLl6zL6dOnH9geAAAAANLiqRpJl6QXX3xRISEheu+992xGyA3DSPakd8MwUtXn/dql1GdaFSlSRJ6engoICND169f1yiuv6Ndff5Wjo6MS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aQ0ePFiXLl3Szp07rdujoqLUsGFDubq6Kl++fGrXrp3OnTt33/6+/PJLVapUSW5ubvL29lbr1q2toT8mJka1a9eWJOXMmVMWi0VhYWGS7oxyjx8/XkWLFpWzs7PKli2rb775xqbvlStXKiAgQM7Ozqpdu7ZiYmJSdY6StHjxYs2fP18LFizQe++9p8qVK8vPz09NmzbVhg0brHUl+eCDD5Q/f37lypVL3bp1061bt1J1jtL/zRZYv369KlWqpBw5cqh69eo6cuSIzTFGjhypvHnzys3NTW+88YbeffddlStXzqbNnDlzVLJkSTk5OSkwMFDTpk2zbrt586a6d++u/Pnzy8nJSX5+fg+8/wAAAAAgM5kqpNvb22v06NGaMmWKfv/992TbIyMjFRoaqtdee00HDx5UeHi4hgwZooiIiFT1HxYWpj179mjZsmXavn27DMNQw4YNdevWLZsAuGTJEsXFxal69eppqv/atWuaM2eOJClbtmySpLi4ONWsWVPlypXTnj17tGrVKv31118KDQ29bz83b97UiBEjdODAAS1dulSnTp2yBnFfX18tWbJE0v+N4H/88ceSpMGDB2vOnDmaPn26Dh06pD59+qht27b66aefJEmnT59W8+bN1bBhQ+3fv98aalNr/vz5KlGihJo2bZpsm8VikYeHh/X1xo0bdeLECW3cuFFz585VRESEzb/Tg87xboMGDdLEiRO1Z88eOTg4qFOnTjb1jBo1SuPGjVNkZKQKFSqk6dOn2+w/a9YsDRo0SKNGjVJ0dLRGjx6tIUOGaO7cuZKkyZMna9myZVq8eLGOHDmiL7/8Un5+fve9Bjdu3FB8fLzNAgAAAAAZxSGrC7jXK6+8onLlyun999/X559/brPtww8/VN26dTVkyBBJUkBAgKKiojRhwoQUA97djh07pmXLlmnr1q3W8D1//nz5+vpq6dKlevXVV5U3b15JkpeXl7y9vVNdc8GCBSXdCemGYahixYqqW7euJGn69OmqUKGCRo8ebW0/e/Zs+fr66ujRowoICEjW391BtGjRopo8ebKqVKmiK1euyNXVVV5eXpLujOB7enpKkq5evaoPP/xQGzZsULVq1az7btmyRTNnzlTNmjU1ffp0FS1aVB999JEsFotKlCihgwcPaty4cak6z2PHjqlEiRKpapszZ05NnTpV9vb2CgwMVKNG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xowZIw8PD+vi6+ub3ksEAAAAAMkw3T0DrVixItm074SEBOvfBQoUUP/+/a2ve/TooVWrVunrr79W1apVrevLlCmj999/X5JUvHhxTZ06VevXr1f9+vW1bt06RUdHKyYmRgULFpQkjR49Wg0aNLhvXdOnT1eFChU0evRo67rZs2fL19dXR48eVUBAwKOdeAq8vLw0efJk2dnZqUSJEho/fryuXbum9957T5I0cOBAjR07Vlu3btVrr72mhQsXys7OTp999pksFoskac6cOfL09NSmTZv00ksvPfSYOXPm1NSpU2Vvb6/AwEA1atRI69ev15tvvmltU6dOHZt/g9jYWBUvXlzPP/+8LBaLChcu/MBjDBw4UH379rW+jo+PJ6gDAAAAyDCE9AxUu3ZtTZ8+3Wbdzp071bZtW0l3AvvYsWO1aNEi/fHHH7px44Zu3LghFxcXm33KlClj8zp//vw6e/asJCk6OlqFChWyBnRJqlat2gPrioyM1MaNG1P83viJEycyJaSXKlVKdnb/N1EjX758Cg4Otr62t7dXrly5rOcVGRmp48ePy83Nzaaf69ev68SJE6k+pr29vfV1/vz5dfDgQZs2lSpVsnkdFham+vXrq0SJEnr55ZfVuHHjB34g4OjoKEdHx1TVAwAAAABpRUjPQC4uLvL397dZ9/vvv1v/njhxoj766CNNmjRJpUuXlouLi3r37p1sOne2bNlsXlssFiUmJkqSDMNIdtykkef7SUxMVJMmTTRu3Lhk2/Lnz//gk0qnlM7hQeeVmJioihUrav78+cn6ypMnT7qPmdR/kns/EKlQoYJOnTqlH3/8UevWrVNoaKjq1aunb775JlXHBAAAAICMREh/jDZv3qymTZtaR9YTExN17NgxlSxZMtV9BAUFKTY2Vn/++ad8fHwkSdu3b3/gPhUqVNCSJUvk5+cnBwdz/pNXqFBBixYtUt68eeXu7v5Yj+3u7q6WLVuqZcuWatGihV5++WVduHBBXl5ej7UOAAAAAODBcY+Rv7+/1q5dq23btik6OlpvvfWWzpw5k6Y+6tWrpxIlSqh9+/Y6cOCANm/erEGDBj1wn27duunChQtq1aqVdu3apZMnT2rNmjXq1KmTzXfms1KbNm2UO3duNW3aVJs3b9apU6f0008/qVevXjazETLaRx99pIULF+rw4cM6evSovv76a3l7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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10,6))\n", "\n", "sns.barplot(\n", " x='Importance',\n", " y='Feature',\n", " data=importance.head(10)\n", ")\n", "\n", "plt.title(\"Top 10 Important Features\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "769d5980-6adc-439c-9917-b6e7be3f37dd", "metadata": {}, "source": [ "# Model Comparison Table " ] }, { "cell_type": "code", "execution_count": 155, "id": "47d10aea-128d-45b8-b32e-9a4ea668219e", "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", "
ModelAccuracy
0Logistic Regression0.824342
1Decision Tree0.978444
2Random Forest0.987840
\n", "
" ], "text/plain": [ " Model Accuracy\n", "0 Logistic Regression 0.824342\n", "1 Decision Tree 0.978444\n", "2 Random Forest 0.987840" ] }, "execution_count": 155, "metadata": {}, "output_type": "execute_result" } ], "source": [ "comparison = pd.DataFrame({\n", " 'Model': [\n", " 'Logistic Regression',\n", " 'Decision Tree',\n", " 'Random Forest'\n", " ],\n", " 'Accuracy': [\n", " accuracy_score(y_test, pred_lr),\n", " accuracy_score(y_test, pred_dt),\n", " accuracy_score(y_test, pred_rf)\n", " ]\n", "})\n", "\n", "comparison" ] }, { "cell_type": "markdown", "id": "36739c40-96a4-4bf9-8380-43bc8e625dae", "metadata": {}, "source": [ "## checking the data leakage " ] }, { "cell_type": "code", "execution_count": 156, "id": "139c6362-4ac4-4297-8aba-b2a0f06c73dd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['CI_Name', 'CI_Cat', 'CI_Subcat', 'Status', 'number_cnt', 'Category', 'Alert_Status', 'No_of_Reassignments', 'Handle_Time_hrs', 'Closure_Code', 'No_of_Related_Interactions', 'No_of_Related_Incidents', 'No_of_Related_Changes', 'Open_Year', 'Open_Month', 'Open_DayOfWeek', 'Open_Hour']\n" ] } ], "source": [ "print(X.columns.tolist())" ] }, { "cell_type": "code", "execution_count": 157, "id": "09a1885f-07e1-4a8a-a648-aeef452628d6", "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", " \n", " \n", "
FeatureImportance
2CI_Subcat0.240397
0CI_Name0.186192
9Closure_Code0.121076
11No_of_Related_Incidents0.097424
1CI_Cat0.089744
14Open_Month0.042758
7No_of_Reassignments0.040874
12No_of_Related_Changes0.032726
8Handle_Time_hrs0.031191
13Open_Year0.030333
5Category0.024331
10No_of_Related_Interactions0.022285
16Open_Hour0.017934
4number_cnt0.013872
15Open_DayOfWeek0.008763
\n", "
" ], "text/plain": [ " Feature Importance\n", "2 CI_Subcat 0.240397\n", "0 CI_Name 0.186192\n", "9 Closure_Code 0.121076\n", "11 No_of_Related_Incidents 0.097424\n", "1 CI_Cat 0.089744\n", "14 Open_Month 0.042758\n", "7 No_of_Reassignments 0.040874\n", "12 No_of_Related_Changes 0.032726\n", "8 Handle_Time_hrs 0.031191\n", "13 Open_Year 0.030333\n", "5 Category 0.024331\n", "10 No_of_Related_Interactions 0.022285\n", "16 Open_Hour 0.017934\n", "4 number_cnt 0.013872\n", "15 Open_DayOfWeek 0.008763" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "importance.sort_values(\n", " by='Importance',\n", " ascending=False\n", ").head(15)" ] }, { "cell_type": "markdown", "id": "fb31a748-65bd-4072-b6c8-9f924fa2314e", "metadata": {}, "source": [ "###### the model is using importance and urgency combined as priority and is not open to varied distributions , \n", "X = df.drop(\n", " columns=[\n", " 'Priority',\n", " 'High_Priority',\n", " 'Impact',\n", " 'Urgency'\n", " ],\n", " errors='ignore'\n", ")\n", "\n", "y = df['High_Priority']\n", "\n", "###### During model development, Impact and Urgency were excluded from the final feature set because these variables directly influence ticket Priority through existing ITSM business rules. Including them introduced target leakage and produced unrealistically high predictive performance. Therefore, the final model was trained using operational and incident-related attributes only. thus , giving precisice and realistic accuracy predictions" ] }, { "cell_type": "markdown", "id": "898ca01f-ac5f-49ad-bbba-6b0d5145f71c", "metadata": {}, "source": [ "## _________________________ANALYSIS________________________" ] }, { "cell_type": "markdown", "id": "3ad22c7e-37dc-45d7-a3dc-88cea949af76", "metadata": {}, "source": [ "### Business Interpretation\n", "\n", "The analysis suggests that:\n", "\n", "Certain application categories (CI_Name, CI_Subcat) are more prone to high-priority incidents.\n", "Tickets with more related incidents tend to become critical.\n", "Reassignments contribute to incident severity.\n", "Historical closure patterns contain useful information for predicting critical incidents.\n", "Seasonal patterns (Open_Month) also influence incident occurrence" ] }, { "cell_type": "markdown", "id": "a597df8c-1f77-4b70-a6f1-79ea16cf0c31", "metadata": {}, "source": [ "The objective of this project was to improve IT Service Management (ITSM) processes by predicting high-priority incidents using machine learning techniques. Data consisting of 46,606 incident records was extracted from the ABC Tech ITSM database and analyzed.\n", "\n", "The dataset underwent extensive preprocessing, including missing value treatment, date-time feature engineering, categorical encoding, and class imbalance handling using SMOTE. Three machine learning algorithms were developed and evaluated: Logistic Regression, Decision Tree, and Random Forest.\n", "\n", "Among all models, the Random Forest classifier achieved the highest performance with an accuracy of 98.78%, outperforming Logistic Regression and Decision Tree models. The analysis revealed that CI Subcategory, CI Name, Closure Code, and Related Incidents were the most influential factors in identifying high-priority incidents.\n", "\n", "The developed model can assist ABC Tech in proactively identifying critical incidents, improving incident response planning, optimizing resource allocation, and reducing service disruptions." ] }, { "cell_type": "markdown", "id": "e0607bce-f735-48bc-aa0b-33c1b41fc04f", "metadata": {}, "source": [ "## Future Scope\n", "\n", "The current project focuses on predicting high-priority incidents using structured ticket information. Future enhancements may include:\n", "\n", "Integration of Natural Language Processing (NLP) to analyze ticket descriptions and comments.\n", "Real-time prediction through deployment using Streamlit or Flask.\n", "SLA breach prediction for proactive service management.\n", "Incident volume forecasting using time-series models.\n", "Automated ticket routing and department recommendation systems.\n", "Integration with ITSM platforms such as ServiceNow and Remedy." ] }, { "cell_type": "markdown", "id": "21a81c67-3085-4118-b61a-696733b38829", "metadata": {}, "source": [ "--------------------------------------------------------------------------------------------------------------" ] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:base] *", "language": "python", "name": "conda-base-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.13.0" } }, "nbformat": 4, "nbformat_minor": 5 }