The Misgeneralization Mind – Telegram
The Misgeneralization Mind
154 subscribers
208 photos
14 videos
40 files
109 links
اینجا چیزایی که برام جالب باشه رو میذارم.

ناشناس:
https://news.1rj.ru/str/BiChatBot?start=sc-6e66d9fc9f
Download Telegram
✳️ بخش دوم، آموزش Pandas

🔹 معرفی 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 روی ستون ها و بررسی اونها دو به دو با همدیگر:
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.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)


🔸 چارک اول: یک چهارم داده ها کمتر از اون هستند.
🔹 چارک دوم (میانه): نصف داده ها کمتر و نصف داده ها بیشتر از اون هستند.
🔺 چارک سوم: سه چهارم داده ها کمتر از اون هستند.

🟨 با استفاده از چارک اول و چارک سوم میتونیم متوجه بشیم تکرار داده ها کجا متمرکز شده است. معمولا تعداد تکرار بین چارک اول و سوم خیلی زیاد میباشد.
🔸 رسم نمودار خطی ساده:
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');