Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Week 8 CLustering
- **Soal K-means**
- ============================================================================
- SOAL 1
- ---
- a. Kopi data *iris* dari package **datasets** ke dalam data frame dengan nama *dat*.
- b. Lakukan eksplorasi data dengan menampilkan struktur data.
- c. Tampilkan 5 baris pertama data frame.
- d. Tampilkan summary statistics.
- e. Buatlah boxplot Petal.Width untuk semua Species. Teruskan untuk 3 variabel numerik berikutnya.
- f. Pada boxplot manakah spesies tampak terpisah ke dalam klaster yang jelas?
- g. Buatlah scatter plot variabel Sepal.Length vs Sepal.Width dan scatter plot Petal.Length vs Petal.Width. Gunakan warna yang berbeda untuk msing-masing species pada kedua scatter plot tersebut.
- h. Pada scatter plot manakah pengelompokan spesies terlihat dengan jelas?
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #a---------
- dat <- (iris)
- # dat <- dat[,-5]
- #b-----------
- str(dat)
- #c------
- head(dat)
- #d----
- summary(dat)
- #pairs(dat)
- #e----
- par(mfrow = c(1,2))
- boxplot(Sepal.Length ~ Species, data=dat, xlab="Species", ylab="Sepal.Length")
- boxplot(Petal.Length ~ Species, data=dat, xlab="Species", ylab="Petal.Length")
- par(mfrow = c(1,2))
- boxplot(Sepal.Width ~ Species, data=dat, xlab="Species", ylab="Sepal.Width")
- boxplot(Petal.Width ~ Species, data=dat, xlab="Species", ylab="Petal.Width")
- par(mfrow = c(1,1))
- #f----
- # semua boxplot kecuali Sepal.Width dan Sepal.Length
- #g----
- par(mfrow = c(1,2))
- plot(dat$Sepal.Width, dat$Sepal.Length, col = dat$Species)
- plot(dat$Petal.Width, dat$Petal.Length, col = dat$Species)
- par(mfrow = c(1,1))
- #h----
- # scatter plot Petal.Length vs Petal.Width
- ```
- SOAL 2
- ---
- a. Gunakan NIM anda sebagai seed untuk fungsi *set.seed()*.
- b. Gunakan fungsi **stats::kmeans** untuk menerapkan algoritma kmeans dengan 3 klaster dan nstart = 25. Save output dengan nama *output*.
- b. Tampilkan komponen obyek kmeans dengan fungsi *names()*.
- c. Gambarkan scatter plot Petal.Width vs Petal.Length. Gunakan warna yang berbeda untuk masing-masing species hasil klastering. Tampilkan center cluster pada gambar tersebut dengan menggunakan simbol yang berbeda dan warna yang sesuai dengan species.
- d. Ulangi bagian c untuk scatter plot Sepal.Width vs Sepal.Length.
- e. Buatlah confusion matrix untuk membandingkan prediksi klaster dan klaster riilnya.
- f. Algoritma k-means memerlukan input klaster $k$. Berapa jumlah klaster optimum menurut elbow plot di bawah ini? Klaster optimum adalah angka $k$ di mana nilai **total within sum of square** mengalami penurunan drastis lalu melandai. Perlambatan penurunan total within sum of square ini menunjukkan penambahan jumlah klaster tidak banyak membantu mengurangi error.
- g. Jumlah klaster optimum dapat juga ditentukan dari angka $k$ yang memberikan nilai **average silhoutte width** tertinggi. Gunakan fungsi **factoextra::fviz_nbclust()** dari package **factoextra**.
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #a---------
- NIM <- 1234
- set.seed(NIM)
- output <- kmeans(dat[,-5], centers = 3)
- output
- #b-----------
- plot(dat[c("Petal.Length", "Petal.Width")], col = output$cluster)
- points(output$centers[,c("Petal.Length","Petal.Width")], col=1:3, pch=8, cex=2)
- #c-----------
- plot(dat[c("Sepal.Length", "Sepal.Width")], col = output$cluster)
- points(output$centers[,c("Sepal.Length","Sepal.Width")], col=1:3, pch=8, cex=2)
- #e-----
- (tab <- table(dat$Species, output$cluster))
- #f----
- ### Use map_dbl to run many models with varying value of k (centers)
- tot_withinss <- purrr::map_dbl(1:10, function(k){
- model <- kmeans(x = dat[,-5], centers = k)
- model$tot.withinss
- })
- ### Generate a data frame containing both k and tot_withinss
- elbow_df <- data.frame(
- k = 1:10,
- tot_withinss <- tot_withinss
- )
- # plot(elbow_df$k, elbow_df$tot_withinss, type = "b", main = "Jumlah klaster optimal")
- library(ggplot2)
- ggplot2::ggplot(elbow_df, aes(k, tot_withinss)) + geom_line() + scale_x_continuous(breaks = 1:10)
- # k = 3
- #g----
- library(factoextra)
- factoextra::fviz_nbclust(dat[,-5], kmeans, method = "silhouette")
- #k = 2 menurut metode average silhouette.
- ```
- **Soal Hierarchical**
- ============================================================================
- Disini kita belajar analisis cluster hierarchy menggunakan R
- Packages: factoextra
- Library:factoextra
- Data:Women dataset in R
- SOAL 3
- ---
- a show 6 baris pertama dari women dataset
- catatan:
- Perhatikan ada dua kolom yaitu kolom height (tinggi badan) dan kolom weight (berat badan). Apakah data bisa langsung dibandingkan? Tidak bisa, karena berbeda satuan, tinggi badan dalam inch dan berat badan dalam lbs.
- Supaya bisa dibandingkan, kita membuat skala dalam R digunakan fungsi scale() gunanya untuk mendapatkan jarak yang seimbang antara dua dimensi atau lebih dengan beda satuan.
- b. gunakan fungsi scale() untuk membat skala. show 6 baris pertama hasil skala
- c. hitung jarak eucledian dari df.
- Disini kita gunakan fungsi dist() hasilnya disimpan dalam variabel women.dist.
- Tampikan hasil matrix 3x3
- Berapa jarak wanita kedua dan ketiga? Jawab: .............
- Berapa jarak wanita kedua dan kedua? Jawab: ............. karena ....................
- d. Buatlah Hierarchy Clustering dengan metode jarak single, average, complete dan centroid.
- e. Tampilkan dendrodramnya masing-masing.
- Bandingkan dendrodram tsb. Method mana yang berbeda sendiri? Jawab: single
- Kesimpulan bisa ditarik dari kesamaan hasil beberapa method yang sama.
- Kesimpulan, kalau dibagi menjaid 2 klaster, apa hasilnya?
- Jawab: Bila kita membagi data women menjadi 2 cluster, maka
- - Cluster pertama={11,12,13,14,15}
- - Cluster kedua ={1,2,3,â¦10}
- f. Buatlah Hierarchy Clustering dengan metode jarak Ward, mc Quitty, dan median.
- g. Tampilkan dendrodramnya masing-masing.
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #a--------------
- head(women, nrow = 6) # Show 6 rows pertama data wanita di US
- #b-------------
- df <- scale(women) # skala data
- head(df, nrow = 6) # Show 6 rows pertama hasil skala
- #c--------------
- women.dist <- dist(df, method = "euclidean") # menghitung jarak
- as.matrix(women.dist)[1:3, 1:3] # menampilkan matrix
- #d--------------
- #install.packages("factoextra")
- library("factoextra") #gunakan library factoextra
- women.single <- hclust(d = women.dist, method = "single")
- women.average <- hclust(d = women.dist, method = "average")
- women.complete <- hclust(d = women.dist, method = "complete")
- women.centroid <- hclust(d = women.dist, method = "centroid")
- #e--------------
- par(mfrow = c(2,1))
- fviz_dend(women.single, cex = 0.5) #membuat dendodram
- fviz_dend(women.average, cex = 0.5) #membuat dendodram
- fviz_dend(women.complete, cex = 0.5) #membuat dendodram
- fviz_dend(women.centroid, cex = 0.5) #membuat dendodram
- #f--------------
- women.ward <- hclust(d = women.dist, method = "ward.D2")
- women.mcquitty <- hclust(d = women.dist, method = "mcquitty")
- women.median <- hclust(d = women.dist, method = "median")
- #g--------------
- par(mfrow = c(2,1))
- fviz_dend(women.ward, cex = 0.5) #membuat dendodram
- fviz_dend(women.mcquitty, cex = 0.5) #membuat dendodram
- fviz_dend(women.median, cex = 0.5) #membuat dendodram
- ```
- Week 9 Clustering
- **Soal K-means**
- ============================================================================
- SOAL 1
- ---
- Data: w9customers.csv
- Package yang digunakan:
- *BbClust
- * factoextra
- * ggplot2
- * purrr
- a. Baca data **w9customers.csv** dan save dengan nama obyek **dat**.
- b. Tampilkan struktur data dan 5 baris pertama data frame.
- c. Tampilkan summary statistics untuk setiap variabel kecuali CustomersID.
- d. Buatlah density plot untuk variabel Age, AnnualIncome dan Spending Score. Apakah ada perbedaan Age, AnnualIncome dan SpendingScore pada Gender yang berbeda?
- e. Lakukan scale pada data bila diperlukan. Hitunglah banyaknya klaster optimum dengan menggunakan metode Elbow dan Average Silhouette. Gunakan fungsi factoextra::fviz_nbclust dari package factoextra untuk Average Silhouette.
- f. Set seed dengan NIM anda. Lakukan kmeans dengan center sesuai dengan hasil perhitungan klaster optimum.
- g. Gambarkan cluster yang terbentuk dengan menggunakan warna yang berbeda. Gunakan AnnualIncome sebagai sumbu X dan SpendingScore sebagai sumbu Y.
- h. Jelaskan karakteristik klaster yang terbentuk. Hint: gunakan variabel AnnualIncome, SpendingScore.
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #a---------
- dat <- read.csv(file.choose())
- #b----
- str(dat)
- head(dat,5)
- #c----
- summary(dat[,-1])
- #d----
- plot(density(dat$Age))
- plot(density(dat$AnnualIncomeThou))
- plot(density(dat$SpendingScore))
- boxplot(Age ~ Gender, data = dat)
- boxplot(AnnualIncomeThou ~ Gender, data = dat)
- boxplot(SpendingScore ~ Gender, data = dat)
- #Tidak ada perbedaan Age, AnnualIncome dan SpendingScore pada Gender
- #e----
- scaled_dat <- scale(dat[,3:5], scale = TRUE)
- #Elbow method
- ### Use map_dbl to run many models with varying value of k (centers)
- tot_withinss <- purrr::map_dbl(1:10, function(k){
- # model <- kmeans(x = scaled_dat, centers = k)
- model <- kmeans(x = dat[,3:5], centers = k)
- model$tot.withinss
- })
- ### Generate a data frame containing both k and tot_withinss
- elbow_df <- data.frame(
- k = 1:10,
- tot_withinss <- tot_withinss
- )
- # plot(elbow_df$k, elbow_df$tot_withinss, type = "b", main = "Jumlah klaster optimal")
- library(ggplot2)
- ggplot2::ggplot(elbow_df, aes(k, tot_withinss)) + geom_line() + scale_x_continuous(breaks = 1:10)
- #k = 6 menurut elbow method
- library(factoextra)
- factoextra::fviz_nbclust(dat[,3:5], kmeans, method = "silhouette")
- factoextra::fviz_nbclust(scaled_dat, kmeans, method = "silhouette")
- # k = 6 untuk unscaled data
- # k = 8 untuk scaled data
- #f kmeans---------
- NIM <- 1234
- set.seed(NIM)
- k6 <- kmeans(dat[,3:5], centers = 6, nstart = 25)
- k6
- k8 <- kmeans(scaled_dat, centers = 8, nstart = 25)
- k8
- #g------
- ggplot(dat, aes(x =AnnualIncomeThou, y = SpendingScore)) +
- geom_point(stat = "identity", aes(color = as.factor(k6$cluster))) +
- scale_color_discrete(name=" ",
- breaks=c("1", "2", "3", "4", "5","6"),
- labels=c("Cluster 1", "Cluster 2", "Cluster 3", "Cluster 4", "Cluster 5","Cluster 6")) +
- ggtitle("Segmentasi Pengunjung", subtitle = "K-means")
- ggplot(as.data.frame(scaled_dat), aes(x =AnnualIncomeThou, y = SpendingScore)) +
- geom_point(stat = "identity", aes(color = as.factor(k8$cluster))) +
- scale_color_discrete(name=" ",
- breaks=c("1", "2", "3", "4", "5","6", "7","8"),
- labels=c("Cluster 1", "Cluster 2", "Cluster 3", "Cluster 4", "Cluster 5","Cluster 6", "Cluster 7", "Cluster 8")) +
- ggtitle("Segmentasi Pengunjung", subtitle = "K-means")
- #h----
- #Klaster 4 dan 6: medium income, medium spending
- #Klaster 1: high income, high spending
- #Klaster 3: low income, low spending
- #Klaster 2: high income, low spending
- #Klaster 5: low income, high spending
- ```
- **Soal Hierarchical**
- ============================================================================
- Disini kita belajar analisis cluster hierarchy menggunakan R
- Packages: factoextra
- Library:factoextra
- Data:Women dataset in R
- SOAL 2
- ---
- a ambil data iris pada kolom ketiga namakan mydata
- b. Buat dan bandingkan HC dari mydata dengan metode jarak ward dan complete dan buat denderodramnya. Untuk metode complete tandai cluster untuk k=3
- c. Buat HC dendrodram top-down dan bottop-up dengan method ward dari mydata di atas.
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #a-----------------
- mydata=iris[3]
- summary(mydata)
- #b-----------------
- d1 <- dist(mydata, method = "euclidean")
- res.d1 <- hclust(d, method = "single", )
- d2 <- dist(mydata, method = "euclidean")
- res.d2 <- hclust(d2, method = "complete", )
- # Plot the obtained dendrogram
- par(mfrow=c(1,2))
- plot(res.d1, cex = 0.6, hang = -1)
- plot(res.d2, cex = 0.6, hang = -1)
- groups <-cutree(res.d2, k=3) # cut tree into 3 clusters
- rect.hclust(res.d2, k=3, border="red")
- #c--------------------------------
- # ------------------------Model AGNES (bottom-up) Agglomerative Nesting (Hierarchical Clustering)
- library("cluster")
- res.agnes <- agnes(mydata, method = "ward")
- plot(as.hclust(res.agnes), cex = 0.6, hang = -1)
- # -------------------------MODEL DIANA (top-down) DIvisive ANAlysis Clustering
- # Compute diana()
- res.diana <- diana(mydata)
- plot(as.hclust(res.diana), cex = 0.6, hang = -1)
- ```
- Week 10 Time Series
- **Soal K-means**
- ============================================================================
- SOAL 1 Latihan Dasar Pemeriksaan data
- --------------------------------------------
- tempdub berisi data Average Monthly Temperatures, Dubuque, Iowa
- 1a. Periksa apakah data ini memiliki format time series? Jawab .....Ya
- 1b. Kalau ya, berapa frekuensinya? .....12 bulan
- 1c. Berapa suhu maximum rata-rata di Iowa per bulannya? ..... 74
- 1d. Kapan terjadi suhu minimum rata-rata di Iowa per bulannya? ..... Jan 1970
- 1e. Buat boxplot. Tentukan bulan dengan suhu rata-rata tertinggi .....Juli
- judul="Average Monthly Temperatures", sumbuX=Periode, sumbuY=Suhu.
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #install.packages("forecast")
- library(ggfortify)
- library(tseries)
- library(forecast)
- #1a---------
- class(tempdub)
- #1b--------
- frequency(tempdub)
- #1c---------
- max(tempdub)
- #1d---------
- min(tempdub)
- tempdub
- #1e---------
- win.graph(width=4.875, height=2.5,pointsize=8)
- boxplot(tempdub~cycle(tempdub),xlab="Periode",
- ylab = "Suhu" ,
- main ="Average Monthly Temperatures")
- ```
- Soal 2. Stasioner or Non stasioner
- gunakan librray TSA kemudian
- uji apakah dataset-dataset R ini time series? apakah stationer?
- 2a. color jwb: p-value = 0.5746>0.05 bukan stationary
- 2b. tempdub jwb: p-value = 0.01<0.05 stationary
- 2c. Membuat Model ARIMA dengan nama arima hanya untuk dataset diatas yang stationary saja. Tentukan a) fungsi Y(y1,y2) b) parameter ARIMA
- Jawab: a) Y=-0.5403 y1 -0.3078 y2 + E
- b) ARIMA(0,0,0)(2,1,0)
- 2d. Periksa apakah model arima di atas fit? Jawab: .......fit
- 2e. forecast() dengan 95% confidence interval untuk 1 tahun (12 bulan) kedepan.
- ```{R}
- #2a---------------------------------
- library(TSA)
- win.graph(width=4.875, height=2.5,pointsize=8)
- data(color)
- plot(color,ylab='Color Property',xlab='Batch',type='o')
- adf.test(color)
- #2b---------------------------------
- win.graph(width=4.875, height=2.5,pointsize=8)
- data("tempdub")
- plot(tempdub,ylab='Color Property',xlab='Batch',type='o')
- adf.test(tempdub)
- #2c----------------------------------
- arima <- auto.arima(tempdub)
- arima
- #2d----------------------------------
- install.packages("ggfortify")
- library(ggfortify)
- win.graph(width=4.875, height=2.5,pointsize=8)
- ggtsdiag(arima)
- #2e----------------------------------
- win.graph(width=4.875, height=2.5,pointsize=8)
- forecastAP <- forecast(arima, level = c(95), h = 36)
- autoplot(forecastAP)
- ```
- Soal 3.
- 3a. gunakan dataset larain (Los Angeles Annual Rainfall). Periksa apakah dataset ini stationary?
- 3b. Periksa apakah ada missing value?
- 3c. Plot larain sumbu y='Curah Hujan', sumbu x='Tahun'
- 3d. Bila tidak stasionary, lakukan proses deferensiasi +1
- Uji lagi stationary untuk hasil deferensiasi!
- Apakah sudah stationary? ya
- 3e. Buat model arima dari hasil deferensiasi.periksa apakah model ini fit? ya
- Jawab: model ARIMA(4,0,0).
- 3f. Buat forecast dari model ARIMA kemudian plot!
- ```{R}
- library(TSA)
- library(MASS)
- library(tseries)
- library(forecast)
- adf.test(larain)
- sum(is.na(larain))
- #3c-----------------------
- win.graph(width=4.875, height=2.5,pointsize=8)
- data("larain")
- plot(larain,ylab='Curah Hujan',xlab='Tahun',type='o')
- #3d--------------------------
- diff_larain<-diff(larain,1)
- adf.test(diff_larain)
- #3e--------------------------
- arima_larain<-auto.arima(diff_larain)
- win.graph(width=4.875, height=2.5,pointsize=8)
- ggtsdiag(arima_larain)
- #3f-------------------------
- f_larain<- forecast(arima_larain, h = 11)
- f_larain
- win.graph(width=4.875, height=2.5,pointsize=8)
- plot(f_larain)
- ```
- Week 11 Time Series
- Package yang digunakan:
- * forecast
- * tseries
- * tidyverse
- * nortest
- * ggfortify
- * readr
- Perintah:
- ---
- a. Load semua library yang diperlukan.
- b. Baca file data **BBCA_JK.csv** dengan **readr::read_csv()** dan save dengan nama obyek **dat**.
- c. Tampilkan struktur data, 3 baris pertama data dan 3 baris terakhir data.
- d. Buatlah data frame baru bernama **stock** yang diisi dengan data dari kolom Price dan AdjClose. Namakan kolom-kolom ini **date** dan **price**.
- e. Split data sehingga data sebelum tahun 2018 menjadi training set dan data mulai tahun 2018 menjadi testing set.
- f. Ubahlah data kolom price menjadi tipe time series dari training set data dengan fungsi **stats::ts()** dan save hasilnya dengan nama obyek **train_ts**. Periksalah apakah class obyek yang terbentuk sudah berbentuk time series object.
- g. Lakukan eksplorasi data dengan menampilkan plot data. Beri label "Tahun" pada sumbu X, label "Harga per lembar saham" pada sumbu Y dan judul "Harga Saham BCA/ lembar tahun 2011-2017".
- h. Tampilkan summary data. Lakukan pemeriksaan apakah ada missing value. Lakukan pemeriksaan cycle.
- i. Lakukan pemeriksaan seasonality dengan menggambarkan boxplot untuk setiap bulan. Berikan judul dan label sumbu yang informatif.
- j. Tuliskan kesimpulan dari proses **Exploratory Data Analysis** ini.
- **Jawaban**
- ---
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #a---------
- library(xts)
- library(tseries)
- library(fpp2)
- library(forecast)
- library(readr)
- library(tidyverse)
- library(nortest)
- #b----
- dat <- readr::read_csv(file.choose())
- #c----
- str(dat)
- head(dat, 3)
- tail(dat, 3)
- #d----
- date <- dat[,"Date"]
- price <- round(dat[,"AdjClose"])
- stock <- data.frame(date, price)
- colnames(stock) <- c("date","price")
- str(stock)
- head(stock, 3)
- #e----
- stock_train <- stock %>% filter(date < "2018-01-01")
- stock_train %>% tail(3)
- stock_test <- stock %>% filter(date >= "2018-01-01")
- stock_test %>% head(3)
- #f---
- train_ts <- stats::ts(stock_train[,2], frequency = 12, start = c(2011,1))
- test_ts <- ts(stock_test[,2], frequency = 12, start = c(2018,1))
- class(train_ts)
- str(train_ts)
- train_ts
- #g------
- plot.ts(train_ts, xlab = "Tahun", ylab = "Harga per lembar saham", main = "Harga BBCA.JK 2011-2017")
- #h----
- summary(train_ts)
- xts::periodicity(train_ts)
- stats::cycle(train_ts)
- #i----
- stats::decompose(train_ts) %>% autoplot()
- boxplot(train_ts ~ cycle(train_ts))
- # ggplot(train_ts, aes(as.factor(cycle(train_ts)), train_ts)) + geom_violin()
- # Trend harga naik. Harga terendah pada Januari 2011 yaitu Rp 5080. Mean harga Rp 11226 dan harga tertinggi pada Desember 2018 yaitu Rp 21467.
- # Terdapat seasonality pada data.
- # Harga cenderung rendah pada bulan Januari, naik kemudian turun dan naik menjelang Desember.
- # Kandidat lag u/ seasonality: 12 (krn data berupa data bulanan).
- # Perlu dilakukan differencing agar series menjadi stasioner.
- ```
- **TIME SERIES MODELING SAHAM BBCA.JK DENGAN ARIMA**
- ============================================================================
- Data: BBCA_JK.csv
- Package yang digunakan:
- * forecast
- * tseries
- * tidyverse
- * nortest
- * ggfortify
- Perintah
- ---
- a. Cek apakah series sudah stasioner. Ingat series yang anda gunakan adalah training set (time series object **train_ts**).
- b. Bila series belum stasioner, lakukan langkah-langkah agar series menjadi stasioner.
- c. Carilah model ARIMA yang tepat dari langkah (a) dan (b). Gunakan cara manual (plot, uji hipotesa).
- d. Buatlah forecast untuk 12 bulan ke depan.
- e. Hitung akurasi dengan menggunakan testing set (time series object **test_ts**).
- **Jawaban**
- ---
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #a-----------------
- train_ts %>% adf.test()
- #series tidak stasioner
- #b-----------------
- train_ts %>% ggtsdisplay()
- #PACF signifikan pada lag 1 --> kandidat model AR(1)
- #deseasonalize data
- train_ts %>% diff(lag = 12) %>% autoplot()
- train_ts %>% diff(lag = 12) %>% ggtsdisplay()
- train_ts %>% diff(lag = 12) %>% adf.test()
- #PACF signifikan pada lag 1 --> kandidat AR(1)
- #lakukan differencing untuk menghilangkan trend
- train_ts %>% diff(lag = 12) %>% diff(differences = 1) %>% autoplot()
- train_ts %>% diff(lag = 12) %>% diff(differences = 1) %>% ggtsdisplay()
- train_ts %>% diff(lag = 12) %>% diff(differences = 1) %>% adf.test()
- #series sekarang stasioner
- #c--------------------------------
- fit.train <- train_ts %>% Arima(order = c(0,1,0), seasonal = c(1,0,0))
- #ARIMA(0,1,0)(1,0,0)[12] with drift
- summary(fit.train)
- fit.train %>% checkresiduals()
- #residual tampak seperti white noise, random
- #tidak ada spike pada ACF plot
- fit.train %>% residuals() %>% nortest::ad.test()
- #residual mengikuti distribusi Gaussian
- #d----
- fit.train %>% forecast(h = 12) %>%
- autoplot() + ggtitle(fit.train)
- #e----
- model.test <- Arima(test_ts, model = fit.train)
- model.test %>% forecast::accuracy()
- ```
- **TIME SERIES FORECASTING SEASONAL AND NON SEASONAL DATA**
- ============================================================================
- gunakan paket dan library fpp2 untuk mendapatkan beberapa dataset berikut ini:
- a. marathon: Winning times (in minutes) for the Boston Marathon Menâs Open Division. 1897-2016.
- b. qauselec: Total quarterly gas production in Australia (in petajoules) from 1956:Q1 to 2010:Q2.
- c. usmelec: Electricity net generation measured in billions of kilowatt hours (kWh).
- Instruksi:
- buatlah prediksi 20 periode berikutnya untuk masing-masing dataset di atas.
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #instal.package("fpp2")
- library(fpp2)
- par(mfrow=c(3,2))
- plot.ts(marathon)
- plot.ts(qauselec)
- plot.ts(usmelec)
- #maraton non seasonal
- #qauselec seasonal additif
- #usmelec seasonal multiplikatif
- #------------marathon-------------------------
- plot.ts(marathon) #non seasonal
- library("TTR")
- par(mfrow=c(1,3))
- marathon_SMA6 <- SMA(oil,n=6)
- plot.ts(marathon_SMA6)
- marathon_SMA7 <- SMA(oil,n=7)
- plot.ts(marathon_SMA7)
- marathon_SMA8 <- SMA(oil,n=8)
- plot.ts(marathon_SMA8)
- # dengan menggunakan SMA(n=8) kita mendapatkan trend naik dari 19970 ke 1980
- # kemudian turun dari 1980 ke 1990,selanjutnya trend naik
- # setelah mendapatkan nilai n=8, kita gunakan untuk membuat peramalan kedepan
- par(mfrow=c(1,1))
- plot(forecast(marathon_SMA8,h=20))
- ramalan<-forecast(marathon_SMA8,h=20)
- ramalan
- #------------qauselec--------------------------
- dec_qauselec<-decompose(qauselec)
- plot(dec_qauselec)
- #seasonal adjustment
- qauselec_adj <- qauselec - dec_qauselec$seasonal
- par(mfrow=c(1,1))
- plot.ts(qauselec_adj)
- fore_qauselec_adj<-HoltWinters(qauselec_adj, beta=FALSE, gamma=FALSE)
- fore_qauselec_adj$SSE
- ramalan_qauselec_adj<-forecast(fore_qauselec_adj,h=20)
- plot(ramalan_qauselec_adj)
- ramalan_qauselec_adj
- #------------usmelec--------------------------
- dec_usmelec<-decompose(usmelec)
- plot(dec_usmelec)
- #seasonal adjustment
- usmelec_adj <- usmelec/dec_usmelec$seasonal
- par(mfrow=c(1,1))
- plot.ts(usmelec_adj)
- fore_usmelec_adj<-HoltWinters(usmelec_adj, beta=FALSE, gamma=FALSE)
- fore_usmelec_adj$SSE
- ramalan_usmelec_adj<-forecast(fore_usmelec_adj,h=20)
- plot(ramalan_usmelec_adj)
- ramalan_usmelec_adj
- ```
- Week 12 Text Mining
- **Soal K-means**
- ============================================================================
- SOAL 1 Membandingkan 2 buku
- --------------------------------------------
- a.Buatlah words frequencies analisis (>200words) tentang buku H.G. Wells
- b. buatlah words frequencies analisis (>500words) tentang buku Brontë sisters
- c. Analisis tingkat kemiripan (similarity) antara kedua buku
- Sebutkan/cari:
- c1. satu kata yang sering dipakai dengan jumlah yang kira-kira sama adalah txxx (jwb: time)
- c2. satu kata yang lebih sering dipakai Wells adalah inXXXXXXX (jawab:
- invisible)
- c3. satu nama yang lebih sering dipakai Bronte adalah jxxx (jawab: john)
- c4. korelasi antara keduanya adalah 0.6481132
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- library(gutenbergr) #library
- library(dplyr)
- library(tidytext)
- library(ggplot2)
- library(stringr)
- library(tidyr)
- library(scales)
- #------------A. analisis word freq HG Wells--------------------
- hgwells <- gutenberg_download(c(35, 36, 5230, 159)) #download data
- #-------------ke tidytext format ---------------------
- tidy_hgwells <- hgwells %>%
- unnest_tokens(word, text) %>%
- anti_join(stop_words,by="word")
- #-------------hitung word frequencies-----------------
- tidy_hgwells %>%
- count(word, sort = TRUE)
- #-------------tampilkan grafiknya---------------------
- tidy_hgwells %>%
- count(word, sort = TRUE) %>%
- filter(n > 200) %>%
- mutate(word = reorder(word, n)) %>%
- ggplot(aes(word, n)) +
- geom_col() +
- xlab(NULL) +
- coord_flip()
- #------------B. analisis word freq Bronte--------------------
- bronte <- gutenberg_download(c(1260, 768, 969, 9182, 767)) #download data
- #-------------ke tidytext format ---------------------
- tidy_bronte <- bronte %>%
- unnest_tokens(word, text) %>%
- anti_join(stop_words,by="word")
- #-------------hitung word frequencies-----------------
- tidy_bronte %>%
- count(word, sort = TRUE)
- #-------------tampilkan grafiknya---------------------
- tidy_bronte %>%
- count(word, sort = TRUE) %>%
- filter(n > 500) %>%
- mutate(word = reorder(word, n)) %>%
- ggplot(aes(word, n)) +
- geom_col() +
- xlab(NULL) +
- coord_flip()
- #------------c perbandingan
- frequency <- bind_rows(mutate(tidy_bronte, author = "Brontë Sisters"),
- mutate(tidy_hgwells, author = "H.G. Wells")) %>%
- mutate(word = str_extract(word, "[a-z']+")) %>%
- count(author, word) %>%
- group_by(author) %>%
- mutate(proportion = n / sum(n)) %>%
- select(-n) %>%
- spread(author, proportion) %>%
- gather(author, proportion, `Brontë Sisters`)
- # expect a warning about rows with missing values being removed
- ggplot(frequency, aes(x = proportion, y = `H.G. Wells`,
- color = abs(`H.G. Wells` - proportion))) +
- geom_abline(color = "gray40", lty = 2) +
- geom_jitter(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
- geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
- scale_x_log10(labels = percent_format()) +
- scale_y_log10(labels = percent_format()) +
- scale_color_gradient(limits = c(0, 0.001), low = "darkslategray4", high = "gray75") +
- facet_wrap(~author, ncol = 2) +
- theme(legend.position="none") +
- labs(y = "H.G. Wells", x = NULL)
- cor.test(data = frequency[frequency$author == "Brontë Sisters",],
- ~ proportion + `H.G. Wells`)
- ```
- Soal 2. Sentimen Analisis
- a. Buatlah sentiment analisis pada buku karangan H.G. Wells
- b. Buatlah sentiment analisis pada buku karangan Brontë sisters
- c. Buatlah perbadingan kata-kata sentimen positif dan negatif yang digunakan dengan lexicon bing! kemudian cari kata-kata berikut ini:
- c1. paling positif yg digunakan Wells adalah .... jawab marvel
- c2. paling negatif yg digunakan Wells adalah .....jawab invisible
- c3. paling positif yg digunakan Bronte adalah ..... jawab love
- c4. paling negatif yg digunakan Bronte adalah ..... jawab miss
- c5. kata negatif yang paling banyak digunakan oleh kedua penulis adl .....
- jawab dark
- Jwb
- ```{R}
- #-------------A
- hgwells <- gutenberg_download(c(35, 36, 5230, 159)) #download data
- tidy_hgwells <- hgwells %>%
- unnest_tokens(word, text) %>%
- anti_join(stop_words,by="word")
- hgwells_sentiment <- tidy_hgwells %>%
- inner_join(get_sentiments("bing"),by="word") %>%
- count(word, index = gutenberg_id %/% 80, sentiment) %>%
- spread(sentiment, n, fill = 0) %>%
- mutate(sentiment = positive - negative)
- bing_word_counts <- tidy_hgwells %>%
- inner_join(get_sentiments("bing")) %>%
- count(word, sentiment, sort = TRUE) %>%
- ungroup()
- bing_word_counts
- bing_word_counts %>%
- group_by(sentiment) %>%
- top_n(10) %>%
- ungroup() %>%
- mutate(word = reorder(word, n)) %>%
- ggplot(aes(word, n, fill = sentiment)) +
- geom_col(show.legend = FALSE) +
- facet_wrap(~sentiment, scales = "free_y") +
- labs(y = "Contribution to sentiment",
- x = NULL) +
- coord_flip()
- #-------------B
- bronte <- gutenberg_download(c(1260, 768, 969, 9182, 767)) #download data
- tidy_bronte <- bronte %>%
- unnest_tokens(word, text) %>%
- anti_join(stop_words,by="word")
- bronte_sentiment <- tidy_bronte %>%
- inner_join(get_sentiments("bing"),by="word") %>%
- count(word, index = gutenberg_id %/% 80, sentiment) %>%
- spread(sentiment, n, fill = 0) %>%
- mutate(sentiment = positive - negative)
- bing_word_counts <- tidy_bronte %>%
- inner_join(get_sentiments("bing")) %>%
- count(word, sentiment, sort = TRUE) %>%
- ungroup()
- bing_word_counts
- bing_word_counts %>%
- group_by(sentiment) %>%
- top_n(10) %>%
- ungroup() %>%
- mutate(word = reorder(word, n)) %>%
- ggplot(aes(word, n, fill = sentiment)) +
- geom_col(show.legend = FALSE) +
- facet_wrap(~sentiment, scales = "free_y") +
- labs(y = "Contribution to sentiment",
- x = NULL) +
- coord_flip()
- ```
- Week 13 Text Mining
- **Soal K-means**
- ============================================================================
- SOAL 1 Analisis News
- --------------------------------------------
- a. Dapatkan data dari asisten anda 20news-bydate.tar. Extract di direktori d:\datatest
- b. baca seluruh file berita, tampilkan dalam bentuk grafik
- c. cleansing newsgroup untuk artikel 1 sd 100 saja
- Hasil setelah cleansing kata yang paling tinggi adalah .....(jawab ax)
- d. buat tf_idf temukan kata terbanyak pada kelompok berita
- d1. sci.crypt jawab encryption
- d2. sci.space jawab orbit
- e. cari korelasi newsgroup item1= rec.sport.baseball dan korelasi dibawah 0.1
- jawab comp.os.ms-windows.misc
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- library(dplyr)
- library(tidyr)
- library(purrr)
- library(readr)
- training_folder <- "d:/datatest/20news-bydate-train/"
- # Define a function to read all files from a folder into a data frame
- read_folder <- function(infolder) {
- tibble(file = dir(infolder, full.names = TRUE)) %>%
- mutate(text = map(file, read_lines)) %>%
- transmute(id = basename(file), text) %>%
- unnest(text)
- }
- raw_text <- tibble(folder = dir(training_folder, full.names = TRUE)) %>%
- mutate(folder_out = map(folder, read_folder)) %>%
- unnest(cols = c(folder_out)) %>%
- transmute(newsgroup = basename(folder), id, text)
- raw_text
- library(ggplot2)
- raw_text %>%
- group_by(newsgroup) %>%
- summarize(messages = n_distinct(id)) %>%
- ggplot(aes(newsgroup, messages)) +
- geom_col() +
- coord_flip()
- #---------------------c-----------------------------
- library(stringr)
- # must occur after the first occurrence of an empty line,
- # and before the first occurrence of a line starting with --
- cleaned_text <- raw_text %>%
- group_by(newsgroup, id) %>%
- filter(cumsum(text == "") > 0,
- cumsum(str_detect(text, "^--")) == 0) %>%
- ungroup()
- cleaned_text <- cleaned_text %>%
- filter(str_detect(text, "^[^>]+[A-Za-z\\d]") | text == "",
- !str_detect(text, "writes(:|\\.\\.\\.)$"),
- !str_detect(text, "^In article <"),
- !id %in% c(9704, 9985))
- library(tidytext)
- usenet_words <- cleaned_text %>%
- unnest_tokens(word, text) %>%
- filter(str_detect(word, "[a-z']$"),
- !word %in% stop_words$word)
- usenet_words %>%
- count(word, sort = TRUE)
- #------------------------d-----------------------------
- tf_idf <- words_by_newsgroup %>%
- bind_tf_idf(word, newsgroup, n) %>%
- arrange(desc(tf_idf))
- tf_idf
- tf_idf %>%
- filter(str_detect(newsgroup, "^sci\\.")) %>%
- group_by(newsgroup) %>%
- top_n(12, tf_idf) %>%
- ungroup() %>%
- mutate(word = reorder(word, tf_idf)) %>%
- ggplot(aes(word, tf_idf, fill = newsgroup)) +
- geom_col(show.legend = FALSE) +
- facet_wrap(~ newsgroup, scales = "free") +
- ylab("tf-idf") +
- coord_flip()
- #----------------------------e----------------------------
- library(widyr)
- newsgroup_cors <- words_by_newsgroup %>%
- pairwise_cor(newsgroup, word, n, sort = TRUE)
- newsgroup_cors
- #----------------------------f----------------------------
- #install.packages("ggraph")
- library(ggraph)
- library(igraph)
- set.seed(2017)
- newsgroup_cors %>%
- filter(item1=="rec.sport.baseball",correlation<0.1) %>%
- graph_from_data_frame() %>%
- ggraph(layout = "fr") +
- geom_edge_link(aes(alpha = correlation, width = correlation)) +
- geom_node_point(size = 6, color = "lightblue") +
- geom_node_text(aes(label = name), repel = TRUE) +
- theme_void()
- ```
- Soal 2. Twitters
- a. baca data tweet Julia dan Dave
- b. tampilkan grafik distribusi twwets mereka berdua.
- siapa yang menggunakan kata-kata lebih tidak bervariasi
- jawab: David
- c. cleansing data
- d. cari kata yang paling sering digunakan
- d1. David saja @hadleywickham
- d2. Julia saja @drob
- d3. David dan Julia #rstats
- e. batasin data dari 1/1/16 sd 1/6/2016 kemudian buat grafik perbandingan
- tweets Julia melawan David
- Julia paling unggul pada kata .... jawab: utah
- David paling unggul pada kata .... jawab: base
- ```{R}
- library(lubridate)
- library(ggplot2)
- library(dplyr)
- library(readr)
- library(tidyr)
- library(tidytext)
- library(stringr)
- library(purrr)
- library(broom)
- library(scales)
- #-------------a
- tweets_julia <- read_csv(file.choose())
- tweets_dave <- read_csv(file.choose())
- #----------------b
- tweets <- bind_rows(tweets_julia %>%
- mutate(person = "Julia"),
- tweets_dave %>%
- mutate(person = "David")) %>%
- mutate(timestamp = ymd_hms(timestamp))
- ggplot(tweets, aes(x = timestamp, fill = person)) +
- geom_histogram(position = "identity", bins = 20, show.legend = FALSE) +
- facet_wrap(~person, ncol = 1)
- #---------------c
- remove_reg <- "&|<|>"
- tidy_tweets <- tweets %>%
- filter(!str_detect(text, "^RT")) %>%
- mutate(text = str_remove_all(text, remove_reg)) %>%
- unnest_tokens(word, text, token = "tweets") %>%
- filter(!word %in% stop_words$word,
- !word %in% str_remove_all(stop_words$word, "'"),
- str_detect(word, "[a-z]"))
- #--------------d
- frequency <- tidy_tweets %>%
- count(word, sort = TRUE) %>%
- left_join(tidy_tweets %>%
- group_by(person) %>%
- summarise(total = n())) %>%
- mutate(freq = n/total)
- frequency
- #----- e
- tidy_tweets <- tidy_tweets %>%
- filter(timestamp >= as.Date("2016-01-01"),
- timestamp < as.Date("2016-06-01"))
- word_ratios <- tidy_tweets %>%
- filter(!str_detect(word, "^@")) %>%
- count(word, person) %>%
- group_by(word) %>%
- filter(sum(n) >= 10) %>%
- ungroup() %>%
- spread(person, n, fill = 0) %>%
- mutate_if(is.numeric, list(~(. + 1) / (sum(.) + 1))) %>%
- mutate(logratio = log(Julia / David)) %>%
- arrange(desc(logratio))
- word_ratios %>%
- arrange(abs(logratio))
- word_ratios %>%
- group_by(logratio < 0) %>%
- top_n(15, abs(logratio)) %>%
- ungroup() %>%
- mutate(word = reorder(word, logratio)) %>%
- ggplot(aes(word, logratio, fill = logratio < 0)) +
- geom_col(show.legend = FALSE) +
- coord_flip() +
- ylab("log odds ratio (Julia/David)") +
- scale_fill_discrete(name = "", labels = c("Julia", "David"))
- ```
- Week 14 Text Mining
- **Text Mining**
- ============================================================================
- Analisis Customer's commets
- --------------------------------------------
- Ini Bukan soal.
- Harap pelajari baik-baik untuk memahami bagaimana menilai komentar customer terhadap suatu buku.
- Seorang penulis buku menjual buku di amazon.com dan ini adalah 2 buku beserta data-data komentar review dari customer
- Sebelumnya, dapatkan data dari asisten anda komentar.zip Extract di direktori d:\komentar.
- a. Baca komentar cust1 tentang buku 1
- b. ubah dalam bentuk tibble
- c. convert ke tidy format
- d. cleansing hilangkan stopwords
- e. gambarkan grafik kata-kata yang sering dipergunakan
- f. kata yang sering dipergunakan adalah ...... jawab books
- g. buat analisis sentiment tentang komentar cust1 thd buku1
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- library(dplyr)
- library(tidyr)
- library(purrr)
- library(readr)
- library(gutenbergr)
- library(tidytext)
- #--------------------a. membaca komentar cust1
- book1_cust1_text<-read_file(file.choose()) #cari ke buku1 - cust1
- book1_cust1_text
- #--------------------b. format tibble
- book1_cust1_text_df <- tibble(line=1:1,text = book1_cust1_text)
- book1_cust1_text_df
- #--------------------c. format tidy
- book1_cust1_tidy <- book1_cust1_text_df %>%
- unnest_tokens(word, text)
- book1_cust1_tidy
- #--------------------d. cleansing stopwords
- data(stop_words)
- book1_cust1_tidy <- book1_cust1_tidy %>%
- anti_join(stop_words,by="word")
- book1_cust1_tidy
- #-------------------e. kata-kata yang sering dipergunakan
- library(ggplot2)
- book1_cust1_tidy %>%
- count(word, sort = TRUE) %>%
- filter(n > 1) %>%
- mutate(word = reorder(word, n)) %>%
- ggplot(aes(word, n)) +
- geom_col() +
- xlab(NULL) +
- coord_flip()
- #--------------------f. kata-kata sentiment positif
- book1_cust1_sentiment <- book1_cust1_tidy %>%
- inner_join(get_sentiments("bing"),by="word") %>%
- count(word, index = line, sentiment) %>%
- spread(sentiment, n, fill = 0) %>%
- mutate(sentiment = positive)
- #mutate(sentiment = positive - negative) #gunakan ini bila ada negativenya
- book1_cust1_sentiment
- #sum(book2_cust1_sentiment$negative) #kalo ga ada negative tutup dulu
- sum(book1_cust1_sentiment$positive)
- sum(book1_cust1_sentiment$sentiment)
- ```
- Soal 1. Analisis Customer's comments
- --------------------------------------------
- Sebelumnya, dapatkan data dari asisten anda komentar.zip Extract di direktori d:\komentar.
- a. Baca komentar cust1 tentang buku 2
- b. ubah dalam bentuk tibble
- c. convert ke tidy format
- d. cleansing hilangkan stopwords
- e. gambarkan grafik kata-kata yang sering dipergunakan
- f. kata yang sering dipergunakan adalah ...... jawab quality
- g. buat analisis sentiment tentang komentar cust1 thd buku2
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- library(dplyr)
- library(tidyr)
- library(purrr)
- library(readr)
- library(gutenbergr)
- #--------------------a. membaca komentar cust1
- book2_cust1_text<-read_file(file.choose()) #cari ke buku1 - cust1
- book2_cust1_text
- #--------------------b. format tibble
- book2_cust1_text_df <- tibble(line=1:1,text = book2_cust1_text)
- book2_cust1_text_df
- #--------------------c. format tidy
- book2_cust1_tidy <- book2_cust1_text_df %>%
- unnest_tokens(word, text)
- book2_cust1_tidy
- #--------------------d. cleansing stopwords
- data(stop_words)
- book2_cust1_tidy <- book2_cust1_tidy %>%
- anti_join(stop_words,by="word")
- book2_cust1_tidy
- #-------------------e. kata-kata yang sering dipergunakan
- library(ggplot2)
- book2_cust1_tidy %>%
- count(word, sort = TRUE) %>%
- filter(n > 1) %>%
- mutate(word = reorder(word, n)) %>%
- ggplot(aes(word, n)) +
- geom_col() +
- xlab(NULL) +
- coord_flip()
- #--------------------f. kata-kata sentiment positif
- book2_cust1_sentiment <- book2_cust1_tidy %>%
- inner_join(get_sentiments("bing"),by="word") %>%
- count(word, index = line, sentiment) %>%
- spread(sentiment, n, fill = 0) %>%
- mutate(sentiment = positive - negative) #gunakan ini bila ada negativenya
- book2_cust1_sentiment
- sum(book2_cust1_sentiment$negative)
- sum(book2_cust1_sentiment$positive)
- sum(book2_cust1_sentiment$sentiment)
- ```
- Soal 2. Analisis Perbandingan Customer's comments
- --------------------------------------------
- Sebelumnya, dapatkan data dari asisten anda komentar.zip Extract di direktori d:\komentar.
- a. Baca komentar seluruh customer tentang buku 1 dan buku 2
- b. kata yang paling sering dipergunakan adalah ...... jawab book (bukan books)
- c. secara keseluruhan customer ............ isi happy atau sad jawab happy
- ```{R}
- buku_folder <- "d:/komentar/"
- # Define a function to read all files from a folder into a data frame
- read_folder <- function(infolder) {
- tibble(file = dir(infolder, full.names = TRUE)) %>%
- mutate(text = map(file, read_lines)) %>%
- transmute(id = basename(file), text) %>%
- unnest(text)
- }
- buku_text <- tibble(folder = dir(buku_folder, full.names = TRUE)) %>%
- mutate(folder_out = map(folder, read_folder)) %>%
- unnest(cols = c(folder_out)) %>%
- transmute(newsgroup = basename(folder), id, text)
- #-------------ke tidytext format ---------------------
- buku_tidy <- buku_text %>%
- unnest_tokens(word, text) %>%
- anti_join(stop_words,by="word")
- #-------------hitung word frequencies-----------------
- buku_tidy %>%
- count(word, sort = TRUE)
- #-------------tampilkan grafiknya---------------------
- buku_tidy %>%
- count(word, sort = TRUE) %>%
- filter(n > 3) %>%
- mutate(word = reorder(word, n)) %>%
- ggplot(aes(word, n)) +
- geom_col() +
- xlab(NULL) +
- coord_flip()
- #-------------sentiment analysis---------------------
- buku_sentiment <- buku1_tidy %>%
- inner_join(get_sentiments("bing"),by="word") %>%
- count(word, index = id, sentiment) %>%
- spread(sentiment, n, fill = 0) %>%
- mutate(sentiment = positive - negative)
- buku_sentiment
- sum(buku_sentiment$negative)
- sum(buku_sentiment$positive)
- sum(buku_sentiment$sentiment)
- ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement