Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ---
- output:
- html_document:
- number_sections: yes
- word_document: default
- editor_options:
- chunk_output_type: console
- ---
- ************************************************************************************************************
- Week : 13
- Title : Text Mining
- Nama : Vinson Phoan
- NIM : 00000029963
- Date : 2019-10
- Asisten : tan thing heng
- Waktu : Max 200 menit
- ***************************************************************************************************************
- ***************************************************************************************************************
- 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 base
- d. buat tf_idf temukan kata terbanyak pada kelompok berita
- d1. sci.crypt adalah encryption
- d2. sci.space adalah orbit
- e. cari korelasi newsgroup item1= rec.sport.baseball dan korelasi dibawah 0.1
- jawab snack
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #---------------------a-----------------------------
- library(lubridate)
- library(ggplot2)
- library(dplyr)
- library(readr)
- library(tidyr)
- library(tidytext)
- library(stringr)
- library(purrr)
- library(broom)
- library(scales)
- library(widyr)
- library(ggraph)
- library(igraph)
- training_folder <- "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)
- }
- #------------------------b-----------------------------
- 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
- raw_text %>%
- group_by(newsgroup) %>%
- summarize(messages = n_distinct(id)) %>%
- ggplot(aes(newsgroup, messages)) +
- geom_col() +
- coord_flip()
- #---------------------c-----------------------------
- 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))
- #membersihkan stopword
- usenet_words <- cleaned_text %>%
- unnest_tokens(word, text) %>%
- filter(str_detect(word, "[a-z']$"),
- !word %in% stop_words$word)
- 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()
- #encryption
- #orbit
- #----------------------------e----------------------------
- newsgroup_cors <- words_by_newsgroup %>%
- pairwise_cor(newsgroup, word, n, sort = TRUE)
- newsgroup_cors
- set.seed(2017)
- newsgroup_cors %>%
- filter(correlation < .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 adalah @hadleywickham
- d2. Julia saja adalah @selkie1970
- d3. David dan Julia adalah @accidentalart
- e. batasin data dari 1/1/16 sd 1/6/2016 kemudian buat grafik perbandingan
- tweets Julia melawan David
- Julia paling unggul pada kata base
- David paling unggul pada kata utan
- ```{R}
- #---------------------a-----------------------------
- tweets_julia <- read_csv("tweets_julia.csv")
- tweets_dave <- read_csv("tweets_dave.csv")
- #------------------------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 %>%
- group_by(person) %>%
- count(word, sort = TRUE) %>%
- left_join(tidy_tweets %>%
- group_by(person) %>%
- summarise(total = n())) %>%
- mutate(freq = n/total)
- frequency
- #@hadleywickham
- #@selkie1970
- frequency <- frequency %>%
- select(person, word, freq) %>%
- spread(person, freq) %>%
- arrange(Julia, David)
- frequency
- #@accidentalart
- ggplot(frequency, aes(Julia, David)) +
- geom_jitter(alpha = 0.1, size = 2.5, width = 0.25, height = 0.25) +
- geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
- scale_x_log10(labels = percent_format()) + scale_y_log10(labels = percent_format()) +
- geom_abline(color = "red")
- #----------------------------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(David / Julia)) %>%
- 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 (David/Julia)") +
- scale_fill_discrete(name = "", labels = c("David", "Julia"))
- #utan
- #base
- ```
- ***************************************************************************************************************
- Good luck
- ***************************************************************************
- ---
- output:
- html_document:
- number_sections: yes
- word_document: default
- editor_options:
- chunk_output_type: console
- ---
- ************************************************************************************************************
- Week : 12
- Title : Text Mining
- Nama : Vinson Phoan
- NIM : 00000029963
- Date : 2019-10
- Asisten : tan thing heng
- Waktu : Max 200 menit
- ***************************************************************************************************************
- FILE UNTUK Mahasiswa SAJA.
- FILE INI BOLEH DIBAGIKAN KEPADA MAHASISWA.
- ***************************************************************************************************************
- ============================================================================
- 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 .....
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- library(gutenbergr) #library
- library(dplyr)
- library(tidytext)
- library(ggplot2)
- library(stringr)
- library(tidyr)
- library(scales)
- library(tm)
- #------------A. analisis word freq HG Wells--------------------
- hgwells <- gutenberg_download(c(35, 36, 5230, 159)) #download data
- tidy_hgwells <- hgwells %>% unnest_tokens(word, text) %>% anti_join(stop_words,by="word")
- tidy_hgwells %>% count(word, sort = TRUE)
- tidy_hgwells %>% count(word, sort = TRUE) %>% filter(n > 200) %>% mutate(word = reorder(word, n)) %>% ggplot(aes(word, n)) + geom_col() + xlab(NULL) + coord_flip()
- #kata time lebih banyak di pakai, jadi buku ini membahas tentang waktu,manusia,pintu
- #dan bisa disimpulkan kalau ini membahas tentang ruang waktu
- #------------B. analisis word freq Bronte--------------------
- bronte <- gutenberg_download(c(1260, 768, 969, 9182, 767))
- tidy_bronte <- bronte %>% unnest_tokens(word, text) %>% anti_join(stop_words,by="word")
- tidy_bronte %>% count(word, sort = TRUE)
- tidy_bronte %>% count(word, sort = TRUE) %>% filter(n > 500) %>% mutate(word = reorder(word, n)) %>% ggplot(aes(word, n)) + geom_col() + xlab(NULL) + coord_flip()
- #ada 10 kata yang sama yang ada di dalam nover tersebut
- #------------c perbandingan
- #c1. satu kata yang sering dipakai dengan jumlah yang kira-kira sama adalah time
- #c2. satu kata yang lebih sering dipakai Wells adalah in.......
- #c3. satu nama yang lebih sering dipakai Bronte adalah j...
- tidy_hgwells %>% count(word, sort = TRUE)
- tidy_bronte %>% count(word, sort = TRUE)
- tidy_books <- tidy_bronte %>% group_by(word) %>% mutate(linenumber = row_number(), chapter = cumsum(str_detect(text, regex("^chapter [\\divxlc]", ignore_case = TRUE)))) %>% ungroup() %>% unnest_tokens(word, text)
- frequency <- bind_rows(mutate(tidy_bronte, author = "Brontë Sisters"), mutate(tidy_hgwells, author = "Jane Austen")) %>% 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`)
- cor.test(data = frequency[frequency$author == "Brontë Sisters",], ~ proportion + `Jane Austen`)
- #korelasi mereka 64%
- ```
- 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
- #install.packages("textdata") #kalau belum instal
- library(textdata)
- get_sentiments("bing")
- library(janeaustenr)
- tidy_books <- austen_books() %>%
- group_by(book) %>%
- mutate(linenumber = row_number(),
- chapter = cumsum(str_detect(text, regex("^chapter [\\divxlc]",
- ignore_case = TRUE)))) %>%
- ungroup() %>%
- unnest_tokens(word, text)
- jane_austen_sentiment <- tidy_books %>% inner_join(get_sentiments("bing"),by="word") %>%count(book, index = linenumber %/% 80, sentiment) %>% spread(sentiment, n, fill = 0) %>% mutate(sentiment = positive - negative)
- ggplot(jane_austen_sentiment, aes(index, sentiment, fill = book)) + geom_col(show.legend = FALSE) + facet_wrap(~book, ncol = 2, scales = "free_x")
- #-------------B
- tidy_books <- austen_books() %>%
- group_by(book) %>%
- mutate(linenumber = row_number(),
- chapter = cumsum(str_detect(text, regex("^chapter [\\divxlc]",
- ignore_case = TRUE)))) %>%
- ungroup() %>%
- unnest_tokens(word, text)
- bronte <- tidy_bronte %>% inner_join(get_sentiments("bing"),by="word") %>%count(word, sentiment) %>% spread(sentiment, n, fill = 0) %>% mutate(sentiment = positive - negative)
- #-------------C
- #c1. paling positif yg digunakan Wells adalah marvel
- #c2. paling negatif yg digunakan Wells adalah invisible
- #c3. paling positif yg digunakan Bronte adalah love
- #c4. paling negatif yg digunakan Bronte adalah miss
- #c5. kata negatif yang paling banyak digunakan oleh kedua penulis adl dark
- bing_word_counts <- tidy_books %>% 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()
- ```
- ***************************************************************************************************************
- Good luck
- ***************************************************************************
- ---
- editor_options:
- chunk_output_type: console
- output:
- html_document:
- number_sections: yes
- word_document:
- number_sections: yes
- pdf_document:
- number_sections: yes
- ---
- ************************************************************************************************************
- Week : 11
- Title : Time Series Lab
- Nama : Vinson Phoan
- NIM : 00000029963
- Date : 2019-10
- Asisten : tan thing heng
- Waktu : Max 200 menit
- ***************************************************************************************************************
- FILE UNTUK MAHASISWA.
- ***************************************************************************************************************
- EXPLORATORY DATA ANALYSIS SAHAM BBCA.JK
- ===
- Data: BBCA_JK.csv
- 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 sebesplit(df, as.Date(df$date))lum 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". chron(dates = "02/27/92"
- 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(forecast)
- library(tseries)
- library(tidyverse)
- library(nortest)
- library(ggfortify)
- library(readr)
- library(chron)
- library(lmtest)
- library(fUnitRoots)
- library(fpp2)
- #b----
- dat <- readr::read_csv("BBCA.JK.csv")
- #c----
- str(dat)
- head(dat,3)
- tail(dat,3)
- #d----
- date <- dat$Date
- price <- dat$AdjClose
- stock <- data.frame(date,price)
- #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 <- stats::ts(stock_test[,2],frequency = 12,start=c(2018, 1))
- class(train_ts) #tipe data adalah ts
- class(test_ts) #tipe data adalah ts
- str(train_ts)
- #train_ts dan test_ts sudah berubah menjadi tipe time series
- #g------
- plot(train_ts, xlab = "Tahun", ylab = "Harga per lembar saham", main = "Harga Saham BCA/ lembar tahun 2011-2017")
- #pada plot tersebut setiap tahun harga saham bca naik dan terjadi penurun harga dengan drastis pada tahun 2018
- chron(dates = "02/27/92")
- #h----
- summary(train_ts)
- cycle(train_ts)
- sum(is.na(train_ts))
- sum(is.na(test_ts))
- #tidak terdapat adanya missing values di data train_ts dan test_ts
- #i----
- boxplot(train_ts~cycle(train_ts),xlab = "Frequency", ylab = "Price", main = "Saham BCA Dalam 12 frekuensi")
- #j---
- ```
- **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-----------------
- adf.test(train_ts)
- #data train_ts adalah stationary
- #b-----------------
- #c--------------------------------
- components.ts = decompose(train_ts)
- plot(components.ts)
- urkpssTest(train_ts, type = c("tau"), lags = c("short"),use.lag = NULL, doplot = TRUE)
- tsstationary = diff(train_ts, differences=1)
- plot(tsstationary)
- acf(train_ts,lag.max=34)
- acf(tsstationary, lag.max=34)
- pacf(tsstationary, lag.max=34)
- fitARIMA <- arima(train_ts, order=c(1,1,1),seasonal = list(order = c(1,0,0), period = 12),method="ML")
- coeftest(fitARIMA)
- confint(fitARIMA)
- #box ljung test
- acf(fitARIMA$residuals)
- library(FitAR)
- boxresult = LjungBoxTest(fitARIMA$residuals,k=2,StartLag=1)
- plot(boxresult[,3],main= "Ljung-Box Q Test", ylab= "P-values", xlab= "Lag")
- qqnorm(fitARIMA$residuals)
- qqline(fitARIMA$residuals)
- #d----
- predict(fitARIMA,n.ahead = 12)
- plot(forecast(fitARIMA))
- #e----
- arimaMod <- auto.arima(train_ts, stepwise=FALSE, approximation=FALSE)
- arimaMod.Fr <-forecast(arimaMod,h=12)
- plot(arimaMod.Fr)
- lines(test_ts, col="red")
- legend("topleft",lty=1,bty = "n",col=c("red","blue"),c("testData","ARIMAPred"))
- ```
- **TIME SERIES FORECASTING SEASONAL AND NON SEASONAL DATA**
- ============================================================================
- Gunakan package **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}
- #------------marathon-------------------------
- class(marathon)
- fitARIMA2 <- arima(marathon, order=c(1,1,1),seasonal = list(order = c(1,0,0), period = 12),method="ML")
- predict(fitARIMA2,n.ahead = 20)
- plot(forecast(fitARIMA2))
- #prediksi dalam 20 periode akan terjadi stabil
- #------------qauselec--------------------------
- class(qauselec)
- fitARIMA3 <- arima(qauselec, order=c(1,1,1),seasonal = list(order = c(1,0,0), period = 12),method="ML")
- predict(fitARIMA3,n.ahead = 20)
- plot(forecast(fitARIMA3))
- #dalam 20 periode akan tetap naik
- #------------usmelec--------------------------
- class(usmelec)
- fitARIMA4 <- arima(usmelec, order=c(1,1,1),seasonal = list(order = c(1,0,0), period = 12),method="ML")
- predict(fitARIMA4,n.ahead = 20)
- plot(forecast(fitARIMA4))
- #akan naik turun
- ```
- ***************************************************************************************************************
- Good luck
- ***************************************************************************
- #Axeeh Maxkx, lni!
- ---
- editor_options:
- chunk_output_type: console
- output:
- pdf_document: default
- html_document:
- number_sections: yes
- word_document: default
- ---
- ************************************************************************************************************
- Week : 10
- Title : Time Series Analysis
- Nama : Vinson Phoan
- NIM : 00000029963
- Date : 2019-10
- Asisten : tan thing heng
- Waktu : Max 200 menit
- ***************************************************************************************************************
- FILE UNTUK MAHASISWA
- ***************************************************************************************************************
- # 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}
- #load library dan data yang diperlukan di sini
- library(TSA)
- #1a---------
- data(tempdub)
- class(tempdub)
- #ya jawabannya ts jadi data ini time series
- #1b--------
- frequency(tempdub)
- #frekuensinya adalah 12
- #1c---------
- summary(tempdub)
- # maximumnya kita bisa lihat adalah 74
- #1d---------
- min(tempdub)
- #tempdub nya adalah 8.4 dan kita view data tempdub nya 8.4 berada di tahun 1970
- #jadi tahun 1970
- #1e---------
- boxplot(tempdub~cycle(tempdub),main = "Average Monthly Temperatures", xlab = "Periode", ylab = "Suhu")
- #kita bisa melihat bawha trend grapfiknya seperti gunung
- ```
- # Soal 2. Stasioner or Non stasioner
- 2a. gunakan library TSA kemudian uji apakah dataset-dataset ini merupakan time series? apakah stationer?
- 2a. dataset tempdub dari package TSA
- 2b. dataset color dari package TSA
- 2c. Membuat Model ARIMA dengan nama arima hanya untuk dataset diatas yang stationary saja. Tentukan a) fungsi Y(y1,y2) b) parameter ARIMA
- 2d. Periksa apakah model arima di atas fit? Jawab: .......fit
- 2e. forecast() dengan 95% confidence interval untuk 1 tahun (12 bulan) kedepan.
- # Jawaban
- ```{r, warning = FALSE, message = FALSE}
- #load library dan data yang diperlukan di sini
- library(tseries)
- library(forecast)
- #2a---------------------------------
- acf(diff(log(tempdub)))
- ats <- ts(tempdub,frequency = 12,start =1)
- plot(ats)
- auto.arima(ts)
- #2b---------------------------------
- data(color)
- acf(diff(log(color)))
- #2c----------------------------------
- arima <- arima(log(tempdub),c(0,1,1))
- #2d----------------------------------
- predict(arima,n.ahead = 10*12)
- #2e----------------------------------
- forecast(ats,h=12)
- ```
- # 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!
- # Jawaban
- ```{r, warning = FALSE, message = FALSE}
- #load library dan data yang diperlukan di sini
- #3a----
- data(larain)
- #3b----
- sum(is.na(larain))
- #tidak ada missing value di data larain
- #3c-----------------------
- plot(larain,xlab = "Tahun",ylab = "Curah Hujan")
- #3d--------------------------
- diff <- diff(larain,1)
- adf.test(diff)
- # p-value kurang dari 5%, H0 di tolak
- #H0 di tolak jadi itu adalah data stationer
- #3e--------------------------
- arimalarain <- auto.arima(diff)
- #modelnya adalah ARIMA(4,0,0)
- plot(arimalarain)
- #Residual terlihat tersebar di sekitar 0 sebagai noise.
- #Model Arima ini secara fair dikatakan fit
- #3f-------------------------
- forecasts <-forecast(arimalarain, h = 12)
- plot(forecasts)
- ```
- ***************************************************************************************************************
- Good luck
- ***************************************************************************
- ---
- editor_options:
- chunk_output_type: console
- output:
- html_document:
- number_sections: yes
- pdf_document: default
- word_document: default
- ---
- ************************************************************************************************************
- Week : 9
- Title : Clustering
- Nama : Vinson Phoan
- NIM : 00000029963
- Date : 2019-10
- Asisten : tan thing heng
- Waktu : Max 200 menit
- ***************************************************************************************************************
- ***************************************************************************************************************
- **Soal K-means**
- ============================================================================
- SOAL 1
- ---
- Data: w9customers.csv
- Package yang digunakan:
- * NbClust
- * 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---------
- #knit to html
- #pakai itu bu
- library(tinytex)
- dat <- read.csv("C:/Users/labc705-36/Downloads/w9customers.csv")
- #b----
- str(dat)
- head(dat,5)
- #c----
- summary(dat$Gender)
- summary(dat$Age)
- summary(dat$AnnualIncomeThou)
- summary(dat$SpendingScore)
- #d----
- d <- density(dat$Age)
- plot(d)
- d <- density(dat$AnnualIncomeThou)
- plot(d)
- d <- density(dat$SpendingScore)
- plot(d)
- #e----
- #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)
- library(factoextra)
- library(NbClust)
- #k = menurut elbow method
- fviz_nbclust(dat[3:5], kmeans, method = "wss") +
- geom_vline(xintercept = 4, linetype = 2)+
- labs(subtitle = "Elbow method")
- #optimal k adalah 4
- #k = menurut average silhouette method
- fviz_nbclust(dat[3:5], kmeans, method = "silhouette")+
- labs(subtitle = "Silhouette method")
- #optimal k adalah 6
- #f kmeans---------
- set.seed(29963)
- km <- kmeans(dat[3:5],4,nstart = 25)
- #g------
- kc1 <- kmeans(dat[3:5], 3)
- plot(dat[c("AnnualIncomeThou", "SpendingScore")], col=kc1$cluster)
- #h----
- #cluster merah spending scorenya mulai dari 0 -100 dan annual income nya kecil yaitu 0-70
- #cluster hitam mempunyai spending score yang rendah tetapi annual incomenya mulai dari 80 sampai 140
- #cluster hijau mempunyai spending score tinggi dan annualincome juga tinggi
- ```
- **Soal Hierarchical**
- ============================================================================
- Disini kita belajar analisis cluster hierarchy menggunakan R
- Packages: factoextra
- Library:factoextra
- Data: iris 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
- #b-----------------
- d1 <- dist(mydata[1:4], method = "euclidean")
- res.d1 <- hclust(d1, method = "ward.D" )
- d2 <- dist(mydata[1:4], method = "euclidean")
- res.d2 <- hclust(d2, method = "complete" )
- # Plot the obtained dendrogram
- plot(res.d1, cex = 0.6, hang = -1)
- #dendogram ward mempunyai cluster height yang kecil, cluster kiri lebih kecil dari cluster kanan
- #ada 5 cluster
- plot(res.d2, cex = 0.6, hang = -1)
- #dendogram complete kanannya lebih tinggi dari kiri, cluster kanan lebih tinggi dari cluster kiri
- #complete ada 6 cluster
- #c--------------------------------
- # ------------------------Model AGNES (bottom-up) Agglomerative Nesting (Hierarchical Clustering)
- library("cluster")
- res.agnes <- agnes(mydata, method = "ward")
- res.agnes$ac
- # 9913289
- plot(as.hclust(res.agnes), cex = 0.6, hang = -1)
- plot(as.dendrogram(res.agnes), cex = 0.6,
- horiz = TRUE)
- #dendogram ini kanannya mempunyai 2 cluster dan paling tinggi
- #lebih sedikit cluster
- # -------------------------MODEL DIANA (top-down) DIvisive ANAlysis Clustering
- # Compute diana()
- res.diana <- diana(mydata)
- # Plot the tree
- plot(as.hclust(res.diana), cex = 0.6, hang = -1)
- # plot.dendrogram()
- plot(as.dendrogram(res.diana), cex = 0.6,
- horiz = TRUE)
- #dendogram ini kanannya height nya lebih tinggi
- #dan lebih banyak cluster
- ```
- ***************************************************************************************************************
- Good luck
- ***************************************************************************
- ---
- output:
- pdf_document:
- number_sections: yes
- word_document: default
- html_document: default
- ---
- ************************************************************************************************************
- Week : 8
- Title : Clustering
- Nama : Vinson Phoan
- NIM : 00000029963
- Date : 2019-10
- Asisten : tan thing heng
- Waktu : Max 200 menit
- ***************************************************************************************************************
- FILE UNTUK MAHASISWA.
- ***************************************************************************************************************
- **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
- #b-----------
- str(dat)
- #c------
- head(dat,5)
- #d----
- summary(dat)
- #e----
- boxplot(dat$Petal.Width~dat$Species,xlab = "species",ylab = "Petal.Width")
- boxplot(dat$Petal.Length~dat$Species,xlab = "species",ylab = "Petal.Length")
- boxplot(dat$Sepal.Width~dat$Species,xlab = "species",ylab = "Sepal.Width")
- boxplot(dat$Sepal.Length~dat$Species,xlab = "species",ylab = "Sepal.Length")
- #f----
- #yang paling mendekati adalah petal length dan width
- #g----
- plot(dat[c("Sepal.Length","Sepal.Width")],col = output$cluster,main ="Sepal.Length vs Sepal.Width")
- plot(dat[c("Petal.Length","Petal.Width")],col = output$cluster,main = "plot Petal.Length vs Petal.Width")
- #h----
- #Petal.Length vs Petal.Width, mereka keliatan terbagi menjadi 3 dan lebih jelas kalau sepal cluster yang gabung dengan cluster lainnya
- ```
- 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---------
- set.seed(29963)
- #b-----------
- output <- stats::kmeans(dat[,1:4], 3, nstart = 25)
- names(output)
- #c-----------
- plot(dat[c("Petal.Length","Petal.Width")],col = output$cluster,pch =output$cluster)
- #d-----------
- plot(dat[c("Sepal.Length","Sepal.Width")],col = output$cluster,pch =output$cluster)
- #e-----
- table(dat$Species,output$cluster)
- #f----
- factoextra::fviz_nbclust(dat[1:4],kmeans,method = "wss")
- #g----
- factoextra::fviz_nbclust(dat[1:4],kmeans,method = "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: .................
- Kesimpulan bisa ditarik dari kesamaan hasil beberapa method yang sama.
- Kesimpulan, kalau dibagi menjaid 2 klaster, apa hasilnya?
- f. Buatlah Hierarchy Clustering dengan metode jarak Ward, mc Quitty, dan median.
- g. Tampilkan ketiga dendrodram masing-masing.
- **Jawaban**
- ```{r, echo = TRUE, message = FALSE, warning = FALSE}
- #a--------------
- head(women)
- #b-------------
- womens <- scale(women)
- #c--------------
- women.dist <-dist(womens,method = "euclidean")
- #d--------------
- hclust_s <- hclust(women.dist, method = 'single')
- hclust_avg <- hclust(women.dist, method = 'average')
- hclust_com <- hclust(women.dist, method = 'complete')
- hclust_cent <- hclust(women.dist, method = 'centroid')
- #jarak kedua lebih pendek dari ketiga
- #jarak kedua sama, karena sama2 2
- #e--------------
- plot(hclust_s)
- plot(hclust_avg)
- plot(hclust_com)
- plot(hclust_cent)
- #hierarchy dengan method single yang berbeda sendiri dengan method lainnya
- #f--------------
- hclust_w <- hclust(women.dist, method = 'ward')
- hclust_mcq <- hclust(women.dist, method = 'mcquitty')
- hclust_med <- hclust(women.dist, method = 'median')
- #g--------------
- plot(hclust_w)
- plot(hclust_mcq)
- plot(hclust_med)
- ```
- ***************************************************************************************************************
- Good luck
- ***************************************************************************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement