import statsmodels.api as sm
import matplotlib.pyplot as plt
from scipy import stats
import pandas as pd
import seaborn as sns
import numpy as np
## Fungsi untuk menampilkan histogramabs
def showVisualNormalitas(data, xlabel='Values',ylabel='Density',title='Customized Histogram with Density Plot'):
# Creating a customized histogram with a density plot
sns.histplot(data, bins=30, kde=True, color='lightgreen', edgecolor='red')
# Adding labels and title
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.title(title)
# Display the plot
plt.show()
Uji asumsi klasik¶
Adalah sereangkaian pengujian statistik yang dilakukan untuk memastikan model Regresi Linear valid dan tidak menghasilkan estimasi atau prediksi yang bias.
Kurang lebih ada 5 jenis uji asumsu klasik, diantaranya;abs
- Uji Normalitas
- Uji Multikolinearitas
- Uji Heteroskedastisitas
- Uji Autokorelasi
- Uji Linearitas
Uji Normalitas¶
Pengujian statistik untuk mengukur apakah data terdistribusi secara normal. Hasil Uji normalitas ini syarat penting untuk melakukan analisis statistik parametrik seperti uji-t dan uji-F.
Ada dua cara dalam melakukan uji normalitas;abs
- Analisis visual, seperti menggunakan histogram
- Analisis statistik, menggunakan uji;
- Shapiro-Wilk
- Kolmogorov-Smirnov
Sample Data¶
- Data
X1: Distribusi eksponensial (Data akan condong ke kanan, bisa kita katakan ini adalah data yang tidak normal) - Data
X2: Data dummy distribusi normal - Data
Y: Variable dependent $3 * X1 + 2 * X2$
np.random.seed(42)
# Create skewed/unnormalized independent variables
X1 = np.random.exponential(scale=10, size=100) # skewed positive
X2 = np.random.normal(loc=50, scale=20, size=100) # wide variance, some outliers
# Dependent variable with noise
y = 3*X1 + 2*X2 + np.random.normal(0, 25, size=100)
df = pd.DataFrame({
"X1": X1,
"X2": X2,
"Y": y
})
df.head()
| X1 | X2 | Y | |
|---|---|---|---|
| 0 | 4.692681 | 51.740941 | 117.884973 |
| 1 | 30.101214 | 44.019853 | 214.681701 |
| 2 | 13.167457 | 51.835216 | 136.556381 |
| 3 | 9.129426 | 10.248622 | 115.889749 |
| 4 | 1.696249 | 45.606562 | 111.943554 |
Uji visualisasi¶
showVisualNormalitas(df['X1'],'Nilai sumbu x himpunan X1','Banyak data','Histogram persebaran data X1')
showVisualNormalitas(df['X2'],'Nilai sumbu x himpunan X2','Banyak data','Histogram persebaran data X2')
Secara visualisasi dapat kita lihat bahwa data X1 distribusi datanya tidak normal dengan kencodongan data ke kiri, sedangkan data X2 data-nya terdistribusi dengan normal.
Uji statistik Shapiro-Wilk¶
Untuk kali ini saya menggunakan pustakan dari scipy untuk menghitung distribusi dengan Shapiro-Wilk dan Kolmogorov-Smirnov.
# ShapiroWalk
shapX1 = stats.shapiro(df['X1'])
shapX2 = stats.shapiro(df['X2'])
print(shapX1.pvalue, shapX2.pvalue)
3.7127447062633152e-09 0.5615645495665563
Sebagaimana aturan shapiro wilk
$ \text{jika p-value} \gt 0.05 \to \text{Data terdistribusi normal}$
$ \text{jika p-value} \le 0.05 \to \text{Data tidak terdistribusi normal}$
Dengan demikian hipoteas kita adalah;
X1
- $H_0$ Himpunan data
X1berdistribusi normal - $H_a$ Himpunan data
X1berdistribusi tidak normal
X2
- $H_0$ Himpunan data
X2berdistribusi normal - $H_a$ Himpunan data
X2berdistribusi tidak normal
Maka dapat disimpulkan bawah,
- Himpunan
X1berdistribusi tidak normal karena p-value $3.7127447062633152e-09 \le 0.05$, sehingga hipotesa $H_0$ ditolan dan menerima hipotesa $H_a$. - Himnpunan
X2berdistribusi normal karena karena p-value $0.5615645495665563 \gt 0.05$, sehingga hipotesa $H_a$ ditolak dan menerima hipotesa $H_0$.
Uji statistik Kolmogorov-Smirnov¶
ktestX1 = stats.kstest(df['X1'],'norm')
ktestX2 = stats.kstest(df['X2'],'norm')
print(ktestX1.pvalue, ktestX2.pvalue)
1.0157189905716111e-61 0.0
Uji Multikolinearitas¶
Uji Heteroskedastisitas¶
Uji Autokorelasi¶
Uji Linearitas¶
Resource¶
- Module regresi bergandan oleh Dr. Tukiyat
- https://www.statistikian.com/2013/01/saphiro-wilk.html
- https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.shapiro.html
- https://www.statistikian.com/2013/01/rumus-kolmogorov-smirnov.html
- https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kstest.html
myList = [78, 78, 95, 90, 78, 80, 82, 77, 72, 84, 68, 67, 87, 78, 77, 88, 97, 89, 97, 98, 70, 72, 70, 69, 67, 90, 97]
dfsample = pd.DataFrame(myList, columns=['x'])
stats.kstest(dfsample.x,stats.norm.cdf)
KstestResult(statistic=np.float64(1.0), pvalue=np.float64(0.0), statistic_location=np.int64(67), statistic_sign=np.int8(-1))