Loading
Loading
الإحصاء يُمكّنك من فهم البيانات، تقييم النماذج، واتخاذ قرارات مبنية على الأدلة.
أهم توزيع في الإحصاء — كثير من الظواهر الطبيعية تتبعه:
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✅ الإحصاء يُحوّل الأرقام إلى قرارات مبنية على أدلة!")