основно групиране с r

Нов съм в R и анализа на данни. Опитвам се да създам проста персонализирана система за препоръки за уеб сайт. И така, като входна информация имам user/session-id,item-id,item-price върху кои потребители са кликнали.

c165c2ee-81cf-48cf-ba3f-83b70204c00c    161785  124.0
a886fdd5-7cee-4152-b1b7-77a2702687b0    643339  42.0
5e5fd670-b104-445b-a36d-b3798cd43279    131332  38.0
888d736f-99bc-49ca-969d-057e7d4bb8d1    1032763 39.0

Бих искал да приложа клъстерен анализ към тези данни.

Ако се опитам да приложа k-означава групиране към моите данни:

> q <- kmeans(dat, centers=25)
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)
In addition: Warning message:
In kmeans(dat, centers = 25) : NAs introduced by coercion

Ако се опитам да приложа йерархично групиране към данните:

> m <- as.matrix(dat)
> d <- dist(m)   # find distance matrix
Warning message:
In dist(m) : NAs introduced by coercion

„НА, въведени по принуда“ изглежда се случват, тъй като първата колона не е число. И така, опитах се да стартирам кода срещу dat[-1], но резултатът е същият.

Какво пропускам или правя погрешно?

Благодаря много предварително.

=== АКТУАЛИЗАЦИЯ #1 ===

Изход на str и фактор:

> str(dat)
'data.frame':   14634 obs. of  3 variables:
 $ V3 : Factor w/ 10062 levels "000880bf-6cb7-4c4a-9a9d-1c0a975b52ba",..: 7548 6585 3670 5336 9181 6429 62 410 7386 9409 ...
 $ V8 : Factor w/ 5561 levels "1000120","1000910",..: 835 3996 443 65 1289 2084 582 695 3666 4787 ...
 $ V12: Factor w/ 395 levels "100.0","101.0",..: 25 278 249 256 352 249 1 88 361 1 ...

> dat[,1] = factor(dat[,1])
> str(dat)
'data.frame':   14634 obs. of  3 variables:
 $ V3 : Factor w/ 10062 levels "000880bf-6cb7-4c4a-9a9d-1c0a975b52ba",..: 7548 6585 3670 5336 9181 6429 62 410 7386 9409 ...
 $ V8 : Factor w/ 5561 levels "1000120","1000910",..: 835 3996 443 65 1289 2084 582 695 3666 4787 ...
 $ V12: Factor w/ 395 levels "100.0","101.0",..: 25 278 249 256 352 249 1 88 361 1 ...

> dd <- dist(dat)
Warning message:
In dist(dat) : NAs introduced by coercion
> hc <- hclust(dd)                # apply hirarchical clustering
Error in hclust(dd) : NA/NaN/Inf in foreign function call (arg 11)

=== АКТУАЛИЗАЦИЯ #2 ===

Не бих искал да премахна първата колона, тъй като може да има няколко кликвания за един и същ потребител, което считам за важно за анализа.


person kikulikov    schedule 21.04.2014    source източник
comment
Можете ли да направите str(dat), за да сте сигурни, че другите колони са числа? И dist(), и kmeans() връщат грешка относно вашите числови стойности.   -  person ilir    schedule 21.04.2014


Отговори (4)


Изглежда, че искате да запазите първата колона (въпреки че 10062 нива за 14634 наблюдения са доста високи). Начинът за преобразуване на фактор в числови стойности е с функцията model.matrix. Преди да конвертирате вашия фактор:

data(iris)
head(iris)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

След model.matrix:

head(model.matrix(~.+0, data=iris))
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Speciessetosa Speciesversicolor Speciesvirginica
# 1          5.1         3.5          1.4         0.2             1                 0                0
# 2          4.9         3.0          1.4         0.2             1                 0                0
# 3          4.7         3.2          1.3         0.2             1                 0                0
# 4          4.6         3.1          1.5         0.2             1                 0                0
# 5          5.0         3.6          1.4         0.2             1                 0                0
# 6          5.4         3.9          1.7         0.4             1                 0                0

Както можете да видите, той разширява вашите факторни стойности. Така че след това можете да стартирате клъстериране на k-означава върху разширената версия на вашите данни:

kmeans(model.matrix(~.+0, data=iris), centers=3)
# K-means clustering with 3 clusters of sizes 49, 50, 51
# 
# Cluster means:
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Speciessetosa Speciesversicolor Speciesvirginica
# 1     6.622449    2.983673     5.573469    2.032653             0         0.0000000       1.00000000
# 2     5.006000    3.428000     1.462000    0.246000             1         0.0000000       0.00000000
# 3     5.915686    2.764706     4.264706    1.333333             0         0.9803922       0.01960784
# ...
person josliber♦    schedule 21.04.2014
comment
Благодаря. Бихте ли обяснили какво прави ~.+0? Разбирам резултат от това. Имам предвид какво означава всеки знак в тази операция.. - person kikulikov; 22.04.2014
comment
Ако сте използвали lm за извършване на регресия и сте използвали формулата y~.+0, бихте предсказали y, като използвате всички други променливи, без член за пресичане (. означава всички други променливи, а +0 означава без пресичане). Искаме да форматираме нашия кадър с данни, като използваме всички променливи, но без член за прихващане, така че просто изпускаме y и завършваме с ~.+0. - person josliber♦; 22.04.2014

Опитайте dat[,1] = factor(dat[,1]). Мисля, че NA е от идентификатора на сесията (първата колона), който не е номер. factor ще накара идентификатора на сесията да бъде индексиран.

person xosp7tom    schedule 21.04.2014
comment
Бих премахнал колоната изцяло, тъй като не носи информация, полезна за клъстериране в този формат (и вероятно има твърде много нива). - person ilir; 21.04.2014
comment
Съгласен съм само за информация от тази променлива, тъй като индексираното число от фактор би било просто произволно число. Въпреки това, заедно с други променливи, този индекс може да бъде полезен. Например, може да има няколко кликвания от един и същи потребител. Така че бих оставил това като негова работа. - person xosp7tom; 21.04.2014
comment
@xosp7tom благодаря. Да, не бих искал да премахна първата колона поради причината, която споменахте. За съжаление не помогна. Добавих R изход към първоначалния си въпрос. - person kikulikov; 22.04.2014

k-means работи само за непрекъснати данни.

Имате две колони id, които не трябва да се използват за клъстериране; те ще обезсмислят резултата ви.

Но дори тогава се съмнявам, че k-средните са подходящият алгоритъм за вашия проблем. Първо трябва да разберете данните си, след това да ги обработите предварително и да ги трансформирате в подходящо представяне.

Не очаквайте решение с бутон. Те не съществуват/работят.

person Has QUIT--Anony-Mousse    schedule 22.04.2014

Не използвайте колона SPECIE

km‹ - km означава (ирис[,1:4],3)

km

K-означава клъстериране с 3 клъстера с размери 50, 38, 62

Клъстер означава:

  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     5.006000    3.428000     1.462000    0.246000
2     6.850000    3.073684     5.742105    2.071053
3     5.901613    2.748387     4.393548    1.433871

Клъстерен вектор:

[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 2 3 3 3 3 3
[59] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 2 2 2 2 3 2 2 2 2 2 2 3 3 2
[117] 2 2 2 3 2 3 2 3 2 2 3 3 2 2 2 2 2 3 2 2 2 2 3 2 2 2 3 2 2 2 3 2 2 3

Сума от квадрати в клъстер по клъстер:

[1] 15.15100 23.87947 39.82097

(между_SS / общо_SS = 88,4 %)

person Mamen    schedule 17.04.2016
comment
няма видове като колона!! - person MLavoie; 17.04.2016