Data Binning Menggunakan Pandas

Stevanus Setiawan
4 min readJul 17, 2020

--

Photo by Nicolas COMTE on Unsplash

Istilah Data Binning memang istilah yang jarang didengar di percakapan sehari-hari, namun sebetulnya istilah itu tidaklah se-asing yang kita kira. Malah kita sering melakukannya secara natural.

Semisalnya, teman kalian mengatakan ke kalian bahwa dia punya seorang anak yang berusia 3 tahun, kemungkinan besar digambaran kalian, anak teman kalian adalah seorang anak-anak.

Atau misalnya lagi, harga nasi uduk di sebelah rumah kalian, yang awalnya 10 ribu Rupiah per bungkus jadi 100 ribu Rupiah per bungkus. Kemungkinan besar, kalian akan mengatakan bahwa harganya mahal.

Itulah Data binning, mengubah data numerik menjadi data kategorik. Yang dimana, di setiap kelompoknya punya kriteria tertentu, yang umumnya kriteria tersebut adalah suatu range-range kecil yang disebut bin. Hanya dengan mengetahui berapa usia seseorang, kita langsung tahu kira-kira dia ada di kelompok mana. Bayi? Balita? Remaja? Atau dewasa?

Photo by Ben White on Unsplash

Namun memang setiap orang punya referensi mereka masing-masing, kalau misalnya kita ambil lagi contoh harga nasi uduk di atas. Adanya orang-orang yang mengatakan 100 Ribu rupiah untuk satu bungkus nasi uduk tidaklah mahal. Itu kenapa, ada baiknya, saat kita mengelompokkan data, kita punya sebuah argumen atau setidaknya referensi-referensi yang dapat menjadi acuan kita.

.cut( )

Salah satu method Pandas yang akan membantu kita untuk melakukan Data Binning yaitu .cut( ). Semisalnya, saya buat data-data umur yang rangenya dari 0 tahun sampai 100 tahun, sebanyak 100 data secara acak. Dengan 101 sebagai bilangan generatornya.

import pandas as pd # pip install pandas
import numpy as np # pip install numpy
from numpy.random import seed, randint
seed(101)
age = pd.DataFrame({'age' : randint(0, 100, 100)})
Sebagai contoh, ini 10 data teratas dari data ‘age’ yang dibuat di atas

Dikutip dari https://www.sehatq.com/artikel/risiko-penyakit-berdasarkan-klasifikasi-umur-menurut-who, dimana website itu mengatakan, bahwa dia mengutip World Health Organization (WHO), bahwa:

  • Usia 0–1 tahun adalah kategori untuk bayi (infants)
  • Usia 2–10 tahun adalah kategori untuk Anak-anak (childrens)
  • Usia 11–19 tahun adalah kategori untuk Remaja (adolescents)
  • Usia 20–60 tahun adalah kategori untuk Dewasa (adult)
  • Di atas 60 tahun adalah kategori untuk Lanjut Usia (elderly)

Dan dari sini, sekarang kita punya range-range yang bisa menjadi acuan kita untuk mengelompokkan data-data kita di atas.

pd.cut(age['age'], [0, 2, 11, 20, 61, 101])
10 data teratas, hanya untuk sebagai gambaran

Hasil-hasilnya adalah sebuah bins, yang misalnya kalau saya ambil satu contoh yaitu (2, 11] artinya seseorang yang berumur 2 tahun sampai 10 tahun, akan masuk ke bin ini. Dan kita juga bisa menambahkan label-label misalnya, untuk (2, 11] adalah seorang anak-anak.

pd.cut(age['age'], [0, 2, 11, 20, 61, 101], 
labels = ['bayi', 'anak-anak', 'Remaja', 'Dewasa', 'Lanjut Usia'])
10 data teratas, hanya untuk sebagai gambaran

Dan kita juga bisa menvisualkannya menggunakan histogram.

Histogram

Histogram ditampilkan batangan-batangan dengan sumbu-y adalah frekuensi dan sumbu-x adalah range-range (atau bins) yang telah kita tentukan. Dan saya akan menggunakan bantuan Pandas dan Matplotlib untuk membuat histogram.

import matplotlib.pyplot as plt # pip install matplotlibage.plot(kind = 'hist', bins = [0, 2, 11, 20, 61, 101], figsize = (8, 5))
plt.grid()

Dari histogram, kita dapat melihat dari data acak kita di atas. Paling banyak ada di kategori Usia Lanjut berumur di atas 60 tahun.

Saran

Data binning memang teknik yang berguna, terutama saat kita melakukan eksplorasi data dan mencoba mencari insight dari data. Namun perlu diketahui, bahwa Data binning akan mengurangi informasi data yang kita punya secara individu.

Jadi sebaiknya, kita punya alasan yang kuat, kenapa kita melakukanya. Atau bisa juga dengan tidak menimpa kolom-nya, jadi buat kolom baru seperti di bawah:

age['range'] = pd.cut(age['age'], [0, 2, 11, 20, 61, 101])
age['group'] = pd.cut(age['age'], [0, 2, 11, 20, 61, 101],
labels = ['bayi', 'anak-anak', 'Remaja', 'Dewasa', 'Lanjut Usia'])

Jadi kita tidak kehilangan data atau informasi apapun.

Saya harap tulisan ini dapat membantu… Terimakasih telah membacanya sampai selesai…

--

--

Stevanus Setiawan

Pada Medium ini, saya menulis tentang Data Science, Machine Learning, Statistik, Filosofi, dan Penulisan.