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