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: 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, …
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)
| 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 |
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`.
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`.
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)
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, …
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)
| 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)
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.
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")
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
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
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") )
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
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
#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