Data Career Day (DCD) merupakan program career support algoritma yg dibuat untuk memfasilitasi alumni untuk mendapatkan kesempatan rekrutmen dari hiring partner melalui tahapan yang sudah disiapkan.
Pada Data Career Day, pada Business Mentor dan Technical Chaperone phase, akan diberikan penilaian. Adapun total poin yang bisa diperoleh pada Business Mentor (BM) phase adalah 40/40 yang akan didapat dari proposal project yang dihasilkan setelah mentoring dengan BM. Sedangkan, pada Technical Chaperone (TC) phase, akan diperoleh penialaian maksimal 60/60 yang akan didapat dari penilaian dashboard dan machine learning yang dihasilkan. Info detail mengenai timeline dan sheet penilaian dari Data Career Day 12.0 bisa diakses melalui link berikut DCD 12.0 Information.
LATAR BELAKANG (17 POIN)
PEMAHAMAN MASALAH (5 POIN)
PENGUMPULAN DATA (8 POIN)
PERSIAPAN DATA (10 POIN)
MACHINE LEARNING (25 POIN)
VISUALIZATION (20 POIN)
KESIMPULAN (7 POIN)
TINGKAT KESULITAN PROJECT (8 POIN)
Indonesia sendiri menjadi salah satu negara yang sebagian penduduknya telah melek teknologi. Hal ini tidak menutup kemungkinan bahwa teknologi modern telah masuk dan mempengaruhi peradaban pada daerah pelosok Indonesia sejak lama. Data dari Hotsuite pada tahun 2020-pun menunjukkan bahwa penggunaan koneksi mobile phone telah melampaui total populasi penduduk Indonesia sendiri.
Dari data di atas kita dapat melihat bahwa 64% penduduk Indonesia telah menggunakan dan mengakses internet. Selain itu tercatat sekitar 59% dari mereka aktif dalam bersosial media. Bisa kita lihat di sekitar lingkungan kita bahwa satu orang tidak hanya memiliki satu sosial media. Umumnya mereka mempunyai dan aktif pada 2 atau lebih social media. Tujuan penggunaannya pun beragam mulai dari mencari dan menjalin pertemanan, sharing ide dan hobi, iklan layanan dan produk, hingga penyebaran informasi lainnya.
Gambar di atas menunjukkan bahwa Youtube menjadi media sosial yang paling sering digunakan di Indonesia sebesar 88% disusul oleh Whatsapp, Facebook, Instagram dan media sosial lain dibawahnya. Hal ini tidak mengherankan karena semakin kesini semua bentuk informasi baik berupa tulisan, gambar, ataupun suara bisa disajikan dalam bentuk konten bergerak/video oleh seorang content creator Youtube ataupun pengguna youtube lainnya. Hal ini juga yang akhirnya membuka peluang penyebaran informasi dan berita anatar penduduk Indonesia bahkan bangsa lainnya di seluruh dunia.
Media sosial telah membawa dampak yang cukup besar dan signifikan terhadap perubahan cara berkomunikasi antar individu atau kelompok. Media ini cenderung lebih disukai karena terbilang sangat cepat dan murah dalam penyebaran infromasi dan berita dibandingkan dengan cara tradisional terdahulu misalnya media cetak dan sejenisnya. Salah satu implikasi dan pengaruh media sosial ini bisa kita lihat dengan semakin meningkatnya konsumsi informasi pada media sosial seperti Youtube, Twitter, Facebook, Whatsapp, dan sebagainya. Akan tetapi peningkatan konsumsi informasi ini juga mempengaruhi peningkatan penyebaran konten atau berita hoax pada media sosial tersebut.
Hoax sendiri mengacu pada isu-isu yang disebarkan dan mengandung informasi yang tidak relevan, bohong, dan beberapa diantaranya digunakan untuk menyerang individu, kelompok ataupun sebuah produk tertentu. Kebohongan ini jika tersebar luas tentunya akan merusak citra dan kredibilitas seseorang atau kelompok tertentu hingga menyebabkan keresahan dalam masyarakat, kerusuhan antar individu dan kelompok, bahkan memecah belah kerukunan antar umat beragama dan bangsa lainnya di seluruh dunia. Masalah besar yang bisa ditimbulkan oleh konten hoax ini sangat serius mengingat peran sosial media yang penting dalam mempengaruhi cara pandang seseorang di berbagai bidang. Contoh paling dekat yang bisa kita lihat adalah berita palsu yang memojokkan pasangan calon presiden saat akan diadakan pemilihan umum (Pemilu), penulisan berita oleh oknum yang tidak bertanggung jawab yang ditujukan untuk menyerang citra individu atau kelompok suku tertentu, informasi khasiat tumbuhan dan produk yang sering dibuat broadcast message di Whatsapp, clickbait judul konten di Youtube atau link iklan yang disisipkan pada badan berita yang mengarah ke website yang tidak jelas. Oleh karenanya, pendeteksian informasi atau berita hoax menjadi sesuatu yang harus dikritisi.
Project semacam ini sangatlah bermanfaat untuk dunia digital baik sebagai penyedia portal berita ataupun masyarakat luas dalam upaya pencegahan penyebaran berita hoax yang tidak bertanggung jawab. Bagi pelaku penyedia layanan berita, model machine learning yang dihasilkan nantinya dapat membantu memfilter mana berita yang termasuk hoax atau tidak. Sementara untuk masyarakat sendiri, mereka bisa berpartisipasi untuk melaporkan berita yang terindikasi hoax sebagai upaya pengurangan penyebaran hoax di masyarakat.
Untuk mengidentifikasi sebuah berita atau konten hoax kita bisa menganalisis satu persatu dari berita tersebut dan menilai apakah berita tersebut mengandung unsur/indikator hoax atau tidak. Metode berfikir kritis bisa dimanfaatkan oleh manusia untuk menyelesaikan permasalahan ini. Masalahnya, berita atau konten tersebut menyebar sangat cepat dan memungkinkan individu lain untuk mengembangkan dan memodifikasi menjadi versi baru dari informasi yang ada sehingga kuantitas dari konten yang dihasilkan akan bertambah dan target pembaca juga semakin meluas. Artinya, kapasitas kita dalam menyelesaikan masalah ini dengan metode berfikir kritis saja tidaklah cukup. Selain itu beberapa pertimbangan lainnya adalah teknik analisis yang dilakukan oleh manusia bersifat “post event analysis” atau analisis yang dilakukan setelah konten-konten hoax tersebut muncul dan bahkan menjadi viral.
Pencegahan penyebaran berita hoax dapat dilakukan dengan identifikasi berita atau konten sosial sedini mungkin sebelum berita hoax tersebut viral di masyarakat. Oleh karena itu, pada project ini akan dikembangkan sebuah model klasifikasi untuk mengidentifikasi apakah sebuah informasi berupa tulisan pada media sosial Twitter mengandung informasi hoax atau tidak.
Pada project ini akan digunakan sebuah data berita yang ada pada sosial media Twitter yang diambil dari situs Kaggle dengan judul “Indonesia False News(Hoax) Dataset”. Dataset ini mengandung informasi sebagai berikut:
ID
: id kontenlabel
: label berita (0 tidak hoax, 1 hoax)tanggal
: tanggal konten atau berita dimuatjudul
: judul beritanarasi
: deskripsi berita yang dimuatnama file gambar
: judul tautan dari gambar yang dimuatSelanjutnya, kebutuhan pembuatan model machine learning untuk mengidentifikasi apakah berita atau konten tersebut hoax atau tidak hanya akan menggunakan variabel label sebagai kelas identitas dan variabel narasi yang akan diekstrak lebih lanjut agar lebih mendukung dan mempermudah pemodelan.
Sedangkan modelnya sendiri akan dibuat sebuah model klasifikasi dengan memanfaatkan algoritma Naive Bayes dan Random Forest.
Output dari project ini berupa dashboard analysis yang menampilkan Exploratory Data untuk menunjukkan kata-kata yang menyebabkan sebuah berita berpotensi untuk digolongkan sebagai sebuah informasi hoax atau bukan. Selain itu, user juga dapat menginputkan file berita baru yang nantinya oleh model akan diidentifikasi sebagai berita hoax/bukan.
Business Impact: Selain identifikasi pada sosial media Twitter, project ini bisa dikembangkan untuk mendeteksi dini berita hoax pada soial media lainnya termasuk portal berita atau website lainnya agar informasi yang disajikan lebih berkualitas dan dari segi pembacapun bisa mengenali lebih cepat informasi yang didapat agar tidak salah kaprah ke depannya. Selain mengidentifikasi tulisan, project ini dapat dikembangkan lebih lanjut untuk mengidentifikasi sebuah konten berita yang bukan hanya dilihat atau dipertimbangkan dari segi tulisan namun bisa dalam bentuk pindaian gambar atau sejenisnya.
Exploratory Data Analysis
Membaca Data
library(tidyverse)
library(stringi)
library(katadasaR)
library(tokenizers)
library(wordcloud)
library(tidytext)
<- read_csv("data_input/Data Latih BDC.csv")
data head(data)
## # A tibble: 6 x 6
## ID label tanggal judul narasi `nama file gamb~
## <dbl> <dbl> <chr> <chr> <chr> <chr>
## 1 71 1 17-Aug-~ Pemakaian Masker M~ "A caller to a radi~ 71.jpg
## 2 461 1 17-Jul-~ Instruksi Gubernur~ "Yth.Seluruh Anggot~ 461.png
## 3 495 1 13-Jul-~ Foto Jim Rohn: Jok~ "Jokowi adalah pres~ 495.png
## 4 550 1 8-Jul-20 ini bukan politik,~ "Maaf Mas2 dan Mbak~ 550.png
## 5 681 1 24-Jun-~ Foto Kadrun kalo l~ "Kadrun kalo lihat ~ 681.jpg
## 6 736 1 17-Jun-~ event promo smartp~ "selamat siang tema~ 736.png
Deskripsi data:
ID
: id kontenlabel
: label berita (0 tidak hoax, 1 hoax)tanggal
: tanggal konten atau berita dimuatjudul
: judul beritanarasi
: deskripsi berita yang dimuatnama file gambar
: judul tautan dari gambar yang dimuatPada pemodelan nantinya kita hanya akan membutuhkan variabel narasi dan label saja. Variabel narasi sendiri masih terdiri dari string teks panjang yang nantinya akan kita olah terlebih dahulu sebelum masuk ke tahap exploratory data ataupun pemodelan machine learning.
dim(data)
## [1] 4231 6
<- data %>%
data mutate(label = as.factor(case_when(label == 1 ~ "Hoax",
TRUE ~ "Tidak Hoax")))
Dalam pengolahan data teks, teksntunya ada sedikit perbedaan dasar dalam mempersiapkan data yang akan dianalisis. Berbeda sedikit dengan pengolahan data biasa(raw data), pengolahan data teks membutuhkan beberapa proses seperti berikut:
Mengubah semua karakter string kata ke format huruf kecil semua (lowercase) Hal ini bertujuan agar kata yang sama memiliki makna yang sama pula. Contoh, kata dinas, Dinas, dan DINAS dianggap 3 kata yang berbeda karena format penulisannya menggunakan huruf kecil, campuran huruf kecil dan besar, serta huruf besar semua. Agar memiliki makna yang sama(dinas=Dinas=DINAS) maka kita akan menyeragamkan penulisannya menjadi lowercase.
%>%
data select(narasi) %>%
mutate(narasi = str_to_lower(narasi))
## # A tibble: 4,231 x 1
## narasi
## <chr>
## 1 "a caller to a radio talk show recently shared that his wife was hospitalize~
## 2 "yth.seluruh anggota grup sesuai instruksi gubernur jawa tengah hasil rapat ~
## 3 "jokowi adalah presiden terbaik dlm sejarah bangsa indonesia. jim rohn, moti~
## 4 "maaf mas2 dan mbak2, ini bukan politik, tapi kenyataan pak jokowi berhasil ~
## 5 "kadrun kalo lihat foto ini panas dingin . ."
## 6 "selamat siang teman teman fb ku semuanya\U0001f929,cuman mau memberi inform~
## 7 "lihatlah mereka sudah mempersiapkan diri dengan baik untuk menguasai negri ~
## 8 "italia punya fasilitas perawatan kesehatan tercanggih tapi semuanya gagal m~
## 9 "polisi goblok. bukanya cpet” d tolongin malah d liati aja"
## 10 "polisi china telah menganiaya wanita uighur lehernya di cekik pake kaki ,me~
## # ... with 4,221 more rows
Menghapus angka Tujuannya adalah untuk menghapus angka karena karakter ini tidak dibutuhkan dalam analisis teks selanjutnya.
%>%
data select(narasi) %>%
mutate(narasi = str_to_lower(narasi),
narasi = str_replace_all(narasi, pattern = "[:digit:]", replacement = " "))
## # A tibble: 4,231 x 1
## narasi
## <chr>
## 1 "a caller to a radio talk show recently shared that his wife was hospitalize~
## 2 "yth.seluruh anggota grup sesuai instruksi gubernur jawa tengah hasil rapat ~
## 3 "jokowi adalah presiden terbaik dlm sejarah bangsa indonesia. jim rohn, moti~
## 4 "maaf mas dan mbak , ini bukan politik, tapi kenyataan pak jokowi berhasil ~
## 5 "kadrun kalo lihat foto ini panas dingin . ."
## 6 "selamat siang teman teman fb ku semuanya\U0001f929,cuman mau memberi inform~
## 7 "lihatlah mereka sudah mempersiapkan diri dengan baik untuk menguasai negri ~
## 8 "italia punya fasilitas perawatan kesehatan tercanggih tapi semuanya gagal m~
## 9 "polisi goblok. bukanya cpet” d tolongin malah d liati aja"
## 10 "polisi china telah menganiaya wanita uighur lehernya di cekik pake kaki ,me~
## # ... with 4,221 more rows
Punctuation atau tanda baca juga menjadi unsur yang harus dihapus selain angka. Tujuannya sama yaitu karena karakter ini tidak memiliki pengaruh dan tidak akan digunakan pada analisis selanjutnya.
%>%
data select(narasi) %>%
mutate(narasi = str_to_lower(narasi),
narasi = str_replace_all(narasi, pattern = "[:digit:]", replacement = " "),
narasi = str_replace_all(narasi, pattern = "[:punct:]", replacement = " "),
narasi = stri_replace_all_charclass(narasi, pattern = "\\p{WHITE_SPACE}",
" "))
## # A tibble: 4,231 x 1
## narasi
## <chr>
## 1 "a caller to a radio talk show recently shared that his wife was hospitalize~
## 2 "yth seluruh anggota grup sesuai instruksi gubernur jawa tengah hasil rapat ~
## 3 "jokowi adalah presiden terbaik dlm sejarah bangsa indonesia jim rohn moti~
## 4 "maaf mas dan mbak ini bukan politik tapi kenyataan pak jokowi berhasil ~
## 5 "kadrun kalo lihat foto ini panas dingin "
## 6 "selamat siang teman teman fb ku semuanya\U0001f929 cuman mau memberi inform~
## 7 "lihatlah mereka sudah mempersiapkan diri dengan baik untuk menguasai negri ~
## 8 "italia punya fasilitas perawatan kesehatan tercanggih tapi semuanya gagal m~
## 9 "polisi goblok bukanya cpet d tolongin malah d liati aja"
## 10 "polisi china telah menganiaya wanita uighur lehernya di cekik pake kaki me~
## # ... with 4,221 more rows
Melakukan Stemming Stemming adalah proses mengubah kata berimbuhan menjadi kata dasar.
<- function(x){
stemming paste0(map_chr(x,katadasar), collapse = " ")}
%>%
data mutate(narasi = str_to_lower(narasi),
narasi = str_replace_all(narasi, pattern = "[:digit:]", replacement = " "),
narasi = str_replace_all(narasi, pattern = "[:punct:]", replacement = " "),
narasi = stri_replace_all_charclass(narasi, pattern = "\\p{WHITE_SPACE}",
" "),
narasi = map_chr(tokenize_words(narasi), .f = stemming))
Stopword merupakan kata yang diabaikan dalam pemrosesan teks, kata-kata ini biasanya disimpan ke dalam stop lists.Proses ini dilakukan dengan tujuan untuk menghapus kata yang mempunyai frekuensi kemunculan yang tinggi misalnya kata penghubung seperti “dan”, “atau”, “tapi”, “akan” dan lain sebagainya.
<- read.delim("stopwords-id.txt", header = 0)
stopwords_id <- stopwords_id %>%
stopwords_id rename(word = V1)
%>%
data mutate(narasi = str_to_lower(narasi),
narasi = str_replace_all(narasi, pattern = "[:digit:]", replacement = " "),
narasi = str_replace_all(narasi, pattern = "[:punct:]", replacement = " "),
narasi = stri_replace_all_charclass(narasi, pattern = "\\p{WHITE_SPACE}",
" "),
narasi = map_chr(tokenize_words(narasi), .f = stemming)) %>%
unnest_tokens(word, narasi) %>%
anti_join(stopwords_id)
## # A tibble: 78,032 x 6
## ID label tanggal judul `nama file gamba~ word
## <dbl> <dbl> <chr> <chr> <chr> <chr>
## 1 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg a
## 2 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg caller
## 3 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg to
## 4 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg a
## 5 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg radio
## 6 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg talk
## 7 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg show
## 8 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg recen~
## 9 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg shared
## 10 71 1 17-Aug-20 Pemakaian Masker Menyebabkan ~ 71.jpg that
## # ... with 78,022 more rows
Proporsi kelas narasi
%>%
data ggplot(aes(x = label)) +
geom_bar()
Dari bar plot di atas, kita dapat melihat bahwa proporsi berita yang hoax lebih besar daripada berita yang tidak hoax. Insight ini nantinya bisa kita gunakan sebagai pertimbangan untuk menambah data dengan kelas bukan hoax jika hasil pemodelan jelek karena faktor kelas data yang tidak seimbang.
Selain melihat proporsi kelas, kita juga bisa melihat distribusi dari jumlah karakter setiap berita yang akan diolah. Jika dilihat dari histogram di bawah ini, rata-rata karakter pada setiap berita sekitar 0-200 karakter.
%>%
data mutate(length_char = nchar(narasi)) %>%
ggplot(aes(x = length_char)) +
geom_histogram(bins = 10) +
scale_x_continuous(limits = c(0, 1200), breaks = c(0,200, 400, 600, 800, 1000,1200))
Kita juga bisa melihat rata-rata jumlah kata pada setiap kalimat yang ada pada sebuah narasi berita. Plot di bawah ini menunjukkan rata-rata jumlah kata pada setiap kalimat berkisar antara 3 sampai dengan 9 kata.
%>%
data mutate(length_words = as.numeric(map_chr(str_split(narasi, pattern = " "),
.f = length))) %>%
ggplot(aes(x = length_words)) +
geom_histogram(bins = 30)
Sederhananya, wordcloud adalah gambar yang menunjukkan daftar kata-kata yang digunakan dalam sebuah teks, umumnya semakin banyak kata yang digunakan semakin besar ukuran kata tersebut dalam gambar. Pada visualisasi di bawah ini, akan ditampilkan wordcloud untuk data dari kelas poitif dan negatif.
%>%
data_baru filter(label == 1) %>%
unnest_tokens(word, narasi) %>%
anti_join(stopwords_id) %>%
count(word, sort = TRUE) %>%
with(wordcloud(word, n, max.words = 100))
Pada kelas positif(hoax), beberapa kata yang sering muncul adalah orang, tidak, indonesia, jokowi, negara, china, semua, orang, dan lain sebagainya. Bagaimana dengan kemunculan kata di kelas negatif?
%>%
data_baru filter(label == 0) %>%
unnest_tokens(word, narasi) %>%
anti_join(stopwords_id) %>%
count(word, sort = TRUE) %>%
with(wordcloud(word, n, max.words = 100))
Pada kelas negatif(tidak hoax), kata yang paling sering muncul adalah tidak, indonesia, hoax, berita, foto, dan lain sebagainya. Jika diperhatikan kata yang sering muncul pada kelas positif dan kelas negatif hampir mirip. Oleh karena itu, proses EDA pada tahap ini nantinya bisa dikembangkan pada saat pemodelan untuk mengetahui kata apa yang memiliki bobot tinggi sehingga bisa dikatakan sebagai informasi hoax/bukan hoax.