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.