Научитесь использовать и визуализировать кластерный анализ K-средних в R с данными индекса экономической свободы 2020 от The Heritage Foundation

Цели

  1. Используйте алгоритм кластеризации K-средних в R
  2. Определите нужное количество кластеров
  3. Создавать таблицы и визуализации кластеров
  4. Скачивание, извлечение и загрузка сложных файлов Excel из Интернета в R
  5. Эффективно очищайте, обрабатывайте и фильтруйте данные

Введение

Кластеризация K-средних - это метод машинного обучения без учителя, который весьма полезен для группировки уникальных данных в несколько похожих групп на основе центров независимых переменных, присутствующих в наборе данных [1]. Пара классических примеров - это объединение различных типов клиентов в программы лояльности компании и разделение медицинских пациентов на категории низкого, среднего, высокого и экстремального риска [1].

В этой статье мы будем использовать набор данных Индекса экономической свободы за 2020 год, который находится в свободном доступе на сайте The Heritage Foundation [2]. Мы также будем использовать файл R Markdown (.RMD), доступный для загрузки на моем GitHub по этой ссылке. Я предполагаю, что вы можете загрузить и установить R и RStudio на свой компьютер.

Структура этой статьи:

  1. Загрузите необходимые библиотеки
  2. Импортировать данные
  3. Очистите данные и исправьте проблемы с форматированием
  4. Покажите несколько различных способов создания кластеров K-средних
  5. Покажите несколько полезных визуализаций, которые вы можете адаптировать для своих проектов по мере необходимости.

Давайте прыгнем в это!

Код

Загрузить библиотеки

Во-первых, нам нужно загрузить tidyverse, FactoMineR, factoextra, и readxl в нашу среду R. Если вы получаете сообщение об ошибке, что пакеты не распознаются, раскомментируйте (удалите #) перед нужной строкой install.packages ().

# Install if needed by removing the #
# install.packages("tidyverse")
# install.packages("readxl")
# install.packages("FactoMineR")
# install.packages("factoextra")
# Load Libraries
library(tidyverse)
library(readxl)
library(FactoMineR)
library(factoextra)

Также было бы полезно установить рабочий каталог в папку, содержащую ваш файл и имеющую место для загрузки файла .xls. Это можно сделать с помощью команды setwd () или с помощью RStudio, чтобы перейти в меню Файлы к местоположению папки и установить рабочий каталог с помощью More раскрывающееся меню, как показано ниже:

Скачать данные

Теперь нам нужно скачать данные. Ссылку на веб-страницу можно найти здесь [2] или в файле RMD с моего GitHub, если вы хотите немного подробнее изучить веб-сайт The Heritage Foundation, чтобы узнать о данных. Нажмите кнопку Загрузить необработанные данные вверху страницы, и вы должны получить файл с именем index2020_data.xls, который мы будем использовать для остальной части проекта.

Импортировать данные

Проще всего перейти к папке с данными, щелкнуть по ней и автоматически открыть графический интерфейс readxl. Я пошел дальше и переименовал свои данные в EFI_data для простоты и понятности. Эти снимки экрана должны помочь:

После изменения имени и нажатия кнопки Импорт RStudio автоматически сгенерирует некоторый код для вашей консоли. Рекомендуется скопировать / вставить первую строку без «› »в файл, чтобы иметь возможность быстро загрузить данные позже. Вот как это выглядит:

Код должен выглядеть так:

# Import Data
EFI_data <- read_excel("index2020_data.xls")

Первоначальный взгляд на данные

Когда это возможно, всегда полезно быстро просмотреть данные, чтобы увидеть, есть ли какие-либо очевидные проблемы, которые необходимо решить, прежде чем мы приступим к интересным вещам.

Вот скриншот с некоторыми данными посередине. Посмотрим, что выскочит.

Что меня бросает в глаза, так это то, что отсутствующие данные помечаются как «N / A», что, как я знаю, не понравится R. Цифры также выглядят довольно странно, если некоторые из них короткие и приятные, а в других слишком много десятичных знаков. Кроме того, заинтересованные стороны заметили, что на этапе импорта данных все столбцы, которые должны быть числовыми, на самом деле являются символами. Нам также придется решить проблемы с типами данных.

Очистить данные

Во-первых, давайте избавимся от проблемы «Н / Д». Есть много способов сделать это, но я собираюсь полагаться на уловку R и немного «доверять магии». Чтобы избежать осложнений при выполнении следующих шагов, просто поверьте мне, что мы должны получить исходные имена столбцов из EFI_data, прежде чем двигаться дальше. Давайте использовать этот код:

# Get original column names
EFI_data_col_names <- names(EFI_data)

Затем мы собираемся использовать функцию lapply () и поместить функцию gsub () внутри пользовательской function (), чтобы найти любые появление строки «N / A» и ничего не заменить. Когда мы структурируем функцию таким образом, мы полагаемся на скорость lapply (), чтобы выполнить настройку намного быстрее, чем при использовании цикла for из-за однопоточной природы R [1 ]. На следующем этапе мы будем полагаться на R для преобразования пустых данных в правильный формат NA. Прокрутите данные, чтобы увидеть результат.

Вот код:

# Fix "N/A" in the data set
EFI_data <- data.frame(lapply(EFI_data, function(x) {
  gsub("N/A", "", x)
}))

Хотя эта функция делает то, что мы хотим, в самих данных, R считает, что автоматическое изменение имен столбцов - хорошая идея. Это раздражает и беспорядочно, поэтому давайте вернем исходные имена с помощью этого кода:

# Put the right column names back
names(EFI_data) <- EFI_data_col_names

Время для пользовательской функции!

Давайте сделаем так, чтобы все те столбцы, которые являются символами, были числовыми, и округлили их до двух десятичных знаков, пока мы на этом. Мы подключим эту пользовательскую функцию к следующему шагу.

Вот код:

# Create custom function to fix data types and round
to_numeric_and_round_func <- function(x){
  round(as.numeric(as.character(x)),2)
}

Создав нашу настраиваемую функцию, мы будем использовать функцию mutate_at () для изменения всех столбцов, кроме четырех столбцов, которые должны оставаться текстовыми.

Вот код:

# Mutate the columns to proper data type
EFI_data <- EFI_data %>%
  mutate_at(vars(-one_of("Country Name", "WEBNAME", "Region", "Country")), to_numeric_and_round_func)

На самом деле нам не нужны Country или WEBNAME для фактического анализа, поэтому мы удалим их сейчас, просто сделав их NULL с помощью этого кода. :

# Remove Country and WEBNAME
EFI_data$Country <- NULL
EFI_data$WEBNAME <- NULL

Кластеризация K-средних

Есть два основных способа провести анализ K-средних - простой и необычный.

Основные K-средние

В основном мы будем выполнять простую функцию kmeans (), угадывать количество кластеров (обычно лучше всего начинать с 5), а затем эффективно прикрепляем изолентой номера кластеров к каждой строке данных. и закончить день. Сначала нам нужно избавиться от любых недостающих данных, что можно сделать с помощью этого кода:

# create clean data with no NA
clean_data <- EFI_data %>%
  drop_na()

Мы также хотим установить начальное число, чтобы обеспечить воспроизводимость с помощью этого кода:

# Set seed
set.seed(1234)

Вот код для основного метода K-средних:

# Cluster Analysis - kmeans
kmeans_basic <- kmeans(clean_data[,7:32], centers = 5)
kmeans_basic_table <- data.frame(kmeans_basic$size, kmeans_basic$centers)
kmeans_basic_df <- data.frame(Cluster = kmeans_basic$cluster, clean_data)
# head of df
head(kmeans_basic_df)

Вот результат:

Это показывает, что номер кластера добавлен к каждой строке данных.

Мы также можем посмотреть свойства (центры, размер) каждого кластера с помощью kmeans_basic_table здесь:

Мы также можем исследовать каждую строку данных с номером кластера в объекте kmeans_basic_df следующим образом:

Для многих основной способ приведет вас настолько далеко, насколько вам нужно. Отсюда вы можете создавать графики по регионам, данные для каждого кластера или что угодно.

Я создал быстрый пример ggplot () с разбивкой количества каждого кластера по регионам. Мы могли бы сделать десятки разных сюжетов, но это хорошая, простая демонстрация.

Вот код:

# Example ggplot
ggplot(data = kmeans_basic_df, aes(y = Cluster)) +
  geom_bar(aes(fill = Region)) +
  ggtitle("Count of Clusters by Region") +
  theme(plot.title = element_text(hjust = 0.5))

Вот результат:

Необычные К-средние

Первая задача - выяснить правильное количество кластеров. Делается это при помощи осыпи участка. По сути, цель состоит в том, чтобы найти, где кривая начинает значительно сглаживаться [1]. Поскольку алгоритм K-средних эффективно минимизирует различия между центрами кластеров и каждой точкой данных, создается эта форма кривой, которая начинается круто, а затем асимптотически приближается к некоторому уровню плоской линии [1]. Хотя это и не полное требование, обычно рекомендуется масштабировать данные при создании кластеров с помощью функции scale () или другого метода нормализации для получения более точных результатов [1].

Мы будем использовать функцию fviz_nbclust () для создания графика осыпи с помощью этого кода:

# Fancy K-Means
fviz_nbclust(scale(clean_data[,7:32]), kmeans, nstart=100, method = "wss") + 
  geom_vline(xintercept = 5, linetype = 1)

Вот результат:

На самом деле создание причудливой кластерной функции K-средних очень похоже на базовую. Мы просто масштабируем данные, создаем 5 кластеров (наше оптимальное количество) и для простоты установим nstart равным 100.

Вот код:

# Fancy kmeans
kmeans_fancy <- kmeans(scale(clean_data[,7:32]), 5, nstart = 100)
# plot the clusters
fviz_cluster(kmeans_fancy, data = scale(clean_data[,7:32]), geom = c("point"),ellipse.type = "euclid")

Вот результат:

Этот последний график действительно помогает визуализировать, что кластеры действительно похожи друг на друга. Интересно, как мало требуется кода, чтобы получить очень интересные результаты.

Заключение

Этот проект был создан, чтобы показать, как использовать и визуализировать кластеризацию K-средних. Есть несколько способов сделать это и можно построить бесчисленное количество сюжетов. Как и большинство задач в области науки о данных, большая часть времени фактически тратится на поиск данных и их очистку, чтобы сделать с ними что-то полезное. Надеюсь, к этому моменту вы почувствуете себя намного лучше в использовании кластеризации K-средних и сможете увидеть различные приложения для техник, которые мы здесь использовали.

использованная литература

[1] Р. Кабакофф, R в действии (2-е изд.) (2015), Остров Шелтер, Нью-Йорк: Manning Publications Co.

[2] The Heritage Foundation, Индекс экономической свободы 2020 (2020), https://www.heritage.org/index/download