تجزیه و تحلیل دادهها جنبه مهمی از هر کسب و کار یا سازمان است. با کمک ابزارهای مختلف تجزیه و تحلیل دادهها، تحلیلگران میتوانند بینشها را استخراج کرده و از دادههای خام نتیجهگیری کنند. یکی از این ابزارها کتابخانه pandas در پایتون است که به طور گسترده برای تجزیه و تحلیل دادههای اکتشافی و تجزیه و تحلیل توصیفی استفاده میشود. در این مقاله، نحوه استفاده از متد ()pandas.cut برای ایجاد فاصله زمانی و عددی برای تجزیه و تحلیل داده ها را بررسی خواهیم کرد.
()pandas.cut چیست؟
pandas.cut متدی در کتابخانه pandas است که به شما امکان میدهد یک متغیر پیوسته را به فواصل تقسیم کنید. این روش یک متغیر دستهبندی جدید بر اساس binهایی که شما مشخص میکنید ایجاد میکند. binها را میتوان به عنوان لیستی از اعداد یا به صورت تعدادی فواصل مساوی با فاصله مشخص کرد.این روش معمولاً در تجزیه و تحلیل دادهها برای گروهبندی دادههای پیوسته به دستهها یا binsها استفاده میشود. این برای ایجاد دستههایی برای تبدیل دادهها، تجزیه و تحلیل سریهای زمانی و بهتر کردن تجسم دادهها مفید است.
مزایای استفاده از pandas.cut
- تبدیل دادههای پیوسته به دادههای گسسته: برخی از تحلیلها نیاز به دادههای گسسته دارند. این تابع دادههای پیوسته را به بازههای قابل تفسیر دستهبندی میکند.
- تحلیل توزیع دادهها: با دستهبندی مقادیر در بازهها، میتوانید توزیع دادهها در بازههای مختلف را بررسی کنید.
- مصورسازی بهتر: در نمودارهایی مانند هیستوگرام یا نمودارهای ستونی، دستهبندی دادهها باعث میشود که توزیع دادهها بهتر نمایش داده شود.
- سادهسازی تحلیلهای آماری:دستهبندی دادهها میتواند به تحلیلهای آماری سادهتر کمک کند. به عنوان مثال، میتوانید بررسی کنید چه تعداد داده در هر بازه قرار میگیرد.
کاربردهای اصلی
- تحلیل دادههای مالی: بررسی توزیع درآمدها، مخارج، یا قیمتها در بازههای مختلف
- تحلیل دادههای دموگرافیک: دستهبندی دادههای سنی، درآمد، یا تحصیلات افراد
- تحلیل دادههای علمی: دستهبندی دادههای آزمایشگاهی، مانند دما، فشار، یا زمان.
- پیشپردازش دادهها: در مسائل یادگیری ماشین، میتوانید دادههای پیوسته را به دستههای گسسته تبدیل کنید تا مدلهای خاصی بهتر عمل کنند.
چرا دستهبندی دادهها مهم است؟
در بسیاری از تحلیلها، مشاهده کل مقادیر دادههای پیوسته میتواند پیچیده باشد. فرض کنید که دادههایی در بازه ۱ تا ۱۰۰ دارید. مشاهده تکتک مقادیر ممکن است چندان مفید نباشد، اما اگر این مقادیر را به بازههای مثلاً ۱-۲۰، ۲۱-۴۰، ۴۱-۶۰، و … دستهبندی کنید، به راحتی میتوانید الگوها و توزیع دادهها را شناسایی کنید.
نحوه استفاده متد ()cut در pandas به صورت زیر است:
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3,
(include_lowest=False, duplicates='raise', ordered=True)
پارامترها :
x: مانند آرایه
دادههایی که میخواهید دستهبندی کنید. باید ۱ بعدی باشد. آرایه مانند (array-like
)، مثل لیست، سری پانداس، یا آرایه NumPy
bins: عدد صحیح(int)، تعداد یا مرزهای بازهها )دنبالهای از اسکالرها یا IntervalIndex
معیارهایی که باید انتخاب شود:
- int: اگر عدد صحیح باشد، به عنوان تعداد بازهها عمل میکند.(عداد binها با عرض مساوی را در محدوده x تعریف میکند. دامنه x به میزان ۱.۱% در هر طرف افزایش مییابد تا حداقل و حداکثر مقادیر x را در بر گیرد.)
- دنبالهای از اسکالرها(sequence of scalars): اگر آرایهای باشد، مستقیماً مرزهای بازهها را مشخص میکند. (لبههای binها را تعریف میکند که عرض غیریکنواخت را مجاز میکند. دامنه x گسترش پیدا نمیکند.)
- IntervalIndex: هbinها دقیق مورد استفاده را تعریف میکند. توجه داشته باشید که IntervalIndex برای binها باید غیر همپوشانی باشد.
right: مقدار دودویی، پیش فرض درست
تعیین میکند که آیا مرز راست بازهها بسته باشد یا نه. اگر right = true (پیش فرض) سپس binها [۴, 3, 2, 1] نشان میدهد [3,4), [2,3), [1,2) . وقتی bins یک IntervalIndex باشد، این آرگومان نادیده گرفته میشود.
True
: بازهها به صورت[a, b)
هستند.False
: بازهها به صورت(a, b]
هستند.
labels: آرایه یا False، پیش فرض none
برچسبهای اختصاص داده شده به هر بازه.
- اگر
None
باشد، بازهها به صورت خودکار(interval)
برگردانده میشوند. - اگر یک آرایه باشد، از برچسبهای دلخواه برای هر بازه استفاده میکند.
retbins: مقدار دودویی، به صورت پیش فرض false
اگر True
باشد، علاوه بر دادههای دستهبندیشده، مرزهای بازهها نیز بازگردانده میشوند.
precision: عدد صحیح(int)، به صورت پیش فرض ۳ در نظر میگیرد.
تعداد اعشار برای نمایش مرزهای بازهها. (دقت در نگهداری و نمایش labelهای binها)
include_lowest: دودویی، به صورت پیشفرض flase
اگر True
باشد، مقدار کمینه دادهها در اولین بازه قرار میگیرد، حتی اگر بازهها سمت چپ باز باشند
duplicates: اختیاری، {default ‘raise’, ‘drop’}
نحوه برخورد با مرزهای تکراری
'raise'
: اگر مرزهای تکراری وجود داشته باشد، خطا ایجاد میشود.'drop'
: مرزهای تکراری حذف میشوند.
ordered: دودویی، به صورت پیش فرض true میباشد.
مشخص میکند که آیا بازهها به عنوان مقادیر مرتب در نظر گرفته شوند. (چه labelها مرتب شده باشند یا نه. برای انواع برگشتی Categorical و Series (با دسته بندی dtype) اعمال میشود. اگر True باشد، دستهبندی بهدست آمده مرتب میشود. اگر False باشد، دستهبندی به دست آمده بدون ترتیب خواهد بود (labelها باید ارائه شوند).)
چیزی که این تابع برمیگرداند:
out (۱: دستهبندی(Categorical)، سری(Series)، ndarray
این خروجی نشاندهنده دسته یا بازهای است که هر مقدار در آن قرار گرفته است. نوع این خروجی به مقدار پارامتر labels
بستگی دارد:
یک شی آرایه مانند که نشان دهنده bin مربوطه برای هر مقدار x است. نوعش بستگی به مقداربرچسبها دارد
None (پیشفرض): نوع دادههای ذخیره شده در این خروجی، Interval
است که بازههای دستهبندی را نشان میدهد
- اگر ورودی
x
از نوعSeries
باشد، خروجی یکSeries
است - اگر ورودی
x
از نوعهای دیگر باشد (مثل آرایه NumPy یا لیست)، خروجی یکCategorical
خواهد بود
دنبالهای از اسکالرها(labels)(به صورت یک لیست یا دنباله):
- خروجی مشابه حالت قبل است، اما مقادیر درون خروجی، از نوع دادههای موجود در
labels
هستند - این برچسبها به بازهها اختصاص داده میشوند
labels=False
- خروجی یک آرایه (
ndarray
) از اعداد صحیح است. - این اعداد، اندیس بازهای را نشان میدهند که هر مقدار داده در آن قرار گرفته است
- به عنوان مثال، اگر مقدار ۰ به بازه اول و مقدار ۱ به بازه دوم تعلق داشته باشد، آرایهای از مقادیر ۰، ۱ و … برگردانده میشود.
۲) bins
: این خروجی فقط در صورتی بازگردانده میشود که retbins=True
تنظیم شده باشد
مرزهای بازهها را نشان میدهد. نوع این خروجی به شکل زیر خواهد بود:
numpy.ndarray
- اگر
bins
به عنوان یک عدد صحیح (تعداد بازهها) یا یک لیست از مقادیر مرزی تعریف شده باشد - این آرایه شامل مقادیر مرزی محاسبه شده یا مشخصشده برای بازهها خواهد بود
IntervalIndex
- اگر
bins
از نوعIntervalIndex
باشد - این خروجی برابر با همان
IntervalIndex
ورودی خواهد بود
نکته در مورد duplicates='drop'
: اگر duplicates='drop'
تنظیم شود، بازههای تکراری حذف میشوند و مقدار bins
شامل مرزهای غیرتکراری خواهد بود.
محدودیتها و چالشها
- انتخاب مناسب تعداد و مرز بازهها: انتخاب تعداد بازهها (
bins
) یا مرزهای دقیق آنها میتواند تاثیر زیادی بر نتایج تحلیل داشته باشد. بازههای زیاد ممکن است منجر به پراکندگی بیش از حد دادهها شود و بازههای کم ممکن است اطلاعات ارزشمندی را از دست بدهد.
- بازههای تکراری: در صورت استفاده نادرست از مقادیر مرزی، ممکن است بازههای تکراری ایجاد شود که باید با پارامتر
duplicates='drop'
مدیریت شوند.
- از دست دادن دقت: تبدیل دادههای پیوسته به گسسته باعث از دست رفتن برخی از جزئیات اطلاعات میشود.
روشهای مرتبط
pandas.qcut
: مشابهcut
، اما به جای بازههای مساوی یا از پیش تعریفشده، دادهها را بر اساس تعداد مقادیر در هر بازه تقسیم میکند (بازههایی با تعداد دادههای برابر).numpy.histogram
: روشی مشابه برای دستهبندی دادهها که بیشتر در تحلیلهای عددی و نمودارهای هیستوگرام استفاده میشود.
مثالها:
مثال ۱: دسته بندی دادهها با استفاده از ()cut
import pandas as pd
# create a list of exam scores
scores = [88, 92, 75, 85, 78, 95, 64, 82, 90, 73, 67, 99]
# define the bins - grading ranges
bins = [0, 60, 70, 80, 90, 100]
# use cut() to categorize each score into the defined grading bins
grade_categories = pd.cut(scores, bins)
print(grade_categories)
خروجی:
[(80, 90], (90, 100], (70, 80], (80, 90], (70, 80], ..., (80, 90], (80, 90], (70, 80], (60, 70], (90, 100]]
Length: 12
Categories (5, interval[int64, right]): [(0, 60] < (60, 70] < (70, 80] < (80, 90] < (90, 100]]
در مثال بالا لیستی با نام scores حاوی نمرات امتحانی ایجاد کردهایم. binها برای نشان دادن محدودههای درجهبندی مختلف تعریف شدهاند: ۰-۶۰، ۶۱-۷۰، ۷۱-۸۰، ۸۱-۹۰، ۹۱-۱۰۰.
سپس از ()pd.cut برای دستهبندی هر مقدار در bin درجهبندی مربوطه استفاده کردیم.
مثال ۲: کنترل مرزهای Bin با استفاده از آرگومان right در ()cut
import pandas as pd
# create a list of data
data = [2, 4, 6, 8, 10]
# define the bins
bins = [0, 5, 10]
# use cut() with right=True (default)
categories_right_true = pd.cut(data, bins, right=True)
print("Bins closed on the right:")
print(categories_right_true)
print()
# use cut with right=False
categories_right_false = pd.cut(data, bins, right=False)
print("\nBins closed on the left:")
print(categories_right_false)
خروجی:
Bins closed on the right:
[(0, 5], (0, 5], (5, 10], (5, 10], (5, 10]]
Categories (2, interval[int64, right]): [(0, 5] < (5, 10]]
Bins closed on the left:
[[0.0, 5.0), [0.0, 5.0), [5.0, 10.0), [5.0, 10.0), NaN]
Categories (2, interval[int64, left]): [[0, 5) < [5, 10)]
اینجا، با:
- right=True، بینها
(۰, ۵]
و(۵, ۱۰]
هستند. نشان میدهد که لبه سمت راست (۵ و ۱۰) در bin گنجانده شده است. - right=False، بینها
[۰, ۵)
و[۵, ۱۰)
هستند. به این معنی که لبه سمت چپ (۰ و ۵) در bin گنجانده شده است.
مثال ۳: نامگذاری Bins در ()Pandas cut
import pandas as pd
# create a list of data
data = [20, 35, 45, 60, 75, 90]
# define the bins
bins = [0, 25, 50, 75, 100]
# define custom labels for the bins
labels = ['Low', 'Medium', 'High', 'Very High']
# use cut() with custom labels
categories_with_labels = pd.cut(data, bins, labels=labels)
print(categories_with_labels)
خروجی:
['Low', 'Medium', 'Medium', 'High', 'High', 'Very High']
Categories (4, object): ['Low' < 'Medium' < 'High' < 'Very High']
در این مثال، من لیستی از برچسبهای سفارشی را تعریف کردم: Low، Medium، High و Very High که مربوط به هر bin است.
سپس از ()pd.cut برای دستهبندی دادهها به binها و اختصاص برچسبهای سفارشی به این binها استفاده کردم.
مثال ۴: استخراج اطلاعات Bin با استفاده از آرگومان retbins در ()cut
import pandas as pd
# create a list of data
data = [10, 15, 20, 25, 30, 35, 40]
# define the bins
bins = [0, 20, 40]
# use cut() with retbins=True
categories, bin_edges = pd.cut(data, bins, retbins=True)
print("Binned Categories:")
print(categories)
print("\nBin Edges:")
print(bin_edges)
خروجی:
Binned Categories:
[(0, 20], (0, 20], (0, 20], (20, 40], (20, 40], (20, 40], (20, 40]]
Categories (2, interval[int64, right]): [(0, 20] < (20, 40]]
Bin Edges:
[ 0 20 40]
در مثال بالا، من از ()pd.cut با retbins=True استفاده کردم، بنابراین دو چیز را برمیگرداند: دستههای binned و آرایه لبههای bin.
متغیر دستهها(categories) حاوی دادههای binned است (هر عنصر از دادهها در بینها طبقهبندی میشوند).
و متغیر bin_edges حاوی لبههای واقعی binهای استفاده شده در فرآیند است.
مثال ۵: مشخص کردن دقت برچسبهای binها
import pandas as pd
# create a list of floating-point data
data = [10.123, 15.456, 20.789, 25.012, 30.345, 35.678, 40.901]
# define the bins
bins = [0, 20, 40, 60]
# use cut() with precision=2
categories = pd.cut(data, bins, precision=2)
print("Binned Categories with Two Decimal Precision:")
print(categories)
خروجی:
Binned Categories with Two Decimal Precision:
[(0, 20], (0, 20], (20, 40], (20, 40], (20, 40], (20, 40], (40, 60]]
Categories (3, interval[int64, right]): [(0, 20] < (20, 40] < (40, 60]]
در اینجا از ()pd.cut با precision=2 استفاده کردیم. این بدان معنی است که برچسبهای(labels) binها به گونهای فرمت میشوند که دارای دو رقم اعشار باشند.
مثال ۶: استفاده از آرگومان include_lowest در ()cut
import pandas as pd
# create a list of data
data = [20, 22, 24, 26, 28, 30]
# define the bins
bins = [20, 25, 30]
# use cut() with include_lowest=False (default)
categories_default = pd.cut(data, bins)
print("First bin exclusive of the lower edge:")
print(categories_default)
print()
# use cut() with include_lowest=True
categories_include_lowest = pd.cut(data, bins, include_lowest=True)
print("\nFirst bin inclusive of the lower edge:")
print(categories_include_lowest)
خروجی:
First bin exclusive of the lower edge:
[NaN, (20.0, 25.0], (20.0, 25.0], (25.0, 30.0], (25.0, 30.0], (25.0, 30.0]]
Categories (2, interval[int64, right]): [(20, 25] < (25, 30]]
First bin inclusive of the lower edge:
[(19.999, 25.0], (19.999, 25.0], (19.999, 25.0], (25.0, 30.0], (25.0, 30.0], (25.0, 30.0]]
Categories (2, interval[float64, right]): [(19.999, 25.0] < (25.0, 30.0]]
در این مثال، با:
- آپشن include_lowest=False، بین(bin) اول (۲۰, ۲۵] لبه پایینی ۲۰ را شامل نمیشود. بنابراین، مقدار ۲۰ در دادهها در هیچ سطری گنجانده نمیشود و در نتیجه NaN ایجاد میشود.
- آپشن include_lowest=True، بین(bin) اول (۲۰, ۲۵] لبه پایینی ۲۰ را شامل میشود. بنابراین، مقدار ۲۰ در دادهها در هیچ سطری گنجانده شده است و مقادیر NaN وجود ندارد.