Кластеризация 1% лучших: анализ активов в R

Недавно принятый в США закон о налоговой реформе поднял много вопросов о распределении богатства в стране. Хотя много внимания уделялось тому, как налоговый план повлияет на доход, меньше внимания уделялось тому, как этот план влияет на активы богатых домохозяйств.

Цель этой публикации - показать, как можно использовать язык программирования R для сбора данных из общедоступных источников, чтобы лучше понять чистую стоимость состоятельных домохозяйств в США. Используя данные Обзора потребительских финансов Федеральной резервной системы за 2016 год, мы исследуем следующие вопросы:

  • Насколько богатые 1% и 0,1% самых богатых домохозяйств?
  • Есть ли в США разные типы миллионеров?
  • Чем отличается распределение активов по разным сегментам чистой стоимости?

Чтобы ответить на эти вопросы, мы представляем описательную статистику данных этого обследования и проводим кластерный анализ состоятельных домохозяйств, которые мы определяем как домохозяйства с чистой стоимостью более 1 000 000 долларов США.

Основываясь на данных опроса, наш анализ показывает, что чистая стоимость 1% самых богатых домохозяйств в США составляет 10,4 млн долларов, а чистая стоимость 0,1% домашних хозяйств составляет 43,2 млн долларов. В этом посте представлен анализ различных составов активов миллионеров и показано, как распределение активов различается между 10%, 1% и 0,1% домашних хозяйств в США. Исходный код R, использованный для получения всех результатов и цифр, представленных в этом посте, доступен как Jupyter Notebook.

Настройка среды
Для выполнения кластерного анализа состоятельных домохозяйств в США мы используем несколько пакетов, доступных из библиотеки CRAN для R. Для исследовательского анализа данных нам нравится использовать ядро R для записной книжки Jupyter, поскольку оно позволяет специалистам по обработке данных легко хранить записные книжки на GitHub и делиться результатами с другими командами.

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

Теперь мы готовы начать копаться в данных опроса, чтобы лучше понять активы состоятельных домохозяйств в США. Для начала загрузим несколько библиотек, которые помогут нам проанализировать данные опроса и выполнить кластеризацию.

В блоке кода ниже показаны библиотеки, которые необходимо загрузить для выполнения этой записной книжки. Библиотека readxl необходима для чтения исходных данных и преобразования их во фрейм данных, библиотеки reldist и ENmisc используются для вычисления дистрибутивов с взвешенные наборы данных, а остальные библиотеки используются для кластерного анализа.

library(readxl)     # for reading xlsx files 
library(reldist)    # for computing weighted statistics
library(ENmisc)     # for weighted box plots
library(plotly)     # for interactive plots
library(factoextra) # for factor maps
library(FactoMineR) # Principal Component Analysis (PCA)
library(cluster)    # Clustering algorithms (CLARA)
library(class)      # for KNN

Получение данных
Следующим шагом является загрузка данных с веб-сайта Федеральной резервной системы. Данные опроса доступны в виде заархивированного файла xlsx. Чтобы загрузить данные и загрузить их в R в качестве фрейма данных для анализа, мы используем блок кода ниже. Поскольку это большой файл, мы следим за тем, чтобы не загружать его несколько раз. Результирующий файл, который мы разархивируем, имеет размер около 40 МБ, и для его загрузки во фрейм данных требуется некоторое время.

if (!file.exists("SCFP2016.xlsx")) {        
  download.file(
   "https://www.federalreserve.gov/econres/files/scfp2016excel.zip",
   "SCFP2016.zip")
  unzip("scfp2016.zip")
} 
df <- read_excel("SCFP2016.xlsx")

Сводная статистика
Теперь, когда у нас есть данные обследования, загруженные в R, мы можем начать анализ распределения активов самых богатых домохозяйств в США. Начнем с некоторой сводной статистики: сколько участников опроса и сколько домохозяйств представлено в этом опросе? Подсчет количества строк во фрейме данных дает ответ на первые вопросы (31,2 тыс.), А сложение весов всех респондентов дает ответ на второй вопрос (126 млн).

# How many survey participants?
nrow(df)
# How many households does the survey represent?
floor(sum(df$WGT)))
# What is the weighted mean of household net worth?
floor(sum(df$NETWORTH*df$WGT)/sum(df$WGT)))
# what is the median NW in US?  
reldist::wtd.quantile(df$NETWORTH, q=0.5, weight = df$WGT)
# who is the 1%? 
reldist::wtd.quantile(df$NETWORTH, q=0.99, weight = df$WGT)
# top 0.1% Ultra-high net worth households  reldist::wtd.quantile(df$NETWORTH, q=0.999, weight = df$WGT)

Чтобы ответить на вопросы о средних показателях, например о том, какова средняя чистая стоимость домохозяйства, нам необходимо использовать взвешенную статистику (поскольку вес одного респондента обследования может быть намного больше, чем других). Чтобы вычислить средний собственный капитал, мы можем использовать встроенные функции R, которые возвращают значение в 690 тысяч долларов. Однако, поскольку чистая стоимость активов намного ближе к логарифмически нормальному распределению, чем к нормальному распределению, мы должны использовать другие подходы.

Для вычисления среднего значения с взвешенными ответами мы используем библиотеку reldist, которая назначает большую поддержку респондентам с большим весом и меньшую поддержку респондентам с меньшим весом. При использовании этого подхода для вычисления взвешенной медианы мы обнаруживаем, что 50-й процентиль чистой стоимости домохозяйства в США составляет 97 тыс. Долларов.

Чистая стоимость 1% самых богатых компаний составляет 10,4 млн долларов, а чистая стоимость 0,1% самых богатых компаний составляет 43,2 млн долларов. Мы используем функцию wtd.quantile для вычисления этой описательной статистики, а в приведенном выше примере кода используются полностью определенные количественные имена функций из-за конфликтов с пакетом ENmisc.

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

# filter on ages 30 - 84, and group into 5-year buckets
data <- df[df$AGE >= 30 & df$AGE < 85, ]
ages <- floor(data$AGE/5.0)*5
# plot the weighted box plot
wtd.boxplot(log10(1 + data$NETWORTH) ~ ages, data = data, 
  weights = data$WGT, main = 'Net Worth by Age',
  xlab="Age", ylab="Net Worth (Log10)")

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

В приведенном выше коде показано, как отобразить прямоугольную диаграмму данных опроса по возрасту с использованием пакета ENmisc для вычисления взвешенных распределений. Результаты этого графика показывают, что средняя чистая стоимость домашних хозяйств в США составляет 114 тысяч долларов при 40, 163 тысячи долларов при 50 и 243 тысячи долларов при 60.

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

# normalize assets by total financial and non-financial amounts
households <- data.frame(
  LIQ = df$LIQ/assets,
  ...
  BUS = df$BUS/assets,  
  OTHNFIN = df$OTHNFIN/assets
# split into net worth segments, and compute mean distributions 
nw <- floor(log10(households$netWorth))
segment <- ifelse(nw == 4, "     $10k", 
      ifelse(nw == 5, "    $100K", 
      ifelse(nw == 6, "   $1M",               
      ifelse(nw == 7, "  $10M",               
      ifelse(nw == 8, " $100M", "$1B+")))))
results <- as.data.frame((aggregate(households,list(segment),mean)))
# plot the results
plot <- plot_ly(results, x = ~Group.1, y = ~100*LIQ, type = 'bar', name = 'Liquid') %>%
  add_trace(y = ~100*CDS, name = 'Certificates of Deposit') %>%
  add_trace(y = ~100*NMMF, name = 'Mutual Funds') %>%
  ...
  add_trace(y = ~100*BUS, name = 'Business Interests') %>%
  layout(yaxis = list(title = '% of Assets', 
    ticksuffix = "%"), xaxis = list(title = "Net Worth"),
    title = "Asset Allocation by Net Worth", barmode = 'stack')

Приведенный выше код вычисляет распределение активов по домохозяйствам путем деления суммы активов для домохозяйства, например собственного капитала (BUS), на общее количество финансовых и нефинансовых активов, за исключением долга. Шаблон «…» используется для обозначения того, что из фрагмента кода было исключено несколько строк, перечисленных в полной записной книжке. Второй блок кода группирует домохозяйства в разные сегменты чистой стоимости, а третий блок отображает результаты, как показано ниже.

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

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

# filter on affluent households, and print the total number
affluent <- households[households$netWorth >= 1000000, ]
cat(paste("Affluent Households: ", floor(sum(affluent$weight))))
# plot a Factor Map of assets 
fviz_pca_var(PCA(affluent,  graph = FALSE), col.var="contrib",    
  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)+
  labs(title ="Affluent Households - Assets Factor Map")

Приведенный выше код сначала фильтрует респондентов обследования в обеспеченные домохозяйства с чистой стоимостью более 1 миллиона долларов США, а затем строит факторную карту с использованием анализа главных компонентов (PCA). На рисунке ниже показано, как различные активы влияют на траекторию построения домохозяйства по двум основным компонентам, обнаруженным с помощью PCA.

Результаты, представленные ниже, показывают, что существует несколько разных групп активов, которые различаются в зависимости от состояния состоятельных людей. Самый важный фактор - это справедливость бизнеса. Некоторые другие группы факторов включают инвестиционные активы (АКЦИИ, ОБЛИГАЦИИ) и активы в сфере недвижимости / пенсионные фонды.

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

k <- 7
res.hc <- eclust(households[sample(nrow(households), 1000), ],
  "hclust", k = k, graph = FALSE) 
fviz_dend(res.hc, rect = TRUE, show_labels = FALSE)

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

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

clarax <- clara(affluent, k)
fviz_cluster(clarax, stand = FALSE, geom = "point", ellipse = F)

Чтобы сгруппировать зажиточные домохозяйства в уникальные группы, мы использовали алгоритм CLARA. Визуализация различных кластеров показана ниже. Результаты аналогичны PCA и подходу с факторной картой, описанному выше.

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

groups <- clarax$clustering
results <- as.data.frame(t(aggregate(affluent,list(groups),mean)))  
results[2:18,]

Результаты этого блока кода показаны ниже. На основе этих результатов мы придумали следующие описания кластеров:

  • V1: Акции / Облигации - 31% активов, за которыми следуют домашние и паевые инвестиционные фонды.
  • V2: Диверсифицированный - 53% бизнес, 10% дом и 9% другая недвижимость
  • V3: Жилая недвижимость - 48% активов
  • V4: Паевые инвестиционные фонды - 50% активов
  • V5: Выход на пенсию - 48% активов
  • V6: Собственный капитал - 85% активов
  • V7: Коммерческая недвижимость - 59% активов

За исключением кластера V7, содержащего только 3% населения, большинство кластеров относительно одинаковы по размеру. Второй по величине кластер представляет 12% населения, а самый большой кластер представляет 20%. Вы можете использовать таблицу (группы), чтобы показать невзвешенные размеры совокупности кластеров.

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

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

# assign all of the households to a cluster 
groups <- knn(train = affluent, test = households, 
  cl = clarax$clustering, k = k, prob = T, use.all = T)
# figure out how many households are in each cluster 
clusters <- data.frame(
  c1 = ifelse(groups == 1, weights, 0), 
  ... 
  c7 = ifelse(groups == 7, weights, 0) 
)
# assign each household to a net worth cluster 
nw <- floor(2*log10(nwHouseholds))/2
results <- as.data.frame(t(aggregate(clusters,list(nw),sum)))
# compute the number of households that belong to each segment
results$V1 <- results$V1/sum(ifelse(nw == 4, weights, 0))
...
results$V11 <- results$V11/sum(ifelse(nw == 9, weights, 0))
# plot the results 
plot <- plot_ly(results, x = ~10^Group.1, y = ~100*c1, type = 'scatter', mode = 'lines', name = "Stocks") %>%
  add_trace(y = ~100*c2, name = "Diversified") %>%
  ...
  add_trace(y = ~100*c7, name = "Commercial R.E.") %>%
  layout(yaxis = list(title = '% of Households', ticksuffix = "%"),
     xaxis = list(title = "Net Worth ($)", type = "log"), 
     title  = "Cluster Populations by Net Worth")

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

Резюме
В этом посте мы использовали R для загрузки и анализа данных обследования потребительских финансов Федеральной резервной системой 2016 года, чтобы понять, насколько состоятельны ведущие домохозяйства в США, и сгруппировать состоятельные домохозяйства по распределение активов. Мы выделили 7 различных групп миллионеров и показали, как распределение кластеров зависит от сегмента чистой стоимости. Имейте в виду, что представленные результаты основаны на взвешенных данных опроса и могут не быть репрезентативными для всего населения США.

Бен Вебер - ведущий специалист по анализу данных в Zynga. Мы нанимаем"!