#Packages untuk pengolahan dataframe
library(dplyr)
library(tidyr)
library(lubridate)
#Packages untuk membuat visualisasi
library(ggcorrplot)
library(gplots)
library(ggplot2)
library(plotly)
library(foreign)
#Packages untuk melakukan analisis
library(plm)
library(lfe)
library(lmtest)
library(car)
library(tseries)
library(MLmetrics)Data panel merupakan gabungan data cross section dan time series (runtun/ deret waktu). Dengan kata lain, data panel merupakan data dari beberapa individu sama yang diamati dalam kurun waktu tertentu. Terkadang data panel disebut juga data longitudinal.
contoh data panel:
1. Keuntungan Data Panel
Data panel yang menggabungkan data data cross section dan time series, memiliki beberapa keunggulan dibandingkan data cross-sectional saja atau data deret waktu saja, antara lain:
Mendapatkan sampel yang besar sehingga lebih banyak informasi dan lebih sedikit multikolinieritas di antara variabel-variabel sehingga meningkatkan efisiensi estimasi ekonometrika
Model yang dapat diinterpretasikan, kita dapat menginterpretasikan koefisien regresi dalam kerangka efek cross-section dan time-series.
2. Struktur Data Panel
Data panel memiliki tiga jenis data, yaitu cross section, pooled cross section, dan panel.
Data cross sectional adalah jenis data yang dikumpulkan dengan mengamati banyak subjek pada satu titik atau periode waktu.
Pooled Cross sectional adalah jenis data yang mengamati satu subjek pada banyak titik atau periode waktu.
Panel data adalah jenis data yang mengamati banyak subjek pada banyak titik atau periode waktu.
Jika jumlah unit waktu sama untuk setiap individu, maka data disebut balanced panel. Jika sebaliknya, yakni jumlah unit waktu berbeda untuk setiap individu, maka disebut unbalanced panel
3. Model Data Panel
Jika kita memiliki T periode waktu (t = 1, 2, …, T) dan N jumlah individu (i = 1, 2, …, N), maka dengan data panel kita akan memiliki total unit observasi sebanyak NT.
\[y_{it} = \beta_0+\beta _{1t}*x_{1t}+u_{it}\]
Dimana:
berdasarkan model tersebut indeks i menjadi dimensi untuk cross sectional dan indeks t menjadi dimensi untuk deret waktu. Sedangkan \(u_{it}\) adalah nilai yang menunjukkan heterogenitas antar cross sectional dan deret waktu di dalam mode, yang didefinisikan sebagai berikut:
\[u_{it} = \mu _i+\lambda _t+\upsilon _{it}\]
dimana:
Dua komponen pertama \(\mu _i\) dan \(\lambda _t\) disebut juga sebagai within component sedangkan komponen terakhir \(\upsilon _{it}\) merupakan panel or between component
Terdapat tiga pendekatan yang digunakan dalam model panel yaitu Common/ Polled Effects, Fixed Effects dan Random Effects.
1. Model Common/ Pooled Effects (CEM)
Model gabungan atau common effect model (CEM) atau pooled least square (PLS) merupakan pendekatan model data panel yang sederhana karena mengkombinasikan data time series dan cross section, tanpa memperhatikan pengaruh spesifik waktu maupun individu. Koefisien regresi (intersep ataupun kemiringan) diasumsikan konstan antar individu dan waktu. Metode ini bisa menggunakan pendekatan ordinary least square (OLS) atau metode kuadrat terkecil (MKT) untuk mengestimasi model data panel. Untuk membuat model CEM di R dapat menggunakan fungsi plm() dari package plm dengan parameter sebagai berikut:
formula = Target ~ Prediktordata = berupa dataframeindex = c(“kolom_individu”,“kolom_waktu”)model = “pooling”2. Fixed Effects
Model pengaruh tetap atau fixed effect model (FEM) merupakan model yang mengasumsikan antara unit individu atau waktu memiliki perilaku yang berbeda, terlihat dari nilai intersep yang berbeda untuk setiap unit individu atau waktu, tetapi konstan pada nilai koefisien kemiringan dan koefisien regresi antara unit individu maupun waktu (Gujarati dan Porter 2009). Pendugaan parameter model pengaruh tetap dapat menggunakan Metode Kuadrat Terkecil Peubah Boneka (least square dummy variable) dan MKT. Untuk membuat model CEM di R dapat menggunakan fungsi plm() dari package plm dengan parameter sebagai berikut:
formula = Target ~ Prediktordata = berupa dataframeindex = c(“kolom_individu”,“kolom_waktu”)model = “within”3. Random Effects
Menurut Baltagi (2011), model pengaruh acak atau random effect model digunakan ketika individu amatan mengikuti kaidah pengacakan dari sejumlah populasi yang besar sehingga pengaruh pada setiap individu bersifat acak. Pendugaan parameter pada model pengaruh acak yaitu dengan metode kuadrat terkecil terampat (generalized least square). Model ini memiliki asumsi bahwa tidak ada korelasi antara pengaruh spesifik individu dan pengaruh spesifik waktu dengan peubah bebas sehingga komponen sisaan dari kedua pengaruh spesifik dimasukkan ke dalam model. Untuk membuat model CEM di R dapat menggunakan fungsi plm() dari package plm dengan parameter sebagai berikut:
formula = Target ~ Prediktordata = berupa dataframeindex = c(“kolom_individu”,“kolom_waktu”)model = “random”Untuk memilih model mana yang terbaik dari ketiga model diatas, perlu dilakukan pengujian hipotesis berikut ini:
Uji Chow
Menurut Ghozali dan Ratmono (2013), uji chow digunakan untuk memilih pendekatan yang lebih baik antara model gabungan dengan model pengaruh tetap. Untuk melakukan uji Chow dapat menggunakan fungsi pooltest(model_cem, model_fem), dengan hipotesis yang diujikan adalah sebagai berikut.
Keputusan tolak H0 (model pengaruh tetap terpilih) apabila nilai p-value < α.
Uji Hausman
Uji spesifikasi Hausman membandingkan model pengaruh tetap dan model pengaruh acak. Jika hipotesis nol yang menyatakan tidak ada korelasi antara pengaruh individu dengan regresor tidak ditolak, model pengaruh random disarankan daripada pengaruh tetap (Susanti 2013). Untuk melakukan uji Chow di R dapat menggunakan fungsi phtest(model_rem, model_fem), dengan Hipotesis yang diuji adalah sebagai berikut.
Keputusan tolak H0 (model pengaruh tetap terpilih) apabila nilai p-value < α.
Pengujian Lanjutan
Apabila model gabungan atau model pengaruh acak yang terpilih sebagai model terbaik, perlu dilakukan uji lanjutan untuk memeriksa apakah model dipengaruhi oleh individu/waktu/individu & waktu. Untuk memeriksa pengaruh tersebut digunakan Uji Lagrange Multiplier.
Di R untuk melakukan Uji Lagrange Multiplier dapat dilakukan dengan menggunakan fungsi plmtest() dari package plm dengan parameter:
"bp" , menggunakan Breusch Pagan test"time" : untuk menguji pengaruh waktu"individual" : untuk menguji pengaruh individu"twoways" : untuk menguji pengaruh individu & waktuberikut hipotesis pengujian untuk pemeriksaan setiap pengaruh:
Pemeriksaan Pengaruh Individu & Waktu
Hipotesis yang diuji adalah sebagai berikut.
Pemeriksaan Pengaruh Individu
Hipotesis yang diuji adalah sebagai berikut.
Pemeriksaan Pengaruh Waktu
Hipotesis yang diuji adalah sebagai berikut.
dengan ketentuan untuk ketiga hipotesis adalah H0 ditolak jika P-value < α. Dimana nilai α yang umum digunakan adalah sebesar 5%.
dikarenakan analisis data panel menggunakan konsep regresi dan time series maka ada beberapa Asumsi yang perlu dipenuhi sebagai berikut:
Asumsi model linear regression:
Asumsi Time Series:
Note: Pengujian Asumsi hanya perlu dilakukan untuk model yang akan digunakan
1. Pemeriksaan Multikolinieritas
Multicollinearity adalah kondisi adanya korelasi antar prediktor yang kuat. Hal ini tidak diinginkan karena menandakan prediktor redundan pada model, yang seharusnya dapat dipilih salah satu saja dari variable yang hubungannya amat kuat tersebut. Harapannya tidak terjadi multicollinearity. Pemeriksaan Multikolinieritas bisa dilakukan dengan menggunakan fungsi fungsi vif(), dengan ketentuan
Note: Pemeriksaan asumsi multikolinieritas bisa dilakukan diawal sebelum dilakukan pemodelan data panel, dengan cara terlebih dahulu dilakukan pembuatan model regresi dengan fungsi lm() dan akan diujikan menggunakan fungsi vif().
2. Pengujian Asumsi Normalitas Residual
Model diharapkan menghasilkan error yang berdistribusi normal. Dengan begitu, error lebih banyak berkumpul di sekitar angka nol. Pengujian asumsi normalitas di R dapat dilakukan dengan menggunakan fungsi shapiro.test(). dengan hipotesis yang diujikan adalah sebagai berikut.
dengan ketentuan H0 ditolak jika P-value < α. Dimana nilai α yang umum digunakan adalah sebesar 5%.
3. Pengujian Asumsi Homogenitas Residual
Diharapkan error yang dihasilkan oleh model menyebar secara acak atau dapat dikatakan variasi konstan. Pengujian asumsi Homogenitas di R dapat dilakukan dengan menggunakan fungsi bptest(), dengan hipotesis yang diujikan adalah sebagai berikut.
dengan ketentuan H0 ditolak jika P-value < α. Dimana nilai α yang umum digunakan adalah sebesar 5%.
4. Pengujian Asumsi Autokorelasi
Untuk mengecek ada/tidaknya bisa menggunakan uji Ljung-box dengan menggunakan fungsi Box.test(residual model, type = "Ljung-Box), dengan hipotesis yang diujikan adalah sebagai berikut.
dengan ketentuan H0 ditolak jika P-value < α. Dimana nilai α yang umum digunakan adalah sebesar 5%.
Analisis data panel di R dapat dilakukan dengan mengikuti alur kerja berikut ini:
Eropa Barat adalah salah satu wilayah terkaya di dunia. Jerman memiliki produk domestik bruto tertinggi di Eropa dan surplus keuangan terbesar dibandingkan negara mana pun, Luksemburg memiliki PDB per kapita tertinggi di dunia, dan Jerman memiliki kekayaan nasional bersih tertinggi dibandingkan negara Eropa mana pun. Swiss dan Luksemburg mempunyai upah rata-rata tertinggi di dunia, masing-masing dalam nilai nominal dan PPP. Norwegia menempati peringkat tertinggi di dunia dalam Indeks Kemajuan Sosial. Bahasa yang paling umum di Eropa Barat adalah bahasa Inggris. Di tempat kedua dan ketiga masing-masing ada Perancis dan Jerman.
Selain dalam hal ekonomi, wilayah Eropa Barat terkenal dengan berbagai peristiwa sejarah seperti era Revolusi, Pencerahan (Enlightenment), hingga Industrialisasi. Selama dekade transformasi ekonomi dan sosial, Eropa Barat juga mengalami perubahan politik besar-besaran. Peristiwa sentral di sebagian besar benua ini adalah Revolusi Perancis (1789–99) dan setelahnya. Hal ini diikuti oleh upaya terpadu dalam reaksi politik dan serangkaian revolusi baru dari tahun 1820 hingga 1848. Berdasarkan berbagai fakta menarik dari segi ekonomi dan histori, penulis ingin menganalisis karakteristik masyarakat Eropa Barat, khusunya tingkat kebahagiaan beberapa negara di Eropa Barat berdasarkan informasi socio demografi yang tersedia pada World Happiness Report.
Untuk menganalisis tingkat kebahagiaan beberapa negara di asia tenggara menggunakan data yang diperoleh dari World Happiness Report 2023 yang dipublish melalui kaggle oleh USAMA BUTTAR.
Berikut adalah beberapa informasi dari setiap kolom:
Country.Name : Informasi nama negaraRegional.Indicator : Informasi regional negaraYear : tahunLife.Ladder : tingkat kebahagiaan [1-10]Log.GDP.Per.Capita : Log Gross Domestic Product per orang di suatu negaraSocial.Support : memiliki seseorang yang dapat diandalkan di saat-saat sulit.Healthy.Life.Expectancy.At.Birth :Freedom.To.Make.Life.Choices : kebebasan untuk menentukan pilihan [0-1]Generosity : seberapa sering seseorang mengeluarkan uang untuk donasi perbulanPerceptions.Of.Corruption : Persepsi terhadap korupsi [0-1]Positive.Affect : rata-rata ukuran efek hari sebelumnya untuk tawa, kesenangan, dan interestNegative.Affect : rata-rata dari ukuran efek hari sebelumnya untuk kekhawatiran, kesedihan, dan kemarahanConfidence.In.National.Goverment : seberapa percaya terhadap pemerintahanPada tahapan preparasi data ini akan dilakukan beberapa hal berikut:
data_input dengan nama World_Happiness_Report.csv# 1. import dataset
df <- read.csv("data_input/World_Happiness_Report.csv")
# 2. mengambil data wilayah asia tenggara dan membuang kolom regional indikator
western_eu <- df %>%
filter(Regional.Indicator == "Western Europe") %>%
select(-Regional.Indicator)
head(western_eu)unique(western_eu$Country.Name) %>% length()#> [1] 20
unique(western_eu$Country.Name)#> [1] "Austria" "Belgium" "Cyprus" "Denmark"
#> [5] "Finland" "France" "Germany" "Greece"
#> [9] "Iceland" "Ireland" "Italy" "Luxembourg"
#> [13] "Malta" "Netherlands" "Norway" "Portugal"
#> [17] "Spain" "Sweden" "Switzerland" "United Kingdom"
Untuk memeriksa apakah data kita sudah balance dapat kita gunakan 2 cara yakni:
1. Melihat frekuensi data berdasarkan index individu
# Your Code Here
table(western_eu$Country.Name)#>
#> Austria Belgium Cyprus Denmark Finland
#> 15 16 15 17 15
#> France Germany Greece Iceland Ireland
#> 17 17 16 10 16
#> Italy Luxembourg Malta Netherlands Norway
#> 17 12 14 16 12
#> Portugal Spain Sweden Switzerland United Kingdom
#> 15 17 17 12 17
2. Menggunakan fungsi is.pbalanced()
Untuk melakukannya dapat kita gunakan fungsi is.pbalanced() dengan catatan data dalam format pdata.frame. Apabila data belum dalam format pdata.frame, kita dapat menambahkan parameter index("kolom individu", "kolom waktu"). Hasil yang diharapkan dari pemeriksaannya adalah TRUE yang artinya data panel sudah seimbang.
# Your Code Here
is.pbalanced(western_eu,index = c("Country.Name","Year"))#> [1] FALSE
Dari hasil pemeriksaan frekuensi dan balancing data diatas terlihat bahwa:
negara_cut = c("Luxembourg", "Iceland", "Switzerland", "Norway")
western_eu <- western_eu[!(western_eu$Country.Name %in% negara_cut),]
western_eu$Country.Name %>% unique() %>% length()#> [1] 16
1. Membuat Panel Data Frame
Agar data kita dapat melakukan balancing, kita perlu mengubah format data yang kita miliki menjadi sebuah panel data frame terlebih dahulu. Untuk memembuat panel data frame dapat kita lakukan dengan fungsi pdata.frame() dengan parameter:
data : data yang akan digunakanindex : c(“informasi individu”,“informasi waktu”)#membuat pdata.frame
western_eu <- western_eu %>% pdata.frame(index = c("Country.Name","Year"))
#memeriksa struktur data
glimpse(western_eu)#> Rows: 257
#> Columns: 12
#> $ Country.Name <fct> Austria, Austria, Austria, Austria, …
#> $ Year <fct> 2006, 2008, 2010, 2011, 2012, 2013, …
#> $ Life.Ladder <pseries> 7.122211, 7.180954, 7.302679, 7.…
#> $ Log.GDP.Per.Capita <pseries> 10.83645, 10.88118, 10.85598, 10…
#> $ Social.Support <pseries> 0.9363504, 0.9345928, 0.9141933,…
#> $ Healthy.Life.Expectancy.At.Birth <pseries> 69.500, 69.700, 69.900, 70.000, …
#> $ Freedom.To.Make.Life.Choices <pseries> 0.9413823, 0.8790693, 0.8959798,…
#> $ Generosity <pseries> 0.298436075, 0.287321180, 0.1269…
#> $ Perceptions.Of.Corruption <pseries> 0.4901112, 0.6136252, 0.5461448,…
#> $ Positive.Affect <pseries> 0.7461531, 0.7162965, 0.7103019,…
#> $ Negative.Affect <pseries> 0.1738117, 0.1731945, 0.1557925,…
#> $ Confidence.In.National.Government <pseries> 0.4970378, 0.2572422, 0.4864466,…
Dengan pengubahan tipe data menjadi pdata.frame akan otomatis mengubah type data dari setiap kolom,
2. Mememeriksa Dimensi Data
untuk memeriksa dimendi data panel dapat kita gunakan fungsi pdim()
# Your Code Here
pdim(western_eu)#> Unbalanced Panel: n = 16, T = 14-17, N = 257
dari pemeriksaan dimensi data panel diatas dapat kita ketahui bahwa:
Apabila data panel yang kita miliki tidak balance kita dapat melakukan balancing menggunakan fungsi make.pbalanced dengan parameter balance.type yang dapat diisi dengan 3 opsi berikut:
fill : untuk setiap kolom waktu yg hilang akan diberikan nilai NAshared.times : akan diambil keseluruhan individu dgn ketentuan informasi waktu terdapat di semua individushared.individuals : akan individu dengan ketentuan informasi waktu lengkapBalancing menggunakan fill
fill# Your Code Here
balance1 <- western_eu %>% make.pbalanced(balance.type = "fill")
table(balance1$Country.Name)#>
#> Austria Belgium Cyprus Denmark Finland
#> 18 18 18 18 18
#> France Germany Greece Ireland Italy
#> 18 18 18 18 18
#> Malta Netherlands Portugal Spain Sweden
#> 18 18 18 18 18
#> United Kingdom
#> 18
unique(balance1$Year)#> [1] 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
#> [16] 2020 2021 2022
#> 18 Levels: 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 ... 2022
is.pbalanced(balance1)#> [1] TRUE
pdim(balance1)#> Balanced Panel: n = 16, T = 18, N = 288
balance1Sekarang data yang kosong sudah di isi dengan NA agar nanti dapat dikenali dan di isi.
sebelum kita periksa kelengkapan data kita perlu mengetahui berapa banyak informasi waktu yang ditambahkan dari tahapan sebelumnya
colSums(is.na(balance1)) - colSums(is.na(western_eu))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 31 31
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 31 31
#> Freedom.To.Make.Life.Choices Generosity
#> 31 31
#> Perceptions.Of.Corruption Positive.Affect
#> 31 31
#> Negative.Affect Confidence.In.National.Government
#> 31 31
berdasarkan pemeriksaan diatas dapat diketahui bahwa dari data western_eu ketika dilakukan balancing terjadi penambahan 7 baris nilai NA untuk setiap kolom.
colSums(is.na(balance1))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 31 33
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 31 31
#> Freedom.To.Make.Life.Choices Generosity
#> 31 44
#> Perceptions.Of.Corruption Positive.Affect
#> 37 31
#> Negative.Affect Confidence.In.National.Government
#> 31 48
Confidence.In.National.Government dan Generosity tidak akan disertakan dalam pembuatan model ini.# drop kolom yang tidak digunakan
balance1 <- balance1 %>% select(-Confidence.In.National.Government, -Generosity)Untuk pemeriksaan dan melakukan pengisian nilai yang hilang maka akan dilakukan dengan cara interpolasi secara terpisah untuk setiap negara.
1. Austria
# periksa nilai missing per negara
aus <- balance1 %>% filter(Country.Name == "Austria")
colSums(is.na(aus))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 3 3
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 3 3
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 3 3
#> Positive.Affect Negative.Affect
#> 3 3
insight: Terdapat beberapa kolom yang memiliki nilai missing seperti Life.Ladder hingga Negative.Affect sehingga perlu diisi dengan nilai yang hilang dengan nilai rata-rata dari nilai yang dekat dengan nilai missing menggunakan fungsi na.fill() dengan fill = "extend"
# mengisi nilai missing
aus <- aus %>% mutate(
Life.Ladder = na.fill(Life.Ladder, fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita, fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices, fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption, fill = "extend"),
Positive.Affect = na.fill(Positive.Affect, fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(aus)#> [1] FALSE
2. Belgium
# periksa nilai missing per negara
bel <- balance1 %>% filter(Country.Name == "Belgium")
colSums(is.na(bel))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 2 2
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 2 2
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 2 2
#> Positive.Affect Negative.Affect
#> 2 2
insight: Terdapat kolom yang memiliki missing value sehingga perlu diisi.
# mengisi nilai missing
bel <- bel %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(bel)#> [1] FALSE
3. Cyprus
# periksa nilai missing per negara
cy <- balance1 %>% filter(Country.Name == "Cyprus")
colSums(is.na(cy))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 3 4
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 3 3
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 3 3
#> Positive.Affect Negative.Affect
#> 3 3
insight: Terdapat kolom yang memiliki missing value sehingga perlu diisi.
# mengisi nilai missing
cy <- cy %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(cy)#> [1] FALSE
4. Denmark
# periksa nilai missing per negara
den <- balance1 %>% filter(Country.Name == "Denmark")
colSums(is.na(den))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 1 1
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 1 1
#> Positive.Affect Negative.Affect
#> 1 1
insight : Terdapat kolom yang memiliki missing value sehingga perlu diisi.
# mengisi nilai missing
den <- den %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(den)#> [1] FALSE
5. Finland
# periksa nilai missing per negara
fin <- balance1 %>% filter(Country.Name == "Finland")
colSums(is.na(fin))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 3 3
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 3 3
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 3 3
#> Positive.Affect Negative.Affect
#> 3 3
# mengisi nilai missing
fin <- fin %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(fin)#> [1] FALSE
6. France
# periksa nilai missing per negara
fra <- balance1 %>% filter(Country.Name == "France")
colSums(is.na(fra))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 1 1
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 1 1
#> Positive.Affect Negative.Affect
#> 1 1
#mengisi nilai missing
fra <- fra %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(fra)#> [1] FALSE
7. Germany
# periksa nilai missing per negara
ger <- balance1 %>% filter(Country.Name == "Germany")
colSums(is.na(ger))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 1 1
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 1 1
#> Positive.Affect Negative.Affect
#> 1 1
#mengisi nilai missing
ger <- ger %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(ger)#> [1] FALSE
8. Greece
# periksa nilai missing per negara
gre <- balance1 %>% filter(Country.Name == "Greece")
colSums(is.na(gre))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 2 2
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 2 2
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 2 2
#> Positive.Affect Negative.Affect
#> 2 2
#mengisi nilai missing
gre <- gre %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(gre)#> [1] FALSE
9. Ireland
# periksa nilai missing per negara
ire <- balance1 %>% filter(Country.Name == "Ireland")
colSums(is.na(ire))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 2 2
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 2 2
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 2 2
#> Positive.Affect Negative.Affect
#> 2 2
#mengisi nilai missing
ire <- ire %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(ire)#> [1] FALSE
10. Italy
# periksa nilai missing per negara
ita <- balance1 %>% filter(Country.Name == "Italy")
colSums(is.na(ita))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 1 1
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 1 1
#> Positive.Affect Negative.Affect
#> 1 1
#mengisi nilai missing
ita <- ita %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(ita)#> [1] FALSE
11. Malta
# periksa nilai missing per negara
mal <- balance1 %>% filter(Country.Name == "Malta")
colSums(is.na(mal))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 4 5
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 4 4
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 4 9
#> Positive.Affect Negative.Affect
#> 4 4
#mengisi nilai missing
mal <- mal %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(mal)#> [1] FALSE
12. Netherlands
# periksa nilai missing per negara
net <- balance1 %>% filter(Country.Name == "Netherlands")
colSums(is.na(net))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 2 2
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 2 2
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 2 2
#> Positive.Affect Negative.Affect
#> 2 2
#mengisi nilai missing
net <- net %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(net)#> [1] FALSE
13. Portugal
# periksa nilai missing per negara
por <- balance1 %>% filter(Country.Name == "Portugal")
colSums(is.na(por))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 3 3
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 3 3
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 3 3
#> Positive.Affect Negative.Affect
#> 3 3
#mengisi nilai missing
por <- por %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(por)#> [1] FALSE
14. Spain
# periksa nilai missing per negara
spa <- balance1 %>% filter(Country.Name == "Spain")
colSums(is.na(spa))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 1 1
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 1 1
#> Positive.Affect Negative.Affect
#> 1 1
#mengisi nilai missing
spa <- spa %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(spa)#> [1] FALSE
15. Sweden
# periksa nilai missing per negara
swe <- balance1 %>% filter(Country.Name == "Sweden")
colSums(is.na(swe))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 1 1
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 1 2
#> Positive.Affect Negative.Affect
#> 1 1
#mengisi nilai missing
swe <- swe %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(swe)#> [1] FALSE
16. United Kingdom
# periksa nilai missing per negara
uk <- balance1 %>% filter(Country.Name == "United Kingdom")
colSums(is.na(uk))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 1 1
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 1 1
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 1 1
#> Positive.Affect Negative.Affect
#> 1 1
#mengisi nilai missing
uk <- uk %>% mutate(
Life.Ladder = na.fill(Life.Ladder ,fill = "extend"),
Log.GDP.Per.Capita = na.fill(Log.GDP.Per.Capita ,fill = "extend"),
Social.Support = na.fill(Social.Support ,fill = "extend"),
Healthy.Life.Expectancy.At.Birth = na.fill(Healthy.Life.Expectancy.At.Birth ,fill = "extend"),
Freedom.To.Make.Life.Choices = na.fill(Freedom.To.Make.Life.Choices ,fill = "extend"),
Perceptions.Of.Corruption = na.fill(Perceptions.Of.Corruption ,fill = "extend"),
Positive.Affect = na.fill(Positive.Affect ,fill = "extend"),
Negative.Affect = na.fill(Negative.Affect, fill = "extend"))
anyNA(uk)#> [1] FALSE
Setelah semua negara tidak lagi terdapat nilai yang missing, selanjutnya kita akan gabungkan kembali dan akan disimpan pada objek dengan nama balanced2
# Your Code Here
balanced2 <- bind_rows(
aus, bel, cy, den, fin, fra,
gre, ger, ire, ita, mal,
net, por, spa, swe, uk
) Pemeriksaan Kembali keseimbangan data
# Your Code Here
pdim(balanced2)#> Balanced Panel: n = 16, T = 18, N = 288
Pemeriksaan Kembali kelengkapan data
# Your Code Here
colSums(is.na(balanced2))#> Country.Name Year
#> 0 0
#> Life.Ladder Log.GDP.Per.Capita
#> 0 0
#> Social.Support Healthy.Life.Expectancy.At.Birth
#> 0 0
#> Freedom.To.Make.Life.Choices Perceptions.Of.Corruption
#> 0 0
#> Positive.Affect Negative.Affect
#> 0 0
Data telah siap untuk digunakan pada tahapan selanjutnya
summary(balanced2)#> Country.Name Year Life.Ladder Log.GDP.Per.Capita
#> Austria: 18 2005 : 16 Min. :4.720 Min. :10.21
#> Belgium: 18 2006 : 16 1st Qu.:6.332 1st Qu.:10.58
#> Cyprus : 18 2007 : 16 Median :6.870 Median :10.73
#> Denmark: 18 2008 : 16 Mean :6.772 Mean :10.71
#> Finland: 18 2009 : 16 3rd Qu.:7.312 3rd Qu.:10.86
#> France : 18 2010 : 16 Max. :8.019 Max. :11.62
#> (Other):180 (Other):192
#> Social.Support Healthy.Life.Expectancy.At.Birth Freedom.To.Make.Life.Choices
#> Min. :0.6866 Min. :68.30 Min. :0.3692
#> 1st Qu.:0.8957 1st Qu.:70.02 1st Qu.:0.7888
#> Median :0.9281 Median :70.77 Median :0.8700
#> Mean :0.9139 Mean :70.65 Mean :0.8325
#> 3rd Qu.:0.9448 3rd Qu.:71.28 3rd Qu.:0.9161
#> Max. :0.9825 Max. :73.00 Max. :0.9711
#>
#> Perceptions.Of.Corruption Positive.Affect Negative.Affect
#> Min. :0.1324 Min. :0.5159 Min. :0.1344
#> 1st Qu.:0.4111 1st Qu.:0.6568 1st Qu.:0.2011
#> Median :0.5964 Median :0.7050 Median :0.2380
#> Mean :0.5883 Mean :0.6978 Mean :0.2512
#> 3rd Qu.:0.8051 3rd Qu.:0.7428 3rd Qu.:0.2984
#> Max. :0.9620 Max. :0.8256 Max. :0.4822
#>
Berdasarkan ringkasan diatas dapat kita ketahui beberapa hal berikut:
Untuk mengetahui seberapa besar tingkat hubungan antar variabel prediktor terhadap variabel target, dapat kita gunakan fungsi ggcorrplot.
# Your Code Here
balanced2 %>% select(-Country.Name, -Year) %>% cor() %>% ggcorrplot(type = "lower", lab = TRUE) - Berdasarkan hasil plot heatmap diatas, dapat diketahui bahwa Variabel yang memiliki Hubungan terhadap Life.Ladder adalah: 1. Perception.Of.Corruption (-0.84) -> Sangat Kuat. 2. Negative Affect (-0.78) -> Kuat. 3. Positive.Affect (0.75) -> Kuat. 4. Log.GDP.Per.Capita (0.75) -> Kuat. 5. Freedom.To.Make.Life.Choices (0.73) -> Kuat. 6. Social.Support (0.68) -> Kuat. 7. Healthy.Life.Expectancy.At.Birth (-0.11) -> Sangat Lemah.
Healthy.Life.Expectancy.At.Birt memiliki korelasi satu sama lain yang relatif sedang hingga kuat.Untuk melihat lebih dalam informasi dari data yang kita miliki dapat kita lakukan dengan menggunakan fungsi coplot() dengan parameter
formula = diisikan dengan target ~ index1 given index2type = "l" untuk line dan "b" untuk point & line plotdata = datasetrows = banyaknya baris panel plot yang dibuatcol = warna plot yang disajikan1. Life.ladder
# Your Code Here
coplot(Life.Ladder ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red") Berdasarkan Coplot plot diatas dapat kita ketahui bahwa : - Secara keseluruhan warga negara yang merasa paling bahagia di beberapa negara Eropa Barat adalah warga negara Denmark dan Finland. - Secara keseluruhan warga negara yang memiliki tingkat kebahagiaan terendah di beberapa negara Eropa Barat adalah warga negara Greece dan Portugal.
2. Perceptions.Of.Corruption
# Your Code Here
coplot(Perceptions.Of.Corruption ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red") Berdasarkan Coplot plot diatas dapat kita ketahui bahwa : - Secara keseluruhan tingkat persepsi korupsi terendah di beberapa negara Eropa Barat adalah negara Denmark, Finland, dan Swedan. - Secara keseluruhan tingkat persepsi korupsi tinggi di beberapa negara Eropa Barat adalah negara Portugal, Greece, dan Cyprus.
3. Negative.Affect
# Your Code Here
coplot(Negative.Affect ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red")Berdasarkan Coplot plot diatas dapat kita ketahui bahwa : - Secara keseluruhan masyarakat yang beberapa hari sebelum survei memiliki rasa negatif tinggi di beberapa negara Eropa Barat adalah Italy, Greece, Cyprus, Portugal, dan Spain. - Secara keseluruhan masyarakat yang beberapa hari sebelum survei memiliki rasa negatif rendah di beberapa negara Eropa Barat adalah Finland, Swedan, UK dan Netherlands.
4. Positive.Affect
# Your Code Here
coplot(Positive.Affect ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red")Berdasarkan Coplot plot diatas dapat kita ketahui bahwa : - Secara keseluruhan masyarakat yang beberapa hari sebelum survei memiliki rasa positif tinggi di beberapa negara Eropa Barat adalah Denmark, Ireland, dan Swedan.
- Secara keseluruhan masyarakat yang beberapa hari sebelum survei memiliki rasa positif rendah di beberapa negara Eropa Barat adalah Greece, Itali, dan Malta.
5. Freedom.To.Make.Life.Choices
# Your Code Here
coplot(Freedom.To.Make.Life.Choices ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red")Berdasarkan Coplot plot diatas dapat kita ketahui bahwa : - Secara keseluruhan masyarakat yang memiliki kebebasan dalam membuat pilihan tertinggi di beberapa negara Eropa Barat adalah Denmark, Finland, . - Secara keseluruhan masyarakat yang memiliki kebebasan dalam membuat pilihan terendah di beberapa negara Eropa Barat adalah Greece.
6. Log.GDP.Per.Capita
# Your Code Here
coplot(Log.GDP.Per.Capita ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red") Berdasarkan plot diatas dapat kita ketahui bahwa :
7. Social.Support
# Your Code Here
coplot(Social.Support ~ Year|Country.Name,
type = "b",
data = balanced2,
rows = 1,
col = "red") Berdasarkan plot diatas dapat kita ketahui bahwa :
Untuk melihat heterogenitas antar individu dan waktu kita dapat menggunakan fungsi plotmeans() dari package gplots dengan parameter:
1. Heterogenitas antar negara
plotmeans( Life.Ladder ~ Country.Name, data = balanced2, main="Heterogenitas Life.Ladder antar Negara") Insight : 1. Berdasarkan hasil visual diatas terdapat beberapa negara yang memiliki keragaman tingkat kebahagiaan yang rendah (stabil) yang terlihat dari gap yang kecil : - Austria - Belgium - Denmark - Finland - France - Ireland - Netherlands - Sweden - United Kingdom
2. Heterogenitas antar Waktu
plotmeans(Life.Ladder ~ Year, data = balanced2, main="Heterogenitas Life.Ladder antar Tahun") Insight : - Berdasarkan hasil visual diatas terlihat bahwa data antar tahun cukup heterogen - Secara keseluruhan trend perkembangan tingkat kebahagiaan di Eropa Barat relatif menurun.
Tahapan cross validation akan selalu dilakukan sebelum pembuatan model, data akan dibagi menjadi data train dan data test. Dikarenakan data panel memiliki informasi keterangan waktu maka pembagian data tidak boleh diambil secara acak melainkan dibagi dengan cara dipisah secara berurutan.
untuk melakukannya kita bisa menggunakan bantuan fungsi filter()
#membuat data train
ladder_train <- balanced2 %>% filter(Year != 2022)
#membuat data test
ladder_test <- balanced2 %>% filter(Year == 2022)setelah dilakukan cross validation kita perlu memastikan kembali bahwa data train sudah balance dengan melakukan balancing
ladder_train <- ladder_train %>%
droplevels() %>% # menghapus informasi waktu yang diambil sebagai data test (tahun 2022)
make.pbalanced() # melakukan balancing kembali
is.pbalanced(ladder_train)#> [1] TRUE
Dikarenakan pada hasil pemeriksaan korelasi pada tahapan EDA sebelumnya menunjukkan adanya indikasi multikolinieritas antar variabel prediktor, maka akan dilakukan pemeriksaan asumsi multikolinieritas terlebih dahulu dengan cara pembuatan model regresi dengan fungsi lm() dan dilanjutkan pengujian menggunakan fungsi vif().
nilai VIF > 10: terjadi multicollinearity pada model nilai VIF < 10: tidak terjadi multicollinearity pada model
# your code here
lm(Life.Ladder ~ .-Country.Name -Year, ladder_train) %>% vif()#> Log.GDP.Per.Capita Social.Support
#> 2.664008 2.056762
#> Healthy.Life.Expectancy.At.Birth Freedom.To.Make.Life.Choices
#> 1.227298 2.827466
#> Perceptions.Of.Corruption Positive.Affect
#> 3.418823 3.250428
#> Negative.Affect
#> 2.791441
Insight: Semua variabel kita tidak memiliki Multikolinieritas sehingga bisa dilanjutkan ke tahap berikutnya.
Untuk setiap pembuatan model akan digunakan fungsi plm() dari package plm dengan parameter sebagai berikut:
formula = Target ~ Prediktordata = berupa dataframeindex = c(“kolom_individu”,“kolom_waktu”)model =
"pooling" : untuk model CEM"within" : untuk model FEM"random" : untuk model REMdimana
Model Gabungan (CEM)
membuat Common effect model dan disimpan kedalam objek cem
# membuat Common effect model
cem <- plm(Life.Ladder ~ Perceptions.Of.Corruption + Negative.Affect + Positive.Affect + Log.GDP.Per.Capita + Freedom.To.Make.Life.Choices + Social.Support,
data = ladder_train,
index = c("Country.Name","Year"),
model = "pooling")Model Pengaruh Tetap (FEM)
membuat model FEM dengan memberikan parameter tambahan effect = "twoways" untuk memasukan pengaruh individu dan waktu, kemudian disimpan kedalam objek fem.two
# membuat fixed effect model
fem <- plm(Life.Ladder ~ Perceptions.Of.Corruption + Negative.Affect + Positive.Affect + Log.GDP.Per.Capita + Freedom.To.Make.Life.Choices + Social.Support,
data = ladder_train,
index = c("Country.Name","Year"),
model = "within")Uji Chow
Uji chow dilakukan untuk memilih model terbaik antara model gabungan (cem) dengan model fixed effec (fem). untuk melakukan uji Chow dapat menggunakan fungsi pooltest(model_cem, model_fem)
Hipotesis yang diuji adalah sebagai berikut:
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
# your code here
pooltest(cem,fem)#>
#> F statistic
#>
#> data: Life.Ladder ~ Perceptions.Of.Corruption + Negative.Affect + Positive.Affect + ...
#> F = 18.477, df1 = 15, df2 = 250, p-value < 0.00000000000000022
#> alternative hypothesis: unstability
Berdasarkan hasil uji chow diatas, kita peroleh nilai p-value < α. artinya Model terbaik untuk digunakan pada data World Happines adalah fixed effect model.
Model Pengaruh Acak (REM)
membuat random effect model dan disimpan kedalam objek rem
# membuat random effect model
rem <- plm(Life.Ladder ~ Perceptions.Of.Corruption + Negative.Affect + Positive.Affect + Log.GDP.Per.Capita + Freedom.To.Make.Life.Choices + Social.Support,
data = ladder_train,
index = c("Country.Name","Year"),
model = "random")# Error model random effect karena jumlah variabel prediktor dan target > jumlah index individu
# plm(Life.Ladder ~ Log.GDP.Per.Capita + Social.Support + Perceptions.Of.Corruption + Negative.Affect + Positive.Affect + Generosity,
# data = ladder_train,
# index = c("Country.Name","Year"),
# model = "random")Uji Hausman
Untuk melakukan uji Chow di R dapat menggunakan fungsi phtest(model_rem, model_fem), dengan Hipotesis yang diuji adalah sebagai berikut.
Keputusan tolak H0 (model pengaruh tetap terpilih) apabila nilai p-value < α.
# your code here
phtest(rem,fem)#>
#> Hausman Test
#>
#> data: Life.Ladder ~ Perceptions.Of.Corruption + Negative.Affect + Positive.Affect + ...
#> chisq = 6.2429, df = 6, p-value = 0.3965
#> alternative hypothesis: one model is inconsistent
Berdasarkan hasil uji hausman diatas, kita peroleh nilai p-value > α. artinya Model terbaik untuk digunakan pada data World Happines adalah Random Effect Model sehingga diperlukan uji tambahan untuk memastikan REM terbaik untuk data kita, yakni Uji Lagrange Multiplier (LM).
Uji Lagrange Multiplier (LM)
Untuk melakukan uji Lagrange Multiplier (LM) di R dapat menggunakan fungsi plmtest(model_rem, type=c("bp")), dengan Hipotesis yang diuji adalah sebagai berikut. - H0 : Common Effect Model (CEM) lebih baik dibandingkan Random Effect Model (REM) - H1 : Random Effect Model (REM) lebih baik dibandingkan Common Effect Model (CEM)
Jika nilai p-value < tingkat signifikansi (0.05), maka tolak hipotesis nol (H0).
# Melakukan Uji Lagrange Multiplier
test <- plmtest(rem, type=c("bp"))
# Menampilkan hasil uji
print(test)#>
#> Lagrange Multiplier Test - (Breusch-Pagan)
#>
#> data: Life.Ladder ~ Perceptions.Of.Corruption + Negative.Affect + Positive.Affect + ...
#> chisq = 409.39, df = 1, p-value < 0.00000000000000022
#> alternative hypothesis: significant effects
Berdasarkan uji di Lagrange Multiplier (LM) diperoleh nilai p-value < tingkat signifikansi maka kita tolak H0 sehingga model Random Effect Model (REM) terbukti lebih baik dibandingkan Common Effect Model (CEM).
Normalitas
Hipotesis yang diuji adalah sebagai berikut.
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
# your code here
rem$residuals %>% shapiro.test()#>
#> Shapiro-Wilk normality test
#>
#> data: .
#> W = 0.99461, p-value = 0.4527
Berdasarkan hasil pengujian normalitas sisaan diperoleh nilai p-value > 0.05, artinya sisaan menyebar secara normal.
Homogenitas
Hipotesis yang diuji adalah sebagai berikut.
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
# your code here
rem %>% bptest()#>
#> studentized Breusch-Pagan test
#>
#> data: .
#> BP = 34.971, df = 6, p-value = 0.000004366
Berdasarkan hasil pengujian homogenitas diperoleh nilai p-value < 0.05, artinya sisaan tidak memiliki ragam yang homogen.
Autokorelasi
Hipotesis yang diuji adalah sebagai berikut.
H0 ditolak jika P-value < α. Nilai α yang digunakan sebesar 5%.
# your code here
rem$residuals %>% Box.test(type = "Ljung-Box")#>
#> Box-Ljung test
#>
#> data: .
#> X-squared = 67.054, df = 1, p-value = 0.000000000000000222
Berdasarkan hasil pengujian autokorelasi diperoleh nilai p-value < 0.05, artinya terjadi permasalahan autokorelasi antar sisaan.
Intercept dan Koefisien - Random Effect Model (REM)
# your code here
summary(rem)#> Oneway (individual) effect Random Effect Model
#> (Swamy-Arora's transformation)
#>
#> Call:
#> plm(formula = Life.Ladder ~ Perceptions.Of.Corruption + Negative.Affect +
#> Positive.Affect + Log.GDP.Per.Capita + Freedom.To.Make.Life.Choices +
#> Social.Support, data = ladder_train, model = "random", index = c("Country.Name",
#> "Year"))
#>
#> Balanced Panel: n = 16, T = 17, N = 272
#>
#> Effects:
#> var std.dev share
#> idiosyncratic 0.03921 0.19801 0.434
#> individual 0.05123 0.22635 0.566
#> theta: 0.7925
#>
#> Residuals:
#> Min. 1st Qu. Median 3rd Qu. Max.
#> -0.53678 -0.12188 -0.01623 0.13498 0.67366
#>
#> Coefficients:
#> Estimate Std. Error z-value Pr(>|z|)
#> (Intercept) -2.58557 1.90129 -1.3599 0.173861
#> Perceptions.Of.Corruption -0.45713 0.17269 -2.6471 0.008118 **
#> Negative.Affect -2.88707 0.40961 -7.0484 0.00000000000181 ***
#> Positive.Affect 0.40741 0.44564 0.9142 0.360596
#> Log.GDP.Per.Capita 0.69428 0.15762 4.4048 0.00001058894691 ***
#> Freedom.To.Make.Life.Choices 1.52263 0.26759 5.6903 0.00000001268484 ***
#> Social.Support 1.50455 0.54866 2.7422 0.006103 **
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Total Sum of Squares: 24.3
#> Residual Sum of Squares: 10.395
#> R-Squared: 0.57221
#> Adj. R-Squared: 0.56253
#> Chisq: 354.468 on 6 DF, p-value: < 0.000000000000000222
Interpretasi:
\[life.ladder = -2.58557 - 0.45713 Perceptions.Of.Corruption - 2.88707Negative.Affect + 0.40741Positive.Affect + \\ 0.69428Log.GDP.Per.Capita + 1.52263Freedom.To.Make.Life.Choices + 1.50455Social.Support + uit\]
Variabel yang signifikan mempengaruhi tingkat kebahagiaan masyarakat di suatu negara adalah :
Berdasarkan 5 variabel yang signifikan, Negative.Affect memberikan pengaruh terbesar dibandingkan dengan keempat variabel signifikan lainnya (dilihat dari angka estimate). Setiap pertambahan 1 rata-rata dari ukuran efek negatif hari sebelumnya akan mengurangi tingkat kebahagiaan sebesar 2.88707. Artinya masyarakat negara di Eropa Barat, pengalaman atau perasaan buruk di hari sebelumnya akan sangat mempengaruhi tingkat kebahagiaan mereka. Mereka relatif menyimpan pengalaman buruk sehingga sangat mempengaruhi tingkat kebahagiaan mereka.
Berdasarkan 5 variabel yang signifikan, Freedom.To.Make.Life.Choices memberikan pengaruh terbesar kedua. Setiap pertambahan 1 tingkat Freedom.To.Make.Life.Choices akan menambah tingkat kebahagiaan sebesar 1.52263. Artinya kebebasan merupakan suatu acuan yang penting dalam budaya dan kehidupan masyarakat negara-negara Eropa Barat karena memiliki pengaruh yang besar dan signifikan terhadap tingkat kebahagiaan.
Berdasarkan 5 variabel yang signifikan, Social.Support memberikan pengaruh terbesar ketiga. Setiap pertambahan 1 tingkat Social.Support akan menambah tingkat kebahagiaan sebesar 1.50455. Artinya adanya dukungan sosial berupa teman dalam kondisi sulit merupakan hal krusial dalam mempengaruhi tingkat kebahagiaan masyarakat di Eropa Barat.
Berdasarkan 5 variabel yang signifikan, Log.GDP.Per.Capita memberikan pengaruh terbesar keempat. Setiap pertambahan 1 rata-rata dari Log.GDP.Per.Capita akan menambah tingkat kebahagiaan sebesar 0.69428. Artinya masyarakat negara di Eropa Barat memiliki karakteristik bahwa peningkatan GDP Perkapita dapat meningkatkan kesejahteraan atau tingkat kebahagiaan.
Berdasarkan 5 variabel yang signifikan, Perceptions.Of.Corruption memberikan pengaruh terbesar kelima. Setiap pertambahan 1 tingkat Perceptions.Of.Corruption akan mengurangi tingkat kebahagiaan sebesar 0.45713. Artinya tingkat persepsi korupsi penting di negara-negara Eropa Barat, namun secara pengaruh relatif lebih kecil dibandingkan variabel lainnya terhadap tingkat kebahagiaan. Hal ini disebabkan mayoritas negara Eropa Barat memiliki tingkat persepsi korupsi yang sudah rendah sehingga indikator ini merupakan hal umum dan keharusan bukan menjadi menentu kuat dalam menentukan tingkat kebahagiaan masyarakat.
Untuk melakukan prediksi akan kita gunakan fungsi predict() dengan parameter:
# your code here
pred <- predict(rem, ladder_test, na.fill = F)Untuk menguji apakah model yang kita miliki sudah baik dalam memprediksi data baru maka kita akan evaluasi dengan menggunakan nilai error, salah satu metric eror yang biasa digunakan adalah MAPE. Kita dapat melakukannya menggunakan fungsi MAPE() dengan parameter:
# your code here
MAPE(y_pred = pred,
y_true = ladder_test$Life.Ladder)#> [1] 0.03133279
Insight: tingkat kesalahan prediski model fem dalam memprediksi nilai baru adalah sebesra 3,13%, artinya model sudah baik untuk digunakan dalam memprediksi data yang baru.
Dari serangkaian proses analisis yang telah dilakukan, dapat kita peroleh kesimpulan sebagai berikut:
Perceptions.Of.Corruption, Freedom.To.Make.Life.Choices, Positive.Affect)Perceptions.Of.Corruption, Negative.Affect, Freedom.To.Make.Life.Choices, Positive.Affect)Perceptions.Of.Corruption, Negative.Affect, dan Log.GDP.Per.Capita).Saran:
Negative.Affect dengan membudayakan masyarakat yang dapat menerima hal-hal seperti kekhawatiran, kesedihan, dan kemarahan melalui penguatan agama, manajemen emosi dan sebagainya.Social.Support sehingga berdampak pada peningkatan kebahagiaan masyarakat.