تمام آنچه باید در مورد توابع Cut و Qcut پانداس بدانید

شکل ۱. تفاوت توابع Cut و Qcut
شکل ۱. تفاوت توابع Cut و Qcut
منتشر‌شده در towardsdatascience به تاریخ ۱۷ ژوئن ۲۰۲۱
لینک منبع All You Need to Know About Pandas Cut and Qcut Functions

در اصل Pandas مسلما محبوب‌ترین ابزار تجزیه و تحلیل داده و دستکاری در اکوسیستم علم داده است. با تشکر از توابع و روش‌های متعدد، ما می‌توانیم آزادانه با داده‌ها بازی کنیم.

توابعcut وqcut در بسیاری از موارد بسیار مفید هستند. تفاوت بین آن‌ها در ابتدا برای من روشن نبود. من توانستم بعد از چندین مثال آن را کشف کنم.

در این مقاله، ما نیز همین کار را خواهیم کرد. مثال‌های این مقاله نحوه استفاده از توابع cut و qcut را نشان می‌دهند و همچنین بر تفاوت بین آن‌ها تاکید می‌کنند.

بیایید یک چارچوب داده نمونه ایجاد کنیم.

import numpy as np
import pandas as pddf = pd.DataFrame({
"col_a": np.random.randint(1, 50, size=50),
"col_b": np.random.randint(20, 100, size=50),
"col_c": np.random.random(size=50).round(2)
})df.head()

ستون‌های اول و دوم به ترتیب حاوی اعداد صحیح بین ۱-۵۰ و ۲۰-۱۰۰ هستند. ستون سوم شامل شناورهای بین 0 تا 1 است. ما از توابع عددی برای تولید تصادفی این مقادیر استفاده کرده‌ایم.

تابعcut کل محدوده ارزش را به چند قسمت تقسیم می‌کند. محدوده پوشش داده‌شده توسط هر سطل یک‌سان خواهد بود.

در ستون اول (col _ a) ، ما به طور تصادفی اعداد صحیح را بین ۱ و ۵۰ قرار می‌دهیم.

df.col_a.max(), df.col_a.min()(49, 3)

اگر می‌خواهید این ستون را به ۵ سطل با محدوده مساوی تقسیم کنید، اندازه هر سطل ۹.۲ خواهد بود که می‌تواند به صورت زیر محاسبه شود:

(49 - 3) / 5 = 9.2

تابعcut این عملیات را انجام می‌دهد و سپس هر مقدار را در سطل مناسب اختصاص می‌دهد.

df["col_a_binned"] = pd.cut(df.col_a, bins=5)
df.col_a_binned.value_counts()(21.4, 30.6] 16
(39.8, 49.0] 14
(12.2, 21.4] 8
(30.6, 39.8] 6
(2.954, 12.2] 6

همانطور که می‌بینیم، اندازه هر سطل دقیقا ۹.۲ انتظار برای کوچک‌ترین سطل است. مرزهای پایینی جامع نیستند. بنابراین، حد پایین کوچک‌ترین بن مقداری کم‌تر از کوچک‌ترین مقدار (۳) است که می‌تواند آن را شامل شود.

می‌توانیم سطل‌ها را با تعریف دستی لبه‌های سطل سفارشی کنیم. مقادیر لبه به عنوان یک لیست به پارامتر سطل‌ها منتقل می‌شوند.

pd.cut(df.col_a, bins=[0, 10, 40, 50]).value_counts()(10, 40] 33
(40, 50] 13
(0, 10] 4

لبه‌های راست به طور پیش‌فرض شامل می‌شوند اما می‌توانند تغییر کنند.

pd.cut(df.col_a, bins=[0, 10, 40, 50], right=False).value_counts()[10, 40) 33
[40, 50) 13
[0, 10) 4

با تابع cut، ما هیچ کنترلی بر تعداد مقادیر درون هر سطل نداریم. ما تنها می‌توانیم لبه‌های سطل را مشخص کنیم.

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

بیایید با یک مثال شروع کنیم.

pd.qcut(df.col_a, q=4).value_counts()(40.75, 49.0] 13
(19.5, 25.0] 13
(2.999, 19.5] 13
(25.0, 40.75] 11

ما ۴ باکت داریم و هر کدام تقریبا شامل تعداد یکسانی از مقادیر هستند. در مورد ۴، باکت‌ها نیز چارک‌ها نامیده می‌شوند. یک چهارم از تعداد کل مقادیر در چارک اول هستند، یک نیمه در دو باکت اول هستند، و به همین ترتیب.

با تابع qcut، ما هیچ پوششی روی لبه سطل‌ها نداریم. آن‌ها به طور خودکار محاسبه می‌شوند. در نظر بگیرید که ۴۰ ارزش وجود دارد (یعنی ردیف) در یک ستون و می‌خواهیم ۴ باکت داشته باشیم. با شروع از کوچک‌ترین مقدار، محدوده بالایی اولین باکت به گونه‌ای تعیین خواهد شد که اولین باکت شامل ۱۰ مقدار باشد.

  • تابع cut: تمرکز بر اساس اندازه سطل ها از نظر دامنه مقدار (یعنی تفاوت بین لبه های سطل بالا و پایین)
  • تابع Qcut: تمرکز بر روی اندازه سطل ها از نظر تعداد مقادیر هر سطل است.

تابعqcut امکان شخصی سازی اندازه باکت‌ها را فراهم می‌کند. بیایید ۳ باکت ایجاد کنیم. اولی شامل کوچک‌ترین ۵۰ درصد از مقادیر (یعنی نیمه پایینی). سپس نیمه بالایی را به دو ظرف تقسیم می‌کنیم.

pd.qcut(df.col_a, q=[0, .50, .75, 1]).value_counts()(2.999, 25.0] 26
(40.75, 49.0] 13
(25.0, 40.75] 11

هم توابع cut و هم توابع qcut اجازه برچسب زدن سطل‌ها یا باکت‌ها را می‌دهند. ما از پارامتر برچسب‌ها به شرح زیر استفاده می‌کنیم.

df["new"] = pd.qcut(df.col_a, q=[0, .33, .66, 1], labels=["small", "medium", "high"])df["new"].value_counts()high 17
small 17
medium 16

مانند تبدیل یک متغیر پیوسته به یک طبقه‌بندی است. بیایید میانگین مقادیر هر دسته را بررسی کنیم تا مطمئن شویم که تابع qcut به درستی کار کرده‌است.

df.groupby("new").agg(avg=("col_a","mean")) avg
new
small 14.000000
medium 26.687500
high 43.705882

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

نتیجه‌گیری

هر دو تابع cut و qcut می‌توانند برای تبدیل مجموعه‌ای از مقادیر پیوسته به یک متغیر گسسته یا قطعی مورد استفاده قرار گیرند.

تابعcut بر روی محدوده ارزش سطل‌ها تمرکز می‌کند. این روش کل محدوده را براساس تفاوت بین کوچک‌ترین و بزرگ‌ترین مقادیر تعیین می‌کند. سپس کل محدوده را براساس تعداد مطلوب سطل‌ها به سطل‌ها تقسیم می‌کند. به طور پیش‌فرض، اندازه هر سطل یک‌سان است (تقریبا) و تفاوت بین لبه پایین و بالای بن است.

تابعqcut بر تعداد مقادیر در هر سطل تمرکز می‌کند. این مقادیر از کوچک‌ترین تا بزرگ‌ترین مرتب شده‌اند. اگر ۵ باکت بخواهیم، ۲۰ درصد اول مقادیر در باکت اول، ۲۰ درصد دوم در باکت دوم و غیره قرار می‌گیرند.

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

متشکرم که مطالعه کردید.

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