📊 تحليل البيانات ببايثون

📊 تحليل البيانات ببايثون

من الصفر إلى رسم مخططات احترافية وتحليل ملفات CSV حقيقية — مع pandas وnumpy وmatplotlib.

🐼 pandas 🔢 numpy 📈 matplotlib 🌊 seaborn 📂 قراءة CSV 🧹 تنظيف البيانات 🚀 مشروع حقيقي

١. لماذا تحليل البيانات؟

البيانات موجودة في كل مكان: مبيعات المحلات، نتائج الطلاب، الطقس، الأسهم، وسائل التواصل الاجتماعي. تحليل البيانات ببايثون يتيح لك استخلاص معلومات مفيدة من هذه الأرقام بسرعة وبدقة.

🐼

pandas

للتعامل مع جداول البيانات — قراءة، تصفية، تجميع

import pandas as pd
🔢

NumPy

للعمليات الرياضية على المصفوفات بسرعة فائقة

import numpy as np
📈

Matplotlib

لرسم المخططات والتصورات البيانية

import matplotlib.pyplot as plt
🌊

Seaborn

مخططات إحصائية جميلة ومتقدمة

import seaborn as sns

٢. تثبيت المكتبات

افتح Terminal أو CMD وثبّت كل المكتبات بأمر واحد:

Shell / Terminal
pip install pandas numpy matplotlib seaborn

تحقق من التثبيت:

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

print(f"pandas  : {pd.__version__}")
print(f"numpy   : {np.__version__}")
print("✅ كل المكتبات جاهزة!")
نصيحة: استخدم Jupyter Notebook أو VS Code مع امتداد Python لتشغيل كودك والحصول على مخططات مباشرة في الواجهة. ثبّت Jupyter بـ: pip install jupyter

٣. NumPy — أساس الحسابات العلمية

NumPy أسرع بكثير من القوائم العادية في العمليات الرياضية. تستخدمها pandas داخلياً.

Python — NumPy أساسيات
import numpy as np

# إنشاء مصفوفة
grades = np.array([18, 15, 19, 14, 17, 20, 12, 16])

# عمليات إحصائية سريعة
print(f"المعدل    : {np.mean(grades):.2f}")     # 16.375
print(f"الوسيط    : {np.median(grades)}")       # 16.5
print(f"الانحراف  : {np.std(grades):.2f}")       # 2.52
print(f"الأعلى    : {np.max(grades)}")           # 20
print(f"الأدنى    : {np.min(grades)}")           # 12
print(f"المجموع   : {np.sum(grades)}")           # 131

# عمليات على كل العناصر دفعة
bonus    = grades + 2      # [20, 17, 21, ...]
percent = grades / 20 * 100  # نسبة مئوية

# تصفية: من نجح (≥ 10)?
passed = grades[grades >= 10]
print(f"الناجحون : {passed}")

# مصفوفة 2D (جدول)
matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])
print(matrix.shape)   # (3, 3)
print(np.sum(matrix, axis=0))  # مجموع الأعمدة

٤. pandas — إنشاء البيانات

pandas لديها بنيتان رئيسيتان: Series (عمود واحد) وDataFrame (جدول كامل).

Python — Series و DataFrame
import pandas as pd

# Series — عمود واحد
prices = pd.Series([25, 50, 15, 80],
                    index=["تفاح", "موز", "برتقال", "مانجو"])
print(prices["موز"])       # 50
print(prices.mean())       # 42.5
print(prices[prices > 30]) # موز ومانجو

# DataFrame — جدول كامل
data = {
    "name"   : ["خليل", "فاطمة", "أحمد", "سارة", "يوسف"],
    "age"    : [14, 15, 13, 16, 14],
    "grade"  : [18, 19, 14, 17, 15],
    "city"   : ["مراكش", "الرباط", "فاس", "مراكش", "الدار البيضاء"]
}

df = pd.DataFrame(data)
print(df)
name age grade city 0 خليل 14 18 مراكش 1 فاطمة 15 19 الرباط 2 أحمد 13 14 فاس 3 سارة 16 17 مراكش 4 يوسف 14 15 الدار البيضاء

٥. التعامل مع DataFrame

Python — عمليات DataFrame
# معلومات عامة
print(df.shape)            # (5, 4) — 5 صفوف، 4 أعمدة
print(df.dtypes)           # نوع كل عمود
print(df.describe())       # إحصاءات تلقائية
print(df.head(3))          # أول 3 صفوف
print(df.tail(2))          # آخر صفين

# الوصول للأعمدة
print(df["grade"])          # عمود الدرجات
print(df[["name", "grade"]]) # عمودان

# الوصول للصفوف
print(df.iloc[0])           # الصف الأول (بالرقم)
print(df.loc[2])            # الصف بالمؤشر

# التصفية
top_students = df[df["grade"] >= 17]
print(top_students)

marrakech = df[df["city"] == "مراكش"]

# إضافة عمود جديد
df["passed"] = df["grade"] >= 10
df["percent"] = (df["grade"] / 20 * 100).round(1)

# ترتيب
sorted_df = df.sort_values("grade", ascending=False)

# التجميع — groupby
city_avg = df.groupby("city")["grade"].mean()
print(city_avg)

قراءة وكتابة الملفات

Python — CSV وExcel
# قراءة CSV
df = pd.read_csv("students.csv")
df = pd.read_csv("students.csv", encoding="utf-8")  # للعربية

# قراءة Excel
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")

# حفظ النتائج
df.to_csv("results.csv", index=False)
df.to_excel("results.xlsx", index=False)

٦. تنظيف البيانات (Data Cleaning)

في الواقع، 80% من وقت تحليل البيانات يُصرف على تنظيفها! البيانات الحقيقية غالباً فيها قيم مفقودة أو مكررة أو خاطئة.

Python — تنظيف البيانات
import pandas as pd
import numpy as np

# بيانات "قذرة" للاختبار
data = {
    "name"  : ["خليل", "أحمد", None, "سارة", "أحمد"],
    "grade" : [18, np.nan, 15, 17, np.nan],
    "city"  : ["  مراكش  ", "الرباط", "فاس", "MARRAKECH", "الرباط"]
}
df = pd.DataFrame(data)

# ١. الكشف عن القيم المفقودة
print(df.isnull().sum())   # عدد الفراغات في كل عمود
print(df.isnull().sum().sum())  # إجمالي الفراغات

# ٢. التعامل مع القيم المفقودة
df["grade"].fillna(df["grade"].mean(), inplace=True)  # ملء بالمعدل
df.dropna(subset=["name"], inplace=True)            # حذف صفوف بدون اسم

# ٣. إزالة التكرار
df.drop_duplicates(subset=["name"], inplace=True)

# ٤. تنظيف النصوص
df["city"] = df["city"].str.strip()    # إزالة المسافات
df["city"] = df["city"].str.lower()    # تحويل للأحرف الصغيرة
df["name"]  = df["name"].str.strip()

# ٥. إعادة تعيين الفهرس
df.reset_index(drop=True, inplace=True)

print("\nبعد التنظيف:")
print(df)
تحذير: لا تحذف قيماً مفقودة قبل أن تفهم لماذا هي مفقودة! أحياناً القيمة المفقودة نفسها معلومة مهمة.

٧. التحليل الإحصائي مع pandas

Python — التحليل الشامل
import pandas as pd

df = pd.DataFrame({
    "student" : ["خليل","فاطمة","أحمد","سارة","يوسف","رنا"],
    "math"    : [18, 19, 12, 15, 17, 14],
    "arabic"  : [16, 18, 14, 19, 15, 17],
    "science" : [17, 16, 13, 18, 16, 15]
})

# حساب المعدل لكل طالب
df["average"] = df[["math","arabic","science"]].mean(axis=1).round(2)

# تحديد التقدير
def get_rank(avg):
    if   avg >= 18: return "ممتاز 🌟"
    elif avg >= 15: return "جيد جداً 👍"
    elif avg >= 12: return "جيد 😊"
    elif avg >= 10: return "مقبول 😐"
    else:           return "راسب ❌"

df["rank"] = df["average"].apply(get_rank)

# إحصاءات المواد
print("📊 معدل كل مادة:")
print(df[["math","arabic","science"]].describe())

# الطالب الأول
best = df.loc[df["average"].idxmax()]
print(f"🏆 الأول: {best['student']} ({best['average']})")

# عدد كل تقدير
print(df["rank"].value_counts())

٨. Matplotlib — رسم المخططات

matplotlib تحول أرقامك إلى مخططات بصرية يسهل فهمها. إليك أشهر أنواع المخططات:

مخطط الأعمدة (Bar Chart)

Python — Bar Chart
import matplotlib.pyplot as plt
import matplotlib as mpl

# دعم العربية (اختياري)
mpl.rcParams['font.family'] = 'DejaVu Sans'

students = ["Khalil", "Fatima", "Ahmed", "Sara", "Youssef"]
grades   = [18, 19, 14, 17, 15]
colors   = ["#00d4aa" if g >= 15 else "#ff7675" for g in grades]

plt.figure(figsize=(10, 5))
plt.bar(students, grades, color=colors, edgecolor="white")
plt.axhline(y=10, color="red", linestyle="--", label="حد النجاح")
plt.title("Student Grades", fontsize=16)
plt.xlabel("Students")
plt.ylabel("Grade /20")
plt.ylim(0, 22)
plt.legend()
plt.tight_layout()
plt.show()

مخطط الخط (Line Chart)

Python — Line Chart
# تتبع درجات طالب على 6 شهور
months  = ["Sep","Oct","Nov","Dec","Jan","Feb"]
khalil  = [12, 14, 15, 16, 17, 18]
fatima  = [18, 17, 19, 18, 20, 19]

plt.figure(figsize=(10, 5))
plt.plot(months, khalil, "o-", color="#00d4aa", label="Khalil", linewidth=2)
plt.plot(months, fatima, "s-", color="#ff7675", label="Fatima", linewidth=2)
plt.fill_between(months, khalil, alpha=0.1, color="#00d4aa")
plt.title("Grade Progress", fontsize=16)
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

مخطط الدائرة (Pie Chart)

Python — Pie Chart
ranks  = ["Excellent", "Very Good", "Good", "Pass", "Fail"]
counts = [5, 12, 8, 4, 2]
colors = ["#00d4aa", "#0984e3", "#fdcb6e", "#e17055", "#d63031"]

plt.figure(figsize=(8, 6))
plt.pie(counts, labels=ranks, colors=colors,
        autopct="%1.1f%%", startangle=90,
        explode=[0.05]*5)
plt.title("Grade Distribution", fontsize=16)
plt.show()

٩. Seaborn — مخططات إحصائية جميلة

Seaborn مبنية على matplotlib لكنها أجمل وأسهل للمخططات الإحصائية.

Python — Seaborn
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({
    "student": ["K","F","A","S","Y"],
    "math"   : [18,19,12,15,17],
    "arabic" : [16,18,14,19,15],
    "science": [17,16,13,18,16]
})

# هيتماب — لمعرفة الارتباط بين المواد
correlation = df[["math","arabic","science"]].corr()

plt.figure(figsize=(6,4))
sns.heatmap(correlation, annot=True, cmap="YlOrRd", fmt=".2f")
plt.title("Correlation Between Subjects")
plt.show()

# Boxplot — توزيع الدرجات
df_melted = df.melt(id_vars=["student"],
                     var_name="subject",
                     value_name="grade")

plt.figure(figsize=(8,5))
sns.boxplot(data=df_melted, x="subject", y="grade",
             palette="Set2")
plt.title("Grade Distribution by Subject")
plt.show()

# Scatter — علاقة مادتين
plt.figure(figsize=(6,5))
sns.scatterplot(data=df, x="math", y="science",
                 s=100, color="#00d4aa")
plt.title("Math vs Science Grades")
plt.show()

🚀 المشروع النهائي — تحليل نتائج صف دراسي كامل

مشروع حقيقي يجمع كل ما تعلمته: إنشاء بيانات، تنظيف، تحليل، ومخططات.

Python — school_analysis.py
# ============================
# 📊 تحليل نتائج صف دراسي
# ============================

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# ١. إنشاء البيانات (في الواقع ستقرأها من CSV)
np.random.seed(42)
n = 30

df = pd.DataFrame({
    "id"     : range(1, n+1),
    "math"   : np.random.randint(6, 21, n),
    "arabic" : np.random.randint(8, 21, n),
    "science": np.random.randint(7, 21, n),
    "english": np.random.randint(5, 21, n)
})

# ٢. حساب المعدل والتقدير
subjects = ["math", "arabic", "science", "english"]
df["average"] = df[subjects].mean(axis=1).round(2)
df["status"]  = df["average"].apply(lambda x: "Pass" if x >= 10 else "Fail")

# ٣. ملخص الصف
print("="*40)
print(" 📊 Class Analysis Report")
print("="*40)
print(f"Total students : {len(df)}")
print(f"Passed         : {(df['status']=='Pass').sum()}")
print(f"Failed         : {(df['status']=='Fail').sum()}")
print(f"Class average  : {df['average'].mean():.2f}/20")
print(f"Highest grade  : {df['average'].max()}")
print(f"Lowest  grade  : {df['average'].min()}")
print()

print("Subject averages:")
for s in subjects:
    print(f"  {s:8}: {df[s].mean():.2f}")

# ٤. رسم الرسوم البيانية
fig, axes = plt.subplots(2, 2, figsize=(12, 9))
fig.suptitle("📊 Class Analysis Dashboard", fontsize=16)

# مخطط الأعمدة — معدلات المواد
subject_avgs = [df[s].mean() for s in subjects]
axes[0,0].bar(subjects, subject_avgs, color=["#00d4aa","#0984e3","#fdcb6e","#e17055"])
axes[0,0].set_title("Subject Averages")
axes[0,0].set_ylim(0, 20)

# الدائرة — نجاح ورسوب
status_counts = df["status"].value_counts()
axes[0,1].pie(status_counts, labels=status_counts.index,
                autopct="%1.0f%%", colors=["#00d4aa","#d63031"])
axes[0,1].set_title("Pass vs Fail")

# هيستوغرام — توزيع المعدلات
axes[1,0].hist(df["average"], bins=8, color="#0984e3", edgecolor="white")
axes[1,0].axvline(df["average"].mean(), color="red", linestyle="--", label="Mean")
axes[1,0].set_title("Grade Distribution")
axes[1,0].legend()

# Scatter — رياضيات vs علوم
axes[1,1].scatter(df["math"], df["science"], alpha=0.7, color="#fdcb6e")
axes[1,1].set_title("Math vs Science")
axes[1,1].set_xlabel("Math")
axes[1,1].set_ylabel("Science")

plt.tight_layout()
plt.savefig("class_analysis.png", dpi=150)  # حفظ الصورة
plt.show()
print("✅ تم حفظ المخططات في class_analysis.png")

🏆 تحدي إضافي

عدّل المشروع بحيث:

  • يقرأ البيانات من ملف CSV حقيقي بدل إنشائها
  • يطبع أسماء أعلى 3 طلاب فقط
  • يحفظ تقرير النص في ملف report.txt
Python — الحل
# قراءة من CSV
df = pd.read_csv("students.csv")

# أعلى 3 طلاب
top3 = df.nlargest(3, "average")
print("🏆 أعلى 3 طلاب:")
for i, (_, row) in enumerate(top3.iterrows(), 1):
    print(f"  {i}. Student {row['id']}: {row['average']}/20")

# حفظ التقرير
with open("report.txt", "w", encoding="utf-8") as f:
    f.write(f"Total: {len(df)}\n")
    f.write(f"Average: {df['average'].mean():.2f}\n")
    f.write(f"Passed: {(df['status']=='Pass').sum()}\n")
print("✅ تم حفظ التقرير")

🎉 أتقنت تحليل البيانات ببايثون!

الآن تعرف pandas وnumpy وmatplotlib وseaborn — مهارات مطلوبة جداً في سوق العمل.

عودة إلى البداية؟ راجع الدروس السابقة لتعميق فهمك.

الدرس التالي: المكتبات القياسية ←