الإحصاء العملي للمهندس: المتوسط والانحراف والتوزيعات في بيانات المصنع
المتوسط والوسيط والمنوال
مقاييس النزعة المركزية هي أول أدوات فهم البيانات الصناعية. كل مقياس يخبرنا شيئاً مختلفاً:
import numpy as np
import pandas as pd
from scipy import stats
# بيانات سماكة طلاء على خط إنتاج (بالميكرومتر)
thickness = np.array([
50.2, 49.8, 51.1, 50.5, 49.9, 50.3, 50.0, 51.5, 49.7, 50.1,
50.4, 49.6, 50.8, 50.2, 50.0, 49.5, 51.0, 50.3, 50.6, 49.8,
50.1, 50.7, 49.9, 50.4, 85.0 # القيمة الأخيرة شاذة
])
mean_val = np.mean(thickness)
median_val = np.median(thickness)
mode_val = stats.mode(thickness.round(0), keepdims=True).mode[0]
print(f"المتوسط: {mean_val:.2f} ميكرومتر")
print(f"الوسيط: {median_val:.2f} ميكرومتر")
print(f"المنوال: {mode_val:.0f} ميكرومتر")
متى نستخدم كل مقياس؟
- المتوسط: عندما تكون البيانات متماثلة بدون قيم شاذة كبيرة
- الوسيط: عندما توجد قيم شاذة، فهو أكثر مقاومة لتأثيرها
- المنوال: لتحديد القيمة الأكثر تكراراً في بيانات الجودة المصنفة
الانحراف المعياري والتباين
الانحراف المعياري يقيس مدى تشتت البيانات حول المتوسط. في الصناعة، هو مؤشر أساسي لاستقرار العملية:
# مقارنة ماكينتين: أيهما أكثر استقراراً؟
machine_a = np.random.normal(50, 0.5, 200) # انحراف معياري صغير
machine_b = np.random.normal(50, 2.0, 200) # انحراف معياري كبير
print("الماكينة A:")
print(f" المتوسط: {machine_a.mean():.2f}")
print(f" الانحراف المعياري: {machine_a.std():.2f}")
print(f" التباين: {machine_a.var():.4f}")
print("\nالماكينة B:")
print(f" المتوسط: {machine_b.mean():.2f}")
print(f" الانحراف المعياري: {machine_b.std():.2f}")
print(f" التباين: {machine_b.var():.4f}")
# معامل التباين: للمقارنة بين متغيرات مختلفة الوحدات
cv_a = (machine_a.std() / machine_a.mean()) * 100
cv_b = (machine_b.std() / machine_b.mean()) * 100
print(f"\nمعامل التباين: A={cv_a:.2f}% B={cv_b:.2f}%")
التوزيع الطبيعي وأهميته في الصناعة
التوزيع الطبيعي هو الأساس الذي تُبنى عليه معظم أدوات ضبط الجودة:
import matplotlib.pyplot as plt
from scipy.stats import norm
# بيانات قطر مسامير من خط الإنتاج
np.random.seed(42)
diameters = np.random.normal(loc=10.0, scale=0.05, size=1000)
# رسم التوزيع مع المنحنى النظري
fig, ax = plt.subplots(figsize=(10, 5))
ax.hist(diameters, bins=40, density=True, alpha=0.7, label='بيانات فعلية')
x = np.linspace(9.8, 10.2, 100)
ax.plot(x, norm.pdf(x, diameters.mean(), diameters.std()),
'r-', linewidth=2, label='التوزيع الطبيعي النظري')
# حدود المواصفات
ax.axvline(x=9.9, color='orange', linestyle='--', label='الحد الأدنى للمواصفات')
ax.axvline(x=10.1, color='orange', linestyle='--', label='الحد الأقصى للمواصفات')
ax.set_xlabel('القطر (مم)')
ax.set_ylabel('الكثافة الاحتمالية')
ax.set_title('توزيع أقطار المسامير المنتجة')
ax.legend()
plt.tight_layout()
plt.savefig('normal_distribution.png', dpi=150)
plt.show()
# نسبة المنتجات ضمن المواصفات
in_spec = ((diameters >= 9.9) & (diameters <= 10.1)).mean() * 100
print(f"نسبة المنتجات ضمن المواصفات: {in_spec:.1f}%")
قاعدة 68-95-99.7
- 68% من القيم تقع ضمن انحراف معياري واحد من المتوسط
- 95% ضمن انحرافين معياريين
- 99.7% ضمن ثلاثة انحرافات معيارية (أساس حدود التحكم 3-sigma)
الارتباط: هل هناك علاقة بين متغيرين؟
معرفة العلاقات بين المتغيرات تساعد في فهم العمليات الصناعية:
import seaborn as sns
# بيانات إنتاج: سرعة الماكينة، درجة الحرارة، معدل العيوب
np.random.seed(42)
n = 200
speed = np.random.uniform(800, 1200, n)
temperature = 30 + 0.03 * speed + np.random.normal(0, 2, n)
defect_rate = 0.5 + 0.002 * speed + 0.1 * temperature + np.random.normal(0, 1, n)
production = pd.DataFrame({
'speed_rpm': speed,
'temperature_c': temperature,
'defect_rate_pct': defect_rate
})
# مصفوفة الارتباط
corr_matrix = production.corr()
print("مصفوفة الارتباط:")
print(corr_matrix.round(3))
# رسم مصفوفة التشتت
sns.pairplot(production, diag_kind='hist')
plt.suptitle('علاقات متغيرات الإنتاج', y=1.02)
plt.savefig('correlation_plot.png', dpi=150)
plt.show()
تفسير معامل الارتباط
- 0.7 إلى 1.0: ارتباط قوي (مثل: سرعة الماكينة والحرارة)
- 0.3 إلى 0.7: ارتباط متوسط
- 0.0 إلى 0.3: ارتباط ضعيف أو معدوم
اختبار الفرضيات: هل الفرق حقيقي؟
عند تغيير إعدادات الماكينة، نحتاج لتأكيد أن التحسن حقيقي وليس صدفة:
from scipy.stats import ttest_ind
# مقارنة جودة الإنتاج قبل وبعد صيانة الماكينة
before_maintenance = np.random.normal(50.2, 1.5, 100)
after_maintenance = np.random.normal(50.0, 0.8, 100)
t_stat, p_value = ttest_ind(before_maintenance, after_maintenance)
print(f"إحصائية t: {t_stat:.3f}")
print(f"القيمة الاحتمالية p: {p_value:.4f}")
if p_value < 0.05:
print("النتيجة: الفرق ذو دلالة إحصائية (الصيانة أحدثت تأثيراً)")
else:
print("النتيجة: لا يوجد فرق ذو دلالة إحصائية")
print(f"\nقبل الصيانة - المتوسط: {before_maintenance.mean():.2f}, σ: {before_maintenance.std():.2f}")
print(f"بعد الصيانة - المتوسط: {after_maintenance.mean():.2f}, σ: {after_maintenance.std():.2f}")
مثال عملي: تحليل إحصائي لبيانات جودة المنتج
سنحلل بيانات جودة قطع معدنية من ثلاث ماكينات مختلفة:
import pandas as pd
import numpy as np
from scipy.stats import f_oneway
np.random.seed(42)
n_per_machine = 150
quality_data = pd.DataFrame({
'machine': ['M1'] * n_per_machine + ['M2'] * n_per_machine + ['M3'] * n_per_machine,
'diameter': np.concatenate([
np.random.normal(10.00, 0.03, n_per_machine),
np.random.normal(10.02, 0.05, n_per_machine),
np.random.normal(9.98, 0.04, n_per_machine)
])
})
# إحصائيات لكل ماكينة
summary = quality_data.groupby('machine')['diameter'].agg(
['mean', 'std', 'min', 'max']
).round(4)
print("ملخص إحصائي لكل ماكينة:")
print(summary)
# اختبار ANOVA: هل يوجد فرق بين الماكينات؟
m1 = quality_data[quality_data['machine'] == 'M1']['diameter']
m2 = quality_data[quality_data['machine'] == 'M2']['diameter']
m3 = quality_data[quality_data['machine'] == 'M3']['diameter']
f_stat, p_val = f_oneway(m1, m2, m3)
print(f"\nاختبار ANOVA: F={f_stat:.2f}, p={p_val:.6f}")
print("يوجد فرق ذو دلالة بين الماكينات" if p_val < 0.05 else "لا فرق")
الخلاصة
الإحصاء الوصفي والاستدلالي هما عيناك لفهم البيانات الصناعية. تعلمنا مقاييس النزعة المركزية والتشتت، والتوزيع الطبيعي، ومعاملات الارتباط، واختبار الفرضيات. هذه الأدوات ضرورية قبل بناء أي نموذج تعلم آلي. في الدرس القادم سنبدأ رحلة بناء النماذج بالانحدار الخطي.