Pertemuan 4 : Grafik
Terdapat juga beberapa package lain yaitu :Paket standar yang sudah tersedia di R adalah
package graphics(dikerjakan secara low level).
Tipe-tipe device yang biasa digunakan :
| Tipe | Keterangan |
|---|---|
| jpeg | kelemahannya pada garis lurus, jika terlalu banyak garis dan ada kemiringan garis maka garisnya akan kabur. Kelebihannya ada pada ukuran data yang kecil |
| png | cocok untuk grafik yang memiliki banyak garis. Kelemahannya, ukuran lebih besar dari jpeg (namun ukuran 10% lebih kecil dari bitmap) |
| bitmap | grafik resolusi tinggi, tapi ukuran sangat besar |
Tipe png lebih sering digunakan dalam grafik statistika karena baik untuk tampilan banyak garis dan ukurannya tidak terlalu besar.
Fungsi Grafik Dasar R
Tipe-tipe plot
Akan dibuat plot antara data x bilangan berurutan 1 sampai 40 dan y yaitu angka acak dengan rata-rata 5 dan standar deviasi 1
Tipe Titik
Tipe Garis
Tipe both (Titik dan Garis Terpisah)
Tipe c (Titik kosong dihubungkan dengan garis)
Tipe Overplot (Titik dan Garis)
Tipe Tangga : Datar terlebih dahulu
Tipe S (S huruf kapital) : Tipe tangga lainnya
Tipe Histogram
Tipe Noplotting : Membuat kanvas kosong
Skala kanvas mengikuti codingan titik
Pilihan Garis pada Grafik
Bentuk garis ini dapat diatur dengan menggunakan argumen lty.
Berikut adalah daftar dari isi argumen tersebut beserta keterangannya:
Pilihan Warna Grafik
Menggunakan angka integer 1-8
| Integer | Warna |
|---|---|
| 1 | hitam |
| 2 | merah |
| 3 | hijau |
| 4 | biru |
| 5 | biru muda |
| 6 | ungu |
| 7 | kuning |
| 8 | abu |
Warna ini akan berulang jika lebih dari 8, misal angka 9 akan kembali ke warna hitam, 10 akan berwarna merah, dan seterusnya.
Cara akses dengan dengan syntax col=angka, misal : col=1
Menggunakan Fungsi colors()
Ada 657 warna. Dapat diakses menggunakan “colorname” sesuai dengan nama warna yang tersedia pada fungsi colors()
Menggunakan fungsi rainbow()
Memberikan gradasi warna dari merah sampai ungu tergantung pada banyaknya nilai yang kita masukkan.
## [1] "#FF0000" "#FF9900" "#CCFF00" "#33FF00" "#00FF66" "#00FFFF" "#0066FF"
## [8] "#3300FF" "#CC00FF" "#FF0099"
Akan menghasilkan 10 gradasi warna dari merah sampai ungu.
Menggunakan fungsi rgb()
Ada pilihan 0-255 warna. Caranya dengan memasukkan angka untuk masing-masing warna red, green , dan blue yang akan menghasilkan code hexacode untuk mewarnai grafik.
## [1] "#4D8040"
Argumen dalam Grafik
| Argumen | Fungsi |
|---|---|
| xlab | memberi judul sumbu x |
| ylab | memberi judul sumbu y |
| main | memberi judul grafik |
| col | memberi warna dari titik |
| pch | adalah point character digunakan untuk memberi bentuk pada titik. secara default ada 25 karakter titik |
Macam-macam tipe pch
Contoh Penggunaan
cex digunakan untuk mengatur ukuran point. defaultnya adalah 1. semakin besar angka akan semakin besar titiknya xlim dan ylim untuk mengatur skala yang ada di grafik. nilai dari x adalah 0-100, misalnya mau dibuat x nya sampai 150
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))Menambahkan Objek pada Grafik
Menambah Amatan
Akan ditambahkan amatan dalam plot yang sudah ada berupa titik (dengan fungsi points() )sebanyak 10 titik antara x1 yaitu angka berurutan 41 sampai 50 dan angka acak random normal dengan mean=5 dan sd=1
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))
#menambah data baru
x1 <- 41:50
y1 <- rnorm(10,5,1)
points(x1,y1,cex=2) Data baru adalah data titik dengan warna putih yang ada di sebelah kanan.
Menambahkan garis
digunakan fungsi lines. Penambahan garis berguna untuk membedakan atau memberi batasan pada data, misalnya: data training dan data testing
lwd : line width lty : integer
Akan ditambahkan garis x2 yaitu angka x 40.5 sebanyak 20 titik. dan y2 adalah angka berurut dari y1 namun hanya diambil 20 titik pertama.
## [1] 40.5 40.5 40.5 40.5 40.5 40.5 40.5 40.5 40.5 40.5 40.5 40.5 40.5 40.5 40.5
## [16] 40.5 40.5 40.5 40.5 40.5
## [1] 2.256281 2.545201 2.834121 3.123041 3.411962 3.700882 3.989802 4.278722
## [9] 4.567642 4.856562 5.145482 5.434402 5.723322 6.012242 6.301162 6.590082
## [17] 6.879002 7.167922 7.456842 7.745762
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))
#menambah data baru
x1 <- 41:50
y1 <- rnorm(10,5,1)
points(x1,y1,cex=2)
#Menambah garis
x2 <- rep(40.5,20)
y2 <- seq(min(c(y,y1)), max(c(y,y1)), length=20)
lines(x2,y2, col=4, lwd=2, lty=2)menambahkan garis dengan fungsi abline. Akan ditambahkan garis kedua yaitu garis horisontal rata-rata dari y dengan warna merah. Opsi abline untu membuat garis horisontal adalah dengan fungsi h (garis horisontal x=sekian)
## [1] 6.336363 6.304346 5.803345 6.843525 6.406804 7.001023 5.753731 5.568186
## [9] 4.954513 3.909676 5.007701 5.656115 5.821170 7.745762 3.989398 4.747912
## [17] 4.317158 5.076852 5.510257 5.337317 4.676833 5.571877 6.222197 4.689398
## [25] 4.774655 6.443215 5.642894 5.541299 3.223438 3.730646 5.798377 4.438596
## [33] 6.021566 4.320261 5.579155 3.981210 4.482418 4.589406 4.699340 2.256281
## [1] 5.219355
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))
#menambah data baru
x1 <- 41:50
y1 <- rnorm(10,5,1)
points(x1,y1,cex=2)
#Menambah garis 1
x2 <- rep(40.5,20)
y2 <- seq(min(c(y,y1)), max(c(y,y1)), length=20)
lines(x2,y2, col=4, lwd=2, lty=2)
#Menambah garis 2
abline(h=mean(y), col="red", lwd=2.5)Akan ditambahkan garis ke-3 yaitu suatu garis dengan persamaan a+bx dimana a=2 dan b=1/10 dengan nilai x yang berada pada rentang kanvas dan diberi warna kuning
#PLOT AWAL
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))
#menambah data baru
x1 <- 41:50
y1 <- rnorm(10,5,1)
points(x1,y1,cex=2)
#Menambah garis 1
x2 <- rep(40.5,20)
y2 <- seq(min(c(y,y1)), max(c(y,y1)), length=20)
lines(x2,y2, col=4, lwd=2, lty=2)
#Menambah garis 2
abline(h=mean(y), col="red", lwd=2.5)
#Menambah garis 3
abline(a=2,b=1/10, col="yellow", lwd=2, lty=2)Menambahkan Tanda Panah
arrows perlu ditentukan koordinat awal dan akhir
#PLOT AWAL
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))
#menambah data baru
x1 <- 41:50
y1 <- rnorm(10,5,1)
points(x1,y1,cex=2)
#Menambah garis 1
x2 <- rep(40.5,20)
y2 <- seq(min(c(y,y1)), max(c(y,y1)), length=20)
lines(x2,y2, col=4, lwd=2, lty=2)
#Menambah garis 2
abline(h=mean(y), col="red", lwd=2.5)
#Menambah garis 3
abline(a=2,b=1/10, col="yellow", lwd=2, lty=2)
#Menambah Panah
arrows(x0=30, y0=3.5,x1=40,y1=mean(y)-.1, lwd=2)Menambahkan tulisan
Akan ditambahkan tulisan “Titik potong”
X dan y mengatur koordinat text
labels mengatur isi text
cex untuk mengatur besar kecilnya tulisan
#PLOT AWAL
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))
#menambah data baru
x1 <- 41:50
y1 <- rnorm(10,5,1)
points(x1,y1,cex=2)
#Menambah garis 1
x2 <- rep(40.5,20)
y2 <- seq(min(c(y,y1)), max(c(y,y1)), length=20)
lines(x2,y2, col=4, lwd=2, lty=2)
#Menambah garis 2
abline(h=mean(y), col="red", lwd=2.5)
#Menambah garis 3
abline(a=2,b=1/10, col="yellow", lwd=2, lty=2)
#Menambah Panah
arrows(x0=30, y0=3.5,x1=40,y1=mean(y)-.1, lwd=2)
#Menambah tulisan
text(x=29,y=3.3, labels="Titik Potong",cex=0.7)#PLOT AWAL
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))
#menambah data baru
x1 <- 41:50
y1 <- rnorm(10,5,1)
points(x1,y1,cex=2)
#Menambah garis 1
x2 <- rep(40.5,20)
y2 <- seq(min(c(y,y1)), max(c(y,y1)), length=20)
lines(x2,y2, col=4, lwd=2, lty=2)
#Menambah garis 2
abline(h=mean(y), col="red", lwd=2.5)
#Menambah garis 3
abline(a=2,b=1/10, col="yellow", lwd=2, lty=2)
#Menambah Panah
arrows(x0=30, y0=3.5,x1=40,y1=mean(y)-.1, lwd=2)
#Menambah tulisan 1
text(x=29,y=3.3, labels="Titik Potong",cex=0.7)
#Menambah tulisan 2
text(x=3,y=7.3, labels="Data Awal",cex=1)#PLOT AWAL
plot(x,y,type="p",xlab="Sumbu x", ylab="Sumbu y", main="Bilangan Acak Normal", col=rainbow(40), pch=16, cex=2, xlim=c(0,50),ylim=c(2.5,7.5))
#menambah data baru
x1 <- 41:50
y1 <- rnorm(10,5,1)
points(x1,y1,cex=2)
#Menambah garis 1
x2 <- rep(40.5,20)
y2 <- seq(min(c(y,y1)), max(c(y,y1)), length=20)
lines(x2,y2, col=4, lwd=2, lty=2)
#Menambah garis 2
abline(h=mean(y), col="red", lwd=2.5)
#Menambah garis 3
abline(a=2,b=1/10, col="yellow", lwd=2, lty=2)
#Menambah Panah
arrows(x0=30, y0=3.5,x1=40,y1=mean(y)-.1, lwd=2)
#Menambah tulisan 1
text(x=29,y=3.3, labels="Titik Potong",cex=0.7)
#Menambah tulisan 2
text(x=3,y=7.3, labels="Data Awal",cex=1)
#Menambah tulisan 3
text(x=46,y=7.3, labels="Data Baru",cex=1.2)LATIHAN 1
rpois membangkitkan bilangan acak poisson dengan n=100 dan lambda=5 -> fungsi massa peluang poisson dengan lambda=5
Latihan 2
Latihan 3
Latihan 4
x <- rchisq(100,df=4)
hist(x,freq=FALSE,ylim=c(0,0.2))
curve(dchisq(x,df=4),col=3,lty=2,lwd=2,add=TRUE)par(mfrow=c(2,2))
#plot 1
plot(1:40,y,type="p",xlab="Sumbu x",ylab="Sumbu y",
main="Bilangan Acak Normal",col=2,pch=16)
#plot 2
plot(sin,-pi, 2*pi)
#plot 3
plot(table(rpois(100,5)),type="h",col="red",
lwd=1,main="rpois(100,lambda=5)")
#plot 4
plot(a1,a2,type="n",main="W")
text(a1,a2,labels=paste("w",1:25,sep=""),
col=rainbow(25),cex=0.8)Latihan 5
Membuat 4 jenis grafik dalam 1 tampilan yang berisi 100 angka acak berdistribusi Normal (5,1) dengan format
## [1] 1 2 3 4
screen(3)
boxplot(yb)
title("BoxplotBilangan Acak Normal",cex.main=0.7)
screen(4)
xb<-1:100
plot(xb,yb,type="l",lwd=2,col="blue")
title("LinePlot Bilangan Acak Normal",cex.main=0.7)
screen(2)
hist(yb,freq=FALSE,main=NULL,ylim=c(0,0.5))
x <-yb
curve(dnorm(x,5,1),col="red",lty=2,lwd=2,add=TRUE)
title("Histogram Bilangan Acak Normal",cex.main=0.7)
screen(1)
plot(xb,yb,pch=16,col=rainbow(100))
title("ScatterPlot Bilangan Acak Normal",cex.main=0.7)Package ggplot2
ggplot2 merupakan Packages yang diciptakan oleh Hadley Wickham dengan kelebihannya dalam pembuatan gambar yang elegan dan kompleks. Popularitas ggplot2 di komunitas R tidak diragukan lagi. ggplot2 memungkinkan anda untuk membuat grafik yang merepresentasikan data numerik dan kategorik baik univariat maupun multivariat secara simultan. Pengelompokan yang dapat diwakili oleh warna, simbol, ukuran dan ketebalan point. ggplot2 mempunyai banyak fungsi dan pilihan untuk plot yang akan ditampilkan.
ggplot2 merupakan packages yang ada di dalam tidyverse. Install ggplot2 melalui tidyverse library
Pembuatan Grafik
Secara umum pembuatan grafik pada package ggplot2 dapat dilakukan dengan menggunakan dua cara yaitu
1. qplot(x,y,geom=“xxx”)
- ggplot()+geom_xxx(aes(x,y)).
Sintaks ggplot()+geom_xxx() sebaiknya digunakan saat ingin membuatbeberapa jenis grafik(misal scatter plot+line plot) dan saatingin mengganti parameter-parameter dari plot(misal bentuk titik atau warna titik).
***
Penggantian warna background dapat dilakukan dengan menggunakan fungsi theme_xxx.. Theme yang dapat digunakan antara lain :
* theme_bw()
* theme_dark()
* theme_classic()
* theme_minimal()
* theme_light()
* theme_linedraw()
* theme_gray()
***
Tanda +
Tanda + sangat berperan penting dalam ggplot2. Tanda ini digunakan untuk menambahkan beberapa jenis plot yang berbeda dalam satu gambar. Selain itu tanda ini juga digunakan untuk mengakses fungsi dalam package ggplot2 yang dapat mengubah parameter grafik. Contoh :
set.seed(12)
ggplot()+geom_line(aes(x=1:10,y=rnorm(10)))+
#manambah plot titik
geom_point(aes(x=1:10,y=rnorm(10)))+
#mengubah nama sumbu x
xlab("Waktu")+
#menambahkan nama grafik
ggtitle("Grafik Percobaan")+
#mengubah tema
theme_classic()Fungsi Aes Fungsi aes merupakan fungsi yang digunakan untuk mengatur bagaimana variabel-variabel dalam data dipetakan dalam plot. Misalnya saja, pada scatterplot variable apa yang menjadi sumbu x dan sumbu y, memberi warna scatterplot berdasarkan kategori tertentu. Berikut contohnya :
argumen
col berperan sebagai pewarna titik berdasarkan kategori.
Visualisasi Data
Data yang akan digunakan adalah housing prices yang merupakan dataset bawaan dari R. Berikut merupakan isi dari dataset housing prices.
data_house<-read.csv("https://raw.githubusercontent.com/gerrydito/Sains-Data-S2/master/Praktikum/Visualisasi%20Data/house_price.csv", header = TRUE, sep=",")
head(data_house)## date price bedrooms bathrooms sqft_living sqft_lot floors
## 1 2014-05-02 00:00:00 313000 3 1.50 1340 7912 1.5
## 2 2014-05-02 00:00:00 2384000 5 2.50 3650 9050 2.0
## 3 2014-05-02 00:00:00 342000 3 2.00 1930 11947 1.0
## 4 2014-05-02 00:00:00 420000 3 2.25 2000 8030 1.0
## 5 2014-05-02 00:00:00 550000 4 2.50 1940 10500 1.0
## 6 2014-05-02 00:00:00 490000 2 1.00 880 6380 1.0
## waterfront view condition sqft_above sqft_basement yr_built yr_renovated
## 1 0 0 3 1340 0 1955 2005
## 2 0 4 5 3370 280 1921 0
## 3 0 0 4 1930 0 1966 0
## 4 0 0 4 1000 1000 1963 0
## 5 0 0 4 1140 800 1976 1992
## 6 0 0 3 880 0 1938 1994
## street city statezip country
## 1 18810 Densmore Ave N Shoreline WA 98133 USA
## 2 709 W Blaine St Seattle WA 98119 USA
## 3 26206-26214 143rd Ave SE Kent WA 98042 USA
## 4 857 170th Pl NE Bellevue WA 98008 USA
## 5 9105 170th Ave NE Redmond WA 98052 USA
## 6 522 NE 88th St Seattle WA 98115 USA
Plot yang biasa digunakan untuk menggambar
DISTRIBUSI DATA
Histogram
Misal kita ingin mengetahui distribusi harga rumah dari kolom price maka dapat dengan
ggplot(data_house) +
geom_histogram(aes(x = price),fill="darkred",col="darkred",binwidth = 5000) +
ggtitle("Histogram Harga Rumah") +
ylab("Jumlah Rumah") +
xlab("Harga Rumah") +
theme(plot.title = element_text(hjust = 0.5))Keterangan :
| Argumen | Fungsi |
|---|---|
| Fill | memberi warna |
| binwidth | mengatur ukuran bin/kotak |
| ggtitle | memberi judul grafik |
| ylab | memberi nama sumbu y |
| xlab | memberi nama sumbu x |
| plot.title | mengatur tampilan dari judul (posisi, ukuran dan jenis font) |
Boxplot
Biasanya digunakan untuk melihat perbandingan distribusi.
Pada ilustrasi ini kita akan membandingkan distribusi harga rumah dari 10 kota. Oleh karena itu, langkah pertama yang kita lakukan adalah menyaring ke-10 kota tersbut menggukan fungsi filter.
data_house%>%
filter(city %in% c("Shoreline","Seattle"
,"Auburn","Duvall","Burien",
"Tukwila","Vashon","Yarrow Point",
"SeaTac","Medina")
)%>%
ggplot() +
geom_boxplot(aes(x = city,y = price,fill=city),show.legend = F) +
ggtitle("Sebaran Harga Rumah Setiap Kota") +
ylab("Harga Rumah") +
xlab("Kota") +
theme(plot.title = element_text(hjust = 0.5))+
theme_bw() Hal yang perlu diperhatikan :
1.Nama-nama peubah atau kelompok harus ada dalam satu kolom yang bertipe character atau factor.
Argumen xdi dalamfungsi aesdisi dengannama kolomyang isinyanama-nama peubah atau kelompoktersebut.Jika ingin memberikan warna yang beda-beda pada boxplot maka
argumen fillharusdiletakan dalam fungsi aesdan diisi dengan nama kolom yang isinya nama-nama peubah atau kelompok tersebut.
Ridgeline
Plot alternative lain untuk membandingkan distribusi data adalah plot Ridgeline, yang mirip seperti histogram. Plot ridgeline bisa dijalankan dalam R dengan menggunakan fungsi geom_density_ridges dari package ggridges. Isi argumenya mirip seperti pada saat pembuatan plot boxplot.
data_house%>%
filter(city %in% c("Shoreline","Seattle"
,"Auburn","Duvall","Burien",
"Tukwila","Vashon","Yarrow Point",
"SeaTac","Medina")
)%>%
ggplot() +
geom_density_ridges(aes(y = city,x = price,fill=city), show.legend = F) +
ggtitle("Sebaran Harga Rumah Setiap Kota") +
ylab("Kota") +
xlab("Harga Rumah") +
theme(plot.title = element_text(hjust = 0.5))+
theme_bw()## Picking joint bandwidth of 133000
***
Plot plot untuk
VISUALISASI JUMLAH
Bar Plot
Dalam package ggplot2 bar plot ini bisa ditampilkan menggunakan geom_bar atau geom_col. Perbedaan mendasar dari kedua fungsi itu adalah data yang perlu disediakan.
Fungsi geom_bar hanya membutuhkan satu kolom saja (dengan tipe data character atau factor), sedangkan geom_col membutuhkan dua kolom data yaitu nama kategori dan jumlah setiap kategori.
data_house%>%count(city)%>%
ggplot()+
geom_col(aes(x=fct_reorder(as.factor(city),n),y=n), fill="steelblue",
width=0.4) +
scale_y_continuous(expand = c(0,0))+
coord_flip() +
ggtitle("Jumlah Rumah Setiap Kota") +
xlab("") +
ylab("Jumlah Rumah") +
theme(plot.title = element_text(hjust = 0.5))+
theme_classic() *
fct_reorder : untuk mengurutkan kategori berdasarkan nilai tertentu.
scale_y_continuous(expand = c(0,0))digunakan agar barplot dimulai dari nol.Fungsi
coord_flip: untuk menukar sumbu x dan sumbu y.
Lolipop Chart
Plot alternative dari bar chart adalah lolipop chart. Seperti namanya plot ini terinspirasi dari permen lolipop. Untuk membuat plot ini dibutuhkan dua fungsi yaitu geom_segment dan juga geom_point.
Fungsi geom_segment digunakan untuk menggambarkan garis sedangkan fungsi geom_point digunakan untuk menggambarkan titik.
data_house%>%count(city)%>%
mutate(city=fct_reorder(as.factor(city),desc(n)))%>%
ggplot()+
geom_segment(aes(x=city,xend=city, y=0, yend=n), color="skyblue")+
geom_point(aes(x=city,y=n),color="steelblue", size=2)+
scale_y_continuous(expand = c(0,0))+
coord_flip() +
ggtitle("Jumlah Rumah Setiap Kota") +
xlab("") +
ylab("Jumlah Rumah") +
theme(plot.title = element_text(hjust = 0.5)) > Plot untuk Visualisasi Korelasi
Scatter Plot Korelasi atau hubungan dari dua peubah bisa kita visualisasikan menggunakan scatterplot. Jika scatterplot membentuk pola garis maka bisa dikatakan bahwa kedua peubah tersebut memiliki korelasi yang kuat.
ggplot(data_house) +
geom_point(aes(x = sqft_living,y = price),color="steelblue",size=2) +
ggtitle("Scatter Plot Harga Rumah vs Luas Rumah") +
ylab("Luas Rumah") +
xlab("Harga Rumah") +
theme(plot.title = element_text(hjust = 0.5)) ***
Correlogram
Penggunaan scatterplot memiliki keterbatasan jika korelasi peubah yang ingin dilihat ada banyak. Coreelogram bisa digunakan untuk mengatasi hal tersebut. Correlogram ini membuat grafik berdasarkan nilai koefisien korelasi yang dikonverssikan dalam bentuk warna
## Warning in ggcorr(data_house, method = c("everything", "pearson"), geom =
## "tile"): data in column(s) 'date', 'street', 'city', 'statezip', 'country' are
## not numeric and were ignored
Plot Interaktif
Untuk membuat plot interaktif dari ggplot2 kita bisa menggunakan fungsi ggplotly yang berasal dari package plotly.
Pertemuan 5 : Pembangkitan Bilangan Acak
Runif() : Membangkitkan bilangan acak
x <- rnorm(10) # x~N(0,1)
x1 <- rnorm(10,3,2) # x1~N(mu=2,sd=3)
x2 <- rbinom(10,1,0.4) # x2~bernoulli(0.4)
x3 <- rbinom(10,5,0.4) # x3~binomial (n=5, p=0.4)Punif() : Peluang kumulatif peubah acak
p1 <- pnorm(1.645) #P(Z<1.645)=0.95
p2 <- pnorm(1.96) #P(Z<1.96)=0.975
p3 <- pnorm(-1.96)
#sebaran f
p4 <- pf(15,df1=10,df2=15)
p4## [1] 0.9999955
Qunif() : Mencari nilai kuantil dari peluang peubah acak
Dunif() : Mencari nilai density peubah acak (titik sumbu y)
Pembangkitan Bilangan Acak
Pembangkitan bilangan acak dapat dilakukan dengan 3 cara yaitu 1. Invers Transform Method 2. Acceptance-Rejection Method 3. Direct Transformation
Invers Transform Method
Fungsi sebaran kumulatif, nilainya 0 sampai 1. Kita bisa dekati dengan sebaran seragam (0,1) karena sebarannya sama.
Kelebihan Bisa diaplikasikan terhadap berbagai sebaran (kontinu dan diskret).
Kesulitan : memperoleh kebalikan dari fungsi sebaran kumulatif.
Algoritma
- Tentukan fsk F(x) dari sebaran yang diinginkan
- Tentukan invers F(x)
- Bangkitkan U~Uniform(0,1)
- Transformasi X= invers F(u)
Latihan 1
Bangkitkan bilangan acak yang berdistribusi eksponensial(3) dengan Inverse Transform Method, yang amatannya berjumlah
1000. Bandingkan hasilnya dengan fungsi bawaan R rexp dengan menggunakan histogram.
#Eksponensial (lambda=3)
eks <- function(n, lambda){
U <- runif(n)
X <- -log(1-U)/lambda
return(X)
}
#invers transform method
yy1 <- eks(1000,3)
#fungsi bawaan R
yy2 <- rexp(1000,rate=3)
par(mfrow=c(1,2))
hist(yy1, main="Exp dari Inverse Transform")
hist(yy2, main="Exp dari Fungsi Rexp")Agar hasilnya selalu sama setiap menjalankan program, bisa menambahkan fungsi set.seed(). Contoh set.seed(10)
Acceptance-Rejection Method
Membangkitkan (x,y) di daerah tersebut.
Kriteria :
Terima x jika (x,y) di dalam daerah kurva
Tolak x jika (x,y) di luar daerah kurva
Algoritma
- Bangkitkan x~U(x0,x1)
- Tentukan c sehingga f(x) <= c untuk x0 < x < x1
- Bangkitkan y1 ~ U(0,c)
- Tentukan y2 = f(x)
- Jika y1 <= y2, terima x
Contoh 1
ar <- function(n,x0,x1,f){
xx <- seq(x0,x1,length=10000)
c <- max(f(xx))
terima <- 0; iterasi <- 0
hasil <- numeric(n)
while(terima<n){
x <- runif(1,x0,x1)
y1 <- runif(1,0,c)
y2 <- f(x)
if(y1<=y2){
terima <- terima +1
hasil[terima] <- x
}
iterasi <- iterasi + 1
}
list(hasil=hasil, iterasi=iterasi)
}
set.seed(10)
f <- function(x) {3*x^2}
yyy <- ar(100,0,1,f)
yyy## $hasil
## [1] 0.8647212 0.7751099 0.8382877 0.7707715 0.5355970 0.8613824 0.2036477
## [8] 0.7979930 0.7438394 0.3443435 0.9837322 0.6935082 0.6331153 0.8880315
## [15] 0.7690405 0.6483695 0.8795432 0.9360689 0.7233519 0.7620444 0.9868082
## [22] 0.8760261 0.7240640 0.8140516 0.5588949 0.8900940 0.7456896 0.8480646
## [29] 0.8703302 0.8223331 0.8508123 0.7709219 0.8953595 0.5803863 0.5982260
## [36] 0.9235285 0.7367755 0.6898170 0.8301572 0.9293209 0.9095163 0.5347576
## [43] 0.3478601 0.8759762 0.7286815 0.8749293 0.6988356 0.8312562 0.5572238
## [50] 0.6647687 0.7400502 0.9806898 0.3800746 0.7553169 0.5184889 0.8879149
## [57] 0.9177773 0.8084086 0.8537441 0.4232184 0.7604306 0.3405763 0.3886568
## [64] 0.4774175 0.5387605 0.9485434 0.7124685 0.9081691 0.9457656 0.7716899
## [71] 0.6946655 0.5368832 0.8481593 0.8242752 0.5123742 0.3152032 0.9924487
## [78] 0.9327120 0.9892809 0.6283590 0.5254605 0.8810815 0.5291748 0.5765517
## [85] 0.7231807 0.8761180 0.3995670 0.8986123 0.9335217 0.7859216 0.7784128
## [92] 0.6955333 0.9060413 0.9916424 0.4729846 0.9770567 0.9386110 0.9959093
## [99] 0.8543663 0.8309547
##
## $iterasi
## [1] 322
par(mfrow=c(1,1))
hist(yyy$hasil, main="f(x)=3*x^2", prob=T)
x <- seq (0,1,0.01)
lines(x,f(x), lwd=2, col=4)Contoh 2
Bangkitkan peubah acak X ~ Beta(2,2) yang memiliki fungsi PDF f(x)=6x(1−x),0<x<1 dengan menggunakan Acceptance-Rejection Method sebanyak 1000 amatan. Kemudian gambarkan histrogramnya!
Dalam Kasus ini kita pilih Y∼U(0,1) karena memiliki domain yang sama dengan peubah acak X yaitu 0<x<1.
Pdf dari Y adalah g(y)=1,0≤y≤1
# banyaknya amatan
n=1000
set.seed(10)
y = runif(n,0,1)
#Bangkitkan U ~ uniform(0,1)
set.seed(30)
u = runif(n,0,1)
#Mencari nilai c dengan fungsi optimize di R
h <- function(y) 6*y*(1-y)
derivH <- optimize(f=h,interval=c(0,1),maximum=T)
derivH$objective## [1] 1.5
#Kriteria
f <- function(y) 6*y*(1-y)
g <- function(y) 1
nilaic <- derivH$objective
#kriteria penerimaan
criteria <- u < f(y)/(nilaic*g(y))
head(criteria)## [1] TRUE TRUE TRUE TRUE TRUE TRUE
## [1] 0.50747820 0.30676851 0.42690767 0.69310208 0.08513597 0.22543662
## [1] 668
#Perbandingan histogram di R
z <- rbeta(n,shape1 = 2,shape2 = 2)
par(mfrow=c(1,2))
hist(x,main="beta(2,2) dari AR")
hist(z,main="beta(2,2) dari rbeta")Contoh 3
Bangkitkan peubah acak X∼Gamma(32,1) yang memiliki fungsi PDF f(x)=1Γ(32)x12e−x,0<x<∞ dengan menggunakan Acceptance-Rejection Method sebanyak 1000 amatan. Kemudian gambarkan histrogramnya!
Dalam Kasus ini kita pilih Y∼exponential(3/2) karena memiliki domain yang sama dengan peubah acak X yaitu 0<x<∞ dan karena distribusi exponensial merupakan kasus khusus dari distribusi gamma. Pdf dari Y adalah g(y)=132e−y32,0≤y≤∞ atau g(y)=23e−23y,0≤y≤∞
# banyaknya amatan
n=1500
set.seed(10)
y = rexp(n,rate = 2/3)
set.seed(30)
u = runif(n,0,1)
#menghitung nilai c
h <- function(y) (-1) * (3/(2*gamma(3/2))) * (y)^(1/2) * exp(-y/3)
derivH <- optim(par = 0,fn=h,lower = 0,method = "L-BFGS-B")
derivH$value## [1] -1.257317
#kriteria
f <- function(y) (3/(2*gamma(3/2))) * (y)^(1/2) * exp(-y)
g <- function(y) (2/3) * exp(-(2/3) * y)
nilaic <- -derivH$value #jangan lupa tambahkan negatif
#kriteria penerimaan
criteria <- u < f(y)/(nilaic*g(y))
head(criteria)## [1] TRUE TRUE TRUE TRUE TRUE TRUE
## [1] 0.02243461 1.38033181 1.12823841 2.36256278 0.34748792 1.63000950
## [1] 1393
#karena >1000 ambil 1000 saja
x <- x[1:1000]
#menampilkan histogram di R
z <- rgamma(n,shape = 3/2,scale = 1)
par(mfrow=c(1,2))
hist(x,main="gamma(3/2,1) dari AR")
hist(z,main="beta(3/2,1) dari rgamma")Direct Transformation
Memanfaatkan beberapa fungsi transformasi dari berbagai sebaran yang ada. Harus mengetahui hubungan dari sebaran, misal : bernoulli dan binomial, eksponensial dan gamma, gamma dengan chi-square, dsb
Contoh 1
set.seed(123)
x1 <- runif(25,10,25)
x2 <- runif(25,90,200)
Y <- 10 + 2.3*x1 + 0.7*x2 + rnorm(25,0,9)
model1 <- lm(Y~x1)
summary(model1)##
## Call:
## lm(formula = Y ~ x1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -29.991 -17.738 -2.632 17.896 33.171
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 131.846 19.741 6.679 8.18e-07 ***
## x1 1.049 1.015 1.033 0.312
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 22.42 on 23 degrees of freedom
## Multiple R-squared: 0.04433, Adjusted R-squared: 0.002775
## F-statistic: 1.067 on 1 and 23 DF, p-value: 0.3124
##
## Call:
## lm(formula = Y ~ x2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -31.804 -4.850 -1.606 10.011 20.569
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 70.83913 13.86879 5.108 3.57e-05 ***
## x2 0.58213 0.09767 5.960 4.46e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 14.38 on 23 degrees of freedom
## Multiple R-squared: 0.607, Adjusted R-squared: 0.5899
## F-statistic: 35.52 on 1 and 23 DF, p-value: 4.464e-06
##
## Call:
## lm(formula = Y ~ x1 + x2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -14.8291 -4.5994 -0.4576 5.0602 20.5307
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.62881 13.40229 -0.047 0.963
## x1 2.72951 0.40701 6.706 9.67e-07 ***
## x2 0.72459 0.06105 11.869 4.91e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.427 on 22 degrees of freedom
## Multiple R-squared: 0.8709, Adjusted R-squared: 0.8592
## F-statistic: 74.21 on 2 and 22 DF, p-value: 1.66e-10
##
## Call:
## lm(formula = Y ~ x1:x2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -20.929 -7.009 -1.430 2.856 37.374
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 80.645221 10.481428 7.694 8.32e-08 ***
## x1:x2 0.027491 0.003929 6.997 3.94e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 12.97 on 23 degrees of freedom
## Multiple R-squared: 0.6804, Adjusted R-squared: 0.6665
## F-statistic: 48.96 on 1 and 23 DF, p-value: 3.942e-07
##
## Call:
## lm(formula = Y ~ x1 * x2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -14.4425 -4.5808 -0.6702 4.6431 20.2409
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 11.625896 37.941991 0.306 0.7623
## x1 2.063573 1.967526 1.049 0.3062
## x2 0.635870 0.263687 2.411 0.0251 *
## x1:x2 0.004905 0.014165 0.346 0.7326
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8.6 on 21 degrees of freedom
## Multiple R-squared: 0.8716, Adjusted R-squared: 0.8533
## F-statistic: 47.53 on 3 and 21 DF, p-value: 1.548e-09
R2 <- matrix(c(summary(model1)$r.squared,
summary(model1)$adj.r.squared,
summary(model2)$r.squared,
summary(model2)$adj.r.squared,
summary(model3)$r.squared,
summary(model3)$adj.r.squared,
summary(model4)$r.squared,
summary(model4)$adj.r.squared,
summary(model5)$r.squared,
summary(model5)$adj.r.squared), 5, byrow=T)
colnames(R2) <- c("R2", "R2.adj"); R2*100## R2 R2.adj
## [1,] 4.432592 0.2774876
## [2,] 60.699195 58.9904640
## [3,] 87.090357 85.9167529
## [4,] 68.036265 66.6465370
## [5,] 87.163648 85.3298839
## (Intercept) x1 x2
## -0.6288095 2.7295126 0.7245911
## 2.5 % 97.5 %
## (Intercept) -28.4234482 27.1658292
## x1 1.8854322 3.5735929
## x2 0.5979779 0.8512044
## 2.5 % 97.5 %
## (Intercept) -0.6288095 -28.4234482 27.1658292
## x1 2.7295126 1.8854322 3.5735929
## x2 0.7245911 0.5979779 0.8512044
## Analysis of Variance Table
##
## Response: Y
## Df Sum Sq Mean Sq F value Pr(>F)
## x1 1 536.4 536.4 7.5538 0.01173 *
## x2 1 10002.4 10002.4 140.8614 4.911e-11 ***
## Residuals 22 1562.2 71.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Contoh 2
Bangkitkan peubah acak X∼t(2) sebanyak 1000 amatan yang didapatkan dari hasil transformasi langsung peubah acak Y∼χ2(2) dan Z∼N(0,1). Buatlah histogramnya dan bandingkan hasilnya dengan hasil bangkitan yang diperoleh dari fungsi rt.
# Membangkitkan distribusi t(2)
#banyaknya amatan
n <- 1000
set.seed(15)
z <- rnorm(n,mean = 0,sd = 1)
y <- rchisq(n,df = 2)
x <- z/sqrt(y/2)
head(x)## [1] 0.4249926 2.2981978 -0.3956900 0.8938340 0.9930945 -1.4325087
#menampilkan histogram di R
set.seed(5)
v <- rt(n,df=2)
par(mfrow=c(1,2))
hist(x,main="t(2) dari Direct")
hist(v,main="t(2) dari rt")Bil Acak untuk Regresi Linear
- Bangkitkan residual berdasarkan distribusi normal
ϵ∼N(0,σ)
Bangkitkan peubah penjelas Xi yang saling bebas.
Bangkitkan peubah respon Y dengan menggunakan model regresi
Contoh 1
Bangkitkan peubah Y,X1,X2 dan X3 berdasarkan model regresi linear berganda berikut ini:
Y=10+3X1+5X2+7X3+ϵ
dengan mengasumsikan bahwa ϵ N(0,1). Banyaknya amatan yang dibangkitkan adalah 1000
#bangkitkan residual berdistribusi normal
#banyaknya amatan
n <- 1000
set.seed(12)
epsilon <- rnorm(n,mean = 0,sd = 1)
#bangkitkan peubah penjelas Xi yang saling bebas
set.seed(10)
X <- replicate(3,rnorm(n,mean=0,sd=1.5))
head(X)## [,1] [,2] [,3]
## [1,] 0.02811926 1.5750205 -0.46179747
## [2,] -0.27637881 0.4291389 1.13712837
## [3,] -2.05699582 0.3608472 -0.86079512
## [4,] -0.89875157 1.2490578 -1.40811669
## [5,] 0.44181769 -0.3344748 -0.04154899
## [6,] 0.58469145 0.4325163 -1.59937298
#bangkitkan peubah Y dengan menggunakan model regresi
betas <- matrix(c(10,3,5,7),nrow = 4,ncol = 1)
Xgab <- cbind(1,X)
Y <- Xgab%*%betas+epsilon
dataRegresi <- data.frame(Y,X)
colnames(dataRegresi) <- c("Y","X1","X2","X3")
head(dataRegresi)## Y X1 X2 X3
## 1 13.246310 0.02811926 1.5750205 -0.46179747
## 2 20.853626 -0.27637881 0.4291389 1.13712837
## 3 -1.349062 -2.05699582 0.3608472 -0.86079512
## 4 2.772212 -0.89875157 1.2490578 -1.40811669
## 5 7.364594 0.44181769 -0.3344748 -0.04154899
## 6 2.448749 0.58469145 0.4325163 -1.59937298
##
## Call:
## lm(formula = Y ~ ., data = dataRegresi)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.0364 -0.6052 -0.0207 0.6087 3.1774
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.97484 0.03033 328.8 <2e-16 ***
## X1 2.97225 0.02042 145.6 <2e-16 ***
## X2 4.97282 0.01939 256.5 <2e-16 ***
## X3 7.00493 0.01989 352.2 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9589 on 996 degrees of freedom
## Multiple R-squared: 0.9955, Adjusted R-squared: 0.9954
## F-statistic: 7.275e+04 on 3 and 996 DF, p-value: < 2.2e-16
Contoh 2
Berdasarkan contoh sebelumnya lakukan pengulangan sebanyak 100 ulangan dan kemudian hitung rata-rata dan simpangan baku dari masing-masing koefisien regresi.
#banyaknya amatan
n <- 1000
ulangan <- 100
# membuat tempat penyimpanan
# koefisien tiap ulangan
koefisien_ulangan <- NULL
set.seed(13)
for(i in seq(ulangan)){
epsilon <- rnorm(n,mean = 0,sd = 1)
X <- replicate(3,rnorm(n,mean=0,sd=1.5))
Xgab <- cbind(1,X)
Y <- Xgab%*%betas+epsilon
dataRegresi <- data.frame(Y,X)
colnames(dataRegresi) <- c("Y","X1","X2","X3")
modelRegresi <- lm(Y~.,data = dataRegresi)
# rbind digunakan untuk menggabungkan baris
koefisien_ulangan <- rbind(koefisien_ulangan,coef(modelRegresi))
}
head(koefisien_ulangan)## (Intercept) X1 X2 X3
## [1,] 9.998451 2.997131 4.961536 7.019022
## [2,] 9.999899 2.981410 5.012151 6.977783
## [3,] 9.971732 2.986735 4.992031 7.019945
## [4,] 9.940730 3.013790 5.006416 7.003125
## [5,] 10.029303 3.033154 5.009336 6.972909
## [6,] 10.008416 3.019092 5.010800 6.999371
## (Intercept) X1 X2 X3
## 9.997236 3.002950 5.000115 7.001103
## (Intercept) X1 X2 X3
## 0.02972359 0.01960207 0.01923794 0.02379381