مدخل إلى علوم البيانات: كيف تحول الأرقام العشوائية إلى قرارات استراتيجية؟


مدخل إلى علوم البيانات: كيف تحول الأرقام العشوائية إلى قرارات استراتيجية؟

مرحباً بكم في هذا الدرس الشامل!

ماذا سنتعلم؟

سنتعمق اليوم في أساسيات علوم البيانات، بدءاً من معالجة البيانات الأولية وصولاً إلى بناء نماذج تنبؤية تساعد في صياغة قرارات استراتيجية فعالة ومبنية على الحقائق، وكيفية توسيع نطاق العمل باستخدام PySpark.

الخطوة 1: جمع البيانات وتنظيفها (Preprocessing)

في هذه الخطوة الأولى، سنقوم بمحاكاة عملية جمع البيانات، ثم ننتقل إلى تنظيفها وتحضيرها للتحليل. البيانات النظيفة هي أساس أي تحليل موثوق.

ملاحظة تقنية: البيانات "العشوائية" هنا لا تعني أنها بلا معنى، بل تشير إلى البيانات الخام التي لم تُعالج بعد والتي قد تحتوي على ضوضاء أو قيم مفقودة.
import pandas as pd
import numpy as np

# لضمان إمكانية تكرار النتائج
np.random.seed(42)

# إنشاء بيانات عشوائية (افتراضية) لتمثيل مشكلة حقيقية
# نفترض أننا نجمع بيانات عن أداء المبيعات والعوامل المؤثرة عليها
data = {
    'المبيعات_السابقة': np.random.randint(50, 200, 100),
    'الميزانية_التسويقية': np.random.randint(10, 100, 100),
    'عدد_الموظفين': np.random.randint(5, 50, 100),
    'رضا_العملاء': np.random.uniform(3.0, 5.0, 100).round(1),
    'المبيعات_المستقبلية': np.random.randint(100, 300, 100) + (np.random.rand(100) * 50)
}
df = pd.DataFrame(data)

# إدخال بعض القيم المفقودة بشكل عشوائي لاختبار المعالجة
for col in ['المبيعات_السابقة', 'رضا_العملاء']:
    df.loc[df.sample(frac=0.05).index, col] = np.nan

print("معلومات أولية عن البيانات:")
# عرض معلومات موجزة عن DataFrame (عدد الصفوف، الأعمدة، أنواع البيانات، القيم غير الفارغة)
print(df.info())

# معالجة القيم المفقودة: ملء القيم العددية بالمتوسط
# هذه استراتيجية شائعة للتعامل مع القيم المفقودة في البيانات العددية
for col in df.select_dtypes(include=np.number).columns:
    df[col].fillna(df[col].mean(), inplace=True)

print("\nعدد القيم المفقودة بعد المعالجة:")
# التحقق من عدم وجود قيم مفقودة بعد عملية الملء
print(df.isnull().sum())

الخطوة 2: التحليل الاستكشافي للبيانات وهندسة الميزات (EDA & Feature Engineering)

بعد تنظيف البيانات، ننتقل إلى فهمها بشكل أعمق من خلال التحليل الاستكشافي، ثم نقوم بإنشاء ميزات جديدة قد تكون أكثر فائدة للنموذج.

ملاحظة تقنية: هندسة الميزات (Feature Engineering) هي فن تحويل البيانات الخام إلى ميزات يمكن أن تستوعبها نماذج التعلم الآلي بشكل أفضل، مما يؤدي إلى تحسين أداء النموذج.
# عرض الإحصائيات الوصفية للبيانات (المتوسط، الانحراف المعياري، الحد الأدنى، الحد الأقصى، الربيعيات)
print("\nالإحصائيات الوصفية للبيانات:")
print(df.describe())

# مثال على هندسة الميزات: إنشاء ميزة جديدة (كفاءة التسويق)
# هذه الميزة قد تعطي مؤشراً أفضل على كيفية تحويل الميزانية التسويقية إلى مبيعات
df['كفاءة_التسويق'] = df['المبيعات_السابقة'] / df['الميزانية_التسويقية']

print("\nأول 5 صفوف بعد إضافة ميزة كفاءة التسويق:")
print(df.head())

# يمكن هنا أيضاً إجراء تحليل الارتباطات (correlation analysis)
# لمعرفة العلاقة بين المتغيرات المختلفة والمتغير الهدف 'المبيعات_المستقبلية'
# correlation_matrix = df.corr()
# print("\nمصفوفة الارتباطات (أمثلة):")
# print(correlation_matrix['المبيعات_المستقبلية'].sort_values(ascending=False))

الخطوة 3: بناء وتدريب النموذج التنبؤي (Model Building & Training)

الآن بعد أن أصبحت بياناتنا جاهزة، سنقوم ببناء نموذج تعلم آلي يمكنه التنبؤ بالمبيعات المستقبلية بناءً على الميزات المتاحة. هذا النموذج سيشكل أساس قراراتنا الاستراتيجية.

ملاحظة تقنية: الانحدار الخطي (Linear Regression) هو أحد أبسط وأكثر نماذج التعلم الآلي شيوعاً للتنبؤ بالقيم العددية، وهو نقطة انطلاق ممتازة في العديد من المشاكل.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

# تحديد الميزات (المتغيرات المستقلة X) والمتغير الهدف (المتغير التابع y)
X = df[['المبيعات_السابقة', 'الميزانية_التسويقية', 'عدد_الموظفين', 'رضا_العملاء', 'كفاءة_التسويق']]
y = df['المبيعات_المستقبلية']

# تقسيم البيانات إلى مجموعتي تدريب واختبار
# 80% للتدريب و 20% للاختبار لتقييم أداء النموذج على بيانات غير مرئية
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# بناء نموذج الانحدار الخطي
model = LinearRegression()

# تدريب النموذج باستخدام بيانات التدريب
# يتعلم النموذج العلاقات بين الميزات والمتغير الهدف من هذه البيانات
model.fit(X_train, y_train)

# إجراء التنبؤات على بيانات الاختبار
y_pred = model.predict(X_test)

print("\nتقييم النموذج:")
# حساب متوسط الخطأ التربيعي (MSE) لتقييم أداء النموذج
# MSE يقيس متوسط مربع الأخطاء بين القيم المتوقعة والحقيقية
mse = mean_squared_error(y_test, y_pred)
print(f"متوسط الخطأ التربيعي (MSE): {mse:.2f}")

# حساب معامل التحديد (R-squared)
# R-squared يمثل نسبة التباين في المتغير التابع الذي يمكن تفسيره بواسطة المتغيرات المستقلة
r2 = r2_score(y_test, y_pred)
print(f"معامل التحديد (R-squared): {r2:.2f}")

# مثال على التنبؤ لبيانات جديدة لاتخاذ قرار استراتيجي
# لنفترض أننا نريد معرفة المبيعات المتوقعة إذا قمنا بزيادة الميزانية التسويقية
new_data = pd.DataFrame([[180, 80, 45, 4.5, 180/80]], columns=X.columns)
predicted_sales = model.predict(new_data)
print(f"\nالمبيعات المتوقعة لسيناريو جديد (ميزانية تسويقية 80): {predicted_sales[0]:.2f}")

الخطوة 4: توسيع نطاق العمل باستخدام PySpark (للمجموعات الكبيرة من البيانات)

عند التعامل مع مجموعات بيانات ضخمة (Big Data)، تصبح أدوات مثل PySpark ضرورية. سنوضح كيف يمكن تحويل DataFrame من Pandas إلى PySpark وإجراء عملية تحليل بسيطة.

ملاحظة تقنية: Apache Spark هو محرك تحليل موحد لمعالجة البيانات الضخمة، و PySpark هو واجهته البرمجية بلغة Python. يسمح بمعالجة البيانات بشكل متوازي وموزع.
from pyspark.sql import SparkSession

# تهيئة SparkSession
# هذه هي نقطة الدخول لجميع وظائف Spark عند استخدام PySpark
spark = SparkSession.builder.appName("DataSciencePySpark").getOrCreate()

# تحويل Pandas DataFrame إلى PySpark DataFrame
# هذه الخطوة ضرورية للانتقال من المعالجة المحلية إلى المعالجة الموزعة
spark_df = spark.createDataFrame(df)

print("\nأول 5 صفوف من PySpark DataFrame:")
spark_df.show(5)

# مثال على عملية تجميع باستخدام PySpark:
# حساب متوسط المبيعات المستقبلية حسب عدد الموظفين
# هذه العملية ستتم بشكل متوازي وموزع بواسطة Spark
avg_sales_by_employees = spark_df.groupBy('عدد_الموظفين').agg({'المبيعات_المستقبلية': 'avg'})

print("\nمتوسط المبيعات المستقبلية حسب عدد الموظفين (PySpark - أول 5 صفوف مرتبة):")
avg_sales_by_employees.orderBy('عدد_الموظفين').show(5)

# إيقاف SparkSession لتحرير الموارد
spark.stop()

الكود النهائي الكامل

إليك الكود كاملاً الذي يجمع جميع الخطوات المذكورة أعلاه. يمكنك تشغيله لفهم سير العمل المتكامل.

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from pyspark.sql import SparkSession

# --- 1. جمع البيانات وتنظيفها (Preprocessing) ---
np.random.seed(42)
data = {
    'المبيعات_السابقة': np.random.randint(50, 200, 100),
    'الميزانية_التسويقية': np.random.randint(10, 100, 100),
    'عدد_الموظفين': np.random.randint(5, 50, 100),
    'رضا_العملاء': np.random.uniform(3.0, 5.0, 100).round(1),
    'المبيعات_المستقبلية': np.random.randint(100, 300, 100) + (np.random.rand(100) * 50)
}
df = pd.DataFrame(data)

for col in ['المبيعات_السابقة', 'رضا_العملاء']:
    df.loc[df.sample(frac=0.05).index, col] = np.nan

print("معلومات أولية عن البيانات:")
print(df.info())

for col in df.select_dtypes(include=np.number).columns:
    df[col].fillna(df[col].mean(), inplace=True)

print("\nعدد القيم المفقودة بعد المعالجة:")
print(df.isnull().sum())

# --- 2. التحليل الاستكشافي للبيانات وهندسة الميزات (EDA & Feature Engineering) ---
print("\nالإحصائيات الوصفية للبيانات:")
print(df.describe())

df['كفاءة_التسويق'] = df['المبيعات_السابقة'] / df['الميزانية_التسويقية']

print("\nأول 5 صفوف بعد إضافة ميزة كفاءة التسويق:")
print(df.head())

# --- 3. بناء وتدريب النموذج التنبؤي (Model Building & Training) ---
X = df[['المبيعات_السابقة', 'الميزانية_التسويقية', 'عدد_الموظفين', 'رضا_العملاء', 'كفاءة_التسويق']]
y = df['المبيعات_المستقبلية']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print("\nتقييم النموذج:")
mse = mean_squared_error(y_test, y_pred)
print(f"متوسط الخطأ التربيعي (MSE): {mse:.2f}")
r2 = r2_score(y_test, y_pred)
print(f"معامل التحديد (R-squared): {r2:.2f}")

new_data = pd.DataFrame([[180, 80, 45, 4.5, 180/80]], columns=X.columns)
predicted_sales = model.predict(new_data)
print(f"\nالمبيعات المتوقعة لسيناريو جديد (ميزانية تسويقية 80): {predicted_sales[0]:.2f}")

# --- 4. توسيع نطاق العمل باستخدام PySpark ---
spark = SparkSession.builder.appName("DataSciencePySpark").getOrCreate()
spark_df = spark.createDataFrame(df)

print("\nأول 5 صفوف من PySpark DataFrame:")
spark_df.show(5)

avg_sales_by_employees = spark_df.groupBy('عدد_الموظفين').agg({'المبيعات_المستقبلية': 'avg'})

print("\nمتوسط المبيعات المستقبلية حسب عدد الموظفين (PySpark - أول 5 صفوف مرتبة):")
avg_sales_by_employees.orderBy('عدد_الموظفين').show(5)

spark.stop()

النتيجة المتوقعة

عند تشغيل السكربت أعلاه، ستحصل على مخرجات متسلسلة في سطر الأوامر (console) تتضمن ما يلي:

  1. ملخصاً لمعلومات DataFrame الأولية، يليه عدد القيم المفقودة قبل وبعد المعالجة.
  2. الإحصائيات الوصفية للبيانات، وأول 5 صفوف من DataFrame بعد إضافة ميزة "كفاءة_التسويق".
  3. تقييم أداء النموذج التنبؤي (مثل MSE و R-squared)، ثم قيمة المبيعات المتوقعة لسيناريو جديد محدد.
  4. أول 5 صفوف من PySpark DataFrame، ثم أول 5 صفوف من متوسط المبيعات المستقبلية مجمعة حسب عدد الموظفين باستخدام PySpark.

هذه المخرجات توضح كيف يمكن تحويل البيانات الأولية إلى رؤى قابلة للقياس، وكيف يمكن استخدام هذه الرؤى لاتخاذ قرارات استراتيجية مدروسة، مثل تحديد الميزانية التسويقية المثلى أو فهم تأثير عدد الموظفين على المبيعات.