Tugas 2 | Diskritisasi data#

Diskretisasi adalah proses mengganti kontinum dengan set poin yang terbatas. Dalam konteks komputasi digital, diskritisasi terjadi ketika sinyal waktu kontinu, seperti audio atau video, direduksi menjadi sinyal diskrit. Proses diskritisasi merupakan bagian integral dari konversi analog ke digital. Diskretisasi terkait dengan istilah kuantisasi.

  • Carilah data yang bertipe numerik ( data klassifikasi)

  • Lakukan proses diskritisasi dengan equal width dan equal frequency

  • Lakukan proses diskritisasi dengan basis entropy

  • Kumpulkan tugas dengan link github ( web statis dari jupyter book)

import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np
import math
data = pd.read_csv("https://gist.githubusercontent.com/netj/8836201/raw/6f9306ad21398ea43cba4f7d537619d0e07d5ae3/iris.csv")
data
sepal.length sepal.width petal.length petal.width variety
0 5.1 3.5 1.4 0.2 Setosa
1 4.9 3.0 1.4 0.2 Setosa
2 4.7 3.2 1.3 0.2 Setosa
3 4.6 3.1 1.5 0.2 Setosa
4 5.0 3.6 1.4 0.2 Setosa
... ... ... ... ... ...
145 6.7 3.0 5.2 2.3 Virginica
146 6.3 2.5 5.0 1.9 Virginica
147 6.5 3.0 5.2 2.0 Virginica
148 6.2 3.4 5.4 2.3 Virginica
149 5.9 3.0 5.1 1.8 Virginica

150 rows Γ— 5 columns

Setelah di Transformasi menjadi kategori#

Equal Width#

Equal width adalah algoritma untuk membagi rentang interval dengan ukuran lebar yang sama

Rumus Equal Width :

π“Œ = [\(\frac{max - min}{𝓍}\)]

  ket:
  π“Œ  = Width
  max = nilai maximum pada data
  min = nilai minimum pada data
  x   = jumlah kategori / bin 

Pada libary pandas python, dapat menggunakan .cut untuk mencari equal width

label = ['A','B','C']
data['category_sepal_length'] = pd.cut(data['sepal.length'], 3, labels=label)
data['category_sepal_width'] = pd.cut(data['sepal.width'], 3, labels=label)
data['category_petal_length'] = pd.cut(data['petal.length'], 3, labels=label)
data['category_petal_width'] = pd.cut(data['petal.width'], 3, labels=label)
data[['category_sepal_length','category_sepal_width','category_petal_length','category_petal_width','variety']]
category_sepal_length category_sepal_width category_petal_length category_petal_width variety
0 A B A A Setosa
1 A B A A Setosa
2 A B A A Setosa
3 A B A A Setosa
4 A B A A Setosa
... ... ... ... ... ...
145 B B C C Virginica
146 B A C C Virginica
147 B B C C Virginica
148 B B C C Virginica
149 B B C C Virginica

150 rows Γ— 5 columns

Equal Frequency#

Equal frekuensi adalah algoritma untuk membagi rentang menjadi rentang-rentang yang berisi nilai data yang kurang lebih nilainya sama.

Rumus Equal Frequency :

𝓕req = \(\frac{n}{𝓍}\)

  ket:
  𝓕req = frekuensi
  𝓍    = jumlah kategori / bin
  n    = jumlah data pada list / count

Pada libary pandas python, dapat menggunakan .qcut untuk mencari equal width

label = ['A','B','C']
data['category_sepal_length'] = pd.qcut(data['sepal.length'], 3, labels=label)
data['category_sepal_width'] = pd.qcut(data['sepal.width'], 3, labels=label)
data['category_petal_length'] = pd.qcut(data['petal.length'], 3, labels=label)
data['category_petal_width'] = pd.qcut(data['petal.width'], 3, labels=label)
data[['category_sepal_length','category_sepal_width','category_petal_length','category_petal_width','variety']]
category_sepal_length category_sepal_width category_petal_length category_petal_width variety
0 A C A A Setosa
1 A B A A Setosa
2 A B A A Setosa
3 A B A A Setosa
4 A C A A Setosa
... ... ... ... ... ...
145 C B C C Virginica
146 B A C C Virginica
147 C B C C Virginica
148 B C C C Virginica
149 B B C C Virginica

150 rows Γ— 5 columns

Entropy#

Melakukan proses diskritasi dengan data petal.length.

panjang_petal = data[['petal.length','category_petal_length']]
panjang_petal
petal.length category_petal_length
0 1.4 A
1 1.4 A
2 1.3 A
3 1.5 A
4 1.4 A
... ... ...
145 5.2 C
146 5.0 C
147 5.2 C
148 5.4 C
149 5.1 C

150 rows Γ— 2 columns

Fungsi - Fungsi Untuk Proses Entropy#

Menghitung Data kategori

def keseluruhan(data, labels, kolom, kategori):
  data_keseluruhan = []
  group = data.groupby(kategori).count()
  for i in labels:
    data_keseluruhan.append(group.loc[i,kolom])
  return data_keseluruhan

Menghitung Split terhadap data diatas

def split(titik, data, labels, kolom, kategori):
  grupa = data[data[kolom] < titik]
  grupb = data[data[kolom] >= titik]
  panjanggrupa = keseluruhan(grupa, labels, kolom, kategori)
  panjanggrupb = keseluruhan(grupb, labels, kolom, kategori)
  return (panjanggrupa, panjanggrupb)

Menghitung Data \((D_1 /D_2)\)

Rumus Entropy :

Entropy\((D_1) = - βˆ‘_{i=1}^{m}p_i log_2 p_i\)

  ket :
  D  = himpunan kasu
  m  = jumlah partisi D
  pi = proporsi dari Di terhadap D
def entropy(data):
  data_entropy = []
  for i in data:
    if i/sum(data) != 0:
      data_entropy.append(-(i/sum(data))*math.log2(i/sum(data)))
    else:
      data_entropy.append(0)
  return (sum(data_entropy))

\(info_a\)#

fungsi untuk menghitung \(info_a\)#

Rumus :

\(info_a = \frac{|D_1|}{|D|} Entropy(D_1) + \frac{|D_2|}{|D|} Entropy(D_2)\)

  ket:
  D1/D2      = jumlah data
  D          = jumlah keseluruhan data
  Entropy(D) = hasil entropy data 
def info(hasil_split, data):
  infoa = []
  for i in hasil_split:
    angka = (sum(i)/data.shape[0])*entropy(i)
    infoa.append(angka)
  return sum(infoa)

Gain \((D_{new)}\)#

Fungsi menghitung Gain \((D_{new)}\)#

Rumus Gain\((D_1)\) :

\(Gain(E_{new}) = E_{initial} - E_{new}\)

  ket:
  Gain     = gain
  Einitial = jumlah_data_width
  Enew     = infoa
def gain(Einisial,Enew):
  return Einisial - Enew

Penerapan Fungsi - Fungsi terhadap data iris#

keseluruhan_data = keseluruhan(panjang_petal,label,'petal.length','category_petal_length')
keseluruhan_data
[50, 54, 46]

menghitung entropy keseluruhan

entropy_1 = entropy(keseluruhan_data)
entropy_1
1.58188145993464

Mencari Split 1 :4.4#

split_1 = split(4.4,panjang_petal,label,'petal.length','category_petal_length')
split_1
([50, 25, 0], [0, 29, 46])

menghitung infoa untuk split 1 :4.4

infoa_1 = info(split_1,panjang_petal)
infoa_1
0.9404552700263706

menghitung gain untuk split 1 :4.4

gain_1 = gain(entropy_1,infoa_1)
gain_1
0.6414261899082694

Mencari Split 2 : 5.5#

menghitung split 2 : 5.5

split_2 = split(5.5,panjang_petal,label,'petal.length','category_petal_length')
split_2
([50, 54, 18], [0, 0, 28])

menghitung info a pada split 2 : 5.5

infoa_2 = info(split_2,panjang_petal)
infoa_2
1.183563803674313

menghitung gain pada split 2 : 5.5

gain_2 = gain(entropy_1,infoa_2)
gain_2
0.398317656260327

Mencari Split 3 : 6.6#

menghitung split 3 : 6.6

split_3 = split(6.6,panjang_petal,label,'petal.length','category_petal_length')
split_3
([50, 54, 42], [0, 0, 4])

menghitung info a pada split 3 : 6.6

infoa_3 = info(split_3,panjang_petal)
infoa_3
1.535202128228074

menghitung gain pada split 3 : 6.6

gain_3 = gain(entropy_1,infoa_3)
gain_3
0.04667933170656613

Kesimpulan#

Semakin kecil nilai Gain terhadap nilai Einisial dan Enew, semakin baik akurasinya, maka split yang terbaik adalah 6.6 karena yang paling rendah