هوش مصنوعی

تحلیل داده با پایتون و پانداس

پانداس (pandas) کتابخانه‌ای است که کار با داده‌ی جدولی را در پایتون کوتاه و خوانا می‌کند، از فایل CSV فروش یک فروشگاه تا خروجی یک API. این راهنما مسیر معمول یک تحلیل واقعی را با کد قابل‌اجرا نشان می‌دهد.

  • نویسنده تیم تتا
  • ۸ دقیقه مطالعه
  • به‌روزرسانی:
تحلیل داده با پایتون و پانداس

شروع کار با پانداس و بارگذاری داده

پانداس دو ساختار اصلی دارد: Series (یک ستون) و DataFrame (جدول). نصب آن با pip install pandas انجام می‌شود و مستندات رسمی در pandas.pydata.org/docs است. در این مقاله از یک فایل فروش ساده استفاده می‌کنیم؛ اگر فایل ندارید، همین داده را درون کد می‌سازیم تا همه‌ی مثال‌ها اجراشدنی باشند.

python
import pandas as pd

# In real work: df = pd.read_csv("sales.csv", parse_dates=["date"])
df = pd.DataFrame({
    "date": ["2026-01-03", "2026-01-15", "2026-02-02", "2026-02-20", "2026-03-05", "2026-03-18"],
    "city": ["Tabriz", "Tehran", "Tabriz", None, "Tehran", "Tabriz"],
    "product": ["rug", "rug", "kilim", "rug", "kilim", "rug"],
    "qty": [2, 1, 3, 1, None, 4],
    "price": [1200, 1500, 800, 1500, 800, 1200],
})
df["date"] = pd.to_datetime(df["date"])

print(df.shape)
print(df.dtypes)
print(df.head())

برای فایل‌های فارسی، رمزگذاری را بررسی کنید: pd.read_csv("file.csv", encoding="utf-8-sig") معمولاً مشکل فایل‌های خروجی اکسل را حل می‌کند. فایل‌های بزرگ را با usecols و dtype سبک‌تر بخوانید.

شناخت داده پیش از تحلیل

پیش از هر محاسبه، چند دستور ثابت را اجرا کنید. این کار چند دقیقه طول می‌کشد و جلوی نتیجه‌گیری غلط از داده‌ی خراب را می‌گیرد:

  • df.info(): نوع ستون‌ها و تعداد مقدارهای غیرخالی.
  • df.describe(): میانگین، کمینه و بیشینه؛ مقدارهای غیرمنطقی (قیمت منفی) را نشان می‌دهد.
  • df.isna().sum(): تعداد مقدار گمشده در هر ستون.
  • df["city"].value_counts(dropna=False): مقدارهای تکراری و غلط‌های املایی در ستون‌های دسته‌ای.
  • df.duplicated().sum(): ردیف‌های تکراری.

پاک‌سازی داده: مقدار گمشده، نوع و تکراری

پاک‌سازی تصمیم‌گیری است، نه فقط دستور. حذف ردیف، پر کردن با میانگین یا نگه‌داشتن «نامشخص» هر کدام نتیجه‌ی متفاوتی می‌دهد؛ تصمیم را با توجه به معنای ستون بگیرید و ثبت کنید.

python
clean = (
    df
    .drop_duplicates()
    .assign(
        city=lambda d: d["city"].fillna("unknown").str.strip().str.title(),
        qty=lambda d: d["qty"].fillna(0).astype(int),
        product=lambda d: d["product"].astype("category"),
    )
    .assign(revenue=lambda d: d["qty"] * d["price"])
)
print(clean)

زنجیره‌ی بالا (method chaining) مرحله‌ها را به‌ترتیب و خوانا نگه می‌دارد و DataFrame اصلی را تغییر نمی‌دهد. توجه کنید که پر کردن تعداد گمشده با ۰ در اینجا یعنی «فروشی ثبت نشده»؛ اگر معنی‌اش «نامعلوم» است، بهتر است ردیف را کنار بگذارید.

تصویری انتزاعی و رنگارنگ از جدولی نامرتب که به نمودارهای منظم و درخشان تبدیل می‌شود.
بخش بزرگی از تحلیل، پاک‌سازی است؛ نمودار خوب نتیجه‌ی جدول تمیز است.

گروه‌بندی و خلاصه‌سازی با groupby

بیشتر پرسش‌های کسب‌وکار به شکل «برای هر X، مقدار Y چقدر است» هستند و پاسخ‌شان groupby است:

python
by_city = (
    clean.groupby("city", as_index=False)
         .agg(orders=("qty", "size"), units=("qty", "sum"), revenue=("revenue", "sum"))
         .sort_values("revenue", ascending=False)
)
print(by_city)

pivot = clean.pivot_table(index="city", columns="product", values="revenue",
                          aggfunc="sum", fill_value=0, observed=True)
print(pivot)

تجمیع نام‌دار (name=("column", "func")) خروجی را خوانا می‌کند و نیازی به تغییر نام ستون‌ها نیست. pivot_table همان کار را به شکل ماتریس درمی‌آورد که برای مقایسه‌ی شهر و محصول مناسب است. اگر نتیجه را در یک گزارش وب نشان می‌دهید، صفحه‌ی خدمات تحلیل داده ما نمونه‌ی همکاری‌هایمان را توضیح می‌دهد.

ترکیب جدول‌ها با merge

داده‌ی واقعی معمولاً در چند جدول است: سفارش‌ها، مشتریان، محصولات. merge معادل JOIN در SQL است و نوع اتصال را با how تعیین می‌کنید.

python
cities = pd.DataFrame({
    "city": ["Tabriz", "Tehran", "Shiraz"],
    "region": ["North-West", "Centre", "South"],
})

# validate catches accidental many-to-many joins that silently multiply rows
merged = clean.merge(cities, on="city", how="left", validate="many_to_one")
print(merged[["city", "region", "revenue"]])
print(merged["region"].isna().sum(), "rows without a region")

اگر داده‌ی شما در یک پایگاه‌داده است، اغلب بهتر است join سنگین را همان‌جا با SQL انجام دهید و فقط نتیجه را به پانداس بیاورید؛ طراحی کوئری‌ها در طراحی API های مقیاس‌پذیر هم مطرح شده است.

سری زمانی: تاریخ، resample و روند

وقتی ستون تاریخ از نوع datetime باشد، گروه‌بندی بر اساس ماه یا هفته یک خط کد است. تبدیل نوع تاریخ را همان ابتدای کار انجام دهید، نه وسط تحلیل.

python
monthly = (
    clean.set_index("date")["revenue"]
         .resample("MS")          # month start
         .sum()
         .to_frame("revenue")
)
monthly["change_pct"] = monthly["revenue"].pct_change() * 100
monthly["rolling_2m"] = monthly["revenue"].rolling(2).mean()
print(monthly)

pct_change برای ماه اول مقدار خالی می‌دهد که طبیعی است. با داده‌ی کم، میانگین متحرک را کوتاه بگیرید و نتیجه را بیش‌ازحد تفسیر نکنید؛ چند ماه داده برای ادعای «روند» کافی نیست.

دام‌های رایج در پانداس

  • حلقه روی ردیف‌ها: iterrows() کند است. ستون را به‌صورت برداری محاسبه کنید: df["a"] * df["b"].
  • SettingWithCopyWarning: روی یک برش (slice) مقدار ننویسید؛ از .loc یا .copy() استفاده کنید.
  • نوع ستون‌ها: اعدادی که به‌صورت رشته خوانده شده‌اند جمع نمی‌شوند؛ pd.to_numeric(col, errors="coerce") مقدارهای خراب را به NaN تبدیل می‌کند تا ببینید کجا هستند.
  • حافظه: ستون‌های متنی تکراری را به category تبدیل کنید و برای فایل‌های خیلی بزرگ از خواندن تکه‌تکه (chunksize) استفاده کنید.

نتیجه‌ی تحلیل معمولاً به یک نمودار یا یک فایل خروجی ختم می‌شود: by_city.to_csv("report.csv", index=False) یا df.plot(kind="bar") (با Matplotlib). برای انتشار روی سایت، سرعت بارگذاری صفحه را هم در نظر بگیرید.

چک‌لیست تحلیل تکرارپذیر و گام بعد

  1. داده‌ی خام را دست‌نخورده نگه دارید و پاک‌سازی را در کد انجام دهید.
  2. نوع ستون‌ها را در همان بارگذاری تعیین کنید.
  3. پس از هر merge تعداد ردیف‌ها را بررسی کنید.
  4. فرض‌ها (مثلاً «گمشده یعنی ۰») را در کد به‌صورت کامنت بنویسید.
  5. کل مراحل را در یک اسکریپت یا نوت‌بوک بنویسید تا با داده‌ی جدید دوباره اجرا شود.

پس از تسلط بر این پایه، قدم طبیعی بعد یادگیری مدل‌هاست؛ مقدمه‌ای بر یادگیری ماشین از همین جدول‌های تمیز شروع می‌شود. برای مرور اصول پایه‌ی زبان هم مستندات پایتون مرجع خوبی است. و اگر داده‌ی کسب‌وکارتان آماده‌ی تحلیل است، با ما در میان بگذارید.

پرسش‌های متداول

پانداس را از کجا یاد بگیرم و چقدر پایتون لازم است؟

آشنایی با متغیر، لیست، دیکشنری و تابع کافی است. با یک فایل CSV واقعی و پرسش‌های مشخص شروع کنید و مستندات رسمی را کنار دست بگذارید؛ تمرین روی داده‌ی خودتان از دوره‌ی صرفاً نظری مؤثرتر است.

تفاوت Series و DataFrame چیست؟

Series یک ستون داده با برچسب ردیف است و DataFrame جدولی از چند Series با ایندکس مشترک. هر ستون یک DataFrame در واقع یک Series است.

پانداس برای چه حجمی از داده مناسب است؟

برای داده‌ای که در حافظه‌ی رایانه جا شود، معمولاً تا چند میلیون ردیف روی یک دستگاه معمولی. برای حجم بیشتر می‌توانید ستون‌ها را سبک‌تر کنید، تکه‌تکه بخوانید یا از پایگاه‌داده و ابزارهای توزیع‌شده کمک بگیرید.

چطور مقدارهای گمشده را مدیریت کنم؟

ابتدا با isna().sum() بشمارید، بعد بر اساس معنای ستون تصمیم بگیرید: حذف ردیف، پر کردن با مقدار ثابت یا میانه، یا نگه‌داشتن به‌عنوان «نامشخص». تصمیم را مستند کنید.

دیدگاه‌ها

    هنوز دیدگاهی ثبت نشده است. اولین نفر باشید.

    دیدگاه‌ها پس از بررسی منتشر می‌شوند.