Introduction to Data Sciences
Tugas UAS PDS Kelompok
| Kontak | \(\downarrow\) |
| naftaligunawan@gmail.com | |
| https://www.instagram.com/nbrigittag/ | |
| RPubs | https://rpubs.com/naftalibrigitta/ |
| Nama | Naftali Brigitta Gunawan |
| NIM | 20214920002 |
Pengantar
Pada kesempatan kali ini, kami ingin memenuhi penugasan akhir di semester 2 untuk mata kuliah Pengenalan Data Sains yang dibimbing langsung oleh pak Bakti Siregar. Adapun penugasan kali ini dilakukan secara berkelompok yang terdiri dari :
1. Valensius Jimy
2. Naftali Brigitta Gunawan
3. Jeremy Heriyandi Saudi
Kiranya apa yang kami kerjakan pada penugasan akhir ini mendapatkan hasil yang maksimal dan memenuhi semua objektif penilaian.
Permasalahan Project
Pak Bakti telah memulai perusahaan selulernya sendiri. Pak Bakti ingin memperluas pasar perdagannya dan bercita-cita untuk dapat bersaing dengan besar seperti Apple, Samsung, dll. Tetapi Dia tidak tahu bagaimana memperkirakan harga ponsel yang sesuai untuk setiap produk yang dibuat perusahaannya. Oleh karena itu, perusahaan Pak Bakti bermaksud untuk melakukan analisis berdasarkan data penjualan ponsel dari berbagai perusahaan.
Pemrosesan Data
Dataset dalam kesempatan kali ini didapat langsung dari Google Classroom.
Read Data
# Input Library
library(tidyverse)
library(tidymodels)
library(gridExtra)
library(lubridate)
library(ggplot2)
library(caret)
library(party)
library(data.table)
library(dplyr)
library(plotly)
library(randomForest)
library(emdi)
library(rpart)# Import Data
seluler <- read.csv("C:/Users/Naftali Brigitta/Documents/Kampus/PDS/UAS/train.csv")
data.frame("total.data" = dim(seluler)[1],
"total.variabel" = dim(seluler)[2])Berdasarkan informasi di atas, diketahui bahwa dataset terdiri dari 2000 data dan 21 variabel. Sekarang, kami mencoba untuk melihat 5 data teratas dan 5 data terbawah untuk mengetahui bagaimana isi dataset kita secara garis besarnya dan terdapat apa saja variabel di dalamnya.
5 Data teratas
head(seluler, 5)5 Data terbawah
tail(seluler, 5)Deskripsi Variabel
adapun deskripsi dari setiap variabelnya, yaitu :
| Variabel | Deskripsi | Keterangan |
| battery_power | kapasitas baterai | mAH |
| blue | support bluetooth | 1 : Ya, 0 : Tidak |
| clock_speed | kecepatan microprocessor | GHz |
| dual_sim | support dual sim | 1 : Ya, 0 : Tidak |
| fc | resolusi kamera depan | Megapixel |
| four_g | support 4G | 1 : Ya, 0 : Tidak |
| int_memory | kapasitas memori internal | Gb |
| m_dep | ketebalan unit | cm |
| mobile_wt | berat unit | gr |
| n_cores | jumlah core | satuan core |
| pc | resolusi kamera belakang | megapixel |
| px_height | tinggi resolusi layar | pixel |
| px_width | lebar resolusi layar | pixel |
| ram | kapasitas RAM | megabyte |
| sc_h | tinggi layar | cm |
| sc_w | lebar layar | cm |
| talk_time | waktu pemakaian | hour |
| three_g | support 3G | 1 : Ya, 0 : Tidak |
| touch_screen | layar sentuh | 1 : Ya, 0 : Tidak |
| wifi | support wifi | 1 : Ya, 0 : Tidak |
| price_range | kelas harga | 0 : murah, 1 : normal, 2 : mahal, 3 : sangat mahal |
Struktur Dataset
selanjutnya, kami ingin melihat struktur dari setiap variabel yang terdapat pada dataset kami.
glimpse(seluler)## Rows: 2,000
## Columns: 21
## $ battery_power <int> 842, 1021, 563, 615, 1821, 1859, 1821, 1954, 1445, 509, ~
## $ blue <int> 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1,~
## $ clock_speed <dbl> 2.2, 0.5, 0.5, 2.5, 1.2, 0.5, 1.7, 0.5, 0.5, 0.6, 2.9, 2~
## $ dual_sim <int> 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,~
## $ fc <int> 1, 0, 2, 0, 13, 3, 4, 0, 0, 2, 0, 5, 2, 7, 13, 3, 1, 7, ~
## $ four_g <int> 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0,~
## $ int_memory <int> 7, 53, 41, 10, 44, 22, 10, 24, 53, 9, 9, 33, 33, 17, 52,~
## $ m_dep <dbl> 0.6, 0.7, 0.9, 0.8, 0.6, 0.7, 0.8, 0.8, 0.7, 0.1, 0.1, 0~
## $ mobile_wt <int> 188, 136, 145, 131, 141, 164, 139, 187, 174, 93, 182, 17~
## $ n_cores <int> 2, 3, 5, 6, 2, 1, 8, 4, 7, 5, 5, 8, 4, 4, 1, 2, 8, 3, 5,~
## $ pc <int> 2, 6, 6, 9, 14, 7, 10, 0, 14, 15, 1, 18, 17, 11, 17, 16,~
## $ px_height <int> 20, 905, 1263, 1216, 1208, 1004, 381, 512, 386, 1137, 24~
## $ px_width <int> 756, 1988, 1716, 1786, 1212, 1654, 1018, 1149, 836, 1224~
## $ ram <int> 2549, 2631, 2603, 2769, 1411, 1067, 3220, 700, 1099, 513~
## $ sc_h <int> 9, 17, 11, 16, 8, 17, 13, 16, 17, 19, 5, 14, 18, 7, 14, ~
## $ sc_w <int> 7, 3, 2, 8, 2, 1, 8, 3, 1, 10, 2, 9, 0, 1, 9, 15, 9, 2, ~
## $ talk_time <int> 19, 7, 9, 11, 15, 10, 18, 5, 20, 12, 7, 13, 2, 4, 3, 11,~
## $ three_g <int> 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ touch_screen <int> 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1,~
## $ wifi <int> 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0,~
## $ price_range <int> 1, 2, 2, 2, 1, 1, 3, 0, 0, 0, 3, 3, 1, 2, 0, 0, 3, 3, 1,~
Missing Value
Langkah berikutnya yang tidak boleh dilewatkan dalam mengolah data adalah melihat apakah suatu data terdapat missing value atau tidak, jangan sampai sudah jalan panjang tetapi datanya terdapat missing value yang nantinya mendapat hasil tidak efektif. Maka dari itu, kami mencoba mencari tahu apakah dataset kami terdapat missing value.
colSums(is.na(seluler))## battery_power blue clock_speed dual_sim fc
## 0 0 0 0 0
## four_g int_memory m_dep mobile_wt n_cores
## 0 0 0 0 0
## pc px_height px_width ram sc_h
## 0 0 0 0 0
## sc_w talk_time three_g touch_screen wifi
## 0 0 0 0 0
## price_range
## 0
Hasil ini sangat membuat kami senang, karena dataset kami tidak memiliki missing value.
EDA
Kemudian, kami akan mencoba menampilkan visualisasi data yang kami miliki untuk melihat secara garis besar bagaimana hubungan dan hasilnya.
selulerr <- seluler %>%
select(-price_range)corr <-cor(selulerr)library(corrplot)## Warning: package 'corrplot' was built under R version 4.1.3
## corrplot 0.92 loaded
corrplot(corr, type = 'upper', order = 'hclust', col=rainbow(8))Berdasarkan korelasi matriks di atas, dapat dilihat korelasi antara variabel satu dengan variabel lainnya.
ggplot(data = seluler, mapping=aes(x=as.numeric(ram), y=price_range)) +
geom_smooth(se=FALSE, color='orange', method='gam', formula = y ~ s(x, bs = "cs")) +
theme(plot.title = element_text(face="bold")) +
labs(x = 'Ram', y='Price Range')Berdasarkan grafik di atas terlihat dengan jelas bahwa rentang harga dengan ram sangat berpengaruh, dimana semakin besar ram yang dimiliki membuat harga juga semakin meningkat.
ggplot(data = seluler, mapping=aes(x=int_memory, y=price_range)) +
geom_smooth(se=FALSE, color='yellow', method='gam', formula = y ~ s(x, bs = "cs")) +
theme(plot.title = element_text(face="bold")) +
labs(x = 'Internal Memory', y='Price Range')Kami juga mencoba melihat pengaruh dari Internal memory terhadap rentang harganya, ternyata terdapat hubungan linier dan hal ini sangat jelas bahwa internal memory juga berpengaruh terhadap harga unit seluler yang tersedia untuk dijual nanti.
selulerr <- seluler %>%
mutate(
blue = as.factor(blue),
dual_sim = as.factor(dual_sim),
four_g = as.factor(four_g),
three_g = as.factor(three_g),
touch_screen = as.factor(touch_screen),
wifi = as.factor(wifi),
price_range = as.factor(price_range),
price_range = sapply(price_range, switch, "murah", "normal", "mahal", "sangat mahal"),
price_range = ordered(price_range, levels = c("murah", "normal", "mahal", "sangat mahal"))
)selulerr %>% group_by(price_range) %>% summarise(freq=n()) %>%
ggplot( aes(x="", y=freq, fill=price_range)) +
geom_bar(stat="identity", width=1)+
coord_polar("y", start=0) +
geom_text(aes(label = paste0(round((freq/sum(freq))*100), "%")),
position = position_stack(vjust = 0.5),color="white")+
scale_fill_manual(values=c(rainbow(4))) +
labs(x = NULL, y = NULL, fill = "Keterangan Harga")+
theme_classic() +
theme(axis.line = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(hjust = 0.5),
axis.title=element_text(size=9,face="bold"),
legend.position = "right"
) Berdasarkan grafik chart di atas, dapat kami simpulkan bahwa pembagian kelas harga jual unit seluler terbagi secara merata proporsinya.
Split Data
Pada dataset kali ini terdapat 2000 data, kami akan membagi menjadi dua data dengan proporsi 0.8 yang artinya 80% untuk data train yang nantinya akan digunakan untuk pemodelan dan 20% untuk data test yang akan digunakan untuk menguji seberapa baik model yang telah dirancang.
set.seed(123)
split <- initial_split(selulerr, prop = 0.8, strata = "price_range")
seluler_train <- training(split)
seluler_test <- testing(split)
df_split <- rbind(
data.frame(table(seluler_train$price_range),"type"="train"),
data.frame(table(seluler_test$price_range),"type"="test")) %>%
mutate(
Var1 = as.factor(Var1),
type = as.factor(type)
)
ggplot(df_split, aes(x=Var1,y=Freq, fill=type))+
geom_col(position = "dodge")+
geom_text(aes(label=Freq, y=Freq+20), size=3, position = position_dodge(width = 1))+
labs(x = "Kelas Harga",
y = "Frekuensi",
fill = "Data",
title = "Pembagian Data Train dan Test")+
theme_minimal()+
theme(
axis.title=element_text(size=10,face="bold"),
axis.text.x=element_text(size=12),
axis.text.y=element_text(size=12)
)+
scale_fill_manual(values=c("lightblue", "orange")) Perancangan Model
Karena Pak Bakti ingin memprediksi kelas harga, maka yang menjadi target variabelnya adalah price_range. Pada kesempatan kali ini, kami akan membuat pemodelan untuk klasifikasi seperti Regression, Decision Tree, Random Forest.
Pengaruh Setiap Variabel
Dengan menggunakan taraf signifikansi 0.05 atau dalam selang kepercayaan 95%, kami akan mencoba mencari tahu mana variabel yang paling berpengaruh secara signifikan terhadap price_range
lr <- lm(price_range ~ ., data = seluler)
summary(lr)$coef## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.5750125445 6.163763e-02 -25.55277648 1.059281e-124
## battery_power 0.0005095531 1.639990e-05 31.07050596 5.748920e-173
## blue -0.0020320097 1.441991e-02 -0.14091695 8.879499e-01
## clock_speed -0.0120614370 8.814187e-03 -1.36841179 1.713385e-01
## dual_sim -0.0237093464 1.442331e-02 -1.64382156 1.003719e-01
## fc 0.0009348379 2.165571e-03 0.43168194 6.660196e-01
## four_g -0.0014768297 1.774302e-02 -0.08323440 9.336736e-01
## int_memory 0.0008646792 3.970093e-04 2.17798186 2.952510e-02
## m_dep -0.0099629863 2.494215e-02 -0.39944383 6.896093e-01
## mobile_wt -0.0008801134 2.030283e-04 -4.33492867 1.531247e-05
## n_cores 0.0018210737 3.147536e-03 0.57857124 5.629444e-01
## pc 0.0001286935 1.551143e-03 0.08296687 9.338863e-01
## px_height 0.0002765358 1.890653e-05 14.62647212 4.419902e-46
## px_width 0.0002795824 1.936593e-05 14.43682265 5.394599e-45
## ram 0.0009471883 6.638186e-06 142.68781057 0.000000e+00
## sc_h 0.0011402885 1.981988e-03 0.57532575 5.651364e-01
## sc_w -0.0003283985 1.915119e-03 -0.17147683 8.638664e-01
## talk_time 0.0003638878 1.319264e-03 0.27582637 7.827102e-01
## three_g 0.0270489126 2.078999e-02 1.30105468 1.933912e-01
## touch_screen -0.0057103786 1.438330e-02 -0.39701455 6.913995e-01
## wifi -0.0214461491 1.440460e-02 -1.48883998 1.366888e-01
Untuk mencari tahu variabel mana yang paling berpengaruh, maka kami akan mencari nilai p yang kurang dari nilai signifikansi. Terlihat bahwa battery_power, ram, px_height dan variabel yang lainnya memiliki pengaruh yang signifikan terhadap price_range. Dengan adanya susunan ini, memudahkan kami untuk mencari peubah bebas untuk diuji pada masing-masing model nantinya.
Regression Model
Pada model regresi ini dapat disebut juga sebagai multinomial logistic regression karena memiliki lebih dari 2 variabel peubah bebasnya. Pada pemodelan ini nantinya akan menggunakan pendekatan step-wise dan menggunakan modelnya berdasarkan nilai AIC terkecil.
library(emdi)regresi <- nnet::multinom(price_range~.,data=seluler_train)## # weights: 88 (63 variable)
## initial value 2218.070978
## iter 10 value 1731.927973
## iter 20 value 1519.560603
## iter 30 value 1469.604101
## iter 40 value 1328.767157
## iter 50 value 876.490444
## iter 60 value 528.140028
## iter 70 value 66.639615
## iter 80 value 43.659112
## iter 90 value 37.895906
## iter 100 value 34.593297
## final value 34.593297
## stopped after 100 iterations
regresi_model <- step(
object = regresi,
direction = c("both", "backward", "forward"),
trace = FALSE
)## trying - battery_power
## trying - blue
## trying - clock_speed
## trying - dual_sim
## trying - fc
## trying - four_g
## trying - int_memory
## trying - m_dep
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - sc_w
## trying - talk_time
## trying - three_g
## trying - touch_screen
## trying - wifi
## # weights: 84 (60 variable)
## initial value 2218.070978
## iter 10 value 1731.932172
## iter 20 value 1521.181439
## iter 30 value 1475.998675
## iter 40 value 1311.932437
## iter 50 value 870.472120
## iter 60 value 358.183027
## iter 70 value 55.156403
## iter 80 value 41.721689
## iter 90 value 37.493490
## iter 100 value 35.006877
## final value 35.006877
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - dual_sim
## trying - fc
## trying - four_g
## trying - int_memory
## trying - m_dep
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - sc_w
## trying - talk_time
## trying - three_g
## trying - touch_screen
## trying - wifi
## trying + clock_speed
## # weights: 80 (57 variable)
## initial value 2218.070978
## iter 10 value 1731.932590
## iter 20 value 1521.306368
## iter 30 value 1477.275342
## iter 40 value 1309.330935
## iter 50 value 881.955602
## iter 60 value 240.309683
## iter 70 value 49.873647
## iter 80 value 40.166506
## iter 90 value 37.397356
## iter 100 value 35.094575
## final value 35.094575
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - fc
## trying - four_g
## trying - int_memory
## trying - m_dep
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - sc_w
## trying - talk_time
## trying - three_g
## trying - touch_screen
## trying - wifi
## trying + clock_speed
## trying + dual_sim
## # weights: 76 (54 variable)
## initial value 2218.070978
## iter 10 value 1731.983811
## iter 20 value 1526.146844
## iter 30 value 1487.450702
## iter 40 value 1085.317585
## iter 50 value 694.351673
## iter 60 value 86.887438
## iter 70 value 45.000997
## iter 80 value 40.016500
## iter 90 value 37.848667
## iter 100 value 36.809510
## final value 36.809510
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - fc
## trying - four_g
## trying - int_memory
## trying - m_dep
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - talk_time
## trying - three_g
## trying - touch_screen
## trying - wifi
## trying + clock_speed
## trying + dual_sim
## trying + sc_w
## # weights: 72 (51 variable)
## initial value 2218.070978
## iter 10 value 1731.984260
## iter 20 value 1526.290941
## iter 30 value 1489.451516
## iter 40 value 1075.311882
## iter 50 value 623.656104
## iter 60 value 69.561305
## iter 70 value 45.824042
## iter 80 value 41.469716
## iter 90 value 39.393462
## iter 100 value 38.630252
## final value 38.630252
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - fc
## trying - four_g
## trying - int_memory
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - talk_time
## trying - three_g
## trying - touch_screen
## trying - wifi
## trying + clock_speed
## trying + dual_sim
## trying + m_dep
## trying + sc_w
## # weights: 68 (48 variable)
## initial value 2218.070978
## iter 10 value 1731.984831
## iter 20 value 1526.591848
## iter 30 value 1492.356617
## iter 40 value 1134.515939
## iter 50 value 457.463097
## iter 60 value 57.310028
## iter 70 value 46.341503
## iter 80 value 41.655307
## iter 90 value 40.303501
## iter 100 value 40.077162
## final value 40.077162
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - fc
## trying - four_g
## trying - int_memory
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - talk_time
## trying - three_g
## trying - wifi
## trying + clock_speed
## trying + dual_sim
## trying + m_dep
## trying + sc_w
## trying + touch_screen
## # weights: 64 (45 variable)
## initial value 2218.070978
## iter 10 value 1731.985050
## iter 20 value 1526.697114
## iter 30 value 1494.045873
## iter 40 value 1106.041559
## iter 50 value 300.576865
## iter 60 value 54.419987
## iter 70 value 46.876431
## iter 80 value 43.642069
## iter 90 value 42.264049
## iter 100 value 42.198425
## final value 42.198425
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - fc
## trying - int_memory
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - talk_time
## trying - three_g
## trying - wifi
## trying + clock_speed
## trying + dual_sim
## trying + four_g
## trying + m_dep
## trying + sc_w
## trying + touch_screen
## # weights: 60 (42 variable)
## initial value 2218.070978
## iter 10 value 1731.986037
## iter 20 value 1527.016848
## iter 30 value 1496.606824
## iter 40 value 947.091699
## iter 50 value 129.047634
## iter 60 value 52.897033
## iter 70 value 46.119742
## iter 80 value 43.583435
## iter 90 value 43.285836
## iter 100 value 43.250820
## final value 43.250820
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - fc
## trying - int_memory
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - talk_time
## trying - wifi
## trying + clock_speed
## trying + dual_sim
## trying + four_g
## trying + m_dep
## trying + sc_w
## trying + three_g
## trying + touch_screen
## # weights: 56 (39 variable)
## initial value 2218.070978
## iter 10 value 1732.024610
## iter 20 value 1518.082542
## iter 30 value 1461.149975
## iter 40 value 744.145425
## iter 50 value 72.966914
## iter 60 value 50.005478
## iter 70 value 47.138429
## iter 80 value 46.252620
## iter 90 value 46.138430
## iter 100 value 46.059783
## final value 46.059783
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - int_memory
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - talk_time
## trying - wifi
## trying + clock_speed
## trying + dual_sim
## trying + fc
## trying + four_g
## trying + m_dep
## trying + sc_w
## trying + three_g
## trying + touch_screen
## # weights: 52 (36 variable)
## initial value 2218.070978
## iter 10 value 1732.280237
## iter 20 value 1531.208102
## iter 30 value 1328.817696
## iter 40 value 392.920289
## iter 50 value 62.414800
## iter 60 value 51.170828
## iter 70 value 48.804155
## iter 80 value 48.295331
## iter 90 value 48.262146
## iter 100 value 48.111747
## final value 48.111747
## stopped after 100 iterations
## trying - battery_power
## trying - blue
## trying - int_memory
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - wifi
## trying + clock_speed
## trying + dual_sim
## trying + fc
## trying + four_g
## trying + m_dep
## trying + sc_w
## trying + talk_time
## trying + three_g
## trying + touch_screen
## # weights: 48 (33 variable)
## initial value 2218.070978
## iter 10 value 1732.280735
## iter 20 value 1531.347984
## iter 30 value 1359.715071
## iter 40 value 208.543325
## iter 50 value 57.021322
## iter 60 value 52.119589
## iter 70 value 51.108727
## iter 80 value 50.992007
## iter 90 value 50.943394
## iter 100 value 50.871930
## final value 50.871930
## stopped after 100 iterations
## trying - battery_power
## trying - int_memory
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - sc_h
## trying - wifi
## trying + blue
## trying + clock_speed
## trying + dual_sim
## trying + fc
## trying + four_g
## trying + m_dep
## trying + sc_w
## trying + talk_time
## trying + three_g
## trying + touch_screen
## # weights: 44 (30 variable)
## initial value 2218.070978
## iter 10 value 1732.529416
## iter 20 value 1550.879480
## iter 30 value 1005.384962
## iter 40 value 108.245471
## iter 50 value 57.720785
## iter 60 value 55.605549
## iter 70 value 55.332364
## iter 80 value 55.299202
## iter 90 value 55.211088
## iter 100 value 53.858730
## final value 53.858730
## stopped after 100 iterations
## trying - battery_power
## trying - int_memory
## trying - mobile_wt
## trying - n_cores
## trying - pc
## trying - px_height
## trying - px_width
## trying - ram
## trying - wifi
## trying + blue
## trying + clock_speed
## trying + dual_sim
## trying + fc
## trying + four_g
## trying + m_dep
## trying + sc_h
## trying + sc_w
## trying + talk_time
## trying + three_g
## trying + touch_screen
summary(regresi_model)## Call:
## nnet::multinom(formula = price_range ~ battery_power + int_memory +
## mobile_wt + n_cores + pc + px_height + px_width + ram + wifi,
## data = seluler_train)
##
## Coefficients:
## (Intercept) battery_power int_memory mobile_wt n_cores
## normal -276.8380 0.06889856 0.06584338 -0.1633585 0.5389644
## mahal -456.6814 0.10134218 0.11092568 -0.2216773 0.8688410
## sangat mahal -786.7312 0.14685234 0.20144465 -0.3532515 1.1669040
## pc px_height px_width ram wifi1
## normal -0.05355233 0.04039949 0.04104187 0.1144801 -2.242150
## mahal 0.10179862 0.05907302 0.05960097 0.1659432 -3.603884
## sangat mahal 0.23964881 0.08957473 0.08788835 0.2423496 -6.078527
##
## Std. Errors:
## (Intercept) battery_power int_memory mobile_wt n_cores
## normal 0.001559528 0.001410271 0.03010115 0.02118396 0.2546218
## mahal 0.002451740 0.001571300 0.03701217 0.02330226 0.2988065
## sangat mahal 0.001072950 0.001807573 0.04559247 0.02734012 0.3665154
## pc px_height px_width ram wifi1
## normal 0.0992810 0.001824238 0.001556091 0.001913550 0.2882374
## mahal 0.1151019 0.002217151 0.001851481 0.002024306 0.3461037
## sangat mahal 0.1408390 0.002464983 0.002187084 0.002160262 0.1013508
##
## Residual Deviance: 107.7175
## AIC: 167.7175
Hasil dari summary di atas, dapat kami simpulkan bahwa nilai AIC terkecil ternyata 167.7175 dengan menggunakan 9 variabel. Selanjutnya, kami akan mencoba melakukan prediksi untuk kelasnya.
mlnom_prediction_train <- predict(regresi_model, seluler_train)
mlnom_probability_train <- predict(regresi_model, seluler_train, type = "prob")
mlnom_result_train <- cbind(seluler_train, price_range_prediction=mlnom_prediction_train ,
round(mlnom_probability_train,3))
mlnom_result_train <- mlnom_result_train[,c(21,22,23,24,25,26)] %>%
setnames("price_range", "price_range_actual") %>%
arrange(price_range_actual) %>%
mutate(
no=seq(1:nrow(seluler_train))
) %>%
select(7,1,2,3,4,5,6)
mlnom_prediction <- predict(regresi_model, seluler_test)
mlnom_probability <- predict(regresi_model, seluler_test, type="prob")
mlnom_result <- cbind(seluler_test, price_range_prediction=mlnom_prediction,
round(mlnom_probability,3))
mlnom_result <- mlnom_result[,c(21,22,23,24,25,26)] %>%
setnames("price_range", "price_range_actual") %>%
arrange(price_range_actual) %>%
mutate(
no=seq(1:nrow(seluler_test))
) %>%
select(7,1,2,3,4,5,6)
mlnom_resulttabel di atas adalah hasil klasifikasi kelas harga menggunakan metode Regresi ini. Selanjutnya, kami akan mencari tahu bagaimana tingkat keakurasian dari model yang telah kami buat.
cfm_mlnom_train <- confusionMatrix(
data = mlnom_result_train$price_range_prediction,
reference =mlnom_result_train$price_range_actual
)
round(cfm_mlnom_train$overall["Accuracy"],2)*100## Accuracy
## 99
Berdasarkan model regresi yang telah kami buat, ternyata kami mendapatkan hasil yang sangat memuaskan, yaitu sebesar 99% dengan menggunakan seluruh variabel peubah bebas pada data train. Lalu, kami ingin mencoba jika menggunakan hanya satu peubah bebasnya bagaimana
model_reg_one <- lm(price_range ~ int_memory, data = seluler)
summary(model_reg_one)$coef## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.41224034 0.050723048 27.842182 1.934244e-144
## int_memory 0.00273851 0.001377408 1.988162 4.693006e-02
Berdasarkan susunan summary di atas, kami menyimpulkan bahwa internal memory berpengaruh signifikan terhadap penentuan harga jual, karena nilai p valuenya dibawah 0.05 yang mana adalah taraf signifikan kami.
newdata <- data.frame(int_memory = c(0, 10))
model_reg_one %>% predict(newdata)## 1 2
## 1.412240 1.439625
Ternyata berdasarkan model regresi yang menggunakan 1 peubah bebas, yaitu int_memory kami dapat memprediksi harga jualnya yang mana dengan maksimal ukuran internal memory yang sebesar 10 satuan internal memory akan menambah sekitar 1.41 sampai 1.43 USD.
Decision Tree Model
Menggunakan metode Decision Tree untuk merancang suatu model nampaknya umum digunakan oleh seorang data sains karena lebih bebas dan dapat digunakan untuk variabel yang bersifat numerik dan kategorikal.
model4 <- rpart(price_range ~ .,
data=seluler_train,
method="class")
Predict_model4_train <- predict(model4, seluler_train, type = "class")
conMat_df <- confusionMatrix(as.factor(Predict_model4_train), as.factor(seluler_train$price_range))
conMat_df$table## Reference
## Prediction murah normal mahal sangat mahal
## murah 370 49 0 0
## normal 30 319 49 0
## mahal 0 32 291 36
## sangat mahal 0 0 60 364
predict <- conMat_df$overall["Accuracy"]*100
predict## Accuracy
## 84
Berdasarkan model Decision Tree yang dibuat ternyata kami mendapatkan akurasi sebesar 84% yang mana cukup jauh dengan model pertama kami, yaitu regresi yang mencapai angka 99%. Selanjutnya, kami akan mencoba mengklasifikasikan kelas harga jualnya, seperti berikut ini.
dtree_prediction <- predict(model4, seluler_test)
dtree_probability <- predict(model4, seluler_test, type="prob")
dtree_probability <- data.frame(matrix(unlist(dtree_probability),
nrow=nrow(seluler_test), byrow=T),stringsAsFactors=FALSE)
colnames(dtree_probability) <- c("murah","normal","mahal","sangat mahal")
dtree_result <- cbind(seluler_test, price_range_prediction=dtree_prediction,
round(dtree_probability,3))
dtree_result <- dtree_result[,c(21,22,23,24,25,26)] %>%
setnames("price_range", "price_range_actual") %>%
arrange(price_range_actual) %>%
mutate(
no=seq(1:nrow(seluler_test))
) %>%
select(7,1,2,3,4,5,6)
dtree_resultSelanjutnya, kami ingin membandingkan bagaimana jika hanya menggunakan 2 peubah bebas dan kami memilih ram dan internal memorinya
model_simple <- rpart(price_range ~ ram + int_memory, data = seluler_train)
predict_model_simple <- predict(model_simple, seluler_train, type = "class")
conMat <- confusionMatrix(as.factor(predict_model_simple), as.factor(seluler_train$price_range))
conMat$table## Reference
## Prediction murah normal mahal sangat mahal
## murah 320 43 0 0
## normal 80 335 128 1
## mahal 0 22 217 67
## sangat mahal 0 0 55 332
conMat$overall["Accuracy"]## Accuracy
## 0.7525
Ketika kami menggunakan dua peubah bebas pada model decision tree, ternyata akurasi dari model yang kami rancang berkurang menjadi 75% dan hal ini menjadi alasan kami lebih memilih model decisipon tree dengan seluruh peubah bebasnya.
Random Forest Model
set.seed(666)
rf_model <- randomForest(price_range ~ .,
data = seluler_train,
importance=TRUE,
ntree = 1000)
rf_model##
## Call:
## randomForest(formula = price_range ~ ., data = seluler_train, importance = TRUE, ntree = 1000)
## Type of random forest: classification
## Number of trees: 1000
## No. of variables tried at each split: 4
##
## OOB estimate of error rate: 12%
## Confusion matrix:
## murah normal mahal sangat mahal class.error
## murah 378 22 0 0 0.0550
## normal 35 330 35 0 0.1750
## mahal 0 41 335 24 0.1625
## sangat mahal 0 0 35 365 0.0875
Pada model di atas, kami menggunakan 1000 tree dan mendapati nilai estimasi errornya sebesar 12%.
rf_origin_result_train <- cbind(seluler_train, price_range_prediction=rf_model$predicted,
round(rf_model$votes,3))
rf_origin_result_train <- rf_origin_result_train[,c(21,22,23,24,25,26)] %>%
setnames("price_range", "price_range_actual") %>%
arrange(price_range_actual) %>%
mutate(
no=seq(1:nrow(seluler_train))
) %>%
select(7,1,2,3,4,5,6)
rf_prediction <- predict(rf_model, seluler_test)
rf_probability <- predict(rf_model, seluler_test, type="prob")
rf_origin_result <- cbind(seluler_test, price_range_prediction=rf_prediction,
round(rf_probability,3))
rf_origin_result <- rf_origin_result[,c(21,22,23,24,25,26)] %>%
setnames("price_range", "price_range_actual") %>%
arrange(price_range_actual) %>%
mutate(
no=seq(1:nrow(seluler_test))
) %>%
select(7,1,2,3,4,5,6)
rf_origin_resultDi atas merupakan hasil prediksi harga jualnya menggunakan Random Forest yang menggunakan 1000 tree. Untuk mengetahui tingkat akurasi dari model Random Forest ini, maka kami melakukannya.
acc_rf <- confusionMatrix(
data =rf_origin_result_train$price_range_prediction,
reference =rf_origin_result_train$price_range_actual
)
acc_rf$overall["Accuracy"]*100## Accuracy
## 88
Kami mendapat akurasi pada model random forest adalah sebesar 88% dan bagaimana jika kami hanya menggunakan satu atau dua peubah bebas saja pada model Random Forest ini.
model_simple_rf <- randomForest(price_range ~ ram , data = seluler_train, importance = TRUE)
model_simple_rf##
## Call:
## randomForest(formula = price_range ~ ram, data = seluler_train, importance = TRUE)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 1
##
## OOB estimate of error rate: 32.31%
## Confusion matrix:
## murah normal mahal sangat mahal class.error
## murah 319 81 0 0 0.2025
## normal 84 227 84 5 0.4325
## mahal 1 97 219 83 0.4525
## sangat mahal 0 6 76 318 0.2050
Ternyata dengan menggunakan dua peubah bebas ini kita mendapat nilai estimasi error yang bertambah menjadi 32.19% , lalu kami mencoba untuk membuat akurasinya.
rf_predict <- predict(model_simple_rf, seluler_train)
conMatt <- confusionMatrix(rf_predict, seluler_train$price_range)
conMatt$table## Reference
## Prediction murah normal mahal sangat mahal
## murah 386 21 0 0
## normal 14 371 26 2
## mahal 0 7 362 11
## sangat mahal 0 1 12 387
round(conMatt$overall["Accuracy"], 2)*100## Accuracy
## 94
Ternyata kami mendapat tingkat akurasi yang lebih tinggi dari model yang menggunakan semua peubah bebas, yaitu 94% dan hal yang harus diperhatikan adalah pada model ini ada estimasi error yang sangat besar juga dibandingkan dengan menggunakan seluruh peubah bebas.
Model Terbaik
Setelah kami melakukan analisa menggunakan 3 model dan menggunakan satu atau dua peubah bebas dengan seluruh peubah bebas kami telah membuat keputusan bahwa model dengan metode regresi adalah yang terbaik karena memiliki tingkat akurasi 99% dengan seluruh peubah bebasnya. Sehingga, kami akan memilih model regresi yang telah kami rancang untuk mengetahui klasifikasi harga dari setiap unit yang diproduksi.
seluler_klas <- read.csv("C:/Users/Naftali Brigitta/Documents/Kampus/PDS/UAS/test.csv")
seluler_klasPada dataset tersebut terdiri dari 1000 data dan 21 variabel yang artinya terdapat 1000 unit seluler yang akan diklasifikasi harganya. Sebelum itu, kami akan melihat struktur datanya dan struktur mana yang harus diubah.
glimpse(seluler_klas)## Rows: 1,000
## Columns: 21
## $ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1~
## $ battery_power <int> 1043, 841, 1807, 1546, 1434, 1464, 1718, 833, 1111, 1520~
## $ blue <int> 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1,~
## $ clock_speed <dbl> 1.8, 0.5, 2.8, 0.5, 1.4, 2.9, 2.4, 2.4, 2.9, 0.5, 2.2, 2~
## $ dual_sim <int> 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1,~
## $ fc <int> 14, 4, 1, 18, 11, 5, 1, 0, 9, 1, 2, 2, 0, 5, 8, 5, 14, 5~
## $ four_g <int> 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1,~
## $ int_memory <int> 5, 61, 27, 25, 49, 50, 47, 62, 25, 25, 55, 34, 30, 19, 5~
## $ m_dep <dbl> 0.1, 0.8, 0.9, 0.5, 0.5, 0.8, 1.0, 0.8, 0.6, 0.5, 0.6, 0~
## $ mobile_wt <int> 193, 191, 186, 96, 108, 198, 156, 111, 101, 171, 80, 171~
## $ n_cores <int> 3, 5, 3, 8, 6, 8, 2, 1, 5, 3, 7, 3, 2, 5, 8, 8, 2, 4, 2,~
## $ pc <int> 16, 12, 4, 20, 18, 9, 3, 2, 19, 20, 6, 6, 3, 15, 9, 7, 1~
## $ px_height <int> 226, 746, 1270, 295, 749, 569, 1283, 1312, 556, 52, 503,~
## $ px_width <int> 1412, 857, 1366, 1752, 810, 939, 1374, 1880, 876, 1009, ~
## $ ram <int> 3476, 3895, 2396, 3893, 1773, 3506, 3873, 1495, 3485, 65~
## $ sc_h <int> 12, 6, 17, 10, 15, 10, 14, 7, 11, 6, 13, 15, 6, 13, 17, ~
## $ sc_w <int> 7, 0, 10, 0, 8, 7, 2, 2, 9, 0, 7, 8, 2, 0, 6, 5, 3, 2, 1~
## $ talk_time <int> 2, 7, 10, 7, 7, 3, 10, 18, 10, 5, 20, 8, 20, 16, 3, 10, ~
## $ three_g <int> 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ touch_screen <int> 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0,~
## $ wifi <int> 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1,~
Ternyata, masih ada struktur data yang tidak sesuai dan kami akan mengubahnya.
id <- seluler_klas$id
seluler_klas1 <- seluler_klas %>%
mutate(
blue = as.factor(blue),
dual_sim = as.factor(dual_sim),
four_g = as.factor(four_g),
three_g = as.factor(three_g),
touch_screen = as.factor(touch_screen),
wifi = as.factor(wifi)
) %>%
select(-id)glimpse(seluler_klas1)## Rows: 1,000
## Columns: 20
## $ battery_power <int> 1043, 841, 1807, 1546, 1434, 1464, 1718, 833, 1111, 1520~
## $ blue <fct> 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1,~
## $ clock_speed <dbl> 1.8, 0.5, 2.8, 0.5, 1.4, 2.9, 2.4, 2.4, 2.9, 0.5, 2.2, 2~
## $ dual_sim <fct> 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1,~
## $ fc <int> 14, 4, 1, 18, 11, 5, 1, 0, 9, 1, 2, 2, 0, 5, 8, 5, 14, 5~
## $ four_g <fct> 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1,~
## $ int_memory <int> 5, 61, 27, 25, 49, 50, 47, 62, 25, 25, 55, 34, 30, 19, 5~
## $ m_dep <dbl> 0.1, 0.8, 0.9, 0.5, 0.5, 0.8, 1.0, 0.8, 0.6, 0.5, 0.6, 0~
## $ mobile_wt <int> 193, 191, 186, 96, 108, 198, 156, 111, 101, 171, 80, 171~
## $ n_cores <int> 3, 5, 3, 8, 6, 8, 2, 1, 5, 3, 7, 3, 2, 5, 8, 8, 2, 4, 2,~
## $ pc <int> 16, 12, 4, 20, 18, 9, 3, 2, 19, 20, 6, 6, 3, 15, 9, 7, 1~
## $ px_height <int> 226, 746, 1270, 295, 749, 569, 1283, 1312, 556, 52, 503,~
## $ px_width <int> 1412, 857, 1366, 1752, 810, 939, 1374, 1880, 876, 1009, ~
## $ ram <int> 3476, 3895, 2396, 3893, 1773, 3506, 3873, 1495, 3485, 65~
## $ sc_h <int> 12, 6, 17, 10, 15, 10, 14, 7, 11, 6, 13, 15, 6, 13, 17, ~
## $ sc_w <int> 7, 0, 10, 0, 8, 7, 2, 2, 9, 0, 7, 8, 2, 0, 6, 5, 3, 2, 1~
## $ talk_time <int> 2, 7, 10, 7, 7, 3, 10, 18, 10, 5, 20, 8, 20, 16, 3, 10, ~
## $ three_g <fct> 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,~
## $ touch_screen <fct> 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0,~
## $ wifi <fct> 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1,~
colSums(is.na(seluler_klas))## id battery_power blue clock_speed dual_sim
## 0 0 0 0 0
## fc four_g int_memory m_dep mobile_wt
## 0 0 0 0 0
## n_cores pc px_height px_width ram
## 0 0 0 0 0
## sc_h sc_w talk_time three_g touch_screen
## 0 0 0 0 0
## wifi
## 0
Ternyata pada dataset ini tidak terdapat missing value.
seluler_klas1 <- seluler_klas1 %>%
mutate(
wifi = as.factor(wifi)
)reg_predict <- predict(regresi_model, seluler_klas1)
reg_prob <- predict(regresi_model, seluler_klas1, type="prob")
selulerklas <- cbind(seluler_klas,price_range_prediction=reg_predict,
round(reg_prob, 3),seluler_klas1)
selulerklasData di atas merupakan hasil dari klasifikasi harga jual unit seluler. Dengan adanya hasil ini perusahaan dapat menjual unit seluler dengan tepat karena adanya klasifikasi harga dengan metode regresi dengan akurasi model 99%.
Kesimpulan
Untuk kasus kali ini, kami dapat menyimpulkan bahwa model yang menggunakan metode regresi adalah yang paling efektif karena menghasilkan akurasi 99%, sehingga kami memilih model tersebut untuk mengklasifikasi harga jual unit seluler yang disediakan. Pada model random forest sebetulnya terdapat model yang bagus juga dengan tingkat akurasi 94%, tetapi model tersebut memiliki tingkat error yang tinggi, yaitu sekitar 32%.