Tugas 2 | Diskritisasi data
Contents
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