Background

Penggunaan media sosial menjadi semakin lazim di setiap kelompok umur, sebagian besar para pengguna media sosial mengandalkan media penting ini untuk komunikasi sehari-hari. Selain manfaatnya, media sosial juga memiliki sisi buruknya/yang tidak bermanfaat yakni salah satunya ialah cyberbullying. Cyberbullying dapat secara efektif memengaruhi siapapun, kapan saja dan dimana saja. Internet membuat serangan cyberbullying lebih sulit dihentikan daripada bullying secara langsung.

Pada tanggal 15 April 2020, UNICEF mengeluarkan peringatan sebagai tanggapan terhadap peningkatan cyberbullying selama pandemi COVID-19 karena penutupan sekolah yang meluas, peningkatan kegiatan didalam rumah dan internet, dan penurunan interaksi sosial secara tatap muka. Statistik menunjukan bahwa cyberbullying ini benar-benar mengkhawatirkan. Karena sekitar 36,5% siswa SMP dan SMA pernah merasakan cyberbullying dan 87% hanya mengamati cyberbullying tanpa ikut mendukung pembelaan atau ikut campur dalam pembulian yang terjadi, cyberbullying ini dapat memberikan efek negatif bagi korban seperti menurunannya prestasi akademik hingga depresi dan sampai berpikiran untuk mengakhiri hidupnya karena cyberbullying ini.

Mengingat semua ini, kumpulan data ini berisi lebih dari 47.000 cuitan tweet yang diberi label menurut kelasnya:

  1. Age
  2. Ethnicity
  3. Gender
  4. Religion
  5. Other type of cyberbullying
  6. Not cyberbullying

Data telah diseimbangkan ~8000 dari tiap kelasnya

Problem Statement

Untuk mengidentifikasi sebuah analisis banyaknya cyberbullying terjadi di twitter berdasarkan kelasnya dan mengidentifikasi unsur kata apa saja yang paling sering termasuk dalam konteks cyberbullying.

Project Idea

Pencegahan kata-kata apa saja yang mengandung unsur cyberbullying dan tipe apa saja orang-orang cenderung melakukan cyberbullying karena alasan apa. Oleh karena itu, pada project ini akan dikembangkan sebuah model klasifikasi untuk mengidentifikasi apakah sebuah komentar di twitter cenderung lebih banyak dalam tipe kelas cyberbullying tertentu dan mencari tahu informasi kata yang sering digunakan seseorang dalam melakukan cyberbullying.

Problem Scope

Pada project ini akan digunakan sebuah data komentar-komentar di twitter yang diambil dari situs kaggle dengan judul “Cyberbullying Classification”. Dataset ini mengandung informasi sebagai berikut:

  • tweet_txt : Komentar Twitter
  • cyberbullying_type : Tipe Cyberbullying

Selanjutnya, kebutuhan pembuatan model machine learning untuk mengidentifikasi apakah komentar tersebut lebih banyak cenderung pada tipe cyberbullying dengan kategori tertentu, saya makan membuat sebuah model klasifikasi dengan RandomForest dan Naive Bayes. Sedangkan untuk mengidentifikasi apakah komentar tersebut termasuk dalam cyberbullying atau bukan, saya akan menggunakan sebuah model klasifikasi berupa Text Mining.

Output

Output dari project ini berupa dashboard analysis yang menampilkan Exploratory Data untuk menunjukkan kata-kata dalam sebuah komentar yang menyebabkan sebuah komentar twitter berpotensi untuk dikategorikan sebagai sebuah tindakan cyberbullying atau bukan.

Business Impact

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

  1. Pencegahan dan Kesadaran: Dengan mengidentifikasi unsur kata yang paling sering terlibat dalam konteks cyberbullying, kita dapat membantu meningkatkan kesadaran tentang kata-kata yang sebaiknya dihindari atau tidak digunakan dalam komunikasi di platform media sosial. Ini dapat membantu mencegah insiden cyberbullying lebih lanjut dan menciptakan lingkungan online yang lebih aman.

  2. Perangkat Pendukung: Model klasifikasi yang dikembangkan dapat diintegrasikan ke dalam platform media sosial atau aplikasi untuk memantau dan mengidentifikasi konten yang berpotensi mencakup cyberbullying. Ini dapat membantu perusahaan media sosial dan platform online untuk mengambil tindakan lebih cepat dalam mengatasi masalah ini.

  3. Kebijakan Anti-Cyberbullying: Analisis data dapat memberikan wawasan tentang jenis kelompok atau topik yang paling rentan terhadap cyberbullying. Dengan pemahaman ini, organisasi atau pihak berwenang dapat merancang kebijakan anti-cyberbullying yang lebih efektif dan bertarget.

  4. Pendidikan dan Sosialisasi: Hasil analisis dapat digunakan untuk menciptakan program pendidikan dan sosialisasi bagi para pengguna media sosial, terutama siswa dan remaja. Program ini dapat membantu mereka memahami dampak negatif dari cyberbullying dan cara-cara untuk menghindarinya.

  5. Kemitraan dengan Lembaga Terkait: Hasil analisis dan pemahaman tentang cyberbullying dapat membantu kita bermitra dengan lembaga pemerintah atau lembaga nirlaba yang peduli dengan isu-isu sosial. Ini dapat meningkatkan profil perusahaan dan mencerminkan komitmen pada isu-isu penting.

  6. Reputasi Perusahaan: Dengan mengambil langkah-langkah untuk mengatasi cyberbullying, kita dapat meningkatkan reputasi perusahaan sebagai perusahaan yang peduli dan bertanggung jawab secara sosial. Ini dapat menarik pelanggan yang memiliki sensitivitas terhadap isu-isu sosial.

  7. Data untuk Penelitian: Dataset yang dihasilkan dari proyek ini dapat digunakan sebagai bahan untuk penelitian lebih lanjut tentang cyberbullying dan perilaku online. Dengan berkontribusi pada pemahaman ilmiah tentang isu ini, perusahaan Anda dapat mengambil peran dalam penyebaran pengetahuan.

Dalam keseluruhan, proyek ini dapat memberikan dampak positif dalam membentuk perilaku online yang lebih etis dan mengurangi dampak negatif dari cyberbullying di platform media sosial.

Library

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tm)
## Warning: package 'tm' was built under R version 4.2.3
## Loading required package: NLP
library(SnowballC)
## Warning: package 'SnowballC' was built under R version 4.2.3
library(e1071)
## Warning: package 'e1071' was built under R version 4.2.3
library(caret)
## Warning: package 'caret' was built under R version 4.2.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'package:NLP':
## 
##     annotate
## Loading required package: lattice
library(tokenizers)
## Warning: package 'tokenizers' was built under R version 4.2.3
library(wordcloud)
## Warning: package 'wordcloud' was built under R version 4.2.3
## Loading required package: RColorBrewer
library(tidytext)
## Warning: package 'tidytext' was built under R version 4.2.3
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ✔ readr     2.1.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::annotate() masks NLP::annotate()
## ✖ dplyr::filter()     masks stats::filter()
## ✖ dplyr::lag()        masks stats::lag()
## ✖ purrr::lift()       masks caret::lift()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(stringi)

Exploratory Data Analysis

data <- read.csv("data_input/cyberbullying_tweets.csv")
head(data)
##                                                                                                                            tweet_text
## 1                                                                       In other words #katandandre, your food was crapilicious! #mkr
## 2                 Why is #aussietv so white? #MKR #theblock #ImACelebrityAU #today #sunrise #studio10 #Neighbours #WonderlandTen #etc
## 3                                                                        @XochitlSuckkks a classy whore? Or more red velvet cupcakes?
## 4                             @Jason_Gio meh. :P  thanks for the heads up, but not too concerned about another angry dude on twitter.
## 5                             @RudhoeEnglish This is an ISIS account pretending to be a Kurdish account.  Like Islam, it is all lies.
## 6 @Raja5aab @Quickieleaks Yes, the test of god is that good or bad or indifferent or weird or whatever, it all proves gods existence.
##   cyberbullying_type
## 1  not_cyberbullying
## 2  not_cyberbullying
## 3  not_cyberbullying
## 4  not_cyberbullying
## 5  not_cyberbullying
## 6  not_cyberbullying
dim(data)
## [1] 47692     2
unique(data$cyberbullying_type)
## [1] "not_cyberbullying"   "gender"              "religion"           
## [4] "other_cyberbullying" "age"                 "ethnicity"

Pada data twitter terdapat 5 kategori cyberbullying type yang salah satunya termasuk kedalam observasi “not_cyberbullying”. Kita akan melakukan pengolahan kembali dengan menambahkan label tambahan berupa kategori cyberbullying dan no_cyberbullying dengan nama kolom [cyberbullying_true].

Persiapan Data

# Mengubah tipe data kolom cyberbullying_type
data$cyberbullying_type <- as.factor(data$cyberbullying_type)

# Menambahkan kolom cyberbullying_true
data <- data %>%
  mutate(cyberbullying_true = ifelse(cyberbullying_type == "not_cyberbullying", 0, 1))

# Mengubah tipe data cyberbullying_true
data$cyberbullying_true <- as.factor(data$cyberbullying_true)

Mengubah terlebih dahulu semua karakter string kata kedalam format huruf kecil agar kata yang sama memiliki makna yang sama pula. Contoh seperti kata Nasi, nasi dan NASI dianggap 3 kata yang berbeda karena format penulisannya menggunakan huruf kecil, campuran dan huruf kapital semua. Agar memiliki makna yang sama, kita akan membuat semuanya menjadi penulisan dengan huruf kecil (lowercase).

# Lowercase
datatext <- data %>%
  select(tweet_text) %>%
  mutate(tweet_text = str_to_lower(tweet_text))

Menghapus beberapa karakter yang tidak diperlukan dalam analisis teks seperti angka, @, #, :, =

# Menghapus angka-angka
datatext <- data %>%
  select(tweet_text) %>%
  mutate(tweet_text = str_replace_all(tweet_text, pattern = "[:digit:]", replacement = " "))
# Menghapus tanda baca dan white space
datatext <- data %>%
  select(tweet_text) %>%
  mutate(tweet_text = str_replace_all(tweet_text, pattern = "[:digit:]", replacement = " "))
# Fungsi untuk menghapus karakter khusus
remove_special_chars <- function(text) {
  cleaned_text <- gsub("[^[:alnum:] ]", "", text)
  return(cleaned_text)
}

# Menghapus karakter khusus dari setiap teks dalam data observasi
datatext$tweet_text <- sapply(datatext$tweet_text, remove_special_chars)
# Memasukan datatext ke data
data$tweet_text <- datatext$tweet_text
head(data)
##                                                                                                                       tweet_text
## 1                                                                      In other words katandandre your food was crapilicious mkr
## 2                       Why is aussietv so white MKR theblock ImACelebrityAU today sunrise studio   Neighbours WonderlandTen etc
## 3                                                                      XochitlSuckkks a classy whore Or more red velvet cupcakes
## 4                              JasonGio meh P  thanks for the heads up but not too concerned about another angry dude on twitter
## 5                            RudhoeEnglish This is an ISIS account pretending to be a Kurdish account  Like Islam it is all lies
## 6 Raja aab Quickieleaks Yes the test of god is that good or bad or indifferent or weird or whatever it all proves gods existence
##   cyberbullying_type cyberbullying_true
## 1  not_cyberbullying                  0
## 2  not_cyberbullying                  0
## 3  not_cyberbullying                  0
## 4  not_cyberbullying                  0
## 5  not_cyberbullying                  0
## 6  not_cyberbullying                  0

Melakukan Stemming untuk mengubah kata berimbuhan menjadi kata dasar.

Menghapus stopword agar melakukan proses kata yang akan diabaikan dalam pemrosesan teks, kata-kata ini biasanya disimpan ke dalam stop lists.

# Fungsi untuk melakukan stemming pada teks
stemming <- function(x) {
  words <- unlist(strsplit(x, " "))  # Memecah teks menjadi kata-kata
  stemmed_words <- wordStem(words, language = "en")  # Melakukan stemming
  stemmed_text <- paste(stemmed_words, collapse = " ")  # Menggabungkan kembali kata-kata
  return(stemmed_text)
}

# Fungsi stopword/Data stopwords
stopwords_en <- stopwords("en")

# Fungsi untuk menghapus stopwords dalam bahasa Inggris
remove_stopwords <- function(text) {
  # Memecah teks menjadi kata-kata
  words <- unlist(strsplit(text, " "))
  
  # Menghapus stopwords
  filtered_words <- words[!tolower(words) %in% stopwords_en]
  
  # Menggabungkan kembali kata-kata
  cleaned_text <- paste(filtered_words, collapse = " ")
  
  return(cleaned_text)
}

# Terapkan pada data
data <- data %>%
  mutate(tweet_text_stemmed = map_chr(tweet_text, .f = stemming)) %>% 
  unnest_tokens(word, tweet_text_stemmed) %>% 
  anti_join(data.frame(word = stopwords_en), by = "word")

Visualisasi Exploratory Data Analysis

# Proporsi kelas cyberbullying[1] dan bukan cyberbullying[0]
data %>% 
  ggplot(aes(x = cyberbullying_true)) +
  geom_bar()

> Dari barplot diatas, kita dapat melihat bahwa proporsi komentar yang melakukan cyberbullying lebih banyak daripada yang tidak melakukan, yakni komentar yang mengandung unsur cyberbullying ada sebanyak 40.000 dan tidak mengandung unsur cyberbullying sebanyak -+ 8000.

Wordcloud

Untuk menunjukkan daftar kata-kata yang digunakan dalam sebuah teks. Semakin banyak kata yang digunakan semakin besar ukuran kata tersebut dalam visualisasi gambar.

data %>%
  filter(cyberbullying_true == 1) %>%
  unnest_tokens(word, tweet_text) %>%
  anti_join(data.frame(word = stopwords_en), by = "word") %>%
  count(word, sort = TRUE) %>%
  with(wordcloud(word, n, max.words = 200, scale = c(5, 1), min.freq = 3))

> Terlihat pada visualisasi, beberapa kata yang sering muncul pada cyberbullying(kelas true/1) ada pada kata : fucking, racism, isis, muslims, racism, negro dan lain sebagainya.

data %>%
  filter(cyberbullying_true == 0) %>%
  unnest_tokens(word, tweet_text) %>%
  anti_join(data.frame(word = stopwords_en), by = "word") %>%
  count(word, sort = TRUE) %>%
  with(wordcloud(word, n, max.words = 200, scale = c(5, 1), min.freq = 3))

> Terlihat pada visualisasi, beberapa kata yang sering muncul pada not_cyberbullying(kelas false/0) ada pada kata : bully, isis, like dan lain sebagainya.

Hasil Akhir Sementara

Jika diperhatikan kata yang sering muncul pada kelas positif dan kelas negatif hampir mirip. Oleh karena itu, dalam proses EDA pada tahap ini nantinya bisa kita kembangkan pada saat pemodelan machine learning untuk mengetahui kata apa yang memiliki bobot tinggi sehingga bisa dikatakan sebagai informasi cyberbullying dan not_cyberbullying.

Referensi

Kaggle : https://www.kaggle.com/datasets/andrewmvd/cyberbullying-classification?resource=download