From 0a728b9c7c403cf89372a43c98e302743c8cae19 Mon Sep 17 00:00:00 2001
From: am2-liyanaarac <akash2.liyanaarachchi@live.uwe.ac.uk>
Date: Wed, 26 Apr 2023 09:37:27 +0100
Subject: [PATCH] Modified exception handling

---
 UFCFVQ-15-M_Python_Programming_Template.ipynb | 233 ++++++++++--------
 ..._Programming_With_Libraries_Template.ipynb | 204 +++++----------
 2 files changed, 194 insertions(+), 243 deletions(-)

diff --git a/UFCFVQ-15-M_Python_Programming_Template.ipynb b/UFCFVQ-15-M_Python_Programming_Template.ipynb
index 31dfbd8..ea57a12 100644
--- a/UFCFVQ-15-M_Python_Programming_Template.ipynb
+++ b/UFCFVQ-15-M_Python_Programming_Template.ipynb
@@ -71,15 +71,18 @@
     "    :param num_lst: A list of positive integers or floats.\n",
     "    :returns float: The geometric mean of the numbers in the list.\n",
     "    \"\"\"\n",
-    "    # product of numbers\n",
-    "    prod = 1\n",
+    "    try:\n",
+    "        # product of numbers\n",
+    "        prod = 1\n",
     "\n",
-    "    # loop through the numbers and multiply each number\n",
-    "    for number in num_lst:\n",
-    "        prod *= number\n",
+    "        # loop through the numbers and multiply each number\n",
+    "        for number in num_lst:\n",
+    "            prod *= number\n",
     "\n",
-    "    # Return the nth root of the product\n",
-    "    return prod ** (1 / len(num_lst))\n",
+    "        # Return the nth root of the product\n",
+    "        return prod ** (1 / len(num_lst))\n",
+    "    except (ValueError, Exception) as ex:\n",
+    "        print(f\"Error occurred: {ex}\")\n",
     "\n",
     "# Test the function with the provided list of numbers\n",
     "test_number_list = [64, 9, 90, 28, 46, 95, 34, 28, 86, 62, 14, 77, 99, 80,\n",
@@ -277,13 +280,13 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": 7,
    "outputs": [
     {
      "name": "stdout",
      "output_type": "stream",
      "text": [
-      "Spear-man's Rank Correlation Coefficient for `share_white` and `share_black`: -0.4916674832288337\n"
+      "Spear-man's Rank Correlation Coefficient for `age` and `pop`: 0.008388522728803749\n"
      ]
     }
    ],
@@ -295,17 +298,21 @@
     "    :return: float\n",
     "    \"\"\"\n",
     "\n",
-    "    # Handle exception for divide by zero error\n",
-    "    if len(numbers) == 0:\n",
-    "        raise ValueError(\"Your list should have at least one number\")\n",
+    "    try:\n",
+    "\n",
+    "        # Handle exception for divide by zero error\n",
+    "        if len(numbers) == 0:\n",
+    "            raise ValueError(\"Your list should have at least one number\")\n",
     "\n",
-    "    # initialize sum\n",
-    "    total = 0\n",
+    "        # initialize sum\n",
+    "        total = 0\n",
     "\n",
-    "    for num in numbers:\n",
-    "        total += num\n",
+    "        for num in numbers:\n",
+    "            total += num\n",
     "\n",
-    "    return total / len(numbers)\n",
+    "        return total / len(numbers)\n",
+    "    except (ZeroDivisionError, Exception) as ex:\n",
+    "        print(f\"Error occurred: {ex}\")\n",
     "\n",
     "def rank_list(lst):\n",
     "    \"\"\"\n",
@@ -314,15 +321,19 @@
     "    :return list: A list of ranked values\n",
     "    \"\"\"\n",
     "    ranks = {}\n",
-    "    for i, val in enumerate(sorted(lst), 1):\n",
-    "        #create a new list for each key if it doesn't already exist and append the rank of the corresponding value to it.\n",
-    "        ranks.setdefault(val, []).append(i)\n",
     "\n",
-    "    avg_ranks = {}\n",
-    "    for index, rank in ranks.items():\n",
-    "        avg_ranks[index] = arithmatic_mean(rank)\n",
+    "    try:\n",
+    "        for i, val in enumerate(sorted(lst), 1):\n",
+    "            #create a new list for each key if it doesn't already exist and append the rank of the corresponding value to it.\n",
+    "            ranks.setdefault(val, []).append(i)\n",
+    "\n",
+    "        avg_ranks = {}\n",
+    "        for index, rank in ranks.items():\n",
+    "            avg_ranks[index] = arithmatic_mean(rank)\n",
     "\n",
-    "    return [avg_ranks[val] for val in lst]\n",
+    "        return [avg_ranks[val] for val in lst]\n",
+    "    except Exception as ex:\n",
+    "        print(f\"Error occurred: {ex}\")\n",
     "\n",
     "\n",
     "def sm_correlation_coefficient(data1, data2):\n",
@@ -332,31 +343,35 @@
     "    :param data2: A column data as a list from csv file\n",
     "    :return: float: The Spear-man's Rank Correlation Coefficient\n",
     "    \"\"\"\n",
-    "    # raise an error if list sizes are not equal\n",
-    "    if len(data1) != len(data2):\n",
-    "        raise ValueError(\"Both lists must have the same length.\")\n",
     "\n",
-    "    ranked_data1 = rank_list(data1)\n",
-    "    ranked_data2 = rank_list(data2)\n",
+    "    try:\n",
+    "        # raise an error if list sizes are not equal\n",
+    "        if len(data1) != len(data2):\n",
+    "            raise ValueError(\"Both lists must have the same length.\")\n",
+    "\n",
+    "        ranked_data1 = rank_list(data1)\n",
+    "        ranked_data2 = rank_list(data2)\n",
     "\n",
-    "    # get the sum of squared differences of each item in both lists\n",
-    "    sum_sqr_diff = 0\n",
-    "    for i in range(len(ranked_data1)):\n",
-    "        diff = ranked_data1[i] - ranked_data2[i] # differences of each list item\n",
-    "        sqr = diff ** 2 # squared differences\n",
-    "        sum_sqr_diff += sqr # get the sum of each squared differences\n",
+    "        # get the sum of squared differences of each item in both lists\n",
+    "        sum_sqr_diff = 0\n",
+    "        for i in range(len(ranked_data1)):\n",
+    "            diff = ranked_data1[i] - ranked_data2[i] # differences of each list item\n",
+    "            sqr = diff ** 2 # squared differences\n",
+    "            sum_sqr_diff += sqr # get the sum of each squared differences\n",
     "\n",
-    "    # Calculate the Spear-man's Rank Correlation Coefficient using the formula\n",
-    "    n = len(data1)\n",
-    "    correlation_coefficient = 1 - (6 * sum_sqr_diff) / (n * (n ** 2 - 1))\n",
+    "        # Calculate the Spear-man's Rank Correlation Coefficient using the formula\n",
+    "        n = len(data1)\n",
+    "        correlation_coefficient = 1 - (6 * sum_sqr_diff) / (n * (n ** 2 - 1))\n",
     "\n",
-    "    return correlation_coefficient\n",
+    "        return correlation_coefficient\n",
+    "    except(ValueError, Exception) as ex:\n",
+    "        print(f\"Error occurred: {ex}\")\n",
     "\n",
     "\n",
     "# Read two columns of data from the CSV file\n",
     "file_path = 'task1.csv'\n",
-    "column1_name, column1_data = read_column(file_path, 2, True)\n",
-    "column2_name, column2_data = read_column(file_path, 3, True)\n",
+    "column1_name, column1_data = read_column(file_path, 0, True)\n",
+    "column2_name, column2_data = read_column(file_path, 1, True)\n",
     "\n",
     "# Calculate the Spear-man's Rank Correlation Coefficient for the two columns\n",
     "try:\n",
@@ -410,27 +425,30 @@
     "    # Initialize an empty list to store the correlation coefficients\n",
     "    all_correlation_coefficients = []\n",
     "\n",
-    "    # Iterate through all pairs of columns\n",
-    "    for row_name in range(len(column_names)):\n",
-    "        for col_name in range(len(column_names)):\n",
-    "            # skip the comparison of the same column with itself\n",
-    "            if row_name == col_name:\n",
-    "                continue\n",
-    "\n",
-    "            column1_name = column_names[row_name]\n",
-    "            column1_data = all_column_data[column1_name]\n",
-    "\n",
-    "            column2_name = column_names[col_name]\n",
-    "            column2_data = all_column_data[column2_name]\n",
-    "\n",
-    "            # Calculate the Correlation Coefficient for the current pair of columns\n",
-    "            try:\n",
-    "                sm_cor_coefficient = sm_correlation_coefficient(column1_data, column2_data)\n",
-    "                all_correlation_coefficients.append((column1_name, column2_name, sm_cor_coefficient))\n",
-    "            except (ValueError, Exception) as ex:\n",
-    "                print(f\"An error occurred: {ex}\")\n",
-    "\n",
-    "    return all_correlation_coefficients\n",
+    "    try:\n",
+    "        # Iterate through all pairs of columns\n",
+    "        for row_name in range(len(column_names)):\n",
+    "            for col_name in range(len(column_names)):\n",
+    "                # skip the comparison of the same column with itself\n",
+    "                if row_name == col_name:\n",
+    "                    continue\n",
+    "\n",
+    "                column1_name = column_names[row_name]\n",
+    "                column1_data = all_column_data[column1_name]\n",
+    "\n",
+    "                column2_name = column_names[col_name]\n",
+    "                column2_data = all_column_data[column2_name]\n",
+    "\n",
+    "                # Calculate the Correlation Coefficient for the current pair of columns\n",
+    "                try:\n",
+    "                    sm_cor_coefficient = sm_correlation_coefficient(column1_data, column2_data)\n",
+    "                    all_correlation_coefficients.append((column1_name, column2_name, sm_cor_coefficient))\n",
+    "                except (ValueError, Exception) as ex:\n",
+    "                    print(f\"An error occurred: {ex}\")\n",
+    "\n",
+    "        return all_correlation_coefficients\n",
+    "    except (ValueError, IndexError, Exception) as ex:\n",
+    "        print(f\"Error occurred: {ex}\")\n",
     "\n",
     "# Test the function\n",
     "result = generate_all_correlation_coefficients('task1.csv')\n",
@@ -458,7 +476,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 8,
    "metadata": {
     "deletable": false
    },
@@ -489,56 +507,59 @@
     "    longest_string_length = len(max(columns, key=len))\n",
     "    max_cell_length = longest_string_length + 5\n",
     "\n",
-    "    # print top boarder\n",
-    "    # Initialize a variable to hold the sum of string lengths starts with 1 to hold the cell gap.\n",
-    "    sum_col_lengths = 1\n",
-    "\n",
-    "    # Loop over each string in the list and add its length to the running total\n",
-    "    for name in columns:\n",
-    "        sum_col_lengths += len(name)\n",
-    "\n",
-    "    sum_col_lengths += len(columns)  * 7\n",
-    "    print(\" \" * max_cell_length + border_char * sum_col_lengths)\n",
+    "    try:\n",
+    "        # print top boarder\n",
+    "        # Initialize a variable to hold the sum of string lengths starts with 1 to hold the cell gap.\n",
+    "        sum_col_lengths = 1\n",
     "\n",
-    "    # print the column names\n",
-    "    print(\" \" * max_cell_length, end=\"\")\n",
-    "    for name in columns:\n",
-    "        print(border_char + \" \" * 3 + name + \" \" * 3 , end=\"\")\n",
-    "    print(border_char)\n",
+    "        # Loop over each string in the list and add its length to the running total\n",
+    "        for name in columns:\n",
+    "            sum_col_lengths += len(name)\n",
     "\n",
-    "    # print header separator\n",
-    "    print(border_char * (max_cell_length + sum_col_lengths))\n",
+    "        sum_col_lengths += len(columns)  * 7\n",
+    "        print(\" \" * max_cell_length + border_char * sum_col_lengths)\n",
     "\n",
-    "    # print the correlation coefficients\n",
-    "    for i, value in enumerate(columns):\n",
-    "        string_len_diff = longest_string_length - len(value) + 5\n",
-    "        space_count = int(string_len_diff / 2)\n",
+    "        # print the column names\n",
+    "        print(\" \" * max_cell_length, end=\"\")\n",
+    "        for name in columns:\n",
+    "            print(border_char + \" \" * 3 + name + \" \" * 3 , end=\"\")\n",
+    "        print(border_char)\n",
     "\n",
-    "        if len(value) % 2 == 0:\n",
-    "            print(border_char + space_count * \" \" + value + (space_count - 1) * \" \", end=\"\")\n",
-    "        else:\n",
-    "            print(border_char + space_count * \" \" + value + space_count * \" \", end=\"\")\n",
+    "        # print header separator\n",
+    "        print(border_char * (max_cell_length + sum_col_lengths))\n",
     "\n",
-    "        for col_name in columns:\n",
-    "            if value == col_name:\n",
-    "                cell_space = int(((len(col_name) + 7 ) / 2) -1) * \" \"\n",
-    "                print(border_char + cell_space + \"-\" + cell_space, end=\"\")\n",
+    "        # print the correlation coefficients\n",
+    "        for i, value in enumerate(columns):\n",
+    "            string_len_diff = longest_string_length - len(value) + 5\n",
+    "            space_count = int(string_len_diff / 2)\n",
     "\n",
+    "            if len(value) % 2 == 0:\n",
+    "                print(border_char + space_count * \" \" + value + (space_count - 1) * \" \", end=\"\")\n",
     "            else:\n",
-    "                for element in correlations:\n",
-    "                    if element[0] == value and element[1] == col_name:\n",
-    "                        correlation_coefficient = round(element[2], 4)\n",
-    "                        cell_space = (len(col_name)) // 2 * \" \"\n",
-    "                        if correlation_coefficient > 0:\n",
-    "                            print(border_char + \" \" +cell_space + str(correlation_coefficient) + cell_space, end=\"\")\n",
-    "                        else:\n",
-    "                            print(border_char +cell_space + str(correlation_coefficient) + cell_space, end=\"\")\n",
-    "\n",
-    "\n",
-    "        print(border_char)\n",
-    "\n",
-    "    # print footer\n",
-    "    print(border_char * (max_cell_length + sum_col_lengths))\n",
+    "                print(border_char + space_count * \" \" + value + space_count * \" \", end=\"\")\n",
+    "\n",
+    "            for col_name in columns:\n",
+    "                if value == col_name:\n",
+    "                    cell_space = int(((len(col_name) + 7 ) / 2) -1) * \" \"\n",
+    "                    print(border_char + cell_space + \"-\" + cell_space, end=\"\")\n",
+    "\n",
+    "                else:\n",
+    "                    for element in correlations:\n",
+    "                        if element[0] == value and element[1] == col_name:\n",
+    "                            correlation_coefficient = round(element[2], 4)\n",
+    "                            cell_space = (len(col_name)) // 2 * \" \"\n",
+    "                            if correlation_coefficient > 0:\n",
+    "                                print(border_char + \" \" +cell_space + str(correlation_coefficient) + cell_space, end=\"\")\n",
+    "                            else:\n",
+    "                                print(border_char +cell_space + str(correlation_coefficient) + cell_space, end=\"\")\n",
+    "\n",
+    "\n",
+    "            print(border_char)\n",
+    "\n",
+    "        # print footer\n",
+    "        print(border_char * (max_cell_length + sum_col_lengths))\n",
+    "    except Exception as ex:\n",
+    "        print(f\"Error occurred: {ex}\")\n",
     "\n",
     "\n",
     "file_path = 'task1.csv'\n",
diff --git a/UFCFVQ-15-M_Python_Programming_With_Libraries_Template.ipynb b/UFCFVQ-15-M_Python_Programming_With_Libraries_Template.ipynb
index 71a756a..074a8cd 100644
--- a/UFCFVQ-15-M_Python_Programming_With_Libraries_Template.ipynb
+++ b/UFCFVQ-15-M_Python_Programming_With_Libraries_Template.ipynb
@@ -23,7 +23,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 8,
+   "execution_count": 1,
    "metadata": {
     "deletable": false
    },
@@ -33,17 +33,17 @@
      "output_type": "stream",
      "text": [
       "       Unnamed: 0  id_student gender                region   \n",
-      "0               0       11391      M   East Anglian Region  \\\n",
-      "1               1       28400      F              Scotland   \n",
-      "2               2       31604      F     South East Region   \n",
-      "3               3       32885      F  West Midlands Region   \n",
-      "4               4       38053      M                 Wales   \n",
+      "0             0.0       11391      M   East Anglian Region  \\\n",
+      "1             1.0       28400      F              Scotland   \n",
+      "2             2.0       31604      F     South East Region   \n",
+      "3             3.0       32885      F  West Midlands Region   \n",
+      "4             4.0       38053      M                 Wales   \n",
       "...           ...         ...    ...                   ...   \n",
-      "26716       26741     2620947      F              Scotland   \n",
-      "26717       26742     2645731      F   East Anglian Region   \n",
-      "26718       26743     2648187      F          South Region   \n",
-      "26719       26744     2679821      F     South East Region   \n",
-      "26720       26745     2684003      F      Yorkshire Region   \n",
+      "29471         NaN     2687739    NaN                   NaN   \n",
+      "29472         NaN     2690136    NaN                   NaN   \n",
+      "29473         NaN     2693772    NaN                   NaN   \n",
+      "29474         NaN     2697608    NaN                   NaN   \n",
+      "29475         NaN     2697773    NaN                   NaN   \n",
       "\n",
       "           highest_education age_band disability final_result  score   \n",
       "0           HE Qualification     55<=          N         Pass   82.0  \\\n",
@@ -52,11 +52,11 @@
       "3         Lower Than A Level     0-35          N         Pass   55.0   \n",
       "4      A Level or Equivalent    35-55          N         Pass   68.0   \n",
       "...                      ...      ...        ...          ...    ...   \n",
-      "26716  A Level or Equivalent     0-35          Y  Distinction   89.0   \n",
-      "26717     Lower Than A Level    35-55          N  Distinction   89.0   \n",
-      "26718  A Level or Equivalent     0-35          Y         Pass   77.0   \n",
-      "26719     Lower Than A Level    35-55          N    Withdrawn   92.0   \n",
-      "26720       HE Qualification    35-55          N  Distinction   83.0   \n",
+      "29471                    NaN      NaN        NaN          NaN    NaN   \n",
+      "29472                    NaN      NaN        NaN          NaN    NaN   \n",
+      "29473                    NaN      NaN        NaN          NaN    NaN   \n",
+      "29474                    NaN      NaN        NaN          NaN    NaN   \n",
+      "29475                    NaN      NaN        NaN          NaN    NaN   \n",
       "\n",
       "       click_events  \n",
       "0             934.0  \n",
@@ -65,13 +65,13 @@
       "3            1034.0  \n",
       "4            2445.0  \n",
       "...             ...  \n",
-      "26716         476.0  \n",
-      "26717         893.0  \n",
-      "26718         312.0  \n",
-      "26719         275.0  \n",
-      "26720         616.0  \n",
+      "29471          31.0  \n",
+      "29472          34.0  \n",
+      "29473          20.0  \n",
+      "29474          26.0  \n",
+      "29475         148.0  \n",
       "\n",
-      "[26721 rows x 10 columns]\n"
+      "[29476 rows x 10 columns]\n"
      ]
     }
    ],
@@ -80,7 +80,6 @@
     "import matplotlib.pyplot as plt\n",
     "import seaborn as sns\n",
     "from scipy import stats\n",
-    "from scipy.stats import ks_2samp\n",
     "\n",
     "# Reading the csv files and passing them to dataframes\n",
     "df_students = pd.read_csv('task2a.csv')\n",
@@ -113,7 +112,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
+   "execution_count": 2,
    "metadata": {
     "deletable": false
    },
@@ -123,17 +122,17 @@
      "output_type": "stream",
      "text": [
       "       Unnamed: 0  id_student gender age_band disability  score  click_events\n",
-      "0               0       11391      M     55<=          N   82.0         934.0\n",
-      "1               1       28400      F    35-55          N   67.0        1435.0\n",
-      "2               2       31604      F    35-55          N   76.0        2158.0\n",
-      "3               3       32885      F     0-35          N   55.0        1034.0\n",
-      "4               4       38053      M    35-55          N   68.0        2445.0\n",
+      "0             0.0       11391      M     55<=          N   82.0         934.0\n",
+      "1             1.0       28400      F    35-55          N   67.0        1435.0\n",
+      "2             2.0       31604      F    35-55          N   76.0        2158.0\n",
+      "3             3.0       32885      F     0-35          N   55.0        1034.0\n",
+      "4             4.0       38053      M    35-55          N   68.0        2445.0\n",
       "...           ...         ...    ...      ...        ...    ...           ...\n",
-      "26716       26741     2620947      F     0-35          Y   89.0         476.0\n",
-      "26717       26742     2645731      F    35-55          N   89.0         893.0\n",
-      "26718       26743     2648187      F     0-35          Y   77.0         312.0\n",
-      "26719       26744     2679821      F    35-55          N   92.0         275.0\n",
-      "26720       26745     2684003      F    35-55          N   83.0         616.0\n",
+      "26741     26741.0     2620947      F     0-35          Y   89.0         476.0\n",
+      "26742     26742.0     2645731      F    35-55          N   89.0         893.0\n",
+      "26743     26743.0     2648187      F     0-35          Y   77.0         312.0\n",
+      "26744     26744.0     2679821      F    35-55          N   92.0         275.0\n",
+      "26745     26745.0     2684003      F    35-55          N   83.0         616.0\n",
       "\n",
       "[25332 rows x 7 columns]\n"
      ]
@@ -170,7 +169,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 10,
+   "execution_count": 3,
    "metadata": {
     "deletable": false
    },
@@ -180,17 +179,17 @@
      "output_type": "stream",
      "text": [
       "       Unnamed: 0  id_student gender age_band disability  score  click_events\n",
-      "0               0       11391      M     55<=          N   82.0         934.0\n",
-      "1               1       28400      F    35-55          N   67.0        1435.0\n",
-      "2               2       31604      F    35-55          N   76.0        2158.0\n",
-      "3               3       32885      F     0-35          N   55.0        1034.0\n",
-      "4               4       38053      M    35-55          N   68.0        2445.0\n",
+      "0             0.0       11391      M     55<=          N   82.0         934.0\n",
+      "1             1.0       28400      F    35-55          N   67.0        1435.0\n",
+      "2             2.0       31604      F    35-55          N   76.0        2158.0\n",
+      "3             3.0       32885      F     0-35          N   55.0        1034.0\n",
+      "4             4.0       38053      M    35-55          N   68.0        2445.0\n",
       "...           ...         ...    ...      ...        ...    ...           ...\n",
-      "26716       26741     2620947      F     0-35          Y   89.0         476.0\n",
-      "26717       26742     2645731      F    35-55          N   89.0         893.0\n",
-      "26718       26743     2648187      F     0-35          Y   77.0         312.0\n",
-      "26719       26744     2679821      F    35-55          N   92.0         275.0\n",
-      "26720       26745     2684003      F    35-55          N   83.0         616.0\n",
+      "26741     26741.0     2620947      F     0-35          Y   89.0         476.0\n",
+      "26742     26742.0     2645731      F    35-55          N   89.0         893.0\n",
+      "26743     26743.0     2648187      F     0-35          Y   77.0         312.0\n",
+      "26744     26744.0     2679821      F    35-55          N   92.0         275.0\n",
+      "26745     26745.0     2684003      F    35-55          N   83.0         616.0\n",
       "\n",
       "[22133 rows x 7 columns]\n"
      ]
@@ -227,9 +226,12 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {
-    "deletable": false
+    "deletable": false,
+    "pycharm": {
+     "is_executing": true
+    }
    },
    "outputs": [
     {
@@ -239,26 +241,6 @@
      },
      "metadata": {},
      "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Correlation Coefficient between Click Events and Scores: 0.28 \n",
-      "\n",
-      "Explanation  of findings: \n",
-      " \n",
-      "    It was difficult to discern a clear pattern in the data when I attempted to visualise the relationship between click events and scores using various types of plots due to the high density of data points. However, I utilised a scatter plot with each dot's transparency set to 0.2. Because of this, I can observe the Visualization's density as well as the data's distribution.\n",
-      "\n",
-      "    As can be seen in the graph, there is a high density between 0 and 5000 click events, and the students earned more than 60% of marks on their exams. This visualisation illustrates a weakly positive correlation between click events and scores. This indicates that as students' engagement (as measured by click events) increases, their achievement (as measured by scores) tends to increase as well, though not significantly.\n",
-      "\n",
-      "    According to the plot, many students have superior grades (>60) despite having a small number of click events. Nonetheless, there are a few students with greater click events who scored above 80%.\n",
-      "\n",
-      "    According to the calculated correlation coefficient of 0.28, a positive but faint correlation exists between click events and scores.\n",
-      "\n",
-      "    In conclusion, the weak positive correlation between click events and scores indicates that there may be a weak relationship between engagement and achievement.\n",
-      "\n"
-     ]
     }
    ],
    "source": [
@@ -312,30 +294,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
+   "execution_count": null,
    "metadata": {
-    "deletable": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "P-value:  0.0000 \n",
-      "\n",
-      "reject H0. This means there are not enough evidence to say that Click events do not have significant effect on scores\n",
-      "\n",
-      "Explanation  of findings: \n",
-      " \n",
-      "    I performed a t-test to test if there is any statistically significant relation between engagement and attainment. For the samples. According to the test, I got 0.000 as the p-value.\n",
-      "\n",
-      "    The p-value is less than chosen significant level (which means 0.05) and I can conclude that there is a statistically significant difference between the attainment levels of students with engagement (click events) which implies that engagement does have some effect on levels of attainment. This means I cannot reject the null hypothesis.\n",
-      "\n",
-      "    However, the p-value of 0.000 does not imply that the correlation between click events and the scores is strong. It means according to statistical analysis, the likelihood of detecting any correlation between click events and scores in the observed data is exceedingly low.Therefore, I have evidence to suggest that there is some correlation between the click events and scores.\n",
-      "    \n"
-     ]
+    "deletable": false,
+    "pycharm": {
+     "is_executing": true
     }
-   ],
+   },
+   "outputs": [],
    "source": [
     "# I am taking the hypothesis as follows\n",
     "#\n",
@@ -395,36 +361,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "metadata": {
-    "deletable": false
-   },
-   "outputs": [
-    {
-     "data": {
-      "text/plain": "<Figure size 800x600 with 1 Axes>",
-      "image/png": "iVBORw0KGgoAAAANSUhEUgAAArQAAAIhCAYAAAC/lSkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABLbklEQVR4nO3dd3wUdf7H8fembQIJKKEIqEgxCIGEGEQOQRBCUSkaUJEiotI5LGehiOiBRkDK0Zsi7cCDgA88OUTAxgkiCOGw0hSkSAICCenJ/P7wx8KaDYRsdmeHvJ6PRx6P7Pczu/OZze7wZvY7szbDMAwBAAAAFuVndgMAAACAOwi0AAAAsDQCLQAAACyNQAsAAABLI9ACAADA0gi0AAAAsDQCLQAAACyNQAsAAABLI9ACsJQ/fxdMaftumNK2vTAHrzNYDYEW8ILevXurd+/eZrfh0Lp1aw0fPtzj6/nxxx/1wAMPqEGDBrrvvvsuu+y//vUv1a1bVwMHDnRZP3HihPr376+jR486xjZt2qSXXnrpqvuqW7eupk+fftX3M5Or7f+zr776SnXr1tVXX33lsT727NmjESNGqE2bNoqKilKTJk3Up08f/fvf//bYOl359ddfVbduXa1evdqj6/noo4/Uo0cPp3Ve+hMZGam7775br7zyik6fPu3RXi7o3bt3gT4aNGigVq1a6bXXXtPZs2cdyxbnvf7n99XBgwfVunVrnTt3rsS2AShpAWY3AODaNXPmTB07dkwzZ85UhQoVLrtsYmKiIiIi9Pnnn+v48eOqWrWqU/3LL7/UZ5995jT27rvvFquv9957TzfccEOx7msWV9vvbe+++64mTJigxo0ba+jQobrxxht19uxZbdiwQc8//7x2796tl19+2dQeS9KpU6f02muvaf78+U7jgwYNUqtWrSRJWVlZOnTokKZPn679+/frn//8p1d6q1+/vsaMGeO4nZOTo2+//VaTJ0/W999/r+XLl8tmsxXrsf/8vqpVq5batGmjcePGacKECe60DXgMgRaAx/z++++KiIhQy5YtL7vcgQMHtHv3bi1YsEDPPvus3nvvPT3zzDMe66tRo0Yee+xr1VdffaU333xTvXr1KhBa4+LidNttt2n8+PHq2LHjNfP8zp49W1FRUYqMjHQav/nmm5228c4771RgYKBGjhypffv26dZbb/V4b6GhoQWe5zvuuEPnz5/XtGnTlJSUVKJ/h/79+6tVq1bq06dPgecD8AVMOQB8yI4dO9SrVy9FR0erSZMmeumllxwfY544cUL16tXT0qVLne5z+vRpRUZGOo6q5Ofna968eWrbtq0aNGig9u3ba8mSJZdd77///W917txZUVFRatq0qZ5//nn99ttvl73PyZMnNWLECLVs2VJRUVHq1q2bNm3a5KjXrVtX27dv19dff33Fj4YTExNVvnx5NW3aVO3bt9eqVauUm5vrqK9evVojRoyQJLVp00bDhw9X7969tX37dm3fvt3pY/YffvhBQ4cOVdOmTRUZGakWLVpo3LhxyszMdOrtwpSDCx/Tb926VU888YSio6N11113aeLEicrLy3O6z/LlyzV8+HDFxsaqSZMmjscdP368mjZtqjvvvFOjRo1SVlaW435F+Xv07t1bo0aN0rx589SqVSs1bNhQ3bt31549ewrd/svZv3+/evTooYYNG6pt27ZO6xs2bJjuvvtu5efnO91n1KhRat++faGPOXPmTFWtWlUvvPCCy/pjjz2mNm3aKCMjwzGWlZWlCRMmqGXLlmrQoIE6deqkdevWOd2vdevWmjZtmsaPH69mzZopKipKTz75pH7++Wen5TZs2OB4jT744IP64YcfCvRw5swZvfLKK2rWrJkaNmyohx9+WFu3bnVapm7dupoxY4bi4+MVFRWlGTNmuNye06dPa9WqVerYsWOhz8mlypcvL0lOR0VTU1OVkJCguLg4NWzYUB07dtSqVasc9U2bNhWY/nLgwAFFRUVp5MiRRVrvnzVo0ECSdOzYMZf1K/VU2PuqUqVKatq0qebOnVusvgBPI9ACPuLrr7/W448/ruDgYE2dOlUjR47U9u3b9dhjjykzM1M33HCDmjRpog8//NDpfuvXr5dhGLr//vslSa+++qqmTZumzp07a86cOerQoYPeeOMNzZw50+V6d+7cqRdffFHt2rXT/PnzNWLECG3btk1/+9vfCu01JSVF3bp1044dO/Tss89q+vTpql69uoYMGaK1a9dK+uNj/fr166t+/fp67733HB/R/llubq7Wrl2rjh07KjAwUA8++KCSk5O1efNmxzKtWrXSoEGDJEkzZszQ4MGDNWbMGKfHj4yM1MmTJ9WzZ09lZGTozTff1Pz583X//fdryZIlWrx48WWf/+eff16xsbGaM2eOOnbsqAULFmjlypVOy0ycOFFBQUGaMWOGHnjgAS1ZskQPPPCAjh8/rrfeeku9e/fWqlWrnAJkUf8eH330kTZt2qSXX35ZkydPVkpKiv76178qLy/P5fZfTkJCgho1aqTZs2c7Av2iRYskSd26ddNvv/3mNM82MzNT69ev14MPPujy8c6ePauvv/5abdq0kd1ud7lMQECAZs2apb/85S+S/jipaMiQIVqxYoX69u2r2bNnKyYmRs8++6zef/99p/suXrxYBw8eVEJCgsaNG6e9e/c6zeHcvHmzhg0bprp162rmzJm69957CwTrrKws9enTR5s2bdKzzz6rGTNm6IYbbtBTTz1VINTOmTNHnTp10rRp0woN8Rs2bFBubq7uueeeArX8/Hzl5uYqNzdXmZmZ+uGHHzRr1iw1bdpUderUcTynPXr00AcffKCnnnpKs2bNUmxsrEaNGqU5c+ZI+uM/J507d9bcuXN14MAB5ebm6sUXX1SVKlU0atQol31dyaFDhyRJN910U4FaUXpy9b66oEOHDtq8ebPOnz9frN4AjzIAeFyvXr2MXr16XXaZRx55xOjYsaORm5vrGDt48KBRr149Y+nSpYZhGEZiYqJRt25d4+jRo45levToYTz55JOO5evWrWvMnTvX6bGnTJliNGzY0Dh9+rRhGIZxzz33GC+99JJhGIYxd+5cIyYmxsjKynIs/+mnnxrTp0838vPzXfY6YcIEIzIy0vj111+dxvv06WPcddddRl5eXpG3e9OmTUZERITxv//9zzHWrl07o2/fvk7LJSYmGhEREcaRI0ccY39+/C+++MLo2bOnkZqa6nTfjh07Gk888YTjdkREhDFt2jTDMAxj27ZtRkREhDFlyhSn+7Ru3doYMGCA030eeughx+3c3FyjUaNGRuvWrY2cnByndQ0aNMgwjKL/PXr16mVER0c79b1mzRqn58XV9v/ZhW157bXXnMYHDx5s/OUvfzHy8vKMvLw84+677zZefPFFR33t2rXGbbfdZhw/ftzl43777bdGRESE43V4QX5+vpGTk+P0c+H1u2XLFiMiIsL48MMPne7z/PPPG3fddZfjObvnnnuMe+65x+l1P336dCMiIsLx/MTHxzs994bxx+s2IiLCSExMNAzDMN577z0jIiLC2L17t1N/PXv2NOLj4x1jERERRp8+fQp9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1J4Ke62dOHFCkuf+Iwa4gyO0gJecOHHC5RcBREREOOa/9e/fX3/729/UuXNn5eXl6Z133lFSUpLTWe3+/v66//77tXTpUlWpUkV33nmno1a3bl117txZo0eP1tGjR9WgQQMdOnRIU6ZM0Y033qhbbrmlwPqbNm2qhQsXavjw4ercubNycnK0YMECXXfddWratKnLbenbt6/Wrl2rxx9/XEOHDtV1112n999/X9u2bdMbb7xRpPC1Z88e/fTTTxo9erTLetu2bVW2bFmtWLFC999/v+No58cff6y7775btWvXVrly5bRr1y5t3bpV9evXV1RUlGbNmqV58+apUaNG+uWXXzR37lxlZ2cXay6qu4rz9yiMq+0vzJIlS1S2bFnVr19fH374ob744gtNmDDBaV5l+/btNXbsWO3Zs6fQv8GlWrRoodGjRyshIUG7d+/Wgw8+qJo1ayo9PV3bt29XYmKisrKy9Nhjj0mSWrZsqTvuuEODBw/W4MGDVbt2be3Zs0fTpk1TixYtrvhFG5d67rnn1KdPHw0dOlSPPPKIDh065Dgr/4L4+HgtXbpUffv21cCBA1W1alV9+eWXmj9/vnr16nXFI55/dtddd+k///mPUlNTC3x6cPjwYe3evdtxOyUlRQsWLFBaWpqeeuopRz///Oc/NWTIEA0bNkw33nijNm/erMTERA0dOlTlypVTdna2hg8frtq1a6tfv34KDAxUr169NHfuXMXFxal+/fpX1fOVFKUnSQXeVxemauzcuVMhISGO/6gBvoRAC3jJ4cOHlZCQUGC8W7duatasmZo3b663335bM2bM0LBhwxQYGKjIyEgtXLiwwEkiXbp00aJFi9SxY8cC4TEhIUFz587VihUrdOLECYWHh+u+++7TM8884/IoVcuWLfXWW2/pnXfecZwIFhsbq8WLF+u6665zuS2VKlXS8uXLNWnSJI0bN045OTm67bbbNGvWLLVp06ZIz0diYqL8/f3VoUMHl/WQkBC1b99eq1ev1oEDB3TnnXeqWbNmmjRpkrZu3ap58+apZ8+e2rt3r/r166eEhAQNGDBAv//+uxYvXuy4bmqXLl1ks9k0d+5cnTt3zvGPtrdc7d+jMK62vzDjxo3TggULNHXqVN10002aPHlygaksdrtdTZs21cGDB11OK3GlZ8+eatKkiZYvX66FCxfqxIkT8vf3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\n"
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Explanation  of findings: \n",
-      " \n",
-      "    Box plots were chosen because they are better at showing the distribution of a continuous variable across different categories of a categorical variable, like comparing scores by gender. This is because box plots give a clearer and more informative picture of how the data is distributed, handle overlapping data points better, and work well with large datasets.Box plots are made to show how the data for category variables are spread out. This makes it easy to compare medians, inter quartile ranges, and possible outliers across different groups.\n",
-      "\n",
-      "    As you can see in the box plots, the median score of female is slightly higher than median score of male. since the medians are not significantly different, we don't have strong evidence to conclude that female students getting more score than male students.\n",
-      "\n",
-      "    On other hand, the boxes itself are almost identical and it is not indicating a big difference in score variability between genders. According to the box plot, males have more outlines than females. It indicates that there are more individual data points for males that falls outside the typical range of scores.As I can see in the boxplot, the bottom whisker for females is slightly longer than males, indicating that the range of lower scores is somewhat larger for females.\n",
-      "\n",
-      "    Overall, this observations shows that, although there are some differences between the genders in terms of score distribution, the overall patterns are quite similar.\n",
-      "\n"
-     ]
+    "deletable": false,
+    "pycharm": {
+     "is_executing": true
     }
-   ],
+   },
+   "outputs": [],
    "source": [
     "# draw box-plot for see the relationship between gender and scores\n",
     "plt.figure(figsize=(8, 6))\n",
@@ -471,28 +415,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {
-    "deletable": false
-   },
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "P-value: 0.5073 \n",
-      "\n",
-      "fail to reject H0. This means that there are evidence to say there is no statistically significant difference between the attainment of male and female students  \n",
-      "\n",
-      "Explanation  of findings: \n",
-      " \n",
-      "    Bases on the p-value from above t-test (which is 0.5073) I cannot reject the null hypothesis that there is no significant difference between the male and female students with their scores. This p-value is greater than the typical significance level of 0.05 (which is alpha2 here), which means that there is not enough evidence to conclude that there is a statistically significant difference in the attainment levels of male and female students.\n",
-      "\n",
-      "    After analyzing the relevant data and employing statistical assessment, it appears that an individual's gender has minimal influence on their test scores. Nevertheless, it is important to realize that in not rejecting the null hypothesis, one does not necessarily prove its validity; rather, it implies a lack of conclusive proof endorsing marked differences between groups based on present findings.\n",
-      "\n"
-     ]
+    "deletable": false,
+    "pycharm": {
+     "is_executing": true
     }
-   ],
+   },
+   "outputs": [],
    "source": [
     "# We can use independent two-sample t-test to identify that is there any statistically significant difference between the attainment of male and female students.\n",
     "\n",
-- 
GitLab