Как мне выполнить кластерный анализ таблицы с символьными и числовыми переменными в SAS? - PullRequest
0 голосов
/ 04 сентября 2018
Account_id <- c("00qwerf1”, “00uiowe3”, “11heooiue” , “11heooihe” , 
"00sdffrg3”, “03vthjygjj”, “11mpouhhu” , “1poihbusw”)

Postcode <- c(“EN8 7WD”, “EN7 9BB”, “EN6 8YQ”, “EN8 7TT”, “EN7 9BC”, “EN6 
8YQ”, “EN8 7WD”, “EN7 7WB) 

Age <- c(“30”, “35”, “40”, “50”, “60”, “32”, “34”, “45”)

DF <- data.frame(Account_id, Postcode, Age)

Я хочу провести кластерный анализ на моем фрейме данных в SAS. Я понимаю, что технически кадр данных не используется в SAS, однако я только использовал этот формат для иллюстрации. Account_id и Postcode являются символьными переменными, а Age является числовой переменной.

Ниже приведен код, который я использовал после выполнения шага данных;

Proc fastclus data=DF maxc-8 maxiter=10 seed=5 out=clus;
Run;

Анализ кластера не работает, потому что Account_id и Postcode являются символьными переменными. Есть ли способ изменить эти переменные на числовые, или существует метод кластеризации, который работает как с символьными, так и с числовыми переменными?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

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

Пример кода

Примечание: опция FASTCLUS seed = - это спецификатор набора данных, а не простое число (как используется с генераторами случайных чисел)

* hacky tweak to place your R coded data values in a SAS data set;
data have;
  array _Account_id(8) $20 _temporary_ ("00qwerf1", "00uiowe3", "11heooiue" , "11heooihe" , 
"00sdffrg3", "03vthjygjj", "11mpouhhu" , "1poihbusw");

  array _postcode(8) $7 _temporary_ ("EN8 7WD", "EN7 9BB", "EN6 8YQ", "EN8 7TT", "EN7 9BC", "EN6 
8YQ", "EN8 7WD", "EN7 7WB");

  array _age (8) $3  _temporary_ ("30", "35", "40", "50", "60", "32", "34", "45");

  do _n_ = 1 to dim (_account_id);
    Account_id = _account_id(_n_);
    Postcode = _postcode(_n_);
    Age = _age(_n_);
    output;
  end;
run;

* get lists of distinct values for each variable;
proc means noprint data=have;
  class _all_;
  ways 1;
  output out=have_freq;
run;

* compute ordinal of each variables original value;
data have_freq2;
  set have_freq;
  if not missing(Account_id) then unum_Account_id + 1;
  if not missing(Postcode) then unum_Postcode + 1;
  if not missing(Age) then unum_Age + 1;
run;

* merge back by original value to obtain ordinal values;
proc sql;
  create table have_unumified as
  select 
    Account_id, Postcode, Age
   , (select unum_Account_id from have_freq2 where have_freq2.Account_id = have.Account_id) as unum_Account_id
   , (select unum_Postcode   from have_freq2 where have_freq2.Postcode = have.Postcode) as unum_Postcode
   , (select unum_Age   from have_freq2 where have_freq2.Age = have.Age) as unum_Age
   from have
   ;
run;

* fastclus on the ordinal values (seed= not specified);
Proc fastclus data=have_unumified maxc=8 maxiter=10 out=clus_on_unum;
  var unum_:;
Run;
0 голосов
/ 04 сентября 2018

Прежде чем вы сможете выполнить кластеризацию, вам необходимо определить метрику, которую можно использовать для расчета расстояния между наблюдениями. По умолчанию proc fastclus использует евклидову метрику . Для этого необходимо, чтобы все входные переменные были числовыми и работали лучше всего, если они все перемасштабированы, чтобы иметь одинаковое среднее значение и дисперсию, чтобы они все были одинаково важны при росте кластеров.

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

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

...