Nama : Renata Amalia Putri
NIM : 220605110074
Kelas : C (Reguler)
Mata Kuliah : Kalkulus
Dosen Pengampu : Prof. Dr. Suhartono, M.kom
Jurusan : Teknik Informatika
Universitas : UIN Maulana Malik Ibrahim Malang
Agar mempunyai ide bentuk fungsi untuk model maka perlu memilih parameter yang akan membuat fungsi model cocok untuk diamati. Proses pemilihan parameter untuk mencocokkan pengamatan dapat disebut sebagai Model Fitting
Sebagai ilustrasi, terdapat data dalam file “utilities.csv” yang mencatat suhu rata-rata setiap bulan (dalam derajat F) serta penggunaan gas alam bulanan (dalam kaki kubik, CCF)
library(mosaicCalc)
## Loading required package: mosaic
## Registered S3 method overwritten by 'mosaic':
## method from
## fortify.SpatialPolygonsDataFrame ggplot2
##
## The 'mosaic' package masks several functions from core packages in order to add
## additional features. The original behavior of these functions should not be affected by this.
##
## Attaching package: 'mosaic'
## The following objects are masked from 'package:dplyr':
##
## count, do, tally
## The following object is masked from 'package:Matrix':
##
## mean
## The following object is masked from 'package:ggplot2':
##
## stat
## The following objects are masked from 'package:stats':
##
## binom.test, cor, cor.test, cov, fivenum, IQR, median, prop.test,
## quantile, sd, t.test, var
## The following objects are masked from 'package:base':
##
## max, mean, min, prod, range, sample, sum
## Loading required package: mosaicCore
##
## Attaching package: 'mosaicCore'
## The following objects are masked from 'package:dplyr':
##
## count, tally
##
## Attaching package: 'mosaicCalc'
## The following object is masked from 'package:stats':
##
## D
Utils <- read.csv("http://www.mosaic-web.org/go/datasets/utilities.csv")
gf_point(ccf ~ temp, data = Utils) %>%
gf_labs(y = "Natural gas usage (ccf/month)",
x = "Average outdoor temperature (F)")
Salah satu fungsi yang paling sederhana dan paling umum digunakan dalam pemodelan adalah fungsi garis lurus f(x) = Ax + B. Dalam fungsi f(x), variabel x singkatan dari input, sedangkan A dan B adalah parameter. Mengatur nama input dan output agar sesuai dengan data yang ada.
Dari data utilitas, inputnya adalah temperatur, suhu. Output yang akan dimodelkan adalah CCF. Untuk menyesuaikan fungsi model dengan data, maka tuliskan rumus dengan nama input, parameter, dan output yang sesuai di tempat yang benar:
library(mosaicCalc)
f <- fitModel(ccf ~ A * temp + B, data = Utils)
Output dari fitModel() adalah fungsi dengan bentuk matematika yang sama seperti ditentukan dalam argumen pertama (ccf ~ A * temp + B) dengan nilai numerik spesifik yang diberikan terhadap paramater untuk membuat fungsi yang paling cocok dengan data. Cara fitModel() mengetahui besaran mana dalam bentuk matematika yang merupakan variabel dan mana yang disebut parameter yaitu dengan apa pun yang ada di dalam data yang digunakan untuk pemasangan adalah variabel (temp); hal-hal lain (A dan B) disebut parameter. fitModel() ccf ~ A * temp + B fitModel()temp A B
gf_point(ccf ~ temp, data = Utils) %>%
slice_plot(f(temp) ~ temp)
Untuk dapat menambahkan fungsi lain ke dalam campuran dengan mudah. Semisal, mungkin berpikir sqrt(temp) berhasil entah bagaimana. Cobalah!
library(mosaicCalc)
f2 <- fitModel(
ccf ~ A * temp + B + C *sqrt(temp),
data = Utils)
gf_point(
ccf ~ temp, data = Utils) %>%
slice_plot(f2(temp) ~ temp)
Contoh ini hanya melibatkan satu variabel input. Keseluruhan ilmu alam dan sosial, teknik yang sangat penting dan banyak digunakan adalah dengan menggunakan banyak variabel di dalam proyeksi. Sebagai ilustrasi, coba lihatlah data harga mobil Honde bekas di used-hondas.csv
Hondas <- read.csv("http://www.mosaic-web.org/go/datasets/used-hondas.csv")
head(Hondas)
## Price Year Mileage Location Color Age
## 1 20746 2006 18394 St.Paul Grey 1
## 2 19787 2007 8 St.Paul Black 0
## 3 17987 2005 39998 St.Paul Grey 2
## 4 17588 2004 35882 St.Paul Black 3
## 5 16987 2004 25306 St.Paul Grey 3
## 6 16987 2005 33399 St.Paul Black 2
Dari data diatas kumpulan data mencakup variabel dan harga akan tergantung pada jarak tempuh dan usia mobil. Berikut adalah model yang sangat sederhana yang menggunakan kedua variabel: Price Age Mileage
library(mosaicCalc)
carPrice1 <- fitModel(
Price ~ A + B * Age + C * Mileage, data = Hondas
)
Sehingga dapat memplot fungsi yang dipasang :
library(mosaicCalc)
contour_plot(
carPrice1(Age = age, Mileage = miles) ~ age + miles,
domain(age=2:8, miles=range(0, 60000)))
Lalu, ada model yang lebih canggih yang mencakup interaksi antara usia dan jarak tempuh, bahwa efek usia mungkin berbeda tergantung pada jarak tempuhnya.
library(mosaicCalc)
carPrice2 <- fitModel(
Price ~ A + B * Age + C * Mileage + D * Age * Mileage,
data = Hondas)
Sehingga bisa diplot lagi sama dengan cara yang diatas :
library(mosaicCalc)
contour_plot(
carPrice2(Age=age, Mileage=miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
LATIHAN
Latihan 1 : Membuat grafik model dengan Usia dan jarak Tempuh sebagai jumlah input dan harga (USD) sebagai output. Menggunakan carPrice() Age Mileage
contour_plot(
carPrice1(Age = age, Mileage = miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
Berdasarkan grafik di atas, konturrnya vertikal.
Jawaban : Di setiap kontur disesuaikan dengan harga yang berbeda. Ketika dilihat secara horizontal maka menyeberang dari satu kontur ke kontur lainnya. Tetapi saat dilihat secara vertikal maka tidak melewati kontur. Ini berarti bahwa harga tidak bergantung karena perubahan tidak menyebabkan perubahan harga. Tetapi harga berubah dengan Age Mileage Mileage Mileage Age
Jawaban : Ketika dilihat secara horizontal maka berpindah dari kontur ke kontur: harga berubah. Hal ini juga berlaku ketika melihat dnegan vertikal. Jadi harga tergantung pada Age Age Mileage Mileage
Latihan 2 :
logPrice2 <- fitModel(
logPrice ~ A + B * Age + C * Mileage + D * Age * Mileage,
data = Hondas %>% mutate(logPrice = log10(Price)))
Model ini didefinisikan untuk mencakup interaksi antara usia dan jarak tempuh. Mungkin saja parameternya akan mendekati nol berarti bahwa data tidak memberikan bukti apapun untuk interaksi.
Apa yang disebut sebagai bentuk kontur tentang apakah data memberikan bukti untuk interaksi dalam harga log?
Jawaban :
contour_plot(
logPrice2(Age=age, Mileage=miles) ~ age + miles,
domain(age = range(0, 8), miles = range(0, 60000)))
Konturnya cukup lurus yang menunjukkan bahwa ada sedikit interaksi.
contour_plot(
logPrice2(Age=age, Mileage=miles) ~ age + miles, domain(age = range(1, 5), miles = range(0, 6000)))
## Warning: Computation failed in `stat_contour_fill()`:
## factor level [2] is duplicated
Latihan 3 :
carPrice3 <- fitModel(
Price ~ A + B * Age + C * Mileage + D * Age * Mileage +
E * Age^2 + F * Mileage^2 + G * Age^2 * Mileage +
H * Age * Mileage^2,
data = Hondas)
gf_point(Mileage ~ Age, data = Hondas, fill = NA) %>%
contour_plot(
carPrice3(Age=Age, Mileage=Mileage) ~ Age + Mileage)
Kurva dan Model Linier
Kata linier dalam “model linier” mengacu pada “kombinasi linier”, bukan “garis lurus”. Membangun kurva yang rumit dengan mengambil kombinasi fungsi linier dan menggunakan operasi proyeksi aljabar linier untuk mencocokkan kurva ini sedekat mungkin dengan data. Proses tersebut dinamakan “fitting”.
Sebagai ilustrasi, data dalam file utilities.csv mencatat suhu rata-rata setiap bulan (derajat F) serta penggunaan gas alam bulanan (kaki kubik, ccf).
Utilities = read.csv("http://www.mosaic-web.org/go/datasets/utilities.csv")
gf_point(ccf ~ temp, data = Utilities)
Berbagai jenis fungsi dapat digunakan untuk mewakili data ini. Salah satu yang paling sederhan dan umum digunakan dalam pemodelan adalah fungsi garis lurus. Di dalam aljabar linier adalah kombinasi linier dari fungsi f1(T) = 1 dan f2(T) = T. Secara konvensional, fungsi garis lurus ditulis f(T) = b + mT. Untuk menemukan skalar numerik yang paling cocok dengan data agara sesuai dengan fungsi dengan data dapat dilakukan dengan operator aljabar linier. project( )
project(ccf ~ temp + 1, data = Utilities)
## (Intercept) temp
## 253.098208 -3.464251
Operator memberikan bilai skalar. Fungsi fotting itu sendiri dibangun dengan menggunakan nilai skalar ini untuk menggabungkan fungsi yang terlibat.
model_fun = makeFun( 253.098 - 3.464*temp ~ temp)
gf_point(ccf ~ temp, data=Utils) %>%
slice_plot(model_fun(temp) ~ temp)
Bisa juga dengan menambahkan fungsi lain ke dalam campuran dengan mudah dengan menggunakan sqrt(T)
project(ccf ~ temp + sqrt(temp) + 1, data = Utils)
## (Intercept) temp sqrt(temp)
## 447.029273 1.377666 -63.208025
mod2 <- makeFun(447.03 + 1.378*temp - 63.21*sqrt(temp) ~ temp)
gf_point(ccf ~ temp, data=Utils) %>% # the data
slice_plot(mod2(temp) ~ temp) %>%
gf_labs(x = "Temperature (F)",
y = "Natural gas used (ccf)")
Operator mengambil serangkaian vektor. Saat menyesuaikan fungsi dengan data, vektor berasal dari kumpulan data sehingga perintah harus merujuk ke nama kuantitas.
Setelah membuat proyeksi dan menemukan koefisien maka dapat membangun fungsi matematika yang sesuai dengan menggunakan koefisien dalam ekspresi matematika untuk membuat fungsi.
Lihatlah data harga mobil Honda bekas. used-hondas.csv
Hondas = read.csv("http://www.mosaic-web.org/go/datasets/used-hondas.csv")
head(Hondas)
## Price Year Mileage Location Color Age
## 1 20746 2006 18394 St.Paul Grey 1
## 2 19787 2007 8 St.Paul Black 0
## 3 17987 2005 39998 St.Paul Grey 2
## 4 17588 2004 35882 St.Paul Black 3
## 5 16987 2004 25306 St.Paul Grey 3
## 6 16987 2005 33399 St.Paul Black 2
Beikut adalah model yang sangat sederhana yang menggunakan kedua variabel: Price Age Mileage
project(Price ~ Age + Mileage + 1, data = Hondas)
## (Intercept) Age Mileage
## 2.133049e+04 -5.382931e+02 -7.668922e-02
Plot sebagai fungsi matematika :
car_price <- makeFun(21330-5.383e2*age-7.669e-2*miles ~ age & miles)
contour_plot(car_price(age, miles) ~ age + miles,
domain(age=range(2, 8), miles=range(0, 60000))) %>%
gf_labs(title = "Miles per gallon")
project(Price ~ Age + Mileage + Age*Mileage + 1, data = Hondas)
## (Intercept) Age Mileage Age:Mileage
## 2.213744e+04 -7.494928e+02 -9.413962e-02 3.450033e-03
car_price2 <- makeFun(22137 - 7.495e2*age - 9.414e-2*miles +
3.450e-3*age*miles ~ age & miles)
contour_plot(
car_price2(Age, Mileage) ~ Age + Mileage,
domain(Age = range(0, 10), Mileage = range(0, 100000))) %>%
gf_labs(title = "Price of car (USD)")
Latihan
Latihan 1 : Menyesuaikan Polinomial Menyesuaikan polinomial dengan data adalah masalah aljabar linier : membangun vektor yang sesuai untuk mewakili berbagai kekuatan. Misalnya, berikut cara menyesuaikan model kuadrat dengan variabel versus dalam file data: ccf temp “utilities.csv”
Utilities = read.csv("http://www.mosaic-web.org/go/datasets/utilities.csv")
project(ccf ~ 1 + temp + I(temp^2), data = Utilities)
## (Intercept) temp I(temp^2)
## 317.58743630 -6.85301947 0.03609138
ccfQuad <- makeFun(317.587 - 6.853*T + 0.0361*T^2 ~ T)
gf_point(ccf ~ temp, data = Utilities) %>%
slice_plot(ccfQuad(temp) ~ temp)
Untuk menemukan nilai model ini pada suhu tertentu, cukup dengan mengevaluasi fungsinya. ccfQuad( ) T
ccfQuad(T=72)
## [1] 11.3134
A. Sesuaikan polinomial orde 3 versus dengan data utilitas. Berapa nilai model ini untuk suhu 32 derajat? {87.103.128.142.143.168.184}
Jawaban :
project(ccf ~ 1 + temp + I(temp^2) + I(temp^3), data = Utils)
## (Intercept) temp I(temp^2) I(temp^3)
## 2.550709e+02 -1.427408e+00 -9.643482e-02 9.609511e-04
ccfCubic <-
makeFun(2.551e2 - 1.427*T -
9.643e-2*T^2 + 9.6095e-4*T^3 ~ T)
gf_point(ccf ~ temp, data = Utils) %>%
slice_plot(ccfCubic(temp) ~ temp)
ccfCubic(32)
## [1] 142.1801
B. Sesuaikan polinomial orde 4 versus dengan data utilitas. Berapa nilai model ini untuk suhu 32 derajat? {87.103.128.140.143.168.184}
Jawaban :
project(ccf ~ 1 + temp + I(temp^2) + I(temp^3) + I(temp^4),
data = Utils)
## (Intercept) temp I(temp^2) I(temp^3) I(temp^4)
## 1.757579e+02 8.225746e+00 -4.815403e-01 7.102673e-03 -3.384490e-05
ccfQuad <- makeFun(1.7576e2 + 8.225*T -4.815e-1*T^2 +
7.103e-3*T^3 - 3.384e-5*T^4 ~ T)
gf_point(ccf ~ temp, data = Utils) %>%
slice_plot(ccfQuad(temp) ~ temp) %>%
gf_labs(y = "Natural gas use (ccf)", x = "Temperature (F)")
ccfQuad(32)
## [1] 143.1713
C. Buat plot perbedaan antara model urutan ke-3 dan ke-4 pada kisaran suhu dari 20 hingga 60 derajat. Apa perbedaan terbesar (dalam nilai absolut) antara output kedua model? a. Sekitar 1 ccf b. Sekitar 4 ccf c. Sekitar 8 ccf d. Sekitar 1 derajat F e. Sekitar 4 derajat F f. Sekitar 8 derajat F
Jawaban : Output dari model adalah dalam satuan ccf
slice_plot(ccfQuad(temp) - ccfCubic(temp) ~ temp,
domain(temp = range(20, 60)))
Perbedaan antara kedua model selalu dalam sekitar 4 ccf.
Latihan 2 : Regresi Berganda Pada tahun 1980, majalah Consumer Reports mempelajari mobil model 1978-79 untuk mengeksplorasi bagaimana berbagai faktor mempengaruhi penghematan bahan bakar. Pengukuran termasuk efisiensi bahan bakar dalam mil-per-galon, mengekang berat dalam pound, tenaga mesin dalam tenaga kuda, dan jumlah silinder. Variabel-variabel ini termasuk dalam file. “cardata.csv”
Cars = read.csv("http://www.mosaic-web.org/go/datasets/cardata.csv")
head(Cars)
## mpg pounds horsepower cylinders tons constant
## 1 16.9 3967.60 155 8 2.0 1
## 2 15.5 3689.14 142 8 1.8 1
## 3 19.2 3280.55 125 8 1.6 1
## 4 18.5 3585.40 150 8 1.8 1
## 5 30.0 1961.05 68 4 1.0 1
## 6 27.5 2329.60 95 4 1.2 1
Jawaban :
project(mpg ~ pounds + 1, data = Cars)
## (Intercept) pounds
## 43.188646127 -0.007200773
43.1886 - 0.00720*2000
## [1] 28.7886
Jawaban :
project(mpg ~ pounds + horsepower + 1, data = Cars)
## (Intercept) pounds horsepower
## 46.932738241 -0.002902265 -0.144930546
mod_fun <- makeFun(46.933 - 0.00290*lbs - 0.1449*hp ~ lbs + hp)
mod_fun(lbs = 2000, hp = 50)
## [1] 33.888
Fungsi Eksponensial
Untuk megilustrasikan, pertimbangkan data yang menunjukkan hubungan eksponensial antara fraksi keluarga dengan dua mobil dan pendapatan : Income-Housing.csv
Families <- read.csv("http://www.mosaic-web.org/go/datasets/Income-Housing.csv")
gf_point(TwoVehicles ~ Income, data = Families)
Bentuk matematika dari fungsi eksponensial ini adalah Sebuahexp(kY) + C. A dan C adalah parameter linier yang tidak diketahui. k adalah parameter non-linier yang tidak diketahui.
kguess <- log(0.5) / 25000
kguess
## [1] -2.772589e-05
Dapat menemukan nilai terbaik dari linier Parameter Sebuah dan C melalui teknik aljabar linier :
project( TwoVehicles ~ 1 + exp(Income*kguess), data = Families)
## (Intercept) exp(Income * kguess)
## 110.4263 -101.5666
Dapat juga membangun fungsi yang merupakan kombinasi linier terbaik dengan secara eksplisit menambahkan dua fungsi :
f <- makeFun( 110.43 - 101.57*exp(Income * k) ~ Income, k = kguess)
gf_point(TwoVehicles ~ Income, data = Families) %>%
slice_plot(f(Income) ~ Income)
Grafik berjalan dengan sangat dekat dengan titik data. Tetapi juga dapat melihat nilai numerik dari fungsi untuk penghasilan apa pun:
f(Income = 10000)
## [1] 33.45433
f(Income = 70000)
## [1] 95.84584
Results <- Families %>%
dplyr::select(Income, TwoVehicles) %>%
mutate(model_val = f(Income = Income),
resids = TwoVehicles - model_val)
Results
## Income TwoVehicles model_val resids
## 1 3914 17.3 19.30528 -2.0052822
## 2 10817 34.3 35.17839 -0.8783904
## 3 21097 56.4 53.84097 2.5590313
## 4 34548 75.3 71.45680 3.8432013
## 5 51941 86.6 86.36790 0.2320981
## 6 72079 92.9 96.66273 -3.7627306
Residu adalah perbedaan antara nilai model ini dan nilai aktual dalam kumpulan data.
Kolom memberikan sisa untuk setiap baris. Tetapi juga dapat menganggap kolom sebagai vektor. Panjang kuadrat vektor adalah jumlah residu kuadrat.
sum(Results$resids^2)
## [1] 40.32358
Mengoptimalkan Tebakan Membangun fungsi yang menghitung jumlah residu kuadrat untuk setiap niali tertentu dar k.
sum_square_resids <- Vectorize(function(k) {
sum((Families$TwoVehicles - f(Income=Families$Income, k)) ^ 2)
})
slice_plot(
sum_square_resids(k) ~ k,
domain(k = range(log(0.5)/40000,log(0.5)/20000)))
DAFTAR PUSTAKA
Kaplan, Daniel. (2020). Computer-age Calculus with R