Kali ini, setelah melakukan eksperimen kecil ulang, akan dilakukan analisis terhadap hasil eksperimen untuk menentukan metode dan distance metric mana yang paling baik. Sebelumnya, hanya digunakan distance metric cityblock dan euclidean, sedangkan sekarang ada tambahan 2 metric lagi: cosine dan correlation. Tentang correlation dapat dilihat di sini.

Pertama-tama, load tools yang dibutuhkan.


In [1]:
import numpy as np
import pandas as pd
%matplotlib inline

Selanjutnya, load hasil eksperimen dan tampilkan hasilnya.


In [2]:
df = pd.read_hdf('../reports/small-exp-combined.h5', 'df')

In [3]:
df


Out[3]:
num_norm 30
num_oot 3
num_top 3
result base perf
k 0 1 2 3 0 1 2 3
method feature metric norm_dir oot_dir
clust_dist unigram euclidean bbs152930 mov973 0.744135 0.239186 0.016496 0.000183 0.833333 0.166667 0.000000 0.000000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.700000 0.300000 0.000000 0.000000
mus10142 0.744135 0.239186 0.016496 0.000183 0.900000 0.100000 0.000000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.533333 0.433333 0.033333 0.000000
rel159410 0.744135 0.239186 0.016496 0.000183 0.133333 0.433333 0.433333 0.000000
phy17301 mov973 0.744135 0.239186 0.016496 0.000183 1.000000 0.000000 0.000000 0.000000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.933333 0.066667 0.000000 0.000000
mus10142 0.744135 0.239186 0.016496 0.000183 1.000000 0.000000 0.000000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.833333 0.166667 0.000000 0.000000
rel159410 0.744135 0.239186 0.016496 0.000183 0.433333 0.533333 0.033333 0.000000
rel37898 mov973 0.744135 0.239186 0.016496 0.000183 0.933333 0.066667 0.000000 0.000000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.700000 0.300000 0.000000 0.000000
mus10142 0.744135 0.239186 0.016496 0.000183 1.000000 0.000000 0.000000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.500000 0.433333 0.066667 0.000000
rel159410 0.744135 0.239186 0.016496 0.000183 0.333333 0.400000 0.233333 0.033333
mov9811 mov973 0.744135 0.239186 0.016496 0.000183 0.966667 0.033333 0.000000 0.000000
bbs57549 0.744135 0.239186 0.016496 0.000183 1.000000 0.000000 0.000000 0.000000
mus10142 0.744135 0.239186 0.016496 0.000183 1.000000 0.000000 0.000000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.800000 0.166667 0.033333 0.000000
rel159410 0.744135 0.239186 0.016496 0.000183 0.400000 0.500000 0.100000 0.000000
mus1139 mov973 0.744135 0.239186 0.016496 0.000183 0.833333 0.166667 0.000000 0.000000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.700000 0.266667 0.033333 0.000000
mus10142 0.744135 0.239186 0.016496 0.000183 1.000000 0.000000 0.000000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.300000 0.600000 0.100000 0.000000
rel159410 0.744135 0.239186 0.016496 0.000183 0.366667 0.333333 0.266667 0.033333
cityblock bbs152930 mov973 0.744135 0.239186 0.016496 0.000183 0.633333 0.366667 0.000000 0.000000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.600000 0.400000 0.000000 0.000000
mus10142 0.744135 0.239186 0.016496 0.000183 0.766667 0.233333 0.000000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.433333 0.533333 0.000000 0.033333
rel159410 0.744135 0.239186 0.016496 0.000183 0.033333 0.366667 0.466667 0.133333
... ... ... ... ... ... ... ... ... ... ... ... ...
txt_comp_dist unigram cosine mus1139 mov973 0.744135 0.239186 0.016496 0.000183 0.000000 0.466667 0.433333 0.100000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.000000 0.333333 0.466667 0.200000
mus10142 0.744135 0.239186 0.016496 0.000183 0.300000 0.566667 0.133333 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.066667 0.333333 0.366667 0.233333
rel159410 0.744135 0.239186 0.016496 0.000183 0.333333 0.566667 0.100000 0.000000
correlation bbs152930 mov973 0.744135 0.239186 0.016496 0.000183 0.000000 0.133333 0.666667 0.200000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.000000 0.366667 0.500000 0.133333
mus10142 0.744135 0.239186 0.016496 0.000183 0.033333 0.833333 0.133333 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.000000 0.300000 0.500000 0.200000
rel159410 0.744135 0.239186 0.016496 0.000183 0.000000 0.066667 0.466667 0.466667
phy17301 mov973 0.744135 0.239186 0.016496 0.000183 0.000000 0.033333 0.933333 0.033333
bbs57549 0.744135 0.239186 0.016496 0.000183 0.000000 0.066667 0.866667 0.066667
mus10142 0.744135 0.239186 0.016496 0.000183 0.000000 0.600000 0.400000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.000000 0.600000 0.400000 0.000000
rel159410 0.744135 0.239186 0.016496 0.000183 0.000000 0.200000 0.800000 0.000000
rel37898 mov973 0.744135 0.239186 0.016496 0.000183 0.066667 0.900000 0.033333 0.000000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.033333 0.966667 0.000000 0.000000
mus10142 0.744135 0.239186 0.016496 0.000183 0.633333 0.366667 0.000000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.266667 0.700000 0.033333 0.000000
rel159410 0.744135 0.239186 0.016496 0.000183 0.533333 0.466667 0.000000 0.000000
mov9811 mov973 0.744135 0.239186 0.016496 0.000183 0.366667 0.433333 0.200000 0.000000
bbs57549 0.744135 0.239186 0.016496 0.000183 0.133333 0.600000 0.266667 0.000000
mus10142 0.744135 0.239186 0.016496 0.000183 0.933333 0.066667 0.000000 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.166667 0.466667 0.366667 0.000000
rel159410 0.744135 0.239186 0.016496 0.000183 0.500000 0.266667 0.233333 0.000000
mus1139 mov973 0.744135 0.239186 0.016496 0.000183 0.000000 0.200000 0.466667 0.333333
bbs57549 0.744135 0.239186 0.016496 0.000183 0.000000 0.133333 0.366667 0.500000
mus10142 0.744135 0.239186 0.016496 0.000183 0.233333 0.733333 0.033333 0.000000
phy40008 0.744135 0.239186 0.016496 0.000183 0.000000 0.300000 0.333333 0.366667
rel159410 0.744135 0.239186 0.016496 0.000183 0.033333 0.100000 0.533333 0.333333

300 rows × 8 columns

Rata-ratakan hasil terhadap seluruh setting eksperimen, kecuali metode, karena akan dilihat metode mana yang paling bagus.


In [4]:
df_agg = df.groupby(level='method').mean()

In [5]:
df_agg


Out[5]:
num_norm 30
num_oot 3
num_top 3
result base perf
k 0 1 2 3 0 1 2 3
method
clust_dist 0.744135 0.239186 0.016496 0.000183 0.508333 0.276667 0.167667 0.047333
mean_comp 0.744135 0.239186 0.016496 0.000183 0.458333 0.311000 0.180333 0.050333
txt_comp_dist 0.744135 0.239186 0.016496 0.000183 0.275667 0.395333 0.273667 0.055333

Selanjutnya, akan diplot grafik dari tabel di atas. Sebelumnya, buang baseline karena tidak dibutuhkan.


In [6]:
df_plot = df_agg.drop('base', axis=1, level='result')

In [7]:
df_plot


Out[7]:
num_norm 30
num_oot 3
num_top 3
result perf
k 0 1 2 3
method
clust_dist 0.508333 0.276667 0.167667 0.047333
mean_comp 0.458333 0.311000 0.180333 0.050333
txt_comp_dist 0.275667 0.395333 0.273667 0.055333

Lalu, plot grafik.


In [8]:
df_plot.T.plot(kind='bar', use_index=False, ylim=(0.,1.))


Out[8]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f5775b2f940>

Dari grafik di atas, sudah cukup terlihat bahwa metode txt_comp_dist cukup unggul dibanding kedua metode lainnya. Untuk memperjelas, akan dihitung expected value untuk masing-masing metode sehingga untuk membandingkan ketiga metode cukup dilihat metode mana yang expected value-nya paling besar.


In [9]:
df_tmp = df_plot * np.arange(4)

In [10]:
df_tmp


Out[10]:
num_norm 30
num_oot 3
num_top 3
result perf
k 0 1 2 3
method
clust_dist 0 0.276667 0.335333 0.142
mean_comp 0 0.311000 0.360667 0.151
txt_comp_dist 0 0.395333 0.547333 0.166

In [11]:
result = df_tmp.sum(axis=1, level='result')

In [12]:
result


Out[12]:
result perf
method
clust_dist 0.754000
mean_comp 0.822667
txt_comp_dist 1.108667

Dari tabel di atas, terlihat bahwa metode txt_comp_dist unggul dibanding metode lainnya.

Berikutnya, akan dicari distance metric apa yang paling baik. Tahapnya sama:

  1. Melakukan agregasi hasil
  2. Plot grafik hasil
  3. Hitung expected value dan bandingkan

In [13]:
df_agg = df.groupby(level='metric').mean()

In [14]:
df_agg


Out[14]:
num_norm 30
num_oot 3
num_top 3
result base perf
k 0 1 2 3 0 1 2 3
metric
cityblock 0.744135 0.239186 0.016496 0.000183 0.593778 0.288889 0.107111 0.010222
correlation 0.744135 0.239186 0.016496 0.000183 0.205778 0.361333 0.319556 0.113333
cosine 0.744135 0.239186 0.016496 0.000183 0.256889 0.392000 0.284000 0.067111
euclidean 0.744135 0.239186 0.016496 0.000183 0.600000 0.268444 0.118222 0.013333

In [15]:
df_plot = df_agg.drop('base', axis=1, level='result')

In [16]:
df_plot


Out[16]:
num_norm 30
num_oot 3
num_top 3
result perf
k 0 1 2 3
metric
cityblock 0.593778 0.288889 0.107111 0.010222
correlation 0.205778 0.361333 0.319556 0.113333
cosine 0.256889 0.392000 0.284000 0.067111
euclidean 0.600000 0.268444 0.118222 0.013333

In [17]:
df_plot.T.plot(kind='bar', use_index=False, ylim=(0.,1.))


Out[17]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f57719c6160>

Dari grafik di atas terlihat bahwa distance metric cosine dan correlation mengungguli kedua distance metric lainnya. Selanjutnya, akan dihitung expected value untuk masing-masing distance metric.


In [18]:
df_tmp = df_plot * np.arange(4)

In [19]:
df_tmp


Out[19]:
num_norm 30
num_oot 3
num_top 3
result perf
k 0 1 2 3
metric
cityblock 0 0.288889 0.214222 0.030667
correlation 0 0.361333 0.639111 0.340000
cosine 0 0.392000 0.568000 0.201333
euclidean 0 0.268444 0.236444 0.040000

In [20]:
result = df_tmp.sum(axis=1, level='result')

In [21]:
result


Out[21]:
result perf
metric
cityblock 0.533778
correlation 1.340444
cosine 1.161333
euclidean 0.544889

Dari hasil ini, jelas bahwa distance metric correlation adalah yang terbaik.

Kesimpulan dari analisis ini adalah kita telah mendapatkan metode txt_comp_dist dan distance metric correlation adalah metode dan distance metric terunggul berturut-turut.