وكلاء الملخصات الإحصائية
تحليل التوزيع، والارتباط، واكتشاف القيم الشاذة في التقارير التي ينشئها الوكيل
وكلاء الملخصات الإحصائية درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
أهمية الملخصات الإحصائية
نادراً ما تكون البيانات الخام مفيدة بمفردها. وتظهر القيمة الحقيقية لوكيل تحليل البيانات عندما يستطيع حساب الملخصات الإحصائية تلقائيًا وتحويل الأرقام إلى استنتاجات واضحة بلغة بسيطة.
يغطي هذا الدرس العمليات الإحصائية الأساسية: الوصف، والارتباط، واكتشاف القيم الشاذة، وتحديد التوزيع، وإنشاء الاستنتاجات تلقائيًا.
df.describe(): نقطة البداية
تحسب df.describe() العدد والمتوسط والانحراف المعياري والحد الأدنى والربيعات والحد الأقصى لجميع الأعمدة الرقمية باستدعاء واحد. وهذه هي الخطوة الأولى القياسية في أي تحليل استكشافي للبيانات.
import pandas as pd
df = pd.read_csv('sales_data.csv')
# Basic numeric summary
print(df.describe())
# Also describe categorical columns
print(df.describe(include='object'))
# Custom percentiles
print(df.describe(percentiles=[0.05, 0.25, 0.5, 0.75, 0.95]))
# Convert to clean dict for agent use
def get_numeric_summary(df):
desc = df.describe().round(2)
return {
col: desc[col].to_dict()
for col in desc.columns
}مصفوفة الارتباط
توضح مصفوفة الارتباط العلاقات الخطية الثنائية بين جميع الأعمدة الرقمية. وتتراوح القيم من -1 (ارتباط سلبي قوي) إلى +1 (ارتباط إيجابي قوي). وتشير القيم القريبة من 0 إلى عدم وجود علاقة خطية.
import pandas as pd
import numpy as np
def compute_correlation_matrix(df):
numeric = df.select_dtypes(include='number')
corr = numeric.corr().round(3)
return corr.to_dict()
def find_strong_correlations(df, threshold=0.7):
numeric = df.select_dtypes(include='number')
corr = numeric.corr()
strong = []
cols = corr.columns
for i in range(len(cols)):
for j in range(i + 1, len(cols)): # upper triangle only
val = corr.iloc[i, j]
if abs(val) >= threshold:
strong.append({
'col_a': cols[i],
'col_b': cols[j],
'correlation': round(val, 3),
'direction': 'positive' if val > 0 else 'negative'
})
return sorted(strong, key=lambda x: abs(x['correlation']), reverse=True)اكتشاف القيم الشاذة: طريقة IQR
تحدد طريقة المدى الربيعي (IQR) القيم الشاذة باعتبارها القيم التي تزيد عن Q3 بمقدار يتجاوز 1.5 ضعف IQR أو تقل عن Q1 بالمقدار نفسه. وتتميز هذه الطريقة بقدرتها على التعامل مع القيم المتطرفة؛ فعلى خلاف z-score، تعمل جيدًا حتى عند وجود قيم شاذة في البيانات.
import pandas as pd
def detect_outliers_iqr(df, columns=None, multiplier=1.5):
numeric = df.select_dtypes(include='number')
if columns:
numeric = numeric[columns]
outlier_report = {}
for col in numeric.columns:
q1 = numeric[col].quantile(0.25)
q3 = numeric[col].quantile(0.75)
iqr = q3 - q1
lower = q1 - multiplier * iqr
upper = q3 + multiplier * iqr
outliers = numeric[(numeric[col] < lower) | (numeric[col] > upper)][col]
outlier_report[col] = {
'q1': round(q1, 3),
'q3': round(q3, 3),
'iqr': round(iqr, 3),
'lower_bound': round(lower, 3),
'upper_bound': round(upper, 3),
'outlier_count': len(outliers),
'outlier_pct': round(len(outliers) / len(df) * 100, 1),
'outlier_values': outliers.tolist()[:10] # first 10
}
return outlier_reportتحديد نوع التوزيع
يساعد تحديد نوع التوزيع (الطبيعي أو الملتوي أو ثنائي المنوال أو المنتظم) الوكيلَ على اختيار الاختبارات الإحصائية المناسبة ووصف البيانات بدقة.
استخدم الالتواء والتفرطح كطرق استدلال سريعة قبل إجراء الاختبارات الرسمية.
import pandas as pd
from scipy import stats
def identify_distribution(series):
'''Classify distribution type using skewness, kurtosis, and normality test.'''
clean = series.dropna()
if len(clean) < 8:
return {'type': 'insufficient_data'}
skewness = clean.skew()
kurtosis = clean.kurtosis()
# Shapiro-Wilk normality test (reliable up to ~5000 samples)
sample = clean.sample(min(500, len(clean)), random_state=42)
_, p_value = stats.shapiro(sample)
distribution = 'normal' if p_value > 0.05 else 'non-normal'
if abs(skewness) < 0.5 and p_value > 0.05:
dist_type = 'normal'
elif skewness > 1.0:
dist_type = 'right-skewed (long right tail)'
elif skewness < -1.0:
dist_type = 'left-skewed (long left tail)'
elif abs(skewness) < 0.5 and kurtosis < -1:
dist_type = 'uniform-like'
else:
dist_type = 'approximately normal'
return {
'type': dist_type,
'skewness': round(skewness, 3),
'kurtosis': round(kurtosis, 3),
'normality_pvalue': round(p_value, 4),
'is_normal': p_value > 0.05
}اختبارات التوزيع الطبيعي
تتوفر عدة اختبارات رسمية للتوزيع الطبيعي. ويُعد اختبار Shapiro-Wilk الأفضل للعينات الصغيرة، بينما يُستخدم اختبار D'Agostino-Pearson لمجموعات البيانات الأكبر. ويبلغ حد p-value المعتاد 0.05؛ ارفض فرضية التوزيع الطبيعي إذا كانت p < 0.05.
from scipy import stats
import numpy as np
def test_normality(series, alpha=0.05):
clean = series.dropna().values
n = len(clean)
results = {}
# Shapiro-Wilk (best for n < 5000)
if n <= 5000:
stat, p = stats.shapiro(clean)
results['shapiro_wilk'] = {
'statistic': round(stat, 4),
'p_value': round(p, 4),
'is_normal': p > alpha
}
# D'Agostino-Pearson (n >= 20)
if n >= 20:
stat, p = stats.normaltest(clean)
results['dagostino_pearson'] = {
'statistic': round(stat, 4),
'p_value': round(p, 4),
'is_normal': p > alpha
}
# Kolmogorov-Smirnov
mean, std = np.mean(clean), np.std(clean)
stat, p = stats.kstest(clean, 'norm', args=(mean, std))
results['kolmogorov_smirnov'] = {
'statistic': round(stat, 4),
'p_value': round(p, 4),
'is_normal': p > alpha
}
return resultsالملف الإحصائي الكامل
اجمع جميع التحليلات الإحصائية في دالة واحدة باسم full_profile() تعيد ملخصًا إحصائيًا شاملًا لكل عمود رقمي في إطار البيانات.
def full_statistical_profile(df):
numeric = df.select_dtypes(include='number')
profiles = {}
for col in numeric.columns:
series = numeric[col].dropna()
profile = {
'count': len(series),
'null_count': df[col].isnull().sum(),
'mean': round(series.mean(), 4),
'median': round(series.median(), 4),
'std': round(series.std(), 4),
'min': round(series.min(), 4),
'max': round(series.max(), 4),
'range': round(series.max() - series.min(), 4),
'q1': round(series.quantile(0.25), 4),
'q3': round(series.quantile(0.75), 4)
}
profile['distribution'] = identify_distribution(series)
outliers = detect_outliers_iqr(df, columns=[col])
profile['outliers'] = outliers.get(col, {})
profiles[col] = profile
return {
'profiles': profiles,
'correlations': find_strong_correlations(df),
'shape': {'rows': len(df), 'columns': len(df.columns)}
}إنشاء الاستنتاجات تلقائيًا
أرسل الملف الإحصائي إلى LLM واطلب منه إنشاء استنتاجات بلغة بسيطة. يحدد النموذج الأنماط، وينبّه إلى الحالات غير المعتادة، ويستخلص النتائج التي تهم مستخدم الأعمال.
import json
INSIGHT_PROMPT = '''You are a data analyst. Generate 3-5 key insights from this statistical summary.
Dataset: {dataset_name}
Statistical profile:
{profile_json}
For each insight:
- Be specific (use actual numbers)
- Focus on business relevance
- Flag any data quality concerns (high null counts, extreme outliers)
- Note unexpected patterns
Format as bullet points.'''
def generate_insights(df, dataset_name='dataset'):
profile = full_statistical_profile(df)
profile_text = json.dumps(profile, indent=2, default=str)[:3000]
return llm_call(INSIGHT_PROMPT.format(
dataset_name=dataset_name,
profile_json=profile_text
))
# Example output:
# - Revenue column has 3.2% outliers; max value ($48,500) is 12x the median ($3,900)
# - Customer age follows a right-skewed distribution (skewness: 1.4) with most users under 35
# - Strong positive correlation (r=0.87) between session_count and lifetime_valueاكتشاف اتجاهات السلاسل الزمنية
بالنسبة إلى بيانات السلاسل الزمنية، اكتشف الاتجاه العام (متزايد أو متناقص أو ثابت) باستخدام الانحدار الخطي. ويمنح ذلك الوكلاء القدرة على قول «تنمو الإيرادات بمقدار 2,400 دولار شهريًا».
import numpy as np
from scipy import stats
def detect_trend(values):
if len(values) < 3:
return {'trend': 'insufficient_data'}
x = np.arange(len(values))
y = np.array(values, dtype=float)
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
if p_value > 0.05:
trend = 'flat (no significant trend)'
elif slope > 0:
trend = 'increasing'
else:
trend = 'decreasing'
return {
'trend': trend,
'slope_per_period': round(slope, 4),
'r_squared': round(r_value ** 2, 4),
'p_value': round(p_value, 4),
'significant': p_value < 0.05
}
# Example: monthly revenue trend
monthly_revenue = [10000, 11200, 10800, 12500, 13100, 14200, 15000]
print(detect_trend(monthly_revenue))
# {'trend': 'increasing', 'slope_per_period': 834.2, 'r_squared': 0.95, ...}الإحصاءات المقارنة
غالبًا ما تكون المقارنة بين المجموعات هي الاستنتاج الأكثر فائدة: «يبلغ متوسط قيمة الطلب في الشريحة A ارتفاعًا بنسبة 40% مقارنةً بالشريحة B». استخدم اختبارات t أو Mann-Whitney لمقارنة المجموعات.
from scipy import stats
import pandas as pd
def compare_groups(df, group_column, value_column):
groups = df.groupby(group_column)[value_column].apply(list)
group_names = list(groups.index)
comparison = []
for i, g1 in enumerate(group_names):
for j, g2 in enumerate(group_names):
if j <= i:
continue
a, b = groups[g1], groups[g2]
mean_a = pd.Series(a).mean()
mean_b = pd.Series(b).mean()
# Mann-Whitney U (non-parametric, no normality assumption)
stat, p = stats.mannwhitneyu(a, b, alternative='two-sided')
pct_diff = (mean_a - mean_b) / mean_b * 100 if mean_b != 0 else 0
comparison.append({
'group_a': g1, 'group_b': g2,
'mean_a': round(mean_a, 2),
'mean_b': round(mean_b, 2),
'pct_difference': round(pct_diff, 1),
'p_value': round(p, 4),
'significant': p < 0.05
})
return comparisonتحليل القيم المفقودة
حلّل القيم المفقودة قبل حساب أي إحصاءات. فارتفاع معدلات القيم الفارغة في عمود ما يجعل الإحصاءات المحسوبة منه غير موثوقة. أبلغ عن أعداد القيم الفارغة ونسبها وأنماطها (هل القيم الفارغة عشوائية أم منتظمة؟).
import pandas as pd
import numpy as np
def analyze_missing_values(df):
total_rows = len(df)
missing_report = {}
for col in df.columns:
null_count = df[col].isnull().sum()
if null_count == 0:
continue
null_pct = null_count / total_rows * 100
# Check if nulls correlate with another column (systematic pattern)
pattern = 'random'
if null_pct > 5:
for other_col in df.select_dtypes(include='object').columns:
if other_col == col:
continue
null_rates = df.groupby(other_col)[col].apply(
lambda x: x.isnull().mean()
)
if null_rates.max() - null_rates.min() > 0.3: # 30% difference
pattern = f'correlated_with_{other_col}'
break
missing_report[col] = {
'null_count': int(null_count),
'null_pct': round(null_pct, 1),
'severity': 'high' if null_pct > 20 else 'medium' if null_pct > 5 else 'low',
'pattern': pattern
}
return missing_reportاختبار المعرفة
لماذا تُفضَّل طريقة IQR على z-score لاكتشاف القيم الشاذة في تطبيقات الوكلاء؟
مراجعة: وكلاء الملخصات الإحصائية
تجمع وكلاء الملخصات الإحصائية بين: df.describe() للإحصاءات الأساسية، ومصفوفات الارتباط لاكتشاف العلاقات، واكتشاف القيم الشاذة باستخدام IQR (المقاوم للقيم المتطرفة)، وتحديد التوزيع باستخدام الالتواء واختبارات التوزيع الطبيعي، واكتشاف الاتجاهات باستخدام الانحدار الخطي.
أرسل الملف الإحصائي إلى LLM لإنشاء الاستنتاجات تلقائيًا، أي لتحويل الأرقام إلى نتائج أعمال واضحة بلغة بسيطة. وتكشف الإحصاءات المقارنة (مقارنات المجموعات مع اختبار الدلالة) عن أكثر الاستنتاجات قابلية للتنفيذ.
الأسئلة الشائعة
هل درس «وكلاء الملخصات الإحصائية» مجاني؟
نعم — نص درس «وكلاء الملخصات الإحصائية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «وكلاء الملخصات الإحصائية»؟
تحليل التوزيع، والارتباط، واكتشاف القيم الشاذة في التقارير التي ينشئها الوكيل تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «وكلاء الملخصات الإحصائية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- نمط Code Interpreter لتحليل البيانات
- أدوات وكلاء البيانات المعتمدة على Pandas
- إنشاء المخططات والتصورات آليًا
- وكلاء الملخصات الإحصائية