R Markdown
options(repos = c(CRAN = "https://cloud.r-project.org"))
install.packages("tidyverse")
## Installing package into 'C:/Users/Muhammad Hafizh Ilmi/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'tidyverse' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Muhammad Hafizh Ilmi\AppData\Local\Temp\RtmpEnme0v\downloaded_packages
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.3
## Warning: package 'ggplot2' was built under R version 4.5.2
## Warning: package 'tidyr' was built under R version 4.5.2
## Warning: package 'purrr' was built under R version 4.5.2
## Warning: package 'dplyr' was built under R version 4.5.2
## Warning: package 'forcats' was built under R version 4.5.2
## Warning: package 'lubridate' was built under R version 4.5.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.0 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.1 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.2.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
install.packages("naniar")
## Installing package into 'C:/Users/Muhammad Hafizh Ilmi/AppData/Local/R/win-library/4.5'
## (as 'lib' is unspecified)
## package 'naniar' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Muhammad Hafizh Ilmi\AppData\Local\Temp\RtmpEnme0v\downloaded_packages
library(naniar)
## Warning: package 'naniar' was built under R version 4.5.3
getwd()
## [1] "C:/Folderan/EDA"
healthcare <- read.csv("C:/Folderan/EDA/cleaned_healthcare_messy_data.csv")
healthcare <- read.csv("cleaned_healthcare_messy_data.csv", sep = ";")
head(healthcare)
## Patient.Name Age Gender Condition Medication Visit.Date Blood.Pressure
## 1 david lee 25 Other Heart Disease METFORMIN 15/01/2020 140/90
## 2 emily davis 0 Male Diabetes NONE 120/80
## 3 laura martinez 35 Other Asthma METFORMIN 110/70
## 4 michael wilson 0 Male Diabetes ALBUTEROL 15/01/2020 110/70
## 5 david lee 0 Female Asthma NONE 110/70
## 6 mary clark 0 Male Hypertension METFORMIN 140/90
## Cholesterol Email Phone.Number
## 1 200 name@hospital.org 555-555-5555
## 2 200 no_email@example.com 000-000-0000
## 3 160 contact@domain.com 000-000-0000
## 4 0 name@hospital.org 555-555-5555
## 5 180 no_email@example.com
## 6 180 no_email@example.com 000-000-0000
glimpse(healthcare)
## Rows: 1,000
## Columns: 10
## $ Patient.Name <chr> "david lee", "emily davis", "laura martinez", "michael …
## $ Age <int> 25, 0, 35, 0, 0, 0, 0, 60, 60, 40, 25, 0, 40, 25, 70, 3…
## $ Gender <chr> "Other", "Male", "Other", "Male", "Female", "Male", "Ma…
## $ Condition <chr> "Heart Disease", "Diabetes", "Asthma", "Diabetes", "Ast…
## $ Medication <chr> "METFORMIN", "NONE", "METFORMIN", "ALBUTEROL", "NONE", …
## $ Visit.Date <chr> "15/01/2020", "", "", "15/01/2020", "", "", "", "", "15…
## $ Blood.Pressure <chr> "140/90", "120/80", "110/70", "110/70", "110/70", "140/…
## $ Cholesterol <int> 200, 200, 160, 0, 180, 180, 0, 0, 180, 220, 200, 200, 1…
## $ Email <chr> "name@hospital.org", "no_email@example.com", "contact@d…
## $ Phone.Number <chr> "555-555-5555", "000-000-0000", "000-000-0000", "555-55…
summary(healthcare)
## Patient.Name Age Gender Condition
## Length:1000 Min. : 0.00 Length:1000 Length:1000
## Class :character 1st Qu.:25.00 Class :character Class :character
## Mode :character Median :40.00 Mode :character Mode :character
## Mean :38.49
## 3rd Qu.:60.00
## Max. :70.00
## Medication Visit.Date Blood.Pressure Cholesterol
## Length:1000 Length:1000 Length:1000 Min. : 0.0
## Class :character Class :character Class :character 1st Qu.:160.0
## Mode :character Mode :character Mode :character Median :180.0
## Mean :145.5
## 3rd Qu.:200.0
## Max. :220.0
## Email Phone.Number
## Length:1000 Length:1000
## Class :character Class :character
## Mode :character Mode :character
##
##
##
colSums(is.na(healthcare))
## Patient.Name Age Gender Condition Medication
## 0 0 0 0 0
## Visit.Date Blood.Pressure Cholesterol Email Phone.Number
## 0 0 0 0 0
data_clean <- healthcare %>% drop_na()
df_isimedian <- healthcare %>% mutate(Cholesterol = replace_na(Cholesterol, median(Cholesterol, na.rm = TRUE)))
df_duplicate <- healthcare %>% distinct()
str(healthcare)
## 'data.frame': 1000 obs. of 10 variables:
## $ Patient.Name : chr "david lee" "emily davis" "laura martinez" "michael wilson" ...
## $ Age : int 25 0 35 0 0 0 0 60 60 40 ...
## $ Gender : chr "Other" "Male" "Other" "Male" ...
## $ Condition : chr "Heart Disease" "Diabetes" "Asthma" "Diabetes" ...
## $ Medication : chr "METFORMIN" "NONE" "METFORMIN" "ALBUTEROL" ...
## $ Visit.Date : chr "15/01/2020" "" "" "15/01/2020" ...
## $ Blood.Pressure: chr "140/90" "120/80" "110/70" "110/70" ...
## $ Cholesterol : int 200 200 160 0 180 180 0 0 180 220 ...
## $ Email : chr "name@hospital.org" "no_email@example.com" "contact@domain.com" "name@hospital.org" ...
## $ Phone.Number : chr "555-555-5555" "000-000-0000" "000-000-0000" "555-555-5555" ...
healthcare$Cholesterol <- gsub("[^0-9.]", "", healthcare$Cholesterol)
healthcare$Cholesterol <- as.numeric(healthcare$Cholesterol)
healthcare$Cholesterol <- gsub("\\.", "", healthcare$Cholesterol) # menghapus titik ribuan
healthcare$Cholesterol <- gsub(",", ".", healthcare$Cholesterol) # mengubah koma jadi titik
healthcare$Cholesterol <- as.numeric(healthcare$Cholesterol)
library(dplyr)
healthcare <- healthcare %>%
mutate(Cholesterol = Cholesterol %>%
gsub("\\.", "", .) %>%
gsub(",", ".", .) %>%
as.numeric())
summary(healthcare$Cholesterol)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 160.0 180.0 145.5 200.0 220.0
boxplot(healthcare$Cholesterol)

healthcare$Gender <- tolower(healthcare$Gender)
as.Date(healthcare$Visit.Date, format = "%d-%m-%Y")
## [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [25] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [49] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [73] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [97] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [121] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [145] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [169] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [193] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [217] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [241] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [265] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [289] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [313] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [337] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [361] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [385] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [409] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [433] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [457] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [481] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [505] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [529] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [553] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [577] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [601] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [625] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [649] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [673] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [697] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [721] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [745] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [769] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [793] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [817] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [841] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [865] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [889] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [913] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [937] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [961] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
## [985] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
healthcare <- healthcare %>% filter(Age > 0)
library(ggplot2)
ggplot(healthcare, aes(x = Cholesterol)) +
geom_histogram(bins = 30, fill = "steelblue") +
labs(title = "Distribusi Cholesterol Setelah Cleaning")

#Distribusi cholesterol menunjukkan pola yang relatif normal, menandakan proses cleaning berhasil menghilangkan nilai ekstrem yang tidak wajar.
ggplot(healthcare, aes(y = Cholesterol)) +
geom_boxplot(fill = "orange") +
labs(title = "Boxplot Cholesterol")

#Boxplot menunjukkan tidak adanya outlier ekstrem, sehingga data cholesterol dapat dianggap telah bersih dan siap digunakan untuk analisis lebih lanjut.
library(naniar)
vis_miss(healthcare)

ggplot() +
geom_histogram(data = healthcare, aes(x = Cholesterol), fill = "red", alpha = 0.5) +
geom_histogram(data = healthcare, aes(x = Cholesterol), fill = "blue", alpha = 0.5) +
labs(title = "Perbandingan Sebelum vs Sesudah Cleaning")
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

ggplot(healthcare, aes(x = Gender)) +
geom_bar(fill = "maroon") +
labs(title = "Distribusi Gender")

#Distribusi gender menunjukkan kategori yang sudah konsisten tanpa adanya duplikasi format, menandakan proses data cleaning berhasil mengatasi inkonsistensi data kategorikal.
#KESIMPULAN
#Berdasarkan visualisasi histogram, boxplot, dan bar chart, data telah berhasil dibersihkan dari outlier, inkonsistensi, dan missing value. Distribusi data terlihat normal dan kategori telah seragam, sehingga dataset layak digunakan untuk analisis lebih lanjut.