توضیحات
در دوره آموزش تحلیل آماری با پایتون همراه من باشید تا به صورت کامل روش های تحلیل داده ها را در python بیاموزید. من در دوره آموزش تحلیل آماری با python سعی کرده ام جامع ترین آموزش تجزیه و تحلیل آماری با پایتون در ایران را آموزش بدهم.
چگونه تحلیل داده با پایتون را یاد بگیریم؟
در عصر داده های بزرگ و هوش مصنوعی، علم داده و یادگیری ماشین در بسیاری از زمینه های علم و فناوری ضروری شده است. یکی از جنبه های ضروری کار با داده ها، توانایی توصیف، خلاصه کردن و نمایش داده ها به صورت بصری است. کتابخانه های آمار پایتون ابزارهای جامع، محبوب و پرکاربردی هستند که به شما در کار با داده ها کمک می کنند.
آمار توصیفی با پایتون
آمار توصیفی در مورد توصیف و خلاصه کردن داده ها است. از دو رویکرد اصلی استفاده می کند:
- رویکرد کمی داده ها را به صورت عددی توصیف و خلاصه می کند.
- رویکرد بصری داده ها را با نمودارها، نمودارها، هیستوگرام ها و سایر نمودارها نشان می دهد.
شما می توانید آمار توصیفی را برای یک یا چند مجموعه داده یا متغیر اعمال کنید. وقتی یک متغیر را توصیف و خلاصه می کنید، در حال انجام تحلیل تک متغیره هستید. وقتی روابط آماری را بین یک جفت متغیر جستجو می کنید، در حال انجام یک تحلیل دو متغیره هستید. به طور مشابه، یک تحلیل چند متغیره با چندین متغیر در یک زمان مرتبط است. در این آموزش، با انواع اقدامات زیر در آمار توصیفی آشنا خواهید شد:
- گرایش مرکزی به شما در مورد مراکز داده می گوید. معیارهای مفید شامل میانگین، میانه و حالت است.
- تنوع به شما در مورد گسترش داده ها می گوید. اقدامات مفید شامل واریانس و انحراف معیار است.
- همبستگی یا تنوع مشترک به شما در مورد رابطه بین یک جفت متغیر در یک مجموعه داده می گوید. معیارهای مفید شامل کوواریانس و ضریب همبستگی است.
جامعه و نمونه در پایتون
در آمار، جمعیت مجموعهای از تمام عناصر یا مواردی است که شما به آنها علاقه دارید. جمعیتها اغلب بسیار زیاد هستند، که آنها را برای جمعآوری و تجزیه و تحلیل دادهها نامناسب میکند. به همین دلیل است که آماردانان معمولاً سعی می کنند با انتخاب و بررسی یک زیرمجموعه نماینده از آن جامعه، به نتیجه گیری در مورد یک جمعیت بپردازند. به این زیرمجموعه از جامعه، نمونه می گویند. در حالت ایده آل، نمونه باید ویژگی های آماری اساسی جامعه را تا حد رضایت بخشی حفظ کند. به این ترتیب، می توانید از نمونه برای جمع آوری نتایج در مورد جامعه استفاده کنید.
داده های پرت در پایتون
نقطه پرت یک نقطه داده است که به طور قابل توجهی با اکثر داده های گرفته شده از یک نمونه یا جامعه متفاوت است. دلایل احتمالی زیادی وجود دارد، اما در اینجا چند مورد برای شروع وجود دارد:
- تنوع طبیعی در داده ها
- تغییر در رفتار سیستم مشاهده شده
- خطا در جمع آوری داده ها
خطاهای جمع آوری دادهها به ویژه علت برجستهای است. به عنوان مثال، محدودیتهای ابزار یا روشهای اندازهگیری میتواند به این معنی باشد که دادههای صحیح به سادگی قابل دستیابی نیستند. سایر خطاها می تواند ناشی از محاسبات اشتباه، آلودگی داده ها، خطای انسانی و موارد دیگر باشد. تعریف ریاضی دقیقی از نقاط پرت وجود ندارد. شما باید بر تجربه، دانش در مورد موضوع مورد علاقه و عقل سلیم تکیه کنید تا تعیین کنید که آیا یک نقطه داده یک نقطه پرت است و چگونه آن را مدیریت کنید.
کتابخانه های آماری پایتون
کتابخانههای آمار پایتون زیادی وجود دارد که میتوانید با آنها کار کنید، اما در این آموزش، با برخی از محبوبترین و پرکاربردترین آنها آشنا میشوید: بخش آماری پایتون یک کتابخانه داخلی پایتون برای آمار توصیفی است. اگر مجموعه دادههای شما خیلی بزرگ نیستند یا نمیتوانید به واردات کتابخانههای دیگر تکیه کنید، میتوانید از آن استفاده کنید.
- NumPy یک کتابخانه شخص ثالث برای محاسبات عددی است که برای کار با آرایه های تک بعدی و چند بعدی بهینه شده است. نوع اولیه آن نوع آرایه ای به نام ndarray است. این کتابخانه شامل روال های زیادی برای تجزیه و تحلیل آماری است.
- SciPy یک کتابخانه شخص ثالث برای محاسبات علمی مبتنی بر NumPy است. عملکردهای بیشتری را در مقایسه با NumPy از جمله scipy.stats برای تجزیه و تحلیل آماری ارائه می دهد.
- pandas یک کتابخانه شخص ثالث برای محاسبات عددی بر اساس NumPy است. در مدیریت داده های برچسب گذاری شده یک بعدی (1D) با اشیاء سری و داده های دو بعدی (2D) با اشیاء DataFrame برتری دارد.
- Matplotlib یک کتابخانه شخص ثالث برای تجسم داده ها است. در ترکیب با NumPy، SciPy و پانداها به خوبی کار می کند.
توجه داشته باشید که در بسیاری از موارد، اشیاء سری و DataFrame را می توان به جای آرایه های NumPy استفاده کرد. اغلب، ممکن است آنها را به یک تابع آماری NumPy یا SciPy منتقل کنید. علاوه بر این، میتوانید با فراخوانی .values یا .to_numpy، دادههای بدون برچسب را از یک سری یا DataFrame به عنوان یک شی np.ndarray دریافت کنید.
شروع کار با کتابخانه های آمار پایتون
کتابخانه آماری داخلی پایتون دارای تعداد نسبتا کمی از مهمترین توابع آمار است. اسناد رسمی منبع ارزشمندی برای یافتن جزئیات است. اگر محدود به پایتون خالص هستید، کتابخانه آمار پایتون ممکن است انتخاب مناسبی باشد.
محاسبه آمار توصیفی
با وارد کردن همه بستههایی که نیاز دارید شروع کنید:
>>> import math >>> import statistics >>> import numpy as np >>> import scipy.stats >>> import pandas as pd |
این ها همه بسته هایی هستند که برای محاسبات آمار پایتون به آن نیاز دارید. معمولاً از بسته ریاضی داخلی پایتون استفاده نمیکنید، اما در این آموزش مفید خواهد بود. بعداً، matplotlib.pyplot را برای تجسم دادهها وارد خواهید کرد. بیایید چند داده برای کار با آنها ایجاد کنیم. شما با لیست های پایتون شروع می کنید که حاوی برخی داده های عددی دلخواه هستند:
>>> x = [8.0, 1, 2.5, 4, 28.0] >>> x_with_nan = [8.0, 1, 2.5, math.nan, 4, 28.0] >>> x [8.0, 1, 2.5, 4, 28.0] >>> x_with_nan [8.0, 1, 2.5, nan, 4, 28.0] |
اکنون لیست های x و x_with_nan را دارید. آن ها تقریباً یکسان هستند، با این تفاوت که x_with_nan حاوی مقدار nan است. درک رفتار روالهای آمار پایتون زمانی که با یک مقدار غیر عددی (nan) مواجه میشوند، مهم است. در علم داده، مقادیر از دست رفته رایج هستند، و شما اغلب آنها را با nan جایگزین می کنید.
چگونه یک مقدار nan را در پایتون بدست می آوریم؟
در پایتون می توانید از یکی از موارد زیر استفاده کنید:
float(‘nan’) math.nan np.nan |
می توانید همه این توابع را به جای هم استفاده کنید:
>>> math.isnan(np.nan), np.isnan(math.nan) (True, True) >>> math.isnan(y_with_nan[3]), np.isnan(y_with_nan[3]) (True, True) |
می بینید که همه توابع معادل هستند. با این حال، لطفاً به خاطر داشته باشید که مقایسه دو مقدار nan برای برابری، False را برمیگرداند. به عبارت دیگر math.nan == math.nan False است. اکنون، اشیاء np.ndarray و pd.Series را ایجاد کنید که با x و x_with_nan مطابقت دارند:
>>> y, y_with_nan = np.array(x), np.array(x_with_nan) >>> z, z_with_nan = pd.Series(x), pd.Series(x_with_nan) >>> y array([ 8. , 1. , 2.5, 4. , 28. ]) >>> y_with_nan array([ 8. , 1. , 2.5, nan, 4. , 28. ]) >>> z 0 8.0 1 1.0 2 2.5 3 4.0 4 28.0 dtype: float64 >>> z_with_nan 0 8.0 1 1.0 2 2.5 3 NaN 4 4.0 5 28.0 dtype: float64 |
اکنون دو آرایه NumPy (y و y_with_nan) و دو سری پاندا (z و z_with_nan) دارید. همه اینها توالی یک بعدی از مقادیر هستند. اگرچه در سراسر این آموزش از لیست ها استفاده می کنید، لطفاً به خاطر داشته باشید که در بیشتر موارد، می توانید از تاپل ها به همین روش استفاده کنید. شما می توانید به صورت اختیاری یک برچسب برای هر مقدار در z و z_with_nan مشخص کنید.
محاسبه آمار گرایش مرکزی در پایتون
معیارهای گرایش مرکزی مقادیر مرکزی یا میانی مجموعه داده ها را نشان می دهد. تعاریف متعددی از آنچه به عنوان مرکز مجموعه داده در نظر گرفته می شود وجود دارد. در این آموزش، نحوه شناسایی و محاسبه این معیارهای گرایش مرکزی را خواهید آموخت:
- منظور داشتن
- میانگین وزنی
- میانگین هندسی
- میانگین هارمونیک
- میانه
- مد
میانگین در پایتون
میانگین نمونه که میانگین حسابی نمونه یا به طور ساده میانگین نامیده می شود، میانگین حسابی همه آیتم های یک مجموعه داده است. میانگین یک مجموعه داده 𝑥 از نظر ریاضی به صورت Σᵢ𝑥ᵢ/𝑛 بیان می شود، که در آن 𝑖 = 1، 2، …، 𝑛. به عبارت دیگر، مجموع تمام عناصر 𝑥ᵢ تقسیم بر تعداد آیتم های مجموعه داده 𝑥 است. این شکل میانگین یک نمونه با پنج نقطه داده را نشان می دهد:
نقاط سبز نشان دهنده نقاط داده 1، 2.5، 4، 8، و 28 است. خط چین قرمز میانگین آنها یا (1 + 2.5 + 4 + 8 + 28) / 5 = 8.7 است. شما می توانید میانگین را با پایتون خالص با استفاده از sum() و len()، بدون وارد کردن کتابخانه ها محاسبه کنید:
>>> mean_ = sum(x) / len(x) >>> mean_ 8.7 |
اگرچه این تمیز و ظریف است، اما می توانید توابع آمار داخلی پایتون را نیز اعمال کنید:
>>> mean_ = statistics.mean(x) >>> mean_ 8.7 >>> mean_ = statistics.fmean(x) >>> mean_ 8.7 |
شما توابع mean() و fmean() را از کتابخانه آماری داخلی پایتون فراخوانی کرده اید و همان نتیجه ای را که با پایتون خالص گرفته اید دریافت کرده اید. fmean() در پایتون 3.8 به عنوان یک جایگزین سریعتر برای mean() معرفی شده است. همیشه یک عدد ممیز شناور برمی گرداند. با این حال، اگر مقادیر nan بین دادههای شما وجود داشته باشد، statistics.mean() و statistics.fmean() nan را به عنوان خروجی برمیگردانند:
>>> mean_ = statistics.mean(x_with_nan) >>> mean_ nan >>> mean_ = statistics.fmean(x_with_nan) >>> mean_ nan |
این نتیجه با رفتار sum() سازگار است، زیرا sum(x_with_nan) نیز nan را برمی گرداند. اگر از NumPy استفاده می کنید، می توانید میانگین را با np.mean():
>>> mean_ = np.mean(y) >>> mean_ 8.7 |
در مثال بالا، mean() یک تابع است، اما می توانید از متد مربوطه .mean() نیز استفاده کنید:
>>> mean_ = y.mean() >>> mean_ 8.7 |
تابع mean() و متد .mean() از NumPy همان نتیجه را با statistics.mean() برمی گرداند. زمانی که مقادیر nan در میان دادههای شما وجود داشته باشد نیز چنین است:
>>> np.mean(y_with_nan) nan >>> y_with_nan.mean() nan |
در نتیجه، اغلب نیازی به دریافت مقدار nan ندارید. اگر ترجیح می دهید مقادیر nan را نادیده بگیرید، می توانید از np.nanmean():
>>> np.nanmean(y_with_nan) 8.7 |
nanmean() به سادگی تمام مقادیر nan را نادیده می گیرد. اگر بخواهید آن را بدون مقادیر nan به مجموعه داده اعمال کنید، همان مقدار mean() را برمی گرداند. اشیاء PD.Series همچنین دارای متد mean():
>>> mean_ = z.mean() >>> mean_ 8.7 |
همان طور که می بینید، به طور مشابه در مورد NumPy استفاده می شود. با این حال، .mean() از pandas مقادیر nan را به طور پیش فرض نادیده می گیرد:
>>> z_with_nan.mean() 8.7 |
این رفتار نتیجه مقدار پیش فرض پارامتر اختیاری skipna است. برای تغییر رفتار می توانید این پارامتر را تغییر دهید.
میانگین وزنی در پایتون
میانگین وزنی که میانگین وزنی یا میانگین وزنی نیز نامیده می شود، تعمیم میانگین حسابی است که به شما امکان می دهد سهم نسبی هر نقطه داده را در نتیجه تعریف کنید. شما یک وزن 𝑤ᵢ برای هر نقطه داده 𝑥ᵢ از مجموعه داده 𝑥 تعریف می کنید، که در آن 𝑖 = 1، 2، …، 𝑛 و 𝑛 تعداد آیتم های موجود در 𝑥 است. سپس، هر نقطه داده را با وزن مربوطه ضرب میکنید، همه حاصل را جمع میکنید و مجموع حاصل را با مجموع وزنها تقسیم میکنید: Σᵢ(𝑤ᵢ𝑥ᵢ) / Σᵢ𝑤ᵢ.
نکته: راحت است (و معمولاً همینطور است) که همه وزنها غیرمنفی باشند، 𝑤ᵢ ≥ 0، و مجموع آنها برابر با یک یا Σᵢ𝑤ᵢ = 1 باشد. میانگین وزنی زمانی بسیار مفید است که شما به میانگین یک مجموعه داده حاوی مواردی که با فرکانس های نسبی داده شده رخ می دهند نیاز دارید. به عنوان مثال، بگویید که مجموعه ای دارید که در آن 20٪ از همه آیتم ها برابر با 2 است، 50٪ از آیتم ها برابر با 4 و 30٪ بقیه موارد برابر با 8 هستند. می توانید میانگین را محاسبه کنید. چنین مجموعه ای مانند این:
>>> 0.2 * 2 + 0.5 * 4 + 0.3 * 8 4.8 |
در این جا، شما فرکانس ها را با وزن ها در نظر می گیرید. با این روش، نیازی به دانستن تعداد کل موارد ندارید. می توانید میانگین وزنی را در پایتون خالص با ترکیب sum() با range() یا zip():
>>> x = [8.0, 1, 2.5, 4, 28.0] >>> w = [0.1, 0.2, 0.3, 0.25, 0.15] >>> wmean = sum(w[i] * x[i] for i in range(len(x))) / sum(w) >>> wmean 6.95 >>> wmean = sum(x_ * w_ for (x_, w_) in zip(x, w)) / sum(w) >>> wmean 6.95 |
باز هم، این یک پیاده سازی تمیز و ظریف است که در آن نیازی به وارد کردن هیچ کتابخانه ای نیست. با این حال، اگر مجموعه داده های بزرگی دارید، NumPy احتمالاً راه حل بهتری ارائه می دهد. می توانید از np.average() برای بدست آوردن میانگین وزنی آرایه های NumPy یا سری pandas استفاده کنید:
>>> y, z, w = np.array(x), pd.Series(x), np.array(w) >>> wmean = np.average(y, weights=w) >>> wmean 6.95 >>> wmean = np.average(z, weights=w) >>> wmean 6.95 |
نتیجه همان است که در مورد پیاده سازی پایتون خالص وجود دارد. همچنین می توانید از این روش در لیست ها و تاپل های معمولی استفاده کنید. راه حل دیگر استفاده از حاصل ضرب عنصر w * y با np.sum() یا .sum():
>>> (w * y).sum() / w.sum() 6.95 |
شما میانگین وزنی را محاسبه کرده اید. با این حال، اگر مجموعه داده شما حاوی مقادیر nan است، مراقب باشید:
>>> w = np.array([0.1, 0.2, 0.3, 0.0, 0.2, 0.1]) >>> (w * y_with_nan).sum() / w.sum() nan >>> np.average(y_with_nan, weights=w) nan >>> np.average(z_with_nan, weights=w) nan |
در این حالت میانگین() nan را برمی گرداند که با np.mean() مطابقت دارد.
میانگین هارمونیک در پایتون
میانگین هارمونیک متقابل میانگین متقابل همه موارد در مجموعه داده است: 𝑛 / Σᵢ(1/𝑥ᵢ)، که در آن 𝑖 = 1، 2، …، 𝑛 و 𝑛 تعداد آیتم های مجموعه داده 𝑥 است. یکی از انواع پیاده سازی پایتون خالص از میانگین هارمونیک این است:
>>> hmean = len(x) / sum(1 / item for item in x) >>> hmean 2.7613412228796843 |
این مقدار با مقدار میانگین حسابی برای همان داده x که 8.7 محاسبه کردید کاملاً متفاوت است. شما همچنین می توانید این اندازه گیری را با statistics.harmonic_mean():
>>> hmean = statistics.harmonic_mean(x) >>> hmean 2.7613412228796843 |
مثال بالا یکی از اجرای statistics.harmonic_mean() را نشان می دهد. اگر مقدار nan در یک مجموعه داده داشته باشید، nan را برمی گرداند. اگر حداقل یک 0 وجود داشته باشد، 0 برمی گردد. اگر حداقل یک عدد منفی ارائه کنید، آمار را دریافت خواهید کرد.StatisticsError:
>>> statistics.harmonic_mean(x_with_nan) nan >>> statistics.harmonic_mean([1, 0, 2]) 0 >>> statistics.harmonic_mean([1, 2, -2]) # Raises StatisticsError |
وقتی از این روش استفاده می کنید، این سه سناریو را در نظر داشته باشید! راه سوم برای محاسبه میانگین هارمونیک استفاده از scipy.stats.hmean():
>>> scipy.stats.hmean(y) 2.7613412228796843 >>> scipy.stats.hmean(z) 2.7613412228796843 |
باز هم، این یک پیاده سازی بسیار ساده است. با این حال، اگر مجموعه داده شما حاوی nan، 0، یک عدد منفی یا هر چیزی جز اعداد مثبت باشد، یک ValueError دریافت خواهید کرد!
میانگین هندسی در پایتون
میانگین هندسی ریشه 𝑛-امین حاصلضرب همه عناصر 𝑥ᵢ در یک مجموعه داده است: ⁿ√(Πᵢ𝑥ᵢ)، که در آن 𝑖 = 1، 2، …، 𝑛. شکل زیر میانگین های حسابی، هارمونیک و هندسی یک مجموعه داده را نشان می دهد:
دوباره، نقاط سبز نشان دهنده نقاط داده 1، 2.5، 4، 8، و 28 است. خط چین قرمز میانگین است. خط چین آبی میانگین هارمونیک و خط چین زرد میانگین هندسی است. می توانید میانگین هندسی را در پایتون خالص به این صورت پیاده سازی کنید:
>>> gmean = 1 >>> for item in x: … gmean *= item … >>> gmean **= 1 / len(x) >>> gmean 4.677885674856041 |
همان طور که می بینید، مقدار میانگین هندسی، در این مورد، به طور قابل توجهی با مقادیر میانگین های حسابی (8.7) و هارمونیک (2.76) برای همان مجموعه داده x متفاوت است. Python 3.8 statistics.geometric_mean() را معرفی کرد که همه مقادیر را به اعداد ممیز شناور تبدیل می کند و میانگین هندسی آن ها را برمی گرداند:
>>> gmean = statistics.geometric_mean(x) >>> gmean 4.67788567485604 |
شما همان نتیجه را در مثال قبلی دریافت کرده اید، اما با حداقل خطای گرد کردن. اگر دادهها را با مقادیر nan ارسال کنید، statistics.geometric_mean() مانند اکثر توابع مشابه رفتار میکند و nan را برمیگرداند:
>>> gmean = statistics.geometric_mean(x) >>> gmean 4.67788567485604 |
در واقع، این با رفتار statistics.mean()، statistics.fmean() و statistics.harmonic_mean() مطابقت دارد. اگر یک عدد صفر یا منفی در بین دادههای شما وجود داشته باشد، statistics.geometric_mean() آمار را افزایش میدهد.StatisticsError. همچنین می توانید میانگین هندسی را با scipy.stats.gmean():
>>> scipy.stats.gmean(y) 4.67788567485604 >>> scipy.stats.gmean(z) 4.67788567485604 |
شما همان نتیجه ای را به دست آوردید که با پیاده سازی خالص پایتون. اگر مقادیر nan را در یک مجموعه داده دارید، gmean() nan را برمی گرداند. اگر حداقل یک 0 وجود داشته باشد، 0.0 را برمی گرداند و اخطاری می دهد. اگر حداقل یک عدد منفی ارائه کنید، nan و اخطار را دریافت خواهید کرد.
میانه در پایتون
میانه نمونه عنصر میانی یک مجموعه داده مرتب شده است. مجموعه داده را می توان به ترتیب افزایش یا کاهش مرتب کرد. اگر تعداد عناصر 𝑛 مجموعه داده فرد باشد، میانه مقدار در موقعیت وسط است: 0.5(𝑛 + 1). اگر 𝑛 زوج باشد، میانه میانگین حسابی دو مقدار در وسط است، یعنی مواردی که در موقعیت های 0.5𝑛 و 0.5𝑛 + 1 قرار دارند. به عنوان مثال، اگر شما نقاط داده 2، 4، 1، 8 و 9 را دارید، آنگاه مقدار میانه 4 است که در وسط مجموعه داده مرتب شده است (1، 2، 4، 8، 9). اگر نقاط داده 2، 4، 1 و 8 باشند، میانه 3 است که میانگین دو عنصر میانی دنباله مرتب شده (2 و 4) است. شکل زیر این موضوع را نشان می دهد:
نقاط داده نقاط سبز هستند و خطوط بنفش میانه هر مجموعه داده را نشان می دهد. مقدار میانه برای مجموعه داده بالایی (1، 2.5، 4، 8، و 28) 4 است. اگر عدد پرت 28 را از مجموعه داده پایینی حذف کنید، آن گاه میانه به میانگین حسابی بین 2.5 و 4 تبدیل می شود که 3.25 است. شکل زیر هم میانگین و هم میانه نقاط داده 1، 2.5، 4، 8 و 28 را نشان می دهد:
باز هم میانگین خط چین قرمز است، در حالی که میانه خط بنفش است. تفاوت اصلی بین رفتار میانگین و میانه مربوط به داده های پرت یا افراط است. میانگین به شدت تحت تأثیر اقلام پرت است، اما میانه فقط به مقادیر پرت بستگی دارد یا اندکی یا اصلاً. شکل زیر را در نظر بگیرید:
مجموعه داده بالایی دوباره موارد 1، 2.5، 4، 8 و 28 را دارد. همان طور که قبلا دیدید، میانگین آن 8.7 و میانه آن 5 است. مجموعه داده پایین نشان می دهد که وقتی سمت راست ترین نقطه را با مقدار 28 حرکت می دهید چه اتفاقی می افتد:
- اگر مقدار آن را افزایش دهید (آن را به سمت راست ببرید)، میانگین افزایش می یابد، اما مقدار متوسط هرگز تغییر نمی کند.
- اگر مقدار آن را کاهش دهید (آن را به سمت چپ ببرید)، میانگین کاهش می یابد، اما میانه ثابت می ماند تا زمانی که مقدار نقطه متحرک بزرگتر یا مساوی 4 شود.
می توانید میانگین و میانه را به عنوان یکی از راه های تشخیص نقاط پرت و عدم تقارن در داده های خود مقایسه کنید. اینکه آیا مقدار متوسط یا مقدار متوسط برای شما مفیدتر است به زمینه مشکل خاص شما بستگی دارد. در اینجا یکی از بسیاری از پیاده سازی های پایتون خالص میانه وجود دارد:
>>> n = len(x) >>> if n % 2: … median_ = sorted(x)[round(0.5*(n-1))] … else: … x_ord, index = sorted(x), round(0.5 * n) … median_ = 0.5 * (x_ord[index-1] + x_ord[index]) … >>> median_ 4 |
دو مرحله مهم این پیاده سازی به شرح زیر است:
- مرتب سازی عناصر مجموعه داده
- یافتن عنصر(های) میانی در مجموعه داده مرتب شده
شما می توانید میانه را با statistics.median():
>>> median_ = statistics.median(x) >>> median_ 4 >>> median_ = statistics.median(x[:-1]) >>> median_ 3.25 |
نسخه مرتب شده x [1، 2.5، 4، 8.0، 28.0] است، بنابراین عنصر وسط 4 است. نسخه مرتب شده x[:-1]، که x بدون آخرین مورد 28.0 است، [1 است. ، 2.5، 4، 8.0]. حالا دو عنصر میانی 2.5 و 4 وجود دارد که میانگین آن ها 3.25 است. median_low() و median_high() دو تابع دیگر مرتبط با میانه در کتابخانه آمار پایتون هستند. آنها همیشه یک عنصر را از مجموعه داده برمی گردانند:
- اگر تعداد عناصر فرد باشد، یک مقدار وسط وجود دارد، بنابراین این توابع دقیقاً مانند () میانه رفتار می کنند.
- اگر تعداد عناصر زوج باشد، دو مقدار میانی وجود دارد. در این حالت ()median_low مقدار پایینتر و ()median_high مقدار متوسط بالاتر را برمیگرداند.
شما می توانید از این توابع استفاده کنید همان طور که از median():
>>> statistics.median_low(x[:-1]) 2.5 >>> statistics.median_high(x[:-1]) 4 |
باز هم، نسخه مرتب شده x[:-1] [1، 2.5، 4، 8.0] است. دو عنصر در وسط 2.5 (کم) و 4 (بالا) هستند. برخلاف اکثر توابع دیگر از کتابخانه آمار پایتون، median()، median_low() و median_high() زمانی که مقادیر nan در بین نقاط داده وجود دارد، nan را بر نمی گرداند:
>>> statistics.median(x_with_nan) 6.0 >>> statistics.median_low(x_with_nan) 4 >>> statistics.median_high(x_with_nan) 8.0 |
مراقب این رفتار باشید زیرا ممکن است آن چیزی که شما می خواهید نباشد! همچنین می توانید میانه را با np.median():
>>> median_ = np.median(y) >>> median_ 4.0 >>> median_ = np.median(y[:-1]) >>> median_ 3.25 |
شما همان مقادیر را با statistics.median() و np.median() به دست آورده اید. با این حال، اگر مقدار nan در مجموعه داده شما وجود داشته باشد، np.median() RuntimeWarning را صادر می کند و nan را برمی گرداند. اگر این رفتار آن چیزی نیست که شما می خواهید، می توانید از nanmedian() برای نادیده گرفتن همه مقادیر nan استفاده کنید:
>>> np.nanmedian(y_with_nan) 4.0 >>> np.nanmedian(y_with_nan[:-1]) 3.25 |
نتایج بهدستآمده مانند آمارهای statistics.median() و np.median() اعمال شده در مجموعه دادههای x و y است. اشیاء سری pandas متد .median() دارند که به طور پیش فرض مقادیر nan را نادیده می گیرد:
>>> z.median() 4.0 >>> z_with_nan.median() 4.0 |
رفتار ()median با .mean() در پانداها سازگار است. می توانید این رفتار را با پارامتر اختیاری skipna تغییر دهید.
مد در پایتون
مد نمونه مقداری در مجموعه داده است که بیشتر اتفاق می افتد. اگر چنین مقدار واحدی وجود نداشته باشد، مجموعه چندوجهی است زیرا دارای چندین مقدار مودال است. به عنوان مثال، در مجموعه ای که شامل نقاط 2، 3، 2، 8 و 12 است، عدد 2 حالت است زیرا بر خلاف موارد دیگر که فقط یک بار اتفاق می افتد، دو بار رخ می دهد. به این صورت می توانید حالت را با پایتون خالص دریافت کنید:
>>> u = [2, 3, 2, 8, 12] >>> mode_ = max((u.count(item), item) for item in set(u))[1] >>> mode_ 2 |
شما از u.count() برای بدست آوردن تعداد دفعات هر آیتم در u استفاده می کنید. موردی که بیشترین تعداد وقوع را دارد حالت است. توجه داشته باشید که لازم نیست از set(u) استفاده کنید. در عوض، شما ممکن است آن را با فقط u جایگزین کنید و در کل لیست تکرار کنید. توجه: set(u) یک مجموعه پایتون را با تمام آیتم های منحصر به فرد در u برمی گرداند. میتوانید از این ترفند برای بهینهسازی کار با دادههای بزرگتر استفاده کنید، بهخصوص زمانی که انتظار دارید موارد تکراری زیادی ببینید. می توانید حالت را با statistics.mode() و statistics.multimode():
>>> mode_ = statistics.mode(u) >>> mode_ >>> mode_ = statistics.multimode(u) >>> mode_ [2] |
همان طور که می بینید، mode() یک مقدار واحد را برگرداند، در حالی که multimode() لیستی را که حاوی نتیجه است برگرداند. اگرچه این تنها تفاوت بین این دو عملکرد نیست. اگر بیش از یک مقدار مدال وجود داشته باشد، mode() StatisticsError را افزایش می دهد، در حالی که multimode() لیست را با همه حالت ها برمی گرداند:
>>> v = [12، 15، 12، 15، 21، 15، 12] >>> statistics.mode(v) # Raises StatisticsError >>> statistics.multimode(v) [12، 15] |
شما باید به این سناریو توجه ویژه ای داشته باشید و هنگام انتخاب بین این دو عملکرد مراقب باشید. statistics.mode() و statistics.multimode() مقادیر nan را به عنوان مقادیر معمولی مدیریت می کنند و می توانند nan را به عنوان مقدار modal برگردانند:
>>> statistics.mode([2, math.nan, 2]) 2 >>> statistics.multimode([2, math.nan, 2]) [2] >>> statistics.mode([2, math.nan, 0, math.nan, 5]) nan >>> statistics.multimode([2, math.nan, 0, math.nan, 5]) [nan] |
در مثال اول بالا، عدد 2 دو بار رخ می دهد و مقدار مدال است. در مثال دوم، nan مقدار مدال است زیرا دو بار اتفاق می افتد، در حالی که مقادیر دیگر فقط یک بار رخ می دهند. توجه: statistics.multimode() در پایتون 3.8 معرفی شده است. شما همچنین می توانید حالت را با scipy.stats.mode():
>>> u, v = np.array(u), np.array(v) >>> mode_ = scipy.stats.mode(u) >>> mode_ ModeResult(mode=array([2]), count=array([2])) >>> mode_ = scipy.stats.mode(v) >>> mode_ ModeResult(mode=array([12]), count=array([3])) |
این تابع شی را با مقدار مدال و تعداد دفعاتی که اتفاق می افتد برمی گرداند. اگر چندین مقدار مدال در مجموعه داده وجود داشته باشد، تنها کوچکترین مقدار برگردانده می شود. می توانید حالت و تعداد دفعات آن را به صورت آرایه های NumPy با نماد نقطه دریافت کنید:
>>> mode_.mode array([12]) >>> mode_.count array([3]) |
این کد از .mode برای برگرداندن کوچکترین حالت (12) در آرایه v و .count برای برگرداندن تعداد دفعاتی که رخ می دهد (3) استفاده می کند. ()scipy.stats.mode نیز با مقادیر nan انعطاف پذیر است. این به شما امکان می دهد رفتار دلخواه را با پارامتر اختیاری nan_policy تعریف کنید. این پارامتر می تواند مقادیر ‘propagate’، ‘raise’ (یک خطا) یا ‘omit’ را به خود بگیرد. اشیاء سری pandas متد .mode() دارند که مقادیر چندوجهی را به خوبی مدیریت می کند و مقادیر nan را به طور پیش فرض نادیده می گیرد:
>>> u، v، w = pd.Series(u)، pd.Series(v)، pd.Series([2، 2، math.nan]) >>> u.mode() 0 2 dtype: int64 >>> v.mode() 0 12 1 15 dtype: int64 >>> w.mode() 0 2.0 dtype: float64 |
همان طور که می بینید، .mode() یک سری pd.Series جدید را برمی گرداند که تمام مقادیر مدال را در خود نگه می دارد. اگر میخواهید .mode() مقادیر nan را در نظر بگیرد، فقط آرگومان اختیاری dropna=False را ارسال کنید.
معیارهای تغییر پذیری در پایتون
معیارهای گرایش مرکزی برای توصیف داده ها کافی نیستند. شما همچنین به معیارهای تغییرپذیری نیاز دارید که میزان انتشار نقاط داده را کمیت می کند. در این بخش، نحوه شناسایی و محاسبه معیارهای تنوع زیر را خواهید آموخت:
- واریانس
- انحراف معیار
- چولگی
- صدک ها
- محدوده ها
واریانس در پایتون
واریانس نمونه میزان گسترش داده ها را کمی می کند. به صورت عددی نشان می دهد که نقاط داده چقدر از میانگین فاصله دارند. می توانید واریانس نمونه مجموعه داده 𝑥 را با عناصر 𝑛 به صورت ریاضی به صورت 𝑠² = Σᵢ(𝑥ᵢ − mean(𝑥))² / (𝑛 − 1)، که در آن 𝑖 = 1، 2، …، 𝑛 و میانگین است(𝑥) بیان کنید. شکل زیر به شما نشان می دهد که چرا در نظر گرفتن واریانس هنگام توصیف مجموعه داده ها مهم است:
دو مجموعه داده در این شکل وجود دارد:
- نقاط آبی: این مجموعه داده دارای واریانس کمتر یا اختلاف میانگین کمتری با میانگین است. همچنین دامنه کوچکتر یا اختلاف کمتری بین بزرگترین و کوچکترین آیتم دارد.
- نقاط آبی تو خالی: این مجموعه داده دارای واریانس بزرگتر یا اختلاف میانگین بزرگتر از میانگین است. همچنین دارای محدوده بزرگتر یا تفاوت بزرگتر بین بزرگترین و کوچکترین آیتم است.
توجه داشته باشید که این دو مجموعه داده دارای میانگین و میانه یکسان هستند، حتی اگر به نظر می رسد تفاوت قابل توجهی داشته باشند. نه میانگین و نه میانه نمی توانند این تفاوت را توصیف کنند. به همین دلیل است که به معیارهای تغییرپذیری نیاز دارید. در اینجا نحوه محاسبه واریانس نمونه با پایتون خالص آمده است:
>>> n = len(x) >>> mean_ = sum(x) / n >>> var_ = sum((item – mean_)**2 for item in x) / (n – 1) >>> var_ 123.19999999999999 |
>>> var_ = statistics.variance(x) >>> var_ 123.2 |
شما همان نتیجه را برای واریانس بالا به دست آورده اید. () variance می تواند از محاسبه میانگین اجتناب کند اگر میانگین را به صراحت به عنوان آرگومان دوم ارائه دهید: statistics.variance (x, mean_). اگر در بین دادههای خود مقادیر nan داشته باشید، statistics.variance() nan را برمیگرداند:
>>> statistics.variance(x_with_nan) nan |
این کد با mean() و اکثر توابع دیگر از کتابخانه آمار پایتون سازگار است. همچنین می توانید واریانس نمونه را با NumPy محاسبه کنید. باید از تابع np.var() یا متد مربوطه .var():
>>> var_ = np.var(y، ddof=1) >>> var_ 123.199999999999999 >>> var_ = y.var(ddof=1) >>> var_ 123.199999999999999 |
تعیین پارامتر ddof=1 بسیار مهم است. به این ترتیب درجه آزادی دلتا را روی 1 قرار می دهید. این پارامتر امکان محاسبه صحیح 𝑠² را می دهد، با (❑ − 1) در مخرج به جای 𝑛. اگر مقادیر nan در مجموعه داده دارید، np.var() و .var() nan را برمی گرداند:
>>> np.var(y_with_nan، ddof=1) nan >>> y_with_nan.var(ddof=1) nan |
این با np.mean() و np.average() سازگار است. اگر می خواهید مقادیر nan را رد کنید، باید از np.nanvar():
>>> np.nanvar(y_with_nan، ddof=1) 123.199999999999999 |
np.nanvar() مقادیر nan را نادیده می گیرد. همچنین باید ddof=1 را مشخص کنید. اشیاء PD.Series دارای متد .var() هستند که به طور پیش فرض مقادیر nan را رد می کند:
>>> z.var(ddof=1) 123.199999999999999 >>> z_with_nan.var(ddof=1) 123.199999999999999 |
همچنین دارای پارامتر ddof است، اما مقدار پیش فرض آن 1 است، بنابراین می توانید آن را حذف کنید. اگر رفتار متفاوتی در رابطه با مقادیر nan میخواهید، از پارامتر اختیاری skipna استفاده کنید. شما واریانس جامعه را مشابه واریانس نمونه محاسبه می کنید. با این حال، باید از 𝑛 در مخرج به جای 𝑛 − 1 استفاده کنید: Σᵢ(𝑥ᵢ − mean(𝑥))² / 𝑛. در این حالت 𝑛 تعداد اقلام در کل جمعیت است. می توانید واریانس جامعه را مشابه واریانس نمونه با تفاوت های زیر بدست آورید:
- (n – 1) را با n در پیاده سازی پایتون خالص جایگزین کنید.
- به جای statistics.variance() از statistics.pvariance() استفاده کنید.
- اگر از NumPy یا pandas استفاده می کنید، پارامتر ddof=0 را مشخص کنید. در NumPy می توانید ddof را حذف کنید زیرا مقدار پیش فرض آن 0 است.
توجه داشته باشید که هر زمان که واریانس را محاسبه می کنید، همیشه باید از کار با یک نمونه یا کل جامعه آگاه باشید!
انحراف معیار در پایتون
انحراف استاندارد نمونه یکی دیگر از معیارهای پراکندگی داده است. به واریانس نمونه متصل است، زیرا انحراف معیار، 𝑠، جذر مثبت واریانس نمونه است. انحراف استاندارد اغلب راحتتر از واریانس است، زیرا واحدی مشابه نقاط داده دارد. هنگامی که واریانس را دریافت کردید، می توانید انحراف استاندارد را با پایتون خالص محاسبه کنید:
>>> std_ = var_ ** 0.5 >>> std_ 11.099549540409285 |
اگر چه این راه حل کار می کند، اما می توانید از statistics.stdev():
>>> std_ = statistics.stdev(x) >>> std_ 11.099549540409287 |
البته نتیجه مثل قبل است. مانند واریانس()، stdev() میانگین را محاسبه نمی کند اگر به طور صریح آن را به عنوان آرگومان دوم ارائه دهید: statistics.stdev(x، mean_). شما می توانید انحراف استاندارد را با NumPy تقریباً به همان روش دریافت کنید. برای محاسبه انحراف معیار می توانید از تابع std() و روش مربوطه .std() استفاده کنید. اگر مقادیر nan در مجموعه داده وجود داشته باشد، آنها nan را برمی گردانند. برای نادیده گرفتن مقادیر nan، باید از np.nanstd() استفاده کنید. شما از std()، .std() و nanstd() از NumPy استفاده می کنید همان طور که از var()، .var() و nanvar():
>>> np.std(y, ddof=1) 11.099549540409285 >>> y.std(ddof=1) 11.099549540409285 >>> np.std(y_with_nan, ddof=1) nan >>> y_with_nan.std(ddof=1) nan >>> np.nanstd(y_with_nan, ddof=1) 11.099549540409285 |
فراموش نکنید که درجه آزادی دلتا را روی 1 تنظیم کنید! اشیاء pd.Series همچنین دارای متد .std() هستند که به طور پیش فرض nan را رد می کند:
>>> z.std(ddof=1) 11.099549540409285 >>> z_with_nan.std(ddof=1) 11.099549540409285 |
پارامتر ddof پیشفرض ۱ است، بنابراین میتوانید آن را حذف کنید. دوباره، اگر میخواهید با مقادیر nan متفاوت رفتار کنید، پارامتر skipna را اعمال کنید. انحراف معیار جمعیت به کل جمعیت اشاره دارد. این جذر مثبت واریانس جمعیت است. شما می توانید آن را درست مانند نمونه انحراف استاندارد با تفاوت های زیر محاسبه کنید:
- جذر واریانس جمعیت را در پیاده سازی پایتون خالص پیدا کنید.
- به جای statistics.stdev() از statistics.pstdev() استفاده کنید.
- اگر از NumPy یا pandas استفاده می کنید، پارامتر ddof=0 را مشخص کنید. در NumPy می توانید ddof را حذف کنید زیرا مقدار پیش فرض آن 0 است.
همان طور که می بینید، می توانید انحراف استاندارد را در پایتون، NumPy و پانداها تقریباً به همان روشی که واریانس را تعیین می کنید، تعیین کنید. شما از توابع و روش های متفاوت اما مشابه با آرگومان های یکسان استفاده می کنید.
چولگی در پایتون
چولگی نمونه عدم تقارن یک نمونه داده را اندازه گیری می کند. تعاریف ریاضی متعددی از چولگی وجود دارد. یک عبارت رایج برای محاسبه چولگی مجموعه داده 𝑥 با عناصر 𝑛 (𝑛² / ((𝑛 − 1)(𝑛 − 2))) (Σᵢ(𝑥ᵢ − mean(𝑥))³ / (𝑛𝑠³)) است. یک عبارت ساده تر، Σᵢ(𝑥ᵢ − mean(𝑥))³ 𝑛 / ((𝑛 − 1)(𝑛 − 2)𝑠³ است، که در آن 𝑖 = 1، 2، …، 𝑛 و میانگین (𝑥) نمونه است. چولگی تعریف شده به این صورت ضریب گشتاور استاندارد شده فیشر-پیرسون تنظیم شده نامیده می شود. شکل قبلی دو مجموعه داده کاملاً متقارن را نشان می دهد. به عبارت دیگر نقاط آنها از میانگین فاصله مشابهی داشتند. در مقابل، تصویر زیر دو مجموعه نامتقارن را نشان می دهد:
مجموعه اول با نقاط سبز و مجموعه دوم با نقاط سفید نشان داده شده است. معمولاً مقادیر چولگی منفی نشان می دهد که یک دم غالب در سمت چپ وجود دارد که می توانید با اولین مجموعه آن را ببینید. مقادیر چولگی مثبت مربوط به دم درازتر یا چاق تر در سمت راست است که می توانید در مجموعه دوم مشاهده کنید. اگر چولگی نزدیک به 0 باشد (به عنوان مثال، بین 0.5- و 0.5)، آنگاه مجموعه داده کاملاً متقارن در نظر گرفته می شود. هنگامی که اندازه مجموعه داده خود n، میانگین نمونه و انحراف استاندارد std_ را محاسبه کردید، می توانید چولگی نمونه را با پایتون خالص بدست آورید:
>>> x = [8.0, 1, 2.5, 4, 28.0] >>> n = len(x) >>> mean_ = sum(x) / n >>> var_ = sum((item – mean_)**2 for item in x) / (n – 1) >>> std_ = var_ ** 0.5 >>> skew_ = (sum((item – mean_)**3 for item in x) … * n / ((n – 1) * (n – 2) * std_**3)) >>> skew_ 1.9470432273905929 |
چولگی مثبت است، بنابراین x یک دم سمت راست دارد. همچنین می توانید چولگی نمونه را با scipy.stats.skew():
>>> y, y_with_nan = np.array(x), np.array(x_with_nan) >>> scipy.stats.skew(y, bias=False) 1.9470432273905927 >>> scipy.stats.skew(y_with_nan, bias=False) nan |
نتیجه بهدستآمده مانند پیادهسازی خالص پایتون است. بایاس پارامتر روی False تنظیم شده است تا اصلاحات برای بایاس آماری فعال شود. پارامتر اختیاری nan_policy می تواند مقادیر ‘propagate’، ‘raise’ یا ‘omit’ را بگیرد. این به شما امکان می دهد نحوه مدیریت مقادیر nan را کنترل کنید. اشیاء سری pandas متد .skew() دارند که چولگی یک مجموعه داده را نیز برمی گرداند:
>>> z، z_with_nan = pd.Series(x)، pd.Series(x_with_nan) >>> z.skew() 1.9470432273905924 >>> z_with_nan.skew() 1.9470432273905924 |
مانند سایر روشها، .skew() بهطور پیشفرض مقادیر nan را نادیده میگیرد، زیرا مقدار پیشفرض پارامتر اختیاری skipna است.
صدک ها در پایتون
صدک 𝑝 نمونه عنصری در مجموعه داده است به طوری که 𝑝% عناصر مجموعه داده کمتر یا مساوی با آن مقدار باشد. همچنین (100 − 𝑝) درصد عناصر بزرگتر یا مساوی با آن مقدار هستند. اگر دو عنصر از این قبیل در مجموعه داده وجود داشته باشد، صدک 𝑝 نمونه میانگین حسابی آنهاست. هر مجموعه داده دارای سه ربع است که صدک هایی هستند که مجموعه داده را به چهار قسمت تقسیم می کنند:
- چارک اول نمونه 25 صدک است. تقریباً 25٪ از کوچکترین موارد را از بقیه مجموعه داده ها تقسیم می کند.
- چارک دوم نمونه صدک 50 یا میانه است. تقریباً 25 درصد از اقلام بین چارک اول و دوم و 25 درصد دیگر بین چارک دوم و سوم قرار دارند.
- چارک سوم نمونه صدک 75 است. تقریباً 25٪ از بزرگترین موارد را از بقیه مجموعه داده ها تقسیم می کند.
هر قسمت تقریباً به همان تعداد آیتم دارد. اگر می خواهید داده های خود را به چند بازه تقسیم کنید، می توانید از statistics.quantiles():
>>> x = [-5.0، -1.1، 0.1، 2.0، 8.0، 12.8، 21.0، 25.8، 41.0] >>> statistics.quantiles(x, n=2) [8.0] >>> statistics.quantiles(x, n=4, method=’inclusive’) [0.1، 8.0، 21.0] |
در این مثال، 8.0 میانه x است، در حالی که 0.1 و 21.0 به ترتیب صدک های 25 و 75 نمونه هستند. پارامتر n تعداد صدکهای احتمال مساوی حاصل را مشخص میکند و روش نحوه محاسبه آنها را تعیین میکند. توجه: statistics.quantiles() در پایتون 3.8 معرفی شده است. همچنین می توانید از np.percentile() برای تعیین هر صدک نمونه در مجموعه داده خود استفاده کنید. به عنوان مثال، به این ترتیب می توانید صدک های 5 و 95 را پیدا کنید:
>>> y = np.array(x) >>> np.percentile(y, 5) -3.44 >>> np.percentile(y, 95) 34.9199999999999995 |
درصد() چندین آرگومان می گیرد. شما باید مجموعه داده را به عنوان آرگومان اول و مقدار صدک را به عنوان آرگومان دوم ارائه دهید. مجموعه داده می تواند به شکل یک آرایه NumPy، لیست، تاپل یا ساختار داده مشابه باشد. صدک می تواند مانند مثال بالا عددی بین 0 تا 100 باشد، اما می تواند دنباله ای از اعداد نیز باشد:
>>> np.percentile(y, [25, 50, 75]) آرایه ([ 0.1، 8. 21. ]) >>> np.median(y) 8.0 |
این کد صدک های 25، 50 و 75 را به یکباره محاسبه می کند. اگر مقدار صدک یک دنباله باشد، آنگاه () صدک آرایه NumPy را با نتایج برمیگرداند. دستور اول آرایه چارک ها را برمی گرداند. عبارت دوم میانه را برمی گرداند، بنابراین می توانید تأیید کنید که برابر با صدک 50 است که 8.0 است. اگر می خواهید مقادیر nan را نادیده بگیرید، به جای آن از np.nanpercentile() استفاده کنید:
>>> y_with_nan = np.insert(y, 2, np.nan) >>> y_with_nan array([-5. , -1.1, nan, 0.1, 2. , 8. , 12.8, 21. , 25.8, 41. ]) >>> np.nanpercentile(y_with_nan, [25, 50, 75]) array([ 0.1, 8. , 21. ]) |
به این ترتیب می توانید از مقادیر nan اجتناب کنید. NumPy همچنین عملکردهای بسیار مشابهی را در quantile () و nanquantile () به شما ارائه می دهد. اگر از آنها استفاده می کنید، باید مقادیر کمیت را به جای صدک به صورت اعداد بین 0 و 1 ارائه دهید:
>>> np.quantile(y, 0.05) -3.44 >>> np.quantile(y, 0.95) 34.919999999999995 >>> np.quantile(y, [0.25, 0.5, 0.75]) array([ 0.1, 8. , 21. ]) >>> np.nanquantile(y_with_nan, [0.25, 0.5, 0.75]) array([ 0.1, 8. , 21. ]) |
نتایج مشابه نمونه های قبلی است، اما در اینجا آرگومان های شما بین 0 و 1 است. به عبارت دیگر شما به جای 5، 0.05 و به جای 95، 0.95 را پاس کردید. pd.Series اشیاء دارای متد .quantile():
>>> z، z_with_nan = pd.Series(y)، pd.Series(y_with_nan) >>> z.quantile(0.05) -3.44 >>> z.quantile(0.95) 34.9199999999999995 >>> z.quantile([0.25، 0.5، 0.75]) 0.25 0.1 0.50 8.0 0.75 21.0 dtype: float64 >>> z_with_nan.quantile([0.25، 0.5، 0.75]) 0.25 0.1 0.50 8.0 0.75 21.0 dtype: float64 |
.quantile() همچنین به شما نیاز دارد که مقدار quantile را به عنوان آرگومان ارائه دهید. این مقدار می تواند عددی بین 0 تا 1 یا دنباله ای از اعداد باشد. در حالت اول، .quantile() یک اسکالر برمی گرداند. در حالت دوم، یک سری جدید حاوی نتایج را برمی گرداند.
محدوده (Ranges) در پایتون
محدوده داده ها تفاوت بین حداکثر و حداقل عنصر در مجموعه داده است. می توانید آن را با تابع np.ptp():
>>> np.ptp(y) 46.0 >>> np.ptp(z) 46.0 >>> np.ptp(y_with_nan) nan >>> np.ptp(z_with_nan) 46.0 |
اگر مقادیر nan در آرایه NumPy شما وجود داشته باشد، این تابع nan را برمی گرداند. اگر از یک شیء سری pandas استفاده می کنید، یک عدد را برمی گرداند. همچنین، میتوانید از توابع و روشهای داخلی Python، NumPy یا pandas برای محاسبه حداکثر و حداقل دنبالهها استفاده کنید:
- max() و min() از کتابخانه استاندارد پایتون
- amax() و amin() از NumPy
- nanmax() و nanmin() از NumPy برای نادیده گرفتن مقادیر nan
- .max() و .min() از NumPy
- .max() و .min() از پانداها برای نادیده گرفتن مقادیر nan به طور پیش فرض
در اینجا چند نمونه از نحوه استفاده از این روال ها آورده شده است:
>>> np.amax(y) – np.amin(y) 46.0 >>> np.nanmax(y_with_nan) – np.nanmin(y_with_nan) 46.0 >>> y.max() – y.min() 46.0 >>> z.max() – z.min() 46.0 >>> z_with_nan.max() – z_with_nan.min() 46.0 |
به این ترتیب دامنه داده ها را به دست می آورید. محدوده بین چارکی تفاوت بین چارک اول و سوم است. پس از محاسبه چارک ها، می توانید تفاوت آنها را محاسبه کنید:
>>> quartiles = np.quantile(y, [0.25, 0.75]) >>> quartiles[1] – quartiles[0] 20.9 >>> quartiles = z.quantile([0.25, 0.75]) >>> quartiles[0.75] – quartiles[0.25] 20.9 |
توجه داشته باشید که به مقادیر موجود در یک شیء سری pandas با برچسب های 0.75 و 0.25 دسترسی دارید.
خلاصه آمار توصیفی:
SciPy و پانداها روال های مفیدی را برای دریافت سریع آمار توصیفی با یک فراخوانی تابع یا روش ارائه می دهند. می توانید از ()scipy.stats.describe به این صورت استفاده کنید:
>>> result = scipy.stats.describe(y, ddof=1, bias=False) >>> result DescribeResult(nobs=9, minmax=(-5.0, 41.0), mean=11.622222222222222, variance=228.75194444444446, skewness=0.9249043136685094, kurtosis=0.14770623629658886) |
شما باید مجموعه داده را به عنوان اولین آرگومان ارائه دهید. آرگومان می تواند یک آرایه NumPy، لیست، تاپل یا ساختار داده مشابه باشد. میتوانید ddof=1 را حذف کنید زیرا پیشفرض است و فقط زمانی اهمیت دارد که واریانس را محاسبه میکنید. شما می توانید بایاس=نادرست را برای تصحیح چولگی و کشیدگی برای سوگیری آماری اجباری ارسال کنید. توجه: پارامتر اختیاری nan_policy میتواند مقادیر ‘propagate’ (پیشفرض)، ‘raise’ (یک خطا) یا ‘omit’ را بگیرد. این پارامتر به شما اجازه می دهد تا زمانی که مقادیر nan وجود دارد، آنچه را که اتفاق می افتد، کنترل کنید. describe() یک شی را برمی گرداند که دارای آمار توصیفی زیر است:
- nobs: تعداد مشاهدات یا عناصر موجود در مجموعه داده شما
- minmax: تاپلی با حداقل و حداکثر مقادیر مجموعه داده شما
- mean: میانگین مجموعه داده شما
- variance: واریانس مجموعه داده شما
- چولگی: چولگی مجموعه داده شما
- kurtosis: کشیدگی مجموعه داده شما
شما می توانید با علامت نقطه به مقادیر خاصی دسترسی پیدا کنید:
>>> result.nobs 9 >>> result.minmax[0] # Min -5.0 >>> result.minmax[1] # Max 41.0 >>> result.mean 11.622222222222222 >>> result.variance 228.75194444444446 >>> result.skewness 0.9249043136685094 >>> result.kurtosis 0.14770623629658886 |
با SciPy، شما فقط یک فراخوانی تابع تا یک خلاصه آمار توصیفی برای مجموعه داده خود فاصله دارید. پانداها اگر نگوییم بهتر، عملکرد مشابهی دارند. اشیاء سری دارای متد .describe():
>>> result = z.describe() >>> result count 9.000000 mean 11.622222 std 15.124548 min -5.000000 25% 0.100000 50% 8.000000 75% 21.000000 max 41.000000 dtype: float64 |
این یک سری جدید را برمی گرداند که دارای موارد زیر است:
- count: تعداد عناصر موجود در مجموعه داده شما
- mean: میانگین مجموعه داده شما
- std: انحراف استاندارد مجموعه داده شما
- min and max: حداقل و حداکثر مقادیر مجموعه داده شما
- 25٪، 50٪، و 75٪: چارک مجموعه داده شما
اگر میخواهید شیء حاصل از سری شامل صدکهای دیگر باشد، باید مقدار صدکهای پارامتر اختیاری را مشخص کنید. می توانید به هر مورد از نتیجه با برچسب آن دسترسی داشته باشید:
>>> result[‘mean’] 11.622222222222222 >>> result[‘std’] 15.12454774346805 >>> result[‘min’] -5.0 >>> result[‘max’] 41.0 >>> result[‘25%’] 0.1 >>> result[‘50%’] 8.0 >>> result[‘75%’] 21.0 |
به این ترتیب می توانید آمار توصیفی یک شیء سری را با یک فراخوانی متد و با استفاده از پانداها بدست آورید.
همبستگی در پایتون
شما اغلب باید رابطه بین عناصر متناظر دو متغیر در یک مجموعه داده را بررسی کنید. فرض کنید دو متغیر وجود دارد، 𝑥 و 𝑦، با تعداد عناصر مساوی، 𝑛. بگذارید 𝑥₁ از 𝑥 با 𝑦₁ از 𝑦، 𝑥₂ از 𝑥 به 𝑦₂ از 𝑦 و غیره مطابقت داشته باشد. سپس میتوانید بگویید که جفتهای 𝑛 عناصر متناظر وجود دارد: (𝑥₁، 𝑦₁)، (𝑥₂، 𝑦₂)، و …… معیارهای زیر را برای همبستگی بین جفت داده ها مشاهده خواهید کرد:
- همبستگی مثبت زمانی وجود دارد که مقادیر بزرگتر 𝑥 با مقادیر بزرگتر از 𝑦 مطابقت داشته باشد و بالعکس.
- همبستگی منفی زمانی وجود دارد که مقادیر بزرگتر 𝑥 با مقادیر کوچکتر 𝑦 مطابقت داشته باشد و بالعکس.
- اگر چنین رابطه ظاهری وجود نداشته باشد، همبستگی ضعیف یا عدم وجود همبستگی دارد.
شکل زیر نمونه هایی از همبستگی منفی، ضعیف و مثبت را نشان می دهد:
نمودار سمت چپ با نقاط قرمز همبستگی منفی را نشان می دهد. نمودار در وسط با نقاط سبز همبستگی ضعیفی را نشان می دهد. در نهایت، نمودار سمت راست با نقاط آبی همبستگی مثبت را نشان می دهد. نکته: یک نکته مهم وجود دارد که باید همیشه هنگام کار با همبستگی بین یک جفت متغیر در نظر داشته باشید، و آن این است که همبستگی معیار یا شاخص علیت نیست، بلکه فقط ارتباط است! دو آماری که همبستگی بین مجموعه داده ها را اندازه گیری می کنند، کوواریانس و ضریب همبستگی هستند. بیایید برخی از داده ها را برای کار با این اقدامات تعریف کنیم. شما دو لیست پایتون ایجاد میکنید و از آنها برای دریافت آرایههای NumPy و سری پانداهای مربوطه استفاده میکنید:
>>> x = list(range(-10, 11)) >>> y = [0, 2, 2, 2, 2, 3, 3, 6, 7, 4, 7, 6, 6, 9, 4, 5, 5, 10, 11, 12, 14] >>> x_, y_ = np.array(x), np.array(y) >>> x__, y__ = pd.Series(x_), pd.Series(y_) |
اکنون که این دو متغیر را دارید، می توانید شروع به بررسی رابطه بین آنها کنید.
کوواریانس در پایتون
کوواریانس نمونه معیاری است که قدرت و جهت رابطه بین یک جفت متغیر را کمیت می کند:
- اگر همبستگی مثبت باشد، کوواریانس نیز مثبت است. یک رابطه قوی تر با مقدار کوواریانس بالاتر مطابقت دارد.
- اگر همبستگی منفی باشد، کوواریانس نیز منفی است. یک رابطه قوی تر با مقدار مطلق کمتر (یا بالاتر) کوواریانس مطابقت دارد.
- اگر همبستگی ضعیف باشد، کوواریانس نزدیک به صفر است.
کوواریانس متغیرهای 𝑥 و 𝑦 از نظر ریاضی به صورت 𝑠ˣʸ = Σᵢ (𝑥ᵢ − mean(𝑥)) (𝑦ᵢ − mean(𝑦)) / (𝑛 − 1، 1، ) تعریف می شود. (𝑥) میانگین نمونه 𝑥 است و mean(𝑦) میانگین نمونه 𝑦 است. نتیجه می شود که کوواریانس دو متغیر یکسان در واقع واریانس است: 𝑠ˣˣ = Σᵢ(𝑥ᵢ − mean(𝑥))² / (𝑛 − 1) = (𝑠ˣ)² و 𝑠ʸʸ = Σᵢ(ᵢ) / (𝑛 − 1) = (𝑠ʸ)². به این صورت می توانید کوواریانس را در پایتون خالص محاسبه کنید:
>>> n = len(x) >>> mean_x, mean_y = sum(x) / n, sum(y) / n >>> cov_xy = (sum((x[k] – mean_x) * (y[k] – mean_y) for k in range(n)) … / (n – 1)) >>> cov_xy 19.95 |
ابتدا باید میانگین x و y را پیدا کنید. سپس فرمول ریاضی کوواریانس را اعمال می کنید. NumPy دارای تابع cov() است که ماتریس کوواریانس را برمی گرداند:
>>> cov_matrix = np.cov(x_, y_) >>> cov_matrix array([[38.5 , 19.95 ], [19.95 , 13.91428571]]) |
توجه داشته باشید که cov() دارای پارامترهای اختیاری بایاس است که به طور پیشفرض روی False و ddof که پیشفرض None است. مقادیر پیش فرض آنها برای بدست آوردن ماتریس کوواریانس نمونه مناسب است. عنصر سمت چپ بالای ماتریس کوواریانس کوواریانس x و x یا واریانس x است. به طور مشابه، عنصر پایین سمت راست کوواریانس y و y یا واریانس y است. می توانید بررسی کنید که این درست است:
>>> x_.var(ddof=1) 38.5 >>> y_.var(ddof=1) 13.914285714285711 |
همان طور که می بینید، واریانس های x و y به ترتیب برابر با cov_matrix[0, 0] و cov_matrix[1, 1] هستند. دو عنصر دیگر ماتریس کوواریانس برابر هستند و نشان دهنده کوواریانس واقعی بین x و y هستند:
>>> cov_xy = cov_matrix[0, 1] >>> cov_xy 19.95 >>> cov_xy = cov_matrix[1, 0] >>> cov_xy 19.95 |
شما همان مقدار کوواریانس را با np.cov() به دست آورده اید که با پایتون خالص. سری pandas متد .cov() دارد که می توانید برای محاسبه کوواریانس از آن استفاده کنید:
>>> cov_xy = x__.cov(y__) >>> cov_xy 19.95 >>> cov_xy = y__.cov(x__) >>> cov_xy 19.95 |
در اینجا، شما .cov() را روی یک شیء سری فراخوانی می کنید و شی دیگر را به عنوان اولین آرگومان ارسال می کنید.
ضریب همبستگی در پایتون
ضریب همبستگی یا ضریب همبستگی محصول-لحظه پیرسون با نماد 𝑟 نشان داده می شود. ضریب یکی دیگر از معیارهای همبستگی بین داده ها است. شما می توانید آن را به عنوان یک کوواریانس استاندارد در نظر بگیرید. در اینجا چند واقعیت مهم در مورد آن وجود دارد:
- مقدار 𝑟 > 0 نشان دهنده همبستگی مثبت است.
- مقدار 𝑟 < 0 نشان دهنده همبستگی منفی است.
- مقدار r = 1 حداکثر مقدار ممکن 𝑟 است. با یک رابطه خطی مثبت کامل بین متغیرها مطابقت دارد.
- مقدار r = -1 حداقل مقدار ممکن 𝑟 است. با یک رابطه خطی منفی کامل بین متغیرها مطابقت دارد.
- مقدار r ≈ 0 یا زمانی که 𝑟 در حدود صفر است، به این معنی است که همبستگی بین متغیرها ضعیف است.
فرمول ریاضی ضریب همبستگی 𝑟 = 𝑠ˣʸ / (𝑠ˣ𝑠ʸ) است که در آن 𝑠ˣ و 𝑠ʸ به ترتیب انحراف معیارهای 𝑥 و 𝑦 هستند. اگر میانگین (mean_x و mean_y) و انحراف استاندارد (std_x، std_y) را برای مجموعه دادههای x و y، و همچنین کوواریانس آنها cov_xy داشته باشید، میتوانید ضریب همبستگی را با پایتون خالص محاسبه کنید:
>>> var_x = sum((item – mean_x)**2 for item in x) / (n – 1) >>> var_y = sum((item – mean_y)**2 for item in y) / (n – 1) >>> std_x, std_y = var_x ** 0.5, var_y ** 0.5 >>> r = cov_xy / (std_x * std_y) >>> r 0.861950005631606 |
شما متغیر r را دارید که نشان دهنده ضریب همبستگی است. scipy.stats روتین pearsonr() دارد که ضریب همبستگی و مقدار 𝑝 را محاسبه می کند:
>>> r, p = scipy.stats.pearsonr(x_, y_) >>> r 0.861950005631606 >>> p 5.122760847201171e-07 |
pearsonr() یک تاپل با دو عدد برمی گرداند. اولی 𝑟 و دومی مقدار 𝑝 است. مشابه مورد ماتریس کوواریانس، می توانید np.corrcoef() را با x_ و y_ به عنوان آرگومان اعمال کنید و ماتریس ضریب همبستگی را بدست آورید:
>>> corr_matrix = np.corrcoef(x_, y_) >>> corr_matrix array([[1. , 0.86195001], [0.86195001, 1. ]]) |
عنصر سمت چپ بالا ضریب همبستگی بین x_ و x_ است. عنصر سمت راست پایین ضریب همبستگی بین y_ و y_ است. مقادیر آنها برابر با 1.0 است. دو عنصر دیگر برابر هستند و نشان دهنده ضریب همبستگی واقعی بین x_ و y_ هستند:
>>> r = corr_matrix[0, 1] >>> r 0.8619500056316061 >>> r = corr_matrix[1, 0] >>> r 0.861950005631606 |
البته نتیجه مشابه پایتون خالص و pearsonr() است. می توانید ضریب همبستگی را با scipy.stats.linregress ():
>>> scipy.stats.linregress(x_, y_) LinregressResult(slope=0.5181818181818181, intercept=5.714285714285714, rvalue=0.861950005631606, pvalue=5.1227608472011649-5.1227608472011649=st. 9) |
()linregress x_ و y_ را می گیرد، رگرسیون خطی را انجام می دهد و نتایج را برمی گرداند. شیب و قطع معادله خط رگرسیون را تعریف می کنند، در حالی که rvalue ضریب همبستگی است. برای دسترسی به مقادیر خاص از نتیجه linregress()، از جمله ضریب همبستگی، از نماد نقطه استفاده کنید:
>>> result = scipy.stats.linregress(x_, y_) >>> r = result.rvalue >>> r 0.861950005631606 |
به این ترتیب می توانید رگرسیون خطی انجام دهید و ضریب همبستگی را بدست آورید. سری پانداها برای محاسبه ضریب همبستگی روش .corr() دارند:
>>> r = x__.corr(y__) >>> r 0.8619500056316061 >>> r = y__.corr(x__) >>> r 0.861950005631606 |
شما باید .corr() را روی یک شیء سری فراخوانی کنید و شیء دیگر را به عنوان اولین آرگومان ارسال کنید.
کار با داده های دو بعدی در پایتون
آماردانان اغلب با داده های دو بعدی کار می کنند. در اینجا چند نمونه از فرمت های داده دو بعدی آورده شده است:
- جداول پایگاه داده
- فایل های CSV
- صفحات گسترده Excel، Calc و Google
NumPy و SciPy ابزاری جامع برای کار با دادههای دوبعدی ارائه میکنند. پانداها دارای کلاس DataFrame هستند که به طور خاص برای مدیریت دادههای دارای برچسب دوبعدی استفاده میکنند. با ایجاد یک آرایه 2 بعدی NumPy شروع کنید:
>>> a = np.array([[1, 1, 1], … [2, 3, 1], … [4, 9, 2], … [8, 27, 4], … [16, 1, 1]]) >>> a array([[ 1, 1, 1], [ 2, 3, 1], [ 4, 9, 2], [ 8, 27, 4], [16, 1, 1]]) |
اکنون یک مجموعه داده دو بعدی دارید که در این بخش از آن استفاده خواهید کرد. شما می توانید توابع و روش های آمار پایتون را همانطور که برای داده های 1 بعدی انجام می دهید، روی آن اعمال کنید:
>>> np.mean(a) 5.4 >>> a.mean() 5.4 >>> np.median(a) 2.0 >>> a.var(ddof=1) 53.40000000000001 |
همانطور که می بینید، آماری (مانند میانگین، میانه، یا واریانس) از تمام داده های آرایه a دریافت می کنید. گاهی اوقات، این رفتار همان چیزی است که شما می خواهید، اما در برخی موارد، می خواهید این مقادیر برای هر سطر یا ستون از آرایه دو بعدی شما محاسبه شود. توابع و روش هایی که تاکنون استفاده کرده اید دارای یک پارامتر اختیاری به نام محور هستند که برای مدیریت داده های دو بعدی ضروری است. محور می تواند هر یک از مقادیر زیر را بگیرد:
- axis=هیچکدام می گوید که آمار را در تمام داده های آرایه محاسبه کنید. مثال های بالا به این صورت عمل می کنند. این رفتار اغلب پیش فرض در NumPy است.
- axis=0 می گوید که آمار را در تمام ردیف ها، یعنی برای هر ستون آرایه محاسبه می کند. این رفتار اغلب پیش فرض توابع آماری SciPy است.
- axis=1 می گوید برای محاسبه آمار در تمام ستون ها، یعنی برای هر ردیف از آرایه.
بیایید axis=0 را در عمل با np.mean():
>>> np.mean(a, axis=0) array([6.2, 8.2, 1.8]) >>> a.mean(axis=0) array([6.2, 8.2, 1.8]) |
دو عبارت بالا آرایه های NumPy جدید را با میانگین برای هر ستون a برمی گرداند. در این مثال، میانگین ستون اول 6.2 است. ستون دوم دارای میانگین 8.2 است، در حالی که ستون سوم دارای 1.8 است. اگر axis=1 را به mean() ارائه دهید، نتایج را برای هر سطر دریافت خواهید کرد:
>>> np.mean(a, axis=1) array([ 1., 2., 5., 13., 6.]) >>> a.mean(axis=1) array([ 1., 2., 5., 13., 6.]) |
همان طور که می بینید، ردیف اول a دارای میانگین 1.0، دوم 2.0 و غیره است. توجه: شما می توانید این قوانین را به آرایه های چند بعدی گسترش دهید، اما این فراتر از محدوده این آموزش است. با خیال راحت به تنهایی وارد این موضوع شوید! محور پارامتر با سایر توابع و متدهای NumPy به همین صورت عمل می کند:
>>> np.median(a, axis=0) array([4., 3., 1.]) >>> np.median(a, axis=1) array([1., 2., 4., 8., 1.]) >>> a.var(axis=0, ddof=1) array([ 37.2, 121.2, 1.7]) >>> a.var(axis=1, ddof=1) array([ 0., 1., 13., 151., 75.]) |
شما میانه ها و تغییرات نمونه را برای همه ستون ها (محور=0) و سطرها (محور=1) آرایه a دارید. هنگامی که با توابع آمار SciPy کار می کنید، این بسیار شبیه است. اما به یاد داشته باشید که در این مورد، مقدار پیش فرض برای محور 0 است:
>>> scipy.stats.gmean(a) # Default: axis=0 array([4. , 3.73719282, 1.51571657]) >>> scipy.stats.gmean(a, axis=0) array([4. , 3.73719282, 1.51571657]) |
اگر محور را حذف کنید یا axis=0 را ارائه کنید، نتیجه را در تمام سطرها، یعنی برای هر ستون دریافت خواهید کرد. به عنوان مثال، ستون اول a دارای میانگین هندسی 4.0 و غیره است. اگر axis=1 را مشخص کنید، محاسبات را در تمام ستون ها دریافت خواهید کرد، یعنی برای هر سطر:
>>> scipy.stats.gmean(a, axis=1) array([1. , 1.81712059, 4.16016765, 9.52440631, 2.5198421 ]) |
در این مثال، میانگین هندسی ردیف اول a 1.0 است. برای ردیف دوم، تقریباً 1.82 است و غیره. اگر آماری را برای کل مجموعه داده می خواهید، باید axis=None را ارائه دهید:
>>> scipy.stats.gmean(a, axis=none) 2.829705017016332 |
میانگین هندسی همه آیتم های آرایه a تقریباً 2.83 است. شما می توانید خلاصه آمار پایتون را با یک فراخوانی یک تابع برای داده های دوبعدی با scipy.stats.describe () دریافت کنید. این شبیه به آرایه های 1 بعدی کار می کند، اما باید مراقب محور پارامتر باشید:
>>> scipy.stats.describe(a, axis=None, ddof=1, bias=False) DescribeResult(nobs=15, minmax=(1, 27), mean=5.4, variance=53.40000000000001, skewness=2.264965290423389, kurtosis=5.212690982795767) >>> scipy.stats.describe(a, ddof=1, bias=False) # Default: axis=0 DescribeResult(nobs=5, minmax=(array([1, 1, 1]), array([16, 27, 4])), mean=array([6.2, 8.2, 1.8]), variance=array([ 37.2, 121.2, 1.7]), skewness=array([1.32531471, 1.79809454, 1.71439233]), kurtosis=array([1.30376344, 3.14969121, 2.66435986])) >>> scipy.stats.describe(a, axis=1, ddof=1, bias=False) DescribeResult(nobs=3, minmax=(array([1, 1, 2, 4, 1]), array([ 1, 3, 9, 27, 16])), mean=array([ 1., 2., 5., 13., 6.]), variance=array([ 0., 1., 13., 151., 75.]), skewness=array([0. , 0. , 1.15206964, 1.52787436, 1.73205081]), kurtosis=array([-3. , -1.5, -1.5, -1.5, -1.5])) |
هنگامی که axis=None را ارائه می کنید، خلاصه تمام داده ها را دریافت می کنید. اکثر نتایج اسکالر هستند. اگر axis=0 را تنظیم کنید یا آن را حذف کنید، مقدار بازگشتی خلاصه ای برای هر ستون است. بنابراین، بیشتر نتایج، آرایههایی هستند که تعداد آیتمها برابر با تعداد ستونها است. اگر axis=1 را تنظیم کنید، سپس describe () خلاصه تمام سطرها را برمی گرداند. می توانید مقدار خاصی را از خلاصه با علامت نقطه بدست آورید:
>>> result = scipy.stats.describe(a, axis=1, ddof=1, bias=False) >>> result.mean array([ 1., 2., 5., 13., 6.]) |
بدین ترتیب می توانید خلاصه آماری برای یک آرایه دو بعدی را با یک فراخوانی تک تابع مشاهده کنید.
دیتا فریم در پایتون
کلاس DataFrame یکی از انواع داده های اساسی پانداها است. کار با آن بسیار راحت است زیرا دارای برچسب هایی برای سطرها و ستون ها است. از آرایه a استفاده کنید و یک DataFrame ایجاد کنید:
>>> row_names = [‘first’, ‘second’, ‘third’, ‘fourth’, ‘fifth’] >>> col_names = [‘A’, ‘B’, ‘C’] >>> df = pd.DataFrame(a, index=row_names, columns=col_names) >>> df A B C first 1 1 1 second 2 3 1 third 4 9 2 fourth 8 27 4 fifth 16 1 1 |
در عمل، نام ستون ها مهم است و باید توصیفی باشد. نام سطرها گاهی اوقات به صورت خودکار به صورت 0، 1 و غیره مشخص می شود. شما می توانید آنها را به صراحت با شاخص پارامتر مشخص کنید، اگرچه در صورت تمایل می توانید ایندکس را حذف کنید. روشهای DataFrame بسیار شبیه به روشهای سری هستند، اگرچه رفتار متفاوت است. اگر روشهای آمار پایتون را بدون آرگومان فراخوانی کنید، DataFrame نتایج را برای هر ستون برمیگرداند:
>>> df.mean() A 6.2 B 8.2 C 1.8 dtype: float64 >>> df.var() A 37.2 B 121.2 C 1.7 dtype: float64 |
چیزی که به دست می آورید یک سری جدید است که نتایج را نگه می دارد. در این حالت، سری میانگین و واریانس را برای هر ستون نگه میدارد. اگر نتایج را برای هر ردیف میخواهید، کافیست پارامتر axis=1 را مشخص کنید:
>>> df.mean(axis=1) first 1.0 second 2.0 third 5.0 fourth 13.0 fifth 6.0 dtype: float64 >>> df.var(axis=1) first 0.0 second 1.0 third 13.0 fourth 151.0 fifth 75.0 dtype: float64 |
نتیجه یک سری با مقدار مورد نظر برای هر ردیف است. برچسب های “اول”، “دوم” و ….. به ردیف های مختلف اشاره دارند. شما می توانید هر ستون از یک DataFrame را به صورت زیر جدا کنید:
>>> df[‘A’] first 1 second 2 third 4 fourth 8 fifth 16 Name: A, dtype: int64 |
اکنون ستون ‘A’ را به شکل یک شی سری دارید و می توانید روش های مناسب را اعمال کنید:
>>> df[‘A’].mean() 6.2 >>> df[‘A’].var() 37.20000000000001 |
به این ترتیب می توانید آمار یک ستون را بدست آورید. گاهی اوقات، ممکن است بخواهید از DataFrame به عنوان یک آرایه NumPy استفاده کنید و برخی از عملکردها را به آن اعمال کنید. دریافت تمام دادهها از DataFrame با .values یا .to_numpy():
>>> df.values array([[ 1, 1, 1], [ 2, 3, 1], [ 4, 9, 2], [ 8, 27, 4], [16, 1, 1]]) >>> df.to_numpy() array([[ 1, 1, 1], [ 2, 3, 1], [ 4, 9, 2], [ 8, 27, 4], [16, 1, 1]]) |
df.values و df.to_numpy() یک آرایه NumPy با تمام موارد از DataFrame بدون برچسب سطر و ستون به شما می دهند. توجه داشته باشید که df.to_numpy() انعطاف پذیرتر است زیرا می توانید نوع داده آیتم ها را مشخص کنید و اینکه آیا می خواهید از داده های موجود استفاده کنید یا آن را کپی کنید. مانند Series، اشیاء DataFrame دارای متد .describe() هستند که DataFrame دیگری را با خلاصه آماری برای همه ستون ها برمی گرداند:
>>> df.describe() A B C count 5.00000 5.000000 5.00000 mean 6.20000 8.200000 1.80000 std 6.09918 11.009087 1.30384 min 1.00000 1.000000 1.00000 25% 2.00000 1.000000 1.00000 50% 4.00000 3.000000 1.00000 75% 8.00000 9.000000 2.00000 max 16.00000 27.000000 4.00000 |
خلاصه شامل نتایج زیر است:
- count: تعداد موارد در هر ستون
- میانگین: میانگین هر ستون
- std: انحراف معیار
- min و max: حداقل و حداکثر مقادیر
- 25%، 50% و 75%: صدک ها
اگر میخواهید شی DataFrame حاصل شامل صدکهای دیگر باشد، باید مقدار صدکهای پارامتر اختیاری را مشخص کنید. شما می توانید به هر یک از موارد خلاصه به صورت زیر دسترسی داشته باشید:
>>> df.describe().at[‘mean’، ‘A’] 6.2 >>> df.describe().at[‘50%’، ‘B’] 3.0 |
بدین ترتیب میتوانید آمار توصیفی پایتون را در یک شیء سری با یک فراخوانی متد پاندا دریافت کنید.
ترسیم نمودار در پایتون
علاوه بر محاسبه مقادیر عددی مانند میانگین، میانه یا واریانس، میتوانید از روشهای بصری برای ارائه، توصیف و خلاصه کردن دادهها استفاده کنید. در این بخش، نحوه نمایش داده های خود را به صورت بصری با استفاده از نمودارهای زیر یاد خواهید گرفت:
- نمودار جعبه ای
- هیستوگرام ها
- نمودارهای دایره ای
- نمودار میله
- نمودارهای X-Y
- نقشه های حرارتی
matplotlib.pyplot یک کتابخانه بسیار راحت و پرکاربرد است، اگرچه این تنها کتابخانه Python نیست که برای این منظور در دسترس است. شما می توانید آن را به این صورت وارد کنید:
>>> import matplotlib.pyplot as plt >>> plt.style.use(‘ggplot’) |
اکنون، matplotlib.pyplot را وارد کرده و آماده استفاده کرده اید. بیانیه دوم با انتخاب رنگ ها، عرض خطوط و سایر عناصر سبک، سبک طرح های شما را تعیین می کند. اگر از تنظیمات سبک پیشفرض راضی هستید، میتوانید این موارد را حذف کنید. توجه: این بخش بر نمایش داده ها تمرکز دارد و تنظیمات سبک را به حداقل می رساند. پیوندهایی به اسناد رسمی برای روالهای استفاده شده از matplotlib.pyplot خواهید دید، بنابراین میتوانید گزینههایی را که در اینجا نمیبینید بررسی کنید. برای کار با داده ها از اعداد شبه تصادفی استفاده خواهید کرد. برای اینکه بتوانید این بخش را درک کنید نیازی به دانش اعداد تصادفی ندارید. شما فقط به تعدادی اعداد دلخواه نیاز دارید و ژنراتورهای شبه تصادفی ابزار مناسبی برای بدست آوردن آنها هستند. ماژول np.random آرایه هایی از اعداد شبه تصادفی تولید می کند:
- اعداد توزیع شده معمولی با np.random.randn() تولید می شوند.
- اعداد صحیح توزیع شده یکنواخت با np.random.randint() تولید می شوند.
NumPy 1.17 ماژول دیگری را برای تولید اعداد شبه تصادفی معرفی کرد. برای کسب اطلاعات بیشتر در مورد آن، اسناد رسمی را بررسی کنید.
چگونه در پایتون نمودار جعبه ای ترسیم کنیم؟
نمودار جعبه ابزاری عالی برای نمایش آمار توصیفی یک مجموعه داده به صورت بصری است. این می تواند محدوده، محدوده بین چارکی، میانه، حالت، نقاط پرت و همه چارک ها را نشان دهد. ابتدا مقداری داده ایجاد کنید تا با نمودار کادر نمایش داده شود:
>>> np.random.seed(seed=0) >>> x = np.random.randn(1000) >>> y = np.random.randn(100) >>> z = np.random.randn(10) |
عبارت اول، seed مولد اعداد تصادفی NumPy را با seed() تنظیم می کند، بنابراین می توانید هر بار که کد را اجرا می کنید، همان نتایج را دریافت کنید. نیازی نیست که seed را تنظیم کنید، اما اگر این مقدار را مشخص نکنید، هر بار نتایج متفاوتی دریافت خواهید کرد. عبارات دیگر سه آرایه NumPy با اعداد شبه تصادفی توزیع شده معمولی تولید می کنند. x به آرایه ای با 1000 آیتم، y 100 و z شامل 10 آیتم اشاره دارد. اکنون که داده هایی برای کار با آنها دارید، می توانید از .boxplot() برای بدست آوردن نمودار جعبه استفاده کنید:
fig, ax = plt.subplots() ax.boxplot((x, y, z), vert=False, showmeans=True, meanline=True, labels=(‘x’, ‘y’, ‘z’), patch_artist=True, medianprops={‘linewidth’: 2, ‘color’: ‘purple’}, meanprops={‘linewidth’: 2, ‘color’: ‘red’}) plt.show() |
پارامترهای .boxplot() موارد زیر را تعریف می کنند:
- x داده های شماست.
- vert جهت نمودار را در حالت False بر روی افقی قرار می دهد. جهت پیش فرض عمودی است.
- showmeans میانگین داده های شما را در حالت True نشان می دهد.
- خط متوسط وقتی True میانگین را به عنوان یک خط نشان می دهد. نمایش پیش فرض یک نقطه است.
- labels: برچسب های داده های شما.
- patch_artist نحوه رسم نمودار را تعیین می کند.
- medianprops نشان دهنده ویژگی های خطی است که نشان دهنده میانه است.
- meanprops ویژگی های خط یا نقطه نشان دهنده میانگین را نشان می دهد.
پارامترهای دیگری نیز وجود دارد، اما تجزیه و تحلیل آن ها خارج از محدوده این آموزش است. کد بالا تصویری مانند این را تولید می کند:
شما می توانید سه نمودار جعبه را ببینید. هر یک از آنها مربوط به یک مجموعه داده واحد (x، y، یا z) است و موارد زیر را نشان می دهد:
- میانگین خط چین قرمز است.
- میانه خط بنفش است.
- چارک اول لبه سمت چپ مستطیل بنفش است.
- ربع سوم لبه سمت راست مستطیل بنفش است.
- محدوده بین چارکی طول مستطیل بنفش است.
- محدوده شامل همه چیز از چپ به راست است.
- نقاط پرت، نقطه های سمت چپ و راست هستند.
نمودار جعبه می تواند اطلاعات زیادی را در یک شکل نشان دهد!
نمودار هیستوگرام در پایتون
هیستوگرام ها به ویژه زمانی مفید هستند که تعداد زیادی مقادیر منحصر به فرد در یک مجموعه داده وجود داشته باشد. هیستوگرام مقادیر یک مجموعه داده مرتب شده را به بازه هایی تقسیم می کند که به آنها bin نیز می گویند. اغلب، همه سطلها دارای عرض مساوی هستند، اگرچه لازم نیست اینطور باشد. به مقادیر کران پایین و بالایی یک سطل، لبه bin می گویند. فراوانی یک مقدار واحد است که مربوط به هر bin است. این تعداد عناصر مجموعه داده با مقادیر بین لبه های bin است. طبق قرارداد، همه سطل ها به جز سمت راست ترین سطل نیمه باز هستند. آنها شامل مقادیر برابر با کران های پایین هستند، اما مقادیر برابر با کران های بالایی را حذف می کنند. سمت راست ترین bin بسته است زیرا شامل هر دو کران است. اگر یک مجموعه داده را با لبه های bin 0، 5، 10، و 15 تقسیم کنید، سه سطل وجود دارد:
- سطل اول و سمت چپ حاوی مقادیر بزرگتر یا مساوی 0 و کمتر از 5 است.
- bin دوم حاوی مقادیر بزرگتر یا مساوی 5 و کمتر از 10 است.
- سطل سوم و سمت راست حاوی مقادیر بزرگتر یا مساوی 10 و کمتر یا مساوی 15 است.
تابع np.histogram() یک راه راحت برای دریافت داده برای هیستوگرام است:
>>> hist, bin_edges = np.histogram(x, bins=10) >>> hist array([ 9, 20, 70, 146, 217, 239, 160, 86, 38, 15]) >>> bin_edges array([-3.04614305, -2.46559324, -1.88504342, -1.3044936 , -0.72394379, -0.14339397, 0.43715585, 1.01770566, 1.59825548, 2.1788053 , 2.75935511]) |
آرایه را با داده های شما و تعداد (یا لبه های) bin ها می گیرد و دو آرایه NumPy را برمی گرداند:
- Hist حاوی فرکانس یا تعداد موارد مربوط به هر bin است.
- bin_edges شامل لبه ها یا مرزهای bin است.
هیستوگرام() چه چیزی را محاسبه می کند، .hist() می تواند به صورت گرافیکی نشان دهد:
fig, ax = plt.subplots() ax.hist(x, bin_edges, cumulative=False) ax.set_xlabel(‘x’) ax.set_ylabel(‘Frequency’) plt.show() |
اولین آرگومان .hist() دنباله ای با داده های شما است. آرگومان دوم لبه های bin ها را تعریف می کند. سومین گزینه ایجاد هیستوگرام با مقادیر تجمعی را غیرفعال می کند. کد بالا شکلی مانند این را ایجاد می کند:
می توانید لبه های سطل را در محور افقی و فرکانس ها را در محور عمودی ببینید. اگر آرگومان cumulative=True به .hist():
fig, ax = plt.subplots() ax.hist(x, bin_edges, cumulative=True) ax.set_xlabel(‘x’) ax.set_ylabel(‘Frequency’) plt.show() |
این کد شکل زیر را به دست می دهد:
هیستوگرام را با مقادیر تجمعی نشان می دهد. فرکانس سطل اول و سمت چپ تعداد آیتم های این سطل است. فرکانس سطل دوم مجموع تعداد آیتم های بن اول و دوم است. سطل های دیگر از همین الگو پیروی می کنند. در نهایت، بسامد آخرین و سمت راست ترین bin، تعداد کل آیتم های مجموعه داده است (در این مورد، 1000). همچنین می توانید مستقیماً با استفاده از matplotlib در پس زمینه، یک هیستوگرام با pd.Series.hist() رسم کنید.
نمودار جعبه ای در پایتون
نمودارهای دایره ای داده ها را با تعداد کمی برچسب و فرکانس های نسبی نشان می دهند. آنها حتی با برچسب هایی که قابل سفارش نیستند (مانند داده های اسمی) به خوبی کار می کنند. نمودار دایره ای دایره ای است که به چند برش تقسیم می شود. هر تکه مربوط به یک برچسب مجزا از مجموعه داده است و دارای ناحیه ای متناسب با فرکانس نسبی مرتبط با آن برچسب است. بیایید داده های مرتبط با سه برچسب را تعریف کنیم:
>>> x، y، z = 128، 256، 1024 |
اکنون یک نمودار دایره ای با .pie():
fig, ax = plt.subplots() ax.pie((x, y, z), labels=(‘x’, ‘y’, ‘z’), autopct=’%1.1f%%’) plt.show() |
اولین آرگومان .pie() داده های شما است و دومی دنباله برچسب های مربوطه است. autopct فرمت فرکانس های نسبی نشان داده شده در شکل را تعریف می کند. شکلی به شکل زیر دریافت خواهید کرد:
نمودار دایره ای x را به عنوان کوچکترین قسمت دایره، y را به عنوان بزرگترین قسمت بعدی و سپس z را به عنوان بزرگترین قسمت نشان می دهد. درصدها اندازه نسبی هر مقدار را در مقایسه با مجموع آنها نشان می دهد.
نمودار میله ای در پایتون
نمودارهای میله ای همچنین داده هایی را نشان می دهند که با برچسب های داده شده یا مقادیر عددی گسسته مطابقت دارند. آنها می توانند جفت داده ها را از دو مجموعه داده نشان دهند. آیتم های یک مجموعه برچسب ها هستند، در حالی که آیتم های مربوط به مجموعه دیگر فرکانس آنها هستند. به صورت اختیاری، آنها می توانند خطاهای مربوط به فراوانی ها را نیز نشان دهند. نمودار میله ای مستطیل های موازی به نام میله را نشان می دهد. هر نوار مربوط به یک برچسب واحد است و دارای ارتفاعی متناسب با فرکانس یا فرکانس نسبی برچسب آن است. بیایید سه مجموعه داده تولید کنیم که هر کدام دارای 21 مورد است:
>>> x = np.arange(21) >>> y = np.random.randint(21, size=21) >>> err = np.random.randn(21) |
شما از np.arange() برای بدست آوردن x یا آرایه اعداد صحیح متوالی از 0 تا 20 استفاده می کنید. از این برای نشان دادن برچسب ها استفاده خواهید کرد. y آرایه ای از اعداد صحیح تصادفی توزیع شده یکنواخت است، همچنین بین 0 تا 20. این آرایه فرکانس ها را نشان می دهد. err شامل اعداد ممیز شناور معمولی توزیع شده است که همان خطاها هستند. این مقادیر اختیاری هستند. اگر میل های عمودی می خواهید با .bar() یا اگر میل های افقی می خواهید با .barh() می توانید یک نمودار میله ای ایجاد کنید:
fig, ax = plt.subplots()) ax.bar(x, y, yerr=err) ax.set_xlabel(‘x’) ax.set_ylabel(‘y’) plt.show() |
این کد باید شکل زیر را تولید کند:
ارتفاع میله های قرمز با فرکانس y مطابقت دارد، در حالی که طول خطوط سیاه خطاها را نشان می دهد. اگر نمیخواهید خطاها را وارد کنید، پارامتر yerr .bar را حذف کنید.
نمودار های X-Y
نمودار x-y یا نمودار پراکنده نشان دهنده جفت داده ها از دو مجموعه داده است. محور افقی x مقادیر مجموعه x را نشان می دهد، در حالی که محور عمودی مقادیر مربوط به مجموعه y را نشان می دهد. شما می توانید به صورت اختیاری خط رگرسیون و ضریب همبستگی را وارد کنید. بیایید دو مجموعه داده تولید کنیم و رگرسیون خطی را با scipy.stats.linregress():
>>> x = np.arange(21) >>> y = 5 + 2 * x + 2 * np.random.randn(21) >>> slope, intercept, r, *__ = scipy.stats.linregress(x, y) >>> line = f’Regression line: y={intercept:.2f}+{slope:.2f}x, r={r:.2f}’ |
مجموعه داده x دوباره آرایه ای با اعداد صحیح از 0 تا 20 است. y به عنوان یک تابع خطی از x با مقداری نویز تصادفی تحریف شده محاسبه می شود. linregress چندین مقدار را برمی گرداند. شما به شیب و قطع خط رگرسیون و همچنین ضریب همبستگی r نیاز دارید. سپس می توانید .plot() را برای بدست آوردن نمودار x-y اعمال کنید:
fig, ax = plt.subplots() ax.plot(x, y, linewidth=0, marker=’s’, label=’Data points’) ax.plot(x، intercept + slope * x، label=line) ax.set_xlabel(‘x’) ax.set_ylabel(‘y’) ax.legend(facecolor=’white’) plt.show() |
نتیجه کد بالا این شکل است:
می توانید نقاط داده (جفت x-y) را به صورت مربع قرمز و همچنین خط رگرسیون آبی را ببینید.
هیت مپ (HeatMap) یا نقشه حرارتی در پایتون
برای نشان دادن بصری یک ماتریس می توان از یک نقشه حرارتی استفاده کرد. رنگ ها اعداد یا عناصر ماتریس را نشان می دهند. نقشه های حرارتی به ویژه برای نشان دادن ماتریس های کوواریانس و همبستگی مفید هستند. شما می توانید نقشه حرارتی یک ماتریس کوواریانس را با .imshow ():
matrix = np.cov(x, y).round(decimals=2) fig, ax = plt.subplots() ax.imshow(matrix) ax.grid(False) ax.xaxis.set(ticks=(0, 1), ticklabels=(‘x’, ‘y’)) ax.yaxis.set(ticks=(0, 1), ticklabels=(‘x’, ‘y’)) ax.set_ylim(1.5, -0.5) for i in range(2): for j in range(2): ax.text(j, i, matrix[i, j], ha=’center’, va=’center’, color=’w’) plt.show() |
در اینجا، نقشه حرارتی حاوی برچسب های ‘x’ و ‘y’ و همچنین اعداد از ماتریس کوواریانس است. رقمی مانند این را دریافت خواهید کرد:
فیلد زرد نشان دهنده بزرگترین عنصر از ماتریس 130.34 است، در حالی که قسمت بنفش مربوط به کوچکترین عنصر 38.5 است. مربع های قرمز و سبز رنگ در بین آن ها با مقدار 69.9 مرتبط است. شما می توانید نقشه حرارتی ماتریس ضریب همبستگی را با همان منطق بدست آورید:
matrix = np.corrcoef(x, y).round(decimals=2) fig, ax = plt.subplots() ax.imshow(matrix) ax.grid(False) ax.xaxis.set(ticks=(0, 1), ticklabels=(‘x’, ‘y’)) ax.yaxis.set(ticks=(0, 1), ticklabels=(‘x’, ‘y’)) ax.set_ylim(1.5, -0.5) for i in range(2): for j in range(2): ax.text(j, i, matrix[i, j], ha=’center’, va=’center’, color=’w’) plt.show() |
نتیجه شکل زیر است:
رنگ زرد نشان دهنده مقدار 1.0 و رنگ بنفش 0.99 است.
اکنون شما با مقادیری که مجموعه داده ها را توصیف و خلاصه می کند و نحوه محاسبه آنها در پایتون را می دانید. دریافت آمار توصیفی با کد پایتون خالص امکان پذیر است، اما به ندرت لازم است. معمولاً از برخی از کتابخانه های ایجاد شده مخصوصاً برای این منظور استفاده می کنید:
- از آمار پایتون برای مهمترین توابع آمار پایتون استفاده کنید.
- از NumPy برای مدیریت کارآمد آرایه ها استفاده کنید.
- از SciPy برای روالهای آماری اضافی پایتون برای آرایههای NumPy استفاده کنید.
- از پانداها برای کار با مجموعه داده های برچسب دار استفاده کنید.
- از Matplotlib برای تجسم داده ها با نمودارها، نمودارها و هیستوگرام ها استفاده کنید.
فاطمه –
سلام این دوره چند ساعت می باشد؟ بطور آفلاین با دانلود فایل هم میشه دسترسی داشت یا باید آنلاین آموزش ها رو دنبال کنیم؟ سرفصل دقیق این دوره در بخش توضیحات مثل دوره های دیگه که جدول کشیده شده نبود!
محمد صادق کیانی –
سلام
دسترسی به دوره به این صورت است که ابتدا نرم افزار اسپات پلیر را نصب می کنید
سپس لایسنس دوره را نصب می کنید و به همه جلسات دسترسی خواهید داشت.
جسلات و اطلاعات در اپدیت سایت به زودی گذاشته می شود مرسی
هدیه صداقت –
سلام اقای کیانی
سوالم اینه که شما الان دوره پایتون را پیشنهاد می دید با دوره R?
محمد صادق کیانی –
حتما پایتون را
چون پایتون الان امکانات زیادی داره و زبان اول در دنیا است