Background

Bank Syariah Indonesia (BSI) diduga terkena serangan ‘ransomware’ yang membuat layanan perbankannya mengalami gangguan sejak Senin (8 mei 2023) lalu. Menurut Pakar Keamanan Siber dan Forensik Digital, Alfons Tanujaya, perkembangan teknologi membuat penjahat ransomware makin pintar dalam melancarkan aksinya. Keberadaan mereka sulit dilacak oleh penegak hukum. Pasalnya, mereka menggunakan teknologi canggih seperti mata uang kripto, enkripsi, dan The Onion Router (TOR) atau jalur komunikasi anonim. “Pelaku kejahatan menyamarkan jejaknya dengan TOR, lalu mengunci data penting korban dengan teknologi enkripsi, serta meminta uang tebusan menggunakan mata uang kripto,” kata dia dalam keterangan resmi yang diterima CNBC Indonesia, dikutip Kamis (11/5/2023). Dalam beberapa kasus, ketika korban menolak memberikan uang tebusan, penjahat ransomware akan menggunakan TOR untuk mempublikasikan dan menyebar data sensitif korban ke publik.

Pakar forensik digital dari Vaksincom Alfons Tanujaya mengakui ada rumor serangan ransomware terhadap Bank Syariah Indonesia (BSI). Menurut Alfons biasanya serangan ransomware mengenkripsi database utama dan sistem inti. Tak hanya itu, sistem cadangan (backup) tak luput jadi sasaran penyerang. “Kalau dari gejalanya sih memang agak mencurigakan. Namun kalau backup bermasalah juga, maka ini yang akan mengakibatkan masalah tidak selesai dalam bilangan jam,” tuturnya. Biasanya, kata Alfons, jika database cadangan bisa digunakan, seharusnya layanan perbankan tersebut bisa pulih kembali kurang dari empat jam. Dia pun menyimpulkan bahwa serangan ransomware sukses mengenkripsi database, core system, dan backup Bank BSI yang bisa mengakibatkan layanan perbankan lumpuh untuk jangka waktu panjang. Kedua, pertanda lain yang menguatkan Bank BSI kena serangan ransomware yaitu kicauan dari Lockbit yang kemudian dihapus. “Selain itu kan ada tweet kena lockbit yang kemudian didelete,” katanya. LockBit adalah salah satu geng ransomware yang sangat aktif dan berbahaya seperti disebutkan oleh Kantor Polisi Kriminal Federal Jerman. Sejumlah perusahaan di beberapa negara sempat jadi korban penyerangan, di antaranya pabrik ban Continental hingga perusahaan pertahanan besar Prancis, Thales Group.

Kelompok ransomware LockBit pada hari Selasa menerbitkan 1,5 terabyte informasi pribadi dan keuangan yang menurut kelompok tersebut dicuri dari Bank Syariah Indonesia setelah negosiasi tebusan gagal. Kelompok tersebut mengatakan bahwa catatan tersebut mencakup informasi pribadi dan keuangan sekitar 15 juta nasabah dan karyawan bank syariah terbesar di negara tersebut. Bank ini berdiri pada tahun 2021 melalui penggabungan tiga bank nasional lainnya. BSI mengoperasikan lebih dari 1.100 cabang untuk melayani hampir 18 juta nasabah. “Kami sampaikan saat ini BSI tengah melakukan maintenance system dan akan kembali ke kondisi normal secepatnya,” menurut akun Twitter BSI, @bankbsi_id, Senin (8/5). Meski mengalami gangguan, BSI mengklaim uang nasabah aman. “Kami pastikan bahwa dana nasabah tetap aman dan kami juga mengimbau kepada seluruh nasabah untuk tetap waspada dan berhati-hati atas segala modus penipuan maupun tindak kejahatan digital yang mengatasnamakan bank,” lanjut BSI. Bank syariah ini juga mengaku, per Selasa (9 mei 2023), nasabah sudah bisa melakukan transaksi melalui Kantor Cabang dan ATM BSI serta secara bertahap dan layanan BSI Mobile.

Namun dalam kurun waktu 8 Mei hingga 18 Mei jagat media twitter indonesia mengalami kepanikan dan mempertanyakan perihal keamanan yang dimilikinya untuk para nasabah bank BSI, total ada 24.000 tweet yang dihasilkan pengguna Twitter sebagai respons atas insiden Ransomware BSI yang melibatkan Bank Syariah Indonesia. Jumlah tweet yang signifikan ini menunjukkan meluasnya perhatian dan kekhawatiran di kalangan komunitas Twitter mengenai serangan siber dan dampaknya. Orang-orang menggunakan Twitter untuk mengekspresikan pendapat mereka, berbagi informasi, dan mendiskusikan insiden tersebut, yang mencerminkan peran platform ini sebagai sumber berita dan wacana publik secara real-time.

Mengingat semua ini, kumpulan data ini berisi lebih dari 24.401 cuitan tweet.

Problem Statement

Untuk mengidentifikasi skor sentiment dalam sebuah twitter dan mengidentifikasi unsur kata apa yang paling banyak dilontarkan untuk pengambilan kesimpulan berdasarkan topik tertentu.

Setelah label didapatkan dari penentuan skor sentiment analyst, dapat dibuat kelanjutan model klasifikasi indoBERT.

Project Idea

Mencari topik permasalahan yang sedang dialami customer BSI dalam platform twitter berdasarkan cuitan yang dia lakukan untuk melihat permasalahan yang cenderung banyak terjadi dalam sisi customer BSI. Oleh karena itu, pada project ini akan dikembangkan sebuah model klasifikasi dan sentiment analyst untuk mengidentifikasi dalam sebuah komentar di twitter memiliki skor sentiment positif, negatif dan neutral, lalu setelah skor didapatkan kita dapat melakukan pembuatan model machine learning klasifikasi untuk mengelompokan sebuah komentar twitter dapat dimasukan dalam kategori tertentu.

Problem Scope

Pada project ini akan digunakan sebuah data komentar-komentar di twitter yang diambil dari situs kaggle dengan judul “Bank BSI Ransomware Tweets - 24k Tweets”.

Selanjutnya, kebutuhan pembuatan model machine learning untuk mengidentifikasi apakah komentar tersebut memiliki skor sentiment tertentu, dan saya akan membuat sebuah model Sentiment-Analyst Lexicon dan ditahap berikutnya saya akan melakukan model dengan IndoBERT Classification agar hasil dari label sebelumnya lebih akurat kembali.

Sedangkan untuk mengidentifikasi apakah dari sebagian besar komentar tersebut termasuk dalam topik permasalahan tertentu yang dikeluhkan customer, saya akan menggunakan sebuah model Latent Dirichlet Allocation (LDA).

Output

Output dari project ini berupa dashboard analysis yang menampilkan Exploratory Data untuk menunjukkan banyaknya skor termasuk dalam positif, negatif atau netral yang didapatkan dalam kasus ransomeware, banyaknya topik tertentu yang sering dibahas dalam kasus ransomeware, insight untuk meningkatkan layanan dan respons mengenai nasabah terhadap insiden ransomeware, dan visualisasi data seperti word clouds, grafik sentimen, distribusi topik dan lainnya.

Business Impact

Dari proyek ini, kita dapat menghasilkan beberapa dampak bisnis yang signifikan, yaitu:

  1. Pemahaman Sentimen dan Respon Nasabah: Dengan menganalisis skor sentiment dan pola respon nasabah dalam cuitan di Twitter terkait insiden ransomware, BSI akan mendapatkan pemahaman yang lebih dalam tentang bagaimana nasabah merasa dan merespons insiden tersebut. Hal ini bisa membantu BSI dalam merancang strategi tanggap yang lebih tepat dan akurat terhadap kekhawatiran dan kebutuhan nasabah.

  2. Identifikasi Permasalahan Utama Nasabah: Melalui model klasifikasi dan analisis topik, BSI dapat mengidentifikasi permasalahan utama yang sering dialami oleh nasabah. Ini memberi kesempatan kepada BSI untuk mengatasi permasalahan tersebut dengan solusi yang lebih efektif dan responsif, meningkatkan kepuasan nasabah.

  3. Peningkatan Layanan dan Respons: Dengan memahami lebih dalam tentang kekhawatiran dan sentimen nasabah, BSI dapat meningkatkan layanan pelanggan mereka. Mereka dapat memberikan respons yang lebih cepat dan efektif terhadap kejadian darurat seperti insiden ransomware, meningkatkan rasa aman dan kepercayaan nasabah.

  4. Strategi Pemasaran dan Komunikasi: Informasi yang diperoleh dari analisis ini dapat membantu BSI dalam merancang strategi pemasaran dan komunikasi yang lebih tepat sasaran. Mereka dapat berfokus pada pesan-pesan yang relevan dengan kekhawatiran dan kebutuhan nasabah, meningkatkan keterlibatan dan interaksi dengan nasabah.

  5. Reputasi dan Kepercayaan: Dengan merespons secara tepat dan responsif terhadap insiden ransomware dan kekhawatiran nasabah, BSI dapat membangun reputasi sebagai lembaga yang peduli dan responsif terhadap nasabah. Hal ini bisa membantu mempertahankan dan meningkatkan kepercayaan nasabah terhadap bank.

  6. Informasi untuk Pengambilan Keputusan: Hasil analisis dan insight dari proyek ini dapat memberikan data yang lebih kuat untuk pengambilan keputusan di berbagai level di dalam organisasi BSI, termasuk manajemen atas, tim layanan pelanggan, dan departemen lainnya.

Dengan demikian, proyek ini memiliki potensi untuk memberikan dampak positif yang signifikan pada operasi dan reputasi Bank Syariah Indonesia, membantu mereka beradaptasi dengan perubahan dan meningkatkan layanan kepada nasabah.

Library

library(dplyr)
library(tokenizers)
library(wordcloud)
library(textclean)
library(devtools)
library(katadasaR)

Exploratory Data Analysis

data <- read.csv("data_input/bsi_24k_tweets.csv")
tail(data)
#>                                                                  URL
#> 24396          https://twitter.com/t1w4yy/status/1655862338409598978
#> 24397       https://twitter.com/muiqball_/status/1655862303160688643
#> 24398    https://twitter.com/david_gliath/status/1655862254917799936
#> 24399  https://twitter.com/diahsafitri655/status/1655862223389204485
#> 24400       https://twitter.com/sinta_814/status/1655862213855571970
#> 24401 https://twitter.com/Maulanarendra45/status/1655862147572977665
#>                            Date
#> 24396 2023-05-09 09:08:40+00:00
#> 24397 2023-05-09 09:08:32+00:00
#> 24398 2023-05-09 09:08:20+00:00
#> 24399 2023-05-09 09:08:13+00:00
#> 24400 2023-05-09 09:08:10+00:00
#> 24401 2023-05-09 09:07:55+00:00
#>                                                                                                                                                                    Tweet
#> 24396                      @arivaniiiii @bankbsi_id maaf ikut nimbrung, berarti ini emang lagi maintenance ya ka??punya ku m banking nya stuck di salam doang soalnya 😭😭
#> 24397                                                                                                                             @bankbsi_id bsi mobile belom bisa boss
#> 24398                             @bankbsi_id @me_stywi Min, yang ditanya nasabah KAPAN BSI MOBILE kembali normal, itu pertanyaannya, tp Jawabannya malah ngolor ngidul,
#> 24399                                                                                                                                           @bankbsi_id Jawabannya C
#> 24400 Duuhh.. Ini BSI sampe kapan gangguan nyaa...dari kemaren ga bisa apa2.. Semua transaksi ga bisa...ke bank nya semua cabang offline.. Hadehh🤦🏻‍♀️\n#bsierror #bsidown
#> 24401                                                                                                       @adym311286 @bankbsi_id @FikiHari lewat atm mandiri bisa kak
#>                        ID        Username Replies Reetweets Likes Quotes
#> 24396 1655862338409598976          t1w4yy       0         0     0      0
#> 24397 1655862303160688640       muiqball_       0         0     0      0
#> 24398 1655862254917799936    david_gliath       0         0     0      0
#> 24399 1655862223389204480  diahsafitri655       0         0     0      0
#> 24400 1655862213855571968       sinta_814       0         0     1      0
#> 24401 1655862147572977664 Maulanarendra45       3         0     0      0
#>            conversationId Language Links Media Retweeted.Tweet Bookmarks
#> 24396 1655836014127251456       in                          NA         0
#> 24397 1655807602104872960       in                          NA         0
#> 24398 1655807602104872960       in                          NA         0
#> 24399 1654051486740127744       in                          NA         0
#> 24400 1655862213855571968       in                          NA         0
#> 24401 1655807602104872960       in                          NA         0
dim(data)
#> [1] 24401    15
colSums(is.na(data))
#>             URL            Date           Tweet              ID        Username 
#>               0               0               0               0               0 
#>         Replies       Reetweets           Likes          Quotes  conversationId 
#>               0               0               0               0               0 
#>        Language           Links           Media Retweeted.Tweet       Bookmarks 
#>               0               0               0           24401               0

Menghapus beberapa kolom yang tidak diperlukan dalam analisis.

# Menghapus kolom yang tidak diperlukan
data_clean <- data %>%
  select(-c(Retweeted.Tweet, Language, URL, Date, ID, Username, Replies, Reetweets, Likes, Quotes, conversationId, Links, Media, Retweeted.Tweet, Bookmarks))

head(data_clean)
#>                                                                                        Tweet
#> 1 @bankbsi_id Layanan BAYAR  ke @TakafulKeluarga  sudah bisa blm ya ,kok jadi repot begini 🫠
#> 2          @NurmansyahAff @berlianidris @Paltiwest @bankbsi_id Apa mungkin dah ganti vendor?
#> 3                          @bankbsi_id Udah bisa tarik tunai via ATM atau ke teller gak min?
#> 4                                  @bankbsi_id Jangan lupa perbaiki mbanking untuk topup!!!!
#> 5                                        @bankbsi_id Min, BSI udah amann dipake belum minn??
#> 6                                   @abcdxyumi Mending di telfon bank BSI, hallo @bankbsi_id

Persiapan Data

# menjadikan dataset ke data karakter
tweets <- data_clean$Tweet %>% 
  as.character()
head(tweets)
#> [1] "@bankbsi_id Layanan BAYAR  ke @TakafulKeluarga  sudah bisa blm ya ,kok jadi repot begini 🫠"
#> [2] "@NurmansyahAff @berlianidris @Paltiwest @bankbsi_id Apa mungkin dah ganti vendor?"         
#> [3] "@bankbsi_id Udah bisa tarik tunai via ATM atau ke teller gak min?"                         
#> [4] "@bankbsi_id Jangan lupa perbaiki mbanking untuk topup!!!!"                                 
#> [5] "@bankbsi_id Min, BSI udah amann dipake belum minn??"                                       
#> [6] "@abcdxyumi Mending di telfon bank BSI, hallo @bankbsi_id"
# mengganti semua kemunculan karakter newline dengan spasi di seluruh variabel 
tweets <- gsub( "\n"," ",tweets)
head(tweets)
#> [1] "@bankbsi_id Layanan BAYAR  ke @TakafulKeluarga  sudah bisa blm ya ,kok jadi repot begini 🫠"
#> [2] "@NurmansyahAff @berlianidris @Paltiwest @bankbsi_id Apa mungkin dah ganti vendor?"         
#> [3] "@bankbsi_id Udah bisa tarik tunai via ATM atau ke teller gak min?"                         
#> [4] "@bankbsi_id Jangan lupa perbaiki mbanking untuk topup!!!!"                                 
#> [5] "@bankbsi_id Min, BSI udah amann dipake belum minn??"                                       
#> [6] "@abcdxyumi Mending di telfon bank BSI, hallo @bankbsi_id"
# Menghapus teks yang bersifat html atau url
tweets <- tweets %>% 
  replace_html() %>% # replace html with blank 
  replace_url()   # replace URLs with blank
head(tweets)
#> [1] "@bankbsi_id Layanan BAYAR  ke @TakafulKeluarga  sudah bisa blm ya ,kok jadi repot begini 🫠"
#> [2] "@NurmansyahAff @berlianidris @Paltiwest @bankbsi_id Apa mungkin dah ganti vendor?"                  
#> [3] "@bankbsi_id Udah bisa tarik tunai via ATM atau ke teller gak min?"                                  
#> [4] "@bankbsi_id Jangan lupa perbaiki mbanking untuk topup!!!!"                                          
#> [5] "@bankbsi_id Min, BSI udah amann dipake belum minn??"                                                
#> [6] "@abcdxyumi Mending di telfon bank BSI, hallo @bankbsi_id"
# melakukan text replacement emoji dan html
tweets <- tweets %>% 
    replace_emoji(.) %>% 
    replace_html(.)
replace_tag(tweets[4:5])
#> [1] " Jangan lupa perbaiki mbanking untuk topup!!!!"
#> [2] " Min, BSI udah amann dipake belum minn??"
# replacement mention dan hastag pada teks
tweets <- tweets %>% 
  replace_tag(tweets, pattern = "@([A-Za-z0-9_]+)",replacement="") %>%  # remove mentions
  replace_hash(tweets, pattern = "#([A-Za-z0-9_]+)",replacement="")      # remove hashtags

# print replaced text data
tweets[4:5]
#> [1] " Jangan lupa perbaiki mbanking untuk topup!!!!"
#> [2] " Min, BSI udah amann dipake belum minn??"
# replace internet slang (Karena berat, replace dilakukan di kaggle : https://www.kaggle.com/code/dimaspujangga/dcd-proses-replace-slang)

# Hasil dari proses di kaggle
tweets <- read.csv("data_input/tweet_clean.csv")
tail(tweets)
#>                                                                                                                                                                                    Text
#> 24398                     maaf ikut nimbrung, berarti ini memang lagi maintenance ya kak??punya ku sama banking nya stuck di salam doang soalnya loudly crying face loudly crying face 
#> 24399                                                                                                                                                         bsi mobile belum bisa bos
#> 24400                                                                Min, yang ditanya nasabah KAPAN BSI MOBILE kembali normal, itu pertanyaannya, tapi Jawabannya malah ngolor ngidul,
#> 24401                                                                                                                                                                    Jawabannya sih
#> 24402 duh.. Ini BSI sampai kapan gangguan nya...dari kemarin enggak bisa apa-apa.. Semua transaksi enggak bisa...ke bank nya semua cabang offline.. Hadehh            female sign      
#> 24403                                                                                                                                                        lewat atm mandiri bisa kak
# striping untuk menghapus simbol dan huruf yang tidak relevan dari teks
tweets$Text <- strip(tweets$Text)
tail(tweets)
#>                                                                                                                                                            Text
#> 24398 maaf ikut nimbrung berarti ini memang lagi maintenance ya kakpunya ku sama banking nya stuck di salam doang soalnya loudly crying face loudly crying face
#> 24399                                                                                                                                 bsi mobile belum bisa bos
#> 24400                                            min yang ditanya nasabah kapan bsi mobile kembali normal itu pertanyaannya tapi jawabannya malah ngolor ngidul
#> 24401                                                                                                                                            jawabannya sih
#> 24402       duh ini bsi sampai kapan gangguan nyadari kemarin enggak bisa apaapa semua transaksi enggak bisake bank nya semua cabang offline hadehh female sign
#> 24403                                                                                                                                lewat atm mandiri bisa kak
# Melakukan proses penghapusan terhadap teks yang memiliki duplikasi
tweets <- tweets %>%
  distinct()

# hasil tweets yang duplikasinya telah dihapus
nrow(tweets)
#> [1] 23712
# Melakukan stemming untuk mengubah kata-kata dalam teks menjadi bentuk dasar
library(SnowballC)
library(tm)
# Buat corpus dari teks
corpus <- Corpus(VectorSource(tweets))

# Fungsi untuk melakukan stemming
stemDocument <- function(doc) {
  # Tokenisasi dokumen
  words <- unlist(strsplit(as.character(doc), " "))
  
  # Lakukan stemming pada setiap kata
  stemmed_words <- wordStem(words, language = "id")
  
  # Gabungkan kata-kata yang sudah distemming
  stemmed_text <- paste(stemmed_words, collapse = " ")
  
  # Hasilkan dokumen yang sudah distemming
  PlainTextDocument(stemmed_text)
}

# Terapkan stemming pada corpus
corpus_stemmed <- tm_map(corpus, content_transformer(stemDocument))

# Hasilkan teks yang sudah distemming
stemmed_text <- sapply(corpus_stemmed, as.character)
# Mengelola kata-kata bahasa indonesia dengan stopword yang telah ada sambil memecah teks tersebut menjadi kata2 individual dan menghapus kata penghenti yang terdaftar pada data stopwords-id.txt
library(stopwords)
myStopwords <- readLines("data_input/stopwords-id.txt")
tweets <- as.character(tweets)
tweets <- tokenize_words(stemmed_text[1], stopwords = myStopwords)
# melakukan pengecekan class pada dataset yang telah selesai di cleansing
class(tweets)
#> [1] "list"

Visualisasi Exploratory Data Analysis

wordcloud(tweets$content[1:5000])

> pada visualisasi wordcloud, kata yang sering muncul dalam topik yakni BSI, Bank, Saldo, transaksi, blokir, lockbit, sistem, dll.

# Melakukan penyusunan kata yang muncul dengan DESC dari tiap kata dengan frekuensinya masing2
kata_kemunculan <- table(tweets)
kata_kemunculan_sorted <- sort(kata_kemunculan, decreasing = TRUE)
tweets_done <- data.frame(kata_kemunculan_sorted)
# menampilkan hasil frekuensi dari tiap katanya dengan DESC
head(tweets_done, 20)
#>      content Freq
#> 1        bsi 8791
#> 2       bank 6302
#> 3         ya 3878
#> 4       face 3775
#> 5        kak 3355
#> 6        nya 2256
#> 7        min 2212
#> 8      sampa 2201
#> 9        atm 2188
#> 10     saldo 1994
#> 11      paka 1817
#> 12    crying 1762
#> 13   syariah 1708
#> 14    mobile 1685
#> 15    loudly 1675
#> 16      kalo 1634
#> 17 transaksi 1560
#> 18  transfer 1440
#> 19       sih 1418
#> 20      uang 1418

Hasil Akhir Sementara

Jika diperhatikan kata yang sering muncul pada dataset tweets ini, setelah didapatkan topik apa yang paling banyak dibahas dalam kasus ransomeware bank bsi ini berdasarkan frekuensi kata yang sering muncul. Oleh karena itu, dalam proses EDA pada tahap ini nantinya bisa kita kembangkan pada saat pemodelan machine learning untuk mengetahui bobot dari tiap teksnya akan bersifat positif, negatif atau netral dengan model lexicon berdasarkan kata yang telah didapatkan dari proses cleansing. Saat label telah didapatkan kita dapat kembangkan kembali dengan metode model indoBERT untuk melakukan analisis sentimen yang lebih mendalam lagi dan melakukan pengklasifikasian teks yang baik berdasarkan label sentiment seperti klasifikasi topik. dan yang terakhir kita dapat kembangkan kembali pencarian topik yang lebih mendalam dengan model statistik bernama Latent Dirichlet Allocation (LDA).

Referensi

https://www.kaggle.com/datasets/bashirhanafi/bank-bsi-tweets-sentiment-24k-tweets

https://algotech.netlify.app/blog/text-cleaning-bahasa/

https://www.kaggle.com/datasets/yevonnaelandrew/iykra-odin

https://www.kaggle.com/code/divakartika/marahfess-topic-modelling-with-lda

https://www.kaggle.com/datasets/xuelingjun/stopwordsid

https://github.com/nurandi/katadasaR