آموزش

عملیات groupby و split-apply-combine در Pandas

در این آموزش، یاد می‌گیری چطور از عملیات groupby در pandas استفاده کنی. این عملیات بر پایه راهکار شناخته‌شده تقسیم، اعمال و ترکیب (split-apply-combine) کار می‌کنه. برای یادگیری این مفهوم، از داده‌های فیلم‌های نتفلیکس استفاده می‌کنیم.

تاریخ انتشار:
20 مرداد 1405
پایتون
8 دقیقه
علم داده
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

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

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

این روش به اسم «تقسیم، اعمال و ترکیب» (split-apply-combine) شناخته می‌شه. یعنی اول داده‌ها رو به چند گروه تقسیم می‌کنیم (split)، بعد یه تابع یا محاسبه رو روی هر گروه اعمال می‌کنیم (apply) و در نهایت نتیجه‌ها رو در یه خروجی جدید ترکیب می‌کنیم (combine).

در ادامه، یاد می‌گیریم چطور این فرایند رو با استفاده از groupby در pandas انجام بدیم و چطور ازش برای جواب دادن به سؤال‌های تحلیلی استفاده کنیم.

اگه این تکنیک برات مفیده، می‌تونی بیشتر درباره‌ش (در کنار خیلی چیزهای دیگه) یاد بگیری و اون رو در دوره کار با داده‌ها با Pandas ما در فینکا تمرین کنی.

کاوش داده با Pandas

وارد کردن داده‌ها

در این بخش، از pandas، شیء groupby و ایده تقسیم، اعمال و ترکیب استفاده می‌کنیم تا ببینیم بازه امتیازهای فیلم‌های نتفلیکس در سال‌های مختلف چه تغییری کرده.

برای شروع، اول پکیج‌های موردنیاز و داده‌ها رو وارد می‌کنیم. بعد هم با نمایش ۵ سطر اول دیتاست، یه نگاه اولیه به ساختار داده‌ها می‌ندازیم.

همون‌طور که می‌بینی، علاوه بر چند ستون دیگه، ستون‌هایی برای عنوان‌ها، رده‌بندی‌ها، سال انتشار و امتیاز کاربران وجود داره. قبل از دسته‌بندی و شروع فرایند تقسیم، اعمال و ترکیب، بیا با دقت بیشتری به داده‌ها نگاه کنیم تا هم مطمئن بشیم دقیقاً همون چیزی هستن که انتظار داریم و هم بتونیم مقادیر ازدست‌رفته رو مدیریت کنیم. دقت کن که یه مقدار نامعتبر NaN در ستون user_rating_score در سطر دوم (اندیس ۱) وجود داره.

خلاصه‌سازی داده‌ها با نمودارها و آمارها

متد .info() دیتافریم در کتابخونه pandas واقعاً کاربردیه! همون‌طور که در کد پایین می‌بینی، استفاده از این متد نشون می‌ده که ما ۱۰۰۰ سطر و ۷ ستون داده داریم، اما ستون موردنظرمون یعنی user_rating_score، فقط ۶۰۵ مقدار غیر خالی داره. این یعنی ۳۹۵ مقدار گم‌شده (Missing Value) در این ستون داریم:

خروجی
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 7 columns):
title                1000 non-null object
rating               1000 non-null object
ratinglevel          941 non-null object
ratingdescription    1000 non-null int64
release_year         1000 non-null int64
user_rating_score    605 non-null float64
user_rating_size     1000 non-null int64
dtypes: float64(1), int64(3), object(3)
memory usage: 54.8+ KB

می‌تونیم سطرهایی که مقدار گم‌شده دارن رو حذف کنیم، سطرهای تکراری رو کنار بذاریم و با استفاده از seaborn یه نمودار pairplot از دیتافریم رسم کنیم تا دید بهتری نسبت به داده‌ها پیدا کنیم. در ضمن، داده‌ها رو بر اساس ستون rating رنگ‌بندی می‌کنیم.

بیا نمودارها رو بررسی کنیم و ببینیم چه اطلاعاتی می‌شه ازشون گرفت.

به‌عنوان مثال، بیا user_rating_score رو بر اساس روند release_year بررسی کنیم. از روی نمودار هیچ روند مشخصی دیده نمی‌شه، اما شاید با تحلیل دقیق‌تر بتونیم الگوهایی پیدا کنیم. برای این کار بهتره چند آماره خلاصه از دیتافریم بگیریم که با متد .describe() انجام می‌شه:

خروجی
  	ratingdescription 	release_year 	user_rating_score 	user_rating_size
count 	246.000000 	246.000000 	246.000000 	246.0
mean 	73.556911 	2010.272358 	81.390244 	80.0
std 	26.616145 	8.887219 	12.677883 	0.0
min 	10.000000 	1940.000000 	55.000000 	80.0
25% 	60.000000 	2007.000000 	71.000000 	80.0
50% 	80.000000 	2015.000000 	83.500000 	80.0
75% 	90.000000 	2016.000000 	92.750000 	80.0
max 	124.000000 	2017.000000 	99.000000 	80.0

استفاده از groupby و فرایند تقسیم، اعمال و ترکیب برای رسیدن به جواب

قدم ۱: تقسیم (Split)

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

این کار یه شیء groupby برامون می‌سازه. اما بیا ببینیم نوع این شیء دقیقاً چیه؟

خروجی
pandas.core.groupby.DataFrameGroupBy

قدم ۲: اعمال (Apply)

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

مثلاً اگه متد .describe() رو روی یه شیء groupby اعمال کنیم، آماره‌های خلاصه برای هر گروه جداگانه محاسبه می‌شه. در اینجا چون گروه‌بندی رو بر اساس release_year انجام دادیم، این آماره‌ها به تفکیک سال انتشار به دست میان.

این همون مرحله اعمال در فرایند «تقسیم، اعمال و ترکیب» هست. حالا بیا ۵ سطر اول نتیجه رو ببینیم.

خروجی
  	ratingdescription 	user_rating_score 	user_rating_size
  	count 	mean 	std 	min 	25% 	50% 	75% 	max 	count 	mean 	... 	75% 	max 	count 	mean 	std 	min 	25% 	50% 	75% 	max
release_year 	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 
1940 	1.0 	35.0 	NaN 	35.0 	35.0 	35.0 	35.0 	35.0 	1.0 	61.0 	... 	61.0 	61.0 	1.0 	80.0 	NaN 	80.0 	80.0 	80.0 	80.0 	80.0
1978 	1.0 	60.0 	NaN 	60.0 	60.0 	60.0 	60.0 	60.0 	1.0 	86.0 	... 	86.0 	86.0 	1.0 	80.0 	NaN 	80.0 	80.0 	80.0 	80.0 	80.0
1982 	1.0 	60.0 	NaN 	60.0 	60.0 	60.0 	60.0 	60.0 	1.0 	68.0 	... 	68.0 	68.0 	1.0 	80.0 	NaN 	80.0 	80.0 	80.0 	80.0 	80.0
1986 	1.0 	35.0 	NaN 	35.0 	35.0 	35.0 	35.0 	35.0 	1.0 	67.0 	... 	67.0 	67.0 	1.0 	80.0 	NaN 	80.0 	80.0 	80.0 	80.0 	80.0
1987 	1.0 	60.0 	NaN 	60.0 	60.0 	60.0 	60.0 	60.0 	1.0 	58.0 	... 	58.0 	58.0 	1.0 	80.0 	NaN 	80.0 	80.0 	80.0 	80.0 	80.0

5 rows × 24 columns

اگه دوست داری ببینی خروجی این گروه‌بندی چه شکلیه، می‌تونی شیء groupby رو به تابع list() پاس بدی:

قدم ۳: ترکیب (Combine)

فرض کن دنبال میانگین یا میانه user_rating_score برای هر سال هستی. برای این کار کافیه متد .mean() یا .median() رو روی شیء groupby اعمال کنی و در نهایت نتیجه‌ها رو در یه دیتافریم جدید ترکیب کنی.

خروجی
  	ratingdescription 	user_rating_score 	user_rating_size
release_year 	  	  	 
1940 	35.0 	61.0 	80.0
1978 	60.0 	86.0 	80.0
1982 	60.0 	68.0 	80.0
1986 	35.0 	67.0 	80.0
1987 	60.0 	58.0 	80.0

در مورد اندیس دیتافریم df_med_by_year یه نکته ظریف و مهم وجود داره. همون‌طور که می‌دونی، اندیس یه دیتافریم در واقع همون برچسب سطرهاست. بیا یه نگاه به اندیس دیتافریم اصلیمون (یعنی df) بندازیم:

خروجی
Int64Index([  0,   2,   3,   4,   5,   6,   7,   8,   9,  10,
            ...
            908, 911, 917, 931, 962, 966, 967, 972, 973, 979],
           dtype='int64', length=246)

این اندیس شامل شماره سطرهای اصلیه که با اعداد صحیح مشخص شدن. مثلاً عدد ۱ وجود نداره، چون ما قبلاً بعضی از سطرها رو حذف کرده بودیم. اما اندیس دیتافریم df_med_by_year از مقادیر ستونی ساخته شده که گروه‌بندی رو بر اساسش انجام دادیم؛ یعنی همون سال‌های ستون release_year:

خروجی
Int64Index([1940, 1978, 1982, 1986, 1987, 1989, 1990, 1992, 1993, 1994, 1995,
            1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
            2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017],
           dtype='int64', name='release_year')

حواست به ستون user_rating_score هست که میانه امتیازهای هر سال رو نشون می‌ده؟ می‌تونیم این ستون رو از دیتافریم df_med_by_year جدا کنیم و اون رو به عنوان تابعی از سال رسم کنیم (که با اندیس دیتافریم در یه متغیر جدید به اسم df_rat_by_year ذخیره شده):

با نگاه کردن به نمودار، کاملاً معلومه که میانه امتیازات در طول زمان افزایش پیدا کرده. البته برای اینکه با اطمینان کامل بگیم این روند در کل داده‌ها وجود داره، باید سراغ روش‌های آماری پیشرفته‌تر بریم. با این حال، این مثال به‌خوبی نشون می‌ده که تحلیل اکتشافی داده‌ها می‌تونه یه نقطه شروع عالی برای بررسی‌های دقیق‌تر و پژوهش‌های بعدی باشه.

استفاده روزمره از groupby و فرایند تقسیم، اعمال و ترکیب

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

ایده تقسیم، اعمال و ترکیب نه‌تنها خیلی جالب و کاربردیه، بلکه تکنیکیه که دانشمندان داده به‌طور روزمره ازش استفاده می‌کنن (دقیقاً مثل همین مثالی که با هم بررسی کردیم).

پیشنهاد می‌کنیم حتماً بقیه آموزش‌های کاربردی فینکا درباره pandas رو هم ببینی؛ مثل:

اشتراک‌گذاری
فهرست مطالب
  • کاوش داده با Pandas
  • استفاده از groupby و فرایند تقسیم، اعمال و ترکیب برای رسیدن به جواب
  • استفاده روزمره از groupby و فرایند تقسیم، اعمال و ترکیب

دریافت اپلیکیشن فینکا

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