Loading
Loading
Statistics enables you to understand data, evaluate models, and make evidence-based decisions.
The most important distribution in statistics ā many natural phenomena follow it:
import math
import random
from typing import List, Dict, Tuple
# āāā Ų„ŲŲµŲ§Ų” أساس٠āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
def mean(d: List[float]) -> float:
return sum(d) / len(d)
def median(d: List[float]) -> float:
s = sorted(d)
n = len(s)
return (s[n//2 - 1] + s[n//2]) / 2 if n % 2 == 0 else s[n//2]
def std(d: List[float]) -> float:
m = mean(d)
return math.sqrt(sum((x - m)**2 for x in d) / len(d))
def variance(d: List[float]) -> float:
m = mean(d)
return sum((x - m)**2 for x in d) / len(d)
def percentile(d: List[float], p: float) -> float:
s = sorted(d)
idx = p / 100 * (len(s) - 1)
lo = int(idx)
hi = min(lo + 1, len(s) - 1)
return s[lo] + (idx - lo) * (s[hi] - s[lo])
def describe(d: List[float], name: str):
p25, p75 = percentile(d, 25), percentile(d, 75)
print(f"\nš {name} (n={len(d)}):")
print(f" Mean : {mean(d):.4f}")
print(f" Median : {median(d):.4f}")
print(f" Std : {std(d):.4f}")
print(f" Min/Max : {min(d):.3f} / {max(d):.3f}")
iqr_str = f"{p75 - p25:.3f}"
print(f" IQR : {iqr_str} (P25={p25:.3f}, P75={p75:.3f})")
# āāā Ų§ŁŲŖŁŲ²ŁŲ¹ Ų§ŁŲ·ŲØŁŲ¹Ł āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
def normal_pdf(x: float, mu: float = 0, sigma: float = 1) -> float:
c = 1 / (sigma * math.sqrt(2 * math.pi))
return c * math.exp(-((x - mu)**2) / (2 * sigma**2))
def box_muller(mu: float, sigma: float, n: int, seed: int = 42) -> List[float]:
"""ŲŖŁŁŁŲÆ Ų¹ŁŁŲ§ŲŖ Ų·ŲØŁŲ¹ŁŲ© ŲØŁ Box-Muller"""
random.seed(seed)
out = []
while len(out) < n:
u1, u2 = random.random(), random.random()
z1 = math.sqrt(-2 * math.log(u1 + 1e-10)) * math.cos(2 * math.pi * u2)
z2 = math.sqrt(-2 * math.log(u1 + 1e-10)) * math.sin(2 * math.pi * u2)
out.extend([mu + sigma * z1, mu + sigma * z2])
return [max(0.0, min(1.0, x)) for x in out[:n]]
# āāā t-test āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
def t_test(a: List[float], b: List[float]) -> Dict:
n1, n2 = len(a), len(b)
m1, m2 = mean(a), mean(b)
se = math.sqrt(variance(a)/n1 + variance(b)/n2)
if se < 1e-10:
return {"t": 0.0, "diff": 0.0, "significant": False}
t = (m1 - m2) / se
return {"t": round(t, 3), "diff": round(m1 - m2, 5),
"significant": abs(t) > 1.96} # p < 0.05 ŲŖŁŲ±ŁŲØŲ§Ł
# āāā ŲŖŲŁŁŁ Ų£ŲÆŲ§Ų” ŁŁ
ŁŲ°Ų¬ŁŁ āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
print("š Ų§ŁŲ„ŲŲµŲ§Ų” ŁŁ AI ā Ł
ŁŲ§Ų±ŁŲ© Ų§ŁŁŁ
Ų§Ų°Ų¬:")
print("=" * 52)
acc_A = box_muller(mu=0.87, sigma=0.03, n=100, seed=1)
acc_B = box_muller(mu=0.91, sigma=0.02, n=100, seed=2)
describe(acc_A, "Model A ā DistilBERT")
describe(acc_B, "Model B ā RoBERTa")
test = t_test(acc_A, acc_B)
print(f"\nš t-test (ŁŁ RoBERTa Ų£ŁŲ¶Ł ŁŲ¹ŁŲ§ŁŲ):")
sig_str = "ŁŲ¹Ł
ā
(p < 0.05)" if test["significant"] else "ŁŲ§ ā (p >= 0.05)"
t_str = f"{test['t']:.3f}"
diff_str = f"{test['diff']:.5f}"
print(f" t-statistic : {t_str}")
print(f" ŁŲ±Ł Ų§ŁŁ
ŲŖŁŲ³Ų·Ų§ŲŖ : {diff_str}")
print(f" Ų§ŁŁŲ±Ł Ł
Ų¹ŁŁŁ Ų„ŲŲµŲ§Ų¦ŁŲ§ŁŲ : {sig_str}")
# āāā Ų§ŁŲŖŁŲ²ŁŲ¹ Ų§ŁŲ·ŲØŁŲ¹Ł āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
print(f"\n\nš Ų§ŁŲŖŁŲ²ŁŲ¹ Ų§ŁŲ·ŲØŁŲ¹Ł (μ=0, Ļ=1):")
print("-" * 48)
for x in [-2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0]:
p = normal_pdf(x)
bar = "ā" * int(p * 42)
x_s = f"{x:+.1f}"
p_s = f"{p:.4f}"
print(f" x={x_s}: {p_s} {bar}")
print(f"\n š ŁŲ§Ų¹ŲÆŲ© 68-95-99.7:")
print(f" ±1Ļ ā ~68% | ±2Ļ ā ~95% | ±3Ļ ā ~99.7%")
print(f"\nā
Ų§ŁŲ„ŲŲµŲ§Ų” ŁŁŲŁŁŁ Ų§ŁŲ£Ų±ŁŲ§Ł
Ų„ŁŁ ŁŲ±Ų§Ų±Ų§ŲŖ Ł
ŲØŁŁŲ© Ų¹ŁŁ Ų£ŲÆŁŲ©!")