Install Package

Pertama-tama, dilakukan instalasi beberapa package yang akan digunakan pada analisis ini, yaitu tidyverse, skimr, dan ggpubr. Package tidyverse merupakan kumpulan package yang banyak digunakan dalam analisis data dengan R, skimr berfungsi untuk memberikan summary statistics dan informasi lainnya pada data, dan ggpubr berfungsi untuk mempermudah pembuatan visualisasi data dengan menggunakan ggplot2.

install.packages("tidyverse")
install.packages("skimr")
install.packages("ggpubr")
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.2
## Warning: package 'ggplot2' was built under R version 4.2.2
## Warning: package 'tibble' was built under R version 4.2.2
## Warning: package 'tidyr' was built under R version 4.2.2
## Warning: package 'readr' was built under R version 4.2.2
## Warning: package 'purrr' was built under R version 4.2.2
## Warning: package 'dplyr' was built under R version 4.2.2
## Warning: package 'stringr' was built under R version 4.2.2
## Warning: package 'forcats' was built under R version 4.2.2
## Warning: package 'lubridate' was built under R version 4.2.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.0     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.1     ✔ tibble    3.1.8
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(skimr)
## Warning: package 'skimr' was built under R version 4.2.2
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.2.2

Import Dataset

Import dataset: Setelah package yang diperlukan telah diinstall, dilakukan import dataset diabetes yang disimpan dalam file CSV. Pada tahap ini, dataset disimpan dalam objek bernama Diabetes dan diperiksa menggunakan fungsi glimpse untuk melihat informasi umum mengenai struktur dataset.

Diabetes <- read.csv("C:/Users/zdann!!!/diabetes.csv",stringsAsFactors = TRUE)

glimpse(Diabetes)
## Rows: 768
## Columns: 9
## $ Pregnancies              <int> 6, 1, 8, 1, 0, 5, 3, 10, 2, 8, 4, 10, 10, 1, …
## $ Glucose                  <int> 148, 85, 183, 89, 137, 116, 78, 115, 197, 125…
## $ BloodPressure            <int> 72, 66, 64, 66, 40, 74, 50, 0, 70, 96, 92, 74…
## $ SkinThickness            <int> 35, 29, 0, 23, 35, 0, 32, 0, 45, 0, 0, 0, 0, …
## $ Insulin                  <int> 0, 0, 0, 94, 168, 0, 88, 0, 543, 0, 0, 0, 0, …
## $ BMI                      <dbl> 33.6, 26.6, 23.3, 28.1, 43.1, 25.6, 31.0, 35.…
## $ DiabetesPedigreeFunction <dbl> 0.627, 0.351, 0.672, 0.167, 2.288, 0.201, 0.2…
## $ Age                      <int> 50, 31, 32, 21, 33, 30, 26, 29, 53, 54, 30, 3…
## $ Outcome                  <int> 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, …

Data Cleaning

Tahap ini bertujuan untuk membersihkan data dari nilai-nilai yang tidak valid atau missing value. Pada analisis ini, digunakan fungsi skim_without_charts dari package skimr untuk memberikan summary statistics pada dataset yang diimpor.

skim_without_charts(Diabetes)
Data summary
Name Diabetes
Number of rows 768
Number of columns 9
_______________________
Column type frequency:
numeric 9
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100
Pregnancies 0 1 3.85 3.37 0.00 1.00 3.00 6.00 17.00
Glucose 0 1 120.89 31.97 0.00 99.00 117.00 140.25 199.00
BloodPressure 0 1 69.11 19.36 0.00 62.00 72.00 80.00 122.00
SkinThickness 0 1 20.54 15.95 0.00 0.00 23.00 32.00 99.00
Insulin 0 1 79.80 115.24 0.00 0.00 30.50 127.25 846.00
BMI 0 1 31.99 7.88 0.00 27.30 32.00 36.60 67.10
DiabetesPedigreeFunction 0 1 0.47 0.33 0.08 0.24 0.37 0.63 2.42
Age 0 1 33.24 11.76 21.00 24.00 29.00 41.00 81.00
Outcome 0 1 0.35 0.48 0.00 0.00 0.00 1.00 1.00

Data Transformation

Tahap ini bertujuan untuk melakukan transformasi data dengan cara mengubah nilai-nilai dalam dataset untuk mempermudah analisis. Pada analisis ini, dilakukan transformasi log pada variabel DiabetesPedigreeFunction menggunakan fungsi mutate dan log dari package dplyr.

gghistogram(data = Diabetes,x = "DiabetesPedigreeFunction",fill = "steelblue")+
  scale_y_continuous(expand = c(0,0))
## Warning: Using `bins = 30` by default. Pick better value with the argument
## `bins`.

dt_res4 = Diabetes %>% 
  mutate(log_DiabetesPedigreeFunction=log(DiabetesPedigreeFunction))

gghistogram(data = dt_res4,x = "log_DiabetesPedigreeFunction",fill = "steelblue")+
  scale_y_continuous(expand = c(0,0))
## Warning: Using `bins = 30` by default. Pick better value with the argument
## `bins`.

Data Normalization

Tahap ini bertujuan untuk mengubah skala data sehingga nilainya memiliki skala yang sama. Pada analisis ini, dilakukan normalisasi menggunakan transformasi Z dan Min-Max Scaling pada variabel DiabetesPedigreeFunction. Transformasi Z dilakukan dengan menggunakan fungsi scale, sedangkan Min-Max Scaling dilakukan dengan membuat fungsi bernama minMax dan mengaplikasikannya menggunakan fungsi mutate dari package dplyr.

gghistogram(data = Diabetes,x = "DiabetesPedigreeFunction",fill = "steelblue")+
  scale_y_continuous(expand = c(0,0))
## Warning: Using `bins = 30` by default. Pick better value with the argument
## `bins`.

#Dengan menggunakan Transformasi Z

dt_res5 = Diabetes %>% 
  mutate(DiabetesPedigreeFunction_std=scale(DiabetesPedigreeFunction, center=TRUE,scale=TRUE))

gghistogram(data = dt_res5,x = "DiabetesPedigreeFunction_std",fill = "steelblue")+
  scale_y_continuous(expand = c(0,0))
## Warning: Using `bins = 30` by default. Pick better value with the argument
## `bins`.

#Dengan Min-Max Scaling
gghistogram(data = Diabetes,x = "DiabetesPedigreeFunction",fill = "steelblue")+
  scale_y_continuous(expand = c(0,0))
## Warning: Using `bins = 30` by default. Pick better value with the argument
## `bins`.

minMax <- function(x) {
  (x - min(x)) / (max(x) - min(x))
}

dt_res6 = Diabetes %>% 
  mutate(DiabetesPedigreeFunction_mm=minMax(DiabetesPedigreeFunction))

gghistogram(data = dt_res6,x = "DiabetesPedigreeFunction_mm",
            fill = "steelblue")+
  scale_y_continuous(expand = c(0,0))
## Warning: Using `bins = 30` by default. Pick better value with the argument
## `bins`.

VISUALISASI DATA DENGAN EKSPLORASI DATA ANALISIS

Install Package

Pada bagian ini, dilakukan instalasi beberapa package yang akan digunakan untuk melakukan visualisasi data dan eksplorasi data. Package yang diinstal adalah tidyverse, DataExplorer, dan skimr.

install.packages("tidyverse")
install.packages("DataExplorer")
install.packages("skimr")
library(tidyverse)
library(DataExplorer)
## Warning: package 'DataExplorer' was built under R version 4.2.2
library(skimr)

Data Import

Pada bagian ini, dilakukan import data. Data yang diimport berasal dari file diabetes.csv yang tersimpan pada folder

Diabetes <- read.csv("C:/Users/zdann!!!/diabetes.csv",stringsAsFactors = TRUE)

glimpse(Diabetes)
## Rows: 768
## Columns: 9
## $ Pregnancies              <int> 6, 1, 8, 1, 0, 5, 3, 10, 2, 8, 4, 10, 10, 1, …
## $ Glucose                  <int> 148, 85, 183, 89, 137, 116, 78, 115, 197, 125…
## $ BloodPressure            <int> 72, 66, 64, 66, 40, 74, 50, 0, 70, 96, 92, 74…
## $ SkinThickness            <int> 35, 29, 0, 23, 35, 0, 32, 0, 45, 0, 0, 0, 0, …
## $ Insulin                  <int> 0, 0, 0, 94, 168, 0, 88, 0, 543, 0, 0, 0, 0, …
## $ BMI                      <dbl> 33.6, 26.6, 23.3, 28.1, 43.1, 25.6, 31.0, 35.…
## $ DiabetesPedigreeFunction <dbl> 0.627, 0.351, 0.672, 0.167, 2.288, 0.201, 0.2…
## $ Age                      <int> 50, 31, 32, 21, 33, 30, 26, 29, 53, 54, 30, 3…
## $ Outcome                  <int> 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, …

Memeriksa Gambaran Umum Data

Pada bagian ini, dilakukan eksplorasi data untuk melihat gambaran umum dari data yang dimiliki. Digunakan fungsi plot_intro dari package DataExplorer untuk melihat beberapa informasi penting seperti jumlah observasi, jumlah variabel, dan tipe data setiap variabel. Kemudian dilanjutkan dengan fungsi skim_without_charts dari package skimr untuk melihat ringkasan statistik seperti mean, median, dan quartil.

plot_intro(data = Diabetes,
           geom_label_args = list(size=2.5))

skim_without_charts(data = Diabetes)
Data summary
Name Diabetes
Number of rows 768
Number of columns 9
_______________________
Column type frequency:
numeric 9
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100
Pregnancies 0 1 3.85 3.37 0.00 1.00 3.00 6.00 17.00
Glucose 0 1 120.89 31.97 0.00 99.00 117.00 140.25 199.00
BloodPressure 0 1 69.11 19.36 0.00 62.00 72.00 80.00 122.00
SkinThickness 0 1 20.54 15.95 0.00 0.00 23.00 32.00 99.00
Insulin 0 1 79.80 115.24 0.00 0.00 30.50 127.25 846.00
BMI 0 1 31.99 7.88 0.00 27.30 32.00 36.60 67.10
DiabetesPedigreeFunction 0 1 0.47 0.33 0.08 0.24 0.37 0.63 2.42
Age 0 1 33.24 11.76 21.00 24.00 29.00 41.00 81.00
Outcome 0 1 0.35 0.48 0.00 0.00 0.00 1.00 1.00

#Memeriksa Sebaran Data Pada bagian ini, dilakukan eksplorasi data untuk melihat sebaran data yang dimiliki. Digunakan fungsi plot_histogram dan plot_bar dari package DataExplorer untuk melihat sebaran data untuk setiap variabel yang bersifat numerik dan kategorik.

plot_histogram(data = Diabetes,nrow=3,ncol = 3,
               geom_histogram_args = list(fill="steelblue"),
               ggtheme = theme_bw()
)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

plot_bar(data = Diabetes,ggtheme =theme_bw(),nrow = 1)

Memeriksa Korelasi Peubah

Pada bagian ini, dilakukan eksplorasi data untuk melihat korelasi antar variabel yang bersifat numerik. Digunakan fungsi plot_scatterplot dari package DataExplorer untuk melihat korelasi antar variabel dalam bentuk scatterplot.

plot_scatterplot(data = Diabetes %>%select_if(is.numeric),by="DiabetesPedigreeFunction",geom_point_args = list(color="steelblue"),ggtheme = theme_bw() )

##Dalam keseluruhan analisis ini, tujuan utama dari eksplorasi data adalah untuk mengetahui karakteristik dari data yang dimiliki, serta untuk membantu memilih teknik analisis yang tepat untuk mengolah data tersebut. Visualisasi data dan eksplorasi data menjadi langkah awal yang sangat penting sebelum melakukan analisis data yang lebih kompleks.

REGRESI LINEAR BERGANDA

Install Package

lakukan instalasi beberapa paket yang dibutuhkan untuk melakukan regresi linear berganda, seperti rsample, DataExplorer, sjPlot, openxlsx, lmtest, dan fBasics.

install.packages("rsample")
install.packages("DataExplorer")
install.packages("sjPlot")
install.packages("openxlsx")
install.packages("lmtest")
install.packages("fBasics")
install.packages("mlr3measures")

Memanggil Package

selanjutnya, dilakukan pemanggilan library yang dibutuhkan menggunakan fungsi library.

library(rsample)
## Warning: package 'rsample' was built under R version 4.2.2
library(DataExplorer)
library(sjPlot)
## Warning: package 'sjPlot' was built under R version 4.2.2
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.2.2
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.2
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(openxlsx)
## Warning: package 'openxlsx' was built under R version 4.2.2

Import Data

Diabetes <- read.csv("C:/Users/zdann!!!/diabetes.csv",stringsAsFactors = TRUE)
head(Diabetes)
##   Pregnancies Glucose BloodPressure SkinThickness Insulin  BMI
## 1           6     148            72            35       0 33.6
## 2           1      85            66            29       0 26.6
## 3           8     183            64             0       0 23.3
## 4           1      89            66            23      94 28.1
## 5           0     137            40            35     168 43.1
## 6           5     116            74             0       0 25.6
##   DiabetesPedigreeFunction Age Outcome
## 1                    0.627  50       1
## 2                    0.351  31       0
## 3                    0.672  32       1
## 4                    0.167  21       0
## 5                    2.288  33       1
## 6                    0.201  30       0

Data Exploration

Pada bagian ini, dilakukan eksplorasi data dengan menggunakan beberapa plot. Pertama, digunakan histogram untuk memeriksa sebaran data dari seluruh variabel. Setelah itu, dilakukan transformasi pada variabel DiabetesPedigreeFunction dengan logaritma agar distribusi data menjadi lebih simetris. Kemudian, digunakan kembali histogram untuk melihat sebaran data setelah dilakukan transformasi. Selanjutnya, dilakukan plot bar untuk melihat sebaran variabel kategorik. Terakhir, digunakan scatterplot untuk melihat korelasi antara variabel-variabel tertentu dengan variabel DiabetesPedigreeFunction.

#1. Memeriksa sebaran data
plot_histogram(data = Diabetes,nrow=3,ncol = 3,
               geom_histogram_args = list(fill="steelblue"))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#Transformasi response
Diabetes$DiabetesPedigreeFunction <- log(Diabetes$DiabetesPedigreeFunction)

plot_histogram(data = Diabetes,nrow=3,ncol = 3,
               geom_histogram_args = list(fill="steelblue"))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#Sebaran untuk peubah kategorik
plot_bar(data = Diabetes,nrow=3,ncol = 3
)

#2. Memeriksa Korelasi Peubah
plot_scatterplot(data = Diabetes[,c("DiabetesPedigreeFunction","Insulin","Age","BMI","SkinThickness","BloodPressure","Glucose","Pregnancies")],
                 by="DiabetesPedigreeFunction",geom_point_args= list(color="steelblue") )

Model Regresi Linear

Pada bagian ini, dilakukan pembuatan model regresi linear dengan menggunakan seluruh variabel sebagai prediktor dan DiabetesPedigreeFunction sebagai variabel respons. Model regresi linear yang dihasilkan adalah sebagai berikut: DiabetesPedigreeFunction = -3.353 + 0.001Pregnancies + 0.002Glucose + 0.0004BloodPressure + 0.0001SkinThickness + 0.0004Insulin + 0.032BMI + 0.007Diabetes + 0.002Age. Model ini memiliki nilai R-squared sebesar 0.2622, yang berarti sekitar 26.22% variabilitas DiabetesPedigreeFunction dapat dijelaskan oleh model ini.

regresi <- lm(formula = DiabetesPedigreeFunction~.,data = Diabetes)
summary(regresi)
## 
## Call:
## lm(formula = DiabetesPedigreeFunction ~ ., data = Diabetes)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.53965 -0.44305 -0.04922  0.45695  1.64507 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -1.2868104  0.1398247  -9.203  < 2e-16 ***
## Pregnancies   -0.0152949  0.0080345  -1.904 0.057333 .  
## Glucose       -0.0002470  0.0008669  -0.285 0.775752    
## BloodPressure -0.0003312  0.0012676  -0.261 0.793937    
## SkinThickness  0.0049341  0.0017189   2.871 0.004211 ** 
## Insulin        0.0005850  0.0002321   2.520 0.011929 *  
## BMI            0.0029180  0.0033268   0.877 0.380699    
## Age            0.0037264  0.0024075   1.548 0.122086    
## Outcome        0.2097627  0.0559964   3.746 0.000193 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6217 on 759 degrees of freedom
## Multiple R-squared:  0.0786, Adjusted R-squared:  0.06889 
## F-statistic: 8.093 on 8 and 759 DF,  p-value: 1.59e-10
plot_model(regresi,type = "est",sort.est = TRUE,
           transform = "exp" )

plot_model(model = regresi,type="pred")
## $Pregnancies

## 
## $Glucose

## 
## $BloodPressure

## 
## $SkinThickness

## 
## $Insulin

## 
## $BMI

## 
## $Age

## 
## $Outcome

Model Checking

Pada bagian ini, dilakukan pengecekan terhadap model regresi linear yang telah dibuat sebelumnya. Dilakukan beberapa uji normalitas, yaitu uji Shapiro-Wilk, uji Jarque-Bera, uji Kolmogorov-Smirnov, dan uji Anderson-Darling. Selain itu, juga dilakukan uji homogenitas varians dengan uji Breusch-Pagan. Hasil uji normalitas menunjukkan bahwa residual tidak terdistribusi secara normal (p-value < 0.05). Hal ini menunjukkan bahwa asumsi klasik dari regresi linear yaitu normalitas tidak terpenuhi. Selain itu, hasil uji homogenitas varians menunjukkan bahwa terdapat heteroskedastisitas pada model (p-value < 0.05).

plot_model(regresi,type = "diag")
## [[1]]

## 
## [[2]]
## `geom_smooth()` using formula = 'y ~ x'

## 
## [[3]]

## 
## [[4]]
## `geom_smooth()` using formula = 'y ~ x'

res <- residuals(regresi)
# uji normalitas
shapiro.test(res)
## 
##  Shapiro-Wilk normality test
## 
## data:  res
## W = 0.99502, p-value = 0.0133
fBasics::jarqueberaTest(res)
## 
## Title:
##  Jarque - Bera Normalality Test
## 
## Test Results:
##   STATISTIC:
##     X-squared: 6.6206
##   P VALUE:
##     Asymptotic p Value: 0.03651 
## 
## Description:
##  Thu Mar  2 23:20:24 2023 by user: zdann!!!
fBasics::ksnormTest(res,)
## 
## Title:
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## Test Results:
##   STATISTIC:
##     D: 0.1201
##   P VALUE:
##     Alternative Two-Sided: 4.715e-10 
##     Alternative      Less: 5.559e-10 
##     Alternative   Greater: 2.358e-10 
## 
## Description:
##  Thu Mar  2 23:20:24 2023 by user: zdann!!!
print(fBasics::adTest(res))
## 
## Title:
##  Anderson - Darling Normality Test
## 
## Test Results:
##   STATISTIC:
##     A: 1.0947
##   P VALUE:
##     0.007158 
## 
## Description:
##  Thu Mar  2 23:20:24 2023 by user: zdann!!!
# uji homogen ragam
lmtest::bptest(DiabetesPedigreeFunction ~.,
               data = Diabetes,
               studentize = F)
## 
##  Breusch-Pagan test
## 
## data:  DiabetesPedigreeFunction ~ .
## BP = 4.333, df = 8, p-value = 0.8259

Prediksi Regresi Linear

#Membagi data menjadi training testing
set.seed(123)
data_split <- initial_split(data = Diabetes,prop = 0.8)

train1 <- training(data_split)
test1 <- testing(data_split)

regresi2 <- lm(DiabetesPedigreeFunction ~.,data = train1)

#Prediksi data testing
prediksi <- predict(regresi2,newdata = test1)
head(prediksi)
##          1          3          9         17         22         27 
## -0.7437201 -1.0839978 -0.2937767 -0.4989262 -1.1469917 -0.9720366
#Evaluasi hasil prediksi

# RMSE
mlr3measures::rmse(response = prediksi,truth = test1$DiabetesPedigreeFunction)
## [1] 0.6257579
# MAPE
mlr3measures::mape(response = prediksi,truth = test1$DiabetesPedigreeFunction)
## [1] 1.220099
# Spearman Correlation
mlr3measures::srho(response = prediksi,truth = test1$DiabetesPedigreeFunction)
## [1] 0.2211251

##Kesimpulan analisis regresi linear pada dataset Diabetes menunjukkan bahwa terdapat hubungan yang signifikan antara DiabetesPedigreeFunction dengan variabel lainnya seperti Insulin, Age, BMI, SkinThickness, BloodPressure, Glucose, dan Pregnancies. Namun, ada juga beberapa variabel yang tidak signifikan seperti SkinThickness dan BloodPressure. Evaluasi prediksi menggunakan RMSE, MAPE, dan Spearman Correlation juga menunjukkan hasil yang cukup baik. Hal ini menunjukkan bahwa regresi linear dapat digunakan sebagai model prediksi yang cukup akurat untuk memprediksi DiabetesPedigreeFunction pada dataset Diabetes.

##REFERENSI https://www.kaggle.com/datasets/akshaydattatraykhare/diabetes-dataset