✳️ بخش اول، آموزش Numpy
🔸 معرفی Numpy: کتابخانهی numpy کتابخانهایست برای کار با دادههای ماتریسی که عموماً حجم بالایی دارند و محاسبات آنها مبتنی بر جبر خطی انجام میشود.
———————————————————————-
تبدیل لیست به آرایه numpy:
تغییر اندازه ماتریس:
ساخت ماتریس از عدد یک:
ساخت ماتریس از عدد صفر:
💡 تمامی مقادیر موجود در numpy باید از یک دیتاتایپ باشند، و معمولا هم از float استفاده میشود.
برگرداندن قطر اصلی ماتریس:
تکرار عناصر لیست به تعداد دلخواه:
چسباندن دو ماتریس (مجموعه داده) بصورت vertical به همدیگر:
چسباندن دو ماتریس (مجموعه داده) بصورت horizontal به همدیگر:
ضرب داخلی درایه های یک ماتریس در ماتریس دیگر، و جمع مقادیر آنها:
ترانهادهی ماتریس (سطری بخون، ستونی بنویس):
جمع درایه های یک ماتریس:
بزرگترین درایه درون ماتریس:
کوچکترین درایه درون ماتریس:
ایندکس بزرگترین درایه درون ماتریس:
ایندکس کوچکترین درایه درون ماتریس:
نحوه انتخاب سطر و ستون در ماتریس:
*در numpy نمیشه یک مقدار درون ماتریس float باشه و یک مقدار دیگه boolean باشه.
ساختن یه ماتریس با اندازه 4 در سه از اعداد رندوم بین 0 تا 10:
*اگر از تابع seed در numpy استفاده کنیم یک ماتریس از اعداد رندوم تکرار پذیر به ما میده. یعنی اگه کد موردنظر رو توی هر سیستمی اجرا کنیم همون مقدار اولیه که به صورت رندوم ایجاد شده برگردانده میشه. (برای تکرار پذیر کردن آزمایش ها به درد میخوره). عددی که داخل seed میزاریم میتونه هر چیزی باشه.
🔸 معرفی Numpy: کتابخانهی numpy کتابخانهایست برای کار با دادههای ماتریسی که عموماً حجم بالایی دارند و محاسبات آنها مبتنی بر جبر خطی انجام میشود.
———————————————————————-
تبدیل لیست به آرایه numpy:
narr = numpy.array([1, 2, 3])
تغییر اندازه ماتریس:
numpy.resize(narr, (4, 4))
---> array([[1, 2, 3, 1],
[2, 3, 1, 2],
[3, 1, 2, 3],
[1, 2, 3, 1]])
ساخت ماتریس از عدد یک:
matrix = numpy.ones((5, 4))
ساخت ماتریس از عدد صفر:
matrix = numpy.zeros((4, 4))
💡 تمامی مقادیر موجود در numpy باید از یک دیتاتایپ باشند، و معمولا هم از float استفاده میشود.
برگرداندن قطر اصلی ماتریس:
numpy.diag(narr)
تکرار عناصر لیست به تعداد دلخواه:
numpy.repeat([4, 3, 2], 5)
---> array([4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2])
چسباندن دو ماتریس (مجموعه داده) بصورت vertical به همدیگر:
numpy.vstack([m1, m2])
چسباندن دو ماتریس (مجموعه داده) بصورت horizontal به همدیگر:
numpy.hstack([m1, m2])
ضرب داخلی درایه های یک ماتریس در ماتریس دیگر، و جمع مقادیر آنها:
x.dot(y)
ترانهادهی ماتریس (سطری بخون، ستونی بنویس):
narr.T
جمع درایه های یک ماتریس:
narr.sum()
بزرگترین درایه درون ماتریس:
narr.max()
کوچکترین درایه درون ماتریس:
narr.min()
ایندکس بزرگترین درایه درون ماتریس:
narr.argmax()
ایندکس کوچکترین درایه درون ماتریس:
narr.argmin()
نحوه انتخاب سطر و ستون در ماتریس:
narr = numpy.array([[1, 2, 3],
0, 0, 0],
[0, 0, 0]])
narr[0:1, 2]
---> array([3])
narr[0:1, 2][0]
---> 3
*Hint: narr[ستون های مورد نظر , سطر های مورد نظر]
*در numpy نمیشه یک مقدار درون ماتریس float باشه و یک مقدار دیگه boolean باشه.
ساختن یه ماتریس با اندازه 4 در سه از اعداد رندوم بین 0 تا 10:
tarr = numpy.random.randint(0, 10, (4, 3))
tarr
---> array([[2, 0, 2],
[2, 9, 4],
[9, 7, 2],
[5, 5, 2]])
*اگر از تابع seed در numpy استفاده کنیم یک ماتریس از اعداد رندوم تکرار پذیر به ما میده. یعنی اگه کد موردنظر رو توی هر سیستمی اجرا کنیم همون مقدار اولیه که به صورت رندوم ایجاد شده برگردانده میشه. (برای تکرار پذیر کردن آزمایش ها به درد میخوره). عددی که داخل seed میزاریم میتونه هر چیزی باشه.
numpy.random.seed(125)
✳️ بخش دوم، آموزش Pandas
🔹 معرفی Pandas: کتابخانهی pandas برای کار با مجموعه دادههای حجیم در ساختاری شبیه به جبر رابطه ای و SQL عمل میکند. این کتابخانه مبتنی بر کتابخانهی numpy است.
———————————————————————-
🔻 فایلهای csv: این فایل ها، همون فایل های اکسل هستن که به صورت متنی کار میکنند. سطرها با enter از همدیگه جدا میشوند و ستون ها با comma. معمولا سطر اول سر ستون ها هستن و داده ها از سطر دوم شروع میشوند. هر ستون باید فقط یک نوع دیتا تایپ داشته باشد.
خواندن یک فایل csv توسط pandas:
تبدیل لیست به series:
تبدیل دیکشنری پایتون به series:
برگرداندن مقدار اندیس موردنظر:
*در pandas series میتوانیم کلید تکراری داشته باشیم.
*اگر از iloc استفاده کنیم حتما میبایست عدد بهش بدیم، ولی اگه از loc استفاده کنیم میتوانیم نام کلید رو هم بهش بفرستیم.
🔸 استفاده از حلقه در numpy و pandas اشتباه هست چون این دو ساخته شده که از حلقه استفاده نکنیم.
حذف یک سطر یا ستون از دیتافریم:
نشان دادن چند سطر اول و آخر دیتافریم:
نشان دادن تعداد مقادیر درون ستون ها:
اطلاعات آماری درمورد ستون ها:
اطلاعات کلی درمورد ستون ها:
جمع کردن مقادیر ستون ها:
ایجاد یک ستون جدید در دیتافریم و چسباندن مقدار دو ستون به یکدیگر:
مشاهده تایپ ها (انواع مقادیر) یک ستون:
تعداد مقادیر هر نوع در یک ستون:
گروه بندی بر اساس یک ستون و بدست آوردن مینیموم ستونی دیگر به تفکیک گروه بندی ابتدایی:
🔹 فانکشن های lambda در پایتون، فانکشنهایی بودند که همان لحظه تولید میشدند و همان لحظه از بین میرفتند.
رنج قیمت هر محله:
مرتب کردن بر اساس یک ستون خاص:
اعمال کردن تابعی خاص روی ستون ها:
برگرداندن سطر آخر:
تقاطع زدن بر اساس دو ستون:
ایجاد جدول میانی به ترتیب سطر و ستون (Pivot Table) [میانگین سن و زمان بر اساس شغل]:
🔹 معرفی Pandas: کتابخانهی pandas برای کار با مجموعه دادههای حجیم در ساختاری شبیه به جبر رابطه ای و SQL عمل میکند. این کتابخانه مبتنی بر کتابخانهی numpy است.
———————————————————————-
🔻 فایلهای csv: این فایل ها، همون فایل های اکسل هستن که به صورت متنی کار میکنند. سطرها با enter از همدیگه جدا میشوند و ستون ها با comma. معمولا سطر اول سر ستون ها هستن و داده ها از سطر دوم شروع میشوند. هر ستون باید فقط یک نوع دیتا تایپ داشته باشد.
خواندن یک فایل csv توسط pandas:
import pandas as pd
data = pd.read_csv('example.csv')
تبدیل لیست به series:
animals = ['Tiger', 'Bear', 'Moose']
p_animals = pd.Series(animals)
p_animals
--->
0 Tiger
1 Bear
2 Moose
dtype: object
تبدیل دیکشنری پایتون به series:
animals = {
'n1': 'Tiger',
'n2': 'Bear',
'n3': None
}
p_animals = pd.Series(animals)
p_animals
--->
n1 Tiger
n2 Bear
n3 None
dtype: objectبرگرداندن مقدار اندیس موردنظر:
print(p_animals.iloc[2])
---> None
*Hint: iloc is Index Location
*در pandas series میتوانیم کلید تکراری داشته باشیم.
*اگر از iloc استفاده کنیم حتما میبایست عدد بهش بدیم، ولی اگه از loc استفاده کنیم میتوانیم نام کلید رو هم بهش بفرستیم.
p_animals.loc['n1']
---> Tiger
🔸 استفاده از حلقه در numpy و pandas اشتباه هست چون این دو ساخته شده که از حلقه استفاده نکنیم.
حذف یک سطر یا ستون از دیتافریم:
df.drop('name', inplace=True)
نکته: اگر inplace=True باشد، تغییرات روی دیتافریم اصلی انجام میشود.نشان دادن چند سطر اول و آخر دیتافریم:
df.head()
df.tail()
نشان دادن تعداد مقادیر درون ستون ها:
df.count()
اطلاعات آماری درمورد ستون ها:
df.describe()
اطلاعات کلی درمورد ستون ها:
df.info()
جمع کردن مقادیر ستون ها:
df.sum()
ایجاد یک ستون جدید در دیتافریم و چسباندن مقدار دو ستون به یکدیگر:
df['SA'] = df['Suburb'] + ' - ' + df['Address']
df.head()
مشاهده تایپ ها (انواع مقادیر) یک ستون:
df['Type'].unique()
---> array(['h', 't', 'u'], dtype=object)
تعداد مقادیر هر نوع در یک ستون:
df['Type'].value_counts()
--->
h 12095
u 4296
t 2005
Name: Type, dtype: int64
گروه بندی بر اساس یک ستون و بدست آوردن مینیموم ستونی دیگر به تفکیک گروه بندی ابتدایی:
df.groupby('Type')['Price'].min() # mean / sum / min / max / std🔹 فانکشن های lambda در پایتون، فانکشنهایی بودند که همان لحظه تولید میشدند و همان لحظه از بین میرفتند.
رنج قیمت هر محله:
df.groupby('suburb')['Price'].aggregate(lambda x: x.max() - x.min())مرتب کردن بر اساس یک ستون خاص:
df.sort_values(by = duration, ascending = False).head()
اعمال کردن تابعی خاص روی ستون ها:
df.apply(np.max)
برگرداندن سطر آخر:
df[-1:]
تقاطع زدن بر اساس دو ستون:
pd.crosstab(df["y"], df["marital"])
ایجاد جدول میانی به ترتیب سطر و ستون (Pivot Table) [میانگین سن و زمان بر اساس شغل]:
df.pivot_table(["age", "duration"], ["job"], aggfunc = "mean").head()
✳️ بخش سوم، آموزش EDA (تحلیل اکتشافی داده ها) و آمار (آمار توصیفی و آمار تفسیری)
———————————————————————-
🔸 رسم نمودار scatter matrix روی ستون ها و بررسی اونها دو به دو با همدیگر:
🔹 رسم نمودار histogram روی ستون مورد نظر (نمودار فراوانی در هر دسته):
▫️ رسم نمودار histogram روی کل دیتافریم:
🟣 انجام تحلیل های مربوط به آمار توصیفی روی داده های پروازی)
🔻 بدست آوردن میانگین تاخیر در رسیدن به مقصد:
▫️ یکی از مشکلات اساسی میانگین، داده های outlier یا پرت هستند که میانگین رو به سمت خودشون میکشند. داده outlier باعث میشه که باقی داده ها نزدیک به همدیگر نباشند.
🟠 روش های مقابله با داده های outlier)
- میانگین اصلاح شده (Trimmed Mean): به عنوان مثال، ده درصد بالای داده ها و ده درصد پایین داده ها از لحاظ تعداد رو حذف کن، و از 80 درصد وسط داده ها میانگین بگیر. کد Trimmed Mean در پکیج Scipy موجود است. (Scipy یک پکیج است که روی مباحث آماری کار میکند و توابع آماری فراوانی درون خود دارد.)
- میتونیم از median هم استفاده کنیم. median داده هارو از کوچک به بزرگ sort میکنه و عدد وسط داده ها که نصف داده ها ازون بیشتر و نصف داده ها ازون کمتر هستن رو بهمون میده.
- تابع mode مشخص میکنه کدام مقدار بیشترین تکرار رو داشته.
- تابع واریانس (هر عدد رو منهای میانگین میکنه، و به توان دو میرسونه. سپس همرو با هم جمع میکنه و تقسیم بر تعداد میکنه).
🟢 قانون Three Sigma: اگر نمودار histogram نرمال باشد (یعنی در مرکز تعداد زیاد است و هرچقدر از مرکز فاصله بگیریم، تعداد در هر دو طرف مرکز بصورت متقارن کم و کمتر میشود)، داریم:
🔺 68 درصد داده ها در یک برابری انحراف استاندارد کمتر تا یک برابری انحراف استاندارد بیشتر قرار دارند. (یعنی اگر میانگین رو منهای انحراف استاندارد کنیم، تا میانگین رو به علاوه انحراف استاندارد کنیم، 68 درصد داده ها در اون محدوده قرار دارند).
🔺 95 درصد داده ها در محدوده دو برابری انحراف استاندارد کمتر تا دو برابری انحراف استاندارد بیشتر قرار دارند.
🔺 99.73 درصد داده ها در محدوده سه برابری انحراف استاندارد کمتر، تا سه برابری انحراف استاندارد بیشتر قرار دارند.
🔹 یکی از کاربردهای خوب Three Sigma حذف راحت داده های نویز میباشد. به عنوان مثال میتونیم بگیم داده هایی که در بازه سه برابری انحراف استاندارد کمتر و سه برابری انحراف استاندارد بیشتر نیفتادن رو حذف کن.
▫️اگر دُم نمودار histogram به سمت راست بیشتر باشه، میگن چولگی مثبت یا چولگی به راست داره و بالعکس.
🔸 محسابه چولگی (skewness) ستون موردنظر:
🔹 محاسبه تیزی قله (Kurtosis):
———————————————————————-
🔸 رسم نمودار scatter matrix روی ستون ها و بررسی اونها دو به دو با همدیگر:
pd.plotting.scatter_matrix(
df[["age", "duration", "campaign"]],
figsize = (15, 15),
diagonal = "kde")
plt.show
🔹 رسم نمودار histogram روی ستون مورد نظر (نمودار فراوانی در هر دسته):
df["age"].hist()
▫️ رسم نمودار histogram روی کل دیتافریم:
df.hist(color = "k",
bins = 30,
figsize = (15, 10))
plt.show()
مقدار بین مشخص میکند اطلاعات به چند قسمت مساوی تقسیم بشوند.
🟣 انجام تحلیل های مربوط به آمار توصیفی روی داده های پروازی)
🔻 بدست آوردن میانگین تاخیر در رسیدن به مقصد:
data["arr_delay"].mean()
▫️ یکی از مشکلات اساسی میانگین، داده های outlier یا پرت هستند که میانگین رو به سمت خودشون میکشند. داده outlier باعث میشه که باقی داده ها نزدیک به همدیگر نباشند.
🟠 روش های مقابله با داده های outlier)
- میانگین اصلاح شده (Trimmed Mean): به عنوان مثال، ده درصد بالای داده ها و ده درصد پایین داده ها از لحاظ تعداد رو حذف کن، و از 80 درصد وسط داده ها میانگین بگیر. کد Trimmed Mean در پکیج Scipy موجود است. (Scipy یک پکیج است که روی مباحث آماری کار میکند و توابع آماری فراوانی درون خود دارد.)
from scipy import stats
stats.trim_mean(data["arr_delay"], 0.1)
- میتونیم از median هم استفاده کنیم. median داده هارو از کوچک به بزرگ sort میکنه و عدد وسط داده ها که نصف داده ها ازون بیشتر و نصف داده ها ازون کمتر هستن رو بهمون میده.
data["arr_delay"].median()
نکته مهم: median نسبت به داده های نویز مقاوم هست.
- تابع mode مشخص میکنه کدام مقدار بیشترین تکرار رو داشته.
data["arr_delay"].mode()
- تابع واریانس (هر عدد رو منهای میانگین میکنه، و به توان دو میرسونه. سپس همرو با هم جمع میکنه و تقسیم بر تعداد میکنه).
data["arr_delay"].var()
تابع واریانس دو مشکل دارد. یک اینکه به داده های نویز حساس است و دوم اینکه از جنس داده ها نیست چون به توان دو رسیده. اگر ازش جذر (رادیکال) بگیریم مقدار درست میشه و درواقع به اون مقدار رادیکال گرفته شده میگن انحراف استاندارد.
data["arr_delay"].std() ---> واریانسی که رادیکال گرفته روش
انحراف استاندارد: میانگین اختلاف داده ها نسبت به میانگین
🟢 قانون Three Sigma: اگر نمودار histogram نرمال باشد (یعنی در مرکز تعداد زیاد است و هرچقدر از مرکز فاصله بگیریم، تعداد در هر دو طرف مرکز بصورت متقارن کم و کمتر میشود)، داریم:
🔺 68 درصد داده ها در یک برابری انحراف استاندارد کمتر تا یک برابری انحراف استاندارد بیشتر قرار دارند. (یعنی اگر میانگین رو منهای انحراف استاندارد کنیم، تا میانگین رو به علاوه انحراف استاندارد کنیم، 68 درصد داده ها در اون محدوده قرار دارند).
🔺 95 درصد داده ها در محدوده دو برابری انحراف استاندارد کمتر تا دو برابری انحراف استاندارد بیشتر قرار دارند.
🔺 99.73 درصد داده ها در محدوده سه برابری انحراف استاندارد کمتر، تا سه برابری انحراف استاندارد بیشتر قرار دارند.
🔹 یکی از کاربردهای خوب Three Sigma حذف راحت داده های نویز میباشد. به عنوان مثال میتونیم بگیم داده هایی که در بازه سه برابری انحراف استاندارد کمتر و سه برابری انحراف استاندارد بیشتر نیفتادن رو حذف کن.
▫️اگر دُم نمودار histogram به سمت راست بیشتر باشه، میگن چولگی مثبت یا چولگی به راست داره و بالعکس.
🔸 محسابه چولگی (skewness) ستون موردنظر:
data["arr_delay"].skew()
🔹 محاسبه تیزی قله (Kurtosis):
data["arr_delay"].kurtosis()
اگر مقدار بالایی باشه نشون دهنده اینه که داده ها اکثرا نزدیک میانگین هستن و در یک نقطه تجمع کردن.
🔸 برای تحلیل دو متغیره، correlation وجود دارد. به ما این قابلیت رو میده که بتونیم بفهمیم کدوم دوتا متغیر با همدیگه رابطه خطی مستقیم دارن. correlation مثبت یعنی با زیاد شدن یک متغیر، یک متغیر دیگه نیز زیاد بشه و بالعکس. correlation عددی بین مثبت یک و منفی یک میباشد. correlation رابطه خطی را نشان میدهد.
اگر مقدار corr صفر باشد، یعنی دو ستون مد نظر هیچ ارتباطی با یکدیگر ندارند.
🔴 رسم correlation روی مجموعه داده:
———————————————————————-
🔷 بخش Data Visualization
یکی از کتابخانه هایی که در این بخش استفاده میکنیم، Matplotlib میباشد.
🔻 رسم نمودار histogram:
🔸 مشخص کردن لیبل برای X و Y، و مشخص کردن noscript:
🟢 استفاده از subplot:
▫️ رسم boxplot (نمایش کمینه و بیشینه، چارک اول و چارک سوم، median یا چارک دوم ستون مورد نظر):
🔸 چارک اول: یک چهارم داده ها کمتر از اون هستند.
🔹 چارک دوم (میانه): نصف داده ها کمتر و نصف داده ها بیشتر از اون هستند.
🔺 چارک سوم: سه چهارم داده ها کمتر از اون هستند.
🟨 با استفاده از چارک اول و چارک سوم میتونیم متوجه بشیم تکرار داده ها کجا متمرکز شده است. معمولا تعداد تکرار بین چارک اول و سوم خیلی زیاد میباشد.
اگر مقدار corr صفر باشد، یعنی دو ستون مد نظر هیچ ارتباطی با یکدیگر ندارند.
🔴 رسم correlation روی مجموعه داده:
data.corr()
———————————————————————-
🔷 بخش Data Visualization
یکی از کتابخانه هایی که در این بخش استفاده میکنیم، Matplotlib میباشد.
import matplotlib.pyplot as plt
🔻 رسم نمودار histogram:
plt.hist(df["comb08"])
🔸 مشخص کردن لیبل برای X و Y، و مشخص کردن noscript:
plt.xlabel("Test X")
plt.ylabel("Test Y")
plt.noscript("Test Title")
plt.show()🟢 استفاده از subplot:
fig, ax = plt.subplots()
ax.hist(df["comb08"], range=(10, 50), bins=5)
▫️ رسم boxplot (نمایش کمینه و بیشینه، چارک اول و چارک سوم، median یا چارک دوم ستون مورد نظر):
fig, ax = plt.subplots()
ax.boxplot(df["comb08"], label=["All"])
ax.set(noscript="MPG Distribution", ylabel="MPG for vehicles")
برای حذف نویزها از نمودار میتونیم showfliers رو فالس بزاریم:
ax.boxplot(df["comb08"], label=["All"], showfliers=False)
🔸 چارک اول: یک چهارم داده ها کمتر از اون هستند.
🔹 چارک دوم (میانه): نصف داده ها کمتر و نصف داده ها بیشتر از اون هستند.
🔺 چارک سوم: سه چهارم داده ها کمتر از اون هستند.
🟨 با استفاده از چارک اول و چارک سوم میتونیم متوجه بشیم تکرار داده ها کجا متمرکز شده است. معمولا تعداد تکرار بین چارک اول و سوم خیلی زیاد میباشد.
🔸 رسم نمودار خطی ساده:
🔻 چند نمونه رسم نمودار با pandas:
🟢 کتابخانه دیگری برای بصری سازی داده ها به نام Seaborn وجود دارد. seaborn مبتنی بر matplotlib میباشد. از لحاظ شکل و شمایل و هارمونی رنگی، seaborn به نسبت بقیه بهتر عمل کرده.
✔️ رسم catplot در seaborn:
🔔 رسم چند نمونه نمودار با seaborn:
avg_by_year = df.groupby(["year"], as_index=False).agg({'comb08': 'mean'}).round(2)
fig, ax1 = plt.subplots()
ax1.plot(avg_by_year["year"], avg_by_year["comb08"])🔻 چند نمونه رسم نمودار با pandas:
avg_by_year.plot(kind="box", noscript="Gas Mileage")
avg_by_year.plot(kind="line", noscript="Gas Mileage")
avg_by_year.plot(kind="bar", noscript="Gas Mileage")
avg_by_year.plot(kind="area", noscript="Gas Mileage")
🟢 کتابخانه دیگری برای بصری سازی داده ها به نام Seaborn وجود دارد. seaborn مبتنی بر matplotlib میباشد. از لحاظ شکل و شمایل و هارمونی رنگی، seaborn به نسبت بقیه بهتر عمل کرده.
import seaborn as sns
sns.set_style("darkgrid")
✔️ رسم catplot در seaborn:
sns.catplot(data=df,
y='comb08',
x='cylinders',
kind='bar');
🔔 رسم چند نمونه نمودار با seaborn:
sns.displot(data=df, x='fuelCost08', hue='year', aspect=2.5);
sns.displot(data=df, x='fuelCost08', hue='date_range', aspect=2.5);
sns.displot(data=df, x='fuelCost08', col='date_range')
sns.catplot(data=df,
x='date_range',
y='comb08',
kind='box',
showfliers=False);
sns.relplot(data=df,
x='cylinders',
y='comb08',
col='date_range',
hue='drive',
kind='scatter');