Lewati ke konten utama

Tutorial Menangani Data Kategorikal untuk Machine Learning dengan Python

Pelajari trik umum untuk menangani data kategorikal dan melakukan prapemrosesan guna membangun model machine learning!
Diperbarui 28 Sep 2026  · 14 mnt Baca

Jelajahi bersama AI

ChatGPTClaudePerplexity

Machine learning relies on categorical data and three other data types

Sumber Gambar

Pendahuluan

Data yang dapat dikategorikan tetapi tidak memiliki hierarki atau urutan bawaan dikenal sebagai data kategorikal. Dengan kata lain, tidak ada hubungan matematis antar kategori. Jenis kelamin seseorang (pria/wanita), warna mata (biru, hijau, cokelat, dll.), jenis kendaraan yang mereka kendarai (sedan, SUV, truk, dll.), atau jenis buah yang mereka konsumsi (apel, pisang, jeruk, dll.) adalah contoh data kategorikal.

Dalam tutorial ini, kita akan menguraikan metode penanganan dan prapemrosesan untuk data kategorikal. Sebelum membahas pentingnya menyiapkan data kategorikal untuk model machine learning, kita akan terlebih dahulu mendefinisikan data kategorikal dan jenis-jenisnya. Selain itu, kita akan melihat beberapa metode pengodean, metode analisis dan visualisasi data kategorikal di Python, serta konsep yang lebih lanjut seperti data kategorikal dengan kardinalitas besar dan berbagai metode pengodean.

Dataset Kategorikal

Informasi direpresentasikan menggunakan dua bentuk data yang berbeda: data kategorikal dan data numerik. Data yang dapat dikategorikan atau dikelompokkan disebut data kategorikal. Pria dan wanita termasuk dalam kategori jenis kelamin, warna merah, hijau, dan biru termasuk dalam kategori warna, dan kategori negara dapat mencakup AS, Kanada, Meksiko, dll.

Data numerik mengacu pada data yang dapat dinyatakan sebagai angka. Contoh data numerik meliputi tinggi badan, berat badan, dan suhu. 

Sederhananya, data kategorikal adalah informasi yang dapat dimasukkan ke dalam kategori, sedangkan data numerik adalah informasi yang dapat dinyatakan sebagai angka. Karena sebagian besar algoritma machine learning dibuat untuk bekerja dengan data numerik, data kategorikal diperlakukan berbeda dari data numerik dalam bidang ini. Sebelum data kategorikal dapat digunakan sebagai masukan ke model machine learning, data tersebut harus terlebih dahulu diubah menjadi data numerik. Proses mengonversi data kategorikal menjadi representasi numerik ini dikenal sebagai encoding.

Qualitative and quantitative data categories

Data Kualitatif dan Kuantitatif - Sumber Gambar

Ada dua jenis data kategorikal: nominal dan ordinal.

Data nominal

Data nominal adalah data kategorikal yang dapat dibagi menjadi kelompok, tetapi kelompok tersebut tidak memiliki hierarki atau urutan bawaan. Contoh data nominal termasuk nama merek (Coca-Cola, Pepsi, Sprite), variasi topping pizza (pepperoni, jamur, bawang), dan warna rambut (pirang, cokelat, hitam, dll.). Lihat panduan kami tentang variabel nominal untuk mempelajari lebih lanjut. 

Data ordinal

Data ordinal, di sisi lain, menggambarkan informasi yang dapat dikategorikan dan memiliki urutan atau peringkat yang jelas. Tingkat pendidikan (SMA, sarjana, magister), tingkat kepuasan kerja (sangat puas, puas, netral, tidak puas, sangat tidak puas), dan peringkat bintang (1-bintang, 2-bintang, 3-bintang, 4-bintang, 5-bintang) adalah beberapa contoh data ordinal.

Dengan memberikan setiap kategori nilai numerik yang mencerminkan urutan atau peringkatnya, data ordinal dapat diubah menjadi data numerik dan digunakan dalam machine learning. Ini dapat bermanfaat untuk algoritma yang sensitif terhadap skala data masukan.

Perbedaan antara data nominal dan ordinal tidak selalu jelas dalam praktik dan dapat bervariasi tergantung pada kasus penggunaan tertentu. Misalnya, sementara sebagian orang mungkin menganggap "peringkat bintang" sebagai data ordinal, yang lain mungkin menganggapnya sebagai data nominal. Yang paling penting adalah memahami sifat data Anda dan memilih strategi encoding yang paling baik menangkap hubungan dalam data Anda.

Memahami tipe data di pandas

pandas adalah pustaka open-source Python yang banyak digunakan untuk analisis dan manipulasi data. Pustaka ini memiliki kemampuan kuat untuk menangani data terstruktur, termasuk data frame dan series yang dapat menangani data tabular dengan baris dan kolom berlabel. 

pandas juga menyediakan beberapa fungsi untuk membaca dan menulis berbagai jenis file (csv, parquet, basis data, dll.). Saat Anda membaca file menggunakan pandas, setiap kolom akan diberi tipe data berdasarkan inferensi. Berikut semua tipe data yang dapat ditetapkan oleh pandas:

  1. Numerik: Mencakup bilangan bulat dan bilangan titik-mengambang. Data numerik biasanya digunakan untuk analisis kuantitatif dan operasi matematis.
  2. String: Tipe data ini digunakan untuk merepresentasikan data tekstual seperti nama, alamat, dan deskripsi.
  3. Boolean: Tipe data ini hanya memiliki dua nilai yang mungkin: True atau False. Data boolean sering digunakan untuk operasi logis dan pemfilteran.
  4. Datetime: Tipe data ini digunakan untuk merepresentasikan tanggal dan waktu. pandas memiliki alat yang kuat untuk memanipulasi data datetime.
  5. Kategorikal: Tipe data ini merepresentasikan data yang memiliki sejumlah nilai terbatas. Data kategorikal sering digunakan untuk pengelompokan dan agregasi data.
  6. Object: Tipe data ini adalah penampung untuk data yang tidak masuk ke kategori lainnya. Ia dapat mencakup berbagai tipe data yang berbeda, seperti list, dictionary, dan objek lainnya.

pandas data typesSumber Gambar

Data yang tidak cocok dengan tipe data lain, termasuk string, tipe campuran, atau objek lain, direpresentasikan oleh tipe data category dan object di pandas. Namun, keduanya memiliki beberapa perbedaan penting yang memengaruhi cara kerja dan kinerjanya.

Tipe Data Categorical

Tipe data kategorikal dibuat untuk informasi yang hanya memiliki beberapa nilai yang mungkin, seperti kategori atau label. Secara internal, data kategorikal direpresentasikan sebagai kumpulan angka, yang dapat mempercepat beberapa operasi dan menghemat memori dibandingkan dengan tipe data object yang setara. Selain itu, data kategorikal dapat diurutkan secara logis dan memfasilitasi prosedur pengelompokan dan agregasi yang efisien.

Tipe Data Object

Di sisi lain, tipe data object berfungsi sebagai penampung untuk informasi yang tidak cocok dengan tipe data lainnya. Ia dapat mencakup banyak jenis data yang berbeda, seperti list, dictionary, dan objek lainnya. Meskipun data object sangat fleksibel, tipe ini juga bisa lebih lambat dan mengonsumsi lebih banyak memori daripada data kategorikal dengan ukuran yang sama serta tidak dapat dikenai beberapa operasi khusus yang dimungkinkan dengan data kategori.

Secara umum, Anda mungkin ingin mempertimbangkan untuk menggunakan tipe data kategorikal jika data Anda memiliki sejumlah kecil nilai yang mungkin dan Anda berencana melakukan banyak pengelompokan atau agregasi. Tipe data object biasanya merupakan opsi yang aman dalam kasus lainnya. Namun, tipe data yang ideal pada akhirnya bergantung pada kasus penggunaan unik Anda dan karakteristik data Anda.

Mari lihat contoh dengan membaca file csv dari GitHub.

# read csv using pandas
data = pd.read_csv(‘https://raw.githubusercontent.com/pycaret/pycaret/master/datasets/diamond.csv’)

# check the head of dataframe
data.head()

Keluaran:

CSV output from Github

Dapatkah Anda mengidentifikasi kolom mana yang kategorikal vs. numerik? Nah, semua kolom dalam contoh ini adalah kategorikal kecuali `Carat Weight` dan `Price.` Mari kita lihat apakah kita benar dengan memeriksa tipe data default.

# check the data types
data.dtypes

Keluaran:

Check data types

Perhatikan bagaimana `Price` ditetapkan bertipe `int64`, `Carat Weight` sebagai `float64`, dan kolom lainnya bertipe object, persis seperti yang kita harapkan.

Menganalisis Fitur Kategorikal di Python

Ada beberapa fungsi di pandas, pustaka analisis data populer di Python, yang memungkinkan Anda dengan cepat menganalisis tipe data kategorikal dalam dataset Anda. Mari kita bahas satu per satu:

Value Counts

`value_counts()` adalah fungsi di pustaka pandas yang mengembalikan frekuensi setiap nilai unik dalam kolom data kategorikal. Fungsi ini berguna ketika Anda ingin dengan cepat memahami distribusi suatu variabel kategorikal, seperti kategori paling umum dan frekuensinya.

# read csv using pandas
import pandas as pd
data = pd.read_csv('https://raw.githubusercontent.com/pycaret/pycaret/master/datasets/diamond.csv')

# check value counts of Cut column
data['Cut'].value_counts()

Keluaran:

value_counts()

Jika Anda ingin memvisualisasikan distribusi, Anda dapat menggunakan pustaka `plotly` untuk menggambar diagram batang interaktif.

import plotly.express as px
cut_counts = data['Cut'].value_counts()
fig = px.bar(x=cut_counts.index, y=cut_counts.values)
fig.show()

Keluaran:

Group by

`groupby()` adalah fungsi di Pandas yang memungkinkan Anda mengelompokkan data berdasarkan satu atau lebih kolom dan menerapkan fungsi agregasi seperti jumlah, rata-rata, dan hitung. Fungsi ini berguna ketika Anda ingin melakukan analisis yang lebih kompleks pada data kategorikal, seperti menghitung rata-rata variabel numerik untuk setiap kategori. Mari kita lihat contohnya:

# read csv using pandas
import pandas as pd
data = pd.read_csv('https://raw.githubusercontent.com/pycaret/pycaret/master/datasets/diamond.csv')

# average carat weight and price by Cut
data.groupby(by = 'Cut').mean()

Keluaran:

Groupby output

Ini hanya akan mengembalikan data frame dengan kolom numerik saja. Parameter `by` di dalam metode `groupby` mendefinisikan kolom yang ingin Anda gunakan untuk operasi pengelompokan, dan kemudian `mean()` di luar tanda kurung adalah metode agregasinya.

Keluaran tersebut dapat diinterpretasikan sebagai rata-rata harga berlian dengan potongan fair adalah 5.886, dan rata-rata beratnya 1,05 dibandingkan dengan rata-rata harga 11.485 untuk berlian dengan potongan Very Good. 

Cross tab

`crosstab()` adalah fungsi di pandas yang membuat tabel silang (cross-tabulation), yang menunjukkan distribusi frekuensi dari dua atau lebih variabel kategorikal. Fungsi ini berguna ketika Anda ingin melihat hubungan antara dua atau lebih variabel kategorikal, seperti bagaimana frekuensi satu variabel terkait dengan variabel lainnya.

# read csv using pandas
import pandas as pd
data = pd.read_csv('https://raw.githubusercontent.com/pycaret/pycaret/master/datasets/diamond.csv')

# cross tab of Cut and Color
pd.crosstab(index=data['Cut'], columns=data['Color'])

Keluaran:

Crosstab output

Keluaran dari fungsi crosstab di pandas adalah tabel yang menunjukkan distribusi frekuensi dari dua atau lebih variabel kategorikal. Setiap baris dalam tabel merepresentasikan kategori unik pada salah satu variabel, dan setiap kolom merepresentasikan kategori unik pada variabel lainnya. Entri dalam tabel adalah jumlah frekuensi dari kombinasi kategori pada kedua variabel tersebut.

Pivot Table

`pivot_table()` adalah fungsi di Pandas yang membuat pivot table, yang mirip dengan tabel silang tetapi lebih fleksibel. Fungsi ini berguna ketika Anda ingin menganalisis banyak variabel kategorikal dan hubungannya dengan satu atau lebih variabel numerik. Pivot table memungkinkan Anda mengagregasikan data dengan berbagai cara dan menampilkan hasilnya dalam bentuk yang ringkas.

# read csv using pandas
import pandas as pd
data = pd.read_csv('https://raw.githubusercontent.com/pycaret/pycaret/master/datasets/diamond.csv')

# create pivot table
pd.pivot_table(data, values='Price', index='Cut', columns='Color', aggfunc=np.mean)

Keluaran:

pivot table output

Tabel ini menunjukkan harga rata-rata setiap potongan berlian untuk setiap warna. Baris merepresentasikan potongan berlian yang berbeda, kolom merepresentasikan warna berlian yang berbeda, dan entri tabel merupakan harga rata-rata berlian.

Fungsi pivot_table berguna ketika Anda ingin meringkas dan membandingkan data numerik di berbagai variabel dalam format tabel. Fungsi ini memungkinkan Anda mengagregasikan data menggunakan berbagai fungsi (seperti mean, sum, count, dll.) dan menyusunnya ke dalam format yang mudah dibaca dan dianalisis.

Mengodekan Fitur Kategorikal di Python

Data kategorikal umumnya tidak dapat langsung ditangani oleh algoritma machine learning, karena sebagian besar algoritma dirancang untuk beroperasi hanya dengan data numerik. Oleh karena itu, sebelum fitur kategorikal dapat digunakan sebagai masukan ke algoritma machine learning, fitur tersebut harus dikodekan sebagai nilai numerik.

Ada beberapa teknik untuk mengodekan fitur kategorikal, termasuk one-hot encoding, ordinal encoding, dan target encoding. Pemilihan teknik encoding bergantung pada karakteristik spesifik data dan persyaratan algoritma machine learning yang digunakan.

One-hot encoding

One-hot encoding adalah proses merepresentasikan data kategorikal sebagai sekumpulan nilai biner, di mana setiap kategori dipetakan ke nilai biner yang unik. Dalam representasi ini, hanya satu bit yang bernilai 1, dan sisanya bernilai 0, karenanya disebut "one hot." Ini umum digunakan dalam machine learning untuk mengonversi data kategorikal ke format yang dapat diproses algoritma.

one-hot encoding

Sumber Gambar

pandas kategorikal ke numerik

Salah satu cara mencapainya di pandas adalah menggunakan metode `pd.get_dummies()`. Ini adalah fungsi di pustaka Pandas yang dapat digunakan untuk melakukan one-hot encoding pada variabel kategorikal dalam DataFrame. Fungsi ini menerima DataFrame dan mengembalikan DataFrame baru dengan kolom biner untuk setiap kategori. Berikut contoh cara menggunakannya:

Misalkan kita memiliki data frame dengan kolom "fruit" yang berisi data kategorikal:

import pandas as pd

# generate df with 1 col and 4 rows
data = {
    "fruit": ["apple", "banana", "orange", "apple"]
}

# show head
df = pd.DataFrame(data)
df.head()

Keluaran:

pandas fruit data

# apply get_dummies function
df_encoded = pd.get_dummies(df["fruit"])
df_encoded .head()

Keluaran:

apply dummies fruit data

Walaupun `pandas.get_dummies` mudah digunakan, pendekatan yang lebih umum adalah menggunakan `OneHotEncoder` dari pustaka sklearn, terutama saat Anda mengerjakan tugas machine learning. Perbedaan utamanya adalah `pandas.get_dummies` tidak dapat mempelajari encoding; fungsi ini hanya dapat melakukan one-hot-encoding pada dataset yang Anda berikan sebagai input. Di sisi lain, `sklearn.OneHotEncoder` adalah sebuah kelas yang dapat disimpan dan digunakan untuk mentransformasi dataset lain yang masuk di masa depan.

import pandas as pd

# generate df with 1 col and 4 rows
data = {
    "fruit": ["apple", "banana", "orange", "apple"]
}

# one-hot-encode using sklearn
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
encoded_results = encoder.fit_transform(df).toarray()

Keluaran:

array

Label encoding

Label encoding adalah teknik untuk mengodekan variabel kategorikal sebagai nilai numerik, dengan setiap kategori diberi bilangan bulat yang unik. Misalnya, misalkan kita memiliki variabel kategorikal "color" dengan tiga kategori: "red," "green," dan "blue." Kita dapat mengodekan kategori ini menggunakan label encoding sebagai berikut (red: 0, green: 1, blue: 2).

Label encoding dapat berguna untuk beberapa algoritma machine learning yang memerlukan masukan numerik, karena memungkinkan data kategorikal direpresentasikan dengan cara yang dapat dipahami algoritma. Namun, penting untuk diingat bahwa label encoding memperkenalkan pengurutan kategori yang sewenang-wenang, yang mungkin tidak mencerminkan hubungan yang bermakna di antara kategori tersebut. Dalam beberapa kasus, hal ini dapat menimbulkan masalah dalam analisis, terutama jika pengurutan tersebut ditafsirkan memiliki semacam hubungan ordinal.

label encoding data

Data dengan Label Encoding. Sumber Gambar

Perbandingan One-hot dan Label Encoding

One-hot encoding dan label encoding sama-sama teknik untuk mengodekan variabel kategorikal sebagai nilai numerik, tetapi keduanya memiliki karakteristik yang berbeda dan cocok untuk kasus penggunaan yang berbeda.

One-hot encoding merepresentasikan setiap kategori sebagai kolom biner, dengan 1 menunjukkan keberadaan kategori dan 0 menunjukkan ketidakhadirannya. Misalnya, misalkan kita memiliki variabel kategorikal "color" dengan tiga kategori: "red," "green," dan "blue." One-hot encoding akan merepresentasikan variabel ini sebagai tiga kolom biner:

colors table

One-hot encoding cocok ketika kategori tidak memiliki pengurutan atau hubungan intrinsik satu sama lain. Ini karena one-hot encoding memperlakukan setiap kategori sebagai entitas terpisah tanpa hubungan dengan kategori lainnya. One-hot encoding juga berguna ketika jumlah kategori relatif kecil, karena jumlah kolom dapat menjadi tidak praktis jika kategori sangat banyak.

Label encoding, di sisi lain, merepresentasikan setiap kategori sebagai bilangan bulat yang unik. Misalnya, variabel "color" dengan tiga kategori dapat diberi label encoding sebagai:

color and color code

Label encoding cocok ketika kategori memiliki pengurutan atau hubungan alami satu sama lain, seperti pada variabel ordinal seperti "small," "medium," dan "large." Dalam kasus ini, nilai bilangan bulat yang diberikan ke kategori harus mencerminkan urutan kategori. Label encoding juga dapat berguna ketika jumlah kategori sangat besar, karena mengurangi dimensi data.

Secara umum, one-hot encoding lebih sering digunakan dalam aplikasi machine learning, karena lebih fleksibel dan menghindari masalah ambiguitas serta pengurutan sewenang-wenang yang dapat muncul pada label encoding. Namun, label encoding dapat berguna dalam konteks tertentu ketika kategori memiliki pengurutan alami atau saat menangani jumlah kategori yang sangat besar.

Menangani Data Kategorikal dengan Kardinalitas Tinggi

Kardinalitas tinggi mengacu pada banyaknya kategori unik dalam sebuah fitur kategorikal. Menangani kardinalitas tinggi adalah tantangan umum dalam mengodekan data kategorikal untuk model machine learning. Kardinalitas tinggi dapat menyebabkan representasi data yang jarang (sparse) dan berdampak negatif pada kinerja beberapa model machine learning. Berikut beberapa teknik yang dapat digunakan untuk menangani kardinalitas tinggi pada fitur kategorikal:

Menggabungkan Kategori Langka

Ini melibatkan penggabungan kategori yang jarang muncul ke dalam satu kategori. Ini mengurangi jumlah kategori unik dan juga mengurangi sparsitas dalam representasi data.

Target Encoding

Target encoding menggantikan nilai kategorikal dengan nilai rata-rata target untuk kategori tersebut. Ini memberikan representasi yang lebih kontinu dari data kategorikal dan dapat membantu menangkap hubungan antara fitur kategorikal dan variabel target.

target encoding

Sumber Gambar

Weight of Evidence (WOE) Encoding

Weight of Evidence encoding mirip dengan target encoding, tetapi memperhitungkan distribusi variabel target untuk setiap kategori. WOE suatu kategori dihitung sebagai logaritma dari rasio rata-rata target untuk kategori tersebut terhadap rata-rata untuk seluruh populasi.

Rekayasa Fitur untuk Data Kategorikal

Rekayasa fitur adalah langkah penting dalam menyiapkan data untuk model machine learning. Ini melibatkan pembuatan fitur baru dari fitur yang sudah ada untuk meningkatkan kinerja model. Berikut beberapa cara Anda dapat melakukan rekayasa fitur pada data kategorikal:

Membuat variabel interaksi

Variabel interaksi adalah fitur baru yang dibuat dengan menggabungkan dua atau lebih fitur yang ada. Misalnya, jika kita memiliki dua fitur kategorikal, 'Gender' dan 'Marital Status,' kita dapat membuat fitur baru, 'Gender-Marital Status,' untuk menangkap interaksi antara kedua fitur tersebut. Ini dapat membantu menangkap hubungan nonlinier antara fitur dan variabel target.

interaction effect

Melakukan binning pada variabel numerik

Binning adalah proses membagi variabel numerik kontinu menjadi bin diskret. Ini dapat membantu mengurangi jumlah nilai unik pada fitur, yang dapat bermanfaat untuk mengodekan data kategorikal. Binning juga dapat membantu menangkap hubungan nonlinier antara fitur dan variabel target.

binning effect

Mengodekan variabel siklik

Variabel siklik adalah variabel yang berulang dalam periode tertentu. Misalnya, jam dalam sehari adalah variabel siklik karena berulang setiap 24 jam. Mengodekan variabel siklik dapat membantu menangkap pola periodik dalam data. Salah satu pendekatan umum untuk mengodekan variabel siklik adalah membuat dua fitur baru, satu merepresentasikan sinus dari variabel dan yang lainnya merepresentasikan cosinus dari variabel.

Kesimpulan

Menangani data kategorikal adalah aspek penting dari banyak proyek machine learning. Dalam tutorial ini, kami telah mengeksplorasi berbagai teknik untuk menganalisis dan mengodekan variabel kategorikal di Python, termasuk one-hot encoding dan label encoding, yang merupakan dua teknik yang umum digunakan.

Kami memulai dengan memperkenalkan konsep data kategorikal dan mengapa penting untuk menanganinya dengan benar dalam model machine learning. Kami kemudian memberikan panduan langkah demi langkah tentang cara melakukan one-hot encoding menggunakan pandas dan scikit-learn, beserta contoh kode untuk mengilustrasikan prosesnya.

Tutorial ini juga membahas beberapa konsep lanjutan seperti menangani data kategorikal dengan kardinalitas tinggi, rekayasa fitur, WOE encoding, dan lainnya. Jika Anda ingin menyelami topik ini lebih dalam, lihat kursus kami, Working with Categorical Data in Python. 

Jika Anda lebih menyukai bahasa R, Anda mungkin tertarik dengan kursus kami, Categorical Data in the Tidyverse atau Inference for Categorical Data in R. Keduanya adalah kursus yang sangat baik untuk pengguna R.

Topik
Machine Learning
Python

Pelajari lebih lanjut tentang Python

Kursus

Membersihkan Data di Python

4 jam
162.2K
Pelajari cara mendiagnosis dan menangani data kotor serta kembangkan keterampilan yang dibutuhkan untuk mengubah data mentah Anda menjadi wawasan yang akurat!
Lihat DetailRight Arrow
Mulai Kursus
Lihat SelengkapnyaRight Arrow
Terkait

blogs

Tutorial Korelasi di R

Dapatkan pengenalan dasar-dasar korelasi di R: pelajari lebih lanjut tentang koefisien korelasi, matriks korelasi, plotting korelasi, dan sebagainya.
David Woods's photo

David Woods

13 mnt

blogs

Spaghetti Plot dan Jalur Badai

Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Hugo Bowne-Anderson's photo

Hugo Bowne-Anderson

13 mnt

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Dario Radečić's photo

Dario Radečić

15 mnt

blogs

12 Alternatif ChatGPT Terbaik yang Bisa Anda Coba pada 2026

Artikel ini menyajikan daftar alternatif ChatGPT yang akan meningkatkan produktivitas Anda.
Javier Canales Luna's photo

Javier Canales Luna

14 mnt

Lihat SelengkapnyaLihat Selengkapnya