«Красота привлекает внимание, а личность - сердце». Эти строки изображают важность вещей, которые выходят за рамки нашего видения. А как насчет алгоритма машинного обучения, который находит информацию о внутренней красоте, такой как мое сердце, которое находит сливочный слой Oreo, несмотря на неаппетитное хрустящее печенье снаружи?

ФАКТОРНЫЙ АНАЛИЗ

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

x - это переменная, F - коэффициент, а l - коэффициент нагрузки. который также можно рассматривать как вес фактора для соответствующей переменной. Количество факторов равно количеству переменных.

ВРЕМЯ ИСТОРИЙ

Давайте проясним все на примере. Давайте представим, что каждый из нас теперь является рекрутером и хочет нанять сотрудников для нашей компании. Процесс интервью завершен, и для каждой личности интервьюируемого мы оценили их по десятибалльной шкале. Различные личности интервьюируемого - отстраненные, расслабленные, беспечные, разговорчивые, ленивые и т. Д. Существует около 32 переменных. Мы видим, что расслабленные, беззаботные и ленивые черты лица взаимосвязаны, потому что эти люди не добьются успеха. Поскольку эти переменные коррелированы, мы можем попытаться сформировать фактор, называемый «неудачным поведением», который объяснит общую дисперсию, то есть дисперсию из-за корреляции между этими характеристиками.

Набор данных и код можно скачать с моего GithubRepo

ЭТАПЫ, ВКЛЮЧАЕМЫЕ В АНАЛИЗ ФАКТОРОВ

Различные этапы факторного анализа:

  • Тест сферичности Бартлетта и тест KMO
  • Определение количества факторов
  • Интерпретация факторов

Убедитесь, что вы удалили выбросы, стандартно отмасштабировали данные, а также функции должны быть числовыми.

Я собираюсь реализовать это на Python с помощью следующих пакетов

  • factor_analyzer
  • тупой
  • панды
  • matplotlib

ТЕСТ СФЕРИЧНОСТИ БАРЛЕТТА

Тест Бартлетта проверяет, присутствует ли корреляция в данных. Он проверяет нулевую гипотезу (H0) о том, что корреляционная матрица является идентичной матрицей. Идентичная матрица состоит из всех диагональных элементов как 1. Итак, нулевая гипотеза предполагает, что между переменными нет корреляции. Мы хотим отвергнуть эту нулевую гипотезу, потому что факторный анализ направлен на объяснение общей дисперсии, то есть вариации из-за корреляции между переменными. Если значение статистики p-теста меньше 0,05, мы можем решить, что корреляция не является идентичной матрицей, т.е. между переменными присутствует корреляция с уровнем достоверности 95%.

from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
chi2,p = calculate_bartlett_sphericity(dataframe)
print("Chi squared value : ",chi2)
print("p value : ",p)
#OUTPUT:
Bartlett Sphericity Test
Chi squared value : 4054.19037041082
p value : 0.0

Прочтите набор данных с помощью pandas и сохраните набор данных во фрейме данных. Мы сохранили набор данных во фрейме данных с именем «набор данных». Просто передайте «набор данных» через функцию calculate_bartltett_sphericty, она проверит нулевую гипотезу и вернет значение хи-квадрат и статистику p-теста. Поскольку статистика критерия p меньше 0,05, мы можем сделать вывод, что между переменными присутствует корреляция, что является зеленым сигналом для применения факторного анализа.

КАЙЗЕР-МЕЙЕР-ОЛКИН (КМО) ТЕСТ

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

from factor_analyzer.factor_analyzer import calculate_kmo
kmo_vars,kmo_model = calculate_kmo(dataset)
print(kmo_model)
#OUTPUT:
KMO Test Statistic 0.8412492848324344

Просто передайте фрейм данных, содержащий информацию о наборе данных, в функцию calculate_kmo. Функция вернет долю дисперсии для каждой переменной, которая хранится в переменной «kmo_vars», а доля дисперсии для всех наших данных сохраняется в «kmo_model». мы видим, что общая доля дисперсии наших данных составляет 0,84. Это показывает, что в наших данных больше корреляций, и можно применить такие методы уменьшения размерности, как факторный анализ.

ОПРЕДЕЛЕНИЕ КОЛИЧЕСТВА ФАКТОРОВ

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

Но почему мы должны выбирать факторы, собственные значения которых больше единицы? Ответ очень прост. В стандартном нормальном распределении со средним значением 0 и стандартным отклонением 1 дисперсия будет равна 1. Поскольку мы стандартно масштабировали данные, дисперсия признака равна 1. Это причина выбора факторов, собственные значения (дисперсия) которых больше, чем 1 то есть факторы, которые объясняют большую дисперсию, чем одна наблюдаемая переменная.

from factor_analyzer import FactorAnalyzer
fa = FactorAnalyzer(rotation = None,impute = "drop",n_factors=dataframe.shape[1])
fa.fit(dataframe)
ev,_ = fa.get_eigenvalues()
plt.scatter(range(1,dataframe.shape[1]+1),ev)
plt.plot(range(1,dataframe.shape[1]+1),ev)
plt.title('Scree Plot')
plt.xlabel('Factors')
plt.ylabel('Eigen Value')
plt.grid()

Функция собственных значений вернет исходные собственные значения и собственные значения общих множителей. Теперь мы собираемся рассматривать только исходные собственные значения. Из графика видно, что собственные значения опускаются ниже 1 с 7-го фактора. Итак, оптимальное количество факторов - 6.

ИНТЕРПРЕТАЦИЯ ФАКТОРОВ

Создайте оптимальное количество факторов, то есть в нашем случае 6. Затем мы должны интерпретировать факторы, используя нагрузки, дисперсию и общие черты.

НАГРУЗКИ

fa = FactorAnalyzer(n_factors=6,rotation='varimax')
fa.fit(dataset)
print(pd.DataFrame(fa.loadings_,index=dataframe.columns))

Нагрузки показывают, насколько фактор объясняет переменную. Оценка нагрузки будет варьироваться от -1 до 1. Значения, близкие к -1 или 1, указывают на то, что фактор влияет на эти переменные. Значения, близкие к 0, указывают на то, что фактор имеет меньшее влияние на переменную.

Например, в Факторе 0 мы видим, что черты «отстраненный» и «застенчивый» разговорчивы имеют более высокие нагрузки, чем другие переменные. Из этого мы можем видеть, что Фактор 0 объясняет обычную дисперсию у сдержанных людей, то есть разницу между людьми, которые отстранены и застенчивы.

ВАРИАНТ

Величину дисперсии, объясняемую каждым фактором, можно узнать с помощью функции «get_factor_variance».

print(pd.DataFrame(fa.get_factor_variance(),index=['Variance','Proportional Var','Cumulative Var']))

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

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

СООБЩЕСТВА

Общность - это доля дисперсии каждой переменной, которая может быть объяснена факторами. Вращения не влияют на общность переменных.

print(pd.DataFrame(fa.get_communalities(),index=dataframe.columns,columns=['Communalities']))

Долю дисперсии каждой переменной, которая объясняется факторами, можно вывести из вышеизложенного. Например, мы могли бы рассмотреть переменную «talkatv», примерно 62,9% ее дисперсии объясняются всеми факторами вместе.

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