Post

Probability and Statistics - Assignment

Prof. Samir Elmougy | Spring 2025/2026

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import statistics

# Input data
data = [115, 182, 191, 31, 196, 1099, 5, 172, 10, 179,
        83, 21, 20, 21, 186, 177, 195, 193, 188, 199,
        62, 109, 105, 183, 110]

n = len(data)
sorted_data = sorted(data)

print("Sorted data:", sorted_data)
print("n =", n)

# Percentile function (nearest rank)
def percentile(p):
    index = int((p / 100) * n)
    if index >= n:
        index = n - 1
    return sorted_data[index]

# -------------------------------
# TASK 1: Descriptive Statistics
# -------------------------------

mean = sum(data) / n

modes = statistics.multimode(data)
mode_display = modes[0] if len(modes) == 1 else modes

median = statistics.median(data)

variance = sum((x - mean) ** 2 for x in data) / n
std_dev = variance ** 0.5

p20 = percentile(20)
p50 = percentile(50)

q1 = percentile(25)
q2 = percentile(50)
q3 = percentile(75)

data_range = max(data) - min(data)
iqr = q3 - q1

sum_of_deviations = sum(abs(x - mean) for x in data)

print("\n" + "=" * 50)
print("TASK 1: DESCRIPTIVE STATISTICS")
print("=" * 50)
print(f"Mean                : {mean:.4f}")
print(f"Mode                : {mode_display}")
print(f"Median              : {median}")
print(f"Variance            : {variance:.4f}")
print(f"P20                 : {p20}")
print(f"P50                 : {p50}")
print(f"Q1                  : {q1}")
print(f"Q2 (Median)         : {q2}")
print(f"Q3                  : {q3}")
print(f"Range               : {data_range}")
print(f"IQR                 : {iqr}")
print(f"Standard Deviation  : {std_dev:.4f}")
print(f"Sum of Deviations   : {sum_of_deviations:.4f}")
print("=" * 50)

# -------------------------------
# TASK 2: Outlier Detection (IQR)
# -------------------------------

lower_fence = q1 - 1.5 * iqr
upper_fence = q3 + 1.5 * iqr

print("\n" + "=" * 50)
print("TASK 2: OUTLIER DETECTION")
print("=" * 50)
print(f"Lower fence: {lower_fence}")
print(f"Upper fence: {upper_fence}")
print("-" * 50)

outliers = []

for x in data:
    if x < lower_fence or x > upper_fence:
        outliers.append(x)
        print(f"{x}  -> OUTLIER")
    else:
        print(f"{x}  -> normal")

print("-" * 50)
print("Outliers:", outliers)
print("=" * 50)

This post is licensed under CC BY 4.0 by the author.

© lockveil