Dalam era ekonomi digital, data menjadi aset strategis untuk mendorong inovasi dan pengambilan keputusan berbasis bukti. Namun, sebagian besar data tersedia dalam bentuk tak terstruktur, seperti ulasan pelanggan dan posting media sosial, yang memerlukan proses pembersihan untuk dapat dianalisis secara efektif.
Sesi ini bertujuan membekali mahasiswa dengan pemahaman dan keterampilan praktis dalam membersihkan data tak terstruktur menggunakan R. Proses ini krusial untuk menghasilkan data yang akurat, dapat diandalkan, dan siap dianalisis, sehingga mendukung transformasi digital yang efektif (Yarrow, 2024; Racickas, 2024).
Dengan data bersih, organisasi dapat mengidentifikasi pola tersembunyi, mengurangi kompleksitas, dan mempercepat pengambilan keputusan strategis. Oleh karena itu, sesi ini memberikan fondasi penting dalam siklus ilmu data modern.
Data cleaning merupakan tahapan awal yang esensial dalam analisis data, untuk menjamin kualitas, akurasi, dan konsistensi data (Saeed, 2025). Proses ini mencakup:
Tanpa pembersihan yang tepat, analisis dapat menyesatkan, menghasilkan model prediktif yang tidak akurat dan keputusan yang salah. Data yang bersih mendukung hasil analitik yang valid dan efisien, serta meningkatkan performa model machine learning.
Data cleaning bukan proses terpisah, melainkan bagian integral dari seluruh siklus analitik—dilakukan secara iteratif sejak eksplorasi awal hingga interpretasi hasil. Dengan demikian, investasi dalam data cleaning mendukung keputusan berbasis data yang lebih tepat (Manuraj, 2024).
Di era digital, data sering kali tidak langsung siap dianalisis karena mengandung kesalahan, duplikasi, atau ketidakkonsistenan. Proses data cleaning menjadi tahap awal yang penting untuk memastikan kualitas data yang tinggi.
Modul ini bertujuan membekali peserta dengan pemahaman dan keterampilan praktis dalam membersihkan data, baik terstruktur maupun tak terstruktur. Peserta akan mempelajari teknik identifikasi dan perbaikan masalah umum pada dataset menggunakan R.
Setelah mengikuti modul ini, peserta mampu:
Memahami perbedaan data terstruktur vs. tak terstruktur.
Mengoperasikan R dan RStudio untuk manipulasi data.
Menerapkan teknik data cleaning dengan readr
,
stringr
, tidyr
, dan
dplyr
.
Bekerja kolaboratif menyusun alur cleaning berbasis studi kasus nyata.
Pembelajaran ini menjadi fondasi penting untuk analisis data yang akurat dan keputusan berbasis data yang lebih tepat.
Data dalam dunia digital dapat diklasifikasikan menjadi dua kategori utama: data terstruktur dan data tidak terstruktur. Memahami perbedaan antara keduanya sangat penting dalam pengelolaan dan analisis data yang efektif.
Data terstruktur adalah data yang disusun dalam format yang telah ditentukan sebelumnya, seperti tabel dengan baris dan kolom. Setiap entri data memiliki atribut yang konsisten, seperti nama, tanggal, atau angka, yang memungkinkan data ini mudah disimpan, dicari, dan dianalisis menggunakan alat seperti SQL. Contoh umum dari data terstruktur meliputi database pelanggan, catatan transaksi keuangan, dan inventaris produk. Contoh data terstruktur
Nama | Usia | Kota | Pendapatan |
---|---|---|---|
Andi | 28 | Jakarta | Rp 10.000.000 |
Budi | 34 | Bandung | Rp 12.500.000 |
Citra | 25 | Surabaya | Rp 9.000.000 |
Dewi | 40 | Jakarta | Rp 15.000.000 |
Sebaliknya, data tidak terstruktur tidak memiliki format atau model yang telah ditentukan sebelumnya. Data ini mencakup berbagai jenis informasi seperti teks bebas, gambar, video, dan audio. Karena tidak memiliki struktur yang konsisten, data tidak terstruktur lebih sulit untuk disimpan dan dianalisis menggunakan metode tradisional. Contoh dari data tidak terstruktur termasuk email, postingan media sosial, dan rekaman suara
Contoh data tidak terstruktur
“Andi tinggal di Jakarta dan berusia 28 tahun. Ia memiliki pendapatan sekitar Rp 10 juta per bulan. Budi adalah seorang warga Bandung yang berumur 34 tahun. Gajinya mencapai Rp 12.500.000 tiap bulan. Citra, 25 tahun, menetap di Surabaya dan mendapatkan penghasilan Rp 9.000.000. Dewi berasal dari Jakarta. Usianya 40 tahun dengan pendapatan bulanan sekitar Rp 15 juta.”
Data semi-terstruktur adalah jenis data yang tidak disimpan dalam format tabel seperti data terstruktur, tetapi tetap memiliki elemen-elemen yang mengandung tag atau penanda untuk memisahkan informasi sehingga struktur datanya masih bisa dikenali dan dianalisis.
Contoh umum:
File XML, JSON
Log aktivitas dengan pola tertentu
Metadata pada file multimedia
Data semi-terstruktur berada di antara data terstruktur (misalnya tabel) dan data tidak terstruktur (misalnya teks bebas), karena meskipun tidak tersusun rapi seperti tabel, informasi dalam data ini tetap bisa dipetakan menjadi elemen-elemen yang terorganisir.
Contoh data semi terstruktur
[ { “nama”: “Andi”, “usia”: 28, “kota”: “Jakarta”, “pendapatan”: “Rp 10.000.000” }, { “nama”: “Budi”, “usia”: 34, “kota”: “Bandung”, “pendapatan”: “Rp 12.500.000” }, { “nama”: “Citra”, “usia”: 25, “kota”: “Surabaya”, “pendapatan”: “Rp 9.000.000” }, { “nama”: “Dewi”, “usia”: 40, “kota”: “Jakarta”, “pendapatan”: “Rp 15.000.000” }]
# Load package
library(jsonlite)
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
# Simpan contoh JSON ke file (atau bisa langsung dari URL)
json_text <- '
[
{
"nama": "Andi",
"usia": 28,
"kota": "Jakarta",
"pendapatan": "Rp 10.000.000"
},
{
"nama": "Budi",
"usia": 34,
"kota": "Bandung",
"pendapatan": "Rp 12.500.000"
},
{
"nama": "Citra",
"usia": 25,
"kota": "Surabaya",
"pendapatan": "Rp 9.000.000"
},
{
"nama": "Dewi",
"usia": 40,
"kota": "Jakarta",
"pendapatan": "Rp 15.000.000"
}
]
'
# Parse JSON menjadi data.frame
data <- fromJSON(json_text)
# Lihat hasil
print(data)
## nama usia kota pendapatan
## 1 Andi 28 Jakarta Rp 10.000.000
## 2 Budi 34 Bandung Rp 12.500.000
## 3 Citra 25 Surabaya Rp 9.000.000
## 4 Dewi 40 Jakarta Rp 15.000.000
Berikut adalah tabel perbedaan utama antara data terstruktur dan data tidak terstruktur:
Aspek | Data Terstruktur | Data Semi-Terstruktur | Data Tidak Terstruktur |
---|---|---|---|
Definisi | Data yang disusun dalam format tetap, seperti tabel dengan baris dan kolom. | Data yang tidak sepenuhnya terstruktur, tetapi memiliki elemen penanda atau skema yang dikenali. | Data yang tidak memiliki format atau struktur yang telah ditentukan sebelumnya. |
Format | Tabel, spreadsheet, database relasional (SQL). | XML, JSON, log file, email dengan metadata. | Teks bebas, gambar, video, audio, dokumen, media sosial. |
Penyimpanan | Database relasional seperti MySQL, PostgreSQL, Oracle. | NoSQL (misalnya MongoDB), sistem berbasis dokumen, cloud storage. | Data lake, sistem file, cloud storage. |
Jenis Data | Kuantitatif (angka, tanggal, nilai transaksi). | Campuran kuantitatif dan kualitatif; memiliki struktur parsial. | Kualitatif (teks, multimedia, opini, ekspresi). |
Contoh | Catatan pelanggan, data penjualan, inventaris, laporan keuangan. | JSON transaksi e-commerce, metadata gambar, file XML katalog produk. | Email bebas, postingan media sosial, rekaman suara, video, gambar, dokumen PDF. |
Analisis | Dapat dianalisis dengan alat tradisional seperti SQL, Excel, BI tools. | Dapat diurai menggunakan parser khusus; cocok untuk analisis semi-terstruktur dan visualisasi. | Memerlukan teknik lanjutan seperti NLP, machine learning, dan AI. |
Skalabilitas | Mudah diskalakan dalam sistem database relasional. | Dapat diskalakan dengan sistem seperti MongoDB atau Elasticsearch. | Membutuhkan infrastruktur penyimpanan besar dan fleksibel seperti data lake. |
Kelebihan | Mudah dicari, diolah, dan dianalisis; cocok untuk laporan rutin dan analisis statistik. | Lebih fleksibel dibanding data terstruktur; tetap memungkinkan query dan analisis dengan struktur parsial. | Menyimpan informasi kaya dan mendalam; dapat memberikan wawasan baru dari data yang kompleks. |
Kekurangan | Kurang fleksibel terhadap data baru yang tidak sesuai skema; sulit menangani data kompleks. | Membutuhkan parser dan alat khusus; strukturnya tidak selalu konsisten. | Sulit dicari dan dianalisis tanpa alat khusus; memerlukan sumber daya besar untuk penyimpanan dan pemrosesan. |
Mengolah data tak terstruktur menghadirkan berbagai tantangan signifikan. Pertama, data ini tidak memiliki format atau struktur yang konsisten, sehingga sulit untuk diinterpretasikan tanpa pemrosesan yang tepat (GeeksforGeeks, 2024). Kedua, data tak terstruktur datang dalam berbagai bentuk seperti teks, gambar, video, dan audio, yang masing-masing memerlukan teknik analisis yang berbeda, menambah kompleksitas dalam pengolahan data (GeeksforGeeks, 2024). Ketiga, volume data tak terstruktur sering kali sangat besar, membuatnya sulit untuk disimpan dan dianalisis tanpa alat dan teknik yang canggih (GeeksforGeeks, 2024). Keempat, data ini dapat mengandung informasi yang ambigu atau subjektif, sehingga sulit untuk mengekstrak wawasan yang bermakna tanpa konteks atau interpretasi manusia (GeeksforGeeks, 2024). Terakhir, data tak terstruktur mungkin mengandung informasi yang tidak relevan atau “noise”, yang perlu disaring sebelum analisis untuk memastikan hasil yang akurat (GeeksforGeeks, 2024).
Data cleaning merupakan tahap krusial dalam alur kerja data science yang memastikan kualitas dan keandalan data sebelum analisis dilakukan. Proses ini melibatkan identifikasi dan perbaikan kesalahan seperti duplikasi, nilai yang hilang, dan inkonsistensi format, yang dapat mempengaruhi hasil analisis jika tidak ditangani dengan benar (Haltev, 2024).
Dengan data yang bersih, model machine learning dapat memberikan prediksi yang lebih akurat, karena tidak terganggu oleh “noise” atau outlier yang dapat menyesatkan (Biztech Academy, 2024). Selain itu, data cleaning membantu dalam menghindari kesimpulan yang menyesatkan yang dapat timbul dari data yang tidak akurat atau tidak lengkap (Haltev, 2024).
Proses ini juga meningkatkan efisiensi analisis, karena data yang telah dibersihkan memudahkan dalam eksplorasi dan pemodelan, serta mengurangi waktu yang diperlukan untuk mengatasi masalah kualitas data selama proses analisis (Haltev, 2024).
Dalam era ekonomi digital, data menjadi aset penting yang mendukung pengambilan keputusan dan strategi bisnis. Namun, data yang diperoleh sering kali tidak langsung siap untuk dianalisis karena mengandung kesalahan, duplikasi, atau ketidakkonsistenan. Proses data cleaning menjadi krusial untuk memastikan kualitas data yang digunakan.
Platform e-commerce seperti Tokopedia dan Shopee mengandalkan data pelanggan untuk personalisasi pengalaman pengguna. Data cleaning digunakan untuk menghapus duplikasi akun, memperbaiki informasi kontak yang salah, dan menstandarkan format alamat pengiriman. Hal ini memastikan bahwa rekomendasi produk dan promosi yang diberikan relevan dan tepat sasaran.
Dalam sektor fintech, seperti layanan dompet digital dan pinjaman online, data cleaning membantu dalam memverifikasi identitas pengguna, mendeteksi aktivitas penipuan, dan memastikan keakuratan riwayat transaksi. Dengan data yang bersih, perusahaan dapat menilai risiko kredit dengan lebih akurat dan mematuhi regulasi keuangan yang berlaku.
Aplikasi transportasi online seperti Gojek dan Grab mengumpulkan data perjalanan dan perilaku pengguna. Data cleaning digunakan untuk menghilangkan entri duplikat, memperbaiki data lokasi yang tidak akurat, dan menstandarkan format waktu. Ini memungkinkan perusahaan untuk mengoptimalkan rute, memperkirakan permintaan, dan meningkatkan efisiensi operasional.
Platform layanan kesehatan digital memanfaatkan data pasien untuk diagnosis dan perawatan. Data cleaning memastikan bahwa informasi medis, seperti riwayat penyakit dan alergi, akurat dan lengkap. Ini penting untuk menghindari kesalahan medis dan memberikan perawatan yang tepat.
Penerapan data cleaning dalam berbagai sektor ekonomi digital ini menunjukkan betapa pentingnya proses ini dalam mendukung operasi bisnis yang efisien dan pengambilan keputusan yang berbasis data.
R adalah bahasa pemrograman yang dirancang khusus untuk analisis statistik dan visualisasi data. Dikembangkan oleh Ross Ihaka dan Robert Gentleman pada awal 1990-an di University of Auckland, Selandia Baru, R telah menjadi alat penting dalam dunia data science karena kemampuannya dalam mengolah dan menganalisis data secara efisien .
RStudio, yang kini dikenal sebagai Posit, adalah Integrated Development Environment (IDE) yang dirancang untuk mempermudah penggunaan R. Dengan antarmuka pengguna yang intuitif, RStudio menyediakan fitur-fitur seperti editor skrip, konsol, visualisasi data, dan manajemen paket, yang semuanya terintegrasi dalam satu platform .
Langkah-langkah Instalasi
Kunjungi situs resmi CRAN di https://cran.r-project.org.
Pilih sistem operasi yang sesuai (Windows, macOS, atau Linux).
Unduh dan jalankan installer R.
Ikuti petunjuk instalasi hingga selesai.
Kunjungi situs resmi RStudio di https://www.rstudio.com/products/rstudio/download.
Pilih versi RStudio Desktop yang sesuai dengan sistem operasi Anda.
Unduh dan jalankan installer RStudio.
Ikuti petunjuk instalasi hingga selesai.
Setelah kedua perangkat lunak terinstal, Anda dapat membuka RStudio dan mulai menulis serta menjalankan kode R. RStudio akan secara otomatis mendeteksi instalasi R dan mengintegrasikannya ke dalam lingkungan kerjanya.
Menginstal R dan RStudio adalah langkah awal yang penting bagi siapa pun yang ingin memulai perjalanan dalam analisis data. Kombinasi keduanya menyediakan lingkungan yang kuat dan fleksibel untuk berbagai kebutuhan analisis, mulai dari statistik dasar hingga machine learning dan visualisasi data interaktif.
Tampilan R-studio sebagai berikut:
Selain
menggunakan R Studio, juga dapat menggunakan R Console atau yang lebih
umum yaitu Visual Studio Code
RConsole Interface
Visual Studio Code Interface
Dalam pemrograman R, memahami struktur data dasar seperti vektor, data frame, dan list sangat penting untuk analisis data yang efektif. Berikut adalah penjelasan dan contoh penggunaannya.
Vektor
Vektor adalah struktur data satu dimensi yang menyimpan elemen dengan tipe data yang sama, seperti numerik, karakter, atau logika.
Vektor numerik
angka <- c(10, 20, 30, 40)
print(angka)
## [1] 10 20 30 40
Vektor karakter
huruf <- c("A", "B", "C")
print(huruf)
## [1] "A" "B" "C"
Vektor logika
logika <- c(TRUE, FALSE, TRUE)
print(logika)
## [1] TRUE FALSE TRUE
Mengakses elemen kedua dari vektor angka
angka[2]
## [1] 20
Data Frame
Data frame adalah struktur data dua dimensi yang menyerupai tabel, di mana setiap kolom dapat memiliki tipe data yang berbeda.
Membuat data frame
data_mahasiswa <- data.frame(
Nama = c("Andi", "Budi", "Citra"),
Umur = c(21, 22, 20),
Lulus = c(TRUE, FALSE, TRUE)
)
Menampilkan data frame
print(data_mahasiswa)
## Nama Umur Lulus
## 1 Andi 21 TRUE
## 2 Budi 22 FALSE
## 3 Citra 20 TRUE
head(data_mahasiswa)
## Nama Umur Lulus
## 1 Andi 21 TRUE
## 2 Budi 22 FALSE
## 3 Citra 20 TRUE
tail(data_mahasiswa)
## Nama Umur Lulus
## 1 Andi 21 TRUE
## 2 Budi 22 FALSE
## 3 Citra 20 TRUE
Mengakses kolom Nama
data_mahasiswa$Nama
## [1] "Andi" "Budi" "Citra"
Mengakses baris pertama
data_mahasiswa[1, ]
## Nama Umur Lulus
## 1 Andi 21 TRUE
Mengakses elemen pada baris kedua, kolom Umur
data_mahasiswa[2, "Umur"]
## [1] 22
List
List adalah struktur data satu dimensi yang dapat menyimpan elemen
dengan tipe data yang berbeda, termasuk vektor, data frame
,
atau bahkan list
lainnya.
Membuat list
profil <- list(
Nama = "Dewi",
Umur = 23,
Nilai = c(85, 90, 95)
)
Menampilkan list
print(profil)
## $Nama
## [1] "Dewi"
##
## $Umur
## [1] 23
##
## $Nilai
## [1] 85 90 95
Mengakses elemen Nama
profil$Nama
## [1] "Dewi"
Mengakses elemen kedua
profil[[2]]
## [1] 23
readr
.Dalam analisis data menggunakan R, langkah awal yang krusial adalah
mengimpor data dengan benar. Paket readr
dari tidyverse
menyediakan fungsi-fungsi yang efisien untuk membaca berbagai format
file, terutama file CSV. Fungsi read_csv()
dari
readr
lebih cepat dan memberikan kontrol lebih dibandingkan
fungsi read.csv()
dari base R. Selain itu,
read_csv()
secara default tidak mengonversi string menjadi
faktor dan menghasilkan output dalam bentuk tibble, yang lebih
informatif dan mudah dibaca.
Untuk mengimpor file CSV, gunakan fungsi read_csv(). Pastikan file berada di direktori kerja Anda atau tentukan jalur lengkapnya.
Mengimpor file CSV
library(readr)
data <- read_csv("mahasiswa.csv")
## Rows: 134 Columns: 1
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): No;Nama;UTS;UAS
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Jika file memiliki delimiter selain koma, gunakan fungsi
read_delim()
dan tentukan delimiter yang sesuai:
Mengimpor file dengan delimiter khusus, misalnya titik koma
data <- read_delim("mahasiswa.csv", delim = ";")
## Rows: 134 Columns: 4
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (1): Nama
## dbl (1): No
## num (2): UTS, UAS
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Setelah data berhasil diimpor, periksa struktur dan ringkasan data
untuk memastikan semuanya sesuai dengan fungsi str
atau
summary
Melihat struktur data
str(data)
## spc_tbl_ [134 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ No : num [1:134] 1 2 3 4 5 6 7 8 9 10 ...
## $ Nama: chr [1:134] "ABBIDAL MIFTAH ALFAHQRI" "ABYAN KHAIRI RISHA" "ALDEVA OKTANA" "ALLYA AZZAHRA DIRA" ...
## $ UTS : num [1:134] 80 92 92 78 80 87 80 78 78 79 ...
## $ UAS : num [1:134] 79 93 93 83 85 91 92 88 81 82 ...
## - attr(*, "spec")=
## .. cols(
## .. No = col_double(),
## .. Nama = col_character(),
## .. UTS = col_number(),
## .. UAS = col_number()
## .. )
## - attr(*, "problems")=<externalptr>
Melihat ringkasan data
summary(data)
## No Nama UTS UAS
## Min. : 1.00 Length:134 Min. : 35.0 Min. : 50.00
## 1st Qu.: 34.25 Class :character 1st Qu.: 72.0 1st Qu.: 70.00
## Median : 67.50 Mode :character Median : 78.0 Median : 79.00
## Mean : 67.50 Mean :102.5 Mean :115.80
## 3rd Qu.:100.75 3rd Qu.: 85.0 3rd Qu.: 87.75
## Max. :134.00 Max. :825.0 Max. :825.00
Melihat beberapa baris pertama
head(data)
## # A tibble: 6 × 4
## No Nama UTS UAS
## <dbl> <chr> <dbl> <dbl>
## 1 1 ABBIDAL MIFTAH ALFAHQRI 80 79
## 2 2 ABYAN KHAIRI RISHA 92 93
## 3 3 ALDEVA OKTANA 92 93
## 4 4 ALLYA AZZAHRA DIRA 78 83
## 5 5 ANNISA NUR SHADRINA 80 85
## 6 6 CAMELIO DAFINZA 87 91
Fungsi glimpse()
dari paket dplyr juga berguna untuk
melihat struktur data secara ringkas:
Melihat struktur data secara ringkas
dplyr::glimpse(data)
## Rows: 134
## Columns: 4
## $ No <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19…
## $ Nama <chr> "ABBIDAL MIFTAH ALFAHQRI", "ABYAN KHAIRI RISHA", "ALDEVA OKTANA",…
## $ UTS <dbl> 80, 92, 92, 78, 80, 87, 80, 78, 78, 79, 85, 78, 78, 85, 78, 78, 8…
## $ UAS <dbl> 79, 93, 93, 83, 85, 91, 92, 88, 81, 82, 88, 85, 79, 88, 81, 83, 8…
Secara default, read_csv()
akan menebak tipe data setiap
kolom berdasarkan data yang ada. Namun, Anda dapat menentukan tipe data
secara manual menggunakan argumen col_types
:
Menentukan tipe data kolom secara manual
data <- read_csv2("mahasiswa.csv", col_types = cols(
No = col_integer(),
Nama = col_character(),
UTS = col_double(),
UAS = col_double()
))
## ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.
Menentukan tipe data secara eksplisit membantu menghindari kesalahan parsing, terutama pada dataset besar atau kompleks.
Ternyata ada masalah ada data text misalkan “77,5” cara mengetahuinya dengan fungsi problems()
problems(data)
## # A tibble: 0 × 5
## # ℹ 5 variables: row <int>, col <int>, expected <chr>, actual <chr>, file <chr>
Solusinya:
Menentukan Tanda Desimal dengan locale()
Untuk mengatasi
masalah ini, Anda perlu menentukan bahwa koma adalah tanda desimal
dengan menggunakan argumen locale()
dalam fungsi
read_delim()
. Berikut adalah contoh penggunaannya:
data <- read_delim("mahasiswa.csv",
delim = ";",
locale = locale(decimal_mark = ","),
col_types = cols(
No = col_integer(),
Nama = col_character(),
UTS = col_double(),
UAS = col_double()
))
Dengan menetapkan decimal_mark = ","
, fungsi
read_delim()
akan mengenali nilai seperti 77,5 sebagai angka
desimal yang valid
Jika dataset Anda menggunakan simbol khusus untuk nilai hilang (misalnya “.”, “-”, atau “NA”), Anda dapat menentukan simbol tersebut menggunakan argumen na:
Menentukan simbol nilai hilang
data <- read_delim("mahasiswa.csv",na = c(".", "-"),
delim = ";",
locale = locale(decimal_mark = ","),
col_types = cols(
No = col_integer(),
Nama = col_character(),
UTS = col_double(),
UAS = col_double()
))
Anda juga dapat mengimpor data langsung dari URL:
Mengimpor data dari URL
library(RKaggle)
data_mahasiswa <- get_dataset("yossica25/data-nilai-semester-mahasiswa")
## Rows: 134 Columns: 1
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): No;Nama;UTS;UAS
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Setelah memproses data, Anda dapat menyimpannya kembali ke file CSV menggunakan fungsi write_csv():
Menyimpan data ke file CSV
write_csv(data_mahasiswa, "data_mahasiswa.csv")
Ternyata data yang disimpan belum terstruktur dengan baik:
Data Mahasiswa
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ purrr::flatten() masks jsonlite::flatten()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readr)
# Langkah 1: Baca file sebagai string (setiap baris)
lines <- read_lines("data_mahasiswa.csv")
# Langkah 2: Bersihkan tanda kutip ganda dari awal
lines <- str_replace_all(lines, '^"|"$', "")
# Langkah 3: Buat tibble dan pisah berdasarkan delimiter ';'
df <- tibble(raw = lines) %>%
separate(raw, into = c("No", "Nama", "UTS", "UAS"), sep = ";", fill = "right")
# Langkah 4: Ganti koma menjadi titik pada kolom UTS dan UAS, lalu konversi ke numeric
df <- df %>%
mutate(
UTS = str_replace_all(UTS, ",", "."),
UAS = str_replace_all(UAS, ",", "."),
No = as.integer(No),
UTS = as.numeric(UTS),
UAS = as.numeric(UAS)
)
# Langkah 5: Filter data valid (opsional)
df_clean <- df %>%
filter(!is.na(No) & !is.na(UTS) & !is.na(UAS))
# Lihat hasil
print(head(df_clean, 10))
## # A tibble: 10 × 4
## No Nama UTS UAS
## <int> <chr> <dbl> <dbl>
## 1 1 ABBIDAL MIFTAH ALFAHQRI 80 79
## 2 2 ABYAN KHAIRI RISHA 92 93
## 3 3 ALDEVA OKTANA 92 93
## 4 4 ALLYA AZZAHRA DIRA 78 83
## 5 5 ANNISA NUR SHADRINA 80 85
## 6 6 CAMELIO DAFINZA 87 91
## 7 7 DIRLY AYLA AZZURA 80 92
## 8 8 FACHRI NOVRIANZA 78 88
## 9 9 IQBAL SYAPUTRA 78 81
## 10 10 KEISHA NABILAH SHIFA 79 82
write_csv(df_clean, "mahasiswa_bersih.csv")
stringr
dan
tidyr
Pembersihan data teks adalah langkah krusial dalam analisis data,
terutama saat kita menangani input dari survei, media sosial, atau data
mentah lainnya yang tidak terstruktur. Paket stringr
dan
tidyr
dari tidyverse
menyediakan berbagai
fungsi praktis untuk menangani masalah ini.
Paket yang Diperlukan
library(stringr)
library(tidyr)
library(dplyr)
Keterangan library
Fungsi utama: manipulasi string (teks)
Disediakan oleh: tidyverse
Contoh penggunaan:
str_to_lower()
→ mengubah huruf menjadi huruf
kecilIlustrasi:
str_to_upper("halo dunia") # "HALO DUNIA"
## [1] "HALO DUNIA"
Ilustrasi:
str_replace_all()
→ mengganti pola teks tertentuFormat Umum:
str_replace_all(string, pattern, replacement)
string = teks yang ingin dimodifikasi
pattern = pola teks yang ingin diganti (bisa huruf, angka, simbol)
replacement = teks baru sebagai pengganti
Contoh Sederhana 1: Ganti titik dengan koma
teks <- "Nilai Andi adalah 80.5 dan Budi 75.25"
hasil <- str_replace_all(teks, "\\.", ",")
print(hasil)
## [1] "Nilai Andi adalah 80,5 dan Budi 75,25"
Contoh 2: Hilangkan semua angka
kalimat <- "Hari ini tanggal 25 bulan 04 tahun 2025"
hasil <- str_replace_all(kalimat, "[0-9]+", "")
print(hasil)
## [1] "Hari ini tanggal bulan tahun "
Contoh 3: Bersihkan simbol dalam teks
teks <- "Hello!! Apa kabar??? :)"
hasil <- str_replace_all(teks, "[[:punct:]]", "")
print(hasil)
## [1] "Hello Apa kabar "
str_detect()
→ mendeteksi apakah string mengandung pola
tertentuFormat Umum: str_detect(string, pattern)
Contoh 1: Cek apakah ada kata “bandung”
kota <- c("Bandung", "Jakarta", "Surabaya", "bandung barat")
str_detect(kota, "Bandung")
## [1] TRUE FALSE FALSE FALSE
Catatan: str_detect()
bersifat case sensitive
Kalau kamu ingin abaikan huruf besar/kecil, ubah semua ke huruf kecil dulu:
str_detect(str_to_lower(kota), "bandung")
## [1] TRUE FALSE FALSE TRUE
# [1] TRUE FALSE FALSE TRUE
Contoh 2: Cek apakah kalimat mengandung angka
kalimat <- c("Hari ini cerah", "Ujian jam 9 pagi", "Besok libur")
str_detect(kalimat, "[0-9]")
## [1] FALSE TRUE FALSE
Keterangan: Pola [0-9] artinya: “apakah ada angka?”
Contoh 3: Digunakan dalam filter data
library(dplyr)
df <- tibble(nama = c("Andi", "Budi", "Citra", "Dewi"),
kota = c("Bandung", "Jakarta", "Bandung", "Surabaya"))
df %>%
filter(str_detect(kota, "Bandung"))
## # A tibble: 2 × 2
## nama kota
## <chr> <chr>
## 1 Andi Bandung
## 2 Citra Bandung
Fungsi utama: merapikan struktur data (mengubah bentuk data menjadi long/tidy format)
Disediakan oleh: tidyverse
Contoh penggunaan:
separate()
→ memisahkan kolom menjadi beberapa
kolomIlustrasi:
df1 <- tibble(
Nama = c("Andi", "Budi", "Citra", "Dewi"),
nilai = c("80;85", "75;90", "88;92", "70;78")
)
print(df1)
## # A tibble: 4 × 2
## Nama nilai
## <chr> <chr>
## 1 Andi 80;85
## 2 Budi 75;90
## 3 Citra 88;92
## 4 Dewi 70;78
# Pisahkan kolom 'nilai' menjadi 'UTS' dan 'UAS'
df1_separated <- df1 %>%
separate(col = nilai, into = c("UTS", "UAS"), sep = ";")
# Lihat hasil
print(df1_separated)
## # A tibble: 4 × 3
## Nama UTS UAS
## <chr> <chr> <chr>
## 1 Andi 80 85
## 2 Budi 75 90
## 3 Citra 88 92
## 4 Dewi 70 78
df <- tibble(nama_lengkap = c("Andi Wijaya", "Budi Santoso", "Citra Lestari", "Dewi Kusuma"))
print(df)
## # A tibble: 4 × 1
## nama_lengkap
## <chr>
## 1 Andi Wijaya
## 2 Budi Santoso
## 3 Citra Lestari
## 4 Dewi Kusuma
df_separated <- df %>%
separate(nama_lengkap, into = c("Nama_Depan", "Nama_Belakang"), sep = " ")
print(df_separated)
## # A tibble: 4 × 2
## Nama_Depan Nama_Belakang
## <chr> <chr>
## 1 Andi Wijaya
## 2 Budi Santoso
## 3 Citra Lestari
## 4 Dewi Kusuma
unite()
→ menggabungkan beberapa kolom menjadi
satuIlustrasi Kita sudah punya data seperti ini setelah separate():
df_separated <- tibble(
Nama_Depan = c("Andi", "Budi", "Citra", "Dewi"),
Nama_Belakang = c("Wijaya", "Santoso", "Lestari", "Kusuma")
)
print(df_separated)
## # A tibble: 4 × 2
## Nama_Depan Nama_Belakang
## <chr> <chr>
## 1 Andi Wijaya
## 2 Budi Santoso
## 3 Citra Lestari
## 4 Dewi Kusuma
df_united <- df_separated %>%
unite(col = "Nama_Lengkap", Nama_Depan, Nama_Belakang, sep = " ")
print(df_united)
## # A tibble: 4 × 1
## Nama_Lengkap
## <chr>
## 1 Andi Wijaya
## 2 Budi Santoso
## 3 Citra Lestari
## 4 Dewi Kusuma
pivot_longer()
/ pivot_wider()
→
transformasi format data wide ↔︎ longContoh pivot_longer() dan pivot_wider()
Dataset Awal (format lebar)
Misalnya kita punya nilai ujian dua mata pelajaran:
nilai <- tibble(
Nama = c("Andi", "Budi", "Citra", "Dewi"),
Matematika = c(80, 75, 88, 70),
Bahasa = c(85, 90, 92, 78)
)
print(nilai)
## # A tibble: 4 × 3
## Nama Matematika Bahasa
## <chr> <dbl> <dbl>
## 1 Andi 80 85
## 2 Budi 75 90
## 3 Citra 88 92
## 4 Dewi 70 78
nilai_long <- nilai %>%
pivot_longer(cols = c(Matematika, Bahasa),
names_to = "Mata_Pelajaran",
values_to = "Nilai")
print(nilai_long)
## # A tibble: 8 × 3
## Nama Mata_Pelajaran Nilai
## <chr> <chr> <dbl>
## 1 Andi Matematika 80
## 2 Andi Bahasa 85
## 3 Budi Matematika 75
## 4 Budi Bahasa 90
## 5 Citra Matematika 88
## 6 Citra Bahasa 92
## 7 Dewi Matematika 70
## 8 Dewi Bahasa 78
nilai_wide <- nilai_long %>%
pivot_wider(names_from = Mata_Pelajaran,
values_from = Nilai)
print(nilai_wide)
## # A tibble: 4 × 3
## Nama Matematika Bahasa
## <chr> <dbl> <dbl>
## 1 Andi 80 85
## 2 Budi 75 90
## 3 Citra 88 92
## 4 Dewi 70 78
Kapan pakai pivot_longer()?
Saat ingin membuat data tidy (satu baris = satu observasi)
Cocok untuk visualisasi dan analisis per kategori
Kapan pakai pivot_wider()?
Saat ingin melihat data per subjek dalam kolom terpisah
Cocok untuk laporan tabel ringkasan
dplyr
adalah bagian dari tidyverse
dan
merupakan paket utama untuk manipulasi data yang efisien, elegan, dan
konsisten di R. Dengan sintaks yang intuitif, dplyr
memungkinkan analisis data dilakukan dengan pipeline (%>%) secara
berurutan dan mudah dipahami.
Fungsi utama: manipulasi data frame (filter, pilih kolom, agregasi, grup, dsb.)
Disediakan oleh: tidyverse
Contoh penggunaan:
filter()
→ memilih baris sesuai kondisi
select()
→ memilih kolom
mutate()
→ membuat/mengubah kolom
summarise()
dan group_by()
→ meringkas
data per kelompok
Berikut contoh penggunaan fungsi-fungsi dplyr yang sering dipakai
dalam manipulasi data di R: filter()
,
select()
, mutate()
, group_by()
+
summarise()
Data Awal
data_nilai <- tibble(
Nama = c("Andi", "Budi", "Citra", "Dewi", "Andi"),
Kelas = c("A", "B", "A", "B", "A"),
UTS = c(80, 75, 88, 70, 85),
UAS = c(85, 90, 92, 78, 80)
)
print(data_nilai)
## # A tibble: 5 × 4
## Nama Kelas UTS UAS
## <chr> <chr> <dbl> <dbl>
## 1 Andi A 80 85
## 2 Budi B 75 90
## 3 Citra A 88 92
## 4 Dewi B 70 78
## 5 Andi A 85 80
filter()
→ Memilih baris sesuai kondisidata_nilai %>% filter(Kelas == "A")
## # A tibble: 3 × 4
## Nama Kelas UTS UAS
## <chr> <chr> <dbl> <dbl>
## 1 Andi A 80 85
## 2 Citra A 88 92
## 3 Andi A 85 80
Hasil: hanya baris yang Kelas == “A”
select()
→ Memilih kolom tertentudata_nilai %>% select(Nama, UTS)
## # A tibble: 5 × 2
## Nama UTS
## <chr> <dbl>
## 1 Andi 80
## 2 Budi 75
## 3 Citra 88
## 4 Dewi 70
## 5 Andi 85
Hasil: hanya kolom Nama dan UTS yang ditampilkan
mutate()
→ Membuat atau mengubah kolomdata_nilai %>%
mutate(Rata2 = (UTS + UAS) / 2)
## # A tibble: 5 × 5
## Nama Kelas UTS UAS Rata2
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Andi A 80 85 82.5
## 2 Budi B 75 90 82.5
## 3 Citra A 88 92 90
## 4 Dewi B 70 78 74
## 5 Andi A 85 80 82.5
Hasil: menambah kolom baru Rata2 berisi rata-rata UTS dan UAS
group_by()
+summarise()
→ Meringkas data
per grupdata_nilai %>%
group_by(Kelas) %>%
summarise(
Rata_UTS = mean(UTS),
Rata_UAS = mean(UAS),
Jumlah_Siswa = n()
)
## # A tibble: 2 × 4
## Kelas Rata_UTS Rata_UAS Jumlah_Siswa
## <chr> <dbl> <dbl> <int>
## 1 A 84.3 85.7 3
## 2 B 72.5 84 2
Hasil: ringkasan per Kelas, menampilkan:
Rata-rata nilai UTS
Rata-rata nilai UAS
Jumlah siswa per kelas
Ilustrasi gabungan beberapa fungsi
df1_separated %>%
mutate(
UTS = as.numeric(UTS),
UAS = as.numeric(UAS)
) %>%
filter(UTS > 70) %>%
mutate(Rata2 = (UTS + UAS) / 2)
## # A tibble: 3 × 4
## Nama UTS UAS Rata2
## <chr> <dbl> <dbl> <dbl>
## 1 Andi 80 85 82.5
## 2 Budi 75 90 82.5
## 3 Citra 88 92 90
df1_separated %>%
mutate(
UTS = as.numeric(UTS),
UAS = as.numeric(UAS)
) %>%
filter(UTS > 70 & UAS > 70)
## # A tibble: 3 × 3
## Nama UTS UAS
## <chr> <dbl> <dbl>
## 1 Andi 80 85
## 2 Budi 75 90
## 3 Citra 88 92
1. Menghapus Spasi Berlebih
data <- tibble(teks = c(" data ", " bersih ", " stringr "))
print(data)
## # A tibble: 3 × 1
## teks
## <chr>
## 1 " data "
## 2 " bersih "
## 3 " stringr "
data %>%
mutate(teks_bersih = str_trim(teks))
## # A tibble: 3 × 2
## teks teks_bersih
## <chr> <chr>
## 1 " data " data
## 2 " bersih " bersih
## 3 " stringr " stringr
str_trim()
menghapus spasi di awal dan akhir teks.
2. Menghapus Karakter Khusus
data <- tibble(teks = c("halo!!!", "baik#sekali", "mantap@banget"))
print(data)
## # A tibble: 3 × 1
## teks
## <chr>
## 1 halo!!!
## 2 baik#sekali
## 3 mantap@banget
data %>%
mutate(teks_bersih = str_replace_all(teks, "[[:punct:]]", ""))
## # A tibble: 3 × 2
## teks teks_bersih
## <chr> <chr>
## 1 halo!!! halo
## 2 baik#sekali baiksekali
## 3 mantap@banget mantapbanget
str_replace_all(teks, "[[:punct:]]", "")
: menghapus
seluruh tanda baca.
3. Mengubah ke Huruf Kecil
data <- tibble(teks = c("INI KAPITAL", "cAmPuR", "normal"))
data %>%
mutate(teks_lower = str_to_lower(teks))
## # A tibble: 3 × 2
## teks teks_lower
## <chr> <chr>
## 1 INI KAPITAL ini kapital
## 2 cAmPuR campur
## 3 normal normal
str_to_lower(): konversi semua huruf menjadi huruf kecil.
4. Memisahkan Teks Menjadi Kolom
data <- tibble(nama_lengkap = c("Andi Saputra", "Budi Raharjo", "Citra Lestari"))
data %>%
separate(nama_lengkap, into = c("Nama_Depan", "Nama_Belakang"), sep = " ")
## # A tibble: 3 × 2
## Nama_Depan Nama_Belakang
## <chr> <chr>
## 1 Andi Saputra
## 2 Budi Raharjo
## 3 Citra Lestari
separate() digunakan untuk membagi string menjadi beberapa kolom berdasarkan pemisah (di sini adalah spasi).
5. Menggabungkan Kolom Teks
data <- tibble(depan = c("Andi", "Budi"), belakang = c("Saputra", "Raharjo"))
data %>%
unite("Nama_Lengkap", depan, belakang, sep = " ")
## # A tibble: 2 × 1
## Nama_Lengkap
## <chr>
## 1 Andi Saputra
## 2 Budi Raharjo
unite() digunakan untuk menggabungkan beberapa kolom teks menjadi satu kolom.
6. Mendeteksi Pola Khusus (Regex)
data <- tibble(teks = c("ID:1234", "Kode:4567", "ID:9999"))
data %>%
filter(str_detect(teks, "^ID"))
## # A tibble: 2 × 1
## teks
## <chr>
## 1 ID:1234
## 2 ID:9999
str_detect(teks, "\^ID")
: memilih baris yang dimulai
dengan “ID”.
Pembersihan teks dengan stringr dan tidyr mempermudah proses analisis dengan memastikan teks bersih, konsisten, dan siap digunakan. Penggunaan fungsi seperti str_trim(), str_replace_all(), separate(), dan unite() sangat berguna dalam pekerjaan analisis data sehari-hari.
Contoh lengkap manipulasi data dengan dplyr
untuk data contoh mtcars.
library(dplyr)
Kita akan menggunakan dataset built-in mtcars
sebagai
contoh:
data <- as_tibble(mtcars)
1. select() – Memilih Kolom
data %>%
select(mpg, hp, wt)
## # A tibble: 32 × 3
## mpg hp wt
## <dbl> <dbl> <dbl>
## 1 21 110 2.62
## 2 21 110 2.88
## 3 22.8 93 2.32
## 4 21.4 110 3.22
## 5 18.7 175 3.44
## 6 18.1 105 3.46
## 7 14.3 245 3.57
## 8 24.4 62 3.19
## 9 22.8 95 3.15
## 10 19.2 123 3.44
## # ℹ 22 more rows
Memilih kolom mpg, hp, dan wt.
2. filter() – Menyaring Baris
data %>%
filter(mpg > 20, cyl == 4)
## # A tibble: 11 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 2 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 3 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 4 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
## 5 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
## 6 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
## 7 21.5 4 120. 97 3.7 2.46 20.0 1 0 3 1
## 8 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
## 9 26 4 120. 91 4.43 2.14 16.7 0 1 5 2
## 10 30.4 4 95.1 113 3.77 1.51 16.9 1 1 5 2
## 11 21.4 4 121 109 4.11 2.78 18.6 1 1 4 2
Menampilkan mobil dengan mpg > 20 dan silinder 4.
3. mutate() – Membuat Kolom Baru
data %>%
mutate(ratio_hp_wt = hp / wt)
## # A tibble: 32 × 12
## mpg cyl disp hp drat wt qsec vs am gear carb ratio_hp_wt
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4 42.0
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4 38.3
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1 40.1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1 34.2
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2 50.9
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1 30.3
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 68.6
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2 19.4
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2 30.2
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4 35.8
## # ℹ 22 more rows
Menambahkan kolom ratio_hp_wt sebagai hasil bagi hp/wt.
4. arrange() – Mengurutkan Data
data %>%
arrange(desc(mpg))
## # A tibble: 32 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
## 2 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
## 3 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
## 4 30.4 4 95.1 113 3.77 1.51 16.9 1 1 5 2
## 5 27.3 4 79 66 4.08 1.94 18.9 1 1 4 1
## 6 26 4 120. 91 4.43 2.14 16.7 0 1 5 2
## 7 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 8 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 21.5 4 120. 97 3.7 2.46 20.0 1 0 3 1
## # ℹ 22 more rows
Mengurutkan berdasarkan mpg dari tinggi ke rendah.
5. summarise() dan group_by()
data %>%
group_by(cyl) %>%
summarise(
rata_mpg = mean(mpg),
maks_hp = max(hp),
.groups = "drop"
)
## # A tibble: 3 × 3
## cyl rata_mpg maks_hp
## <dbl> <dbl> <dbl>
## 1 4 26.7 113
## 2 6 19.7 175
## 3 8 15.1 335
Mengelompokkan data berdasarkan jumlah silinder (cyl) lalu menghitung rata-rata mpg dan maksimum hp.
6. rename() – Mengubah Nama Kolom
data %>%
rename(berat = wt, tenaga = hp)
## # A tibble: 32 × 11
## mpg cyl disp tenaga drat berat qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
## # ℹ 22 more rows
7. Pipeline (%>%) – Alur Langsung
data %>%
filter(mpg > 20) %>%
select(mpg, cyl, hp) %>%
arrange(desc(hp))
## # A tibble: 14 × 3
## mpg cyl hp
## <dbl> <dbl> <dbl>
## 1 30.4 4 113
## 2 21 6 110
## 3 21 6 110
## 4 21.4 6 110
## 5 21.4 4 109
## 6 21.5 4 97
## 7 22.8 4 95
## 8 22.8 4 93
## 9 26 4 91
## 10 32.4 4 66
## 11 27.3 4 66
## 12 33.9 4 65
## 13 24.4 4 62
## 14 30.4 4 52
Menyaring data mpg > 20, memilih kolom mpg, cyl, dan hp, lalu mengurutkan berdasarkan hp.
8. distinct() – Menghapus Duplikasi
data %>%
select(cyl) %>%
distinct()
## # A tibble: 3 × 1
## cyl
## <dbl>
## 1 6
## 2 4
## 3 8
9. slice() – Mengambil Baris Tertentu
data %>%
slice(1:5)
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
10. count() – Menghitung Frekuensi Kategori
data %>%
count(cyl)
## # A tibble: 3 × 2
## cyl n
## <dbl> <int>
## 1 4 11
## 2 6 7
## 3 8 14
dplyr memungkinkan manipulasi data yang efisien dan ekspresif. Kombinasi fungsi filter(), select(), mutate(), arrange(), dan summarise() membentuk fondasi analisis data modern di R.
Praktik Langsung: Analisis Ulasan Kopi di Tokopedia
Analisis teks pada ulasan produk dapat membantu kita memahami persepsi masyarakat terhadap suatu produk. Dalam praktik ini, kita akan menganalisis ulasan terhadap produk kopi dari Tokopedia secara sederhana.
1. Dataset Ulasan Kopi
library(tibble)
ulasan <- tribble(
~id, ~ulasan,
1, "Kopi enak banget, wangi dan tidak terlalu pahit. Pasti beli lagi!",
2, "Packaging oke, tapi rasa kopinya biasa aja menurut saya.",
3, "Cepat sampai dan rasa kopinya mantap. Recommended seller!",
4, "Kopi terlalu asam, kurang cocok di lidah saya.",
5, "Rasa pas, aroma mantap. Cocok untuk ngopi pagi!",
6, "Sayang sekali, bubuk kopi terlalu halus jadi susah disaring.",
7, "Wah, aroma kopinya seperti di kafe. Good job seller!",
8, "Kopi kurang fresh, rasa agak hambar.",
9, "Harga terjangkau, rasa luar biasa. Recommended!",
10, "Sudah langganan, selalu puas dengan kualitas kopi dari toko ini."
)
2. Pembersihan Teks
library(dplyr)
library(stringr)
ulasan_bersih <- ulasan %>%
mutate(ulasan = str_to_lower(ulasan)) %>%
mutate(ulasan = str_replace_all(ulasan, "[[:punct:]]", "")) %>%
mutate(ulasan = str_replace_all(ulasan, "[0-9]", ""))
head(ulasan_bersih)
## # A tibble: 6 × 2
## id ulasan
## <dbl> <chr>
## 1 1 kopi enak banget wangi dan tidak terlalu pahit pasti beli lagi
## 2 2 packaging oke tapi rasa kopinya biasa aja menurut saya
## 3 3 cepat sampai dan rasa kopinya mantap recommended seller
## 4 4 kopi terlalu asam kurang cocok di lidah saya
## 5 5 rasa pas aroma mantap cocok untuk ngopi pagi
## 6 6 sayang sekali bubuk kopi terlalu halus jadi susah disaring
3. Tokenisasi dan Analisis Sentimen
library(tidytext)
ulasan_token <- ulasan_bersih %>%
unnest_tokens(kata, ulasan)
sentimen_kamus <- tribble(
~kata, ~sentimen,
"enak", "positif",
"wangi", "positif",
"mantap", "positif",
"recommended", "positif",
"puas", "positif",
"terlalu", "negatif",
"asam", "negatif",
"kurang", "negatif",
"hambar", "negatif",
"susah", "negatif"
)
ulasan_sentimen <- ulasan_token %>%
inner_join(sentimen_kamus, by = "kata") %>%
count(id, sentimen) %>%
tidyr::pivot_wider(names_from = sentimen, values_from = n, values_fill = 0) %>%
mutate(skoring = positif - negatif)
4. Interpretasi Skor Sentimen
ulasan_interpretasi <- ulasan_sentimen %>%
mutate(
interpretasi = case_when(
skoring >= 2 ~ "Ulasan sangat positif",
skoring == 1 ~ "Ulasan cukup positif",
skoring == 0 ~ "Netral atau campuran",
skoring == -1 ~ "Ada ketidakpuasan",
skoring <= -2 ~ "Ulasan negatif"
)
)
5. Visualisasi Sentimen
library(ggplot2)
ggplot(ulasan_interpretasi, aes(x = factor(id), y = skoring, fill = interpretasi)) +
geom_col() +
labs(
title = "Skor Sentimen Ulasan Kopi",
x = "ID Ulasan",
y = "Skor Sentimen"
) +
theme_minimal()
6. WordCloud
library(wordcloud)
## Loading required package: RColorBrewer
library(RColorBrewer)
kata_count <- ulasan_token %>%
count(kata, sort = TRUE)
# Wordcloud berwarna
wordcloud(
words = kata_count$kata,
freq = kata_count$n,
min.freq = 1,
max.words = 100,
random.order = FALSE,
scale = c(4, 0.8), # ukuran huruf
colors = brewer.pal(8, "Dark2") # palet warna
)
7. Topic Modeling dengan LDA
library(topicmodels)
library(tm)
## Loading required package: NLP
##
## Attaching package: 'NLP'
## The following object is masked from 'package:ggplot2':
##
## annotate
corpus <- VCorpus(VectorSource(ulasan_bersih$ulasan))
dtm <- DocumentTermMatrix(corpus, control = list(wordLengths=c(3, Inf)))
lda_model <- LDA(dtm, k = 2)
terms(lda_model, 5)
## Topic 1 Topic 2
## [1,] "kopi" "rasa"
## [2,] "kopinya" "kopi"
## [3,] "biasa" "terlalu"
## [4,] "recommended" "aroma"
## [5,] "terlalu" "saya"
8. Machine Learning untuk Klasifikasi Sentimen Otomatis
library(caret)
## Loading required package: lattice
##
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
##
## lift
library(e1071)
# Label positif jika skor > 0, negatif jika <= 0
ml_data <- ulasan_sentimen %>%
mutate(label = ifelse(skoring > 0, "positif", "negatif")) %>%
left_join(ulasan_bersih, by = "id") %>%
select(label, ulasan)
# Bag of Words
dtm_ml <- DocumentTermMatrix(VCorpus(VectorSource(ml_data$ulasan)))
dtm_df <- as.data.frame(as.matrix(dtm_ml))
dtm_df$label <- as.factor(ml_data$label)
# Split data
set.seed(123)
trainIndex <- createDataPartition(dtm_df$label, p = .8, list = FALSE)
train <- dtm_df[trainIndex,]
test <- dtm_df[-trainIndex,]
model <- train(label ~ ., data = train, method = "naive_bayes")
pred <- predict(model, newdata = test)
confusionMatrix(pred, test$label)
## Confusion Matrix and Statistics
##
## Reference
## Prediction negatif positif
## negatif 0 1
## positif 0 0
##
## Accuracy : 0
## 95% CI : (0, 0.975)
## No Information Rate : 1
## P-Value [Acc > NIR] : 1
##
## Kappa : 0
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : NA
## Specificity : 0
## Pos Pred Value : NA
## Neg Pred Value : NA
## Prevalence : 0
## Detection Rate : 0
## Detection Prevalence : 1
## Balanced Accuracy : NA
##
## 'Positive' Class : negatif
##
Apa itu Web Scraping?
Web scraping adalah proses otomatisasi pengambilan data dari halaman web. Teknik ini memungkinkan pengguna untuk mengekstrak informasi yang disusun dalam HTML dan menyimpannya dalam format yang lebih terstruktur seperti CSV, Excel, atau database. Web scraping sangat bermanfaat ketika data yang dibutuhkan tidak tersedia secara langsung dalam bentuk API atau file unduhan. Dengan web scraping, kita dapat mengumpulkan data untuk analisis, penelitian, pemantauan harga, atau pelatihan model machine learning. Web scraping dibedakan menjadi Statis dan Dinamis
Scraping Statis
Scraping statis berarti mengambil data dari halaman web yang seluruh kontennya sudah dimuat penuh dalam HTML saat pertama kali halaman dibuka. Ini biasanya bekerja untuk situs-situs sederhana yang tidak menggunakan JavaScript untuk memuat data. Library yang umum digunakan untuk scraping statis adalah rvest.
Contoh halaman statis: Wikipedia, blog, atau situs berita tanpa interaksi dinamis.
Scraping Dinamis
Scraping dinamis digunakan saat halaman web memuat datanya secara dinamis menggunakan JavaScript setelah halaman terbuka. Karena kontennya tidak langsung terlihat di HTML awal, kita butuh mengontrol browser secara otomatis menggunakan RSelenium agar bisa mengakses data tersebut setelah halaman selesai dimuat.
Contoh halaman dinamis: Tokopedia, Shopee, atau situs lain yang memuat produk saat scroll.
Apakah R Cocok untuk Web Scraping?
Ya, tentu saja! R adalah bahasa pemrograman canggih yang dirancang
khusus untuk data science. R memiliki banyak library
yang
berorientasi pada data, termasuk untuk keperluan scraping website.
Prasyarat
R versi 4 ke atas: Versi R yang digunakan dalam panduan ini adalah 4.3.3 pada sistem operasi Windows dan juga mac. Pastikan R sudah ditambahkan ke PATH sistem agar bisa dijalankan dari command line.
library
yang diperlukan:
library("rvest")
##
## Attaching package: 'rvest'
## The following object is masked from 'package:readr':
##
## guess_encoding
library("RSelenium")
library("dplyr")
library("xml2")
Keterangan
rvest
: Pustaka utama untuk web scraping statis di R.
Memungkinkan kamu untuk mengambil dan mengekstrak konten dari halaman
HTML menggunakan sintaks yang mudah dipahami.
RSelenium
: Digunakan untuk scraping dinamis,
terutama untuk situs web yang memuat kontennya menggunakan JavaScript.
Library ini mengontrol browser (misalnya Chrome) secara otomatis seperti
layaknya manusia.
dplyr
: Pustaka untuk manipulasi data yang efisien
dan elegan di R. Membantu dalam membersihkan dan merapikan hasil
scraping.
xml2
: Pustaka untuk membaca dan menavigasi dokumen
XML atau HTML yang menjadi dasar kerja rvest.
Agar dapat melakukan scraping dengan efektif, penting untuk memahami
dasar-dasar HTML, bahasa yang digunakan untuk membangun halaman web.
HTML (HyperText Markup Language) memiliki struktur hierarkis dan terdiri
dari elemen-elemen seperti <html>
,
<head>
, <body>
,
<h1>
, <p>
, dan sebagainya. Setiap
elemen biasanya terdiri dari tag pembuka <tag>
,
atribut opsional (misal id=first
), konten di tengah, dan
tag penutup </tag>
.
Elemen seperti <p>
, <h1>
,
<a>
menyusun konten halaman.
Atribut seperti id dan class berguna dalam seleksi elemen untuk scraping dan juga berperan dalam tampilan visual halaman.
Elemen bisa berisi teks atau elemen lainnya.
Karena HTML menggunakan karakter khusus seperti <
,
>
, dan &
, maka karakter-karakter ini
harus ditulis menggunakan escape code: <
,
>
, dan &
. Untungnya,
rvest
akan menangani ini secara otomatis saat kamu
mengambil teks dari elemen HTML.
Langkah pertama dalam scraping adalah membaca HTML dari halaman web
menggunakan read_html()
. Setelah dokumen HTML dimuat, kamu
bisa menyeleksi elemen menggunakan CSS selector.
Fungsi Penting:
html_nodes()
(versi lama dari
html_elements()
): Mengambil semua elemen yang cocok dengan
selector tertentu. Masih digunakan di beberapa kode lama.
html_elements()
: Versi terbaru dari
html_nodes()
, direkomendasikan untuk digunakan.
html_element()
: Mengambil satu elemen pertama yang
cocok.
html_text()
: Fungsi klasik untuk mengambil teks dari
elemen HTML. Mengabaikan whitespace dan escape secara otomatis.
html_text2()
: Versi baru dari
html_text()
dengan penanganan spasi dan encoding yang lebih
baik.
html_attr()
: Mengambil nilai atribut dari tag HTML
seperti href
atau src
.
html_table()
: Mengkonversi tabel HTML menjadi
tibble
di R.
p
→ Semua elemen paragraf
.judul
→ Semua elemen dengan class
judul
#judul
→ Elemen dengan ID judul
(unik)
Umumnya, scraping dilakukan dengan dua langkah: pertama gunakan
html_elements()
untuk mengidentifikasi observasi, lalu
gunakan html_element()
untuk mengambil variabel dari tiap
observasi.
Contoh Ekstraksi Tabel:
Jika data sudah dalam bentuk tabel HTML, cukup gunakan
html_table()
untuk mengubahnya menjadi tabel R:
# html |>
# html_element(".mytable") |>
# html_table()
Tips Menentukan Selector
Menentukan selector yang tepat bisa jadi bagian paling sulit. Gunakan:
SelectorGadget: Alat interaktif yang membantu memilih selector secara visual.
Developer Tools (Chrome): Klik kanan pada elemen → Inspect → Copy as Selector.
Referensi Tambahan: Gunakan MDN Web Docs atau tutorial CSS Diner untuk belajar CSS selector.
Langkah selanjutnya akan membahas scraping dengan rvest, menangani konten JavaScript dengan RSelenium, dan menyimpan data hasil scraping.
Scraping statis menggunakan rvest
Scraping konten dinamis dengan RSelenium
Menangani halaman yang memiliki banyak halaman (pagination)
Mengekstrak data terstruktur seperti informasi produk atau ulasan
Mengekspor hasil ke CSV atau Excel
Scraping Statis libary(rvest)
Deskripsi Umum
Script R di bawah ini menggunakan pustaka rvest untuk melakukan web scraping dari situs “https://www.scrapethissite.com/pages/simple/”. Tujuan dari proses ini adalah untuk mengumpulkan informasi terstruktur dari elemen-elemen HTML yang memuat data negara.
Tujuan Utama
Mengambil Data Negara Secara Otomatis:
Mengakses halaman web yang memuat daftar negara beserta informasinya.
Menangkap setiap blok HTML yang mengandung informasi tentang sebuah negara (kelas CSS: .country).
Ekstraksi Informasi Penting:
country-name: Nama negara
country-capital: Ibukota negara
country-population: Jumlah penduduk
country-area: Luas wilayah
Setiap informasi disimpan dalam format data.frame di R.
Data hasil scraping diekspor ke file CSV bernama
scraped_countries_data.csv
untuk keperluan analisis lebih
lanjut atau visualisasi.
Manfaat
Proses ini menghemat waktu dibandingkan dengan pengumpulan data secara manual.
Dapat digunakan sebagai bagian dari pipeline otomatisasi data.
Ideal untuk pembuatan dataset geografis untuk latihan statistik, machine learning, atau analisis demografis.
Catatan Teknis
Fungsi html_nodes()
dan html_node()
digunakan untuk menangkap elemen HTML spesifik.
html_text(trim = TRUE)
membersihkan teks dari spasi
tambahan.
Data dikonversi menjadi numerik agar bisa dianalisis secara kuantitatif.
write.csv()
digunakan untuk menyimpan data secara
lokal.
Web scraping dengan rvest sangat efektif untuk mengumpulkan data publik yang tersedia di halaman web. Contoh ini menunjukkan bagaimana kita dapat mengubah data tidak terstruktur dari HTML menjadi data terstruktur siap analisis dengan sedikit baris kode R.
Implementasi di R
library(rvest)
url <- "https://www.scrapethissite.com/pages/simple/"
webpage <- read_html(url)
web_data <- webpage %>%
html_nodes(".country")
results <- data.frame(
Country = character(),
Capital = character(),
Population = numeric(),
Area = numeric()
)
for (country in web_data) {
country_name <- country %>%
html_node(".country-name") %>%
html_text(trim = TRUE)
capital_name <- country %>%
html_node(".country-capital") %>%
html_text(trim = TRUE)
population_data <- country %>%
html_node(".country-population") %>%
html_text(trim = TRUE) %>%
as.numeric()
area_data <- country %>%
html_node(".country-area") %>%
html_text(trim = TRUE) %>%
as.numeric()
results <- rbind(results, data.frame(
Country = country_name,
Capital = capital_name,
Population = population_data,
Area = area_data
))
}
head(results)
## Country Capital Population Area
## 1 Andorra Andorra la Vella 84000 468
## 2 United Arab Emirates Abu Dhabi 4975593 82880
## 3 Afghanistan Kabul 29121286 647500
## 4 Antigua and Barbuda St. John's 86754 443
## 5 Anguilla The Valley 13254 102
## 6 Albania Tirana 2986952 28748
write.csv(results, "scraped_countries_data.csv", row.names = FALSE)
HTML table
library(rvest)
url <- "https://en.wikipedia.org/wiki/List_of_Eurovision_Song_Contest_winners"
webpage <- read_html(url)
winners_table <- webpage %>%
html_node(".wikitable") %>%
html_table()
print(winners_table)
## # A tibble: 72 × 6
## Year Country Song Artist `Songwriter(s)` Ref.
## <int> <chr> <chr> <chr> <chr> <chr>
## 1 1956 Switzerland "\"Refrain\"" Lys A… ".mw-parser-ou… [13]
## 2 1957 Netherlands "\"Net als toen\"" Corry… "Guus JansenWi… [14]
## 3 1958 France "\"Dors, mon amour\"" André… "Hubert Giraud… [15]
## 4 1959 Netherlands "\"Een beetje\"" Teddy… "Dick Schallie… [16]
## 5 1960 France "\"Tom Pillibi\"" Jacqu… "André PoppPie… [17]
## 6 1961 Luxembourg "\"Nous les amoureux\"" Jean-… "Jacques Datin… [18]
## 7 1962 France "\"Un premier amour\"" Isabe… "Claude-Henri … [19]
## 8 1963 Denmark "\"Dansevise\"" Greth… "Otto Francker… [20]
## 9 1964 Italy "\"Non ho l'età\"" Gigli… "Nicola Salern… [21]
## 10 1965 Luxembourg "\"Poupée de cire, poupée de … Franc… "Serge Gainsbo… [22]
## # ℹ 62 more rows
write.csv(winners_table, "eurovision_winners.csv", row.names = FALSE)
Pada contoh ini tujuannya unutk melihat headline dari media online Kompas
Headline Kompas
Tujuan untuk mengetahui judul berita
kejagung dinilai kebablasan tersangkakan direktur jak tv tanpa mekanisme uu
.
Pada contoh ini kita akan coba melakukan inspeksi terhadap web
kompas. Tahapannya adalah
1. Klik judul dan copy alamat url nya misalkan:
https://nasional.kompas.com/read/2025/04/23/11071011/kejagung-dinilai-kebablasan-tersangkakan-direktur-jak-tv-tanpa-mekanisme-uu?source=headline
inspect
seperti pada GambarJudul Berita Kompas
element
dari inspect
dan akan otomatis
diarahkan ke
<h1 class="read title">\@</h1>==\$0
Secara lengkap
analisis dengan R sebagai berikut:
library(rvest)
url <- "https://nasional.kompas.com/read/2025/04/23/11071011/kejagung-dinilai-kebablasan-tersangkakan-direktur-jak-tv-tanpa-mekanisme-uu?source=headline"
halaman_web <- read_html(url)
judul_berita <- halaman_web %>%
html_nodes("h1.read__title") %>%
html_text()
print(judul_berita)
## [1] "Kejagung Dinilai Kebablasan, Tersangkakan Direktur Jak TV Tanpa Mekanisme UU Pers"
Mendapakan isi berita dari
kejagung dinilai kebablasan tersangkakan direktur jak tv tanpa mekanisme uu
.
Proses yang sama sepert idilakukan pada
Contoh Web Scraping Statis 4
url <- "https://nasional.kompas.com/read/2025/04/23/11071011/kejagung-dinilai-kebablasan-tersangkakan-direktur-jak-tv-tanpa-mekanisme-uu?source=headline"
halaman_web <- read_html(url)
isi_berita <- halaman_web %>%
html_nodes(".read__content p") %>%
html_text()
head(isi_berita)
## [1] "JAKARTA, KOMPAS.com - Pakar hukum pidana pada Universitas Trisakti Abdul Fickar Hadjar menilai, Kejaksaan Agung (Kejagung) kebablasan karena menetapkan Direktur JAK TV Tian Bahtiar sebagai tersangka tanpa menempuh jalur yang diatur Undang-Undang Dewan Pers."
## [2] "Fickar mengatakan, sebelum menetapkan Tian sebagai tersangka karena pemberitaan yang dianggap negatif dan merintangi penyidikan, Kejagung semestinya memberikan hak jawab sebagaimana diatur UU Pers."
## [3] "\"Menurut saya ini bablas, nih. Belum ada mekanisme Undang-undang Pers itu dilakukan, Kejaksaan sudah langsung mempidanakan. Ini yang menurut saya agak kebablasan,\" kata Fickar dalam program Obrolan Neswroom Kompas.com, Selasa (22/4/2025)."
## [4] "Fickar menjelaskan, profesi tertentu seperti pers memiliki aturan mainnya tersendiri yang tercantum dalam UU Pers."
## [5] "Baca juga: Kongkalikong Direktur JAK TV dan Advokat: Antara Etik, Pidana, dan Preseden Buruk"
## [6] "Ketika pers dianggap melakukan satu tindakan yang merugikan orang lain, baik secara perdata maupun secara pidana melalui pemberitaannya, maka orang tersebut bisa meminta hak jawab kepada redaksi media sebelum menempuh jalur pidana."
Contoh berikut menunjukkan bagaimana scraping dilakukan pada website dinamis yang memiliki pagination (halaman bertingkat). Meskipun halaman ini tidak menggunakan JavaScript secara intensif, proses iterasi antar halaman mensimulasikan scraping dinamis karena data tidak tersedia seluruhnya dalam satu halaman.
Tujuan
Situs https://quotes.toscrape.com
menyajikan kutipan
dan penulisnya dalam banyak halaman.
Tujuan utamanya adalah mengambil semua kutipan, penulis, dan tag dari setiap halaman hingga maksimal 10 halaman atau sampai halaman terakhir.
Menggunakan selector .pager
.next
a
untuk menemukan tautan ke halaman berikutnya.
Fungsi html_attr("href")
mengambil URL relatif
halaman selanjutnya.
html_nodes(".quote .text")
untuk mengambil teks
kutipan.
html_nodes(".quote .author")
untuk mengambil nama
penulis.
html_nodes(".quote .tags")
untuk mengambil tag
kutipan.
Data dikompilasi ke dalam data.frame dan diekspor ke file CSV
bernama quotes.csv
.
Keunikan
Script ini menggunakan loop dan function abstraction
(scrape_page()
) untuk scraping berulang.
Struktur sangat cocok untuk scraping situs yang menggunakan pagination.
Manfaat
Cocok untuk pelatihan natural language processing (NLP), analisis sentimen, atau pelabelan data teks.
Menunjukkan pola scraping yang modular dan efisien.
Web scraping dengan rvest
sangat efektif untuk
mengumpulkan data publik yang tersedia di halaman web. Contoh ini
menunjukkan bagaimana kita dapat mengubah data tidak terstruktur dari
HTML menjadi data terstruktur siap analisis dengan sedikit baris kode
R.
Implementasi dengan R
library(rvest)
library(tidyverse)
base_url <- "https://quotes.toscrape.com"
scrape_page <- function(base_url) {
page <- read_html(base_url)
quotes <- page %>%
html_nodes(".quote .text") %>%
html_text(trim = TRUE)
authors <- page %>%
html_nodes(".quote .author") %>%
html_text(trim = TRUE)
tags_per_quote <- page %>%
html_nodes(".quote .tags") %>%
html_text(trim = TRUE) %>%
gsub("Tags: ", "", .)
all_quotes <- data.frame(Quote = quotes,
Author = authors,
Tags = tags_per_quote)
return(all_quotes)
}
next_page <- "/"
page_count <- 1
all_quotes <- data.frame(Quote = character(),
Author = character(),
Tags = character(),
stringsAsFactors = FALSE)
while (!is.null(next_page) && page_count <= 10) {
current_url <- paste0(base_url, next_page)
message("Scraping page ", page_count, ": ", current_url)
page_data <- scrape_page(current_url)
all_quotes <- bind_rows(all_quotes, page_data)
next_page <- read_html(current_url) %>%
html_node(".pager .next a") %>%
html_attr("href")
page_count <- page_count + 1
}
## Scraping page 1: https://quotes.toscrape.com/
## Scraping page 2: https://quotes.toscrape.com/page/2/
## Scraping page 3: https://quotes.toscrape.com/page/3/
## Scraping page 4: https://quotes.toscrape.com/page/4/
## Scraping page 5: https://quotes.toscrape.com/page/5/
## Scraping page 6: https://quotes.toscrape.com/page/6/
## Scraping page 7: https://quotes.toscrape.com/page/7/
## Scraping page 8: https://quotes.toscrape.com/page/8/
## Scraping page 9: https://quotes.toscrape.com/page/9/
## Scraping page 10: https://quotes.toscrape.com/page/10/
head(all_quotes)
## Quote
## 1 “The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
## 2 “It is our choices, Harry, that show what we truly are, far more than our abilities.”
## 3 “There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”
## 4 “The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”
## 5 “Imperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.”
## 6 “Try not to become a man of success. Rather become a man of value.”
## Author
## 1 Albert Einstein
## 2 J.K. Rowling
## 3 Albert Einstein
## 4 Jane Austen
## 5 Marilyn Monroe
## 6 Albert Einstein
## Tags
## 1 Tags:\n change\n \n deep-thoughts\n \n thinking\n \n world
## 2 Tags:\n abilities\n \n choices
## 3 Tags:\n inspirational\n \n life\n \n live\n \n miracle\n \n miracles
## 4 Tags:\n aliteracy\n \n books\n \n classic\n \n humor
## 5 Tags:\n be-yourself\n \n inspirational
## 6 Tags:\n adulthood\n \n success\n \n value
write.csv(all_quotes, "quotes.csv", row.names = FALSE)
Pada contoh ini akan menggunakan RSelenium
. Misalkan
akan dilakukan pengumulan data ulasan produk kopi dari kopi kapal tanker
seperti gambar berikut:
Tokopedia
Implementasi dengan R - Catatan: seringkali proses menggunakan Chrome
kurang optimal sehingga perlu menggunakan browser firefox
-
Perhatikan port nya tidak boleh dipake lebih dari sekali
library(RSelenium)
rd <- rsDriver(browser = "firefox", port = 5558L, verbose = TRUE)
## checking Selenium Server versions:
## BEGIN: PREDOWNLOAD
## BEGIN: DOWNLOAD
## BEGIN: POSTDOWNLOAD
## checking chromedriver versions:
## BEGIN: PREDOWNLOAD
## BEGIN: DOWNLOAD
## BEGIN: POSTDOWNLOAD
## checking geckodriver versions:
## BEGIN: PREDOWNLOAD
## BEGIN: DOWNLOAD
## BEGIN: POSTDOWNLOAD
## checking phantomjs versions:
## BEGIN: PREDOWNLOAD
## BEGIN: DOWNLOAD
## BEGIN: POSTDOWNLOAD
## [1] "Connecting to remote server"
## $acceptInsecureCerts
## [1] FALSE
##
## $browserName
## [1] "firefox"
##
## $browserVersion
## [1] "138.0.1"
##
## $`moz:accessibilityChecks`
## [1] FALSE
##
## $`moz:buildID`
## [1] "20250430203103"
##
## $`moz:geckodriverVersion`
## [1] "0.36.0"
##
## $`moz:headless`
## [1] FALSE
##
## $`moz:platformVersion`
## [1] "23.5.0"
##
## $`moz:processID`
## [1] 20362
##
## $`moz:profile`
## [1] "/var/folders/gc/g46k00d5071gwqdgfmv25hfw0000gn/T/rust_mozprofileylaQ3L"
##
## $`moz:shutdownTimeout`
## [1] 60000
##
## $`moz:webdriverClick`
## [1] TRUE
##
## $`moz:windowless`
## [1] FALSE
##
## $pageLoadStrategy
## [1] "normal"
##
## $platformName
## [1] "mac"
##
## $proxy
## named list()
##
## $setWindowRect
## [1] TRUE
##
## $strictFileInteractability
## [1] FALSE
##
## $timeouts
## $timeouts$implicit
## [1] 0
##
## $timeouts$pageLoad
## [1] 300000
##
## $timeouts$script
## [1] 30000
##
##
## $unhandledPromptBehavior
## [1] "dismiss and notify"
##
## $userAgent
## [1] "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:138.0) Gecko/20100101 Firefox/138.0"
##
## $webdriver.remote.sessionid
## [1] "1a2d53cf-62d7-4ac6-929e-654f16f4a8be"
##
## $id
## [1] "1a2d53cf-62d7-4ac6-929e-654f16f4a8be"
remDr <- rd$client
# Lanjutkan dengan navigasi dan scraping seperti sebelumnya
url <- "https://www.tokopedia.com/kopikapaltanker/kopi-bubuk-kapal-tanker-new-370-gr-bubuk-kasar"
remDr$navigate(url)
Sys.sleep(5)
halaman_web_rendered <- remDr$getPageSource()[[1]] %>% read_html()
ulasan_rendered <- halaman_web_rendered %>%
html_nodes("div") %>%
html_text()
head(ulasan_rendered)
## [1] "Website tokopedia memerlukan javascript untuk dapat ditampilkan."
## [2] "@-webkit-keyframes animation-jlk0mk{0%{background-position:-300px;}100%{background-position:300px;}}@keyframes animation-jlk0mk{0%{background-position:-300px;}100%{background-position:300px;}}@-webkit-keyframes animation-17fxu0k{0%{-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);}50%{-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}100%{-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);}}@keyframes animation-17fxu0k{0%{-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);}50%{-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}100%{-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);}}@-webkit-keyframes animation-3j3ykd{0%{-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}50%{-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);}100%{-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}}@keyframes animation-3j3ykd{0%{-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}50%{-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);}100%{-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}}@-webkit-keyframes animation-1qe8js{0%{opacity:0;-webkit-transform:scale(0.7);-ms-transform:scale(0.7);transform:scale(0.7);}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}}@keyframes animation-1qe8js{0%{opacity:0;-webkit-transform:scale(0.7);-ms-transform:scale(0.7);transform:scale(0.7);}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}}@-webkit-keyframes animation-b4egaa{0%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}100%{opacity:0;-webkit-transform:scale(0.7);-ms-transform:scale(0.7);transform:scale(0.7);}}@keyframes animation-b4egaa{0%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);}100%{opacity:0;-webkit-transform:scale(0.7);-ms-transform:scale(0.7);transform:scale(0.7);}}@-webkit-keyframes animation-i6183d{0%{-webkit-transform:translateY(-60%);-ms-transform:translateY(-60%);transform:translateY(-60%);}50%{-webkit-transform:translateY(60%);-ms-transform:translateY(60%);transform:translateY(60%);}100%{-webkit-transform:translateY(-60%);-ms-transform:translateY(-60%);transform:translateY(-60%);}}@keyframes animation-i6183d{0%{-webkit-transform:translateY(-60%);-ms-transform:translateY(-60%);transform:translateY(-60%);}50%{-webkit-transform:translateY(60%);-ms-transform:translateY(60%);transform:translateY(60%);}100%{-webkit-transform:translateY(-60%);-ms-transform:translateY(-60%);transform:translateY(-60%);}}@-webkit-keyframes animation-1lz1btd{0%{-webkit-transform:translateY(60%);-ms-transform:translateY(60%);transform:translateY(60%);}50%{-webkit-transform:translateY(-60%);-ms-transform:translateY(-60%);transform:translateY(-60%);}100%{-webkit-transform:translateY(60%);-ms-transform:translateY(60%);transform:translateY(60%);}}@keyframes animation-1lz1btd{0%{-webkit-transform:translateY(60%);-ms-transform:translateY(60%);transform:translateY(60%);}50%{-webkit-transform:translateY(-60%);-ms-transform:translateY(-60%);transform:translateY(-60%);}100%{-webkit-transform:translateY(60%);-ms-transform:translateY(60%);transform:translateY(60%);}}@-webkit-keyframes animation-1vdgwda{0%{background-color:#FFD45F;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);}25%{-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);}50%{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}75%{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}100%{background-color:#FFD45F;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);}}@keyframes animation-1vdgwda{0%{background-color:#FFD45F;-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);}25%{-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);}50%{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}75%{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}100%{background-color:#FFD45F;-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%);}}#chat-item-container{padding-inline-start:0px;margin-block-start:0px;margin-block-end:0px;}#chat-snippet{z-index:80 !important;}.chat-addlink-product__btn--buy:not([disabled]){background-color:var(--YN600,#DB9600) !important;color:var(--NN0,#FFFFFF) !important;}.chat__search input{background:transparent !important;}.unf-user-dialog__content--mute{padding:32px 44px !important;}.receive-setting__desc .unf-toggle{position:absolute !important;top:30% !important;right:12px !important;}.unf-user-dialog__title{font-size:18px !important;font-weight:600 !important;color:var(--NN1000,rgba(0,0,0,0.7)) !important;line-height:1.22 !important;margin:0 !important;padding:0 0 8px !important;text-align:center !important;}.unf-user-dialog__content input[type=text].modal-attach-product__search--txt{margin-bottom:10px !important;height:36px !important;}@-webkit-keyframes animation-yzd1jb{to{background-color:transparent;color:#000;}}@keyframes animation-yzd1jb{to{background-color:transparent;color:#000;}}@-webkit-keyframes animation-k0qhxr{from{-webkit-transform:translateX(-375px);-ms-transform:translateX(-375px);transform:translateX(-375px);}to{-webkit-transform:translateX(0px);-ms-transform:translateX(0px);transform:translateX(0px);}}@keyframes animation-k0qhxr{from{-webkit-transform:translateX(-375px);-ms-transform:translateX(-375px);transform:translateX(-375px);}to{-webkit-transform:translateX(0px);-ms-transform:translateX(0px);transform:translateX(0px);}}@-webkit-keyframes animation-1ujdgod{from{-webkit-transform:translateX(4px);-ms-transform:translateX(4px);transform:translateX(4px);}to{-webkit-transform:translateX(0px);-ms-transform:translateX(0px);transform:translateX(0px);}}@keyframes animation-1ujdgod{from{-webkit-transform:translateX(4px);-ms-transform:translateX(4px);transform:translateX(4px);}to{-webkit-transform:translateX(0px);-ms-transform:translateX(0px);transform:translateX(0px);}}@-webkit-keyframes animation-10x2v5k{0%{stroke-dasharray:1,200;stroke-dashoffset:0;}100%{stroke-dasharray:200,200;stroke-dashoffset:-125px;}}@keyframes animation-10x2v5k{0%{stroke-dasharray:1,200;stroke-dashoffset:0;}100%{stroke-dasharray:200,200;stroke-dashoffset:-125px;}}@-webkit-keyframes animation-98wu2y{0%{stroke-dasharray:0,200;}50%{stroke-dasharray:50,200;}100%{stroke-dasharray:94,200;stroke-dashoffset:-94;}}@keyframes animation-98wu2y{0%{stroke-dasharray:0,200;}50%{stroke-dasharray:50,200;}100%{stroke-dasharray:94,200;stroke-dashoffset:-94;}}@-webkit-keyframes animation-xhy3fo{0%{stroke-dasharray:91,200;stroke-dashoffset:90;}30%{stroke-dasharray:91,200;stroke-dashoffset:54;}50%{stroke-dasharray:91,200;stroke-dashoffset:0;}70%{stroke-dasharray:91,200;stroke-dashoffset:-54;}100%{stroke-dasharray:91,200;stroke-dashoffset:-94;}}@keyframes animation-xhy3fo{0%{stroke-dasharray:91,200;stroke-dashoffset:90;}30%{stroke-dasharray:91,200;stroke-dashoffset:54;}50%{stroke-dasharray:91,200;stroke-dashoffset:0;}70%{stroke-dasharray:91,200;stroke-dashoffset:-54;}100%{stroke-dasharray:91,200;stroke-dashoffset:-94;}}@-webkit-keyframes animation-qscw6i{0%{-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);}100%{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}}@keyframes animation-qscw6i{0%{-webkit-transform:scaleX(0);-ms-transform:scaleX(0);transform:scaleX(0);}100%{-webkit-transform:scaleX(1);-ms-transform:scaleX(1);transform:scaleX(1);}}@-webkit-keyframes animation-zww5t0{from{height:0px;}to{height:493px;}}@keyframes animation-zww5t0{from{height:0px;}to{height:493px;}}@-webkit-keyframes animation-czjkem{0%{background-position:-100%;}100%{background-position:100%;}}@keyframes animation-czjkem{0%{background-position:-100%;}100%{background-position:100%;}}@-webkit-keyframes animation-1fnu2vr{10%,90%{-webkit-transform:translate(-1px,0);-ms-transform:translate(-1px,0);transform:translate(-1px,0);}20%,80%{-webkit-transform:translate(2px,0);-ms-transform:translate(2px,0);transform:translate(2px,0);}30%,50%,70%{-webkit-transform:translate(-3px,0);-ms-transform:translate(-3px,0);transform:translate(-3px,0);}40%,60%{-webkit-transform:translate(3px,0);-ms-transform:translate(3px,0);transform:translate(3px,0);}}@keyframes animation-1fnu2vr{10%,90%{-webkit-transform:translate(-1px,0);-ms-transform:translate(-1px,0);transform:translate(-1px,0);}20%,80%{-webkit-transform:translate(2px,0);-ms-transform:translate(2px,0);transform:translate(2px,0);}30%,50%,70%{-webkit-transform:translate(-3px,0);-ms-transform:translate(-3px,0);transform:translate(-3px,0);}40%,60%{-webkit-transform:translate(3px,0);-ms-transform:translate(3px,0);transform:translate(3px,0);}}@-webkit-keyframes animation-dswnjo{0%{opacity:0.75;}50%{opacity:1;}}@keyframes animation-dswnjo{0%{opacity:0.75;}50%{opacity:1;}}@-webkit-keyframes animation-oh6j69{0%{background-position:-468px 0;}100%{background-position:468px 0;}}@keyframes animation-oh6j69{0%{background-position:-468px 0;}100%{background-position:468px 0;}}@-webkit-keyframes animation-1vdf39n{to{opacity:0;}}@keyframes animation-1vdf39n{to{opacity:0;}}@-webkit-keyframes animation-1kgmok0{to{height:48px;}}@keyframes animation-1kgmok0{to{height:48px;}}@-webkit-keyframes animation-1y4kb4c{0%{background-position:-120px;}100%{background-position:120px;}}@keyframes animation-1y4kb4c{0%{background-position:-120px;}100%{background-position:120px;}}@-webkit-keyframes animation-1eihpp{0%{background-position:-64px;}100%{background-position:64px;}}@keyframes animation-1eihpp{0%{background-position:-64px;}100%{background-position:64px;}}@-webkit-keyframes animation-1g02mgs{0%{background-position:-90%;}100%{background-position:90%;}}@keyframes animation-1g02mgs{0%{background-position:-90%;}100%{background-position:90%;}}@-webkit-keyframes animation-1eq8s99{0%{background-position:-20%;}100%{background-position:20%;}}@keyframes animation-1eq8s99{0%{background-position:-20%;}100%{background-position:20%;}}@-webkit-keyframes animation-1lglyt1{0%{background-position:-35%;}100%{background-position:35%;}}@keyframes animation-1lglyt1{0%{background-position:-35%;}100%{background-position:35%;}}@-webkit-keyframes animation-xw24tn{0%{background-position:-55%;}100%{background-position:55%;}}@keyframes animation-xw24tn{0%{background-position:-55%;}100%{background-position:55%;}}@-webkit-keyframes animation-6qeuhm{0%{background-position:-70%;}100%{background-position:70%;}}@keyframes animation-6qeuhm{0%{background-position:-70%;}100%{background-position:70%;}}@-webkit-keyframes animation-gvn1fk{0%{background-position:-40%;}100%{background-position:40%;}}@keyframes animation-gvn1fk{0%{background-position:-40%;}100%{background-position:40%;}}@-webkit-keyframes animation-1ayy89j{0%{background-position:-98px;}100%{background-position:98px;}}@keyframes animation-1ayy89j{0%{background-position:-98px;}100%{background-position:98px;}}@-webkit-keyframes animation-1o1bb8b{0%{background-position:-80%;}100%{background-position:80%;}}@keyframes animation-1o1bb8b{0%{background-position:-80%;}100%{background-position:80%;}}@-webkit-keyframes animation-kn9u1f{0%{background-position:-15%;}100%{background-position:15%;}}@keyframes animation-kn9u1f{0%{background-position:-15%;}100%{background-position:15%;}}@-webkit-keyframes animation-1v174bd{0%{background-position:-80px;}100%{background-position:80px;}}@keyframes animation-1v174bd{0%{background-position:-80px;}100%{background-position:80px;}}@-webkit-keyframes animation-wko2vc{0%{background-position:-180px;}100%{background-position:180px;}}@keyframes animation-wko2vc{0%{background-position:-180px;}100%{background-position:180px;}}@-webkit-keyframes animation-1627l1d{50%{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2);}}@keyframes animation-1627l1d{50%{-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2);}}@-webkit-keyframes animation-ovhcia{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes animation-ovhcia{100%{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg);}}@-webkit-keyframes animation-1s16om9{0%{stroke-dasharray:1,200;stroke-dashoffset:0;}50%{stroke-dasharray:89,200;stroke-dashoffset:-35;}100%{stroke-dasharray:89,200;stroke-dashoffset:-124;}}@keyframes animation-1s16om9{0%{stroke-dasharray:1,200;stroke-dashoffset:0;}50%{stroke-dasharray:89,200;stroke-dashoffset:-35;}100%{stroke-dasharray:89,200;stroke-dashoffset:-124;}}@-webkit-keyframes animation-ccaz7r{0%{background-position:-100px;}100%{background-position:100px;}}@keyframes animation-ccaz7r{0%{background-position:-100px;}100%{background-position:100px;}}@-webkit-keyframes animation-z23930{0%{background-position:-160px;}100%{background-position:160px;}}@keyframes animation-z23930{0%{background-position:-160px;}100%{background-position:160px;}}@-webkit-keyframes animation-1kvqu35{0%{background-position:-50px;}100%{background-position:50px;}}@keyframes animation-1kvqu35{0%{background-position:-50px;}100%{background-position:50px;}}@-webkit-keyframes animation-bn3rig{0%{background-position:-24px;}100%{background-position:24px;}}@keyframes animation-bn3rig{0%{background-position:-24px;}100%{background-position:24px;}}@-webkit-keyframes animation-1f554e6{0%{background-position:-50%;}100%{background-position:50%;}}@keyframes animation-1f554e6{0%{background-position:-50%;}100%{background-position:50%;}}@-webkit-keyframes animation-ogpi78{0%{background-position:-132px 0;}100%{background-position:132px 0;}}@keyframes animation-ogpi78{0%{background-position:-132px 0;}100%{background-position:132px 0;}}@-webkit-keyframes animation-sxxogs{0%{background-position:-14px;}100%{background-position:14px;}}@keyframes animation-sxxogs{0%{background-position:-14px;}100%{background-position:14px;}}@-webkit-keyframes animation-irgsoc{0%{background-position:-306px 0;}100%{background-position:306px 0;}}@keyframes animation-irgsoc{0%{background-position:-306px 0;}100%{background-position:306px 0;}}body {\n --ADDR-GN50: var(--GN50, #E5FFF3);--ADDR-GN500: var(--GN500, #00AA5B);--ADDR-NN0: var(--NN0, #FFFFFF);--ADDR-NN50: var(--NN50, #F2F4F7);--ADDR-NN100: var(--NN100, #E6E9F0);--ADDR-NN200: var(--NN200, #CFD5E1);--ADDR-NN300: var(--NN300, #B3BBC9);--ADDR-NN400: var(--NN400, #98A3B4);--ADDR-NN500: var(--NN500, #7C8597);--ADDR-NN600: var(--NN600, #656C7B);--ADDR-NN700: var(--NN700, #4D535E);--ADDR-NN900: var(--NN900, #1E2025);--ADDR-NN950: var(--NN950, #080808);--ADDR-RN500: var(--RN500, #F94D63);--ADDR-SHADOW: var(--NN500, rgba(124, 133, 151, 0.4));\n }.css-8atqhb{width:100%;}.css-14yodyc{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;min-width:1024px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:var(--NN0,#FFFFFF);z-index:999;position:fixed;top:0px;right:0;left:0;border-bottom:1px solid var(--NN50,#F2F4F7);-webkit-transition:-webkit-transform 280ms ease;-webkit-transition:transform 280ms ease;transition:transform 280ms ease;height:121px;}@media (max-width:768px){.css-14yodyc{min-width:768px;}}.css-1e3amw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:32px;z-index:3;background-color:var(--NN50,#F2F4F7);padding:0 32px;position:fixed;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;left:0px;right:0px;}.css-1t2cza5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-width:168px;margin-right:16px;}.css-uwv6bd{width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;background-position:60% 60%;display:inline-block;}.css-3vbzuf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;margin:0 0 0 4px;}.css-3vbzuf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-3vbzuf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-3vbzuf{margin:0 0 0 6px;}} Download Tokopedia App.css-1h8v06c{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;width:533px;gap:32px;}.css-1iga7kf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;}.css-1iga7kf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-1iga7kf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-1iga7kf{margin:0 0 0 6px;}}Tentang TokopediaMitra TokopediaMulai Berjualan PromoTokopedia Care.css-12jp264{width:96%;left:32px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:64px;top:30px;position:fixed;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-isbo03{width:150px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:4px 0 0 4px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-isbo03 img{width:150px;height:40px;object-fit:contain;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-c4s9dq{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;margin:1px 8px 0 24px;}.css-c4s9dq:last-of-type{margin-right:0;}.css-1551isn{width:100%;border-radius:4px;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:background-color 280ms ease;transition:background-color 280ms ease;padding:8px;height:121px;}.css-dqw6r5{color:var(--NN950,#080808);font-size:14px;line-height:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color 280ms ease;transition:color 280ms ease;height:40px;width:74px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-font-smoothing:antialiased;}Kategori.css-nlrenb{position:relative;width:49%;min-width:150px;}@media (min-width:1100px){.css-nlrenb{width:68%;}}@media (min-width:1600px){.css-nlrenb{width:73%;}}.css-w3ze74{width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-j8nuw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;border:solid 1px var(--NN300,#B3BBC9);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:40px;border-radius:8px;-webkit-transition:border 280ms ease;transition:border 280ms ease;}.css-j8nuw5 > div{height:100%;}.css-adxool{width:100%;margin:0;}.css-adxool div{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;}.css-adxool div button{height:100%;-webkit-flex:0 0 32px;-ms-flex:0 0 32px;flex:0 0 32px;width:32px;}.css-adxool div button:after{background-size:20px;}.css-qwqzd5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:inherit;-webkit-flex-grow:inherit;-ms-flex-positive:inherit;flex-grow:inherit;background-color:#FFFFFF;border-radius:8px;border:1px solid #B3BBC9;overflow:hidden;padding-left:8px;padding-right:8px;-webkit-transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);gap:8px;width:100%;height:40px;}.css-qwqzd5 input[type='search']::-webkit-search-decoration,.css-qwqzd5 input[type='search']::-webkit-search-cancel-button,.css-qwqzd5 input[type='search']::-webkit-search-results-button,.css-qwqzd5 input[type='search']::-webkit-search-results-decoration{display:none;}.css-6v0gm9{min-width:0;min-height:0;width:100%;color:var(--NN950,#080808);font-family:inherit;background-color:transparent;line-height:20px;border:none;outline:none;height:auto;font-size:14px;padding-top:8px;padding-bottom:8px;}.css-6v0gm9::-webkit-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::-moz-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9:-ms-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::placeholder{color:var(--NN600,#656C7B);}.css-7lcni7{width:3%;margin:0 0 0 40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;z-index:2;height:58px;z-index:475;}.css-1lsbr8a{width:40px;height:40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-4rpwtd{background-position:0 0;width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;}.css-1jtt7xx{width:1.2px;min-width:1.2px;height:24px;background:var(--NN100,#E6E9F0);margin:0 0 0 24px;}.css-vlg5ix{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;width:158px;margin:0 0 0 24px;}@media (max-width:1100px){.css-vlg5ix{width:16%;}}@media (max-width:768px){.css-vlg5ix{width:23%;}}.css-16r70d4{height:32px;padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--NN0,#FFFFFF);color:var(--GN500,#00AA5B);cursor:pointer;border:1px solid var(--GN500,#00AA5B);}Masuk.css-6c86hb{height:32px;color:var(--NN0,#FFFFFF);padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--GN500,#00AA5B);cursor:pointer;border:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;} Daftar .css-gsve15{position:fixed;top:97px;width:45%;left:309px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:-1;}.css-gsve15 a{color:var(--NN600,#656C7B);line-height:16px;font-size:12px;margin:0 2% 0 0%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer;text-transform:capitalize;}.css-gsve15 a:hover{color:var(--GN500,#00AA5B);}samsung note 10charger mobilsamsung a73pull up barhdd 1tbxbox series x.css-1h819qw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:fixed;top:94px;right:24px;cursor:pointer;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:-1;}@media screen and (max-width:1023px){.css-1h819qw{display:none;}}.css-1mbdz04{z-index:-1;}.css-856ghu{max-width:1188px;min-width:1188px;margin:auto;padding:19px 0 0;}@media only screen and (max-width:1280px){.css-856ghu{max-width:948px;min-width:948px;}}.css-17o7uaz{margin-bottom:19px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-ylrxze-unf-breadcrumb{width:100%;}.css-ylrxze-unf-breadcrumb ol{display:block;list-style:none;position:relative;margin-top:0;margin-bottom:0;padding-left:0;}.css-p2bre6{padding-left:0;margin:0;max-width:50%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.css-p2bre6:hover{max-width:100%;}.css-p2bre6 li{display:inline;}.css-p2bre6 li a{color:var(--GN500,#00AA5B);display:inline;}.css-p2bre6 li p,.css-p2bre6 li a,.css-p2bre6 li a::after{vertical-align:middle;margin-bottom:0;}.css-p2bre6 li h2{display:inline;color:var(--NN950,#080808);vertical-align:middle;}.css-1xg2sgs{display:inline-block;}.css-1xg2sgs a,.css-1xg2sgs span,.css-1xg2sgs h1,.css-1xg2sgs h2,.css-1xg2sgs h3,.css-1xg2sgs h4,.css-1xg2sgs h5,.css-1xg2sgs h6,.css-1xg2sgs p{display:inline-block;margin-top:0;margin-bottom:0;font-family:inherit;font-weight:400;font-size:12px;line-height:22px;}.css-1xg2sgs a:focus-visible,.css-1xg2sgs span:focus-visible,.css-1xg2sgs h1:focus-visible,.css-1xg2sgs h2:focus-visible,.css-1xg2sgs h3:focus-visible,.css-1xg2sgs h4:focus-visible,.css-1xg2sgs h5:focus-visible,.css-1xg2sgs h6:focus-visible,.css-1xg2sgs p:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-1xg2sgs span{color:var(--NN950,#080808);}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-cntvex-unf-heading{display:inline-block;position:relative;font-weight:700;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--GN500,#00AA5B);-webkit-text-decoration:none;text-decoration:none;cursor:pointer;color:var(--NN600,#656C7B);}.css-cntvex-unf-heading:hover{color:var(--GN500,#00AA5B);}Home.css-1p03tq7{position:relative;height:20px;top:-1px;}Makanan & MinumanMinumanKopi Bubuk@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-3h68de-unf-heading{display:block;position:relative;font-weight:800;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:2.2857142857142856rem;line-height:40px;-webkit-letter-spacing:-0.4px;-moz-letter-spacing:-0.4px;-ms-letter-spacing:-0.4px;letter-spacing:-0.4px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;}Kopi Bubuk Kapal Tanker New - 370 Gr - Bubuk Kasar.css-h4ktt6{display:grid;grid-template-columns:minmax(0,348px) minmax(0,468px) minmax(0,268px);grid-template-areas:\"product_media ticker_info variant_options\"\"product_media product_content variant_options\"\"product_media new_variant_options variant_options\"\"product_media product_detail variant_options\"\"product_media obat_keras variant_options\"\"product_media shop_credibility variant_options\"\"product_media shipment_v4 variant_options\"\"product_media shipping variant_options\"\"product_media offerings variant_options\"\"product_media QRCode variant_options\"\"product_media report variant_options\"\"product_detail_media product_detail_media variant_options\"\"review review variant_options\"\"tdn_topads tdn_topads variant_options\"\"discussion_faq discussion_faq variant_options\"\"pdp_1 pdp_1 pdp_1\"\"pdp_2 pdp_2 pdp_2\"\"pdp_3 pdp_3 pdp_3\"\"pdp_4 pdp_4 pdp_4\";grid-column-gap:52px;}@media only screen and (max-width:1280px){.css-h4ktt6{grid-column-gap:40px;grid-template-columns:minmax(0,240px) minmax(0,360px) minmax(0,268px);}}.css-6jnsk6{grid-area:product_media;margin:0;}.css-1nchjne{top:178px;position:-webkit-sticky;position:sticky;}.css-pefdcn{position:relative;overflow:hidden;border-radius:8px;width:100%;height:348px;}@media only screen and (max-width:1280px){.css-pefdcn{height:240px;}}.css-pefdcn div{position:inherit;}.css-pefdcn .active{cursor:pointer;}.css-qjpdc6{display:block;padding:0;outline:0;border:none;width:100%;height:100%;}.css-1logqad{width:100%;height:100%;overflow:hidden;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-1logqad.active{cursor:crosshair;}.css-1logqad.active > div.magnifier{width:100%;height:100%;overflow:hidden;position:absolute;background-repeat:no-repeat;-webkit-animation:animation-dswnjo 0.75s ease-in-out;animation:animation-dswnjo 0.75s ease-in-out;}.css-a9lb7p{width:100%;height:100%;display:block;}.css-1yezavk{position:relative;margin-top:8px;}.css-1yezavk .overflow-image{margin-left:100vw;}.css-1afp10f{width:100%;overflow:hidden;}.css-17wadv5{position:relative;-webkit-transition:-webkit-transform 500ms ease 0s;-webkit-transition:transform 500ms ease 0s;transition:transform 500ms ease 0s;-webkit-transform:translate3d(0px,0px,0px);-ms-transform:translate3d(0px,0px,0px);transform:translate3d(0px,0px,0px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;min-width:100vw;}.css-w2e02c{padding:0;margin-right:7px;border:none;outline:none;background:transparent;}.css-w2e02c > div{width:64px;height:64px;overflow:hidden;cursor:pointer;position:relative;border:2px solid var(--NN0,#FFFFFF);border-radius:8px;-webkit-transition:border-color 0.25s;transition:border-color 0.25s;}.css-w2e02c > div.active{border-color:var(--GN500,#00AA5B);}.css-w2e02c > div:has(.playIcon)::after{content:'';display:block;background:var(--NN1000,rgba(0,0,0,0.2));position:absolute;top:0;left:0;right:0;bottom:0;}.css-w2e02c > div > .playIcon{position:absolute;top:25%;left:25%;width:50%;height:50%;text-align:center;z-index:1;}@media only screen and (max-width:1280px){.css-w2e02c > div{width:44px;height:44px;}}.css-1njw5rp{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);padding:0;border:none;width:24px;height:24px;background:var(--NN700,rgba(77,83,94,0.96));cursor:pointer;}.css-1kyk8bx{right:0px;border-radius:4px 0 0 4px;}.css-1l14ucz{grid-area:ticker_info;margin:0;}.css-37v29a{grid-area:variant_options;margin:0;}.css-17qnh40{position:-webkit-sticky;position:sticky;top:172px;}.css-1vajs1h{border:1px solid var(--NN300,#B3BBC9);border-radius:8px;padding:0 12px;}.css-1xvyax2{margin:12px 0 20px;font-weight:800;font-size:16px;line-height:22px;color:var(--NN950,#080808);text-align:left;}Atur jumlah dan catatan.css-a9vqfi{margin-bottom:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;border-bottom:1px solid var(--NN50,#F2F4F7);padding:0 0 12px;cursor:pointer;background:transparent;text-align:left;width:100%;}.css-a9vqfi > img{width:48px;height:48px;object-fit:contain;margin-right:8px;border-radius:4px;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-1xrvztz-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}.css-1ngblhr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);border:0;}Terpilih: Bubuk Kasar.css-1h8vbi4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-1h8vbi4 p{font-size:1rem;line-height:20px;margin:0;margin-left:8px;color:var(--NN950,#080808);}.css-11lyygd-unf-quantity-editor{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:solid 1px var(--NN300,#B3BBC9);border-radius:8px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;padding:3px;-webkit-transition:border 120ms cubic-bezier(0.2,0.64,0.21,1);transition:border 120ms cubic-bezier(0.2,0.64,0.21,1);min-width:70px;width:102px;}.css-kg1t3r{background-color:transparent;border:none;border-radius:4px;cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:24px;padding:0;width:24px;-webkit-appearance:none;}.css-kg1t3r:hover{background-color:var(--NN50,#F2F4F7);}.css-kg1t3r:hover:disabled{background-color:transparent;}.css-kg1t3r:disabled{cursor:not-allowed;}.css-k973vp-unf-quantity-editor__input{background-color:transparent;border:none;color:var(--NN950,#080808);font-family:inherit;font-size:14px;line-height:18px;outline:none;text-align:center;-webkit-flex-shrink:2;-ms-flex-negative:2;flex-shrink:2;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;width:100%;}.css-k973vp-unf-quantity-editor__input:disabled{color:var(--NN400,#98A3B4);}jumlah@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-101ywxy-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:12px 0;}Stok: 4.906 .css-1f0jhqr p:first-of-type{margin-top:8px;}.css-1f0jhqr p:last-of-type{margin-bottom:8px;}.css-1jbawm2{margin:16px 0;}.css-69i1ev{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-zwbl4o-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN600,#656C7B);-webkit-text-decoration:initial;text-decoration:initial;margin:0;}Subtotal@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-brw1im-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:0;font-weight:bold;font-size:18px;line-height:26px;}Rp33.000.css-auf490-unf-loader-square{width:100%;padding-bottom:40px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1mukdmp-unf-loader-square{width:100%;padding-bottom:40px;margin-bottom:18px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-88k67k{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-88k67k > div{width:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-1vo2exe{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-1vo2exe > div{margin:0;margin-right:8px;}.css-1vo2exe > span{margin-right:8px;}.css-1fig2tm-unf-loader-circle{height:20px;width:20px;margin:auto;margin-bottom:16px;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-gqkxmx-unf-loader-square{width:40%;padding-bottom:10px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1fogemr{grid-area:product_content;margin:0;}.css-jmbq56{margin-bottom:6px;}.css-1nylpq2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;}.css-j63za0{margin:0 0 4px;font-weight:800;font-size:1.2857142857142858rem;line-height:24px;color:var(--NN950,#080808);word-break:break-word;width:100%;}.css-j63za0[data-expanded='false']{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;}Kopi Bubuk Kapal Tanker New - 370 Gr - Bubuk Kasar.css-adcbg8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:16px;}.css-adcbg8 b{color:var(--NN950,#080808);}.css-adcbg8 .items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;color:var(--NN700,#4D535E);}.css-adcbg8 .items svg{vertical-align:text-top !important;}.css-adcbg8 .items > *{display:inline-block;margin-right:8px;}.css-adcbg8 .items > *:last-child{margin-right:0;}.css-adcbg8 .items .main{color:var(--NN950,#080808);}.css-adcbg8 .items *{font-size:1rem;line-height:20px;}.css-1q48dlx-unf-loader-square{width:100%;padding-bottom:21px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1vtq0aq .price{margin-bottom:4px;font-size:2rem;line-height:34px;font-weight:800;color:var(--NN950,#080808);}.css-1vtq0aq .original-price{margin:0 8px 0 4px;display:inline-block;color:var(--NN400,#98A3B4);-webkit-text-decoration-line:line-through;text-decoration-line:line-through;}Rp33.000.css-12lbl8t{grid-area:new_variant_options;margin:0;}.css-xi8lih{background:var(--NN50,#F2F4F7);height:1px;margin:16px 0;}.css-7y3rw8{width:100%;position:relative;background-color:var(--NN0,#FFFFFF);}.css-1b2d3hk{position:relative;z-index:1;}.css-1b2d3hk > div{margin-bottom:24px;}.css-1b2d3hk > div:last-child{margin-bottom:0;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-wfuu7f-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1.1428571428571428rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:0;margin-bottom:12px;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.css-wfuu7f-unf-heading span{text-transform:capitalize;color:var(--NN600,#656C7B);}Pilih rasa: Bubuk Kasar.css-hayuji{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:-2px;}.css-1y1bj62{padding:4px 2px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}.css-1rh0ay1-unf-chip{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;vertical-align:top;margin-bottom:8px;margin-right:8px;background-color:var(--NN0,#FFFFFF);border-radius:12px;border-width:1px;border-style:solid;border-color:var(--NN300,#B3BBC9);border-style:solid;color:var(--NN600,#656C7B);-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;font-size:1rem;line-height:1.2857142857142858rem;height:40px;padding:4px 12px;text-overflow:ellipsis;-webkit-transition:200ms cubic-bezier(0.63,0.01,0.29,1);transition:200ms cubic-bezier(0.63,0.01,0.29,1);white-space:nowrap;overflow:hidden;cursor:pointer;border-radius:12px;position:relative;cursor:pointer;border:1px solid var(--NN300,#B3BBC9);-webkit-transition:all 0s;transition:all 0s;margin:0;}.css-1rh0ay1-unf-chip .e6yxrl0{opacity:1;}.css-1rh0ay1-unf-chip:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-1rh0ay1-unf-chip .promo-label{position:absolute;bottom:-21px;right:-11px;background:var(--RN500,#F94D63);width:26px;height:47px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:10px;padding:2px;}.css-1rh0ay1-unf-chip .promo-label img{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);}.css-1rh0ay1-unf-chip i{margin-right:8px;}.css-1rh0ay1-unf-chip:hover{border:1px solid var(--GN400,#2EBB79);color:var(--GN500,#00AA5B);}Bubuk Halus.css-1pxi8to-unf-chip{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;vertical-align:top;margin-bottom:8px;margin-right:8px;background-color:var(--NN0,#FFFFFF);border-radius:12px;border-width:1px;border-style:solid;border-color:var(--NN300,#B3BBC9);border-style:solid;color:var(--NN600,#656C7B);-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;font-size:1rem;line-height:1.2857142857142858rem;height:40px;padding:4px 12px;text-overflow:ellipsis;-webkit-transition:200ms cubic-bezier(0.63,0.01,0.29,1);transition:200ms cubic-bezier(0.63,0.01,0.29,1);white-space:nowrap;overflow:hidden;cursor:pointer;border-radius:12px;position:relative;cursor:pointer;border:1px solid var(--NN300,#B3BBC9);-webkit-transition:all 0s;transition:all 0s;margin:0;color:var(--GN500,#00AA5B);background-color:var(--GN50,#E5FFF3);border:1px solid var(--GN400,#2EBB79);}.css-1pxi8to-unf-chip .e6yxrl0{opacity:1;}.css-1pxi8to-unf-chip:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-1pxi8to-unf-chip .promo-label{position:absolute;bottom:-21px;right:-11px;background:var(--RN500,#F94D63);width:26px;height:47px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:10px;padding:2px;}.css-1pxi8to-unf-chip .promo-label img{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);}.css-1pxi8to-unf-chip i{margin-right:8px;}.css-1pxi8to-unf-chip:hover{border:1px solid var(--GN400,#2EBB79);color:var(--GN500,#00AA5B);}Bubuk Kasar.css-1ds9ge9{background-color:var(--NN0,#FFFFFF);margin-bottom:0;-webkit-transition:background-color 0.3s ease-in-out;transition:background-color 0.3s ease-in-out;position:absolute;width:calc(100% + 24px);top:-16px;bottom:-16px;left:-12px;}.css-1wa8o67{grid-area:product_detail;margin:0;}.css-1kx9443-unf-tab-wrapper{position:relative;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button{background-color:var(--color-page-background,#FFFFFF);box-shadow:0px 1px 6px var(--color-shadow,rgba(49,53,59,0.12));border:none;border-radius:50%;bottom:0;cursor:pointer;height:40px;margin:auto;opacity:0;position:absolute;top:0;-webkit-transition:opacity 280ms ease-in-out,visibility 280ms ease-in-out;transition:opacity 280ms ease-in-out,visibility 280ms ease-in-out;visibility:hidden;width:40px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button::before{background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/c93e3895.svg);background-repeat:no-repeat;background-size:cover;content:'';display:block;height:32px;margin:auto;width:32px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.prev::before{margin:auto -3px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button:focus{outline:none;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.next{right:-20px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.prev{left:-20px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.next::before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.prev::before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg);}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.active{opacity:1;visibility:visible;}.css-1a9ka7b-unf-tab-holder{background-color:var(--color-page-background,#FFFFFF);border-bottom:1px solid var(--NN300,#B3BBC9);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:44px;overflow-x:auto;overflow-y:hidden;position:relative;white-space:nowrap;min-height:38px;margin-top:-16px;border-bottom:1px solid var(--NN50,#F2F4F7);background-color:var(--NN0,#FFFFFF);}.css-1a9ka7b-unf-tab-holder .ehv0kkf1{background-color:var(--GN500,#00AA5B);}.css-1a9ka7b-unf-tab-holder::-webkit-scrollbar{display:none;}@-moz-document url-prefix(){.css-1a9ka7b-unf-tab-holder{-webkit-scrollbar-width:none;-moz-scrollbar-width:none;-ms-scrollbar-width:none;scrollbar-width:none;}}.css-1a9ka7b-unf-tab-holder .tab-item{padding-top:10px;padding-bottom:10px;height:38px;font-size:1rem;font-weight:800;}.css-3lvael{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;box-sizing:border-box;min-height:44px;padding:10px 24px;line-height:24px;font-weight:800;text-transform:capitalize;font-size:14px;cursor:pointer;background-color:transparent;border:none;-webkit-appearance:none;height:100%;pointer-events:auto;-webkit-transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);}.css-3lvael p,.css-3lvael h1,.css-3lvael h2,.css-3lvael h3,.css-3lvael h4,.css-3lvael h5,.css-3lvael h6,.css-3lvael span{color:var(--GN500,#00AA5B);-webkit-transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);}.css-3lvael:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-3lvael:focus-visible{outline-offset:-2px;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-s30ezu-unf-heading{display:block;position:relative;font-weight:800;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN600,#656C7B);-webkit-text-decoration:initial;text-decoration:initial;color:var(--GN500,#00AA5B);display:inline-block;margin:0;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;width:100%;white-space:nowrap;}Detail.css-1mvqhiu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;box-sizing:border-box;min-height:44px;padding:10px 24px;line-height:24px;font-weight:800;text-transform:capitalize;font-size:14px;cursor:pointer;background-color:transparent;border:none;-webkit-appearance:none;height:100%;pointer-events:auto;-webkit-transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);}.css-1mvqhiu p,.css-1mvqhiu h1,.css-1mvqhiu h2,.css-1mvqhiu h3,.css-1mvqhiu h4,.css-1mvqhiu h5,.css-1mvqhiu h6,.css-1mvqhiu span{color:var(--NN600,#656C7B);-webkit-transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);}.css-1mvqhiu:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-1mvqhiu:focus-visible{outline-offset:-2px;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-1jc1sre-unf-heading{display:block;position:relative;font-weight:800;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN600,#656C7B);-webkit-text-decoration:initial;text-decoration:initial;color:var(--NN600,#656C7B);display:inline-block;margin:0;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;width:100%;white-space:nowrap;}Spesifikasi.css-69sve9-unf-loader-shimmer-line{display:block;height:18px;width:80px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-1v174bd 1.3s linear 1ms infinite backwards;animation:animation-1v174bd 1.3s linear 1ms infinite backwards;}.css-13jshbk-unf-indicator{min-width:16px;width:0px;height:2px;border-radius:1px;background-color:var(--GN500,#00AA5B);position:absolute;bottom:0;left:0px;-webkit-transition-property:left width;transition-property:left width;-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.63,0.01,0.29,1);transition-timing-function:cubic-bezier(0.63,0.01,0.29,1);}.css-1dqq1xv{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column wrap;-ms-flex-flow:column wrap;flex-flow:column wrap;height:72px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:-4px;padding:0;}.css-1i6xy22{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0 12px 4px 0;padding:0;list-style-type:none;color:var(--NN950,#080808);font-size:1rem;line-height:20px;}.css-1i6xy22 span{color:var(--NN600,#656C7B);}.css-1i6xy22 a{color:var(--GN500,#00AA5B);}.css-1i6xy22 .main{color:var(--NN950,#080808);}Kondisi: BaruMin. Pemesanan: 1 BuahEtalase: Kapal Tanker New.css-ti3w3y{margin-top:12px;font-size:1rem;line-height:20px;color:var(--NN950,#080808);}.css-ti3w3y a{color:var(--GN500,#00AA5B);}.css-o0scwi{display:block;overflow:hidden;max-height:160px;}.css-168ydy0{display:-webkit-box;-webkit-line-clamp:unset;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;word-break:break-word;}BERAT PRODUK TELAH BERUBAH MENJADI 350 GR PER DESEMBER 2023Tersedia dalam 2 Varian : Bubuk Halus dan KasarKopi Kapal Tanker merupakan kopi bubuk yang berasal dari Tanjungpinang, Kepulauan Riau dan telah berdiri sejak tahun 1969. Kopi Kapal Tanker terbuat dari campuran biji kopi robusta dan arabika. Diolah dari biji kopi pilihan berkualitas tinggi dengan ramuan istimewa dari para ahli yang berpengalaman dan diproses dengan mesin yang modern. Selain itu kopi bubuk kapal tanker ini menghasilkan secangkir kopi extra pekat dengan aroma yang eksotik untuk menemani hari-harimu. Untuk pembelian grosir atau special order dapat menghubungi :WhatsApp : 081991303231 (Nicho).css-14rxda1{grid-area:obat_keras;margin:0;}.css-1vh65tm{grid-area:shop_credibility;margin:0;}.css-l5k7le{container-name:infowrapper;container-type:inline-size;}.css-l5k7le > h6{color:var(--NN950,#080808);font-size:1rem;line-height:18px;font-weight:bold;margin:0 0 12px;}.css-l5k7le > div:first-of-type{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-l5k7le > div:first-of-type > div:first-of-type{margin-left:0;margin-right:0;margin-top:-4px;}.css-1evwr0q{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;cursor:pointer;}.css-1evwr0q > a{margin-top:-4px;}.css-1m7ut7d-unf-loader-circle{height:48px;width:48px;margin:auto;margin-bottom:16px;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-1bdsrys-unf-loader-shimmer-line{display:block;height:18px;width:70%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:8px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-6qeuhm 1.3s linear 1ms infinite backwards;animation:animation-6qeuhm 1.3s linear 1ms infinite backwards;}.css-p07r9z-unf-loader-shimmer-line{display:block;height:16px;width:40%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-gvn1fk 1.3s linear 1ms infinite backwards;animation:animation-gvn1fk 1.3s linear 1ms infinite backwards;}.css-zzgrvj-unf-loader-shimmer-line{display:block;height:32px;width:98px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-1ayy89j 1.3s linear 1ms infinite backwards;animation:animation-1ayy89j 1.3s linear 1ms infinite backwards;}.css-b6ktge{margin-top:4px;padding-left:60px;}.css-hats6i > span{margin-right:24px;}.css-3b8fj5-unf-loader-shimmer-line{display:block;height:12px;width:40%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-gvn1fk 1.3s linear 1ms infinite backwards;animation:animation-gvn1fk 1.3s linear 1ms infinite backwards;}.css-1pxmbua{grid-area:shipment_v4;margin:0;}.css-1skb446-unf-loader-shimmer-line{display:block;height:18px;width:100px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:12px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-ccaz7r 1.3s linear 1ms infinite backwards;animation:animation-ccaz7r 1.3s linear 1ms infinite backwards;}.css-kljsno-unf-loader-shimmer-line{display:block;height:20px;width:160px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:16px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-z23930 1.3s linear 1ms infinite backwards;animation:animation-z23930 1.3s linear 1ms infinite backwards;}.css-sxoewx-unf-loader-shimmer-line{display:block;height:16px;width:100%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:4px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-czjkem 1.3s linear 1ms infinite backwards;animation:animation-czjkem 1.3s linear 1ms infinite backwards;}.css-nyi49h-unf-loader-shimmer-line{display:block;height:18px;width:50px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-1kvqu35 1.3s linear 1ms infinite backwards;animation:animation-1kvqu35 1.3s linear 1ms infinite backwards;}.css-11fguxp{grid-area:offerings;margin:0;}.css-o5tocw{margin:16px 0 12px;}.css-o5tocw:last-of-type{margin:12px 0 0;}.css-ncf6iv{margin-top:0;margin-bottom:4px;color:var(--NN950,#080808);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-ncf6iv > span:first-of-type{margin-right:12px;}.css-ncf6iv > img{height:24px;width:24px;object-fit:contain;margin-right:8px;}.css-r35o32-unf-loader-shimmer-line{display:block;height:24px;width:24px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-bn3rig 1.3s linear 1ms infinite backwards;animation:animation-bn3rig 1.3s linear 1ms infinite backwards;}.css-cswm5p-unf-loader-shimmer-line{display:block;height:20px;width:50%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-1f554e6 1.3s linear 1ms infinite backwards;animation:animation-1f554e6 1.3s linear 1ms infinite backwards;}.css-2pgwb6{padding-left:32px;color:var(--NN950,#080808);line-height:20px;}.css-2pgwb6 button{border:none;padding:0;background-color:transparent;margin-left:4px;color:var(--GN500,#00AA5B);font-weight:bold;font-size:12px;cursor:pointer;}.css-152p28p-unf-loader-shimmer-line{display:block;height:20px;width:70%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-6qeuhm 1.3s linear 1ms infinite backwards;animation:animation-6qeuhm 1.3s linear 1ms infinite backwards;}.css-988f1b{grid-area:QRCode;margin:0;}.css-12ayxed-unf-loader-square{width:70%;padding-bottom:18px;margin-bottom:1rem;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1cifj2z-unf-loader-square{width:70%;padding-bottom:16px;margin-bottom:.5rem;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-gobzgs-unf-loader-square{width:50%;padding-bottom:16px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1tz9uc{grid-area:report;margin:0;}.css-12ybtew{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;color:var(--NN600,#656C7B);font-size:12px;line-height:18px;}Ada masalah dengan produk ini?.css-1fg794q{padding:0;background-color:var(--NN0,#FFFFFF);color:var(--NN950,#080808);border:none;font-weight:bold;font-size:12px;line-height:18px;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}Laporkan.css-1l72rds{grid-area:product_detail_media;margin:0;}.css-41d95w{grid-area:review;margin:32px 0 0;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-1q7qqos-unf-heading{display:block;position:relative;font-weight:700;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1.1428571428571428rem;line-height:22px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;}ULASAN PEMBELI.css-11a5fji{border-radius:8px;margin-bottom:24px;}.css-tke2v1{border:1px solid var(--NN200,#CFD5E1);padding:2px;border-radius:8px;z-index:10;position:relative;background:white;}.css-15571jq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:16px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:24px 16px 24px;background:var(--NN0,#FFFFFF);}.css-p20wo7{width:240px;}.css-dn7ef3{font-size:28px;font-weight:800;line-height:34px;color:var(--NN950,#080808);margin-right:2px;}5.0.css-u2us88{font-size:16px;color:var(--NN600,#656C7B);line-height:20px;}/ 5.0@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-143g15z-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1.1428571428571428rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:10px 0 0;}99% pembeli merasa puas@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-scw5ei-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN600,#656C7B);-webkit-text-decoration:initial;text-decoration:initial;margin:6px 0 0;}837 rating • 278 ulasan.css-1t9sxbc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-column-gap:16px;column-gap:16px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;height:69px;}.css-10emkyv{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;position:relative;padding:4px 10px;}.css-199yh9f{font-size:12px;color:var(--NN600,#656C7B);width:8px;}5.css-1tidw60-unf-PB{width:87px;}@media (min-width:1281px){.css-1tidw60-unf-PB{width:180px;}}.css-1beabqv-unf-PBB{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-rjsmm1{width:100%;border-radius:4px;overflow:hidden;-webkit-transition:background-color 280ms ease,height 280ms ease;transition:background-color 280ms ease,height 280ms ease;height:6px;background-color:var(--NN100,#E6E9F0);}.css-10es6ym{height:100%;border-radius:4px;-webkit-transition:width 280ms ease,background-color 280ms ease;transition:width 280ms ease,background-color 280ms ease;width:96.65%;background-color:var(--GN400,#2EBB79);}.css-myjxhx{font-size:12px;color:var(--NN600,#656C7B);width:8px;width:36px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}(809)96.65%4.css-si62cm{height:100%;border-radius:4px;-webkit-transition:width 280ms ease,background-color 280ms ease;transition:width 280ms ease,background-color 280ms ease;width:2.87%;background-color:var(--GN400,#2EBB79);}(24)2.87%3.css-79gr4a{height:100%;border-radius:4px;-webkit-transition:width 280ms ease,background-color 280ms ease;transition:width 280ms ease,background-color 280ms ease;width:0.24%;background-color:var(--GN400,#2EBB79);}(2)0.24%2.css-1kcvdzg{height:100%;border-radius:4px;-webkit-transition:width 280ms ease,background-color 280ms ease;transition:width 280ms ease,background-color 280ms ease;width:0%;background-color:var(--GN400,#2EBB79);}(0)0%1(2)0.24%.css-jxzr5i{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;}.css-gcov66{width:228px;margin-right:52px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-1rmen0c{margin:0;border-radius:8px;border:1px solid var(--NN100,#E6E9F0);}.css-1rmen0c [data-unify='LoaderSquare']{margin-left:auto;margin-right:auto;}.css-1rmen0c > div:not(:last-child){border-bottom:1px solid var(--NN50,#F2F4F7);}.css-16c0wxj{padding-top:12px;}.css-16c0wxj .square-circle{text-align:center;}.css-16c0wxj .square-circle [data-unify='LoaderSquare'],.css-16c0wxj .square-circle [data-unify='LoaderCircle']{display:inline-block;}.css-16c0wxj .square-circle [data-unify='LoaderSquare']{margin-right:8px;}.css-1rg0ql7-unf-loader-square{width:200px;padding-bottom:18px;margin-bottom:16px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1rvuej1{padding-top:10px;}.css-1rvuej1 .square-circle{text-align:center;}.css-1rvuej1 .square-circle [data-unify='LoaderSquare'],.css-1rvuej1 .square-circle [data-unify='LoaderCircle']{display:inline-block;}.css-1rvuej1 .square-circle [data-unify='LoaderSquare']{margin-right:8px;}.css-1g0s1ka-unf-loader-square{width:172px;padding-bottom:16px;margin-bottom:16px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-lwg3gz-unf-loader-circle{height:16px;width:16px;margin:auto;margin-bottom:16px;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-2psjkb-unf-loader-square{width:196px;padding-bottom:18px;margin-bottom:16px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1799hu{width:100%;min-width:0;}.css-16mod1d{margin:0 0 32px;}.css-16mod1d .tag{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}.css-16mod1d .images{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-16mod1d .images [data-unify='LoaderSquare']:not(:last-child){margin-right:12px;}@media only screen and (max-width:1280px){.css-16mod1d .tag [data-unify='LoaderSquare']{padding-bottom:12px;}.css-16mod1d .images [data-unify='LoaderSquare']{width:50px;padding-bottom:50px;}}.css-z7x3u0-unf-loader-square{width:34%;padding-bottom:22px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-35545w-unf-loader-square{width:88px;padding-bottom:88px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1b3wv5j{margin:0 0 26px;min-height:62px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-1b3wv5j .tag,.css-1b3wv5j .sort{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.css-1b3wv5j .sort{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;}.css-1b3wv5j .sort [data-unify='LoaderSquare']:not(:last-child){margin-right:8px;}.css-d56g4e-unf-loader-square{width:50%;padding-bottom:24px;margin-bottom:18px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1h45xuq-unf-loader-square{width:70%;padding-bottom:16px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-amcl6j-unf-loader-square{width:25%;padding-bottom:18px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-p8c0r5-unf-loader-square{width:68%;padding-bottom:40px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-fe90sd{margin:0 0 18px;padding:0 0 16px;border-bottom:1px solid var(--NN50,#F2F4F7);}.css-1lz01h{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:8px;}.css-1lz01h span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-1lz01h span [data-unify='LoaderSquare']{margin-right:4px;}.css-1lz01h .more{margin:0;}.css-kmhoxl-unf-loader-square{width:80px;padding-bottom:16px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-80tdys-unf-loader-circle{height:16px;width:16px;margin:auto;margin-bottom:0;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-odx15r{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:4px;}.css-odx15r > .star{margin:0 8px 0 0;}.css-1rpmss3-unf-loader-circle{height:32px;width:32px;margin:auto;margin-bottom:0;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-1hjolod-unf-loader-square{width:160px;padding-bottom:16px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-ohksao-unf-loader-square{width:160px;padding-bottom:16px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1yy27km-unf-loader-square{width:100%;padding-bottom:16px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1nbp2xw-unf-loader-square{width:100%;padding-bottom:16px;margin-bottom:12px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1as1hf5{white-space:nowrap;overflow:hidden;}.css-1as1hf5 > .thumbnail{display:inline-block;margin-right:8px;margin-left:0;}.css-lvox58-unf-loader-square{width:60px;padding-bottom:60px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-xkc8er{margin-top:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}.css-8hwhe7-unf-loader-square{width:28%;padding-bottom:16px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-7p7kcw{grid-area:tdn_topads;margin:0;}.css-1nrrafx{grid-area:discussion_faq;margin:32px 0 0;}.css-rkzj6l-unf-loader-square{width:80%;padding-bottom:32px;margin-bottom:2rem;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1ra39c2{grid-area:pdp_1;margin:0;}.css-1y893tl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;gap:16px;}.css-1xqufcf{background:var(--NN0,#FFFFFF);padding:0 0 3%;width:20%;box-sizing:border-box;}.css-1xqufcf > div{height:100%;}.css-54k5sq{position:relative;background-color:var(--NN0,#FFFFFF);display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%;height:100%;padding:0;box-sizing:border-box;}.css-44qtc5{position:relative;border-radius:8px;min-width:100%;box-shadow:0 1px 6px 0 #F2F4F7;}.css-1v89ogz{background:var(--NN50,#F2F4F7);background-image:linear-gradient(to right,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN50,#F2F4F7) 40%,var(--NN50,#F2F4F7) 100%);background-repeat:no-repeat;background-size:800px 240px;display:inline-block;position:relative;-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:animation-oh6j69;-webkit-animation-timing-function:linear;width:100%;padding-bottom:100%;border-top-right-radius:8px;border-top-left-radius:8px;}.css-1sjn58a{position:relative;padding:10px 8px;}.css-187vc6o{background:var(--NN50,#F2F4F7);background-image:linear-gradient(to right,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN50,#F2F4F7) 40%,var(--NN50,#F2F4F7) 100%);background-repeat:no-repeat;background-size:800px 240px;display:inline-block;position:relative;-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:animation-oh6j69;-webkit-animation-timing-function:linear;display:block;height:12px;margin-bottom:8px;border-radius:8px;}.css-ps1qin{background:var(--NN50,#F2F4F7);background-image:linear-gradient(to right,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN50,#F2F4F7) 40%,var(--NN50,#F2F4F7) 100%);background-repeat:no-repeat;background-size:800px 240px;display:inline-block;position:relative;-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:animation-oh6j69;-webkit-animation-timing-function:linear;display:block;width:50%;height:12px;margin-bottom:8px;border-radius:8px;}.css-1ila14j{background:var(--NN50,#F2F4F7);background-image:linear-gradient(to right,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN50,#F2F4F7) 40%,var(--NN50,#F2F4F7) 100%);background-repeat:no-repeat;background-size:800px 240px;display:inline-block;position:relative;-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:animation-oh6j69;-webkit-animation-timing-function:linear;display:block;width:90%;height:12px;border-radius:8px;}.css-z4w3bx{grid-area:pdp_2;margin:0;}.css-3chof6{grid-area:pdp_3;margin:0;}.css-vl9mmn{grid-area:pdp_4;margin:0;}.css-ucvmud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:0;}.css-pje1ph-unf-loader-shimmer-line{border-radius:4px;display:block;height:256px;width:100%;background:var(--NN50,#F2F4F7);margin-bottom:8px;background-image:linear-gradient(120deg,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN100,#E6E9F0) 40%,var(--NN50,#F2F4F7) 100%);background-size:100%;background-repeat:no-repeat;-webkit-animation:animation-ogpi78 1.3s linear 1ms infinite backwards;animation:animation-ogpi78 1.3s linear 1ms infinite backwards;}.css-13j0czf{border-top:1px solid var(--NN300,#B3BBC9);width:100%;padding:50px;background-color:var(--NN0,#FFFFFF);}.css-13j0czf .inner{width:80%;margin:0 auto;}.css-o2nzpd-unf-loader-square{width:100%;padding-bottom:24px;margin-bottom:16px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}"
## [3] ".css-14yodyc{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;min-width:1024px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:var(--NN0,#FFFFFF);z-index:999;position:fixed;top:0px;right:0;left:0;border-bottom:1px solid var(--NN50,#F2F4F7);-webkit-transition:-webkit-transform 280ms ease;-webkit-transition:transform 280ms ease;transition:transform 280ms ease;height:121px;}@media (max-width:768px){.css-14yodyc{min-width:768px;}}.css-1e3amw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:32px;z-index:3;background-color:var(--NN50,#F2F4F7);padding:0 32px;position:fixed;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;left:0px;right:0px;}.css-1t2cza5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-width:168px;margin-right:16px;}.css-uwv6bd{width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;background-position:60% 60%;display:inline-block;}.css-3vbzuf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;margin:0 0 0 4px;}.css-3vbzuf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-3vbzuf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-3vbzuf{margin:0 0 0 6px;}} Download Tokopedia App.css-1h8v06c{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;width:533px;gap:32px;}.css-1iga7kf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;}.css-1iga7kf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-1iga7kf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-1iga7kf{margin:0 0 0 6px;}}Tentang TokopediaMitra TokopediaMulai Berjualan PromoTokopedia Care.css-12jp264{width:96%;left:32px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:64px;top:30px;position:fixed;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-isbo03{width:150px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:4px 0 0 4px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-isbo03 img{width:150px;height:40px;object-fit:contain;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-c4s9dq{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;margin:1px 8px 0 24px;}.css-c4s9dq:last-of-type{margin-right:0;}.css-1551isn{width:100%;border-radius:4px;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:background-color 280ms ease;transition:background-color 280ms ease;padding:8px;height:121px;}.css-dqw6r5{color:var(--NN950,#080808);font-size:14px;line-height:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color 280ms ease;transition:color 280ms ease;height:40px;width:74px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-font-smoothing:antialiased;}Kategori.css-nlrenb{position:relative;width:49%;min-width:150px;}@media (min-width:1100px){.css-nlrenb{width:68%;}}@media (min-width:1600px){.css-nlrenb{width:73%;}}.css-w3ze74{width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-j8nuw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;border:solid 1px var(--NN300,#B3BBC9);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:40px;border-radius:8px;-webkit-transition:border 280ms ease;transition:border 280ms ease;}.css-j8nuw5 > div{height:100%;}.css-adxool{width:100%;margin:0;}.css-adxool div{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;}.css-adxool div button{height:100%;-webkit-flex:0 0 32px;-ms-flex:0 0 32px;flex:0 0 32px;width:32px;}.css-adxool div button:after{background-size:20px;}.css-qwqzd5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:inherit;-webkit-flex-grow:inherit;-ms-flex-positive:inherit;flex-grow:inherit;background-color:#FFFFFF;border-radius:8px;border:1px solid #B3BBC9;overflow:hidden;padding-left:8px;padding-right:8px;-webkit-transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);gap:8px;width:100%;height:40px;}.css-qwqzd5 input[type='search']::-webkit-search-decoration,.css-qwqzd5 input[type='search']::-webkit-search-cancel-button,.css-qwqzd5 input[type='search']::-webkit-search-results-button,.css-qwqzd5 input[type='search']::-webkit-search-results-decoration{display:none;}.css-6v0gm9{min-width:0;min-height:0;width:100%;color:var(--NN950,#080808);font-family:inherit;background-color:transparent;line-height:20px;border:none;outline:none;height:auto;font-size:14px;padding-top:8px;padding-bottom:8px;}.css-6v0gm9::-webkit-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::-moz-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9:-ms-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::placeholder{color:var(--NN600,#656C7B);}.css-7lcni7{width:3%;margin:0 0 0 40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;z-index:2;height:58px;z-index:475;}.css-1lsbr8a{width:40px;height:40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-4rpwtd{background-position:0 0;width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;}.css-1jtt7xx{width:1.2px;min-width:1.2px;height:24px;background:var(--NN100,#E6E9F0);margin:0 0 0 24px;}.css-vlg5ix{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;width:158px;margin:0 0 0 24px;}@media (max-width:1100px){.css-vlg5ix{width:16%;}}@media (max-width:768px){.css-vlg5ix{width:23%;}}.css-16r70d4{height:32px;padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--NN0,#FFFFFF);color:var(--GN500,#00AA5B);cursor:pointer;border:1px solid var(--GN500,#00AA5B);}Masuk.css-6c86hb{height:32px;color:var(--NN0,#FFFFFF);padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--GN500,#00AA5B);cursor:pointer;border:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;} Daftar .css-gsve15{position:fixed;top:97px;width:45%;left:309px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:-1;}.css-gsve15 a{color:var(--NN600,#656C7B);line-height:16px;font-size:12px;margin:0 2% 0 0%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer;text-transform:capitalize;}.css-gsve15 a:hover{color:var(--GN500,#00AA5B);}samsung note 10charger mobilsamsung a73pull up barhdd 1tbxbox series x.css-1h819qw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:fixed;top:94px;right:24px;cursor:pointer;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:-1;}@media screen and (max-width:1023px){.css-1h819qw{display:none;}}.css-1mbdz04{z-index:-1;}.css-856ghu{max-width:1188px;min-width:1188px;margin:auto;padding:19px 0 0;}@media only screen and (max-width:1280px){.css-856ghu{max-width:948px;min-width:948px;}}.css-17o7uaz{margin-bottom:19px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-ylrxze-unf-breadcrumb{width:100%;}.css-ylrxze-unf-breadcrumb ol{display:block;list-style:none;position:relative;margin-top:0;margin-bottom:0;padding-left:0;}.css-p2bre6{padding-left:0;margin:0;max-width:50%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.css-p2bre6:hover{max-width:100%;}.css-p2bre6 li{display:inline;}.css-p2bre6 li a{color:var(--GN500,#00AA5B);display:inline;}.css-p2bre6 li p,.css-p2bre6 li a,.css-p2bre6 li a::after{vertical-align:middle;margin-bottom:0;}.css-p2bre6 li h2{display:inline;color:var(--NN950,#080808);vertical-align:middle;}.css-1xg2sgs{display:inline-block;}.css-1xg2sgs a,.css-1xg2sgs span,.css-1xg2sgs h1,.css-1xg2sgs h2,.css-1xg2sgs h3,.css-1xg2sgs h4,.css-1xg2sgs h5,.css-1xg2sgs h6,.css-1xg2sgs p{display:inline-block;margin-top:0;margin-bottom:0;font-family:inherit;font-weight:400;font-size:12px;line-height:22px;}.css-1xg2sgs a:focus-visible,.css-1xg2sgs span:focus-visible,.css-1xg2sgs h1:focus-visible,.css-1xg2sgs h2:focus-visible,.css-1xg2sgs h3:focus-visible,.css-1xg2sgs h4:focus-visible,.css-1xg2sgs h5:focus-visible,.css-1xg2sgs h6:focus-visible,.css-1xg2sgs p:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-1xg2sgs span{color:var(--NN950,#080808);}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-cntvex-unf-heading{display:inline-block;position:relative;font-weight:700;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--GN500,#00AA5B);-webkit-text-decoration:none;text-decoration:none;cursor:pointer;color:var(--NN600,#656C7B);}.css-cntvex-unf-heading:hover{color:var(--GN500,#00AA5B);}Home.css-1p03tq7{position:relative;height:20px;top:-1px;}Makanan & MinumanMinumanKopi Bubuk@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-3h68de-unf-heading{display:block;position:relative;font-weight:800;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:2.2857142857142856rem;line-height:40px;-webkit-letter-spacing:-0.4px;-moz-letter-spacing:-0.4px;-ms-letter-spacing:-0.4px;letter-spacing:-0.4px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;}Kopi Bubuk Kapal Tanker New - 370 Gr - Bubuk Kasar.css-h4ktt6{display:grid;grid-template-columns:minmax(0,348px) minmax(0,468px) minmax(0,268px);grid-template-areas:\"product_media ticker_info variant_options\"\"product_media product_content variant_options\"\"product_media new_variant_options variant_options\"\"product_media product_detail variant_options\"\"product_media obat_keras variant_options\"\"product_media shop_credibility variant_options\"\"product_media shipment_v4 variant_options\"\"product_media shipping variant_options\"\"product_media offerings variant_options\"\"product_media QRCode variant_options\"\"product_media report variant_options\"\"product_detail_media product_detail_media variant_options\"\"review review variant_options\"\"tdn_topads tdn_topads variant_options\"\"discussion_faq discussion_faq variant_options\"\"pdp_1 pdp_1 pdp_1\"\"pdp_2 pdp_2 pdp_2\"\"pdp_3 pdp_3 pdp_3\"\"pdp_4 pdp_4 pdp_4\";grid-column-gap:52px;}@media only screen and (max-width:1280px){.css-h4ktt6{grid-column-gap:40px;grid-template-columns:minmax(0,240px) minmax(0,360px) minmax(0,268px);}}.css-6jnsk6{grid-area:product_media;margin:0;}.css-1nchjne{top:178px;position:-webkit-sticky;position:sticky;}.css-pefdcn{position:relative;overflow:hidden;border-radius:8px;width:100%;height:348px;}@media only screen and (max-width:1280px){.css-pefdcn{height:240px;}}.css-pefdcn div{position:inherit;}.css-pefdcn .active{cursor:pointer;}.css-qjpdc6{display:block;padding:0;outline:0;border:none;width:100%;height:100%;}.css-1logqad{width:100%;height:100%;overflow:hidden;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-1logqad.active{cursor:crosshair;}.css-1logqad.active > div.magnifier{width:100%;height:100%;overflow:hidden;position:absolute;background-repeat:no-repeat;-webkit-animation:animation-dswnjo 0.75s ease-in-out;animation:animation-dswnjo 0.75s ease-in-out;}.css-a9lb7p{width:100%;height:100%;display:block;}.css-1yezavk{position:relative;margin-top:8px;}.css-1yezavk .overflow-image{margin-left:100vw;}.css-1afp10f{width:100%;overflow:hidden;}.css-17wadv5{position:relative;-webkit-transition:-webkit-transform 500ms ease 0s;-webkit-transition:transform 500ms ease 0s;transition:transform 500ms ease 0s;-webkit-transform:translate3d(0px,0px,0px);-ms-transform:translate3d(0px,0px,0px);transform:translate3d(0px,0px,0px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;min-width:100vw;}.css-w2e02c{padding:0;margin-right:7px;border:none;outline:none;background:transparent;}.css-w2e02c > div{width:64px;height:64px;overflow:hidden;cursor:pointer;position:relative;border:2px solid var(--NN0,#FFFFFF);border-radius:8px;-webkit-transition:border-color 0.25s;transition:border-color 0.25s;}.css-w2e02c > div.active{border-color:var(--GN500,#00AA5B);}.css-w2e02c > div:has(.playIcon)::after{content:'';display:block;background:var(--NN1000,rgba(0,0,0,0.2));position:absolute;top:0;left:0;right:0;bottom:0;}.css-w2e02c > div > .playIcon{position:absolute;top:25%;left:25%;width:50%;height:50%;text-align:center;z-index:1;}@media only screen and (max-width:1280px){.css-w2e02c > div{width:44px;height:44px;}}.css-1njw5rp{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);padding:0;border:none;width:24px;height:24px;background:var(--NN700,rgba(77,83,94,0.96));cursor:pointer;}.css-1kyk8bx{right:0px;border-radius:4px 0 0 4px;}.css-1l14ucz{grid-area:ticker_info;margin:0;}.css-37v29a{grid-area:variant_options;margin:0;}.css-17qnh40{position:-webkit-sticky;position:sticky;top:172px;}.css-1vajs1h{border:1px solid var(--NN300,#B3BBC9);border-radius:8px;padding:0 12px;}.css-1xvyax2{margin:12px 0 20px;font-weight:800;font-size:16px;line-height:22px;color:var(--NN950,#080808);text-align:left;}Atur jumlah dan catatan.css-a9vqfi{margin-bottom:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;border-bottom:1px solid var(--NN50,#F2F4F7);padding:0 0 12px;cursor:pointer;background:transparent;text-align:left;width:100%;}.css-a9vqfi > img{width:48px;height:48px;object-fit:contain;margin-right:8px;border-radius:4px;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-1xrvztz-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}.css-1ngblhr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);border:0;}Terpilih: Bubuk Kasar.css-1h8vbi4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-1h8vbi4 p{font-size:1rem;line-height:20px;margin:0;margin-left:8px;color:var(--NN950,#080808);}.css-11lyygd-unf-quantity-editor{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:solid 1px var(--NN300,#B3BBC9);border-radius:8px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;padding:3px;-webkit-transition:border 120ms cubic-bezier(0.2,0.64,0.21,1);transition:border 120ms cubic-bezier(0.2,0.64,0.21,1);min-width:70px;width:102px;}.css-kg1t3r{background-color:transparent;border:none;border-radius:4px;cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:24px;padding:0;width:24px;-webkit-appearance:none;}.css-kg1t3r:hover{background-color:var(--NN50,#F2F4F7);}.css-kg1t3r:hover:disabled{background-color:transparent;}.css-kg1t3r:disabled{cursor:not-allowed;}.css-k973vp-unf-quantity-editor__input{background-color:transparent;border:none;color:var(--NN950,#080808);font-family:inherit;font-size:14px;line-height:18px;outline:none;text-align:center;-webkit-flex-shrink:2;-ms-flex-negative:2;flex-shrink:2;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;width:100%;}.css-k973vp-unf-quantity-editor__input:disabled{color:var(--NN400,#98A3B4);}jumlah@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-101ywxy-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:12px 0;}Stok: 4.906 .css-1f0jhqr p:first-of-type{margin-top:8px;}.css-1f0jhqr p:last-of-type{margin-bottom:8px;}.css-1jbawm2{margin:16px 0;}.css-69i1ev{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-zwbl4o-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN600,#656C7B);-webkit-text-decoration:initial;text-decoration:initial;margin:0;}Subtotal@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-brw1im-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:0;font-weight:bold;font-size:18px;line-height:26px;}Rp33.000.css-auf490-unf-loader-square{width:100%;padding-bottom:40px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1mukdmp-unf-loader-square{width:100%;padding-bottom:40px;margin-bottom:18px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-88k67k{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-88k67k > div{width:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-1vo2exe{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-1vo2exe > div{margin:0;margin-right:8px;}.css-1vo2exe > span{margin-right:8px;}.css-1fig2tm-unf-loader-circle{height:20px;width:20px;margin:auto;margin-bottom:16px;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-gqkxmx-unf-loader-square{width:40%;padding-bottom:10px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1fogemr{grid-area:product_content;margin:0;}.css-jmbq56{margin-bottom:6px;}.css-1nylpq2{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-webkit-box-align:flex-end;-ms-flex-align:flex-end;align-items:flex-end;}.css-j63za0{margin:0 0 4px;font-weight:800;font-size:1.2857142857142858rem;line-height:24px;color:var(--NN950,#080808);word-break:break-word;width:100%;}.css-j63za0[data-expanded='false']{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;}Kopi Bubuk Kapal Tanker New - 370 Gr - Bubuk Kasar.css-adcbg8{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:16px;}.css-adcbg8 b{color:var(--NN950,#080808);}.css-adcbg8 .items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;color:var(--NN700,#4D535E);}.css-adcbg8 .items svg{vertical-align:text-top !important;}.css-adcbg8 .items > *{display:inline-block;margin-right:8px;}.css-adcbg8 .items > *:last-child{margin-right:0;}.css-adcbg8 .items .main{color:var(--NN950,#080808);}.css-adcbg8 .items *{font-size:1rem;line-height:20px;}.css-1q48dlx-unf-loader-square{width:100%;padding-bottom:21px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1vtq0aq .price{margin-bottom:4px;font-size:2rem;line-height:34px;font-weight:800;color:var(--NN950,#080808);}.css-1vtq0aq .original-price{margin:0 8px 0 4px;display:inline-block;color:var(--NN400,#98A3B4);-webkit-text-decoration-line:line-through;text-decoration-line:line-through;}Rp33.000.css-12lbl8t{grid-area:new_variant_options;margin:0;}.css-xi8lih{background:var(--NN50,#F2F4F7);height:1px;margin:16px 0;}.css-7y3rw8{width:100%;position:relative;background-color:var(--NN0,#FFFFFF);}.css-1b2d3hk{position:relative;z-index:1;}.css-1b2d3hk > div{margin-bottom:24px;}.css-1b2d3hk > div:last-child{margin-bottom:0;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-wfuu7f-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1.1428571428571428rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:0;margin-bottom:12px;line-height:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.css-wfuu7f-unf-heading span{text-transform:capitalize;color:var(--NN600,#656C7B);}Pilih rasa: Bubuk Kasar.css-hayuji{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-left:-2px;}.css-1y1bj62{padding:4px 2px;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}.css-1rh0ay1-unf-chip{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;vertical-align:top;margin-bottom:8px;margin-right:8px;background-color:var(--NN0,#FFFFFF);border-radius:12px;border-width:1px;border-style:solid;border-color:var(--NN300,#B3BBC9);border-style:solid;color:var(--NN600,#656C7B);-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;font-size:1rem;line-height:1.2857142857142858rem;height:40px;padding:4px 12px;text-overflow:ellipsis;-webkit-transition:200ms cubic-bezier(0.63,0.01,0.29,1);transition:200ms cubic-bezier(0.63,0.01,0.29,1);white-space:nowrap;overflow:hidden;cursor:pointer;border-radius:12px;position:relative;cursor:pointer;border:1px solid var(--NN300,#B3BBC9);-webkit-transition:all 0s;transition:all 0s;margin:0;}.css-1rh0ay1-unf-chip .e6yxrl0{opacity:1;}.css-1rh0ay1-unf-chip:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-1rh0ay1-unf-chip .promo-label{position:absolute;bottom:-21px;right:-11px;background:var(--RN500,#F94D63);width:26px;height:47px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:10px;padding:2px;}.css-1rh0ay1-unf-chip .promo-label img{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);}.css-1rh0ay1-unf-chip i{margin-right:8px;}.css-1rh0ay1-unf-chip:hover{border:1px solid var(--GN400,#2EBB79);color:var(--GN500,#00AA5B);}Bubuk Halus.css-1pxi8to-unf-chip{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;vertical-align:top;margin-bottom:8px;margin-right:8px;background-color:var(--NN0,#FFFFFF);border-radius:12px;border-width:1px;border-style:solid;border-color:var(--NN300,#B3BBC9);border-style:solid;color:var(--NN600,#656C7B);-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;font-size:1rem;line-height:1.2857142857142858rem;height:40px;padding:4px 12px;text-overflow:ellipsis;-webkit-transition:200ms cubic-bezier(0.63,0.01,0.29,1);transition:200ms cubic-bezier(0.63,0.01,0.29,1);white-space:nowrap;overflow:hidden;cursor:pointer;border-radius:12px;position:relative;cursor:pointer;border:1px solid var(--NN300,#B3BBC9);-webkit-transition:all 0s;transition:all 0s;margin:0;color:var(--GN500,#00AA5B);background-color:var(--GN50,#E5FFF3);border:1px solid var(--GN400,#2EBB79);}.css-1pxi8to-unf-chip .e6yxrl0{opacity:1;}.css-1pxi8to-unf-chip:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-1pxi8to-unf-chip .promo-label{position:absolute;bottom:-21px;right:-11px;background:var(--RN500,#F94D63);width:26px;height:47px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-size:10px;padding:2px;}.css-1pxi8to-unf-chip .promo-label img{-webkit-transform:rotate(135deg);-ms-transform:rotate(135deg);transform:rotate(135deg);}.css-1pxi8to-unf-chip i{margin-right:8px;}.css-1pxi8to-unf-chip:hover{border:1px solid var(--GN400,#2EBB79);color:var(--GN500,#00AA5B);}Bubuk Kasar.css-1ds9ge9{background-color:var(--NN0,#FFFFFF);margin-bottom:0;-webkit-transition:background-color 0.3s ease-in-out;transition:background-color 0.3s ease-in-out;position:absolute;width:calc(100% + 24px);top:-16px;bottom:-16px;left:-12px;}.css-1wa8o67{grid-area:product_detail;margin:0;}.css-1kx9443-unf-tab-wrapper{position:relative;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button{background-color:var(--color-page-background,#FFFFFF);box-shadow:0px 1px 6px var(--color-shadow,rgba(49,53,59,0.12));border:none;border-radius:50%;bottom:0;cursor:pointer;height:40px;margin:auto;opacity:0;position:absolute;top:0;-webkit-transition:opacity 280ms ease-in-out,visibility 280ms ease-in-out;transition:opacity 280ms ease-in-out,visibility 280ms ease-in-out;visibility:hidden;width:40px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button::before{background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/c93e3895.svg);background-repeat:no-repeat;background-size:cover;content:'';display:block;height:32px;margin:auto;width:32px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.prev::before{margin:auto -3px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button:focus{outline:none;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.next{right:-20px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.prev{left:-20px;}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.next::before{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.prev::before{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg);}.css-1kx9443-unf-tab-wrapper > .unf-tab__button.active{opacity:1;visibility:visible;}.css-1a9ka7b-unf-tab-holder{background-color:var(--color-page-background,#FFFFFF);border-bottom:1px solid var(--NN300,#B3BBC9);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-height:44px;overflow-x:auto;overflow-y:hidden;position:relative;white-space:nowrap;min-height:38px;margin-top:-16px;border-bottom:1px solid var(--NN50,#F2F4F7);background-color:var(--NN0,#FFFFFF);}.css-1a9ka7b-unf-tab-holder .ehv0kkf1{background-color:var(--GN500,#00AA5B);}.css-1a9ka7b-unf-tab-holder::-webkit-scrollbar{display:none;}@-moz-document url-prefix(){.css-1a9ka7b-unf-tab-holder{-webkit-scrollbar-width:none;-moz-scrollbar-width:none;-ms-scrollbar-width:none;scrollbar-width:none;}}.css-1a9ka7b-unf-tab-holder .tab-item{padding-top:10px;padding-bottom:10px;height:38px;font-size:1rem;font-weight:800;}.css-3lvael{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;box-sizing:border-box;min-height:44px;padding:10px 24px;line-height:24px;font-weight:800;text-transform:capitalize;font-size:14px;cursor:pointer;background-color:transparent;border:none;-webkit-appearance:none;height:100%;pointer-events:auto;-webkit-transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);}.css-3lvael p,.css-3lvael h1,.css-3lvael h2,.css-3lvael h3,.css-3lvael h4,.css-3lvael h5,.css-3lvael h6,.css-3lvael span{color:var(--GN500,#00AA5B);-webkit-transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);}.css-3lvael:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-3lvael:focus-visible{outline-offset:-2px;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-s30ezu-unf-heading{display:block;position:relative;font-weight:800;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN600,#656C7B);-webkit-text-decoration:initial;text-decoration:initial;color:var(--GN500,#00AA5B);display:inline-block;margin:0;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;width:100%;white-space:nowrap;}Detail.css-1mvqhiu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;box-sizing:border-box;min-height:44px;padding:10px 24px;line-height:24px;font-weight:800;text-transform:capitalize;font-size:14px;cursor:pointer;background-color:transparent;border:none;-webkit-appearance:none;height:100%;pointer-events:auto;-webkit-transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);}.css-1mvqhiu p,.css-1mvqhiu h1,.css-1mvqhiu h2,.css-1mvqhiu h3,.css-1mvqhiu h4,.css-1mvqhiu h5,.css-1mvqhiu h6,.css-1mvqhiu span{color:var(--NN600,#656C7B);-webkit-transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:color 300ms cubic-bezier(0.63,0.01,0.29,1);}.css-1mvqhiu:focus-visible{outline:2px dotted var(--PN500,#9342ED);outline-offset:3px;}.css-1mvqhiu:focus-visible{outline-offset:-2px;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-1jc1sre-unf-heading{display:block;position:relative;font-weight:800;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN600,#656C7B);-webkit-text-decoration:initial;text-decoration:initial;color:var(--NN600,#656C7B);display:inline-block;margin:0;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;width:100%;white-space:nowrap;}Spesifikasi.css-69sve9-unf-loader-shimmer-line{display:block;height:18px;width:80px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-1v174bd 1.3s linear 1ms infinite backwards;animation:animation-1v174bd 1.3s linear 1ms infinite backwards;}.css-13jshbk-unf-indicator{min-width:16px;width:0px;height:2px;border-radius:1px;background-color:var(--GN500,#00AA5B);position:absolute;bottom:0;left:0px;-webkit-transition-property:left width;transition-property:left width;-webkit-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.63,0.01,0.29,1);transition-timing-function:cubic-bezier(0.63,0.01,0.29,1);}.css-1dqq1xv{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column wrap;-ms-flex-flow:column wrap;flex-flow:column wrap;height:72px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:-4px;padding:0;}.css-1i6xy22{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0 12px 4px 0;padding:0;list-style-type:none;color:var(--NN950,#080808);font-size:1rem;line-height:20px;}.css-1i6xy22 span{color:var(--NN600,#656C7B);}.css-1i6xy22 a{color:var(--GN500,#00AA5B);}.css-1i6xy22 .main{color:var(--NN950,#080808);}Kondisi: BaruMin. Pemesanan: 1 BuahEtalase: Kapal Tanker New.css-ti3w3y{margin-top:12px;font-size:1rem;line-height:20px;color:var(--NN950,#080808);}.css-ti3w3y a{color:var(--GN500,#00AA5B);}.css-o0scwi{display:block;overflow:hidden;max-height:160px;}.css-168ydy0{display:-webkit-box;-webkit-line-clamp:unset;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;word-break:break-word;}BERAT PRODUK TELAH BERUBAH MENJADI 350 GR PER DESEMBER 2023Tersedia dalam 2 Varian : Bubuk Halus dan KasarKopi Kapal Tanker merupakan kopi bubuk yang berasal dari Tanjungpinang, Kepulauan Riau dan telah berdiri sejak tahun 1969. Kopi Kapal Tanker terbuat dari campuran biji kopi robusta dan arabika. Diolah dari biji kopi pilihan berkualitas tinggi dengan ramuan istimewa dari para ahli yang berpengalaman dan diproses dengan mesin yang modern. Selain itu kopi bubuk kapal tanker ini menghasilkan secangkir kopi extra pekat dengan aroma yang eksotik untuk menemani hari-harimu. Untuk pembelian grosir atau special order dapat menghubungi :WhatsApp : 081991303231 (Nicho).css-14rxda1{grid-area:obat_keras;margin:0;}.css-1vh65tm{grid-area:shop_credibility;margin:0;}.css-l5k7le{container-name:infowrapper;container-type:inline-size;}.css-l5k7le > h6{color:var(--NN950,#080808);font-size:1rem;line-height:18px;font-weight:bold;margin:0 0 12px;}.css-l5k7le > div:first-of-type{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-l5k7le > div:first-of-type > div:first-of-type{margin-left:0;margin-right:0;margin-top:-4px;}.css-1evwr0q{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;cursor:pointer;}.css-1evwr0q > a{margin-top:-4px;}.css-1m7ut7d-unf-loader-circle{height:48px;width:48px;margin:auto;margin-bottom:16px;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-1bdsrys-unf-loader-shimmer-line{display:block;height:18px;width:70%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:8px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-6qeuhm 1.3s linear 1ms infinite backwards;animation:animation-6qeuhm 1.3s linear 1ms infinite backwards;}.css-p07r9z-unf-loader-shimmer-line{display:block;height:16px;width:40%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-gvn1fk 1.3s linear 1ms infinite backwards;animation:animation-gvn1fk 1.3s linear 1ms infinite backwards;}.css-zzgrvj-unf-loader-shimmer-line{display:block;height:32px;width:98px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-1ayy89j 1.3s linear 1ms infinite backwards;animation:animation-1ayy89j 1.3s linear 1ms infinite backwards;}.css-b6ktge{margin-top:4px;padding-left:60px;}.css-hats6i > span{margin-right:24px;}.css-3b8fj5-unf-loader-shimmer-line{display:block;height:12px;width:40%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-gvn1fk 1.3s linear 1ms infinite backwards;animation:animation-gvn1fk 1.3s linear 1ms infinite backwards;}.css-1pxmbua{grid-area:shipment_v4;margin:0;}.css-1skb446-unf-loader-shimmer-line{display:block;height:18px;width:100px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:12px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-ccaz7r 1.3s linear 1ms infinite backwards;animation:animation-ccaz7r 1.3s linear 1ms infinite backwards;}.css-kljsno-unf-loader-shimmer-line{display:block;height:20px;width:160px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:16px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-z23930 1.3s linear 1ms infinite backwards;animation:animation-z23930 1.3s linear 1ms infinite backwards;}.css-sxoewx-unf-loader-shimmer-line{display:block;height:16px;width:100%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:4px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-czjkem 1.3s linear 1ms infinite backwards;animation:animation-czjkem 1.3s linear 1ms infinite backwards;}.css-nyi49h-unf-loader-shimmer-line{display:block;height:18px;width:50px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-1kvqu35 1.3s linear 1ms infinite backwards;animation:animation-1kvqu35 1.3s linear 1ms infinite backwards;}.css-11fguxp{grid-area:offerings;margin:0;}.css-o5tocw{margin:16px 0 12px;}.css-o5tocw:last-of-type{margin:12px 0 0;}.css-ncf6iv{margin-top:0;margin-bottom:4px;color:var(--NN950,#080808);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-ncf6iv > span:first-of-type{margin-right:12px;}.css-ncf6iv > img{height:24px;width:24px;object-fit:contain;margin-right:8px;}.css-r35o32-unf-loader-shimmer-line{display:block;height:24px;width:24px;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-bn3rig 1.3s linear 1ms infinite backwards;animation:animation-bn3rig 1.3s linear 1ms infinite backwards;}.css-cswm5p-unf-loader-shimmer-line{display:block;height:20px;width:50%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-1f554e6 1.3s linear 1ms infinite backwards;animation:animation-1f554e6 1.3s linear 1ms infinite backwards;}.css-2pgwb6{padding-left:32px;color:var(--NN950,#080808);line-height:20px;}.css-2pgwb6 button{border:none;padding:0;background-color:transparent;margin-left:4px;color:var(--GN500,#00AA5B);font-weight:bold;font-size:12px;cursor:pointer;}.css-152p28p-unf-loader-shimmer-line{display:block;height:20px;width:70%;border-radius:4px;background-color:var(--NN100,#E6E9F0);margin-bottom:0px;background-image:linear-gradient(89deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));background-size:99% 100%;background-repeat:no-repeat;-webkit-animation:animation-6qeuhm 1.3s linear 1ms infinite backwards;animation:animation-6qeuhm 1.3s linear 1ms infinite backwards;}.css-988f1b{grid-area:QRCode;margin:0;}.css-12ayxed-unf-loader-square{width:70%;padding-bottom:18px;margin-bottom:1rem;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1cifj2z-unf-loader-square{width:70%;padding-bottom:16px;margin-bottom:.5rem;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-gobzgs-unf-loader-square{width:50%;padding-bottom:16px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1tz9uc{grid-area:report;margin:0;}.css-12ybtew{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;color:var(--NN600,#656C7B);font-size:12px;line-height:18px;}Ada masalah dengan produk ini?.css-1fg794q{padding:0;background-color:var(--NN0,#FFFFFF);color:var(--NN950,#080808);border:none;font-weight:bold;font-size:12px;line-height:18px;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}Laporkan.css-1l72rds{grid-area:product_detail_media;margin:0;}.css-41d95w{grid-area:review;margin:32px 0 0;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-1q7qqos-unf-heading{display:block;position:relative;font-weight:700;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1.1428571428571428rem;line-height:22px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;}ULASAN PEMBELI.css-11a5fji{border-radius:8px;margin-bottom:24px;}.css-tke2v1{border:1px solid var(--NN200,#CFD5E1);padding:2px;border-radius:8px;z-index:10;position:relative;background:white;}.css-15571jq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:16px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:24px 16px 24px;background:var(--NN0,#FFFFFF);}.css-p20wo7{width:240px;}.css-dn7ef3{font-size:28px;font-weight:800;line-height:34px;color:var(--NN950,#080808);margin-right:2px;}5.0.css-u2us88{font-size:16px;color:var(--NN600,#656C7B);line-height:20px;}/ 5.0@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-143g15z-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1.1428571428571428rem;line-height:20px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN950,#080808);-webkit-text-decoration:initial;text-decoration:initial;margin:10px 0 0;}99% pembeli merasa puas@font-face{font-family:Open Sauce One;src:local('Open Sauce One Regular'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-Regular.woff2') format('woff2');font-weight:400;font-style:normal;}@font-face{font-family:Open Sauce One;src:local('Open Sauce One ExtraBold'),url('https://assets.tokopedia.net/asts/unify/fonts/OpenSauceOne-ExtraBold.woff2') format('woff2');font-weight:800;font-style:normal;}.css-scw5ei-unf-heading{display:block;position:relative;font-weight:400;font-family:Open Sauce One,'Nunito Sans',-apple-system,sans-serif;font-size:1rem;line-height:18px;-webkit-letter-spacing:0px;-moz-letter-spacing:0px;-ms-letter-spacing:0px;letter-spacing:0px;color:var(--NN600,#656C7B);-webkit-text-decoration:initial;text-decoration:initial;margin:6px 0 0;}837 rating • 278 ulasan.css-1t9sxbc{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-column-gap:16px;column-gap:16px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;height:69px;}.css-10emkyv{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;position:relative;padding:4px 10px;}.css-199yh9f{font-size:12px;color:var(--NN600,#656C7B);width:8px;}5.css-1tidw60-unf-PB{width:87px;}@media (min-width:1281px){.css-1tidw60-unf-PB{width:180px;}}.css-1beabqv-unf-PBB{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-rjsmm1{width:100%;border-radius:4px;overflow:hidden;-webkit-transition:background-color 280ms ease,height 280ms ease;transition:background-color 280ms ease,height 280ms ease;height:6px;background-color:var(--NN100,#E6E9F0);}.css-10es6ym{height:100%;border-radius:4px;-webkit-transition:width 280ms ease,background-color 280ms ease;transition:width 280ms ease,background-color 280ms ease;width:96.65%;background-color:var(--GN400,#2EBB79);}.css-myjxhx{font-size:12px;color:var(--NN600,#656C7B);width:8px;width:36px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}(809)96.65%4.css-si62cm{height:100%;border-radius:4px;-webkit-transition:width 280ms ease,background-color 280ms ease;transition:width 280ms ease,background-color 280ms ease;width:2.87%;background-color:var(--GN400,#2EBB79);}(24)2.87%3.css-79gr4a{height:100%;border-radius:4px;-webkit-transition:width 280ms ease,background-color 280ms ease;transition:width 280ms ease,background-color 280ms ease;width:0.24%;background-color:var(--GN400,#2EBB79);}(2)0.24%2.css-1kcvdzg{height:100%;border-radius:4px;-webkit-transition:width 280ms ease,background-color 280ms ease;transition:width 280ms ease,background-color 280ms ease;width:0%;background-color:var(--GN400,#2EBB79);}(0)0%1(2)0.24%.css-jxzr5i{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;}.css-gcov66{width:228px;margin-right:52px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-1rmen0c{margin:0;border-radius:8px;border:1px solid var(--NN100,#E6E9F0);}.css-1rmen0c [data-unify='LoaderSquare']{margin-left:auto;margin-right:auto;}.css-1rmen0c > div:not(:last-child){border-bottom:1px solid var(--NN50,#F2F4F7);}.css-16c0wxj{padding-top:12px;}.css-16c0wxj .square-circle{text-align:center;}.css-16c0wxj .square-circle [data-unify='LoaderSquare'],.css-16c0wxj .square-circle [data-unify='LoaderCircle']{display:inline-block;}.css-16c0wxj .square-circle [data-unify='LoaderSquare']{margin-right:8px;}.css-1rg0ql7-unf-loader-square{width:200px;padding-bottom:18px;margin-bottom:16px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1rvuej1{padding-top:10px;}.css-1rvuej1 .square-circle{text-align:center;}.css-1rvuej1 .square-circle [data-unify='LoaderSquare'],.css-1rvuej1 .square-circle [data-unify='LoaderCircle']{display:inline-block;}.css-1rvuej1 .square-circle [data-unify='LoaderSquare']{margin-right:8px;}.css-1g0s1ka-unf-loader-square{width:172px;padding-bottom:16px;margin-bottom:16px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-lwg3gz-unf-loader-circle{height:16px;width:16px;margin:auto;margin-bottom:16px;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-2psjkb-unf-loader-square{width:196px;padding-bottom:18px;margin-bottom:16px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1799hu{width:100%;min-width:0;}.css-16mod1d{margin:0 0 32px;}.css-16mod1d .tag{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}.css-16mod1d .images{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-16mod1d .images [data-unify='LoaderSquare']:not(:last-child){margin-right:12px;}@media only screen and (max-width:1280px){.css-16mod1d .tag [data-unify='LoaderSquare']{padding-bottom:12px;}.css-16mod1d .images [data-unify='LoaderSquare']{width:50px;padding-bottom:50px;}}.css-z7x3u0-unf-loader-square{width:34%;padding-bottom:22px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-35545w-unf-loader-square{width:88px;padding-bottom:88px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1b3wv5j{margin:0 0 26px;min-height:62px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-1b3wv5j .tag,.css-1b3wv5j .sort{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.css-1b3wv5j .sort{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;}.css-1b3wv5j .sort [data-unify='LoaderSquare']:not(:last-child){margin-right:8px;}.css-d56g4e-unf-loader-square{width:50%;padding-bottom:24px;margin-bottom:18px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1h45xuq-unf-loader-square{width:70%;padding-bottom:16px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-amcl6j-unf-loader-square{width:25%;padding-bottom:18px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-p8c0r5-unf-loader-square{width:68%;padding-bottom:40px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-fe90sd{margin:0 0 18px;padding:0 0 16px;border-bottom:1px solid var(--NN50,#F2F4F7);}.css-1lz01h{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:8px;}.css-1lz01h span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-1lz01h span [data-unify='LoaderSquare']{margin-right:4px;}.css-1lz01h .more{margin:0;}.css-kmhoxl-unf-loader-square{width:80px;padding-bottom:16px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-80tdys-unf-loader-circle{height:16px;width:16px;margin:auto;margin-bottom:0;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-odx15r{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:4px;}.css-odx15r > .star{margin:0 8px 0 0;}.css-1rpmss3-unf-loader-circle{height:32px;width:32px;margin:auto;margin-bottom:0;background-image:linear-gradient(63deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));border-radius:50%;}.css-1hjolod-unf-loader-square{width:160px;padding-bottom:16px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-ohksao-unf-loader-square{width:160px;padding-bottom:16px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1yy27km-unf-loader-square{width:100%;padding-bottom:16px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1nbp2xw-unf-loader-square{width:100%;padding-bottom:16px;margin-bottom:12px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1as1hf5{white-space:nowrap;overflow:hidden;}.css-1as1hf5 > .thumbnail{display:inline-block;margin-right:8px;margin-left:0;}.css-lvox58-unf-loader-square{width:60px;padding-bottom:60px;margin-bottom:0;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-xkc8er{margin-top:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}.css-8hwhe7-unf-loader-square{width:28%;padding-bottom:16px;margin-bottom:8px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-7p7kcw{grid-area:tdn_topads;margin:0;}.css-1nrrafx{grid-area:discussion_faq;margin:32px 0 0;}.css-rkzj6l-unf-loader-square{width:80%;padding-bottom:32px;margin-bottom:2rem;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}.css-1ra39c2{grid-area:pdp_1;margin:0;}.css-1y893tl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;gap:16px;}.css-1xqufcf{background:var(--NN0,#FFFFFF);padding:0 0 3%;width:20%;box-sizing:border-box;}.css-1xqufcf > div{height:100%;}.css-54k5sq{position:relative;background-color:var(--NN0,#FFFFFF);display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%;height:100%;padding:0;box-sizing:border-box;}.css-44qtc5{position:relative;border-radius:8px;min-width:100%;box-shadow:0 1px 6px 0 #F2F4F7;}.css-1v89ogz{background:var(--NN50,#F2F4F7);background-image:linear-gradient(to right,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN50,#F2F4F7) 40%,var(--NN50,#F2F4F7) 100%);background-repeat:no-repeat;background-size:800px 240px;display:inline-block;position:relative;-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:animation-oh6j69;-webkit-animation-timing-function:linear;width:100%;padding-bottom:100%;border-top-right-radius:8px;border-top-left-radius:8px;}.css-1sjn58a{position:relative;padding:10px 8px;}.css-187vc6o{background:var(--NN50,#F2F4F7);background-image:linear-gradient(to right,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN50,#F2F4F7) 40%,var(--NN50,#F2F4F7) 100%);background-repeat:no-repeat;background-size:800px 240px;display:inline-block;position:relative;-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:animation-oh6j69;-webkit-animation-timing-function:linear;display:block;height:12px;margin-bottom:8px;border-radius:8px;}.css-ps1qin{background:var(--NN50,#F2F4F7);background-image:linear-gradient(to right,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN50,#F2F4F7) 40%,var(--NN50,#F2F4F7) 100%);background-repeat:no-repeat;background-size:800px 240px;display:inline-block;position:relative;-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:animation-oh6j69;-webkit-animation-timing-function:linear;display:block;width:50%;height:12px;margin-bottom:8px;border-radius:8px;}.css-1ila14j{background:var(--NN50,#F2F4F7);background-image:linear-gradient(to right,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN50,#F2F4F7) 40%,var(--NN50,#F2F4F7) 100%);background-repeat:no-repeat;background-size:800px 240px;display:inline-block;position:relative;-webkit-animation-duration:1s;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-name:animation-oh6j69;-webkit-animation-timing-function:linear;display:block;width:90%;height:12px;border-radius:8px;}.css-z4w3bx{grid-area:pdp_2;margin:0;}.css-3chof6{grid-area:pdp_3;margin:0;}.css-vl9mmn{grid-area:pdp_4;margin:0;}.css-ucvmud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:0;}.css-pje1ph-unf-loader-shimmer-line{border-radius:4px;display:block;height:256px;width:100%;background:var(--NN50,#F2F4F7);margin-bottom:8px;background-image:linear-gradient(120deg,var(--NN50,#F2F4F7) 0%,var(--NN50,#F2F4F7) 20%,var(--NN100,#E6E9F0) 40%,var(--NN50,#F2F4F7) 100%);background-size:100%;background-repeat:no-repeat;-webkit-animation:animation-ogpi78 1.3s linear 1ms infinite backwards;animation:animation-ogpi78 1.3s linear 1ms infinite backwards;}.css-13j0czf{border-top:1px solid var(--NN300,#B3BBC9);width:100%;padding:50px;background-color:var(--NN0,#FFFFFF);}.css-13j0czf .inner{width:80%;margin:0 auto;}.css-o2nzpd-unf-loader-square{width:100%;padding-bottom:24px;margin-bottom:16px;border-radius:8px;background-image:linear-gradient(65deg,var(--NN50,#F2F4F7),var(--NN100,#E6E9F0));}"
## [4] ".css-14yodyc{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;min-width:1024px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:var(--NN0,#FFFFFF);z-index:999;position:fixed;top:0px;right:0;left:0;border-bottom:1px solid var(--NN50,#F2F4F7);-webkit-transition:-webkit-transform 280ms ease;-webkit-transition:transform 280ms ease;transition:transform 280ms ease;height:121px;}@media (max-width:768px){.css-14yodyc{min-width:768px;}}.css-1e3amw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:32px;z-index:3;background-color:var(--NN50,#F2F4F7);padding:0 32px;position:fixed;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;left:0px;right:0px;}.css-1t2cza5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-width:168px;margin-right:16px;}.css-uwv6bd{width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;background-position:60% 60%;display:inline-block;}.css-3vbzuf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;margin:0 0 0 4px;}.css-3vbzuf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-3vbzuf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-3vbzuf{margin:0 0 0 6px;}} Download Tokopedia App.css-1h8v06c{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;width:533px;gap:32px;}.css-1iga7kf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;}.css-1iga7kf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-1iga7kf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-1iga7kf{margin:0 0 0 6px;}}Tentang TokopediaMitra TokopediaMulai Berjualan PromoTokopedia Care.css-12jp264{width:96%;left:32px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:64px;top:30px;position:fixed;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-isbo03{width:150px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:4px 0 0 4px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-isbo03 img{width:150px;height:40px;object-fit:contain;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-c4s9dq{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;margin:1px 8px 0 24px;}.css-c4s9dq:last-of-type{margin-right:0;}.css-1551isn{width:100%;border-radius:4px;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:background-color 280ms ease;transition:background-color 280ms ease;padding:8px;height:121px;}.css-dqw6r5{color:var(--NN950,#080808);font-size:14px;line-height:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color 280ms ease;transition:color 280ms ease;height:40px;width:74px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-font-smoothing:antialiased;}Kategori.css-nlrenb{position:relative;width:49%;min-width:150px;}@media (min-width:1100px){.css-nlrenb{width:68%;}}@media (min-width:1600px){.css-nlrenb{width:73%;}}.css-w3ze74{width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-j8nuw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;border:solid 1px var(--NN300,#B3BBC9);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:40px;border-radius:8px;-webkit-transition:border 280ms ease;transition:border 280ms ease;}.css-j8nuw5 > div{height:100%;}.css-adxool{width:100%;margin:0;}.css-adxool div{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;}.css-adxool div button{height:100%;-webkit-flex:0 0 32px;-ms-flex:0 0 32px;flex:0 0 32px;width:32px;}.css-adxool div button:after{background-size:20px;}.css-qwqzd5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:inherit;-webkit-flex-grow:inherit;-ms-flex-positive:inherit;flex-grow:inherit;background-color:#FFFFFF;border-radius:8px;border:1px solid #B3BBC9;overflow:hidden;padding-left:8px;padding-right:8px;-webkit-transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);gap:8px;width:100%;height:40px;}.css-qwqzd5 input[type='search']::-webkit-search-decoration,.css-qwqzd5 input[type='search']::-webkit-search-cancel-button,.css-qwqzd5 input[type='search']::-webkit-search-results-button,.css-qwqzd5 input[type='search']::-webkit-search-results-decoration{display:none;}.css-6v0gm9{min-width:0;min-height:0;width:100%;color:var(--NN950,#080808);font-family:inherit;background-color:transparent;line-height:20px;border:none;outline:none;height:auto;font-size:14px;padding-top:8px;padding-bottom:8px;}.css-6v0gm9::-webkit-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::-moz-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9:-ms-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::placeholder{color:var(--NN600,#656C7B);}.css-7lcni7{width:3%;margin:0 0 0 40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;z-index:2;height:58px;z-index:475;}.css-1lsbr8a{width:40px;height:40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-4rpwtd{background-position:0 0;width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;}.css-1jtt7xx{width:1.2px;min-width:1.2px;height:24px;background:var(--NN100,#E6E9F0);margin:0 0 0 24px;}.css-vlg5ix{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;width:158px;margin:0 0 0 24px;}@media (max-width:1100px){.css-vlg5ix{width:16%;}}@media (max-width:768px){.css-vlg5ix{width:23%;}}.css-16r70d4{height:32px;padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--NN0,#FFFFFF);color:var(--GN500,#00AA5B);cursor:pointer;border:1px solid var(--GN500,#00AA5B);}Masuk.css-6c86hb{height:32px;color:var(--NN0,#FFFFFF);padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--GN500,#00AA5B);cursor:pointer;border:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;} Daftar .css-gsve15{position:fixed;top:97px;width:45%;left:309px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:-1;}.css-gsve15 a{color:var(--NN600,#656C7B);line-height:16px;font-size:12px;margin:0 2% 0 0%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer;text-transform:capitalize;}.css-gsve15 a:hover{color:var(--GN500,#00AA5B);}samsung note 10charger mobilsamsung a73pull up barhdd 1tbxbox series x.css-1h819qw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:fixed;top:94px;right:24px;cursor:pointer;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:-1;}@media screen and (max-width:1023px){.css-1h819qw{display:none;}}.css-1mbdz04{z-index:-1;}"
## [5] ".css-14yodyc{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;min-width:1024px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:var(--NN0,#FFFFFF);z-index:999;position:fixed;top:0px;right:0;left:0;border-bottom:1px solid var(--NN50,#F2F4F7);-webkit-transition:-webkit-transform 280ms ease;-webkit-transition:transform 280ms ease;transition:transform 280ms ease;height:121px;}@media (max-width:768px){.css-14yodyc{min-width:768px;}}.css-1e3amw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:32px;z-index:3;background-color:var(--NN50,#F2F4F7);padding:0 32px;position:fixed;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;left:0px;right:0px;}.css-1t2cza5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-width:168px;margin-right:16px;}.css-uwv6bd{width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;background-position:60% 60%;display:inline-block;}.css-3vbzuf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;margin:0 0 0 4px;}.css-3vbzuf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-3vbzuf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-3vbzuf{margin:0 0 0 6px;}} Download Tokopedia App.css-1h8v06c{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;width:533px;gap:32px;}.css-1iga7kf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;}.css-1iga7kf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-1iga7kf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-1iga7kf{margin:0 0 0 6px;}}Tentang TokopediaMitra TokopediaMulai Berjualan PromoTokopedia Care.css-12jp264{width:96%;left:32px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:64px;top:30px;position:fixed;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-isbo03{width:150px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:4px 0 0 4px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-isbo03 img{width:150px;height:40px;object-fit:contain;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-c4s9dq{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;margin:1px 8px 0 24px;}.css-c4s9dq:last-of-type{margin-right:0;}.css-1551isn{width:100%;border-radius:4px;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:background-color 280ms ease;transition:background-color 280ms ease;padding:8px;height:121px;}.css-dqw6r5{color:var(--NN950,#080808);font-size:14px;line-height:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color 280ms ease;transition:color 280ms ease;height:40px;width:74px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-font-smoothing:antialiased;}Kategori.css-nlrenb{position:relative;width:49%;min-width:150px;}@media (min-width:1100px){.css-nlrenb{width:68%;}}@media (min-width:1600px){.css-nlrenb{width:73%;}}.css-w3ze74{width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-j8nuw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;border:solid 1px var(--NN300,#B3BBC9);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:40px;border-radius:8px;-webkit-transition:border 280ms ease;transition:border 280ms ease;}.css-j8nuw5 > div{height:100%;}.css-adxool{width:100%;margin:0;}.css-adxool div{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;}.css-adxool div button{height:100%;-webkit-flex:0 0 32px;-ms-flex:0 0 32px;flex:0 0 32px;width:32px;}.css-adxool div button:after{background-size:20px;}.css-qwqzd5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:inherit;-webkit-flex-grow:inherit;-ms-flex-positive:inherit;flex-grow:inherit;background-color:#FFFFFF;border-radius:8px;border:1px solid #B3BBC9;overflow:hidden;padding-left:8px;padding-right:8px;-webkit-transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);gap:8px;width:100%;height:40px;}.css-qwqzd5 input[type='search']::-webkit-search-decoration,.css-qwqzd5 input[type='search']::-webkit-search-cancel-button,.css-qwqzd5 input[type='search']::-webkit-search-results-button,.css-qwqzd5 input[type='search']::-webkit-search-results-decoration{display:none;}.css-6v0gm9{min-width:0;min-height:0;width:100%;color:var(--NN950,#080808);font-family:inherit;background-color:transparent;line-height:20px;border:none;outline:none;height:auto;font-size:14px;padding-top:8px;padding-bottom:8px;}.css-6v0gm9::-webkit-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::-moz-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9:-ms-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::placeholder{color:var(--NN600,#656C7B);}.css-7lcni7{width:3%;margin:0 0 0 40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;z-index:2;height:58px;z-index:475;}.css-1lsbr8a{width:40px;height:40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-4rpwtd{background-position:0 0;width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;}.css-1jtt7xx{width:1.2px;min-width:1.2px;height:24px;background:var(--NN100,#E6E9F0);margin:0 0 0 24px;}.css-vlg5ix{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;width:158px;margin:0 0 0 24px;}@media (max-width:1100px){.css-vlg5ix{width:16%;}}@media (max-width:768px){.css-vlg5ix{width:23%;}}.css-16r70d4{height:32px;padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--NN0,#FFFFFF);color:var(--GN500,#00AA5B);cursor:pointer;border:1px solid var(--GN500,#00AA5B);}Masuk.css-6c86hb{height:32px;color:var(--NN0,#FFFFFF);padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--GN500,#00AA5B);cursor:pointer;border:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;} Daftar .css-gsve15{position:fixed;top:97px;width:45%;left:309px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:-1;}.css-gsve15 a{color:var(--NN600,#656C7B);line-height:16px;font-size:12px;margin:0 2% 0 0%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer;text-transform:capitalize;}.css-gsve15 a:hover{color:var(--GN500,#00AA5B);}samsung note 10charger mobilsamsung a73pull up barhdd 1tbxbox series x.css-1h819qw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:fixed;top:94px;right:24px;cursor:pointer;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:-1;}@media screen and (max-width:1023px){.css-1h819qw{display:none;}}.css-1mbdz04{z-index:-1;}"
## [6] ".css-1e3amw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:32px;z-index:3;background-color:var(--NN50,#F2F4F7);padding:0 32px;position:fixed;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;left:0px;right:0px;}.css-1t2cza5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-width:168px;margin-right:16px;}.css-uwv6bd{width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;background-position:60% 60%;display:inline-block;}.css-3vbzuf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;margin:0 0 0 4px;}.css-3vbzuf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-3vbzuf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-3vbzuf{margin:0 0 0 6px;}} Download Tokopedia App.css-1h8v06c{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;width:533px;gap:32px;}.css-1iga7kf{color:var(--NN600,#656C7B);font-size:12px;line-height:31px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;white-space:nowrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:color 200ms ease;transition:color 200ms ease;margin:0 0 0 28px;}.css-1iga7kf:hover{color:var(--GN500,#00AA5B);}@media (min-width:768px){.css-1iga7kf{margin:0 0 0 4px;}}@media (min-width:1700px){.css-1iga7kf{margin:0 0 0 6px;}}Tentang TokopediaMitra TokopediaMulai Berjualan PromoTokopedia Care.css-12jp264{width:96%;left:32px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:64px;top:30px;position:fixed;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-isbo03{width:150px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:4px 0 0 4px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-isbo03 img{width:150px;height:40px;object-fit:contain;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}.css-c4s9dq{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;margin:1px 8px 0 24px;}.css-c4s9dq:last-of-type{margin-right:0;}.css-1551isn{width:100%;border-radius:4px;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:background-color 280ms ease;transition:background-color 280ms ease;padding:8px;height:121px;}.css-dqw6r5{color:var(--NN950,#080808);font-size:14px;line-height:18px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color 280ms ease;transition:color 280ms ease;height:40px;width:74px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-font-smoothing:antialiased;}Kategori.css-nlrenb{position:relative;width:49%;min-width:150px;}@media (min-width:1100px){.css-nlrenb{width:68%;}}@media (min-width:1600px){.css-nlrenb{width:73%;}}.css-w3ze74{width:100%;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}.css-j8nuw5{width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;border:solid 1px var(--NN300,#B3BBC9);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:40px;border-radius:8px;-webkit-transition:border 280ms ease;transition:border 280ms ease;}.css-j8nuw5 > div{height:100%;}.css-adxool{width:100%;margin:0;}.css-adxool div{height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:none;}.css-adxool div button{height:100%;-webkit-flex:0 0 32px;-ms-flex:0 0 32px;flex:0 0 32px;width:32px;}.css-adxool div button:after{background-size:20px;}.css-qwqzd5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:inherit;-webkit-flex-grow:inherit;-ms-flex-positive:inherit;flex-grow:inherit;background-color:#FFFFFF;border-radius:8px;border:1px solid #B3BBC9;overflow:hidden;padding-left:8px;padding-right:8px;-webkit-transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);transition:border-color 300ms cubic-bezier(0.63,0.01,0.29,1);gap:8px;width:100%;height:40px;}.css-qwqzd5 input[type='search']::-webkit-search-decoration,.css-qwqzd5 input[type='search']::-webkit-search-cancel-button,.css-qwqzd5 input[type='search']::-webkit-search-results-button,.css-qwqzd5 input[type='search']::-webkit-search-results-decoration{display:none;}.css-6v0gm9{min-width:0;min-height:0;width:100%;color:var(--NN950,#080808);font-family:inherit;background-color:transparent;line-height:20px;border:none;outline:none;height:auto;font-size:14px;padding-top:8px;padding-bottom:8px;}.css-6v0gm9::-webkit-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::-moz-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9:-ms-input-placeholder{color:var(--NN600,#656C7B);}.css-6v0gm9::placeholder{color:var(--NN600,#656C7B);}.css-7lcni7{width:3%;margin:0 0 0 40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;z-index:2;height:58px;z-index:475;}.css-1lsbr8a{width:40px;height:40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}.css-4rpwtd{background-position:0 0;width:24px;height:24px;background-image:url(https://p16-assets-sg.tokopedia-static.net/tos-alisg-i-cqp9s0kcd0-sg/assets-tokopedia-lite/v2/zeus/kratos/888f62a8.svg);background-size:100% auto;background-repeat:no-repeat;}.css-1jtt7xx{width:1.2px;min-width:1.2px;height:24px;background:var(--NN100,#E6E9F0);margin:0 0 0 24px;}.css-vlg5ix{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:12px;width:158px;margin:0 0 0 24px;}@media (max-width:1100px){.css-vlg5ix{width:16%;}}@media (max-width:768px){.css-vlg5ix{width:23%;}}.css-16r70d4{height:32px;padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--NN0,#FFFFFF);color:var(--GN500,#00AA5B);cursor:pointer;border:1px solid var(--GN500,#00AA5B);}Masuk.css-6c86hb{height:32px;color:var(--NN0,#FFFFFF);padding:0px 16px;font-weight:800;border-radius:8px;font-size:12px;background:var(--GN500,#00AA5B);cursor:pointer;border:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;} Daftar .css-gsve15{position:fixed;top:97px;width:45%;left:309px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;z-index:-1;}.css-gsve15 a{color:var(--NN600,#656C7B);line-height:16px;font-size:12px;margin:0 2% 0 0%;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;cursor:pointer;text-transform:capitalize;}.css-gsve15 a:hover{color:var(--GN500,#00AA5B);}samsung note 10charger mobilsamsung a73pull up barhdd 1tbxbox series x.css-1h819qw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:fixed;top:94px;right:24px;cursor:pointer;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;z-index:-1;}@media screen and (max-width:1023px){.css-1h819qw{display:none;}}.css-1mbdz04{z-index:-1;}"
remDr$close()
rd$server$stop()
## [1] TRUE
Dikarenakan Web Scraping dari beberapa web cukup memerlukan waktu untuk settingnya, kita fokus dulu pada contoh kasus dari data Kopi dari web Kaggle dan sudah disimpan dalam file gdrive. Tampilan kaggle untuk review coffee
Coffee Reviews
Berikut sanalisis teks sederhana dalam RMarkdown-style yang mencakup:
Cleaning data
Tokenisasi dan stopword removal
Analisis sentimen sederhana
Visualisasi wordcloud
Klasifikasi sentimen otomatis dengan Naive Bayes
1. Load dan Lihat Data
library(readr)
library(dplyr)
library(tidytext)
library(ggplot2)
library(wordcloud)
library(RColorBrewer)
url <- "https://drive.google.com/uc?export=download&id=17ztaH2DZjYOSYzeuX8wQ82U5_ffSsot9"
# Load dengan read.csv dan mode textConnection
library(readr)
coffee <- read_csv(url)
## Rows: 1246 Columns: 9
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): name, roaster, roast, loc_country, origin, review_date, review
## dbl (2): 100g_USD, rating
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(coffee)
## # A tibble: 6 × 9
## name roaster roast loc_country origin `100g_USD` rating review_date review
## <chr> <chr> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr>
## 1 Ethiopi… Revel … Medi… United Sta… Ethio… 4.7 92 November 2… Crisp…
## 2 Ethiopi… Roast … Medi… United Sta… Ethio… 4.19 92 November 2… Delic…
## 3 Ethiopi… Big Cr… Medi… United Sta… Ethio… 4.85 94 November 2… Deepl…
## 4 Ethiopi… Red Ro… Light United Sta… Ethio… 5.14 93 November 2… Delic…
## 5 Ethiopi… Willou… Medi… United Sta… Ethio… 3.97 93 November 2… High-…
## 6 Ethiopi… Black … Medi… United Sta… Ethio… 5.14 93 November 2… Very …
2. Cleaning Teks dan Tokenisasi
coffee_clean <- coffee %>%
select(review) %>%
mutate(review = tolower(review)) %>%
mutate(review = gsub("[[:punct:]]", " ", review))
# Tokenisasi
tokens <- coffee_clean %>%
unnest_tokens(word, review)
# Hapus stopwords
data("stop_words")
tokens_clean <- tokens %>%
anti_join(stop_words)
## Joining with `by = join_by(word)`
head(tokens_clean)
## # A tibble: 6 × 1
## word
## <chr>
## 1 crisply
## 2 sweet
## 3 cocoa
## 4 toned
## 5 lemon
## 6 blossom
3. Visualisasi WordCloud
kata_freq <- tokens_clean %>%
count(word, sort = TRUE)
wordcloud(words = kata_freq$word,
freq = kata_freq$n,
min.freq = 3,
max.words = 100,
random.order = FALSE,
colors = brewer.pal(8, "Dark2"),
scale = c(4, 0.8))
4. Analisis Sentimen Sederhana
bing <- get_sentiments("bing")
sentimen_result <- tokens_clean %>%
inner_join(bing, by = "word") %>%
count(sentiment)
ggplot(sentimen_result, aes(x = sentiment, y = n, fill = sentiment)) +
geom_col(show.legend = FALSE) +
labs(title = "Analisis Sentimen Ulasan Kopi", y = "Jumlah Kata") +
theme_minimal()
library(tm)
library(e1071)
library(caret)
# Label dummy: rating >= 90 -> positif, lainnya negatif
coffee$sentiment <- ifelse(coffee$rating >= 90, "positif", "negatif")
# Buat corpus
corpus <- Corpus(VectorSource(coffee$review))
dtm <- DocumentTermMatrix(corpus,
control = list(removePunctuation = TRUE,
stopwords = TRUE,
tolower = TRUE,
removeNumbers = TRUE))
# Buat dataframe
dtm_matrix <- as.data.frame(as.matrix(dtm))
dtm_matrix$sentiment <- as.factor(coffee$sentiment)
# Split data
set.seed(123)
train_index <- createDataPartition(dtm_matrix$sentiment, p = 0.8, list = FALSE)
train <- dtm_matrix[train_index, ]
test <- dtm_matrix[-train_index, ]
model <- naiveBayes(sentiment ~ ., data = train)
pred <- predict(model, newdata = test)
confusionMatrix(pred, test$sentiment)
## Confusion Matrix and Statistics
##
## Reference
## Prediction negatif positif
## negatif 2 246
## positif 0 0
##
## Accuracy : 0.0081
## 95% CI : (0.001, 0.0288)
## No Information Rate : 0.9919
## P-Value [Acc > NIR] : 1
##
## Kappa : 0
##
## Mcnemar's Test P-Value : <2e-16
##
## Sensitivity : 1.000000
## Specificity : 0.000000
## Pos Pred Value : 0.008065
## Neg Pred Value : NaN
## Prevalence : 0.008065
## Detection Rate : 0.008065
## Detection Prevalence : 1.000000
## Balanced Accuracy : 0.500000
##
## 'Positive' Class : negatif
##
Kita menggunakan data kasus kopi dari tokopedia dengan data nya
ulasan_rendered
Proses Pembersihan dan Visualisasi Teks dengan Corpus dan Wordcloud di R
Tujuan Utama
Membersihkan data teks (text preprocessing).
Membentuk objek corpus untuk analisis teks.
Membuat term-document matrix.
Menghasilkan visualisasi wordcloud dari kata-kata paling sering.
Penjelasan Langkah per Langkah
Langkah 1: Set Direktori Kerja dan Import Library
setwd("/users/mindra/@MET")
library(tm)
library(wordcloud)
library(RColorBrewer)
Langkah 2: Gabungkan Semua Paragraf
teks_lengkap <- paste(ulasan_rendered, collapse = " ")
Digunakan untuk menyatukan seluruh paragraf menjadi satu string teks tunggal.
Langkah 3: Apa itu Corpus?
Corpus adalah kumpulan dokumen teks yang terstruktur, dan digunakan dalam analisis teks. Dalam R, corpus dibentuk menggunakan Corpus(VectorSource(…)). Objek ini kemudian diproses dengan fungsi-fungsi dari paket tm.
corpus <- Corpus(VectorSource(teks_lengkap))
Langkah 4: Membersihkan Teks
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
stopwords_bahasa <- readLines("stopwords-id.txt")
corpus <- tm_map(corpus, removeWords, stopwords_bahasa)
corpus <- tm_map(corpus, stripWhitespace)
Langkah-langkah ini membersihkan teks dengan:
Mengubah huruf menjadi kecil,
Menghapus tanda baca dan angka,
Menghapus kata-kata umum yang tidak memiliki makna penting (stopwords),
Menghapus spasi berlebih.
Langkah 5: Ekstrak Teks Bersih (Opsional)
teks_bersih <- content(corpus[[1]])
Langkah 6: Membentuk Corpus Baru Jika Diperlukan
corpus_bersih <- Corpus(VectorSource(teks_bersih))
Langkah 7: Buat Term-Document Matrix (TDM)
tdm <- TermDocumentMatrix(corpus_bersih)
matrix_tdm <- as.matrix(tdm)
frekuensi_kata <- sort(rowSums(matrix_tdm), decreasing = TRUE)
kata_kata <- names(frekuensi_kata)
TDM menyimpan frekuensi kemunculan setiap kata dalam dokumen. Matrix ini menjadi dasar analisis kata.
Langkah 8: Visualisasi Wordcloud
set.seed(123)
wordcloud(words = kata_kata,
freq = frekuensi_kata,
min.freq = 2,
max.words = 100,
random.order = FALSE,
rot.per = 0.35,
colors = brewer.pal(8, "Dark2"))
Visualisasi ini membantu mengenali kata-kata yang paling sering muncul.
Langkah 9: Simpan Teks Awal
write.csv(ulasan_rendered,"ulasan.csv")
Objek corpus adalah inti dari analisis teks di R. Dengan memanfaatkan tm, kita dapat membersihkan data teks secara sistematis, membentuk struktur frekuensi kata, dan memvisualisasikannya menggunakan wordcloud. Proses ini sangat penting untuk eksplorasi teks, analisis opini, atau text mining lanjutan.
Soal-soal untuk memperdalam pemahaman konsep data cleaning.
Studi kasus tambahan untuk praktik individu.
library(readr)
# Ganti path sesuai lokasi file Anda
data_raw <- read_csv("data_anda.csv")
## Rows: 10 Columns: 1
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): review
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(data_raw)
## # A tibble: 6 × 1
## review
## <chr>
## 1 Kopi ini sangat enak dan aromanya kuat.
## 2 Rasanya pahit dan tidak sesuai ekspektasi.
## 3 Saya suka sekali dengan rasa kopinya yang lembut.
## 4 Kopi terlalu asam dan tidak segar.
## 5 Rasa mantap dan cocok diminum pagi hari.
## 6 Sayangnya kopi ini terlalu ringan dan hambar.
library(dplyr)
data_teks <- data_raw %>%
select(review) %>%
filter(!is.na(review))
library(stringr)
data_teks <- data_teks %>%
mutate(review = str_to_lower(review)) %>%
mutate(review = str_replace_all(review, "[[:punct:]]", " ")) %>%
mutate(review = str_replace_all(review, "[0-9]", " "))
library(tidytext)
data_token <- data_teks %>%
unnest_tokens(word, review)
data("stop_words")
data_token_bersih <- data_token %>%
anti_join(stop_words, by = "word")
head(data_token_bersih)
## # A tibble: 6 × 1
## word
## <chr>
## 1 kopi
## 2 ini
## 3 sangat
## 4 enak
## 5 dan
## 6 aromanya
kata_freq <- data_token_bersih %>%
count(word, sort = TRUE)
head(kata_freq)
## # A tibble: 6 × 2
## word n
## <chr> <int>
## 1 dan 6
## 2 kopi 5
## 3 ini 4
## 4 rasa 4
## 5 tidak 4
## 6 terlalu 3
write_csv(data_token_bersih, "hasil_pembersihan_token.csv")
Import data
Pilih kolom teks
Normalisasi teks
Tokenisasi
Hapus stopwords
Analisis lanjutan
Untuk coba analisis text bisa digunakan dashboard standard: https://tinyurl.com/TextBasic
Racickas, L. (2024, July 16). The critical role of data cleaning. Big Data Quarterly. https://www.dbta.com/BigDataQuarterly/Articles/The-Critical-Role-of-Data-Cleaning-164941.aspx
Yarrow, O. (2024, August 14). The critical role of clean data in digital transformation. Cloudingo. https://cloudingo.com/blog/the-critical-role-of-clean-data-in-digital-transformation/
Saeed, U. (2025). Understanding Data Cleaning: Importance and Practical Examples. Retrieved from LinkedIn
Manuraj, A. (2024). Data Cleaning in Analytics: Importance, Methods, and Applications. Retrieved from LinkedIn
IOTA Academy. (2025). The Importance of Data Cleaning in Data Analysis. Retrieved from IOTA Academy
GeeksforGeeks. (2025). What is Data Cleaning?. Retrieved from GeeksforGeeks
Dataspace Academy. (2024). Data Cleaning in Data Analytics: Why is it Important?. Retrieved from Dataspace Academy
California Learning Resource Network. (2025). Why is Data Cleaning Important?. Retrieved from CLRN
Wikipedia. (2025). Data Cleansing. Retrieved from Wikipedia
GeeksforGeeks. (2024). Challenges of Working with Unstructured Data in Data Engineering. Retrieved from https://www.geeksforgeeks.org/challenges-of-working-with-unstructured-data-in-data-engineering/
Haltev. (2024). Mengapa Data Cleaning Adalah Langkah Penting dalam Data Science?. Retrieved from https://haltev.id/mengapa-data-cleaning-adalah-langkah-penting-dalam-data-science/
Biztech Academy. (2024). Data Cleaning: Langkah Penting dalam Proses Data Science. Retrieved from https://biztechacademy.id/data-cleaning-langkah-penting-dalam-proses-data-science/
RevoU. (2025). Apa itu Data Cleaning? Arti, Fungsi, Contoh, FAQs 2025. Retrieved from https://www.revou.co/kosakata/data-cleaning
Katadata. (2023). 4 Contoh Ekonomi Digital di Berbagai Sektor. Retrieved from https://katadata.co.id/ekonopedia/istilah-ekonomi/64f9cf5a0c2d1/4-contoh-ekonomi-digital-di-berbagai-sektor
GeeksforGeeks. (2024). Data Structures in R Programming. Retrieved from https://www.geeksforgeeks.org/data-structures-in-r-programming/
Softscients. (2020). Vector - Matrix - List-Data Frame. Retrieved from https://softscients.com/2020/03/19/vector-matrix-list-data-frame/
Deden Istiawan. (n.d.). Pengenalan Singkat R and RStudio. Retrieved from https://dedenistiawan.github.io/ClustR/1.2-pengenalan-singkat-r-and-rstudio.html
Exploratory Data Analysis (EDA) adalah tahap penting dalam analisis data untuk memahami struktur data, menemukan pola, deteksi outlier, dan membangun intuisi tentang data yang dimiliki. EDA adalah suatu pendekatan atau teknik statistik untuk menganalisis kumpulan data dengan tujuan menyimpulkan karakteristik penting dan utama dari data tersebut. EDA umumnya menggunakan berbagai alat bantu visualisasi agar analisis lebih mudah dipahami. Pendekatan EDA memungkinkan kita untuk mendapatkan wawasan tentang beberapa aspek berikut:
Karakteristik atau fitur utama dari data.
Variabel yang ada dan hubungan antar variabel tersebut.
Menemukan variabel penting yang dapat digunakan untuk menyelesaikan suatu masalah.
EDA bersifat iteratif, meliputi:
Menghasilkan pertanyaan tentang data.
Mencari jawaban melalui visualisasi, transformasi, dan pemodelan data.
Menggunakan hasil analisis untuk memperbaiki atau menghasilkan pertanyaan baru.
Dalam Data Science, EDA memiliki peran yang sangat penting karena:
Meningkatkan Pemahaman Data: Memberikan pemahaman mendalam tentang struktur, pola, dan hubungan dalam data.
Identifikasi Masalah Data: Mengungkap adanya masalah seperti data hilang, pencilan (outlier), kesalahan entri, atau ketidakseimbangan kelas.
Memfasilitasi Pemodelan Statistik dan Machine Learning: Memungkinkan pemilihan variabel yang tepat, sehingga meningkatkan kualitas model prediktif atau analitik.
Menentukan Langkah Analisis Berikutnya: Mengarahkan langkah-langkah analisis lanjutan yang diperlukan, seperti transformasi data, pemilihan fitur, atau analisis lanjutan lainnya.
Dalam implementasi praktis menggunakan R, EDA biasanya dibagi menjadi dua klasifikasi utama:
Statistik Deskriptif, mencakup rata-rata, median, modus, rentang inter-kuartil, standar deviasi, dan sebagainya.
Metode Grafis, mencakup histogram, estimasi densitas, box plot, scatter plot, dan sebagainya.
Contoh paket yang sering digunakan untuk EDA dalam R adalah:
ggplot2
untuk visualisasi.
dplyr
untuk manipulasi data.
soilDB
atau paket lain sesuai dengan jenis data yang
dianalisis.
Sebelum melakukan EDA, inspeksi data sangat penting untuk memastikan data yang digunakan berkualitas baik, bebas dari kesalahan, dan siap untuk dianalisis. Inspeksi data adalah proses pemeriksaan data untuk memastikan keakuratan, kelengkapan, dan kualitasnya, serta menghapus atau memperbaiki kesalahan yang mungkin ada seperti typo, duplikasi, atau nilai-nilai yang tidak masuk akal.
Dengan demikian, inspeksi data merupakan langkah awal penting yang menentukan efektivitas proses EDA dan analisis lebih lanjut.
Statistik deskriptif adalah metode yang digunakan untuk mendeskripsikan fitur utama dari suatu dataset secara kuantitatif.
Mean (Rata-rata) \[ \bar{x} = \frac{\sum_{i=1}^{n} x_i}{n} \]
Median: Nilai tengah data yang telah diurutkan.
Mode: Nilai yang paling sering muncul dalam dataset.
Contoh R:
data <- c(3, 5, 3, 7, 8, 9, 5, 3)
mean(data)
## [1] 5.375
median(data)
## [1] 5
# Mode (menggunakan paket modeest)
library(modeest)
## Registered S3 method overwritten by 'rmutil':
## method from
## print.response httr
##
## Attaching package: 'modeest'
## The following object is masked from 'package:e1071':
##
## skewness
mlv(data, method = "mfv")
## [1] 3
Minimum: nilai terkecil dalam data.
Maksimum: nilai terbesar dalam data.
Contoh R:
min(data)
## [1] 3
max(data)
## [1] 9
Range adalah selisih antara nilai maksimum dan minimum. \[ Range = Max - Min \]
IQR mengukur sebaran data di sekitar median dan dihitung sebagai: \[ IQR = Q3 - Q1 \]
Contoh R dan Plot:
range_data <- max(data) - min(data)
range_data
## [1] 6
IQR(data)
## [1] 4.25
# Boxplot menunjukkan range dan IQR
boxplot(data, main="Boxplot untuk Range dan IQR")
Standard Deviation (SD) atau simpangan baku mengukur seberapa tersebarnya data terhadap rata-rata. \[ SD = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{x})^2}{n - 1}} \]
Variance (Var) merupakan kuadrat dari simpangan baku. \[ Var = SD^2 \]
Contoh R:
sd(data)
## [1] 2.386719
var(data)
## [1] 5.696429
Contoh R dan Plot:
library(moments)
skewness(data)
## [1] 0.3338293
kurtosis(data)
## [1] 1.623225
# Density plot menunjukkan skewness dan kurtosis
plot(density(data), main="Density Plot untuk Skewness dan Kurtosis")
polygon(density(data), col="lightblue", border="blue")
Analisis data hilang (missing values) penting untuk memahami kualitas data.
Contoh R dan Plot:
data_with_na <- c(3, 5, NA, 7, 8, NA, 5, 3)
# Mengetahui jumlah missing value
sum(is.na(data_with_na))
## [1] 2
# Menampilkan posisi missing value
which(is.na(data_with_na))
## [1] 3 6
# Visualisasi missing value
library(visdat)
vis_miss(data.frame(value = data_with_na))
# Menghapus missing value
data_clean <- na.omit(data_with_na)
data_clean
## [1] 3 5 7 8 5 3
## attr(,"na.action")
## [1] 3 6
## attr(,"class")
## [1] "omit"
Statistik deskriptif membantu dalam mengenali pola awal, identifikasi masalah data, serta menentukan langkah-langkah analisis lanjutan.
Contoh lainnya
data(iris)
summary(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
library(psych)
describe(iris)
## vars n mean sd median trimmed mad min max range skew
## Sepal.Length 1 150 5.84 0.83 5.80 5.81 1.04 4.3 7.9 3.6 0.31
## Sepal.Width 2 150 3.06 0.44 3.00 3.04 0.44 2.0 4.4 2.4 0.31
## Petal.Length 3 150 3.76 1.77 4.35 3.76 1.85 1.0 6.9 5.9 -0.27
## Petal.Width 4 150 1.20 0.76 1.30 1.18 1.04 0.1 2.5 2.4 -0.10
## Species* 5 150 2.00 0.82 2.00 2.00 1.48 1.0 3.0 2.0 0.00
## kurtosis se
## Sepal.Length -0.61 0.07
## Sepal.Width 0.14 0.04
## Petal.Length -1.42 0.14
## Petal.Width -1.36 0.06
## Species* -1.52 0.07
Visualisasi distribusi adalah teknik untuk mengeksplorasi bagaimana data tersebar atau terdistribusi. Setiap jenis plot memiliki fungsi khusus yang membantu pemahaman struktur data dengan cara yang berbeda.
Histogram adalah plot yang menunjukkan frekuensi distribusi dari variabel numerik dengan membagi data menjadi beberapa interval atau bin.
Fungsi Histogram:
Mengidentifikasi pola distribusi (normal, skewed).
Melihat sebaran frekuensi data.
Mengetahui area konsentrasi data.
Contoh R:
library(ggplot2)
data <- rnorm(1000)
ggplot(data.frame(data), aes(x = data)) +
geom_histogram(bins = 30, fill = "skyblue", color = "black") +
labs(title = "Histogram")
Density plot adalah versi halus dari histogram yang menunjukkan estimasi kepadatan (density) dari data secara kontinu.
Fungsi Density Plot:
Memvisualisasikan distribusi kontinu dengan jelas.
Memudahkan perbandingan antar distribusi.
Mengidentifikasi multimodalitas dalam data.
Contoh R:
ggplot(data.frame(data), aes(x = data)) +
geom_density(fill = "lightgreen") +
labs(title = "Density Plot")
Boxplot (kotak-garis) menampilkan ringkasan statistik berupa median, kuartil (Q1, Q3), serta identifikasi pencilan (outlier).
Fungsi Boxplot:
Mengidentifikasi median dan rentang interkuartil.
Menampilkan nilai-nilai ekstrem (outlier).
Membandingkan distribusi antar beberapa kelompok.
Contoh R:
ggplot(data.frame(data), aes(y = data)) +
geom_boxplot(fill = "orange") +
labs(title = "Boxplot")
Violin plot adalah kombinasi dari boxplot dan density plot, menampilkan informasi distribusi data serta statistik ringkasan dalam satu plot.
Fungsi Violin Plot:
Menggabungkan kelebihan boxplot dan density plot.
Menunjukkan konsentrasi data dengan lebih jelas.
Mengidentifikasi multimodalitas serta perbandingan antar kelompok.
Contoh R:
ggplot(data.frame(group = rep(c("A", "B"), each=500),
value = c(rnorm(500), rnorm(500, mean=2))), aes(x=group, y=value)) +
geom_violin(fill="purple") +
labs(title = "Violin Plot")
ECDF plot menampilkan proporsi data yang kurang dari atau sama dengan nilai tertentu, membantu memahami distribusi kumulatif data.
Fungsi ECDF:
Memahami distribusi kumulatif data.
Menentukan persentil dengan mudah.
Mengidentifikasi perubahan tajam dalam distribusi data.
Contoh R:
ggplot(data.frame(data), aes(x = data)) +
stat_ecdf(geom = "step", color = "darkblue") +
labs(title = "ECDF Plot")
Setiap visualisasi memiliki fungsi tersendiri untuk memahami aspek berbeda dari distribusi data, sehingga penggunaannya bisa saling melengkapi dalam eksplorasi data.
Visualisasi hubungan antar variabel sangat penting dalam memahami pola-pola dan interaksi antar variabel dalam sebuah dataset. Berikut adalah penjelasan detail tentang berbagai jenis plot yang digunakan untuk mengeksplorasi hubungan antar variabel dengan contoh implementasi menggunakan bahasa pemrograman R.
Scatter plot digunakan untuk menampilkan hubungan antara dua variabel numerik. Plot ini memperlihatkan bagaimana satu variabel berubah seiring dengan perubahan variabel lainnya.
Fungsi Scatter Plot:
Mengidentifikasi hubungan atau korelasi antara dua variabel.
Mengamati pola seperti linearitas, non-linearitas, atau keberadaan outlier.
Menunjukkan arah hubungan (positif atau negatif).
Contoh R:
library(ggplot2)
data(mtcars)
ggplot(mtcars, aes(x = wt, y = mpg)) +
geom_point(color = "blue", size = 3) +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Scatter Plot: Berat vs Konsumsi BBM",
x = "Berat Mobil (wt)",
y = "Miles Per Gallon (mpg)")
Pair plot atau scatter matrix adalah visualisasi yang menampilkan scatter plot untuk semua kombinasi pasangan variabel numerik dalam dataset, sehingga memberikan gambaran cepat tentang hubungan antar semua variabel.
Fungsi Pair Plot:
Mengeksplorasi hubungan antar banyak variabel secara simultan.
Mengidentifikasi korelasi yang kuat atau pola tertentu antar pasangan variabel.
Mendeteksi kemungkinan adanya multikolinearitas.
Contoh R:
library(GGally)
data(iris)
ggpairs(iris, columns = 1:4, aes(color = Species))
Bubble chart adalah variasi scatter plot yang menggunakan ukuran gelembung sebagai representasi variabel ketiga. Plot ini sangat berguna untuk menunjukkan hubungan antara tiga variabel numerik sekaligus.
Fungsi Bubble Chart:
Menampilkan hubungan antara tiga variabel numerik dalam satu plot.
Ukuran gelembung memberikan wawasan tambahan mengenai dimensi ketiga.
Memungkinkan identifikasi pola kompleks dalam data multidimensional.
Contoh R:
ggplot(mtcars, aes(x = wt, y = mpg, size = disp)) +
geom_point(alpha = 0.5, color = "darkgreen") +
labs(title = "Bubble Chart: Berat, Konsumsi BBM, dan Displacement",
x = "Berat Mobil (wt)",
y = "Miles Per Gallon (mpg)",
size = "Displacement")
Heatmap korelasi adalah visualisasi matriks korelasi antar variabel yang menampilkan nilai korelasi dalam bentuk warna. Plot ini membantu mengidentifikasi variabel yang memiliki korelasi kuat ataupun lemah secara visual.
Fungsi Heatmap Korelasi:
Menunjukkan tingkat korelasi antar banyak variabel secara simultan.
Memudahkan deteksi multikolinearitas antar variabel.
Memberikan gambaran cepat tentang hubungan antar variabel numerik dalam dataset besar.
Contoh R:
library(corrplot)
# Matriks korelasi
corr_matrix <- cor(mtcars)
# Heatmap korelasi
corrplot(corr_matrix, method = "color", type = "upper", tl.col = "black", tl.srt = 45,
title = "Heatmap Korelasi antar Variabel")
Line plot sering digunakan untuk mengeksplorasi hubungan antara variabel numerik dengan variabel waktu (time series). Plot ini menampilkan perubahan variabel terhadap waktu secara kontinu.
Fungsi Line Plot:
Mengidentifikasi tren jangka panjang dalam data deret waktu.
Mengamati pola musiman atau siklus.
Membandingkan beberapa rangkaian data seiring waktu.
Contoh R:
data("AirPassengers")
plot(AirPassengers, type = "l", col = "purple", lwd = 2,
main = "Line Plot: Jumlah Penumpang Pesawat Tiap Bulan",
xlab = "Tahun", ylab = "Jumlah Penumpang")
# Menambahkan smoothing trend
lines(lowess(AirPassengers), col = "red", lwd = 2)
Kesimpulan
Visualisasi relasi antar variabel merupakan aspek krusial dalam Exploratory Data Analysis karena memberikan wawasan penting mengenai bagaimana variabel dalam dataset berinteraksi dan saling mempengaruhi. Setiap jenis plot memiliki fungsi uniknya sendiri yang membantu dalam eksplorasi data lebih mendalam, memungkinkan analisis yang lebih efektif dan pembuatan keputusan yang lebih informatif.
Analisis kategorik digunakan untuk mengeksplorasi dan memahami distribusi serta hubungan antara variabel kategorikal dalam dataset. Berikut adalah elemen-elemen penting dalam analisis data kategorik, lengkap dengan penjelasan dan contoh implementasi menggunakan R.
Fungsi Bar Chart:
Menampilkan jumlah kemunculan (frekuensi) setiap kategori dari suatu variabel.
Mudah dibaca dan digunakan untuk perbandingan antar kategori.
Efektif untuk data kategorik nominal maupun ordinal.
Contoh R:
library(ggplot2)
data(mpg)
ggplot(mpg, aes(x = class)) +
geom_bar(fill = "steelblue") +
labs(title = "Bar Chart: Frekuensi Tipe Mobil", x = "Kelas Mobil", y = "Frekuensi")
Fungsi Stacked Bar Chart:
Menampilkan distribusi kategori tambahan dalam setiap batang bar.
Digunakan untuk memahami proporsi antar kelompok dalam satu kategori utama.
Baik untuk data kategorik yang saling terkait.
Contoh R:
ggplot(mpg, aes(x = class, fill = drv)) +
geom_bar(position = "stack") +
labs(title = "Stacked Bar Chart: Kelas Mobil berdasarkan Sistem Penggerak",
x = "Kelas Mobil", y = "Frekuensi", fill = "Drive")
Fungsi Mosaic Plot:
Menampilkan hubungan dua variabel kategorikal dalam bentuk area proporsional.
Ukuran area merepresentasikan proporsi gabungan antar kategori.
Memungkinkan visualisasi asimetri atau ketidakteraturan hubungan kategorikal.
Contoh R:
table_data <- table(mpg$class, mpg$drv)
mosaicplot(table_data, main = "Mosaic Plot: Kelas vs Drive", color = TRUE,
xlab = "Kelas Mobil", ylab = "Tipe Drive")
Fungsi Cross-tabulation:
Menyediakan ringkasan tabular dari frekuensi dua variabel kategorikal.
Digunakan untuk perhitungan proporsi, analisis asosiasi, dan uji chi-square.
Format data yang esensial dalam analisis statistik kategorik.
Contoh R:
# Tabel kontingensi
ct <- table(mpg$drv, mpg$class)
ct
##
## 2seater compact midsize minivan pickup subcompact suv
## 4 0 12 3 0 33 4 51
## f 0 35 38 11 0 22 0
## r 5 0 0 0 0 9 11
# Tambahan: proporsi baris
table_row_prop <- prop.table(ct, margin = 1)
table_row_prop
##
## 2seater compact midsize minivan pickup subcompact
## 4 0.00000000 0.11650485 0.02912621 0.00000000 0.32038835 0.03883495
## f 0.00000000 0.33018868 0.35849057 0.10377358 0.00000000 0.20754717
## r 0.20000000 0.00000000 0.00000000 0.00000000 0.00000000 0.36000000
##
## suv
## 4 0.49514563
## f 0.00000000
## r 0.44000000
Kesimpulan
Analisis kategorik sangat penting untuk memahami pola dan hubungan dalam data non-numerik. Bar chart dan stacked bar chart memudahkan visualisasi distribusi dan perbandingan. Mosaic plot dan tabel kontingensi memberikan wawasan mendalam tentang interaksi antar kategori, mendukung eksplorasi awal hingga analisis inferensial lebih lanjut.
Outlier adalah data yang menyimpang secara signifikan dari pengamatan lainnya. Mendeteksi outlier penting untuk meningkatkan akurasi analisis dan menghindari bias pada hasil model. Beberapa metode populer untuk mendeteksi outlier meliputi visualisasi dan pendekatan statistik. Berikut penjelasan dan implementasinya dalam R.
Fungsi Boxplot:
Menampilkan ringkasan lima nilai statistik: minimum, Q1, median, Q3, maksimum.
Mengidentifikasi outlier sebagai titik yang berada di luar batas 1.5 IQR.
Memberikan gambaran distribusi dan sebaran data.
Contoh R:
data <- c(5, 7, 8, 9, 10, 11, 12, 13, 25) # 25 adalah outlier
boxplot(data, main = "Boxplot untuk Deteksi Outlier", col = "tomato")
Konsep: Z-score mengukur seberapa jauh suatu nilai dari mean dalam satuan standar deviasi.
\[ Z = \frac{x - \mu}{\sigma} \]
Jika nilai z-score lebih dari 3 atau kurang dari -3, biasanya dianggap sebagai outlier.
Fungsi Z-score:
Mengukur ekstremitas relatif terhadap distribusi normal.
Deteksi outlier dalam konteks distribusi Gaussian.
Contoh R:
data <- c(5, 7, 8, 9, 10, 11, 12, 13, 25)
z_scores <- scale(data)
outlier_index <- which(abs(z_scores) > 3)
# Visualisasi
library(ggplot2)
df <- data.frame(index = 1:length(data), value = data, is_outlier = abs(z_scores) > 2)
ggplot(df, aes(x = index, y = value, color = is_outlier)) +
geom_point(size = 3) +
scale_color_manual(values = c("black", "red")) +
labs(title = "Z-score Outlier Detection", color = "Outlier")
Konsep: Interquartile Range (IQR) adalah selisih antara kuartil ketiga (Q3) dan kuartil pertama (Q1).
\[ IQR = Q3 - Q1 \]
Data dianggap outlier jika: - Nilai < Q1 - 1.5 * IQR - Nilai > Q3 + 1.5 * IQR
Fungsi IQR Rule:
Identifikasi outlier berdasarkan distribusi data tanpa asumsi normalitas.
Digunakan dalam banyak algoritma statistik dan boxplot.
Contoh R:
Q1 <- quantile(data, 0.25)
Q3 <- quantile(data, 0.75)
IQR_val <- IQR(data)
# Batas bawah dan atas
lower <- Q1 - 1.5 * IQR_val
upper <- Q3 + 1.5 * IQR_val
# Indeks outlier
outlier_index_iqr <- which(data < lower | data > upper)
# Visualisasi
df$iqr_outlier <- df$value < lower | df$value > upper
ggplot(df, aes(x = index, y = value, color = iqr_outlier)) +
geom_point(size = 3) +
scale_color_manual(values = c("black", "blue")) +
labs(title = "IQR Rule Outlier Detection", color = "Outlier")
Konsep: Mahalanobis distance mengukur jarak multivariat suatu titik dari pusat distribusi.
\[ D_M^2 = (x - \mu)^T S^{-1} (x - \mu) \]
di mana \(S^{-1}\) adalah inverse dari matriks kovarians.
Fungsi Mahalanobis Distance:
Mendeteksi outlier dalam data multivariat.
Menggunakan struktur kovarians antar variabel.
Cocok untuk dataset dengan dimensi >1.
Contoh R:
data_m <- mtcars[, c("mpg", "wt", "disp")]
# Hitung mean dan kovarians
center <- colMeans(data_m)
cov_matrix <- cov(data_m)
# Mahalanobis distance
mahal <- mahalanobis(data_m, center, cov_matrix)
# Threshold (chi-square dengan df = 3)
threshold <- qchisq(0.99, df = 3)
outlier_mah <- mahal > threshold
# Visualisasi
library(ggplot2)
data_m$index <- 1:nrow(data_m)
data_m$outlier <- outlier_mah
ggplot(data_m, aes(x = index, y = mahal, color = outlier)) +
geom_point(size = 3) +
geom_hline(yintercept = threshold, linetype = "dashed", color = "red") +
scale_color_manual(values = c("black", "red")) +
labs(title = "Mahalanobis Distance Outlier Detection",
y = "Mahalanobis Distance", color = "Outlier")
Kesimpulan
Deteksi outlier merupakan bagian krusial dari proses EDA karena outlier dapat mempengaruhi hasil analisis secara signifikan. Metode visual seperti boxplot membantu untuk melihat outlier secara cepat. Pendekatan statistik seperti z-score dan IQR rule lebih tepat untuk distribusi tertentu. Untuk data multivariat, Mahalanobis distance sangat efektif. Dalam praktiknya, pemilihan metode tergantung pada jenis data, tujuan analisis, dan asumsi distribusi yang digunakan.
Analisis korelasi adalah proses untuk mengukur dan memahami kekuatan serta arah hubungan antara dua atau lebih variabel. Korelasi tidak selalu menunjukkan hubungan sebab-akibat, tetapi memberikan wawasan penting untuk eksplorasi dan pemodelan data.
Penjelasan:
Korelasi Pearson mengukur hubungan linear antar dua variabel numerik.
Korelasi Spearman mengukur asosiasi berbasis urutan (rank) dan berguna untuk data yang tidak normal.
Korelasi Kendall juga berbasis ranking dan lebih stabil untuk ukuran sampel kecil.
Rumus Umum (Pearson): \[ \rho_{X,Y} = \frac{\text{Cov}(X,Y)}{\sigma_X \sigma_Y} \]
Contoh R:
data(iris)
num_data <- iris[,1:4]
# Korelasi Pearson
cor(num_data, method = "pearson")
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
## Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
## Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
## Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
# Korelasi Spearman
cor(num_data, method = "spearman")
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 -0.1667777 0.8818981 0.8342888
## Sepal.Width -0.1667777 1.0000000 -0.3096351 -0.2890317
## Petal.Length 0.8818981 -0.3096351 1.0000000 0.9376668
## Petal.Width 0.8342888 -0.2890317 0.9376668 1.0000000
# Korelasi Kendall
cor(num_data, method = "kendall")
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.00000000 -0.07699679 0.7185159 0.6553086
## Sepal.Width -0.07699679 1.00000000 -0.1859944 -0.1571257
## Petal.Length 0.71851593 -0.18599442 1.0000000 0.8068907
## Petal.Width 0.65530856 -0.15712566 0.8068907 1.0000000
Penjelasan:
Correlogram atau heatmap adalah visualisasi dari matriks korelasi yang membantu mengidentifikasi pola hubungan secara cepat antar banyak variabel. Warna digunakan untuk menunjukkan kekuatan dan arah korelasi.
Fungsi:
Menyediakan ringkasan visual korelasi.
Membantu mengidentifikasi variabel yang redundan.
Berguna dalam seleksi fitur dan pra-pemodelan.
Contoh R:
library(corrplot)
corr_matrix <- cor(iris[, 1:4])
corrplot(corr_matrix,
method = "color",
type = "upper",
tl.col = "black", # warna label
tl.srt = 45, # rotasi label
tl.cex = 0.8, # ukuran teks label variabel
addCoef.col = "black",
number.cex = 0.7, # ukuran angka korelasi
mar = c(0, 0, 2, 0)) # margin
title("Heatmap Korelasi Variabel Numerik", cex.main = 1)
Penjelasan: Uji Chi-square digunakan untuk menentukan apakah terdapat hubungan yang signifikan antara dua variabel kategorik dalam bentuk tabel kontingensi.
Hipotesis: - H0: Tidak ada hubungan antara dua variabel (independen). - H1: Ada hubungan antara dua variabel (tidak independen).
Rumus Statistik: \[ \chi^2 = \sum \frac{(O_i - E_i)^2}{E_i} \] Di mana \(O_i\) adalah frekuensi observasi dan \(E_i\) adalah frekuensi ekspektasi.
Contoh R:
library(ggplot2)
data(mpg)
tab <- table(mpg$drv, mpg$class)
tab
##
## 2seater compact midsize minivan pickup subcompact suv
## 4 0 12 3 0 33 4 51
## f 0 35 38 11 0 22 0
## r 5 0 0 0 0 9 11
# Uji chi-square
chisq.test(tab)
## Warning in chisq.test(tab): Chi-squared approximation may be incorrect
##
## Pearson's Chi-squared test
##
## data: tab
## X-squared = 221.6, df = 12, p-value < 2.2e-16
Interpretasi Output: - Nilai p < 0.05: tolak H0 → ada hubungan yang signifikan. - Nilai p ≥ 0.05: gagal tolak H0 → tidak ada hubungan signifikan.
Kesimpulan
Analisis korelasi dan hubungan merupakan langkah penting dalam eksplorasi data. Matriks korelasi dan heatmap sangat berguna untuk data numerik, sedangkan uji chi-square efektif untuk data kategorikal. Hasil dari analisis ini membantu dalam memilih fitur relevan, memahami struktur data, dan mendeteksi potensi masalah seperti multikolinearitas sebelum membangun model prediktif atau inferensial.
Reduksi dimensi adalah teknik penting dalam EDA dan machine learning yang digunakan untuk menyederhanakan dataset berdimensi tinggi menjadi dimensi yang lebih rendah tanpa kehilangan informasi penting. Ini membantu dalam visualisasi dan mempercepat pemrosesan model.
Penjelasan: PCA adalah teknik linear yang mentransformasi variabel yang berkorelasi menjadi kumpulan variabel baru (principal components) yang tidak berkorelasi. Komponen pertama menangkap variasi terbesar dalam data.
Tujuan:
Mengurangi jumlah variabel.
Menjaga sebagian besar varians data.
Memvisualisasi struktur tersembunyi.
Rumus:
Misalkan \(X\) adalah matriks data yang telah dinormalisasi.
Kovarians matriks: \(S = \frac{1}{n-1} X^T X\)
Eigenvalue decomposition: \(S v = \lambda v\)
Principal component: \(Z = X V\)
Contoh R:
Rumus Komponen Utama (PC): Misalkan \(x_1, x_2, x_3, x_4\) adalah variabel asli (misalnya pada data iris: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width). Komponen utama pertama (PC1) dapat dirumuskan sebagai kombinasi linear:
\[ PC1 = a_{11}x_1 + a_{12}x_2 + a_{13}x_3 + a_{14}x_4 \]
Begitu juga:
\[ PC2 = a_{21}x_1 + a_{22}x_2 + a_{23}x_3 + a_{24}x_4 \]
Koefisien \(a_{ij}\) merupakan nilai eigenvector dari matriks kovarians yang menunjukkan kontribusi masing-masing variabel terhadap komponen utama.
Interpretasi Hasil PCA: Pada grafik PCA yang telah dihasilkan:
Titik-titik data dikelompokkan berdasarkan jenis spesies iris (setosa, versicolor, virginica).
PC1 memuat variasi data terbesar, yaitu memaksimalkan perbedaan antar individu.
PC2 menangkap variasi kedua terbesar yang orthogonal terhadap PC1.
Jika cluster antar spesies terpisah jelas pada plot PC1 vs PC2, ini menunjukkan bahwa PCA berhasil memproyeksikan perbedaan yang berarti antar spesies.
Plot PCA membantu menunjukkan bahwa variabel seperti Petal.Length dan Petal.Width sangat berkontribusi terhadap pemisahan antar spesies iris.
data(iris)
df <- iris[, 1:4]
# PCA
pca_result <- prcomp(df, scale. = TRUE)
summary(pca_result)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.7084 0.9560 0.38309 0.14393
## Proportion of Variance 0.7296 0.2285 0.03669 0.00518
## Cumulative Proportion 0.7296 0.9581 0.99482 1.00000
# Plot PCA
library(ggplot2)
pc_df <- data.frame(pca_result$x, Species = iris$Species)
ggplot(pc_df, aes(x = PC1, y = PC2, color = Species)) +
geom_point(size = 3) +
labs(title = "PCA: Iris Dataset")
Penjelasan: MDS adalah metode yang mengubah matriks jarak antara objek menjadi representasi visual dalam ruang berdimensi rendah, mempertahankan jarak relatif.
Tujuan:
Visualisasi hubungan antar observasi.
Digunakan ketika data diukur dalam jarak atau kemiripan.
Rumus:
Hitung jarak antar pasangan data: \(D_{ij} = \text{distance}(x_i, x_j)\)
Buat matriks jarak \(D\)
Transformasi menjadi matriks inner product \(B\)
Dekomposisi eigen: \(B = V \Lambda V^T\)
Representasi dimensi rendah: \(X = V \Lambda^{1/2}\)
Contoh R:
dist_matrix <- dist(df)
mds_result <- cmdscale(dist_matrix)
mds_df <- data.frame(Dim1 = mds_result[, 1], Dim2 = mds_result[, 2], Species = iris$Species)
ggplot(mds_df, aes(x = Dim1, y = Dim2, color = Species)) +
geom_point(size = 3) +
labs(title = "MDS: Iris Dataset")
Penjelasan:
t-SNE (t-Distributed Stochastic Neighbor Embedding) dan UMAP (Uniform Manifold Approximation and Projection) adalah metode non-linear untuk reduksi dimensi.
Cocok untuk data berdimensi sangat tinggi dan kompleks.
Menjaga struktur lokal dan klasterisasi lebih baik daripada PCA.
Tujuan:
Visualisasi data high-dimensional.
Eksplorasi struktur klaster.
Rumus t-SNE (ringkas):
Hitung probabilitas kemiripan antar titik di ruang tinggi: \[ p_{j|i} = \frac{\exp(-\|x_i - x_j\|^2 / 2\sigma_i^2)}{\sum_{k \neq i} \exp(-\|x_i - x_k\|^2 / 2\sigma_i^2)} \]
Hitung probabilitas kemiripan di ruang rendah (t-distribution): \[ q_{ij} = \frac{(1 + \|y_i - y_j\|^2)^{-1}}{\sum_{k \neq l} (1 + \|y_k - y_l\|^2)^{-1}} \]
Minimalkan KL-divergence antara \(p_{ij}\) dan \(q_{ij}\): \[ KL(P \| Q) = \sum_{i \ne j} p_{ij} \log \frac{p_{ij}}{q_{ij}} \]
Contoh t-SNE R:
library(Rtsne)
set.seed(42)
# Hapus duplikat terlebih dahulu
df_unique <- unique(df)
# Jalankan t-SNE
tsne_result <- Rtsne(df_unique, perplexity = 30)
tsne_df <- data.frame(tsne_result$Y)
tsne_df$Species <- iris$Species[!duplicated(df)]
colnames(tsne_df) <- c("Dim1", "Dim2", "Species")
ggplot(tsne_df, aes(x = Dim1, y = Dim2, color = Species)) +
geom_point(size = 3) +
labs(title = "t-SNE: Iris Dataset")
Contoh UMAP R:
library(umap)
umap_result <- umap(df)
umap_df <- data.frame(umap_result$layout, Species = iris$Species)
colnames(umap_df) <- c("Dim1", "Dim2", "Species")
ggplot(umap_df, aes(x = Dim1, y = Dim2, color = Species)) +
geom_point(size = 3) +
labs(title = "UMAP: Iris Dataset")
Kesimpulan
Reduksi dimensi memungkinkan kita memahami data kompleks melalui visualisasi dan simplifikasi. PCA cocok untuk data linear, MDS baik untuk representasi jarak, sementara t-SNE dan UMAP sangat berguna untuk visualisasi data high-dimensional dalam eksplorasi klaster dan pola tersembunyi. Pemahaman rumus matematis di balik teknik ini membantu dalam menginterpretasikan hasil dan memilih metode yang sesuai untuk konteks analisis tertentu.
Ketidakseimbangan kelas terjadi ketika jumlah observasi dalam satu atau lebih kelas jauh lebih besar dibandingkan kelas lainnya. Ini umum terjadi dalam permasalahan klasifikasi dan bisa menyebabkan bias model prediktif terhadap kelas mayoritas.
Penjelasan: Distribusi target memperlihatkan bagaimana data menyebar antar kelas. Distribusi yang sangat tidak merata dapat menunjukkan potensi bias dalam pelatihan model klasifikasi.
Contoh R:
library(ggplot2)
data(iris)
ggplot(iris, aes(x = Species)) +
geom_bar(fill = "steelblue") +
labs(title = "Distribusi Target - Species", x = "Kelas", y = "Jumlah")
Penjelasan: Rasio ini menghitung proporsi antara kelas yang paling sedikit dan kelas yang paling banyak. Nilai rasio yang jauh dari 1 menunjukkan ketidakseimbangan yang signifikan.
Contoh R:
class_counts <- table(iris$Species)
class_counts
##
## setosa versicolor virginica
## 50 50 50
# Rasio
min_class <- min(class_counts)
max_class <- max(class_counts)
ratio <- min_class / max_class
paste("Rasio kelas minoritas vs mayoritas:", round(ratio, 2))
## [1] "Rasio kelas minoritas vs mayoritas: 1"
Penjelasan: Visualisasi proporsi digunakan untuk menunjukkan bagian relatif masing-masing kelas dalam total data.
Contoh R:
library(dplyr)
iris %>%
count(Species) %>%
mutate(proporsi = n / sum(n)) %>%
ggplot(aes(x = Species, y = proporsi, fill = Species)) +
geom_col() +
scale_y_continuous(labels = scales::percent) +
labs(title = "Proporsi Tiap Kelas", y = "Proporsi", x = "Kelas")
Kesimpulan
Mendeteksi dan memvisualisasikan ketidakseimbangan kelas merupakan langkah penting dalam EDA, terutama untuk mempersiapkan data klasifikasi. Ketidakseimbangan kelas yang ekstrem dapat mengakibatkan model yang bias dan kurang akurat, sehingga perlu strategi seperti oversampling, undersampling, atau algoritma penanganan imbalance.
Analisis waktu sangat penting dalam EDA ketika data memiliki komponen temporal seperti tanggal atau waktu. Tujuan utamanya adalah memahami pola, tren, musim, dan ketergantungan waktu yang mungkin ada dalam data.
Dalam analisis waktu, beberapa teknik umum yang digunakan meliputi:
Visualisasi tren (Trend Plot)
Decomposisi musiman (Seasonal Decomposition)
Lag plot dan Autocorrelation Function (ACF)
Penjelasan: Trend plot digunakan untuk mengamati perubahan nilai dari waktu ke waktu. Pola yang tampak dapat berupa tren naik, tren turun, atau pola musiman.
Contoh R:
data("AirPassengers")
plot(AirPassengers, main = "Trend Plot - Air Passengers",
ylab = "Jumlah Penumpang", xlab = "Tahun",
col = "blue", lwd = 2)
lines(lowess(time(AirPassengers), as.numeric(AirPassengers)),
col = "red", lwd = 2)
legend("topleft", legend = c("Data Aktual", "Lowess Smoothing"),
col = c("blue", "red"), lwd = 2)
Interpretasi:
Garis biru menunjukkan jumlah penumpang aktual per bulan.
Garis merah menunjukkan tren yang dihaluskan menggunakan lowess smoothing.
Terlihat adanya tren naik yang konsisten sepanjang tahun.
Penjelasan: STL (Seasonal and Trend decomposition using Loess) adalah metode untuk memisahkan komponen tren, musiman, dan residual dari data deret waktu.
Komponen:
Trend: perubahan jangka panjang.
Seasonal: pola berulang dalam periode tertentu.
Remainder (Residual): fluktuasi acak yang tidak dijelaskan oleh tren atau musim.
Contoh R:
dekomposisi <- stl(log(AirPassengers), s.window = "periodic")
plot(dekomposisi, main = "STL Decomposition - Air Passengers")
Interpretasi:
Komponen trend memperlihatkan kecenderungan naik dari waktu ke waktu.
Komponen seasonal menunjukkan fluktuasi musiman yang teratur tiap tahun.
Komponen remainder mencerminkan noise yang tidak terstruktur.
Penjelasan: - Lag Plot digunakan untuk memeriksa adanya korelasi antara nilai saat ini dengan nilai di masa lalu (lag). - ACF Plot mengukur seberapa besar hubungan antara nilai saat ini dan nilai di berbagai lag.
Lag Plot Contoh R:
lag.plot(AirPassengers, lags = 12, main = "Lag Plot - AirPassengers")
ACF Plot Contoh R:
acf(log(AirPassengers), main = "ACF Plot - AirPassengers")
Interpretasi:
Tips Tambahan dalam Analisis Temporal:
Gunakan transformasi log jika data memiliki variasi yang meningkat.
Cek stasioneritas sebelum membangun model peramalan.
Pertimbangkan pergeseran waktu (lag) untuk fitur prediktor dalam pemodelan.
Kesimpulan
Analisis waktu adalah komponen penting dalam EDA jika data memiliki struktur temporal. Dengan menggunakan trend plot, dekomposisi musiman, lag plot, dan ACF, kita dapat:
Mengidentifikasi tren dan pola musiman
Menentukan struktur model waktu (misalnya ARIMA)
Menilai kestasioneran dan autokorelasi
Dengan pemahaman visual dan statistik yang tepat, analisis temporal membantu mempersiapkan data untuk pemodelan deret waktu yang akurat dan dapat diandalkan.
Interaktivitas dalam Exploratory Data Analysis (EDA) sangat membantu untuk memperdalam eksplorasi data dengan memberikan pengguna kemampuan untuk berinteraksi langsung dengan visualisasi. Interaktivitas dapat meningkatkan pemahaman pola data, outlier, dan dinamika antar variabel.
Dua pendekatan populer dalam R adalah menggunakan:
Plotly/ggiraph untuk interaktivitas dasar (hover, zoom, klik)
Shiny untuk interaktivitas dinamis yang lebih kompleks
Penjelasan: Plotly memungkinkan grafik
ggplot2
menjadi interaktif dengan fitur hover (tooltip),
zoom, dan panning.
Contoh R:
library(ggplot2)
library(plotly)
data(iris)
p <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) +
geom_point(size = 3) +
labs(title = "Scatter Plot Interaktif dengan Plotly")
ggplotly(p)
Fitur: - Hover untuk menampilkan nilai data
Zoom dengan scroll
Klik untuk seleksi sub-kumpulan
Penjelasan: ggiraph
memperluas
ggplot2
dengan kemampuan untuk membuat tooltip kustom,
link, dan efek klik.
Contoh R:
library(ggiraph)
library(ggplot2)
p <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, color = Species)) +
geom_point_interactive(aes(tooltip = Species, data_id = Species), size = 3) +
labs(title = "ggiraph: Tooltip Interaktif")
girafe(ggobj = p)
Kelebihan:
Tooltip sangat customizable
Dapat digunakan di RMarkdown dan Shiny
Penjelasan: Shiny memungkinkan pengguna membangun antarmuka interaktif untuk memilih dan menyaring data secara real-time.
Contoh R:
library(shiny)
library(ggplot2)
ui <- fluidPage(
titlePanel("EDA Interaktif dengan Shiny"),
sidebarLayout(
sidebarPanel(
selectInput("species", "Pilih Species:",
choices = unique(iris$Species), selected = "setosa")
),
mainPanel(
plotOutput("scatterPlot")
)
)
)
server <- function(input, output) {
output$scatterPlot <- renderPlot({
filtered <- iris[iris$Species == input$species, ]
ggplot(filtered, aes(x = Sepal.Length, y = Petal.Length)) +
geom_point(color = "blue", size = 3) +
labs(title = paste("Scatter Plot untuk", input$species))
})
}
shinyApp(ui, server)
Fitur:
Filter data berdasarkan input pengguna
Update grafik secara real-time
Dapat dikembangkan lebih jauh menjadi dashboard
Kesimpulan
Penggunaan interaktivitas dalam EDA sangat dianjurkan untuk mendalami analisis dan mendapatkan insight lebih cepat. Plotly dan ggiraph sangat baik untuk visualisasi statis interaktif, sedangkan Shiny cocok untuk membangun aplikasi eksplorasi data yang kompleks dan dinamis.
Sesi ini bertujuan untuk memberikan keterampilan dasar kepada mahasiswa dalam melakukan analisis tren dan regresi menggunakan bahasa pemrograman R. Pemahaman ini penting dalam kerangka kerja data science, khususnya untuk aplikasi di bidang ekonomi digital, seperti memproyeksikan tren konsumsi atau menganalisis faktor-faktor yang memengaruhi pertumbuhan bisnis.
Tren data adalah kecenderungan pola perubahan nilai data sepanjang waktu, yang bisa menunjukkan kenaikan, penurunan, atau stabilitas (Makridakis et al., 1998).
Tren bisa bersifat:
Naik (uptrend): Nilai data cenderung meningkat seiring waktu.
Turun (downtrend): Nilai data cenderung menurun seiring waktu.
Stabil: Tidak ada perubahan signifikan sepanjang waktu.
Contoh dalam ekonomi digital: meningkatnya volume transaksi e-commerce setiap tahun.
Regresi linier sederhana adalah metode statistik untuk memodelkan hubungan antara satu variabel independen (X) dan satu variabel dependen (Y) dengan bentuk hubungan linier (Montgomery et al., 2012).
Model matematis regresi sederhana:
\[ Y_i = \beta_0 + \beta_1 X_i + \epsilon_i \]
Di mana:
\(Y_i\): Nilai variabel dependen untuk observasi ke-\(i\).
\(X_i\): Nilai variabel independen untuk observasi ke-\(i\).
\(\beta_0\): Intersep (nilai Y saat X=0).
\(\beta_1\): Koefisien regresi (besar perubahan rata-rata Y untuk setiap kenaikan satu unit X).
\(\epsilon_i\): Galat (error) untuk observasi ke-\(i\), diasumsikan berdistribusi normal dengan rata-rata 0 dan variansi konstan.
Tujuan
Memahami hubungan antara dua variabel.
Memprediksi nilai Y untuk nilai X yang diketahui.
Menilai kekuatan hubungan antara X dan Y.
Interpretasi Koefisien
Intersep (\(\beta_0\)): Perkiraan rata-rata Y ketika X = 0.
Slope (\(\beta_1\)): Perubahan rata-rata Y untuk setiap kenaikan satu unit X.
Contoh Interpretasi: > Jika \(\beta_1 = 3\), maka untuk setiap kenaikan 1 unit X, rata-rata Y meningkat sebesar 3 unit.
Metode OLS bertujuan meminimumkan jumlah kuadrat galat (error):
\[ S(\beta_0, \beta_1) = \sum_{i=1}^n (Y_i - \beta_0 - \beta_1 X_i)^2 \]
Turunan untuk Mendapatkan Estimator \(\beta_0\) dan \(\beta_1\)
Untuk meminimalkan \(S(\beta_0, \beta_1)\), kita hitung turunan parsial terhadap \(\beta_0\) dan \(\beta_1\), lalu disamakan dengan nol.
Turunan terhadap \(\beta_0\)
\[ \frac{\partial S}{\partial \beta_0} = -2 \sum_{i=1}^n (Y_i - \beta_0 - \beta_1 X_i) = 0 \]
Menyederhanakan:
\[ \sum_{i=1}^n Y_i = n \beta_0 + \beta_1 \sum_{i=1}^n X_i \]
Turunan terhadap \(\beta_1\)
\[ \frac{\partial S}{\partial \beta_1} = -2 \sum_{i=1}^n X_i (Y_i - \beta_0 - \beta_1 X_i) = 0 \]
Menyederhanakan:
\[ \sum_{i=1}^n X_i Y_i = \beta_0 \sum_{i=1}^n X_i + \beta_1 \sum_{i=1}^n X_i^2 \]
Sistem Persamaan Normal
Dari hasil turunan:
\[ \sum Y_i = n \beta_0 + \beta_1 \sum X_i \]
\[ \sum X_i Y_i = \beta_0 \sum X_i + \beta_1 \sum X_i^2 \]
Solusi Estimator OLS
Diperoleh estimator untuk slope \(\beta_1\):
\[ \hat{\beta}_1 = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sum (X_i - \bar{X})^2} \]
atau setara dengan:
\[ \hat{\beta}_1 = \frac{\text{Cov}(X, Y)}{\text{Var}(X)} \]
Estimator untuk intersep \(\beta_0\):
\[ \hat{\beta}_0 = \bar{Y} - \hat{\beta}_1 \bar{X} \]
dengan:
\(\bar{X}\) = rata-rata \(X\)
\(\bar{Y}\) = rata-rata \(Y\)
Metode OLS memberikan taksiran parameter yang meminimalkan jumlah kuadrat error antara nilai observasi aktual dan nilai prediksi model. OLS juga merupakan penaksir BLUE (Best Linear Unbiased Estimator) berdasarkan Gauss-Markov theorem jika asumsi klasik regresi linier terpenuhi.
\[ R^2 = 1 - \frac{\text{SS}_{\text{res}}}{\text{SS}_{\text{tot}}} \]
Di mana:
\(\text{SS}_{\text{res}}\): Jumlah kuadrat residual.
\(\text{SS}_{\text{tot}}\): Jumlah kuadrat total.
Nilai \(R^2\) berkisar antara 0 sampai 1:
\(R^2 = 1\): Model menjelaskan semua variasi dalam Y.
\(R^2 = 0\): Model tidak menjelaskan variasi dalam Y sama sekali.
Misalkan kita ingin memodelkan hubungan antara jumlah iklan online (X) dengan volume penjualan bulanan (Y) di sebuah platform e-commerce:
\(X\): Jumlah iklan online dalam satu bulan.
\(Y\): Total volume transaksi bulan tersebut.
Jika hasil regresi menunjukkan \(\beta_1 = 500\), berarti setiap tambahan satu iklan online diasosiasikan dengan peningkatan rata-rata Rp500 ribu dalam volume transaksi.
Memprediksi volume transaksi online.
Mengidentifikasi faktor-faktor yang memengaruhi pertumbuhan bisnis digital.
Mendukung keputusan berbasis data dalam strategi pemasaran, pricing, dan operasional.
Prediksi volume transaksi e-commerce berdasarkan waktu.
Analisis pengaruh inflasi terhadap jumlah transaksi di marketplace.
library(ggplot2)
library(dplyr)
library(broom)
# Simulasi data
set.seed(123)
bulan <- seq(as.Date("2022-01-01"), by = "month", length.out = 24)
transaksi <- cumsum(rnorm(24, mean = 100, sd = 20))
data_ts <- data.frame(Bulan = bulan, Transaksi = transaksi)
head(data_ts)
## Bulan Transaksi
## 1 2022-01-01 88.79049
## 2 2022-02-01 184.18694
## 3 2022-03-01 315.36110
## 4 2022-04-01 416.77127
## 5 2022-05-01 519.35703
## 6 2022-06-01 653.65833
# Visualisasi tren transaksi
ggplot(data_ts, aes(x = Bulan, y = Transaksi)) +
geom_line() +
geom_point() +
labs(title = "Tren Transaksi Bulanan", x = "Bulan", y = "Jumlah Transaksi")
# Model regresi sederhana
model_lm <- lm(Transaksi ~ as.numeric(Bulan), data = data_ts)
summary(model_lm)
##
## Call:
## lm(formula = Transaksi ~ as.numeric(Bulan), data = data_ts)
##
## Residuals:
## Min 1Q Median 3Q Max
## -56.594 -15.115 4.887 13.855 51.744
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.314e+04 5.207e+02 -121.2 <2e-16 ***
## as.numeric(Bulan) 3.331e+00 2.692e-02 123.7 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 27.77 on 22 degrees of freedom
## Multiple R-squared: 0.9986, Adjusted R-squared: 0.9985
## F-statistic: 1.531e+04 on 1 and 22 DF, p-value: < 2.2e-16
Intersep (\(\beta_0\)): Perkiraan rata-rata Y ketika X = 0.
Slope (\(\beta_1\)): Perubahan rata-rata Y untuk setiap kenaikan satu unit X (dalam hal ini, setiap satu hari).
R-squared (\(R^2\)): Seberapa besar variasi Y yang dapat dijelaskan oleh X.
\(R^2\) mendekati 1 menunjukkan model sangat baik.
\(R^2\) mendekati 0 menunjukkan model tidak banyak menjelaskan variasi data.
# Plot residual
plot(model_lm$residuals, type = "o", main = "Plot Residual", ylab = "Residual", xlab = "Observasi")
abline(h = 0, col = "red", lty = 2)
shapiro.test(model_lm$residuals)
##
## Shapiro-Wilk normality test
##
## data: model_lm$residuals
## W = 0.97855, p-value = 0.8678
p-value > 0.05: Tidak menolak normalitas.
Homoskedastisitas: Residual vs fitted plot.
plot(fitted(model_lm), residuals(model_lm))
abline(h = 0, col = "red", lty = 2)
Hipotesis untuk slope (\(\beta_1\)):
\(H_0\): \(\beta_1 = 0\) (tidak ada hubungan)
\(H_1\): \(\beta_1 \neq 0\) (ada hubungan)
Dilihat dari p-value di output
summary(model_lm)
:
Kesimpulan
Interpretasi koefisien dan \(R^2\) menunjukkan apakah hubungan linier ini cukup kuat.
Evaluasi residual dan uji asumsi memperkuat keandalan model.
Uji signifikansi membantu memutuskan apakah prediktor benar-benar penting.
Menyimpan koefisien
coef_lm <- coef(model_lm)
intercept <- round(coef_lm[1], 2)
slope <- round(coef_lm[2], 2)
Menyimpan R-squared
r_squared <- round(summary(model_lm)$r.squared, 3)
# Menambahkan nilai prediksi ke dalam data
# Prediksi dengan interval kepercayaan
prediksi_data <- predict(model_lm, interval = "confidence", level = 0.95)
# Gabungkan ke dalam data
data_ts <- data_ts %>%
mutate(
Prediksi = prediksi_data[,"fit"],
Lower = prediksi_data[,"lwr"],
Upper = prediksi_data[,"upr"]
)
# Teks persamaan regresi dan R-squared
# Teks persamaan regresi dan R-squared
regression_eq <- paste0("y = ", intercept, " + ", slope, "x\nR² = ", r_squared)
# Visualisasi
ggplot(data_ts, aes(x = Bulan)) +
geom_ribbon(aes(ymin = Lower, ymax = Upper), fill = "gray80", alpha = 0.5) +
geom_point(aes(y = Transaksi, color = "Aktual"), size = 2) +
geom_line(aes(y = Transaksi, color = "Aktual"), linetype = "dotted") +
geom_line(aes(y = Prediksi, color = "Prediksi"), size = 1) +
scale_color_manual(values = c("Aktual" = "blue", "Prediksi" = "red")) +
geom_text(aes(x = Bulan[5], y = max(Transaksi) * 0.95, label = regression_eq),
inherit.aes = FALSE, hjust = 0, size = 4, color = "black") +
labs(
title = "Tren Transaksi Bulanan, Prediksi Regresi Linier, dan Confidence Band",
x = "Bulan",
y = "Jumlah Transaksi",
color = "Legenda"
) +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning in geom_text(aes(x = Bulan[5], y = max(Transaksi) * 0.95, label = regression_eq), : All aesthetics have length 1, but the data has 24 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
## a single row.
Interpretasi
Titik biru: Data aktual transaksi.
Garis biru putus-putus: Tren aktual transaksi.
Garis merah: Prediksi berdasarkan model regresi linier sederhana.
Persamaan regresi dan nilai R² ditampilkan di dalam plot.
Garis prediksi menunjukkan kecenderungan rata-rata transaksi berdasarkan pola waktu.
Note: Plot ini membantu membandingkan bagaimana model linier mendekati pola data aktual. Jika pola data nonlinier atau memiliki seasonality, metode lain mungkin diperlukan.
Note: Dalam kasus nyata, data waktu sebaiknya diolah lebih lanjut menggunakan teknik time series modeling seperti ARIMA atau Holt-Winters jika pola waktu lebih kompleks.
Time series adalah sekumpulan observasi yang dikumpulkan berurutan berdasarkan waktu (Makridakis et al., 1998).
Karakteristik penting:
Observasi berurutan dalam waktu.
Adanya dependensi antara observasi yang berdekatan.
Contoh dalam ekonomi digital:
Jumlah transaksi online harian.
Harga cryptocurrency setiap jam.
Contoh: Peningkatan jumlah pengguna e-commerce dari tahun ke tahun.
library(ggplot2)
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Registered S3 method overwritten by 'forecast':
## method from
## predict.default statip
##
## Attaching package: 'forecast'
## The following object is masked from 'package:modeest':
##
## naive
library(tibble)
trend_data <- tibble(
Time = 1:50,
Value = 50 + 2 * (1:50) + rnorm(50, sd = 5)
)
ggplot(trend_data, aes(x = Time, y = Value)) +
geom_line() +
labs(title = "Contoh Data dengan Trend", x = "Waktu", y = "Nilai")
Contoh: Peningkatan penjualan baju baru saat lebaran.
seasonal_data <- ts(rep(c(100, 120, 150, 120), times = 10) + rnorm(40, sd = 5))
autoplot(seasonal_data) +
labs(title = "Contoh Data dengan Seasonality", x = "Waktu", y = "Nilai")
Contoh: Fluktuasi jumlah investasi startup mengikuti kondisi ekonomi.
set.seed(123)
cyclic_data <- tibble(
Time = 1:50,
Value = 100 + 20 * sin(2 * pi * (1:50)/20) + rnorm(50, sd = 5)
)
ggplot(cyclic_data, aes(x = Time, y = Value)) +
geom_line() +
labs(title = "Contoh Data dengan Siklus", x = "Waktu", y = "Nilai")
Contoh: Fluktuasi jumlah klik iklan secara acak.
random_data <- tibble(
Time = 1:50,
Value = 100 + rnorm(50, mean = 0, sd = 20)
)
ggplot(random_data, aes(x = Time, y = Value)) +
geom_line() +
labs(title = "Contoh Data dengan Fluktuasi Acak", x = "Waktu", y = "Nilai")
Exponential Smoothing adalah metode peramalan time series yang menggunakan rata-rata tertimbang dari observasi masa lalu, di mana bobot menurun secara eksponensial untuk observasi yang lebih lama (Hyndman & Athanasopoulos, 2018).
Formulasi dasar Simple Exponential Smoothing (SES):
\[ \hat{y}_{t+1} = \alpha y_t + (1-\alpha) \hat{y}_t \]
Dengan:
\(\hat{y}_{t+1}\) = Forecast untuk waktu \(t+1\)
\(y_t\) = Observasi aktual pada waktu \(t\)
\(\hat{y}_t\) = Forecast untuk waktu \(t\)
\(\alpha\) = Smoothing parameter (0 < \(\alpha\) < 1)
Formulasi:
\[ \text{Level:} \quad l_t = \alpha y_t + (1-\alpha)(l_{t-1} + b_{t-1}) \]
\[ \text{Trend:} \quad b_t = \beta (l_t - l_{t-1}) + (1-\beta) b_{t-1} \]
\[ \text{Forecast:} \quad \hat{y}_{t+h} = l_t + hb_t \]
Formulasi untuk Holt-Winters Additive:
\[ \text{Level:} \quad l_t = \alpha (y_t - s_{t-m}) + (1-\alpha)(l_{t-1} + b_{t-1}) \]
\[ \text{Trend:} \quad b_t = \beta (l_t - l_{t-1}) + (1-\beta) b_{t-1} \]
\[ \text{Seasonality:} \quad s_t = \gamma (y_t - l_{t-1} - b_{t-1}) + (1-\gamma) s_{t-m} \]
\[ \text{Forecast:} \quad \hat{y}_{t+h} = l_t + hb_t + s_{t-m+h \mod m} \]
Dengan:
\(l_t\) = level
\(b_t\) = tren
\(s_t\) = faktor musiman
\(m\) = panjang musim
Implementasi di R
# Data dengan seasonality
seasonal_series <- ts(rep(c(120, 150, 180, 150), times = 5) + rnorm(20, sd = 5), frequency = 4)
# Holt-Winters
model_hw <- hw(seasonal_series, seasonal = "additive", h = 8)
# Forecast hasil
forecast(model_hw)
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 6 Q1 116.1896 111.0404 121.3389 108.3145 124.0648
## 6 Q2 150.1622 145.0129 155.3115 142.2871 158.0374
## 6 Q3 178.1434 172.9941 183.2927 170.2682 186.0185
## 6 Q4 148.1236 142.9743 153.2729 140.2485 155.9988
## 7 Q1 116.1707 111.0214 121.3200 108.2955 124.0459
## 7 Q2 150.1433 144.9940 155.2926 142.2681 158.0185
## 7 Q3 178.1244 172.9751 183.2737 170.2492 185.9996
## 7 Q4 148.1047 142.9554 153.2540 140.2295 155.9799
# Plot hasil
plot(model_hw, main = "Holt-Winters Additive Forecast")
Forecast: Prediksi nilai masa depan.
Trend: Model memperhitungkan perubahan tren.
Seasonality: Model memperhitungkan pola musiman.
Interval prediksi: Memberikan rentang ketidakpastian.
Situasi Data | Metode yang Direkomendasikan | Fungsi di R |
---|---|---|
Tidak ada tren, tidak ada seasonality | Simple Exponential Smoothing (SES) | ses() |
Ada tren, tidak ada seasonality | Holt’s Linear Trend Method | holt() |
Ada tren dan seasonality | Holt-Winters Method | hw() |
Catatan Tambahan
Gunakan Simple Exponential Smoothing untuk data tanpa tren dan seasonality.
Gunakan Holt’s Method untuk data dengan tren.
Gunakan Holt-Winters Method untuk data dengan tren dan seasonality.
Pilih dataset sederhana: Data harga komoditas bulanan, jumlah transaksi UMKM online, dsb.
Eksplorasi Data: Lihat pola umum dalam data.
Visualisasi: Buat grafik tren menggunakan
ggplot2
.
Modeling: Bangun regresi linier sederhana dengan
lm()
.
Interpretasi: Bahas hasil model dan prediksi.
# Data contoh
harga <- cumsum(rnorm(24, mean = 5, sd = 2))
data_komoditas <- data.frame(Bulan = bulan, Harga = harga)
# Visualisasi
p <- ggplot(data_komoditas, aes(x = Bulan, y = Harga)) +
geom_line(color = "blue") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Tren Harga Komoditas", x = "Bulan", y = "Harga")
p
## `geom_smooth()` using formula = 'y ~ x'
# Regresi
model_harga <- lm(Harga ~ Bulan, data = data_komoditas)
tidy(model_harga)
## # A tibble: 2 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) -3069. 37.8 -81.1 9.50e-29
## 2 Bulan 0.162 0.00196 82.7 6.15e-29
Masing-masing kelompok:
Menyajikan visualisasi tren.
Menjelaskan model regresi sederhana.
Menginterpretasikan koefisien dan hasil model.
Diskusi reflektif:
Apa tantangan terbesar dalam eksplorasi dan analisis?
Apa manfaat visualisasi sebelum membangun model?
Bagaimana keandalan hasil regresi digunakan dalam pengambilan keputusan bisnis?
Sesi ini memperkenalkan seluruh alur proses analisis tren dan regresi dari eksplorasi data, visualisasi, modeling hingga interpretasi hasil untuk mendukung pengambilan keputusan di ekonomi digital.
Note: Dataset sederhana bisa disiapkan oleh dosen
atau diambil dari sumber terbuka seperti Kaggle, BPS, atau scraping
sederhana menggunakan rvest
.
Referensi
Hyndman, R. J., & Athanasopoulos, G. (2018). Forecasting: Principles and Practice (2nd ed.). OTexts.
Makridakis, S., Wheelwright, S. C., & Hyndman, R. J. (1998). Forecasting: Methods and Applications (3rd ed.). John Wiley & Sons.
Montgomery, D. C., Peck, E. A., & Vining, G. G. (2012). Introduction to Linear Regression Analysis (5th ed.). Wiley.