Baiklah kali ini saya akan menganalisa saham PT Bukalapak.com Tbk. Data yang akan saya gunakan diperoleh pada website Yahoo Finance https://finance.yahoo.com/quote/BUKA.JK/history?p=BUKA.JK.
PT Bukalapak.com Tbk. mengoperasikan pasar e-commerce untuk berbagai produk di Indonesia. Perusahaan ini menawarkan produk di bidang sepeda, olahraga, sepeda motor, elektronik, ponsel, komputer, hobi dan koleksi, kesehatan, perawatan kecantikan, fashion pria dan wanita, fashion anak-anak, rumah tangga, makanan, perlengkapan bayi, kamera, industri, perlengkapan kantor , tiket dan voucher, permainan, media, e-voucher, dan logam mulia, serta mobil, suku cadang, dan aksesoris. (BUKA.JK).
Untuk membantu proses persiapan dan analisis serta mempercantik tampilan visualisasi, berikut library yang akan digunakan
library(dplyr)
library(lubridate)
library(ggplot2)
library(plotly)
library(glue)
library(scales)Baca data dan simpan pada sebuah variable
bukalapak <- read.csv("data_input/BUKA_JK.csv")
head(bukalapak)Data description:
Cek struktur data frame
glimpse(bukalapak)#> Rows: 190
#> Columns: 7
#> $ Date <chr> "2021-08-09", "2021-08-10", "2021-08-12", "2021-08-13", "202~
#> $ Open <dbl> 1325, 1130, 965, 940, 960, 845, 815, 895, 865, 915, 910, 905~
#> $ High <dbl> 1325, 1160, 1000, 1035, 965, 890, 900, 915, 920, 930, 920, 9~
#> $ Low <dbl> 1110, 1035, 965, 910, 890, 830, 775, 845, 865, 895, 900, 860~
#> $ Close <dbl> 1110, 1035, 965, 955, 890, 830, 895, 865, 910, 910, 905, 870~
#> $ Adj.Close <dbl> 1110, 1035, 965, 955, 890, 830, 895, 865, 910, 910, 905, 870~
#> $ Volume <dbl> 3578780800, 994505400, 2751889000, 3239118200, 1074688900, 9~
Tipe data kolom Date terbaca sebagai char, maka perlu diperbaiki menjadi tipe data Date. Dan untuk menjawab kebutuhan bisnis penjualan saham harian, bulanan dan tahunan maka akan ditambahkan kolom baru dengan data terkait dan mengubah datanya ke tipe factor.
bukalapak <- bukalapak %>%
mutate(Date = ymd(Date),
Year = as.factor(year(Date)),
Month = as.factor(month(Date,label = T)),
WeekDay = as.factor(wday(Date, label = T)))Setelah melakukan perbaikan, mari lihat dan koreksi kembali
head(bukalapak, 10)glimpse(bukalapak)#> Rows: 190
#> Columns: 10
#> $ Date <date> 2021-08-09, 2021-08-10, 2021-08-12, 2021-08-13, 2021-08-16,~
#> $ Open <dbl> 1325, 1130, 965, 940, 960, 845, 815, 895, 865, 915, 910, 905~
#> $ High <dbl> 1325, 1160, 1000, 1035, 965, 890, 900, 915, 920, 930, 920, 9~
#> $ Low <dbl> 1110, 1035, 965, 910, 890, 830, 775, 845, 865, 895, 900, 860~
#> $ Close <dbl> 1110, 1035, 965, 955, 890, 830, 895, 865, 910, 910, 905, 870~
#> $ Adj.Close <dbl> 1110, 1035, 965, 955, 890, 830, 895, 865, 910, 910, 905, 870~
#> $ Volume <dbl> 3578780800, 994505400, 2751889000, 3239118200, 1074688900, 9~
#> $ Year <fct> 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, ~
#> $ Month <ord> Aug, Aug, Aug, Aug, Aug, Aug, Aug, Aug, Aug, Aug, Aug, Aug, ~
#> $ WeekDay <ord> Mon, Tue, Thu, Fri, Mon, Wed, Thu, Fri, Mon, Tue, Wed, Thu, ~
Setelah tipe data dari masing-masing kolom telah sesuai, selanjutnya lakukan cek missing value pada data
anyNA(bukalapak)#> [1] FALSE
Ternyata data tidak memiliki missing value (NA), maka pemrosesan data dapat dilanjutkan.
Untuk melihat pergerakan harga penjualan saham Bukalapak cenderung naik atau turun, maka akan disajikan line chart dari Opening Price saham tahun 2021 - 2022
OpenPlot <- ggplot(bukalapak, aes(x = Date, y = Open )) +
geom_line(col="red")+
labs(title = "Opening Price PT Bukalapak.com Tbk")+
theme_light()
ggplotly(OpenPlot)Dan berikut line chart untuk Close Price
OpenPlot <- ggplot(bukalapak, aes(x = Date, y = Close )) +
geom_line(col="blue")+
labs(title = "Closing Price PT Bukalapak.com Tbk")+
theme_light()
ggplotly(OpenPlot)Dari visualisasi line chart data Open dan Close Price diatas, terlihat bahwa harga saham Bukalapak cenderung terus menerus mengalami penurunan. Dan dapat dilihat bahwa pada bulan agustus harga buka dan tutup saham turun cukup tajam, dan penurunan drastis ini juga kembali terjadi pada penutupan tahun 2021 dari bulan November hingga Desember.
Rata-rata nilai Opening Price berdasarkan data harian
avgOpn <- bukalapak %>%
group_by(WeekDay) %>%
summarise(Average.Perday = mean(Open)) %>%
ungroup()
avgOpnBerikut merupakan visualisasi rata-rata Opening Price pada masing-masing hari
avgOpn <- avgOpn %>%
mutate(label = glue("Day: {WeekDay}
Average Opening Price: {comma(Average.Perday)}"))
opnPlot <- ggplot(avgOpn, aes(x = WeekDay, y = Average.Perday, text = label)) +
geom_col(aes(fill = Average.Perday)) +
labs(title = "Average Opening Price",
subtitle = "contoh",
x = "Day",
y = NULL) +
scale_fill_gradient(low = "orange", high= "red") +
theme_minimal() +
theme(legend.position = "none")
ggplotly(opnPlot, tooltip = "text")Rata-rata nilai Closing Price berdasarkan data harian
avgCls <- bukalapak %>%
group_by(WeekDay) %>%
summarise(Average.Perday = mean(Close)) %>%
ungroup()
avgClsBerikut merupakan visualisasi rata-rata Closing Price pada masing-masing hari
avgCls <- avgCls %>%
mutate(label = glue("Day: {WeekDay}
Average Closing Price: {comma(Average.Perday)}"))
clsPlot <- ggplot(avgCls, aes(x = WeekDay, y = Average.Perday, text = label)) +
geom_col(aes(fill = Average.Perday)) +
labs(title = "Average Closing Price",
subtitle = "contoh",
x = "Day",
y = NULL) +
scale_fill_gradient(low = "orange", high= "red") +
theme_minimal() +
theme(legend.position = "none")
ggplotly(clsPlot, tooltip = "text")Berdasarkan dari visualisasi diatas hari senin menempati posisi peratama dengan rata-rata Opening price dan Closing price terbesar, namun secara umum rata-rata opening price dan closing price perharinya tidak memiliki perbedaan yang signifikan.
boxplot <- ggplot(data = bukalapak, mapping = aes(x = Month, y = Volume)) +
geom_boxplot(outlier.shape = NA, aes(fill=Month)) +
labs(title = "Volume Distribution")+
geom_jitter()+
scale_y_continuous(labels = scales::comma)
ggplotly(boxplot)Dari visualisasi boxplot diatas dapat dilihat bahwa pada bulan agustus memiliki niali outlier yang cukup jauh dari nilai persebarannya, artinya pada bulan agustus terjadi pemindahan/transaksi secara besar-besaran. Dan dapat dilihat juga bahwa setiap bulannya selalu ada nilai outlier.
OH <- ggplot(bukalapak, aes(x = Open, y = High)) +
geom_point(shape=18, color="blue")+
geom_smooth(method=lm, linetype="dashed",color="darkred", fill="blue")+
labs(title = "Scotter Plot Relationship between Opening and High Price")+
theme_light()
ggplotly(OH)OL <- ggplot(bukalapak, aes(x = Open, y = Low)) +
geom_point(shape=18, color="blue")+
geom_smooth(method=lm, linetype="dashed",color="darkred", fill="blue")+
labs(title = "Scotter Plot Relationship between Opening and Low Price")+
theme_light()
ggplotly(OL)Berdasarkan visualisasi diatas, maka dapat dikatakan bahwa Open Price berhubungan kuat dengan High Price dan Low Price. Dapat dikatakan bahwa semakin besar Opening Price maka akan semakin meningkatkan High Price dan Low Price.