Data Preparation di R

#1. Import Data

#impor data file csv (sesuaikan simpan dimana)
datakesehatan <- read.csv("C:/Users/dahayu/Downloads/data_kesehatan.csv")
#menampilkan baris awal
head(datakesehatan,10)
##     X id umur jenis_kelamin tinggi_badan berat_badan gula_darah
## 1   1  1   33     Perempuan     159.5587    62.85027   80.08403
## 2   2  2   59     Perempuan     152.9881    54.73592   79.20090
## 3   3  3   39     Perempuan     156.1915    66.84162   99.64040
## 4   4  4   64     Laki-laki     173.8024    54.83932   97.35650
## 5   5  5   67     Perempuan     164.0242    62.21020   49.01314
## 6   6  6   20     Perempuan     150.0967    61.15284  120.81147
## 7   7  7   45     Perempuan     157.9015    59.39500  104.99451
## 8   8  8   64     Laki-laki     165.8377    55.87974  148.32415
## 9   9  9   47     Perempuan     156.7671    62.21052  113.70396
## 10 10 10   42     Perempuan     161.3638    58.73365   91.06081
##    tekanan_sistolik tekanan_diastolik kolesterol skor_kesehatan
## 1          129.2978          69.13882   181.3293      100.00000
## 2          108.6373          73.34697   209.6954      100.00000
## 3          132.7729          87.14848   176.3801       88.52949
## 4          108.7811          75.68339   172.1841      100.00000
## 5          129.4536          82.27615   138.6886      100.00000
## 6          136.4499          92.94946   183.7165       75.39378
## 7          105.1734          85.78335   264.3624       80.21044
## 8          136.6199          93.64673   219.6911       59.51184
## 9          112.6570          62.98420   240.2672       76.40171
## 10         124.4153          77.19324   217.4490       95.02224

#2. Struktur Data

# melihat struktur data
str (datakesehatan)
## 'data.frame':    200 obs. of  11 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ id               : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ umur             : int  33 59 39 64 67 20 45 64 47 42 ...
##  $ jenis_kelamin    : chr  "Perempuan" "Perempuan" "Perempuan" "Laki-laki" ...
##  $ tinggi_badan     : num  160 153 156 174 164 ...
##  $ berat_badan      : num  62.9 54.7 66.8 54.8 62.2 ...
##  $ gula_darah       : num  80.1 79.2 99.6 97.4 49 ...
##  $ tekanan_sistolik : num  129 109 133 109 129 ...
##  $ tekanan_diastolik: num  69.1 73.3 87.1 75.7 82.3 ...
##  $ kolesterol       : num  181 210 176 172 139 ...
##  $ skor_kesehatan   : num  100 100 88.5 100 100 ...
# ringkasan statistik
summary(datakesehatan)
##        X                id              umur         jenis_kelamin
##  Min.   :  1.00   Min.   :  1.00   Min.   :18.00   Length   :200  
##  1st Qu.: 50.75   1st Qu.: 50.75   1st Qu.:32.00   N.unique :  2  
##  Median :100.50   Median :100.50   Median :43.00   N.blank  :  0  
##  Mean   :100.50   Mean   :100.50   Mean   :44.31   Min.nchar:  9  
##  3rd Qu.:150.25   3rd Qu.:150.25   3rd Qu.:56.00   Max.nchar:  9  
##  Max.   :200.00   Max.   :200.00   Max.   :70.00                  
##   tinggi_badan    berat_badan      gula_darah     tekanan_sistolik
##  Min.   :143.1   Min.   :39.94   Min.   : 49.01   Min.   : 85.29  
##  1st Qu.:159.4   1st Qu.:57.82   1st Qu.: 86.74   1st Qu.:108.77  
##  Median :165.1   Median :63.35   Median :100.44   Median :119.92  
##  Mean   :165.8   Mean   :64.75   Mean   :101.01   Mean   :119.53  
##  3rd Qu.:171.7   3rd Qu.:72.17   3rd Qu.:111.90   3rd Qu.:129.62  
##  Max.   :186.9   Max.   :96.92   Max.   :163.68   Max.   :170.86  
##  tekanan_diastolik   kolesterol     skor_kesehatan  
##  Min.   : 53.05    Min.   : 98.56   Min.   : 45.45  
##  1st Qu.: 74.21    1st Qu.:172.44   1st Qu.: 84.30  
##  Median : 81.64    Median :190.25   Median : 92.92  
##  Mean   : 80.64    Mean   :191.80   Mean   : 89.61  
##  3rd Qu.: 87.18    3rd Qu.:216.47   3rd Qu.:100.00  
##  Max.   :102.84    Max.   :288.72   Max.   :100.00

#3. Missing Value

# cek missing value
colSums(is.na(datakesehatan))
##                 X                id              umur     jenis_kelamin 
##                 0                 0                 0                 0 
##      tinggi_badan       berat_badan        gula_darah  tekanan_sistolik 
##                 0                 0                 0                 0 
## tekanan_diastolik        kolesterol    skor_kesehatan 
##                 0                 0                 0

#4. Select Data

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
data_pilihan <- select(datakesehatan, umur, jenis_kelamin, gula_darah, kolesterol)
head(data_pilihan)
##   umur jenis_kelamin gula_darah kolesterol
## 1   33     Perempuan   80.08403   181.3293
## 2   59     Perempuan   79.20090   209.6954
## 3   39     Perempuan   99.64040   176.3801
## 4   64     Laki-laki   97.35650   172.1841
## 5   67     Perempuan   49.01314   138.6886
## 6   20     Perempuan  120.81147   183.7165

#5. Filter and Sort Data

#Filter data pasien perempuan
data_perempuan <- filter(datakesehatan, jenis_kelamin == "Perempuan")
head(data_perempuan)
##   X id umur jenis_kelamin tinggi_badan berat_badan gula_darah tekanan_sistolik
## 1 1  1   33     Perempuan     159.5587    62.85027   80.08403         129.2978
## 2 2  2   59     Perempuan     152.9881    54.73592   79.20090         108.6373
## 3 3  3   39     Perempuan     156.1915    66.84162   99.64040         132.7729
## 4 5  5   67     Perempuan     164.0242    62.21020   49.01314         129.4536
## 5 6  6   20     Perempuan     150.0967    61.15284  120.81147         136.4499
## 6 7  7   45     Perempuan     157.9015    59.39500  104.99451         105.1734
##   tekanan_diastolik kolesterol skor_kesehatan
## 1          69.13882   181.3293      100.00000
## 2          73.34697   209.6954      100.00000
## 3          87.14848   176.3801       88.52949
## 4          82.27615   138.6886      100.00000
## 5          92.94946   183.7165       75.39378
## 6          85.78335   264.3624       80.21044
# urutkan berdasarkan umur (ascending: muda -> tua)
data_perempuan_asc <- arrange(data_perempuan, umur)
head(data_perempuan_asc)
##     X  id umur jenis_kelamin tinggi_badan berat_badan gula_darah
## 1  74  74   18     Perempuan     158.5639    67.22813   88.35197
## 2  35  35   19     Perempuan     160.1156    58.46580  118.71207
## 3 143 143   19     Perempuan     164.2250    46.51267  101.38473
## 4   6   6   20     Perempuan     150.0967    61.15284  120.81147
## 5 113 113   21     Perempuan     165.2948    60.80736  148.48978
## 6  15  15   23     Perempuan     157.5179    62.21498   95.77506
##   tekanan_sistolik tekanan_diastolik kolesterol skor_kesehatan
## 1         115.8018          78.55389   169.9797      100.00000
## 2         116.9422          53.04671   185.0664       91.28614
## 3         111.2691          79.23829   185.8415       93.74989
## 4         136.4499          92.94946   183.7165       75.39378
## 5         130.7502          87.61310   155.9962       80.16160
## 6         117.9579          83.07390   174.0120      100.00000
# urutkan berdasarkan umur (descending: tua -> muda)
data_perempuan_dsc <- arrange(data_perempuan, desc(umur))
head(data_perempuan_dsc, 5)
##     X  id umur jenis_kelamin tinggi_badan berat_badan gula_darah
## 1  87  87   69     Perempuan     165.4886    51.69495   82.16957
## 2  11  11   68     Perempuan     162.9534    39.93666  155.94782
## 3 104 104   68     Perempuan     164.5064    73.11242   71.98425
## 4 118 118   68     Perempuan     161.8601    44.59884   90.92707
## 5   5   5   67     Perempuan     164.0242    62.21020   49.01314
##   tekanan_sistolik tekanan_diastolik kolesterol skor_kesehatan
## 1        116.02074          74.12914   165.4848      100.00000
## 2        123.02756          80.65068   224.3279       48.51474
## 3        125.31528          86.27069   246.0597       88.18862
## 4         94.45553          86.82315   160.2581      100.00000
## 5        129.45360          82.27615   138.6886      100.00000

#6. Rename and Mutate

data_rename <- rename(datakesehatan, id_pasien = id)
head(data_rename, 10)
##     X id_pasien umur jenis_kelamin tinggi_badan berat_badan gula_darah
## 1   1         1   33     Perempuan     159.5587    62.85027   80.08403
## 2   2         2   59     Perempuan     152.9881    54.73592   79.20090
## 3   3         3   39     Perempuan     156.1915    66.84162   99.64040
## 4   4         4   64     Laki-laki     173.8024    54.83932   97.35650
## 5   5         5   67     Perempuan     164.0242    62.21020   49.01314
## 6   6         6   20     Perempuan     150.0967    61.15284  120.81147
## 7   7         7   45     Perempuan     157.9015    59.39500  104.99451
## 8   8         8   64     Laki-laki     165.8377    55.87974  148.32415
## 9   9         9   47     Perempuan     156.7671    62.21052  113.70396
## 10 10        10   42     Perempuan     161.3638    58.73365   91.06081
##    tekanan_sistolik tekanan_diastolik kolesterol skor_kesehatan
## 1          129.2978          69.13882   181.3293      100.00000
## 2          108.6373          73.34697   209.6954      100.00000
## 3          132.7729          87.14848   176.3801       88.52949
## 4          108.7811          75.68339   172.1841      100.00000
## 5          129.4536          82.27615   138.6886      100.00000
## 6          136.4499          92.94946   183.7165       75.39378
## 7          105.1734          85.78335   264.3624       80.21044
## 8          136.6199          93.64673   219.6911       59.51184
## 9          112.6570          62.98420   240.2672       76.40171
## 10         124.4153          77.19324   217.4490       95.02224
#tambahkan kolom proporsi 
data_mutate <- mutate(datakesehatan, BMI = berat_badan / (tinggi_badan / 100)^2)
head(data_mutate, 5)
##   X id umur jenis_kelamin tinggi_badan berat_badan gula_darah tekanan_sistolik
## 1 1  1   33     Perempuan     159.5587    62.85027   80.08403         129.2978
## 2 2  2   59     Perempuan     152.9881    54.73592   79.20090         108.6373
## 3 3  3   39     Perempuan     156.1915    66.84162   99.64040         132.7729
## 4 4  4   64     Laki-laki     173.8024    54.83932   97.35650         108.7811
## 5 5  5   67     Perempuan     164.0242    62.21020   49.01314         129.4536
##   tekanan_diastolik kolesterol skor_kesehatan      BMI
## 1          69.13882   181.3293      100.00000 24.68689
## 2          73.34697   209.6954      100.00000 23.38607
## 3          87.14848   176.3801       88.52949 27.39884
## 4          75.68339   172.1841      100.00000 18.15435
## 5          82.27615   138.6886      100.00000 23.12309

#7. Join data

extra <- data.frame(jenis_kelamin = c("Laki-laki", "Perempuan"),
  lokasi_pemeriksaan = c("Puskesmas A", "Puskesmas B"))
data_joined <- left_join(datakesehatan, extra, by = "jenis_kelamin")
head(data_joined, 5)
##   X id umur jenis_kelamin tinggi_badan berat_badan gula_darah tekanan_sistolik
## 1 1  1   33     Perempuan     159.5587    62.85027   80.08403         129.2978
## 2 2  2   59     Perempuan     152.9881    54.73592   79.20090         108.6373
## 3 3  3   39     Perempuan     156.1915    66.84162   99.64040         132.7729
## 4 4  4   64     Laki-laki     173.8024    54.83932   97.35650         108.7811
## 5 5  5   67     Perempuan     164.0242    62.21020   49.01314         129.4536
##   tekanan_diastolik kolesterol skor_kesehatan lokasi_pemeriksaan
## 1          69.13882   181.3293      100.00000        Puskesmas B
## 2          73.34697   209.6954      100.00000        Puskesmas B
## 3          87.14848   176.3801       88.52949        Puskesmas B
## 4          75.68339   172.1841      100.00000        Puskesmas A
## 5          82.27615   138.6886      100.00000        Puskesmas B

#8. Group and Summarize

# Hitung total umur vs skor kesehatan
data_summary <- datakesehatan %>%
  group_by(umur, skor_kesehatan) %>%
  summarise(total = n())
## `summarise()` has regrouped the output.
## ℹ Summaries were computed grouped by umur and skor_kesehatan.
## ℹ Output is grouped by umur.
## ℹ Use `summarise(.groups = "drop_last")` to silence this message.
## ℹ Use `summarise(.by = c(umur, skor_kesehatan))` for per-operation grouping
##   (`?dplyr::dplyr_by`) instead.
head(data_summary, 10)
## # A tibble: 10 × 3
## # Groups:   umur [6]
##     umur skor_kesehatan total
##    <int>          <dbl> <int>
##  1    18          100       1
##  2    19           91.3     1
##  3    19           93.7     1
##  4    20           75.4     1
##  5    20           99.8     1
##  6    20          100       1
##  7    21           80.2     1
##  8    22           85.4     1
##  9    23           96.1     1
## 10    23           97.3     1

#9. split data

# Buat indeks sampling 70%
set.seed(123)
index <- sample(1:nrow(datakesehatan), floor(0.7 * nrow(datakesehatan)))

train_data <- datakesehatan[index, ]
test_data  <- datakesehatan[-index, ]

nrow(train_data)
## [1] 140
nrow(test_data)
## [1] 60