Table of Contents
مروری خیلی کوتاه قبل از شروع مثالها
در این زیرفصل فرض میکنیم:
- میدانید «علم داده چیست؟»
- با مفاهیم پایهای «کار با دادهها» آشنا شدهاید.
- یک آشنایی ابتدایی با
NumPy،pandasوmatplotlibدارید (ایمپورت، ساخت آرایه/سری ساده، رسم نمودار ساده).
در اینجا تمرکز ما روی چند سناریوی واقعی کوچک است تا ببینید با همین مفاهیم ساده، چطور میشود تحلیل داده انجام داد.
برای همهی مثالها چند نکته:
- فرض: کتابخانهها را اینطور ایمپورت میکنیم:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt- در بیشتر نمودارها در پایان از:
plt.show()استفاده میکنیم (در برخی محیطها مثل Jupyter ممکن است خودش نمایش دهد).
مثال ۱: تحلیل نمرههای یک کلاس
سناریو
یک فایل (یا جدول) از نمرههای یک کلاس دارید و میخواهید:
- میانگین، کمترین و بیشترین نمره را پیدا کنید.
- بدانید چند نفر افتادهاند (مثلاً نمره < ۱۰).
- یک نمودار ساده بسازید.
برای سادگی، داده را مستقیماً در کد میسازیم؛ در عمل میتواند از فایل خوانده شود.
import pandas as pd
import matplotlib.pyplot as plt
# دادهی نمونه: نمرههای یک کلاس
data = {
"name": ["علی", "سارا", "مهدی", "مینا", "رضا", "نگار", "حسین", "الهام"],
"score": [18, 12, 9, 15, 7, 20, 14, 8]
}
df = pd.DataFrame(data)
print(df)محاسبهی شاخصهای ساده
avg_score = df["score"].mean()
min_score = df["score"].min()
max_score = df["score"].max()
print("میانگین نمره:", avg_score)
print("کمترین نمره:", min_score)
print("بیشترین نمره:", max_score)چند مثال دیگر از آمار ساده:
print("میانهی نمره:", df["score"].median())
print("انحراف معیار:", df["score"].std())شمارش دانشجویان قبول و مردود
failed = df[df["score"] < 10]
passed = df[df["score"] >= 10]
print("تعداد مردودها:", len(failed))
print("تعداد قبولها:", len(passed))
print("مردودها:")
print(failed)رسم نمودار میلهای نمرهها
plt.bar(df["name"], df["score"])
plt.xlabel("دانشجو")
plt.ylabel("نمره")
plt.title("نمرههای دانشجویان")
plt.xticks(rotation=45) # چرخاندن برچسبها برای خوانایی بهتر
plt.tight_layout()
plt.show()نکات تحلیلی ساده
- با یک نگاه میبینید چه کسانی بالاتر/پایینتر از میانگین هستند.
- میتوانید یک ستون جدید بسازید که وضعیت هر دانشجو (قبول/مردود) را نشان دهد:
df["status"] = df["score"].apply(lambda x: "قبول" if x >= 10 else "مردود")
print(df)این نوع برچسبگذاری (Labeling) در بسیاری از تحلیلها تکرار میشود.
مثال ۲: تحلیل سادهی فروش ماهانه
سناریو
فرض کنید دادهی فروش یک فروشگاه در چند ماه مختلف را دارید و میخواهید:
- روند فروش را ببینید (آیا رو به رشد است؟).
- ماههایی را که فروش خیلی پایین یا خیلی بالاست پیدا کنید.
import pandas as pd
import matplotlib.pyplot as plt
data = {
"month": ["فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور"],
"sales": [1200, 1500, 1600, 900, 2000, 2300]
}
df = pd.DataFrame(data)
print(df)آمار کلی فروش
total_sales = df["sales"].sum()
avg_sales = df["sales"].mean()
max_sales = df["sales"].max()
best_month = df.loc[df["sales"].idxmax(), "month"]
print("مجموع فروش:", total_sales)
print("میانگین فروش:", avg_sales)
print("بیشترین فروش:", max_sales, "در ماه", best_month)رسم روند فروش (نمودار خطی)
plt.plot(df["month"], df["sales"], marker="o")
plt.xlabel("ماه")
plt.ylabel("میزان فروش")
plt.title("روند فروش ماهانه")
plt.grid(True)
plt.tight_layout()
plt.show()تشخیص ماههای «ضعیف» و «خوب»
مثلاً بگوییم:
- ماه «ضعیف»: فروش < ۱۰۰۰
- ماه «خیلی خوب»: فروش > ۱۸۰۰
weak_months = df[df["sales"] < 1000]
great_months = df[df["sales"] > 1800]
print("ماههای با فروش ضعیف:")
print(weak_months)
print("\nماههای با فروش خیلی خوب:")
print(great_months)میتوانیم یک ستون وضعیت اضافه کنیم:
def label_sales(x):
if x < 1000:
return "ضعیف"
elif x > 1800:
return "خیلی خوب"
else:
return "معمولی"
df["status"] = df["sales"].apply(label_sales)
print(df)اینطور دستهبندی کردن برای گزارشهای مدیریتی خیلی رایج است.
مثال ۳: تحلیل سادهی دادههای وزنی و قدی
سناریو
میخواهیم یک رابطهی ساده بین قد و وزن را بررسی کنیم و یک نمودار پراکنش (Scatter Plot) رسم کنیم.
import pandas as pd
import matplotlib.pyplot as plt
data = {
"height_cm": [160, 165, 170, 175, 180, 185, 190],
"weight_kg": [55, 60, 65, 72, 80, 85, 90]
}
df = pd.DataFrame(data)
print(df)محاسبهی BMI به عنوان یک ویژگی جدید
فرمول BMI:
$$
BMI = \frac{\text{weight (kg)}}{(\text{height (m)})^2}
$$
ارتفاع بر حسب متر $= \frac{\text{height\_cm}}{100}$
df["height_m"] = df["height_cm"] / 100
df["BMI"] = df["weight_kg"] / (df["height_m"] ** 2)
print(df[["height_cm", "weight_kg", "BMI"]])دستهبندی ساده براساس BMI
(تعریف دقیق پزشکی مطرح نیست؛ فقط یک مثال تحلیلی است)
def label_bmi(bmi):
if bmi < 18.5:
return "کموزن"
elif bmi < 25:
return "نرمال"
else:
return "بالای نرمال"
df["BMI_label"] = df["BMI"].apply(label_bmi)
print(df)رسم نمودار پراکنش قد و وزن
plt.scatter(df["height_cm"], df["weight_kg"])
plt.xlabel("قد (cm)")
plt.ylabel("وزن (kg)")
plt.title("نمودار پراکنش قد و وزن")
plt.grid(True)
plt.show()میتوانید از رنگها یا اندازههای مختلف برای نشان دادن برچسب BMI استفاده کنید (ایده برای تمرین).
مثال ۴: کار با دادهی زمانی ساده (دمای روزانه)
سناریو
دمای هوا را در چند روز متوالی ثبت کردهاید و میخواهید:
- میانگین دما را بدانید.
- گرمترین و سردترین روز را پیدا کنید.
- نمودار تغییرات دما را ببینید.
import pandas as pd
import matplotlib.pyplot as plt
data = {
"date": [
"2024-01-01", "2024-01-02", "2024-01-03",
"2024-01-04", "2024-01-05", "2024-01-06", "2024-01-07"
],
"temp_c": [5, 7, 6, 4, 3, 8, 10]
}
df = pd.DataFrame(data)
# تبدیل ستون تاریخ به نوع datetime
df["date"] = pd.to_datetime(df["date"])
print(df)آمار سادهی دما
print("میانگین دما:", df["temp_c"].mean())
print("کمترین دما:", df["temp_c"].min())
print("بیشترین دما:", df["temp_c"].max())
coldest_day = df.loc[df["temp_c"].idxmin(), "date"]
hottest_day = df.loc[df["temp_c"].idxmax(), "date"]
print("سردترین روز:", coldest_day)
print("گرمترین روز:", hottest_day)رسم نمودار زمانی دما
plt.plot(df["date"], df["temp_c"], marker="o")
plt.xlabel("تاریخ")
plt.ylabel("دما (°C)")
plt.title("تغییرات دمای روزانه")
plt.grid(True)
plt.tight_layout()
plt.show()در دادههای واقعیتر، میتوانید این کار را برای هفته، ماه یا سال انجام دهید و روندهای فصلی را ببینید.
مثال ۵: پاکسازی و میانگینگیری دادهی پرسشنامه
سناریو
یک پرسشنامهی ساده با امتیاز از ۱ تا ۵ دارید؛ بعضی جوابها ناقص است (کاربر چیزی وارد نکرده یا مقدار نامعتبر داده است). میخواهید:
- دادهی ناقص را پیدا کنید.
- امتیاز معتبر را نگه دارید.
- میانگین امتیازها را حساب کنید.
import pandas as pd
data = {
"user": ["کاربر۱", "کاربر۲", "کاربر۳", "کاربر۴", "کاربر۵"],
"rating": [5, None, 3, 6, 4] # توجه: 6 نامعتبر است، None دادهی خالی
}
df = pd.DataFrame(data)
print(df)پیدا کردن و مدیریت مقادیر خالی (NaN)
پانداس مقدار None را معمولاً به NaN تبدیل میکند.
print("مقادیر خالی:")
print(df[df["rating"].isna()])میتوانیم سطرهای خالی را حذف کنیم:
df_clean = df.dropna(subset=["rating"])
print("بعد از حذف مقادیر خالی:")
print(df_clean)حذف امتیازهای نامعتبر
مثلاً امتیاز باید بین ۱ و ۵ باشد:
valid_ratings = df_clean[(df_clean["rating"] >= 1) & (df_clean["rating"] <= 5)]
print("امتیازهای معتبر:")
print(valid_ratings)میانگین امتیاز معتبر
avg_rating = valid_ratings["rating"].mean()
print("میانگین امتیاز معتبر:", avg_rating)این یک نمونهی رایج از «پاکسازی داده» است که تقریباً در همهی پروژههای واقعی لازم میشود.
پیشنهادهایی برای تمرین بیشتر
با الهام از مثالهای بالا، میتوانید این تمرینها را انجام دهید:
- نمرههای کلاس
- یک ستون بسازید که به هر محدودهی نمره (۰–۱۰، ۱۰–۱۵، ۱۵–۲۰) یک برچسب بدهد.
- تعداد افراد در هر دسته را حساب کنید و نمودار میلهای آن را رسم کنید.
- فروش ماهانه
- یک ستون «فروش تجمعی» (
cumulative_sales) بسازید که مجموع فروش از ابتدای سال تا آن ماه را نشان دهد. - نمودار فروش ماهانه و فروش تجمعی را روی یک شکل (دو خط) رسم کنید.
- قد و وزن
- در نمودار پراکنش، برای افراد با برچسب BMI متفاوت (کموزن، نرمال، بالای نرمال) رنگهای مختلف استفاده کنید.
- دمای روزانه
- روزهایی را که دما بالاتر از میانگین است با یک علامت (مثلاً دایرهی قرمز) در نمودار مشخص کنید.
- پرسشنامه
- علاوه بر میانگین، میانه (
median) و بیشترین امتیاز (max) را هم حساب کنید. - تعداد پاسخدهندگان با امتیاز ۵ را پیدا کنید و درصد آنها را نسبت به کل پاسخهای معتبر حساب کنید.
این مثالها نشان میدهند که حتی با ابزارهای بسیار پایهای pandas، NumPy و matplotlib میتوانید تحلیلهای مفید و قابلفهم انجام دهید. در مراحل بعدی، میتوانید به سراغ مجموعهدادههای بزرگتر و پیچیدهتر بروید.