Gross Domestic Product (GDP) atau Produk Domestik Bruto (PDB) adalah salah satu konsep pendapatan nasional. GDP adalah jumlah produk berupa barang dan jasa, yang dihasilkan oleh unit-unit produksi di dalam batas wilayah suatu negara (domestik) selama satu tahun. Manfaat GDP sendiri antara lain membandingkan kemajuan perekonomian suatu negara dari waktu ke waktu, menilai kinerja ekonomi suatu negara, dan mengetahui pertembuhan ekonomi dan pendapatan per kapita. Pada kasus kali ini akan mencoba memprediksi analytics menggunakan KNN dan Boosting yang dibungkus kedalam sebuah pipeline dengan evaluasi menggunakan MSE dengan tujuan mengetahui seberapa tingkat error yang dihasilkan. Sebelum mencapai tahap modeling, akan dilakukan exploratory data analysis (EDA) dengan dua tahapan yaitu univariat dan multivariat yang bertujuan untuk mengetahui distribusi data, outlier dan korelasi antar fitur.
Business Understanding
Pada pernyataan yang telah dijelaskan, sehingga masalah yang diangkat adalah
Bagaimana persebaran data yang dimiliki?.
Bagaimana tingkat error yang dihasilkan dan keakuratan model untuk melakukan prediksi terhadap GDP?
Tujuan dari masalah yang diangkat adalah
Mengetahui persebaran data dan korelasi sebelum dan sesudah penghapusan outlier?
Mengetahui tingkat keakuratan model yang dihasilkan
Solusi Statements yang dapat dilakukan
Mengetahui distribusi data menggunakan histogram dan pengecekan normalitas data menggunakan kolmogorov-Sminov.
Mengetahui tingkat korelasi sebelum dan sesudah penghapusan outlier.
Melakukakan standarisasi menggunakan standard scaler dan one-hot encoder
Mengevaluasi hasil model dengan mean squared error
Data Understanding
Dataset yang digunakan pada kasus ini adalah dataset Gapminder World yang didapatkan dari kaggel. Link dataset berada pada button di bawah ini.
Fitur-fitur yang berada pada dataset
Country: Berisi nama negara dengan tipe kategorik
Year: Tahun yang sesuai dengan isi dataset (kelipatan 5 untuk setiap tahunnya)
Population: Populasi yang berada pada negara terkait dengan tipe numerik
Contient: Posisi benua pada suatu negara
Life_exp: Tingkat harapan hidup pada negara
gdp_cap: GDP yang dihasilkan oleh negara terkait.
Pada kolom diatas, label yang digunakan adalah kolom GDP dan total dataset ini berjumlah 1704 baris tanpa missing values.
Exploratoray Data Analisis (EDA)
Hal pertama yang dilakukan mencari statistik deskriptifnya. Berikut hasilnya
![](https://static.wixstatic.com/media/67563d_3c4daa88da62409398a9a50c94a48b5d~mv2.png/v1/fill/w_763,h_139,al_c,q_85,enc_avif,quality_auto/67563d_3c4daa88da62409398a9a50c94a48b5d~mv2.png)
Sampai sini, dapat diketahui karakteristik data adalah
Dataset berasal dari tahun 1952 hingga tahun 2007 dengan interval 5 tahun.
Dataset tidak memiliki missing values.
Terdapat 142 negara yang tersebar kedalam 5 benua.
Persebaran dataa. Pada kolom population, standard deviasi yang didapatkan lebih kecil dari mean-nya. Sehingga, bisa dikatakan bahwa populasi tidak berbeda jauh per 5 tahun. Begitu juga yang terjadi pada ekspetasi kehidupan. b. Pada kolom GDP bahwasanya STD > mean. Sehingga, nilai GDP bersifat beragam (Heterogen)
Sehingga hipotesis (H0) yang saya buat adalah a. Populasi tidak signifikan menaikkan pengaruh jumlah GDP. b. Populasi berpengaruh dalam kenaikan harapan hidup (life_exp) c. Populasi, life_exp dan GDP_cap bersifat distribusi normal
Selanjutnya saya akan melihat persebaran, hubungan antar variabel dan uji hipotesis, outlier
Univariat
1. Numerik fitur
Pada tahapan ini akan dilihat persebaran data dari kolom populasi dengan nilai kelas yang saya hitung dengan rumus Freedman-Diaconis rule.
Freedman-Diaconis rule memanfaatkan 2 rumus dengan berat bin dan bins itu sendiri. Bin width memanfaatkan nilai q3 dan q1, sedangkan nilai bins itu sendiri memanfaatkan nilai max dan nilai serta berat bin. Berikut formulanya.
![](https://static.wixstatic.com/media/67563d_a291436d977a4f8d96e744c9f87b1641~mv2.png/v1/fill/w_386,h_181,al_c,q_85,enc_avif,quality_auto/67563d_a291436d977a4f8d96e744c9f87b1641~mv2.png)
Disni saya akan menghitung nilai q1 dan q3 menggunakan numpy dengan fungsi quantile 0.25(25%) dan 0.75 (75%)
![](https://static.wixstatic.com/media/67563d_37f5e143b59c482593d153c40e63d890~mv2.png/v1/fill/w_980,h_1307,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/67563d_37f5e143b59c482593d153c40e63d890~mv2.png)
Hasil visualisasi di atas didapatkan beberapa informasi
1. Persebaran data berpusat pada range 0 - 200000000, dengan dikatakan bahwasanya data bersifat homogen.
2. Semakin besar jumlah populasi, frekuensinya semakin turun.
3. Sehingga bisa dikatakan, populasi dunia yang semakin besar hanya terdapat di beberapa negara saja
![](https://static.wixstatic.com/media/67563d_9b926ab66d584659900363a349fe5c01~mv2.png/v1/fill/w_980,h_653,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/67563d_9b926ab66d584659900363a349fe5c01~mv2.png)
1. Persebaran pada kolom ini bisa dilihat, jika di ambil kesimpulan sementara datanya bersifat tidak normal. Sehingga untuk menghindari penarikan kesimpulan yang salah, akan dilakukan normalitas cek menggunakan kolmogorov-Sminov dikarenkan total data yang lebih dari > 50.
2. Jika dilihat pada persebaran populasi, semakin besar jumlah populasi maka semakin besar harapan hidup yang didapatkan. Hal tersebut juga menjelaskan data tersebar lebih banyak di arah kanan yang berarti modus data harapan hidup > dari rata- rata harapan hidup (Negatif Skew).
3. Dari perbedaan distribusi antar kolom populasi dan harapan hidup, diasumsikan bahwasanya korelasi antar keduanya bersifat negatif.
![](https://static.wixstatic.com/media/67563d_51b92626572646ea87c050dab2d2fc47~mv2.png/v1/fill/w_980,h_653,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/67563d_51b92626572646ea87c050dab2d2fc47~mv2.png)
Kolom GDP_cap searah dengan persebaran kolom populasi. Dimana range populasi 0 - 200000000 memiliki GDP antara 0 - 20000.
Sehingga tahap selanjutnya adalah cek normalitas data dan korelasi.
Cek Normalitas
ebelumnya saya telah membuat hipotesis dengan ketentuan H0 dengan nilai signifikan 0.05
Populasi, life_exp dan GDP bersifat distribusi normal
Sehingga Jika P-Value < 0.05 maka H0 ditolak.
kolom_popu = kstest(df['population'],"norm")
kolom_harapan = kstest(df['life_exp'], 'norm')
kolom_gdp = kstest(df['gdp_cap'], 'norm')
data = { 'kolom' : ['Populias', 'Harapan', 'GDP'],
'P-Value' : [kolom_popu[1], kolom_harapan[1], kolom_gdp [1]]
}
hasil = pd.DataFrame(data = data)
hasil['keputusan'] = ['Hipotesis Nol Ditolak' if x < 0.05 else 'Hipotesis Nol Diterima' for x in hasil['P-Value']]
![](https://static.wixstatic.com/media/67563d_094449991dcf43da97bc33dd14cf2704~mv2.png/v1/fill/w_260,h_110,al_c,q_85,enc_avif,quality_auto/67563d_094449991dcf43da97bc33dd14cf2704~mv2.png)
Sehingga bisa dikatakan bahwasanya ketiga kolom tersebut memiliki nilai yang tidak berdistribusi normal.
Kategorik
Pada dataset terdapat 2 kolom dengan tipe kategorik yaitu country dan continent. Tahapan yang pertama dilakukan, akan melihat proporsi tiap negara dan benua tersebut. Untuk country, karena nilai unik yang berjumlah terlalu besar maka akan saya buat dalam bentuk tabel.
![](https://static.wixstatic.com/media/67563d_710687b4efa74ba1a28d3a12ef7d5677~mv2.png/v1/fill/w_980,h_588,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/67563d_710687b4efa74ba1a28d3a12ef7d5677~mv2.png)
![](https://static.wixstatic.com/media/67563d_34f1ad97cd714b48b1f39058c0979805~mv2.png/v1/fill/w_177,h_166,al_c,q_85,enc_avif,quality_auto/67563d_34f1ad97cd714b48b1f39058c0979805~mv2.png)
Pada hasil di atas didapatkan bahwasanya
Jumlah negara memiliki proporsi yang sama mengikuti total nilai unik pada kolom year
Jika mengikuti jumlah total negara yang diakui pada setiap benua terdapat beberapa minus a. Africa dengan 54 negara diakui, sehingga terdapat minus 2. b. Americas dengan 35 negara diakui, sehingga terdapat minus 10. c. Asia dengan 48 negara diakui, sehingga terdapat minus 15. d. Eropa dengan 51 negara diakui, sehingga terdapat minus 21. d. Oceania dengan 4 negara diakui, sehingga terdapat minus 2.
Dari 142 negara yang terdapat 1 negara di benua asia yang memiliki GDP lebih dari 100000
![](https://static.wixstatic.com/media/67563d_a07c35bda2fb4212b2dce74e2780ec9f~mv2.png/v1/fill/w_410,h_114,al_c,q_85,enc_avif,quality_auto/67563d_a07c35bda2fb4212b2dce74e2780ec9f~mv2.png)
Sehingga bisa disimpulkan bahwasanya data lebih banyak mengandung negara yang berada di benua Afrika dengan interval setiap 5 tahun dengan populasi yang tersebar di 200000000 dan negara Kuwait pada benua Asia merupakan negara pendapat GDP tertinggi antara 1952 hingga 2007 dengan GDP 113523.1
Multivariat
Pada tahapan ini akan dilakukan eksplorasi lebih dalam antar varibel
Benua berdasarkan harapan hidup terhadap GDP
Jumlah Populasi terhadap harapan hidup dan GDP
Mengetahui seberapa besar korelasi antara variabel numerik
Harapan hidup dan GDP pada benua setiap 5 tahun
![](https://static.wixstatic.com/media/67563d_7fb86b0ac59a44e5ad9c3407595de7c7~mv2.png/v1/fill/w_980,h_327,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/67563d_7fb86b0ac59a44e5ad9c3407595de7c7~mv2.png)
Pada hasil di atas didapatkan bahwasanya
GDP yang rendah belum tentu mengurangi tingkat kehidupan. Hal ini dibuktikkan pada Benua Afrika yang memiliki GDP dibawah 5000, namun harapan hidupnya meningkat setiap tahunnya. Hal tersebut juga terjadi pada benua Asia
Benua Ocean memiliki GDP tertinggi diantara benua lainnya dan juga memiliki angka harapan hidup yang tinggi pula. Hal tersebut juga terjadi pada benua lainnya
Kenaikan GDP yang sedikit, memiliki dampak yang besar terhadap harapan hidup.
Sehingga, GDP yang meningkat juga meningkatkan harapan hidup yang terjadi setiap 5 tahun
Jumlah Populasi terhadap harapan hidup dan GDP
![](https://static.wixstatic.com/media/67563d_854cc9b0f8ba4a1084d12e9c13ad3adc~mv2.png/v1/fill/w_980,h_327,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/67563d_854cc9b0f8ba4a1084d12e9c13ad3adc~mv2.png)
Pada hasil di atas didapatkan bahwasanya
Populasi yang tinggi meningatkan tingkat kehidupan.
Benua Asia memiliki populasi paling banyak dengan tingat kehidupan paling tidak stabil
GDP rata-rata bera pada 0 - 40000 dengan populasi 0 - 200000000. Kecuali Oceania
Sehingga, populasi yang meningkat kurang mempengaruhi GDP namun meningkatkan harapan hidup.
Mengetahui seberapa besar korelasi antara variabel numerik
Pada tahapan ini, akan mencari dicari korelasi antar kolom numerik. Tujuannya untuk mengetahui sebarap kuat hubungan antar kolom tersebut dengan patokan kolom yang digunakan adalah GDP dikarenakan kolom GDP akan dijadikan label (Y) untuk membuat model machine learning tersebut. Pada tahapan ini akan dilakukan dua tahapan
Mencari korelasi sebelum outlier dihapus
Mencari korelasi setelah outlier dihapus (Penghapus outlier akan menggunakan metode IQR dengan mencari terlebih dahulu nilai upper whisker dan lower whisker)
Korelasi yang digunakan adalah Rank Spearman dikarenakan H0 yang mengasumsikan data berdistribusi normal ditolak. Formula Rank Spearman seperti berikut
![](https://static.wixstatic.com/media/67563d_1980dfbcecae47c49350e7e7659bbada~mv2.png/v1/fill/w_221,h_85,al_c,q_85,enc_avif,quality_auto/67563d_1980dfbcecae47c49350e7e7659bbada~mv2.png)
def spearman_correlation(df):
plt.figure(figsize=(15,10))
sns.heatmap(df.corr(method = 'spearman'), annot = True, annot_kws = {'fontsize' : 15}, linewidth = 0.1)
plt.xticks(fontsize = 15)
plt.yticks(fontsize = 15)
![](https://static.wixstatic.com/media/67563d_5de8ecbbc96d4befb10acd59f529974e~mv2.png/v1/fill/w_871,h_107,al_c,q_85,enc_avif,quality_auto/67563d_5de8ecbbc96d4befb10acd59f529974e~mv2.png)
Hasil di atas dapat disimpulkan bahwa:
Total outlier menggunakan upper dan lower whisker memiliki total yang lebih banyak dikarenakan ketentuan angka untuk data outlier lebih kecil dibandingkan dengan upper dan lower ekstrim.
Sehingga dengan data yang dimiliki kurang 10000, maka data yang dinyatakan outlier akan menggunakan syarat upper dan lower ekstrim yang memiliki proporsi 8.86% dari seleruh data
Selanjutnya akan dilakukan penghapus menggunakan syarat upper dan lower ekstrim
df_hapus_outlier = df.copy()
df_hapus_outlier = df[~((df_hapus_outlier[['population', 'life_exp', 'gdp_cap']] < el) | (df_hapus_outlier[['population', 'life_exp', 'gdp_cap']] > eu)).any(axis = 1)]
df_hapus_outlier
Untuk memudahkan analisis perbandingan, maka saya buat hasilnya bersebelahan
![](https://static.wixstatic.com/media/67563d_5ab641cec58b4d8191799bacbb758491~mv2.png/v1/fill/w_980,h_327,al_c,q_85,usm_0.66_1.00_0.01,enc_avif,quality_auto/67563d_5ab641cec58b4d8191799bacbb758491~mv2.png)
Hasil perbandingan didapatkan informasi bahwa Penghapusan outlier ternyata mengurangi korelasi antar variabel yang dibuktikan pada kolom life_expation dari 0.83 menjadi 0.82. Namun berbanding terbalik dengan korelasi antar populasi yang justru menaikkan dari 0.052 menjadi 0.072. Dikarenakan terjadi penurunan yang berbanding terbalik, mari kita kembali ke informasi sebelumnya tentang pengaruh populasi terhadap life_expation dan populasi dan life_expation terhadap GDP untuk menentukan data yang mana yang nantinya digunakan untuk melatih model.
Sebelumnya kita telah mengetahui bahwa
populasi yang meningkat, menaikkan jumlah harapan hidup
Harapan hidup yang meningkat juga meningkatkan GDP yang didapatkan.
Namun populasi yang meningkat tidak berpengaruh signifikan terhadap GDP yang didapatkan hal tersebut dibuktikkan hasil lineplot sebelumnya dan korelasi di atas.
Sehingga untuk jika ditarik kesimpulan dengan konsep matematika a. p => q (fakta 1) b. q => r (fakta 2) c. p => ~r (fakta 3) Maka kesimpulan yang didapatkan adalah p => ~r, sehingga bisa dikatakan populasi tidak berpengaruh signifikan terhadap GDP. Sehingga yang data yang digunakan adalah data sebelum penghapusan outlier
Tahap selanjutnya yang dilakukan adalah proses transformasi data. Hal ini dikarenakan data yang terlalu besar yang membebankan model untuk melatih dan memprediksi nantinya. Transformasi yang dilakukan pada data numerik menggunakan standard scaler dan pada data kategorik menggunakan one-hot encoder. Khusus transformasi data numerik, dilakukan setelah proses pembagian data yang dikarenakan untuk mencegah bias saat pelatihan model dimana dilihat dari proporsi data latih dan uji berbeda.
Data Preparation
Pada tahapan ini, one-hot encoder hanya terjadi pada kolom continent dikarenakan jumlah negara adalah 142 dan nantinya jika di encoder akan terlalu banyak menghasilkan kolom baru dan menurunkan peforma model. Maka kolom continent yang akan dilakukan one-hot encoder, selanjut dilakukan split dataset.
Split dataset digunakan untuk mempersiapkan data latih dan data uji terhadap model machine learning yang akan dibuat. Dikarenakan dataset bersikap interval pada tahun, maka data tidak dirandom yang dibutuhkan fungsi shuffle. Untuk proporsi data latih dan uji adalah 90:10, dikarenakan dataset yang kita miliki dibawah 10000.
Proses kedua tahapan tersebut akan dibungkus dalam sebuah yang dinamakan pipeline, dimana pipeline ini juga kan membungkus model yang akan digunakan. Model yang digunakan adalah KNN dan Boosting. Hasil kedua model akan di evaluasi menggunakan mean squared error (MSE) dan hasil tersebut dapat menentukan model yang baik dalam melakukan prediksi.
Berikut alur proses yang dilakukan.
Split dataset
Membuat pipeline dengan isi a. untuk numerical -> standarscaler b. untuk categorical -> one-hot encoder c. Masukkan model yang digunakan.
Lakukan Tuning Menggunakan GridSearchCV
Split dataset
X = df.drop(['gdp_cap'], axis = 1)
y = df['gdp_cap']
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.1, shuffle = False)
Pemisahan dataset tidak dilakukan secara acak. Sehingga parameter shuffle diberikan False
Buat pipeline
#Untuk numerik
numerical_pipeline = Pipeline([
("scaler", StandardScaler())
])
#Untuk kategorik
categorical_pipeline = Pipeline([
("onehotencoder", OneHotEncoder())
])
Setelah membuat pipeline untuk masing-masing proses tipe data, maka selanjutnya gabungkan kedua tahapan itu kedalam 1 pipeline besar dengan bantuan ColumnTransformer dengan target masing-masing kolom yang akan di proses
pipeline_besar = ColumnTransformer([
("numerik", numerical_pipeline, ['population', 'life_exp']),
("kategorik", categorical_pipeline, ['continent'])
])
Setelah menggabungkan kedua pipeline kedalam pipeline_besar, selanjutnya tinggal tambahkan model machine learning yang akan digunakan. Kasus ini menggunkan KNN dan Boosting Algoritma
model_knn = Pipeline([
('pipeline_besar', pipeline_besar),
('knn', KNeighborsRegressor())
])
model_boosting = Pipeline([
('pipeline_besar', pipeline_besar),
('boosting', AdaBoostRegressor())
])
Setelah membuat pipeline_final, kita akan melakukan proses Tuning dan Cross Validation menggunakan GridSearchCV.
GridSearchCV
Parameter yang digunakan untuk knn yaitu jumlah tetangga nya yang dimulai dari 1 hingga 10 dan untuk boosting menggunakan learning rate dari 1 hingga 3
parameter_knn = {
'knn__n_neighbors': range(1,11)
}
parameter_boosting = {
'boosting__learning_rate': range(1,4)
}
mse = make_scorer(mean_squared_error, greater_is_better = False)
knn = GridSearchCV(model_knn, parameter_knn, cv=10, n_jobs=-1, verbose=1, scoring = mse)
boost = GridSearchCV(model_boosting, parameter_boosting, cv = 10, n_jobs=-1, verbose=1, scoring = mse)
Setelah itu melakukan fit dan tuning terhadap data train. Hasil tersebut akan menghasil sebuah data dictionary dan setelah itu dapat dicari parameter terbaiknya.
knn.best_params_
boost.best_params_
![](https://static.wixstatic.com/media/67563d_a11e996bbfb641d2bff6dfdf00d8b82c~mv2.png/v1/fill/w_195,h_25,al_c,q_85,enc_avif,quality_auto/67563d_a11e996bbfb641d2bff6dfdf00d8b82c~mv2.png)
![](https://static.wixstatic.com/media/67563d_952ed0fba79f46b5b9305b20eafd23eb~mv2.png/v1/fill/w_242,h_23,al_c,q_85,enc_avif,quality_auto/67563d_952ed0fba79f46b5b9305b20eafd23eb~mv2.png)
Hasil diatas menunjukkan bahwa
Untuk KNN nilai N yang baik untuk melakukan prediksi adalah 10
Sedangkan pada Boosting, learning rate yang baik adalah 1
Selanjutnya mari kita uji hasil perbandingan tersebut dengan dengan melihat score X_test. Pada sklearn, otomatis menggunakan parameter yang terbaik untuk digunakan
knn.score(X_test, y_test), boost.score(X_test, y_test)
![](https://static.wixstatic.com/media/67563d_b4ad8c6b687d42ac97ccd434de82537d~mv2.png/v1/fill/w_307,h_32,al_c,q_85,enc_avif,quality_auto/67563d_b4ad8c6b687d42ac97ccd434de82537d~mv2.png)
Ternyata, nilai mse paling kecil didapatkan oleh knn dengan nilai mse dibawah -40000000. Mari kita lihat jika model diberikan nilai baru yang berada pada salah satu data testing (untuk memastikan saja :v).
data = {'Nilai_Asli': y_test.iloc[:2],
'KNN': knn.predict(X_test.iloc[:2]),
'Boosting_(Adaboost)': boost.predict(X_test.iloc[:2])
}
df_perbandingan = pd.DataFrame(data = data)
df_perbandingan
![](https://static.wixstatic.com/media/67563d_9a01d56cade2439aa85e24d56025046f~mv2.png/v1/fill/w_361,h_89,al_c,q_85,enc_avif,quality_auto/67563d_9a01d56cade2439aa85e24d56025046f~mv2.png)
Ternyata memang KNN, hehe. Selanjutnya akan proses save model dan develop model
Source Code dapat anda temukan di github saya. Silahkan klik button di bawah ini.
Comments