Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.97 KB | None | 0 0
  1. Week 8 CLustering
  2. **Soal K-means**
  3. ============================================================================
  4.  
  5. SOAL 1
  6. ---
  7.  
  8. a. Kopi data *iris* dari package **datasets** ke dalam data frame dengan nama *dat*.
  9. b. Lakukan eksplorasi data dengan menampilkan struktur data.
  10. c. Tampilkan 5 baris pertama data frame.
  11. d. Tampilkan summary statistics.
  12. e. Buatlah boxplot Petal.Width untuk semua Species. Teruskan untuk 3 variabel numerik berikutnya.
  13. f. Pada boxplot manakah spesies tampak terpisah ke dalam klaster yang jelas?
  14. 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.
  15. h. Pada scatter plot manakah pengelompokan spesies terlihat dengan jelas?
  16.  
  17. **Jawaban**
  18.  
  19. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  20. #a---------
  21. dat <- (iris)
  22. # dat <- dat[,-5]
  23.  
  24. #b-----------
  25. str(dat)
  26.  
  27. #c------
  28. head(dat)
  29.  
  30. #d----
  31. summary(dat)
  32. #pairs(dat)
  33.  
  34. #e----
  35. par(mfrow = c(1,2))
  36. boxplot(Sepal.Length ~ Species, data=dat, xlab="Species", ylab="Sepal.Length")
  37. boxplot(Petal.Length ~ Species, data=dat, xlab="Species", ylab="Petal.Length")
  38.  
  39. par(mfrow = c(1,2))
  40. boxplot(Sepal.Width ~ Species, data=dat, xlab="Species", ylab="Sepal.Width")
  41. boxplot(Petal.Width ~ Species, data=dat, xlab="Species", ylab="Petal.Width")
  42. par(mfrow = c(1,1))
  43.  
  44.  
  45. #f----
  46. # semua boxplot kecuali Sepal.Width dan Sepal.Length
  47.  
  48. #g----
  49. par(mfrow = c(1,2))
  50. plot(dat$Sepal.Width, dat$Sepal.Length, col = dat$Species)
  51. plot(dat$Petal.Width, dat$Petal.Length, col = dat$Species)
  52. par(mfrow = c(1,1))
  53.  
  54. #h----
  55. # scatter plot Petal.Length vs Petal.Width
  56. ```
  57.  
  58. SOAL 2
  59. ---
  60.  
  61. a. Gunakan NIM anda sebagai seed untuk fungsi *set.seed()*.
  62. b. Gunakan fungsi **stats::kmeans** untuk menerapkan algoritma kmeans dengan 3 klaster dan nstart = 25. Save output dengan nama *output*.
  63. b. Tampilkan komponen obyek kmeans dengan fungsi *names()*.
  64. 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.
  65. d. Ulangi bagian c untuk scatter plot Sepal.Width vs Sepal.Length.
  66. e. Buatlah confusion matrix untuk membandingkan prediksi klaster dan klaster riilnya.
  67. 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.
  68. 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**.
  69.  
  70.  
  71. **Jawaban**
  72.  
  73. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  74. #a---------
  75. NIM <- 1234
  76. set.seed(NIM)
  77. output <- kmeans(dat[,-5], centers = 3)
  78. output
  79.  
  80. #b-----------
  81. plot(dat[c("Petal.Length", "Petal.Width")], col = output$cluster)
  82. points(output$centers[,c("Petal.Length","Petal.Width")], col=1:3, pch=8, cex=2)
  83.  
  84. #c-----------
  85. plot(dat[c("Sepal.Length", "Sepal.Width")], col = output$cluster)
  86. points(output$centers[,c("Sepal.Length","Sepal.Width")], col=1:3, pch=8, cex=2)
  87.  
  88.  
  89. #e-----
  90. (tab <- table(dat$Species, output$cluster))
  91.  
  92. #f----
  93. ### Use map_dbl to run many models with varying value of k (centers)
  94. tot_withinss <- purrr::map_dbl(1:10, function(k){
  95. model <- kmeans(x = dat[,-5], centers = k)
  96. model$tot.withinss
  97. })
  98.  
  99. ### Generate a data frame containing both k and tot_withinss
  100. elbow_df <- data.frame(
  101. k = 1:10,
  102. tot_withinss <- tot_withinss
  103. )
  104.  
  105. # plot(elbow_df$k, elbow_df$tot_withinss, type = "b", main = "Jumlah klaster optimal")
  106. library(ggplot2)
  107. ggplot2::ggplot(elbow_df, aes(k, tot_withinss)) + geom_line() + scale_x_continuous(breaks = 1:10)
  108.  
  109. # k = 3
  110.  
  111. #g----
  112. library(factoextra)
  113. factoextra::fviz_nbclust(dat[,-5], kmeans, method = "silhouette")
  114.  
  115. #k = 2 menurut metode average silhouette.
  116. ```
  117.  
  118.  
  119.  
  120.  
  121. **Soal Hierarchical**
  122. ============================================================================
  123. Disini kita belajar analisis cluster hierarchy menggunakan R
  124. Packages: factoextra
  125. Library:factoextra
  126. Data:Women dataset in R
  127.  
  128. SOAL 3
  129. ---
  130. a show 6 baris pertama dari women dataset
  131. catatan:
  132. 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.
  133. 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.
  134. b. gunakan fungsi scale() untuk membat skala. show 6 baris pertama hasil skala
  135. c. hitung jarak eucledian dari df.
  136. Disini kita gunakan fungsi dist() hasilnya disimpan dalam variabel women.dist.
  137. Tampikan hasil matrix 3x3
  138. Berapa jarak wanita kedua dan ketiga? Jawab: .............
  139. Berapa jarak wanita kedua dan kedua? Jawab: ............. karena ....................
  140. d. Buatlah Hierarchy Clustering dengan metode jarak single, average, complete dan centroid.
  141. e. Tampilkan dendrodramnya masing-masing.
  142. Bandingkan dendrodram tsb. Method mana yang berbeda sendiri? Jawab: single
  143. Kesimpulan bisa ditarik dari kesamaan hasil beberapa method yang sama.
  144. Kesimpulan, kalau dibagi menjaid 2 klaster, apa hasilnya?
  145. Jawab: Bila kita membagi data women menjadi 2 cluster, maka
  146. - Cluster pertama={11,12,13,14,15}
  147. - Cluster kedua ={1,2,3,…10}
  148. f. Buatlah Hierarchy Clustering dengan metode jarak Ward, mc Quitty, dan median.
  149. g. Tampilkan dendrodramnya masing-masing.
  150.  
  151.  
  152.  
  153.  
  154. **Jawaban**
  155.  
  156. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  157. #a--------------
  158. head(women, nrow = 6) # Show 6 rows pertama data wanita di US
  159. #b-------------
  160. df <- scale(women) # skala data
  161. head(df, nrow = 6) # Show 6 rows pertama hasil skala
  162. #c--------------
  163. women.dist <- dist(df, method = "euclidean") # menghitung jarak
  164. as.matrix(women.dist)[1:3, 1:3] # menampilkan matrix
  165. #d--------------
  166. #install.packages("factoextra")
  167. library("factoextra") #gunakan library factoextra
  168. women.single <- hclust(d = women.dist, method = "single")
  169. women.average <- hclust(d = women.dist, method = "average")
  170. women.complete <- hclust(d = women.dist, method = "complete")
  171. women.centroid <- hclust(d = women.dist, method = "centroid")
  172. #e--------------
  173. par(mfrow = c(2,1))
  174. fviz_dend(women.single, cex = 0.5) #membuat dendodram
  175. fviz_dend(women.average, cex = 0.5) #membuat dendodram
  176. fviz_dend(women.complete, cex = 0.5) #membuat dendodram
  177. fviz_dend(women.centroid, cex = 0.5) #membuat dendodram
  178. #f--------------
  179. women.ward <- hclust(d = women.dist, method = "ward.D2")
  180. women.mcquitty <- hclust(d = women.dist, method = "mcquitty")
  181. women.median <- hclust(d = women.dist, method = "median")
  182. #g--------------
  183. par(mfrow = c(2,1))
  184. fviz_dend(women.ward, cex = 0.5) #membuat dendodram
  185. fviz_dend(women.mcquitty, cex = 0.5) #membuat dendodram
  186. fviz_dend(women.median, cex = 0.5) #membuat dendodram
  187.  
  188. ```
  189.  
  190. Week 9 Clustering
  191. **Soal K-means**
  192. ============================================================================
  193.  
  194. SOAL 1
  195. ---
  196.  
  197. Data: w9customers.csv
  198. Package yang digunakan:
  199.  
  200. *BbClust
  201. * factoextra
  202. * ggplot2
  203. * purrr
  204.  
  205. a. Baca data **w9customers.csv** dan save dengan nama obyek **dat**.
  206. b. Tampilkan struktur data dan 5 baris pertama data frame.
  207. c. Tampilkan summary statistics untuk setiap variabel kecuali CustomersID.
  208. d. Buatlah density plot untuk variabel Age, AnnualIncome dan Spending Score. Apakah ada perbedaan Age, AnnualIncome dan SpendingScore pada Gender yang berbeda?
  209. 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.
  210. f. Set seed dengan NIM anda. Lakukan kmeans dengan center sesuai dengan hasil perhitungan klaster optimum.
  211. g. Gambarkan cluster yang terbentuk dengan menggunakan warna yang berbeda. Gunakan AnnualIncome sebagai sumbu X dan SpendingScore sebagai sumbu Y.
  212. h. Jelaskan karakteristik klaster yang terbentuk. Hint: gunakan variabel AnnualIncome, SpendingScore.
  213.  
  214.  
  215.  
  216. **Jawaban**
  217.  
  218. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  219. #a---------
  220. dat <- read.csv(file.choose())
  221.  
  222. #b----
  223. str(dat)
  224. head(dat,5)
  225.  
  226. #c----
  227. summary(dat[,-1])
  228.  
  229. #d----
  230. plot(density(dat$Age))
  231. plot(density(dat$AnnualIncomeThou))
  232. plot(density(dat$SpendingScore))
  233.  
  234. boxplot(Age ~ Gender, data = dat)
  235. boxplot(AnnualIncomeThou ~ Gender, data = dat)
  236. boxplot(SpendingScore ~ Gender, data = dat)
  237.  
  238. #Tidak ada perbedaan Age, AnnualIncome dan SpendingScore pada Gender
  239. #e----
  240. scaled_dat <- scale(dat[,3:5], scale = TRUE)
  241.  
  242. #Elbow method
  243. ### Use map_dbl to run many models with varying value of k (centers)
  244. tot_withinss <- purrr::map_dbl(1:10, function(k){
  245. # model <- kmeans(x = scaled_dat, centers = k)
  246. model <- kmeans(x = dat[,3:5], centers = k)
  247. model$tot.withinss
  248. })
  249.  
  250. ### Generate a data frame containing both k and tot_withinss
  251. elbow_df <- data.frame(
  252. k = 1:10,
  253. tot_withinss <- tot_withinss
  254. )
  255.  
  256. # plot(elbow_df$k, elbow_df$tot_withinss, type = "b", main = "Jumlah klaster optimal")
  257. library(ggplot2)
  258. ggplot2::ggplot(elbow_df, aes(k, tot_withinss)) + geom_line() + scale_x_continuous(breaks = 1:10)
  259.  
  260. #k = 6 menurut elbow method
  261.  
  262. library(factoextra)
  263. factoextra::fviz_nbclust(dat[,3:5], kmeans, method = "silhouette")
  264. factoextra::fviz_nbclust(scaled_dat, kmeans, method = "silhouette")
  265.  
  266. # k = 6 untuk unscaled data
  267. # k = 8 untuk scaled data
  268.  
  269. #f kmeans---------
  270.  
  271. NIM <- 1234
  272. set.seed(NIM)
  273.  
  274. k6 <- kmeans(dat[,3:5], centers = 6, nstart = 25)
  275. k6
  276.  
  277. k8 <- kmeans(scaled_dat, centers = 8, nstart = 25)
  278. k8
  279.  
  280. #g------
  281. ggplot(dat, aes(x =AnnualIncomeThou, y = SpendingScore)) +
  282. geom_point(stat = "identity", aes(color = as.factor(k6$cluster))) +
  283. scale_color_discrete(name=" ",
  284. breaks=c("1", "2", "3", "4", "5","6"),
  285. labels=c("Cluster 1", "Cluster 2", "Cluster 3", "Cluster 4", "Cluster 5","Cluster 6")) +
  286. ggtitle("Segmentasi Pengunjung", subtitle = "K-means")
  287.  
  288. ggplot(as.data.frame(scaled_dat), aes(x =AnnualIncomeThou, y = SpendingScore)) +
  289. geom_point(stat = "identity", aes(color = as.factor(k8$cluster))) +
  290. scale_color_discrete(name=" ",
  291. breaks=c("1", "2", "3", "4", "5","6", "7","8"),
  292. labels=c("Cluster 1", "Cluster 2", "Cluster 3", "Cluster 4", "Cluster 5","Cluster 6", "Cluster 7", "Cluster 8")) +
  293. ggtitle("Segmentasi Pengunjung", subtitle = "K-means")
  294.  
  295. #h----
  296.  
  297. #Klaster 4 dan 6: medium income, medium spending
  298. #Klaster 1: high income, high spending
  299. #Klaster 3: low income, low spending
  300. #Klaster 2: high income, low spending
  301. #Klaster 5: low income, high spending
  302.  
  303. ```
  304.  
  305.  
  306.  
  307.  
  308. **Soal Hierarchical**
  309. ============================================================================
  310. Disini kita belajar analisis cluster hierarchy menggunakan R
  311. Packages: factoextra
  312. Library:factoextra
  313. Data:Women dataset in R
  314.  
  315. SOAL 2
  316. ---
  317. a ambil data iris pada kolom ketiga namakan mydata
  318. b. Buat dan bandingkan HC dari mydata dengan metode jarak ward dan complete dan buat denderodramnya. Untuk metode complete tandai cluster untuk k=3
  319. c. Buat HC dendrodram top-down dan bottop-up dengan method ward dari mydata di atas.
  320.  
  321. **Jawaban**
  322.  
  323. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  324. #a-----------------
  325. mydata=iris[3]
  326. summary(mydata)
  327. #b-----------------
  328. d1 <- dist(mydata, method = "euclidean")
  329. res.d1 <- hclust(d, method = "single", )
  330. d2 <- dist(mydata, method = "euclidean")
  331. res.d2 <- hclust(d2, method = "complete", )
  332.  
  333. # Plot the obtained dendrogram
  334. par(mfrow=c(1,2))
  335. plot(res.d1, cex = 0.6, hang = -1)
  336. plot(res.d2, cex = 0.6, hang = -1)
  337.  
  338. groups <-cutree(res.d2, k=3) # cut tree into 3 clusters
  339. rect.hclust(res.d2, k=3, border="red")
  340.  
  341. #c--------------------------------
  342. # ------------------------Model AGNES (bottom-up) Agglomerative Nesting (Hierarchical Clustering)
  343. library("cluster")
  344. res.agnes <- agnes(mydata, method = "ward")
  345. plot(as.hclust(res.agnes), cex = 0.6, hang = -1)
  346.  
  347. # -------------------------MODEL DIANA (top-down) DIvisive ANAlysis Clustering
  348. # Compute diana()
  349. res.diana <- diana(mydata)
  350. plot(as.hclust(res.diana), cex = 0.6, hang = -1)
  351.  
  352.  
  353. ```
  354.  
  355. Week 10 Time Series
  356. **Soal K-means**
  357. ============================================================================
  358.  
  359. SOAL 1 Latihan Dasar Pemeriksaan data
  360. --------------------------------------------
  361.  
  362. tempdub berisi data Average Monthly Temperatures, Dubuque, Iowa
  363. 1a. Periksa apakah data ini memiliki format time series? Jawab .....Ya
  364. 1b. Kalau ya, berapa frekuensinya? .....12 bulan
  365. 1c. Berapa suhu maximum rata-rata di Iowa per bulannya? ..... 74
  366. 1d. Kapan terjadi suhu minimum rata-rata di Iowa per bulannya? ..... Jan 1970
  367. 1e. Buat boxplot. Tentukan bulan dengan suhu rata-rata tertinggi .....Juli
  368. judul="Average Monthly Temperatures", sumbuX=Periode, sumbuY=Suhu.
  369. **Jawaban**
  370.  
  371. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  372. #install.packages("forecast")
  373. library(ggfortify)
  374. library(tseries)
  375. library(forecast)
  376. #1a---------
  377. class(tempdub)
  378. #1b--------
  379. frequency(tempdub)
  380. #1c---------
  381. max(tempdub)
  382. #1d---------
  383. min(tempdub)
  384. tempdub
  385. #1e---------
  386. win.graph(width=4.875, height=2.5,pointsize=8)
  387. boxplot(tempdub~cycle(tempdub),xlab="Periode",
  388. ylab = "Suhu" ,
  389. main ="Average Monthly Temperatures")
  390. ```
  391.  
  392. Soal 2. Stasioner or Non stasioner
  393. gunakan librray TSA kemudian
  394. uji apakah dataset-dataset R ini time series? apakah stationer?
  395. 2a. color jwb: p-value = 0.5746>0.05 bukan stationary
  396. 2b. tempdub jwb: p-value = 0.01<0.05 stationary
  397. 2c. Membuat Model ARIMA dengan nama arima hanya untuk dataset diatas yang stationary saja. Tentukan a) fungsi Y(y1,y2) b) parameter ARIMA
  398. Jawab: a) Y=-0.5403 y1 -0.3078 y2 + E
  399. b) ARIMA(0,0,0)(2,1,0)
  400. 2d. Periksa apakah model arima di atas fit? Jawab: .......fit
  401. 2e. forecast() dengan 95% confidence interval untuk 1 tahun (12 bulan) kedepan.
  402.  
  403.  
  404. ```{R}
  405. #2a---------------------------------
  406. library(TSA)
  407. win.graph(width=4.875, height=2.5,pointsize=8)
  408. data(color)
  409. plot(color,ylab='Color Property',xlab='Batch',type='o')
  410. adf.test(color)
  411.  
  412. #2b---------------------------------
  413. win.graph(width=4.875, height=2.5,pointsize=8)
  414. data("tempdub")
  415. plot(tempdub,ylab='Color Property',xlab='Batch',type='o')
  416. adf.test(tempdub)
  417.  
  418. #2c----------------------------------
  419. arima <- auto.arima(tempdub)
  420. arima
  421.  
  422. #2d----------------------------------
  423. install.packages("ggfortify")
  424. library(ggfortify)
  425. win.graph(width=4.875, height=2.5,pointsize=8)
  426. ggtsdiag(arima)
  427.  
  428. #2e----------------------------------
  429. win.graph(width=4.875, height=2.5,pointsize=8)
  430. forecastAP <- forecast(arima, level = c(95), h = 36)
  431. autoplot(forecastAP)
  432.  
  433. ```
  434.  
  435. Soal 3.
  436. 3a. gunakan dataset larain (Los Angeles Annual Rainfall). Periksa apakah dataset ini stationary?
  437. 3b. Periksa apakah ada missing value?
  438. 3c. Plot larain sumbu y='Curah Hujan', sumbu x='Tahun'
  439. 3d. Bila tidak stasionary, lakukan proses deferensiasi +1
  440. Uji lagi stationary untuk hasil deferensiasi!
  441. Apakah sudah stationary? ya
  442. 3e. Buat model arima dari hasil deferensiasi.periksa apakah model ini fit? ya
  443. Jawab: model ARIMA(4,0,0).
  444. 3f. Buat forecast dari model ARIMA kemudian plot!
  445.  
  446.  
  447. ```{R}
  448. library(TSA)
  449. library(MASS)
  450. library(tseries)
  451. library(forecast)
  452. adf.test(larain)
  453. sum(is.na(larain))
  454. #3c-----------------------
  455. win.graph(width=4.875, height=2.5,pointsize=8)
  456. data("larain")
  457. plot(larain,ylab='Curah Hujan',xlab='Tahun',type='o')
  458. #3d--------------------------
  459. diff_larain<-diff(larain,1)
  460. adf.test(diff_larain)
  461. #3e--------------------------
  462. arima_larain<-auto.arima(diff_larain)
  463. win.graph(width=4.875, height=2.5,pointsize=8)
  464. ggtsdiag(arima_larain)
  465. #3f-------------------------
  466. f_larain<- forecast(arima_larain, h = 11)
  467. f_larain
  468. win.graph(width=4.875, height=2.5,pointsize=8)
  469. plot(f_larain)
  470. ```
  471.  
  472. Week 11 Time Series
  473. Package yang digunakan:
  474.  
  475. * forecast
  476. * tseries
  477. * tidyverse
  478. * nortest
  479. * ggfortify
  480. * readr
  481.  
  482. Perintah:
  483. ---
  484.  
  485. a. Load semua library yang diperlukan.
  486. b. Baca file data **BBCA_JK.csv** dengan **readr::read_csv()** dan save dengan nama obyek **dat**.
  487. c. Tampilkan struktur data, 3 baris pertama data dan 3 baris terakhir data.
  488. d. Buatlah data frame baru bernama **stock** yang diisi dengan data dari kolom Price dan AdjClose. Namakan kolom-kolom ini **date** dan **price**.
  489. e. Split data sehingga data sebelum tahun 2018 menjadi training set dan data mulai tahun 2018 menjadi testing set.
  490. 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.
  491. 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".
  492. h. Tampilkan summary data. Lakukan pemeriksaan apakah ada missing value. Lakukan pemeriksaan cycle.
  493. i. Lakukan pemeriksaan seasonality dengan menggambarkan boxplot untuk setiap bulan. Berikan judul dan label sumbu yang informatif.
  494. j. Tuliskan kesimpulan dari proses **Exploratory Data Analysis** ini.
  495.  
  496.  
  497.  
  498. **Jawaban**
  499. ---
  500.  
  501. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  502. #a---------
  503. library(xts)
  504. library(tseries)
  505. library(fpp2)
  506. library(forecast)
  507. library(readr)
  508. library(tidyverse)
  509. library(nortest)
  510.  
  511. #b----
  512. dat <- readr::read_csv(file.choose())
  513.  
  514. #c----
  515. str(dat)
  516. head(dat, 3)
  517. tail(dat, 3)
  518.  
  519. #d----
  520. date <- dat[,"Date"]
  521. price <- round(dat[,"AdjClose"])
  522. stock <- data.frame(date, price)
  523. colnames(stock) <- c("date","price")
  524. str(stock)
  525. head(stock, 3)
  526.  
  527. #e----
  528. stock_train <- stock %>% filter(date < "2018-01-01")
  529. stock_train %>% tail(3)
  530. stock_test <- stock %>% filter(date >= "2018-01-01")
  531. stock_test %>% head(3)
  532.  
  533. #f---
  534. train_ts <- stats::ts(stock_train[,2], frequency = 12, start = c(2011,1))
  535. test_ts <- ts(stock_test[,2], frequency = 12, start = c(2018,1))
  536. class(train_ts)
  537. str(train_ts)
  538. train_ts
  539.  
  540. #g------
  541. plot.ts(train_ts, xlab = "Tahun", ylab = "Harga per lembar saham", main = "Harga BBCA.JK 2011-2017")
  542.  
  543. #h----
  544. summary(train_ts)
  545. xts::periodicity(train_ts)
  546. stats::cycle(train_ts)
  547.  
  548. #i----
  549. stats::decompose(train_ts) %>% autoplot()
  550. boxplot(train_ts ~ cycle(train_ts))
  551. # ggplot(train_ts, aes(as.factor(cycle(train_ts)), train_ts)) + geom_violin()
  552.  
  553. # Trend harga naik. Harga terendah pada Januari 2011 yaitu Rp 5080. Mean harga Rp 11226 dan harga tertinggi pada Desember 2018 yaitu Rp 21467.
  554. # Terdapat seasonality pada data.
  555. # Harga cenderung rendah pada bulan Januari, naik kemudian turun dan naik menjelang Desember.
  556. # Kandidat lag u/ seasonality: 12 (krn data berupa data bulanan).
  557. # Perlu dilakukan differencing agar series menjadi stasioner.
  558. ```
  559.  
  560.  
  561. **TIME SERIES MODELING SAHAM BBCA.JK DENGAN ARIMA**
  562. ============================================================================
  563.  
  564. Data: BBCA_JK.csv
  565. Package yang digunakan:
  566.  
  567. * forecast
  568. * tseries
  569. * tidyverse
  570. * nortest
  571. * ggfortify
  572.  
  573.  
  574. Perintah
  575. ---
  576.  
  577. a. Cek apakah series sudah stasioner. Ingat series yang anda gunakan adalah training set (time series object **train_ts**).
  578. b. Bila series belum stasioner, lakukan langkah-langkah agar series menjadi stasioner.
  579. c. Carilah model ARIMA yang tepat dari langkah (a) dan (b). Gunakan cara manual (plot, uji hipotesa).
  580. d. Buatlah forecast untuk 12 bulan ke depan.
  581. e. Hitung akurasi dengan menggunakan testing set (time series object **test_ts**).
  582.  
  583. **Jawaban**
  584. ---
  585.  
  586. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  587. #a-----------------
  588.  
  589. train_ts %>% adf.test()
  590. #series tidak stasioner
  591.  
  592. #b-----------------
  593.  
  594. train_ts %>% ggtsdisplay()
  595. #PACF signifikan pada lag 1 --> kandidat model AR(1)
  596.  
  597. #deseasonalize data
  598. train_ts %>% diff(lag = 12) %>% autoplot()
  599. train_ts %>% diff(lag = 12) %>% ggtsdisplay()
  600. train_ts %>% diff(lag = 12) %>% adf.test()
  601.  
  602. #PACF signifikan pada lag 1 --> kandidat AR(1)
  603. #lakukan differencing untuk menghilangkan trend
  604. train_ts %>% diff(lag = 12) %>% diff(differences = 1) %>% autoplot()
  605. train_ts %>% diff(lag = 12) %>% diff(differences = 1) %>% ggtsdisplay()
  606. train_ts %>% diff(lag = 12) %>% diff(differences = 1) %>% adf.test()
  607. #series sekarang stasioner
  608.  
  609. #c--------------------------------
  610.  
  611. fit.train <- train_ts %>% Arima(order = c(0,1,0), seasonal = c(1,0,0))
  612. #ARIMA(0,1,0)(1,0,0)[12] with drift
  613. summary(fit.train)
  614. fit.train %>% checkresiduals()
  615. #residual tampak seperti white noise, random
  616. #tidak ada spike pada ACF plot
  617.  
  618. fit.train %>% residuals() %>% nortest::ad.test()
  619. #residual mengikuti distribusi Gaussian
  620.  
  621. #d----
  622.  
  623. fit.train %>% forecast(h = 12) %>%
  624. autoplot() + ggtitle(fit.train)
  625.  
  626. #e----
  627.  
  628. model.test <- Arima(test_ts, model = fit.train)
  629. model.test %>% forecast::accuracy()
  630.  
  631. ```
  632.  
  633.  
  634. **TIME SERIES FORECASTING SEASONAL AND NON SEASONAL DATA**
  635. ============================================================================
  636. gunakan paket dan library fpp2 untuk mendapatkan beberapa dataset berikut ini:
  637. a. marathon: Winning times (in minutes) for the Boston Marathon Men’s Open Division. 1897-2016.
  638. b. qauselec: Total quarterly gas production in Australia (in petajoules) from 1956:Q1 to 2010:Q2.
  639. c. usmelec: Electricity net generation measured in billions of kilowatt hours (kWh).
  640.  
  641. Instruksi:
  642. buatlah prediksi 20 periode berikutnya untuk masing-masing dataset di atas.
  643. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  644. #instal.package("fpp2")
  645. library(fpp2)
  646. par(mfrow=c(3,2))
  647. plot.ts(marathon)
  648. plot.ts(qauselec)
  649. plot.ts(usmelec)
  650. #maraton non seasonal
  651. #qauselec seasonal additif
  652. #usmelec seasonal multiplikatif
  653.  
  654. #------------marathon-------------------------
  655. plot.ts(marathon) #non seasonal
  656. library("TTR")
  657. par(mfrow=c(1,3))
  658. marathon_SMA6 <- SMA(oil,n=6)
  659. plot.ts(marathon_SMA6)
  660. marathon_SMA7 <- SMA(oil,n=7)
  661. plot.ts(marathon_SMA7)
  662. marathon_SMA8 <- SMA(oil,n=8)
  663. plot.ts(marathon_SMA8)
  664.  
  665. # dengan menggunakan SMA(n=8) kita mendapatkan trend naik dari 19970 ke 1980
  666. # kemudian turun dari 1980 ke 1990,selanjutnya trend naik
  667. # setelah mendapatkan nilai n=8, kita gunakan untuk membuat peramalan kedepan
  668. par(mfrow=c(1,1))
  669. plot(forecast(marathon_SMA8,h=20))
  670. ramalan<-forecast(marathon_SMA8,h=20)
  671. ramalan
  672.  
  673. #------------qauselec--------------------------
  674. dec_qauselec<-decompose(qauselec)
  675. plot(dec_qauselec)
  676. #seasonal adjustment
  677. qauselec_adj <- qauselec - dec_qauselec$seasonal
  678. par(mfrow=c(1,1))
  679. plot.ts(qauselec_adj)
  680. fore_qauselec_adj<-HoltWinters(qauselec_adj, beta=FALSE, gamma=FALSE)
  681. fore_qauselec_adj$SSE
  682. ramalan_qauselec_adj<-forecast(fore_qauselec_adj,h=20)
  683. plot(ramalan_qauselec_adj)
  684. ramalan_qauselec_adj
  685.  
  686. #------------usmelec--------------------------
  687. dec_usmelec<-decompose(usmelec)
  688. plot(dec_usmelec)
  689. #seasonal adjustment
  690. usmelec_adj <- usmelec/dec_usmelec$seasonal
  691. par(mfrow=c(1,1))
  692. plot.ts(usmelec_adj)
  693. fore_usmelec_adj<-HoltWinters(usmelec_adj, beta=FALSE, gamma=FALSE)
  694. fore_usmelec_adj$SSE
  695. ramalan_usmelec_adj<-forecast(fore_usmelec_adj,h=20)
  696. plot(ramalan_usmelec_adj)
  697. ramalan_usmelec_adj
  698.  
  699.  
  700.  
  701. ```
  702. Week 12 Text Mining
  703. **Soal K-means**
  704. ============================================================================
  705.  
  706. SOAL 1 Membandingkan 2 buku
  707. --------------------------------------------
  708.  
  709. a.Buatlah words frequencies analisis (>200words) tentang buku H.G. Wells
  710. b. buatlah words frequencies analisis (>500words) tentang buku Brontë sisters
  711. c. Analisis tingkat kemiripan (similarity) antara kedua buku
  712. Sebutkan/cari:
  713. c1. satu kata yang sering dipakai dengan jumlah yang kira-kira sama adalah txxx (jwb: time)
  714. c2. satu kata yang lebih sering dipakai Wells adalah inXXXXXXX (jawab:
  715. invisible)
  716. c3. satu nama yang lebih sering dipakai Bronte adalah jxxx (jawab: john)
  717. c4. korelasi antara keduanya adalah 0.6481132
  718. **Jawaban**
  719.  
  720. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  721. library(gutenbergr) #library
  722. library(dplyr)
  723. library(tidytext)
  724. library(ggplot2)
  725. library(stringr)
  726. library(tidyr)
  727. library(scales)
  728.  
  729.  
  730. #------------A. analisis word freq HG Wells--------------------
  731.  
  732. hgwells <- gutenberg_download(c(35, 36, 5230, 159)) #download data
  733. #-------------ke tidytext format ---------------------
  734. tidy_hgwells <- hgwells %>%
  735. unnest_tokens(word, text) %>%
  736. anti_join(stop_words,by="word")
  737. #-------------hitung word frequencies-----------------
  738. tidy_hgwells %>%
  739. count(word, sort = TRUE)
  740. #-------------tampilkan grafiknya---------------------
  741. tidy_hgwells %>%
  742. count(word, sort = TRUE) %>%
  743. filter(n > 200) %>%
  744. mutate(word = reorder(word, n)) %>%
  745. ggplot(aes(word, n)) +
  746. geom_col() +
  747. xlab(NULL) +
  748. coord_flip()
  749.  
  750. #------------B. analisis word freq Bronte--------------------
  751.  
  752. bronte <- gutenberg_download(c(1260, 768, 969, 9182, 767)) #download data
  753. #-------------ke tidytext format ---------------------
  754. tidy_bronte <- bronte %>%
  755. unnest_tokens(word, text) %>%
  756. anti_join(stop_words,by="word")
  757. #-------------hitung word frequencies-----------------
  758. tidy_bronte %>%
  759. count(word, sort = TRUE)
  760. #-------------tampilkan grafiknya---------------------
  761. tidy_bronte %>%
  762. count(word, sort = TRUE) %>%
  763. filter(n > 500) %>%
  764. mutate(word = reorder(word, n)) %>%
  765. ggplot(aes(word, n)) +
  766. geom_col() +
  767. xlab(NULL) +
  768. coord_flip()
  769.  
  770. #------------c perbandingan
  771.  
  772.  
  773. frequency <- bind_rows(mutate(tidy_bronte, author = "Brontë Sisters"),
  774. mutate(tidy_hgwells, author = "H.G. Wells")) %>%
  775. mutate(word = str_extract(word, "[a-z']+")) %>%
  776. count(author, word) %>%
  777. group_by(author) %>%
  778. mutate(proportion = n / sum(n)) %>%
  779. select(-n) %>%
  780. spread(author, proportion) %>%
  781. gather(author, proportion, `Brontë Sisters`)
  782.  
  783.  
  784. # expect a warning about rows with missing values being removed
  785. ggplot(frequency, aes(x = proportion, y = `H.G. Wells`,
  786. color = abs(`H.G. Wells` - proportion))) +
  787. geom_abline(color = "gray40", lty = 2) +
  788. geom_jitter(alpha = 0.1, size = 2.5, width = 0.3, height = 0.3) +
  789. geom_text(aes(label = word), check_overlap = TRUE, vjust = 1.5) +
  790. scale_x_log10(labels = percent_format()) +
  791. scale_y_log10(labels = percent_format()) +
  792. scale_color_gradient(limits = c(0, 0.001), low = "darkslategray4", high = "gray75") +
  793. facet_wrap(~author, ncol = 2) +
  794. theme(legend.position="none") +
  795. labs(y = "H.G. Wells", x = NULL)
  796.  
  797. cor.test(data = frequency[frequency$author == "Brontë Sisters",],
  798. ~ proportion + `H.G. Wells`)
  799.  
  800.  
  801. ```
  802.  
  803. Soal 2. Sentimen Analisis
  804. a. Buatlah sentiment analisis pada buku karangan H.G. Wells
  805. b. Buatlah sentiment analisis pada buku karangan Brontë sisters
  806. c. Buatlah perbadingan kata-kata sentimen positif dan negatif yang digunakan dengan lexicon bing! kemudian cari kata-kata berikut ini:
  807. c1. paling positif yg digunakan Wells adalah .... jawab marvel
  808. c2. paling negatif yg digunakan Wells adalah .....jawab invisible
  809. c3. paling positif yg digunakan Bronte adalah ..... jawab love
  810. c4. paling negatif yg digunakan Bronte adalah ..... jawab miss
  811. c5. kata negatif yang paling banyak digunakan oleh kedua penulis adl .....
  812. jawab dark
  813. Jwb
  814.  
  815. ```{R}
  816. #-------------A
  817. hgwells <- gutenberg_download(c(35, 36, 5230, 159)) #download data
  818. tidy_hgwells <- hgwells %>%
  819. unnest_tokens(word, text) %>%
  820. anti_join(stop_words,by="word")
  821.  
  822. hgwells_sentiment <- tidy_hgwells %>%
  823. inner_join(get_sentiments("bing"),by="word") %>%
  824. count(word, index = gutenberg_id %/% 80, sentiment) %>%
  825. spread(sentiment, n, fill = 0) %>%
  826. mutate(sentiment = positive - negative)
  827.  
  828. bing_word_counts <- tidy_hgwells %>%
  829. inner_join(get_sentiments("bing")) %>%
  830. count(word, sentiment, sort = TRUE) %>%
  831. ungroup()
  832. bing_word_counts
  833.  
  834. bing_word_counts %>%
  835. group_by(sentiment) %>%
  836. top_n(10) %>%
  837. ungroup() %>%
  838. mutate(word = reorder(word, n)) %>%
  839. ggplot(aes(word, n, fill = sentiment)) +
  840. geom_col(show.legend = FALSE) +
  841. facet_wrap(~sentiment, scales = "free_y") +
  842. labs(y = "Contribution to sentiment",
  843. x = NULL) +
  844. coord_flip()
  845.  
  846. #-------------B
  847. bronte <- gutenberg_download(c(1260, 768, 969, 9182, 767)) #download data
  848. tidy_bronte <- bronte %>%
  849. unnest_tokens(word, text) %>%
  850. anti_join(stop_words,by="word")
  851.  
  852. bronte_sentiment <- tidy_bronte %>%
  853. inner_join(get_sentiments("bing"),by="word") %>%
  854. count(word, index = gutenberg_id %/% 80, sentiment) %>%
  855. spread(sentiment, n, fill = 0) %>%
  856. mutate(sentiment = positive - negative)
  857.  
  858. bing_word_counts <- tidy_bronte %>%
  859. inner_join(get_sentiments("bing")) %>%
  860. count(word, sentiment, sort = TRUE) %>%
  861. ungroup()
  862. bing_word_counts
  863.  
  864. bing_word_counts %>%
  865. group_by(sentiment) %>%
  866. top_n(10) %>%
  867. ungroup() %>%
  868. mutate(word = reorder(word, n)) %>%
  869. ggplot(aes(word, n, fill = sentiment)) +
  870. geom_col(show.legend = FALSE) +
  871. facet_wrap(~sentiment, scales = "free_y") +
  872. labs(y = "Contribution to sentiment",
  873. x = NULL) +
  874. coord_flip()
  875.  
  876.  
  877.  
  878. ```
  879.  
  880. Week 13 Text Mining
  881. **Soal K-means**
  882. ============================================================================
  883.  
  884. SOAL 1 Analisis News
  885. --------------------------------------------
  886.  
  887. a. Dapatkan data dari asisten anda 20news-bydate.tar. Extract di direktori d:\datatest
  888.  
  889. b. baca seluruh file berita, tampilkan dalam bentuk grafik
  890. c. cleansing newsgroup untuk artikel 1 sd 100 saja
  891. Hasil setelah cleansing kata yang paling tinggi adalah .....(jawab ax)
  892. d. buat tf_idf temukan kata terbanyak pada kelompok berita
  893. d1. sci.crypt jawab encryption
  894. d2. sci.space jawab orbit
  895. e. cari korelasi newsgroup item1= rec.sport.baseball dan korelasi dibawah 0.1
  896. jawab comp.os.ms-windows.misc
  897.  
  898.  
  899. **Jawaban**
  900.  
  901. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  902. library(dplyr)
  903. library(tidyr)
  904. library(purrr)
  905. library(readr)
  906.  
  907. training_folder <- "d:/datatest/20news-bydate-train/"
  908.  
  909. # Define a function to read all files from a folder into a data frame
  910. read_folder <- function(infolder) {
  911. tibble(file = dir(infolder, full.names = TRUE)) %>%
  912. mutate(text = map(file, read_lines)) %>%
  913. transmute(id = basename(file), text) %>%
  914. unnest(text)
  915. }
  916.  
  917. raw_text <- tibble(folder = dir(training_folder, full.names = TRUE)) %>%
  918. mutate(folder_out = map(folder, read_folder)) %>%
  919. unnest(cols = c(folder_out)) %>%
  920. transmute(newsgroup = basename(folder), id, text)
  921.  
  922. raw_text
  923.  
  924. library(ggplot2)
  925.  
  926. raw_text %>%
  927. group_by(newsgroup) %>%
  928. summarize(messages = n_distinct(id)) %>%
  929. ggplot(aes(newsgroup, messages)) +
  930. geom_col() +
  931. coord_flip()
  932.  
  933. #---------------------c-----------------------------
  934. library(stringr)
  935.  
  936. # must occur after the first occurrence of an empty line,
  937. # and before the first occurrence of a line starting with --
  938. cleaned_text <- raw_text %>%
  939. group_by(newsgroup, id) %>%
  940. filter(cumsum(text == "") > 0,
  941. cumsum(str_detect(text, "^--")) == 0) %>%
  942. ungroup()
  943.  
  944. cleaned_text <- cleaned_text %>%
  945. filter(str_detect(text, "^[^>]+[A-Za-z\\d]") | text == "",
  946. !str_detect(text, "writes(:|\\.\\.\\.)$"),
  947. !str_detect(text, "^In article <"),
  948. !id %in% c(9704, 9985))
  949.  
  950. library(tidytext)
  951.  
  952. usenet_words <- cleaned_text %>%
  953. unnest_tokens(word, text) %>%
  954. filter(str_detect(word, "[a-z']$"),
  955. !word %in% stop_words$word)
  956.  
  957. usenet_words %>%
  958. count(word, sort = TRUE)
  959.  
  960. #------------------------d-----------------------------
  961.  
  962. tf_idf <- words_by_newsgroup %>%
  963. bind_tf_idf(word, newsgroup, n) %>%
  964. arrange(desc(tf_idf))
  965.  
  966. tf_idf
  967.  
  968. tf_idf %>%
  969. filter(str_detect(newsgroup, "^sci\\.")) %>%
  970. group_by(newsgroup) %>%
  971. top_n(12, tf_idf) %>%
  972. ungroup() %>%
  973. mutate(word = reorder(word, tf_idf)) %>%
  974. ggplot(aes(word, tf_idf, fill = newsgroup)) +
  975. geom_col(show.legend = FALSE) +
  976. facet_wrap(~ newsgroup, scales = "free") +
  977. ylab("tf-idf") +
  978. coord_flip()
  979.  
  980.  
  981. #----------------------------e----------------------------
  982.  
  983. library(widyr)
  984.  
  985. newsgroup_cors <- words_by_newsgroup %>%
  986. pairwise_cor(newsgroup, word, n, sort = TRUE)
  987. newsgroup_cors
  988.  
  989. #----------------------------f----------------------------
  990. #install.packages("ggraph")
  991. library(ggraph)
  992. library(igraph)
  993. set.seed(2017)
  994.  
  995. newsgroup_cors %>%
  996. filter(item1=="rec.sport.baseball",correlation<0.1) %>%
  997. graph_from_data_frame() %>%
  998. ggraph(layout = "fr") +
  999. geom_edge_link(aes(alpha = correlation, width = correlation)) +
  1000. geom_node_point(size = 6, color = "lightblue") +
  1001. geom_node_text(aes(label = name), repel = TRUE) +
  1002. theme_void()
  1003.  
  1004. ```
  1005.  
  1006. Soal 2. Twitters
  1007. a. baca data tweet Julia dan Dave
  1008. b. tampilkan grafik distribusi twwets mereka berdua.
  1009. siapa yang menggunakan kata-kata lebih tidak bervariasi
  1010. jawab: David
  1011. c. cleansing data
  1012. d. cari kata yang paling sering digunakan
  1013. d1. David saja @hadleywickham
  1014. d2. Julia saja @drob
  1015. d3. David dan Julia #rstats
  1016. e. batasin data dari 1/1/16 sd 1/6/2016 kemudian buat grafik perbandingan
  1017. tweets Julia melawan David
  1018. Julia paling unggul pada kata .... jawab: utah
  1019. David paling unggul pada kata .... jawab: base
  1020.  
  1021. ```{R}
  1022.  
  1023. library(lubridate)
  1024. library(ggplot2)
  1025. library(dplyr)
  1026. library(readr)
  1027. library(tidyr)
  1028. library(tidytext)
  1029. library(stringr)
  1030. library(purrr)
  1031. library(broom)
  1032. library(scales)
  1033.  
  1034. #-------------a
  1035. tweets_julia <- read_csv(file.choose())
  1036. tweets_dave <- read_csv(file.choose())
  1037.  
  1038. #----------------b
  1039.  
  1040. tweets <- bind_rows(tweets_julia %>%
  1041. mutate(person = "Julia"),
  1042. tweets_dave %>%
  1043. mutate(person = "David")) %>%
  1044. mutate(timestamp = ymd_hms(timestamp))
  1045.  
  1046. ggplot(tweets, aes(x = timestamp, fill = person)) +
  1047. geom_histogram(position = "identity", bins = 20, show.legend = FALSE) +
  1048. facet_wrap(~person, ncol = 1)
  1049.  
  1050. #---------------c
  1051.  
  1052. remove_reg <- "&amp;|&lt;|&gt;"
  1053. tidy_tweets <- tweets %>%
  1054. filter(!str_detect(text, "^RT")) %>%
  1055. mutate(text = str_remove_all(text, remove_reg)) %>%
  1056. unnest_tokens(word, text, token = "tweets") %>%
  1057. filter(!word %in% stop_words$word,
  1058. !word %in% str_remove_all(stop_words$word, "'"),
  1059. str_detect(word, "[a-z]"))
  1060.  
  1061. #--------------d
  1062. frequency <- tidy_tweets %>%
  1063. count(word, sort = TRUE) %>%
  1064. left_join(tidy_tweets %>%
  1065. group_by(person) %>%
  1066. summarise(total = n())) %>%
  1067. mutate(freq = n/total)
  1068.  
  1069. frequency
  1070.  
  1071. #----- e
  1072.  
  1073. tidy_tweets <- tidy_tweets %>%
  1074. filter(timestamp >= as.Date("2016-01-01"),
  1075. timestamp < as.Date("2016-06-01"))
  1076.  
  1077. word_ratios <- tidy_tweets %>%
  1078. filter(!str_detect(word, "^@")) %>%
  1079. count(word, person) %>%
  1080. group_by(word) %>%
  1081. filter(sum(n) >= 10) %>%
  1082. ungroup() %>%
  1083. spread(person, n, fill = 0) %>%
  1084. mutate_if(is.numeric, list(~(. + 1) / (sum(.) + 1))) %>%
  1085. mutate(logratio = log(Julia / David)) %>%
  1086. arrange(desc(logratio))
  1087.  
  1088. word_ratios %>%
  1089. arrange(abs(logratio))
  1090.  
  1091. word_ratios %>%
  1092. group_by(logratio < 0) %>%
  1093. top_n(15, abs(logratio)) %>%
  1094. ungroup() %>%
  1095. mutate(word = reorder(word, logratio)) %>%
  1096. ggplot(aes(word, logratio, fill = logratio < 0)) +
  1097. geom_col(show.legend = FALSE) +
  1098. coord_flip() +
  1099. ylab("log odds ratio (Julia/David)") +
  1100. scale_fill_discrete(name = "", labels = c("Julia", "David"))
  1101.  
  1102.  
  1103. ```
  1104.  
  1105. Week 14 Text Mining
  1106. **Text Mining**
  1107. ============================================================================
  1108.  
  1109. Analisis Customer's commets
  1110. --------------------------------------------
  1111. Ini Bukan soal.
  1112. Harap pelajari baik-baik untuk memahami bagaimana menilai komentar customer terhadap suatu buku.
  1113. Seorang penulis buku menjual buku di amazon.com dan ini adalah 2 buku beserta data-data komentar review dari customer
  1114. Sebelumnya, dapatkan data dari asisten anda komentar.zip Extract di direktori d:\komentar.
  1115. a. Baca komentar cust1 tentang buku 1
  1116. b. ubah dalam bentuk tibble
  1117. c. convert ke tidy format
  1118. d. cleansing hilangkan stopwords
  1119. e. gambarkan grafik kata-kata yang sering dipergunakan
  1120. f. kata yang sering dipergunakan adalah ...... jawab books
  1121. g. buat analisis sentiment tentang komentar cust1 thd buku1
  1122.  
  1123. **Jawaban**
  1124.  
  1125. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  1126. library(dplyr)
  1127. library(tidyr)
  1128. library(purrr)
  1129. library(readr)
  1130. library(gutenbergr)
  1131. library(tidytext)
  1132.  
  1133. #--------------------a. membaca komentar cust1
  1134. book1_cust1_text<-read_file(file.choose()) #cari ke buku1 - cust1
  1135. book1_cust1_text
  1136.  
  1137. #--------------------b. format tibble
  1138. book1_cust1_text_df <- tibble(line=1:1,text = book1_cust1_text)
  1139. book1_cust1_text_df
  1140.  
  1141. #--------------------c. format tidy
  1142. book1_cust1_tidy <- book1_cust1_text_df %>%
  1143. unnest_tokens(word, text)
  1144. book1_cust1_tidy
  1145.  
  1146. #--------------------d. cleansing stopwords
  1147. data(stop_words)
  1148. book1_cust1_tidy <- book1_cust1_tidy %>%
  1149. anti_join(stop_words,by="word")
  1150. book1_cust1_tidy
  1151.  
  1152. #-------------------e. kata-kata yang sering dipergunakan
  1153. library(ggplot2)
  1154. book1_cust1_tidy %>%
  1155. count(word, sort = TRUE) %>%
  1156. filter(n > 1) %>%
  1157. mutate(word = reorder(word, n)) %>%
  1158. ggplot(aes(word, n)) +
  1159. geom_col() +
  1160. xlab(NULL) +
  1161. coord_flip()
  1162.  
  1163. #--------------------f. kata-kata sentiment positif
  1164. book1_cust1_sentiment <- book1_cust1_tidy %>%
  1165. inner_join(get_sentiments("bing"),by="word") %>%
  1166. count(word, index = line, sentiment) %>%
  1167. spread(sentiment, n, fill = 0) %>%
  1168. mutate(sentiment = positive)
  1169. #mutate(sentiment = positive - negative) #gunakan ini bila ada negativenya
  1170. book1_cust1_sentiment
  1171.  
  1172. #sum(book2_cust1_sentiment$negative) #kalo ga ada negative tutup dulu
  1173. sum(book1_cust1_sentiment$positive)
  1174. sum(book1_cust1_sentiment$sentiment)
  1175.  
  1176. ```
  1177.  
  1178.  
  1179. Soal 1. Analisis Customer's comments
  1180. --------------------------------------------
  1181. Sebelumnya, dapatkan data dari asisten anda komentar.zip Extract di direktori d:\komentar.
  1182. a. Baca komentar cust1 tentang buku 2
  1183. b. ubah dalam bentuk tibble
  1184. c. convert ke tidy format
  1185. d. cleansing hilangkan stopwords
  1186. e. gambarkan grafik kata-kata yang sering dipergunakan
  1187. f. kata yang sering dipergunakan adalah ...... jawab quality
  1188. g. buat analisis sentiment tentang komentar cust1 thd buku2
  1189.  
  1190. ```{r, echo = TRUE, message = FALSE, warning = FALSE}
  1191. library(dplyr)
  1192. library(tidyr)
  1193. library(purrr)
  1194. library(readr)
  1195. library(gutenbergr)
  1196.  
  1197. #--------------------a. membaca komentar cust1
  1198. book2_cust1_text<-read_file(file.choose()) #cari ke buku1 - cust1
  1199. book2_cust1_text
  1200.  
  1201. #--------------------b. format tibble
  1202. book2_cust1_text_df <- tibble(line=1:1,text = book2_cust1_text)
  1203. book2_cust1_text_df
  1204.  
  1205. #--------------------c. format tidy
  1206. book2_cust1_tidy <- book2_cust1_text_df %>%
  1207. unnest_tokens(word, text)
  1208. book2_cust1_tidy
  1209.  
  1210. #--------------------d. cleansing stopwords
  1211. data(stop_words)
  1212. book2_cust1_tidy <- book2_cust1_tidy %>%
  1213. anti_join(stop_words,by="word")
  1214. book2_cust1_tidy
  1215.  
  1216. #-------------------e. kata-kata yang sering dipergunakan
  1217. library(ggplot2)
  1218. book2_cust1_tidy %>%
  1219. count(word, sort = TRUE) %>%
  1220. filter(n > 1) %>%
  1221. mutate(word = reorder(word, n)) %>%
  1222. ggplot(aes(word, n)) +
  1223. geom_col() +
  1224. xlab(NULL) +
  1225. coord_flip()
  1226.  
  1227. #--------------------f. kata-kata sentiment positif
  1228. book2_cust1_sentiment <- book2_cust1_tidy %>%
  1229. inner_join(get_sentiments("bing"),by="word") %>%
  1230. count(word, index = line, sentiment) %>%
  1231. spread(sentiment, n, fill = 0) %>%
  1232. mutate(sentiment = positive - negative) #gunakan ini bila ada negativenya
  1233. book2_cust1_sentiment
  1234.  
  1235. sum(book2_cust1_sentiment$negative)
  1236. sum(book2_cust1_sentiment$positive)
  1237. sum(book2_cust1_sentiment$sentiment)
  1238. ```
  1239.  
  1240. Soal 2. Analisis Perbandingan Customer's comments
  1241. --------------------------------------------
  1242. Sebelumnya, dapatkan data dari asisten anda komentar.zip Extract di direktori d:\komentar.
  1243. a. Baca komentar seluruh customer tentang buku 1 dan buku 2
  1244. b. kata yang paling sering dipergunakan adalah ...... jawab book (bukan books)
  1245. c. secara keseluruhan customer ............ isi happy atau sad jawab happy
  1246.  
  1247.  
  1248. ```{R}
  1249.  
  1250. buku_folder <- "d:/komentar/"
  1251.  
  1252. # Define a function to read all files from a folder into a data frame
  1253. read_folder <- function(infolder) {
  1254. tibble(file = dir(infolder, full.names = TRUE)) %>%
  1255. mutate(text = map(file, read_lines)) %>%
  1256. transmute(id = basename(file), text) %>%
  1257. unnest(text)
  1258. }
  1259.  
  1260. buku_text <- tibble(folder = dir(buku_folder, full.names = TRUE)) %>%
  1261. mutate(folder_out = map(folder, read_folder)) %>%
  1262. unnest(cols = c(folder_out)) %>%
  1263. transmute(newsgroup = basename(folder), id, text)
  1264.  
  1265. #-------------ke tidytext format ---------------------
  1266. buku_tidy <- buku_text %>%
  1267. unnest_tokens(word, text) %>%
  1268. anti_join(stop_words,by="word")
  1269.  
  1270. #-------------hitung word frequencies-----------------
  1271. buku_tidy %>%
  1272. count(word, sort = TRUE)
  1273. #-------------tampilkan grafiknya---------------------
  1274. buku_tidy %>%
  1275. count(word, sort = TRUE) %>%
  1276. filter(n > 3) %>%
  1277. mutate(word = reorder(word, n)) %>%
  1278. ggplot(aes(word, n)) +
  1279. geom_col() +
  1280. xlab(NULL) +
  1281. coord_flip()
  1282.  
  1283. #-------------sentiment analysis---------------------
  1284. buku_sentiment <- buku1_tidy %>%
  1285. inner_join(get_sentiments("bing"),by="word") %>%
  1286. count(word, index = id, sentiment) %>%
  1287. spread(sentiment, n, fill = 0) %>%
  1288. mutate(sentiment = positive - negative)
  1289. buku_sentiment
  1290.  
  1291. sum(buku_sentiment$negative)
  1292. sum(buku_sentiment$positive)
  1293. sum(buku_sentiment$sentiment)
  1294.  
  1295. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement