হায়ারার্কিক্যাল ক্লাস্টারিং

ক্লাস্টারিং এর আরেকটি জনপ্রিয় পদ্ধতি হচ্ছে হায়ারার্কিক্যাল ক্লাস্টারিং। এর আগে আমরা কে-মিনস ক্লাস্টারিং এ দেখেছি ক্লাস্টারের সংখ্যা কয়টি হবে সেটি বলে দেয়া লাগে। হায়ারার্কিক্যাল ক্লাস্টারিং-এ সেটার প্রয়োজন হয় না। হায়ারার্কিক্যাল ক্লাস্টারিং বলতে আমাদের চোখের সামনে যা ভেসে আসে সেটা হচ্ছে কিছু লম্বা লম্বা লাইন নিজেদের মধ্যে গ্রুপ তৈরি করছে। হায়ারার্কিক্যাল ক্লাস্টারিং-এ এধরনের গ্রাফকে বলা হয় ডেন্ড্রোগ্রাম। এই ডেন্ড্রোগ্রাম আসলে কি সেটা আমরা একটু পরেই জানবো।
ছবি - হায়ারার্কিক্যাল ক্লাস্টারিং ( সম্পাদিত )
হায়ারার্কিক্যাল ক্লাস্টারিং দুই ধরনের হয়ে থাকে,
  • ডিভাইসিভ- এই পদ্ধতিতে সম্পূর্ণ ডেটাসেটকে একটি অভিন্ন ক্লাস্টার ধরা হয়। এরপর সেই ক্লাস্টারটিকে ক্রমাগত ভাঙা হয় যতক্ষন পর্যন্ত প্রতিটি ডেটা পয়েন্ট আলাদা আলাদা ক্লাস্টারে পরিনত না হয়। উদাহরন হিসাবে বলা যেতে পারে উপরের ছবির সব গাড়িকে প্রাথমিক ভাবে একটি ক্লাস্টার হিসাবে গণ্য করা হয়, এরপর সেই ক্লাস্টারকে ক্রমাগত পৃথক করা হতে থাকে যতক্ষন না পর্যন্ত প্রতিটি গাড়ি ( ডেটা পয়েন্ট ) আলাদা আলাদা ভাবে না পাওয়া যায়। এই পদ্ধতিকে টপ-ডাউন পদ্ধতিও বলা হয়।
  • অ্যাগলোম্যারেটিভ- অ্যাগলোম্যারেটিভ হচ্ছে ডিভাইসিভের ঠিক উল্টো পদ্ধতি , এটাকে বটম-আপ পদ্ধতিও বলা হয়। এই পদ্ধতিতে প্রতিটি ডেটা পয়েন্টকে শুরুতে আলাদা আলাদা ক্লাস্টার হিসাবে ধরা হয়। এরপর এই ক্লাস্টার গুলোর ডিসট্যান্স এর ভিত্তিতে এদেরকে নিয়ে ছোট ছোট ক্লাস্টার গঠন করা হয়, এভাবে এই ছোট ক্লাস্টার গুলো আবার বড় ক্লাস্টার গঠন করতে থাকে। উপরের ছবি অনুযায়ী প্রতিটি গাড়িকে আলাদা আলাদা ডেটা পয়েন্ট মনে করলে একই ধরনের গাড়ির মাধ্যমে দুটি ক্লাস্টার গঠিত হয় ( সিডান এবং এসইউভি ) । এই ক্লাস্টারদ্বয় আবার একটি বড় ক্লাস্টার গঠন করে।
অ্যাগলোম্যারেটিভ ক্লাস্টারিং বেশ কয়েক ভাবে করা যেতে পারে,
  • কমপ্লিট ডিস্ট্যান্স - ডেটা পয়েন্ট গুলোর ভেতর ম্যাক্সিমাম বা দীর্ঘতম দূরত্বের ভিত্তিতে ক্লাস্টার গঠন করা হয়।
  • সিঙ্গেল ডিস্ট্যান্স - ডেটা পয়েন্ট গুলোর ভেতর মিনিমান বা সংক্ষিপ্ত তম দূরত্বের ভিত্তিতে ক্লাস্টার গঠন করা হয়।
  • এভারেজ ডিস্ট্যান্স -ডেটা পয়েন্ট গুলোর ভেতর মিনিমান বা সংক্ষিপ্ত তম দূরত্বের ভিত্তিতে ক্লাস্টার গঠন করা হয়।
  • সেন্ট্রয়েড ডিস্ট্যান্স - ক্লাস্টার সেন্টার গুলো বা সেন্ট্রয়েডের দূরত্বের উপর ভিত্তি করে ক্লাস্টার গঠন করা হয়।
  • ওয়ার্ড মেথড- বিভিন্ন ক্লাস্টারের ভেতরের মিনিমাম ভ্যারিয়্যান্স এর উপর ভিত্তি করে ক্লাস্টার গ্রুপ গঠন করা হয়।
দূরত্ব যেভাবে হিসাব করা হয়
বেশিরভাগ ক্ষেত্রেই ইউক্লিডিয়ান ডিস্ট্যান্স এর মাধ্যমে ক্লাস্টার গুলোর জন্য দূরত্ব নির্ণয় করা হয়। ইউক্লিডিয়ান ডিস্ট্যান্স কিভাবে কাজ করে সেবিষয়ে ইতোপূর্বে আলোচনা করা হয়েছে। তবে কোসাইন ডিস্ট্যান্স , ম্যানহ্যাটেইন, মিনকোউস্কি ইত্যাদি পদ্ধতিতেও ডিস্ট্যান্স নির্ণয় করা যায়।
হায়ারার্কিক্যাল ক্লাস্টারিং এর কিছু বৈশিষ্ট্য
  • কে মিনস এর মত ক্লাস্টারের সংখ্যা ডিফাইন করে দেয়ার দরকার হয় না।
  • হায়ারার্কিক্যাল ক্লাস্টারিং এর মাধ্যমে যে ডেন্ড্রোগ্রাম ভিজুয়ালাইজ করা যায় তার মাধ্যমে সহজেই ক্লাস্টার সম্পর্কে ধারনা পাওয়া যায়।
  • কে-মিনস এর তুলনায় কিছুটা ধীর গতির।
  • ডেটাসেট বড় হলে ডেন্ড্রোগ্রাম দেখে ক্লাস্টারের সংখ্যা নির্ণয় বেশ কষ্টসাধ্য।
হায়ারার্কিক্যাল ক্লাস্টারিং এর কিছু বাস্তব প্রয়োগ
  • ডিএনএ সিকোয়েন্স এর উপর ভিত্তিতে প্রানি এবং উদ্ভিদের শ্রেনিবদ্ধ করন।
  • বিভিন্ন ভাইরাস জনিত মহামারী
কাস্টমারদের হায়ারার্কিক্যাল ক্লাস্টারিং
হায়ারার্কিক্যাল ক্লাস্টারিং বোঝার জন্য আমরা পর্তুগালের একটি ডেটাসেট ব্যবহার করবো। এই ডেটাসেটে একটি হোলসেল কোম্পানির বিভিন্ন পণ্য বিক্রয়ের ডেটা রয়েছে ।
  • FRESH: annual spending (m.u.) on fresh products (Continuous)
  • MILK: annual spending (m.u.) on milk products (Continuous)
  • GROCERY: annual spending (m.u.) on grocery products (Continuous)
  • FROZEN: annual spending (m.u.) on frozen products (Continuous)
  • DETERGENTS_PAPER: annual spending (m.u.) on detergents and paper products (Continuous)
  • DELICATESSEN: annual spending (m.u.) on delicatessen products (Continuous)
  • CHANNEL: customer channels - Horeca (Hotel/Restaurant/Cafe) or Retail channel (Nominal) (খুচরা বিক্রয়ের জন্য ২ এবং হোটেল/রেস্টুরেন্টে পাইকারি বিক্রয়ের জন্য ১)
  • REGION: customer regions - Lisnon শহরের জন্য ১, Oporto শহরের জন্য ২ এবং অন্যান্য শহরের জন্য ৩)
প্রথমেই আমরা প্রয়োজনীয় লাইব্রেরী ইমপোর্ট করে নেব,
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import seaborn as sns
from sklearn.preprocessing import normalize
import scipy.cluster.hierarchy as shc
from sklearn.cluster import AgglomerativeClustering
ডেটাসেট লোড করার পর আমরা ডেটাসেটিকে নিচের মত দেখতে পাবো,
url='https://raw.githubusercontent.com/FazlyRabbiBD/Data-Science-Book/master/data-wholesale-customers.csv'
df = pd.read_csv(url)
df.head()
ক্লাস্টারিং এর সুবিধার জন্য আমরা পুরো ডেটাসেটকে নরমালাইজড করে নেব,
data_scaled = normalize(df)
data_scaled = pd.DataFrame(data_scaled, columns=df.columns)
data_scaled.head()
নরমালাইজড ডেটাসেটের ডেন্ড্রোগ্রাম তৈরি করলে নিচের ছবির মত একটি গ্রাফ তৈরি হবে। আমরা ওয়ার্ড লিঙ্কেজ পদ্ধতিতে এই ডেন্ড্রোগ্রাম তৈরি করেছি। আমরা চাইলে অন্যান্য পদ্ধতিতেও ডেন্ড্রোগ্রাম তৈরি করতে পারবো। এই ডেন্ড্রোগ্রাম থেকে বোঝা যাচ্ছে ডেটা পয়েন্ট গুলো প্রথমে ছোট ছোট ক্লাস্টার তৈরি করছে, এই ছোট ক্লাস্টার গুলো এরপর ক্রমান্বয়ে বড় ক্লাস্টারে পরিনত হচ্ছে।
plt.figure(figsize=(10, 7))
plt.title("Dendrograms using Ward")
dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))
plt.show()
অন্যান্য পদ্ধতিতে ডেন্ড্রোগ্রাম তৈরি,
  • কমপ্লিট - dend = shc.dendrogram(shc.linkage(data_scaled, method='complete'))
  • সিঙ্গেল -dend = shc.dendrogram(shc.linkage(data_scaled, method='single'))
  • এভারেজ - dend = shc.dendrogram(shc.linkage(data_scaled, method='average'))
ডেন্ড্রোগ্রাম এর দিকে লক্ষ্য করলে আমরা দেখতে পাচ্ছি ছোট ছোট ক্লাস্টার গুলো ক্রমান্বয়ে বড় ক্লাস্টার তৈরি করছে। X অক্ষে ডেটা পয়েন্ট এবং Y অক্ষে ক্লাস্টারের দূরত্ব দেয়া রয়েছে। নীল রঙের লাইন যে সবথেকে বড় দুটি ক্লাস্টার গঠিত হয়েছে তার জন্য ম্যাক্সিমাম দূরত্ব ৬ (এরপর আর নতুন ক্লাস্টার গঠিত হয় নি এবং দূরত্ব আর বাড়েনি )। আমরা এই দূরত্বের জন্য একটি লাইন টেনে দেব, আমাদের বোঝার সুবিধার্থে।
plt.figure(figsize=(10, 7))
plt.title("Dendrograms using Ward")
#dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'), leaf_rotation=0, leaf_font_size =12,orientation = 'right')
dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))
plt.axhline(y=6, color='r', linestyle='--')
plt.show()
যেহেতু আমরা ম্যাক্সিমাম ডিসট্যান্স এর জন্য দুটি ক্লাস্টার পেয়েছি, তাই দুটি ক্লাস্টার দিয়ে অ্যাগলোম্যারেটিভ ক্লাস্টারিং তৈরি করবো,
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
cluster.fit_predict(data_scaled)
আমাদের মূল ডেটাসেটে প্রতিটি অবজারভেশন (প্রতিটি রো) কোন ক্লাস্টারে পরে সেটি আরেকটি কলামে যুক্ত করবো,
df['cluster_'] = cluster.labels_
df.head()
আমরা এবার ক্লাস্টারের গ্রুপ বাই মিন ভ্যালু দেখে নেব, এর ফলে আমরা বুঝতে পারছি কোন ক্লাসটারে কোন ধরনের পণ্য গড়ে কেমন বিক্রি হয়।
agg_wholwsales = df.groupby(['cluster_','Channel'])['Fresh','Milk','Grocery','Frozen','Detergents_Paper','Delicassen'].mean()
agg_wholwsales
আমরা চাইলে আমাদের সুবিধা মত ভ্যারিয়েবলের জন্য ক্লাস্টার লেবেল দিয়ে স্ক্যাটার প্লট তৈরি করতে পারি।
plt.figure(figsize=(10, 7))
plt.scatter(data_scaled['Milk'], data_scaled['Grocery'], c=cluster.labels_)