تقليل الأبعاد (PCA): كيف تحلل بيانات تحتوي على 100 متغير في رسم بياني ثنائي الأبعاد؟
مقدمة: لماذا تصبح البيانات ذات 100 متغير مشكلة حقيقية؟
عندما تتعامل مع مجموعة بيانات تحتوي على 100 متغير أو أكثر، فإن التحدي لا يكون فقط في حجم البيانات، بل في صعوبة فهم العلاقات بينها بصرياً وتحليلياً. الإنسان يستطيع استيعاب الرسوم ثنائية وثلاثية الأبعاد بسهولة، لكنه لا يستطيع رؤية الفضاءات عالية الأبعاد بشكل مباشر. هنا يظهر دور PCA كواحدة من أهم تقنيات تقليل الأبعاد في Data Science.
الفكرة الأساسية هي ضغط 100 متغير إلى متغيرين أو ثلاثة مع الاحتفاظ بأكبر قدر ممكن من المعلومات الإحصائية. هذا لا يعني نسخ البيانات كما هي، بل إعادة تمثيلها في محاور جديدة ذكية تسمى Principal Components. إذا كنت قد بدأت رحلتك من مدخل إلى علوم البيانات: كيف تحول الأرقام العشوائية إلى قرارات استراتيجية؟ فهذه المرحلة تمثل الانتقال من الوصف إلى الفهم العميق لبنية البيانات.
ما هو PCA من الناحية الرياضية؟
تقنية Principal Component Analysis تبحث عن اتجاهات جديدة في البيانات تكون فيها التباينات أعلى ما يمكن. بدلاً من الاعتماد على الأعمدة الأصلية، تنشئ هذه الطريقة محاور مركبة تمثل خلطاً خطياً من المتغيرات الأصلية.
المكوّن الأول يلتقط أكبر قدر من التباين، والمكوّن الثاني يلتقط أكبر قدر متبقٍ من التباين بشرط أن يكون متعامداً مع الأول، وهكذا. لذلك فإن إسقاط البيانات على أول مكوّنين فقط يسمح غالباً برؤية بنية التجمعات أو الأنماط المخفية في رسم ثنائي الأبعاد.
لفهم هذا من منظور إحصائي، يفيد الرجوع إلى الإحصاء الوصفي والاستدلالي: مفاهيم لا غنى عنها لكل عالم بيانات، لأن PCA يعتمد مباشرة على التباين، التغاير، والقيم الذاتية.
ما الذي يحدث عملياً داخل الخوارزمية؟
- توحيد أو تحجيم المتغيرات حتى لا يهيمن متغير واحد ذو نطاق كبير.
- حساب مصفوفة التغاير أو استخدام
SVDمباشرة. - استخراج القيم والمتجهات الذاتية.
- ترتيب المكوّنات من الأعلى تفسيراً للتباين إلى الأقل.
- إسقاط البيانات الأصلية على أول مكوّنين لبناء الرسم الثنائي.
قبل تطبيق PCA: جودة البيانات أهم من الخوارزمية
نجاح التحليل لا يبدأ من النموذج، بل من تجهيز البيانات. إذا كانت البيانات تحتوي على قيم مفقودة، تشوهات، أو أعمدة عديمة الفائدة، فإن المكوّنات الناتجة ستكون مضللة. لذلك يجب أولاً المرور على مراحل التنظيف والمعالجة التي ناقشناها في تنظيف البيانات (Data Cleaning): اكتشاف ومعالجة القيم المفقودة (Missing Values) ومعالجة البيانات المكررة والمشوهة (Duplicates & Outliers) باستخدام بايثون.
كذلك فإن تحجيم المتغيرات خطوة حاسمة جداً. إذا كان أحد الأعمدة يقاس بالآلاف وآخر بين 0 و1، فسوف ينحاز PCA إلى العمود الأكبر تبايناً رقمياً لا بالضرورة الأكبر معنى. لهذا السبب يعد إعداد البيانات للتدريب (Data Preprocessing): تحجيم البيانات (Scaling & Normalization) جزءاً أساسياً من المسار.
في بيئات
ETLوPipelineالإنتاجية، يفضل تنفيذ فحوصات جودة آلية قبل تقليل الأبعاد: نسب القيم المفقودة، عدد الأعمدة منخفضة التباين، وكشف الارتباطات المفرطة. ذلك يحمي النموذج من تمثيل بصري جميل لكنه تحليلياً غير موثوق.
تطبيق عملي باستخدام Python على بيانات ذات 100 متغير
يمكن تنفيذ PCA بسهولة باستخدام Pandas وNumPy وscikit-learn. إذا لم تكن البيئة مجهزة بعد، فراجع إعداد مختبر البيانات: تثبيت بيئة Jupyter Notebook ومكتبات التحليل الأساسية.
كما أن الاعتماد على مكتبة NumPy: القوة الضاربة في معالجة المصفوفات والعمليات الرياضية المعقدة ومكتبة Pandas (2): استكشاف هيكل البيانات وفهم DataFrame و Series يجعل فهم بنية البيانات قبل الإسقاط أكثر دقة.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
# إنشاء بيانات تجريبية تحتوي على 100 متغير
X, y = make_classification(
n_samples=1000,
n_features=100,
n_informative=20,
n_redundant=10,
n_classes=3,
random_state=42
)
# تحويلها إلى DataFrame
columns = [f"feature_{i}" for i in range(100)]
df = pd.DataFrame(X, columns=columns)
df["target"] = y
# فصل المتغيرات عن الهدف
X_data = df.drop(columns=["target"])
y_data = df["target"]
# تحجيم البيانات
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_data)
# تطبيق PCA إلى بعدين
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# إنشاء DataFrame جديد للرسم
pca_df = pd.DataFrame(X_pca, columns=["PC1", "PC2"])
pca_df["target"] = y_data.values
# نسبة التباين المفسر
print("Explained variance ratio:", pca.explained_variance_ratio_)
print("Total explained variance:", pca.explained_variance_ratio_.sum())
# الرسم
plt.figure(figsize=(10, 6))
for label in sorted(pca_df["target"].unique()):
subset = pca_df[pca_df["target"] == label]
plt.scatter(subset["PC1"], subset["PC2"], label=f"Class {label}", alpha=0.7)
plt.xlabel("Principal Component 1")
plt.ylabel("Principal Component 2")
plt.title("PCA Projection from 100 Features to 2D")
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
كيف نقرأ ناتج الكود؟
بعد التنفيذ ستحصل على عمودين جديدين: PC1 وPC2. هذان لا يمثلان متغيرين أصليين، بل مزيجاً رياضياً من 100 متغير. إذا ظهرت نقاط الفئات متجمعة أو منفصلة نسبياً، فهذا يعني أن البنية الكامنة في البيانات أصبحت مرئية.
أما قيمة explained_variance_ratio_ فهي من أهم المؤشرات. إذا كان أول مكوّنين يفسران مثلاً 60% أو 70% من التباين، فهذا جيد للرسم الاستكشافي. أما إذا كانت النسبة منخفضة جداً، فقد يكون الرسم الثنائي مبسطاً أكثر من اللازم.
متى يكون PCA مناسباً ومتى لا يكون؟
هذه التقنية مناسبة عندما تكون العلاقات بين المتغيرات تقريباً خطية، وعندما يكون الهدف ضغط البيانات أو تصورها أو تقليل الضوضاء قبل بناء نموذج. كما أنها مفيدة قبل بعض خوارزميات Machine Learning التي تتأثر بارتفاع عدد السمات.
لكنها ليست حلاً سحرياً. إذا كانت العلاقات غير خطية بشدة، أو إذا كانت قابلية التفسير التجارية لكل متغير مطلوبة، فقد يصبح استخدام PCA محدود الفائدة. فهو يحسن التمثيل الرياضي، لكنه قد يقلل سهولة شرح النتائج لأصحاب القرار.
في مشاريع التحليل المؤسسي، استخدم
PCAكطبقة استكشاف أو ضغط قبل النمذجة، وليس بديلاً تلقائياً عن فهم الدومين. إذا كان كل متغير يحمل معنى تنظيمي حساساً مثل المخاطر أو الامتثال أو التسعير، فالتفسير قد يكون أهم من الاختصار.
استخدام PCA في البيئات الضخمة مع Spark
عندما تنتقل من آلاف السجلات إلى عشرات الملايين، يصبح التنفيذ المحلي عبر Pandas غير كافٍ. هنا يأتي دور Apache Spark في تنفيذ تقليل الأبعاد بشكل موزع، خاصة عندما تكون البيانات جزءاً من خط Big Data أكبر.
from pyspark.sql import SparkSession
from pyspark.ml.feature import VectorAssembler, StandardScaler, PCA
spark = SparkSession.builder.appName("PCAExample").getOrCreate()
# افترض أن df_spark يحتوي على 100 عمود رقمي باسم feature_0 ... feature_99
feature_cols = [f"feature_{i}" for i in range(100)]
assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
assembled_df = assembler.transform(df_spark)
scaler = StandardScaler(inputCol="features", outputCol="scaled_features", withStd=True, withMean=True)
scaler_model = scaler.fit(assembled_df)
scaled_df = scaler_model.transform(assembled_df)
pca = PCA(k=2, inputCol="scaled_features", outputCol="pca_features")
pca_model = pca.fit(scaled_df)
result_df = pca_model.transform(scaled_df)
result_df.select("pca_features").show(5, truncate=False)
هذا النهج مفيد داخل خطوط المعالجة الموزعة حيث يتم سحب البيانات من مصادر SQL وNoSQL ثم تنظيفها وتحويلها قبل مرحلة النمذجة أو التصور.
أفضل الممارسات التحليلية قبل عرض الرسم النهائي
- افحص الارتباطات أولاً عبر الارتباط (Correlation): كيف تكتشف العلاقة الخفية بين المتغيرات لمعرفة ما إذا كانت البيانات قابلة للاختزال أصلاً.
- لا تستخدم الرسم الناتج لإصدار أحكام سببية؛ هو أداة استكشافية لا أكثر.
- قارن بين الرسم قبل وبعد التحجيم للتأكد من تأثير المقاييس.
- استخدم أدوات العرض مثل مكتبة Matplotlib أو مكتبة Seaborn أو المخططات التفاعلية: استخدام Plotly إذا كنت تريد فحص المجموعات بشكل أعمق.
- إذا كان الهدف اللاحق هو التجميع، فغالباً ما يعمل
PCAجيداً قبل التعلم غير الخاضع للإشراف: خوارزمية K-Means لتجميع العملاء (Clustering).
الخلاصة
تقنية PCA تمنحك وسيلة عملية لتحويل بيانات مكونة من 100 متغير إلى تمثيل ثنائي الأبعاد قابل للفهم والرسم. قيمتها الحقيقية لا تكمن فقط في الضغط، بل في كشف البنية الداخلية للبيانات، تقليل الضوضاء، وتسريع التحليل اللاحق.
لكن النجاح مع هذه التقنية يعتمد على ثلاث ركائز: تنظيف البيانات جيداً، تحجيمها بشكل صحيح، وقراءة نتائج التباين المفسر بحذر. عند استخدامها بوعي، تصبح أداة قوية جداً ضمن صندوق أدوات عالم البيانات والمهندس الذي يتعامل مع أحجام كبيرة من البيانات المعقدة.