١. لماذا تحليل البيانات؟
البيانات موجودة في كل مكان: مبيعات المحلات، نتائج الطلاب، الطقس، الأسهم، وسائل التواصل الاجتماعي. تحليل البيانات ببايثون يتيح لك استخلاص معلومات مفيدة من هذه الأرقام بسرعة وبدقة.
pandas
للتعامل مع جداول البيانات — قراءة، تصفية، تجميع
import pandas as pd
NumPy
للعمليات الرياضية على المصفوفات بسرعة فائقة
import numpy as np
Matplotlib
لرسم المخططات والتصورات البيانية
import matplotlib.pyplot as plt
Seaborn
مخططات إحصائية جميلة ومتقدمة
import seaborn as sns
٢. تثبيت المكتبات
افتح Terminal أو CMD وثبّت كل المكتبات بأمر واحد:
pip install pandas numpy matplotlib seaborn
تحقق من التثبيت:
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("✅ كل المكتبات جاهزة!")
pip install jupyter٣. NumPy — أساس الحسابات العلمية
NumPy أسرع بكثير من القوائم العادية في العمليات الرياضية. تستخدمها pandas داخلياً.
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 (جدول كامل).
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)
٥. التعامل مع 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)
قراءة وكتابة الملفات
# قراءة 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% من وقت تحليل البيانات يُصرف على تنظيفها! البيانات الحقيقية غالباً فيها قيم مفقودة أو مكررة أو خاطئة.
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
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)
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)
# تتبع درجات طالب على 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)
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 لكنها أجمل وأسهل للمخططات الإحصائية.
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()
🚀 المشروع النهائي — تحليل نتائج صف دراسي كامل
مشروع حقيقي يجمع كل ما تعلمته: إنشاء بيانات، تنظيف، تحليل، ومخططات.
# ============================
# 📊 تحليل نتائج صف دراسي
# ============================
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
# قراءة من 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 — مهارات مطلوبة جداً في سوق العمل.
عودة إلى البداية؟ راجع الدروس السابقة لتعميق فهمك.
الدرس التالي: المكتبات القياسية ←