Кластерний аналіз – це статистична процедура, яка класифікує об’єкти або спостереження в однорідні групи. Набір усіх досліджуваних об’єктів розподіляється по підкласах, які називаються кластерами (англ. cluster - гроно), класами, групами або таксонами.

Кластерний аналіз є у певній мірі антиподом дисперсійного аналізу. Так, дисперсійний аналіз, маючи декілька вибірок, перевіряє гіпотезу, що центри даних вибірок не відрізняються, а значить вибірки були взяті випадково із однієї загальної вибірки. А кластерний аналіз, маючи загальну вибірку, формує декілька вибірок так, щоб їх центри максимально відрізнялись між собою. Дисперсійний аналіз шукає відмінності між міжгруповою та внутрішньогруповими дисперсіями, а кластерний аналіз призначений для створення цієї відмінності - максимальної міжгрупової та мінімальних внутрішньогрупових дисперсій. Таким чином кластерний аналіз дозволяє виявити та сформувати різні групи близьких між собою об’єктів. Найчастіше для кластерного аналізу використовується метод k-середніх (kmeans()), який потребує явного задання кількості різних груп (кластерів), і здійснює розподіл об’єктів сукупної вибірки у групи так, щоб максимізувати відмінності між групами.

##Приклад

У фармацевтичному маркетингу прийнято виділяти різні цінові діапазони для споріднених лікарських препаратів, асоціюючи їх з різними ринковими нішами. Найчастіше кількість цих діапазонів встановлюють рівною трьом. Тобто виділяють препарати з низькою ціною (дешеві), середньою та високою (дорогі). І на аналогічні (схожі) за своєю дією препарати існує попит у всіх трьох нішах. Так, хтось може купити тільки дешеві препарати, а інші надають перевагу більш якісним, безпечним, популярним (брендовим) та дорогим препаратам (нагадаємо, що ці характеристики перш за все суб’єктивні). Однак встановити єдині межі цінових діапазонів для усіх лікарських препаратів неможливо, оскільки різні групи ліків характеризуються різними мінімальними та максимальними цінами, до того ж ціни постійно змінюються услід змінам на фармацевтичному ринку. Тому раціонально розподіл препаратів за ціновими рівнями прив’язувати до конкретної групи, місця і часу. Розподілити лікарські препарати і встановити границі рівнів у кожному випадку можна за допомогою кластерного аналізу. Отож, розділимо препарати для лікування акне (вугрової хвороби) (група D10 за ATC) на ринку України за трьома ціновими діапазонами станом на листопад 2011 (ціни взяті із деякої Київської інтернет-аптеки, окремі препарати цієї групи відсутні оскільки їх не було в наявності).

Завантажимо дані з інтернету:

adress <- "http://stat.org.ua/data/cluster.csv"
data <- read.csv(adress, sep = "\t", fileEncoding = "CP1251")
# Якщо у вас Windows української чи російської локалізації - аргумент
# fileEncoding можна пропустити
head(data)
##              preparat  cina
## 1       ДЕРИВА С ГЕЛЬ 80.23
## 2 СІРЧАНА МАЗЬ ПРОСТА  3.94
## 3  ДЕРИВА ВОДНИЙ ГЕЛЬ 59.34
## 4            БЕЗУГРЕЙ 31.10
## 5            ОКСИГЕЛЬ 17.70
## 6             УГРЕСОЛ 34.10

Датафрейм data має стовпчик preparat, у якому наведено назви препаратів, і стовпчик cina – ціни. Проведемо кластерний аналіз методом k-середніх:

data = data[order(data$cina), ]
set.seed(123)  #ініціюєм генератор випадкових чисел
res <- kmeans(data$cina, 3)

Подивимось, яка інформація була записана в об’єкт res:

str(res)
## List of 9
##  $ cluster     : int [1:20] 1 1 1 1 1 1 1 1 1 1 ...
##  $ centers     : num [1:3, 1] 39.2 495.8 108.2
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:3] "1" "2" "3"
##   .. ..$ : NULL
##  $ totss       : num 530582
##  $ withinss    : num [1:3] 3118 37122 3197
##  $ tot.withinss: num 43437
##  $ betweenss   : num 487145
##  $ size        : int [1:3] 10 3 7
##  $ iter        : int 2
##  $ ifault      : int 0
##  - attr(*, "class")= chr "kmeans"

Змінна cluster містить номери груп для кожного з препаратів, змінна centers – координати центрів груп, size – розміри груп, інші змінні – суми квадратів відхилень загалом у вибірці, між групами та всередині груп. Зобразимо отриманий поділ на цінові інтервали графічно:

dotchart(data$cina, labels = data$preparat, groups = res$cluster, color = res$cluster)

кластерний аналіз-1

Функція dotchart виводить точковий графік, по осі абсцисс відкладаємо ціни, по осі ординат – мітки (назви) препаратів, розбиті на групи відповідно отриманих цінових інтервалів - змінної cluster у об’єкті res (groups=res$cluster), а також намальовані різними кольорами відповідно до цих же інтервалів.

Бачимо насиченість асортименту препаратів з низькою вартістю, трохи менший асортимент середньої вартості, і акнетин та два дозування роаккутану складають нішу дорогих препаратів. Подивимося на визначені центри кластерів:

res$centers
##     [,1]
## 1  39.23
## 2 495.83
## 3 108.25

Отже середня ціна дорогих препаратів 496 грн, препаратів середньої вартості – 108 грн, і дешевих препаратів – 39грн.

Визначимо границі інтервалів:

tapply(data$cina, res$cluster, min)  # мінімуми
##      1      2      3 
##   3.94 379.70  80.23
tapply(data$cina, res$cluster, max)  # i максимуми
##      1      2      3 
##  60.25 645.80 141.00

Дорогі препарати – від 379 до 646 грн, середньої вартості – від 80 до 141 грн, дешеві – від 3 до 61 грн. Однак з точки зору споживача такий розподіл швидше за все буде неадекватний. Так, для споживача препарати з цінами 300 і 400 грн відрізняються значно менше, ніж, наприклад, препарати з цінами 10 і 90 грн (а між ними різниця у 100 і 80 грн відповідно). З галузі фізіології людини відомо, що чутливість до подразника прямо пропорційна не його інтенсивності, а логарифму інтенсивності (закон Вебера-Фехнера). І, оскільки в переліку присутні дуже дорогі препарати, в таких випадках для зменшення їхнього впливу на центри кластерів також прийнято застосовувати логарифмічне перетворення даних.

logcina <- log(data$cina)  #обчислюємо натуральні логарифми цін
set.seed(123)
logres <- kmeans(logcina, 3)
dotchart(data$cina, labels = data$preparat, groups = logres$cluster, color = logres$cluster)

кластерний аналіз-2

На графіку по осі абсцисс ми відклали справжні (нелогарифмовані) ціни (вони збереглись всередині датафрейму data).

Бачимо іншу картину (і, швидше за все, ближчу до погляду споживача): до препаратів з низькою ціною відноситься лише “Оксигель” та “Сірчана мазь проста”, і достатньо насиченими є інтервали середніх та високих цін. Подивимось на розподіл логарифмів цін:

tapply(data$cina, logres$cluster, min)
##      1      2      3 
##   3.94 379.70  31.10
tapply(data$cina, logres$cluster, max)
##      1      2      3 
##   17.7  645.8  141.0

А центри -

exp(logres$centers)  #exp() - експонента – обернена функція до натурального логарифму.
##         [,1]
## 1   8.350928
## 2 483.867966
## 3  67.149981

8.35, 67.1 та 483.9 гривень відповіно.