🔸 برای تحلیل دو متغیره، 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');
🟣 برای مقایسه اعداد در یک جدول، میتونیم از heatmap استفاده بکنیم.
🟠 نوع دیگری از heatmap با پالت رنگی متفاوت:
🔴 رسم نمودار با مشخص کردن چند سطر و ستون:
🗯 نیاز نیست همهی این نمودارها رو حفظ کنیم. فقط دونستن Base نمودارها و این که هرکدوم چه کاری انجام میدن کافیه. برای باقی مراحل میتونیم با سرچ یا استفاده از GPT کد مربوطه رو بنویسیم.
fuel_class = pd.crosstab(df['class_summary'],
df['fuel_type_summary'],
values=df['comb08'],
aggfunc='mean')
sns.heatmap(fuel_class)
🟠 نوع دیگری از heatmap با پالت رنگی متفاوت:
sns.heatmap(fuel_class,
annot=True,
fmt='.0f',
cmap="YlGnBu");
🔴 رسم نمودار با مشخص کردن چند سطر و ستون:
sns.pairplot(df,
x_vars=['cylinders', 'displ', 'barrels08'],
y_vars=['cylinders', 'displ', 'barrels08'],
hue='date_range')
🗯 نیاز نیست همهی این نمودارها رو حفظ کنیم. فقط دونستن Base نمودارها و این که هرکدوم چه کاری انجام میدن کافیه. برای باقی مراحل میتونیم با سرچ یا استفاده از GPT کد مربوطه رو بنویسیم.
Sampling in Inferential Statistics 📊
——————————————————————————————
نمونهگیری در آمار استنباطی (Sampling in Inferential Statistics) 📉
1. نمونهگیری تصادفی (Random Sampling) 🎲
نمونهگیری تصادفی یکی از روشهای اصلی نمونهگیری در آمار است که در آن هر عضوی از جامعه آماری شانس برابری برای انتخاب شدن دارد. این روش کمک میکند تا نمونهای که انتخاب میشود به خوبی نماینده جامعه آماری باشد و نتایج به دست آمده از تحلیلهای آماری قابل تعمیم به کل جامعه باشد.
2. عدم تعصب (Non-Bias) 🚫
یکی از اصول مهم در نمونهگیری این است که نمونه باید بدون تعصب (Bias) انتخاب شود. تعصب میتواند نتایج تحقیق را تحریف کند و باعث شود که نتایج به دست آمده دقیق نباشند. برای جلوگیری از تعصب:
- نمونهگیری تصادفی انجام شود.
- فرآیند نمونهگیری به دقت طراحی شود تا هیچ گروه یا دستهای از جامعه آماری نادیده گرفته نشود.
3. حداقل حجم نمونه (Minimum Sample Size) 📏
حداقل حجم نمونه (Minimum Sample Size) به تعداد حداقل نمونههایی که برای انجام تحلیلهای آماری معتبر نیاز است، اشاره دارد. تعیین حجم نمونه به عوامل مختلفی بستگی دارد:
- اندازه جامعه آماری (Population Size)
- سطح اطمینان (Confidence Level) که معمولاً 95% یا 99% انتخاب میشود.
- حاشیه خطا (Margin of Error) که معمولاً بین 1% تا 5% تنظیم میشود.
- انحراف معیار (Standard Deviation) یا واریانس (Variance) دادهها که اگر پیش از این مشخص باشد، کمک میکند.
نکات کلیدی 🗝
- نمونهگیری تصادفی ساده (Simple Random Sampling) 🎲: یکی از سادهترین و رایجترین روشهای نمونهگیری که در آن هر عضو جامعه آماری به صورت تصادفی و با شانس برابر انتخاب میشود.
- نمونهگیری سیستماتیک (Systematic Sampling) 📐: یکی دیگر از روشهای نمونهگیری که در آن هر nامین عضو جامعه آماری انتخاب میشود.
- نمونهگیری طبقهبندی شده (Stratified Sampling) 🧩: زمانی استفاده میشود که جامعه آماری به زیرگروههای همگن تقسیم شده و سپس نمونهگیری از هر زیرگروه به صورت تصادفی انجام میشود.
- نمونهگیری خوشهای (Cluster Sampling) 🏢: زمانی استفاده میشود که جامعه آماری به خوشههای ناهمگن تقسیم شده و سپس برخی از این خوشهها به صورت تصادفی انتخاب و از همه اعضای خوشههای انتخاب شده نمونهگیری میشود.
——————————————————————————————
نمونهگیری در آمار استنباطی (Sampling in Inferential Statistics) 📉
1. نمونهگیری تصادفی (Random Sampling) 🎲
نمونهگیری تصادفی یکی از روشهای اصلی نمونهگیری در آمار است که در آن هر عضوی از جامعه آماری شانس برابری برای انتخاب شدن دارد. این روش کمک میکند تا نمونهای که انتخاب میشود به خوبی نماینده جامعه آماری باشد و نتایج به دست آمده از تحلیلهای آماری قابل تعمیم به کل جامعه باشد.
2. عدم تعصب (Non-Bias) 🚫
یکی از اصول مهم در نمونهگیری این است که نمونه باید بدون تعصب (Bias) انتخاب شود. تعصب میتواند نتایج تحقیق را تحریف کند و باعث شود که نتایج به دست آمده دقیق نباشند. برای جلوگیری از تعصب:
- نمونهگیری تصادفی انجام شود.
- فرآیند نمونهگیری به دقت طراحی شود تا هیچ گروه یا دستهای از جامعه آماری نادیده گرفته نشود.
3. حداقل حجم نمونه (Minimum Sample Size) 📏
حداقل حجم نمونه (Minimum Sample Size) به تعداد حداقل نمونههایی که برای انجام تحلیلهای آماری معتبر نیاز است، اشاره دارد. تعیین حجم نمونه به عوامل مختلفی بستگی دارد:
- اندازه جامعه آماری (Population Size)
- سطح اطمینان (Confidence Level) که معمولاً 95% یا 99% انتخاب میشود.
- حاشیه خطا (Margin of Error) که معمولاً بین 1% تا 5% تنظیم میشود.
- انحراف معیار (Standard Deviation) یا واریانس (Variance) دادهها که اگر پیش از این مشخص باشد، کمک میکند.
نکات کلیدی 🗝
- نمونهگیری تصادفی ساده (Simple Random Sampling) 🎲: یکی از سادهترین و رایجترین روشهای نمونهگیری که در آن هر عضو جامعه آماری به صورت تصادفی و با شانس برابر انتخاب میشود.
- نمونهگیری سیستماتیک (Systematic Sampling) 📐: یکی دیگر از روشهای نمونهگیری که در آن هر nامین عضو جامعه آماری انتخاب میشود.
- نمونهگیری طبقهبندی شده (Stratified Sampling) 🧩: زمانی استفاده میشود که جامعه آماری به زیرگروههای همگن تقسیم شده و سپس نمونهگیری از هر زیرگروه به صورت تصادفی انجام میشود.
- نمونهگیری خوشهای (Cluster Sampling) 🏢: زمانی استفاده میشود که جامعه آماری به خوشههای ناهمگن تقسیم شده و سپس برخی از این خوشهها به صورت تصادفی انتخاب و از همه اعضای خوشههای انتخاب شده نمونهگیری میشود.
❎ رابطه علت و معلول بین داده ها، با استفاده از Inferetial Statistics انجام میشه.
A/B Test 📉
——————————————————————————————
📈 در AB Test وقتی جامعه آماری را به دو گروه مساوی تقسیم کردیم، بعد از انجام آزمایش مدنظر، از هر دو گروه میانگین میگیریم. تفاضل میانگین دو گروه عددی میشود که اون رو d در نظر میگیریم (مثلا تاثیر دارو بر گروه B). حال اینکه چقدر اون تاثیر (همان d) بر اساس شانس هست، میشه مقدار P value. (در واقع، داده ها رو شافل میکنیم و مثلا برای هزار بار آزمایش رو تکرار میکنیم، بعد چک میکنیم که چند بار این اعداد رندوم بزرگتر مساوی عدد d بوده. نتیجه بدست آمده میشه مقدار P value)
🖍 معمولا یک حد آستانه (Treshold) برای P value در نظر میگیریم. معمولا 5 درصد گرفته میشه. اگر P value ما زیر 5 درصد شد، قبول میکنیم. در غیر این صورت میگیم که به شواهد کافی برای تایید ادعای مطرح شده نرسیدیم. هر چقدر مقدار P value پایین تر باشه بهتر هست.
T Test 📑
——————————————————————————————
🔸 آزمون T، دو شرط دارد. داده هایی که داریم باید توزیع نرمالی داشته باشند و داده ها نمونه ای از داده کل باشند. برای فهمیدن اینکه داده ها نرمال هستن یا نه، میتونیم از نمودار histogram استفاده کنیم.
🟣 ما سه نوع T Test داریم:
- One Sample
❗️ مقایسه یک نمونه با جامعه کل.
- Independent TTest (Two Sample)
❕ برای وقتی هست که ما دو مجموعه مجزا از هم داریم، و این دو مجموعه شرایط TTest رو دارن (پیروی از توزیع نرمال، نمونه ای از کل هستند).
- Relative TTest
❗️ برای وقتی هست که دو گروه ما به همدیگر وابسته هستند.
❇️ میتونیم از داده های غیر نرمال، لگاریتم بگیریم و سپس T Test رو انجام بدیم. یا کلا روی همون داده های غیر نرمال از MannWithnyUTest استفاده کنیم.
⁉️ تست شاپیرو (Shapiro): شاپیرو، داده های ما رو با توزیع نرمال ایده آل خودش مقایسه میکنه، و اختلاف اونهارو بررسی میکنه. حال هر چقدر P value پایینتر بشه، نشون میده داده ها از توزیع نرمالی که مد نظر شاپیرو بوده، اختلاف معنا دار تری داشته. اگر این اختلاف معنا دار نباشه، میگیم که احتمالا نرمال هست. (اگر Shapiro Test انجام بدیم و مقدار P value زیر 5 درصد بشه، داده ها نرمال نیست).
💡 نمودار Probplot: داده ها رو با توزیع نرمال مقایسه میکنه. روی نمودار، هر چقدر داده های ما (نقاط آبی رنگ) به خط قرمز نزدیک تر باشند یعنی داده ما بیشتر به داده های نرمال شبیه هست.
🔑 دو مورد آخر (تست شاپیرو، Probplot) برای اینه که بفهمیم داده ها از توزیع نرمال پیروی میکنند یا خیر.
A/B Test 📉
——————————————————————————————
📈 در AB Test وقتی جامعه آماری را به دو گروه مساوی تقسیم کردیم، بعد از انجام آزمایش مدنظر، از هر دو گروه میانگین میگیریم. تفاضل میانگین دو گروه عددی میشود که اون رو d در نظر میگیریم (مثلا تاثیر دارو بر گروه B). حال اینکه چقدر اون تاثیر (همان d) بر اساس شانس هست، میشه مقدار P value. (در واقع، داده ها رو شافل میکنیم و مثلا برای هزار بار آزمایش رو تکرار میکنیم، بعد چک میکنیم که چند بار این اعداد رندوم بزرگتر مساوی عدد d بوده. نتیجه بدست آمده میشه مقدار P value)
🖍 معمولا یک حد آستانه (Treshold) برای P value در نظر میگیریم. معمولا 5 درصد گرفته میشه. اگر P value ما زیر 5 درصد شد، قبول میکنیم. در غیر این صورت میگیم که به شواهد کافی برای تایید ادعای مطرح شده نرسیدیم. هر چقدر مقدار P value پایین تر باشه بهتر هست.
T Test 📑
——————————————————————————————
🔸 آزمون T، دو شرط دارد. داده هایی که داریم باید توزیع نرمالی داشته باشند و داده ها نمونه ای از داده کل باشند. برای فهمیدن اینکه داده ها نرمال هستن یا نه، میتونیم از نمودار histogram استفاده کنیم.
🟣 ما سه نوع T Test داریم:
- One Sample
❗️ مقایسه یک نمونه با جامعه کل.
import scipy.stats as stats
stats.ttest_1samp(a=df['oranges'], popmean=population_mean)
- Independent TTest (Two Sample)
❕ برای وقتی هست که ما دو مجموعه مجزا از هم داریم، و این دو مجموعه شرایط TTest رو دارن (پیروی از توزیع نرمال، نمونه ای از کل هستند).
stats.ttest_ind(a=df_ielts_98['ielts'], b=df_ielts_99['ielts'])
- Relative TTest
❗️ برای وقتی هست که دو گروه ما به همدیگر وابسته هستند.
stats.ttest_rel(a=df['weight_before'], b=df['weight_after'])
❇️ میتونیم از داده های غیر نرمال، لگاریتم بگیریم و سپس T Test رو انجام بدیم. یا کلا روی همون داده های غیر نرمال از MannWithnyUTest استفاده کنیم.
⁉️ تست شاپیرو (Shapiro): شاپیرو، داده های ما رو با توزیع نرمال ایده آل خودش مقایسه میکنه، و اختلاف اونهارو بررسی میکنه. حال هر چقدر P value پایینتر بشه، نشون میده داده ها از توزیع نرمالی که مد نظر شاپیرو بوده، اختلاف معنا دار تری داشته. اگر این اختلاف معنا دار نباشه، میگیم که احتمالا نرمال هست. (اگر Shapiro Test انجام بدیم و مقدار P value زیر 5 درصد بشه، داده ها نرمال نیست).
💡 نمودار Probplot: داده ها رو با توزیع نرمال مقایسه میکنه. روی نمودار، هر چقدر داده های ما (نقاط آبی رنگ) به خط قرمز نزدیک تر باشند یعنی داده ما بیشتر به داده های نرمال شبیه هست.
stats.probplot(data, dist='norm', plot=pylab)
🔑 دو مورد آخر (تست شاپیرو، Probplot) برای اینه که بفهمیم داده ها از توزیع نرمال پیروی میکنند یا خیر.
🔻 توزیع binomial (دو جمله ای)، یک مقدار n (تعداد تکرار آزمایش) و مقدار k (تعداد نمونه) و p (نرخ برد) از ما دریافت میکند و به طول n بازی انجام میدهد. در هر بازی، kتا خونه میسازه که داخلش یا 0 یا 1 قرار داره. (0 یعنی شکست، 1 یعنی پیروزی).
⁉️ از کجا متوجه میشه در یک خانه 0 بزاره یا 1؟ به p نگاه میکند. هر بار یک عدد رندوم وابسته به p میسازه و به احتمال p، داخل خونه مقدار 1 میاد، و به احتمال یک منهای p صفر میاد.
📌 تست خی (Chi Squared Test)
📐 بعد از بدست آوردن عدد Chi که در کد بالا، آخرین خط این کار را میکند، باید این عدد را در Chi-Squared Table بگذاریم. (بسته به مقدار k، نمودار chi متفاوت میشه).
🧮 عدد k همان dof یا درجه آزادی میباشد. نحوه محاسبه dof:
محاسبه p value در آزمون Chi:
🔎 اگر مقدار p value زیر treshold بشه میگن که اون دو متغیر با هم در ارتباط هستند.
✳️ کد آماده تابع chi square در Scipy موجود هست، فقط کافیه مقدار obs رو بهش بدیم.
⁉️ از کجا متوجه میشه در یک خانه 0 بزاره یا 1؟ به p نگاه میکند. هر بار یک عدد رندوم وابسته به p میسازه و به احتمال p، داخل خونه مقدار 1 میاد، و به احتمال یک منهای p صفر میاد.
📌 تست خی (Chi Squared Test)
ct = pd.crosstab(data['Attrition'], data['JobSatisfaction'], margins=True)
obs = np.append(ct.iloc[0][: -1].values, ct.iloc[1][: -1].values)
exp = []
for j in range(2):
for val in ct.iloc[2, : -1].values:
print(val, ' * ', row_sum[j], ' / ', ct.loc['All', 'All'], ' = ', val * row_sum[j] / ct.loc['All', 'All'])
exp.append(val * row_sum[j] / ct.loc['All', 'All'])
((obs - exp) ** 2 / exp).sum()
📐 بعد از بدست آوردن عدد Chi که در کد بالا، آخرین خط این کار را میکند، باید این عدد را در Chi-Squared Table بگذاریم. (بسته به مقدار k، نمودار chi متفاوت میشه).
🧮 عدد k همان dof یا درجه آزادی میباشد. نحوه محاسبه dof:
dof = (len(row_sum) - 1) * (len(ct.iloc[2, :-1].values) - 1)
محاسبه p value در آزمون Chi:
1 - stats.chi2.cdf(((obs - exp) ** 2 / exp).sum(), dof)
🔎 اگر مقدار p value زیر treshold بشه میگن که اون دو متغیر با هم در ارتباط هستند.
✳️ کد آماده تابع chi square در Scipy موجود هست، فقط کافیه مقدار obs رو بهش بدیم.