매우 비뚤어진 카운트 데이터의 클러스터링 : 수행 할 제안 (변환 등)이 있습니까?


11

기본 문제

기본 문제는 다음과 같습니다. 매우 치우친 변수가 포함 된 데이터 세트를 개수로 묶으려고합니다. 변수는 많은 0을 포함하므로 클러스터링 절차에 대한 정보가 많지 않습니다. k- 평균 알고리즘 일 가능성이 큽니다.

예를 들어, 제곱근, 박스 콕스 또는 로그를 사용하여 변수를 변환하면됩니다. 그러나 내 변수는 범주 형 변수를 기반으로하기 때문에 변수를 범주 형 변수의 한 값을 기준으로 처리하여 다른 변수를 (범주 형 변수의 다른 값을 기준으로) 남겨두면 편향이 발생할 수 있습니다. .

좀 더 자세히 살펴 보겠습니다.

데이터 세트

내 데이터 세트는 품목 구매를 나타냅니다. 항목의 범주는 파란색, 빨간색 및 녹색과 같이 서로 다릅니다. 그런 다음 구매는 고객별로 그룹화됩니다. 이러한 각 고객은 데이터 집합의 한 행으로 표시되므로 고객에 대한 구매를 집계해야합니다.

내가하는 방법은 구매 횟수를 세는 것입니다. 항목은 특정 색상입니다. 그래서 그 대신 하나의 변수로 color, 나는 세 개의 변수와 끝까지 count_red, count_blue그리고 count_green.

다음은 예입니다.

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

사실, 나는 결국 절대 카운트를 사용하지 않고 비율 (고객 당 구매 한 모든 항목의 녹색 품목의 비율)을 사용합니다.

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    0.71    |        0.29     |       0.00      |
-----------------------------------------------------------
c1       |    0.43    |        0.57     |       0.00      |
-----------------------------------------------------------
c2       |    0.09    |        0.91     |       0.00      |
-----------------------------------------------------------
c3       |    0.31    |        0.62     |       0.08      |
-----------------------------------------------------------

결과는 같습니다 : 예를 들어 녹색 (녹색을 좋아하지 않는 사람)과 같은 내 색상 중 하나에 대해 많은 0을 포함하는 왼쪽으로 치우친 변수가 나타납니다. 결과적으로 k- 평균은이 변수에 대한 좋은 분할을 찾지 못합니다.

반면에 변수를 표준화하면 (평균 빼기, 표준 편차로 나눔) 녹색 변수는 작은 분산으로 인해 "파열"되고 다른 변수보다 훨씬 더 큰 범위에서 값을 가져옵니다. 실제보다 k- 평균에 중요합니다.

다음 아이디어는 sk (r) ewed 녹색 변수를 변환하는 것입니다.

치우친 변수 변환

제곱근을 적용하여 녹색 변수를 변형하면 조금 덜 왜곡됩니다. (여기서 녹색 변수는 혼란을 보장하기 위해 빨간색과 녹색으로 표시됩니다.)

여기에 이미지 설명을 입력하십시오

빨간색 : 원래 변수; 파란색 : 제곱근으로 변환됩니다.

이 변환의 결과에 만족한다고 가정 해 봅시다 (0은 여전히 ​​분포를 크게 왜곡하기 때문에 그렇지 않습니다). 분포가 양호 해 보이지만 이제 빨강 및 파랑 변수를 스케일해야합니까?

결론

다시 말해서, 한 가지 방법으로 녹색을 처리하면서 클러스터링 결과를 왜곡하지만 빨간색과 파란색을 전혀 처리하지 않습니까? 결국 세 가지 변수가 모두 속해 있으므로 같은 방식으로 처리하면 안됩니까?

편집하다

명확히하기 위해 : 나는 k- 평균이 카운트 기반 데이터 로 갈 있는 방법이 아니라는 것을 알고 있습니다. 그러나 내 질문은 실제로 종속 변수 처리에 관한 것입니다. 올바른 방법을 선택하는 것은 별개의 문제입니다.

내 변수의 본질적인 제약은

count_red(i) + count_blue(i) + count_green(i) = n(i)여기서 n(i)고객의 총 구매 수는 어디 입니까 i?

(또는 count_red(i) + count_blue(i) + count_green(i) = 1상대 카운트를 사용할 때도 동일 합니다.)

변수를 다르게 변환하면 제약 조건의 세 항에 다른 가중치를 부여하는 것과 같습니다. 내 목표가 고객 그룹을 최적으로 분리하는 것이라면이 제약 조건을 위반해야합니까? 아니면 "끝이 수단을 정당화합니까?"


이력서에 오신 것을 환영합니다! 첫 질문을 명확하고 잘 작성해 주셔서 감사합니다.
Silverfish

귀하의 데이터 세트를 이해하지 못했습니다. 변수 (속성)이다 count_red, count_bluecount_green데이터는 계산이다. 권리? 그렇다면 행은 무엇입니까? 그리고 당신은 품목을 묶을 것입니까?
ttnphns

행은 일반적으로 총 구매 그룹을 나타냅니다. 여러 상품을 구매 한 고객으로 생각할 수 있습니다. 더 명확하게하기 위해 샘플 데이터 세트로 질문을 업데이트했습니다.
pederpansen

"고객"을 묶고 싶습니까?
ttnphns

예. 시간 간격별로 구매를 그룹화하여 결과적으로 클러스터 시간 간격을 그룹화하려고하지만 현재는 고객입니다.
pederpansen

답변:


7

@ttnphns는 좋은 답변을 제공했습니다.

클러스터링을 잘하는 것은 종종 데이터에 대해 매우 열심히 생각하는 것입니다. 내 마음에, 데이터의 가장 기본적인 측면은 그들이이다 작곡 .

반면에, 주요 관심사는 녹색 제품에 대해 0이 많고 특히 녹색 값만 변환하여 나머지와 더 유사하게 만들 수 있는지 궁금해하는 것 같습니다. 그러나 이들은 구성 데이터이므로 한 세트의 카운트에 대해 나머지와 독립적으로 생각할 수 없습니다. 더욱이, 당신이 정말로 관심있는 것은 다른 색의 제품을 구매하는 고객의 확률이지만, 많은 사람들이 녹색 제품을 구입하지 않았기 때문에, 당신은 그 확률을 추정 할 수 없다고 걱정합니다. 이 문제를 해결하는 한 가지 방법은 고객의 예상 비율을 평균 비율로 조금씩 이동시키는 방법으로, 평균에서 얼마나 멀리 떨어져 있는지와 실제 데이터를 얼마나 많이 추정해야하는지에 따라 영향을받는 양을 변화시키는 것입니다. 확률.

아래에서는 귀하의 상황에 접근하는 한 가지 방법을 설명하기 위해 예제 데이터 세트를 사용합니다. 데이터를 읽고 행 단위 비율로 변환 한 다음 평균 비율을 열별로 계산합니다. 조정 된 수와 새로운 행별 비율을 얻기 위해 각 수에 평균을 다시 추가합니다. 이렇게하면 각 제품의 평균 비율에 대한 각 고객의 추정 비율이 조금씩 움직입니다. 더 강한 너지를 원한다면 여러 가지 수단 (예 :)을 15*mean.props대신 사용할 수 있습니다 .

d = read.table(text="id  red    blue    green
...
c3  4   8   1", header=TRUE)
tab = as.table(as.matrix(d[,-1]))
rownames(tab) = paste0("c", 0:3)
tab
#    red blue green
# c0  12    5     0
# c1   3    4     0
# c2   2   21     0
# c3   4    8     1
props = prop.table(tab, 1)
props
#           red       blue      green
# c0 0.70588235 0.29411765 0.00000000
# c1 0.42857143 0.57142857 0.00000000
# c2 0.08695652 0.91304348 0.00000000
# c3 0.30769231 0.61538462 0.07692308
mean.props = apply(props, 2, FUN=function(x){ weighted.mean(x, rowSums(tab)) })
mean.props
#        red       blue      green 
# 0.35000000 0.63333333 0.01666667 
adj.counts = sweep(tab, 2, mean.props, FUN="+");  adj.counts
#            red        blue       green
# c0 12.35000000  5.63333333  0.01666667
# c1  3.35000000  4.63333333  0.01666667
# c2  2.35000000 21.63333333  0.01666667
# c3  4.35000000  8.63333333  1.01666667
adj.props = prop.table(adj.counts, 1);  adj.props
#             red         blue        green
# c0 0.6861111111 0.3129629630 0.0009259259
# c1 0.4187500000 0.5791666667 0.0020833333
# c2 0.0979166667 0.9013888889 0.0006944444
# c3 0.3107142857 0.6166666667 0.0726190476

이것에 대한 몇 가지 결과가 있습니다. 그 중 하나는 고객이 실제로 녹색 제품을 구매 한 기록이없는 경우에도 녹색 제품 구매의 기본 확률을 0이 아닌 것으로 추정한다는 것입니다. 또 다른 결과는 이제 다소 연속적인 값을 가지지 만 원래 비율은 더 이산 적입니다. 즉, 가능한 추정치 세트가 덜 제한적이므로 유클리드 거리 제곱과 같은 거리 측정이 이제 더 의미 가있을 수 있습니다.

우리는 데이터를 시각화하여 무슨 일이 있었는지 볼 수 있습니다. 이러한 데이터는 구성 데이터이므로 실제로는 두 가지 정보 만 있으며 단일 산점도로 플롯 할 수 있습니다. 빨강 및 파랑 범주의 정보는 대부분 축으로 사용하는 것이 좋습니다. 조정 된 비율 (빨간색 숫자)이 원래 위치에서 약간 이동 된 것을 볼 수 있습니다.

windows()
  plot(props[,1], props[,2], pch=as.character(0:3),
       xlab="Proportion Red", ylab="Proportion Blue", xlim=c(0,1), ylim=c(0,1))
  points(adj.props[,1], adj.props[,2], pch=as.character(0:3), col="red")

여기에 이미지 설명을 입력하십시오

이 시점에서 데이터가 있으며 많은 사람들이 데이터를 표준화함으로써 시작합니다. 다시 말하지만, 이들은 구성 데이터이므로 표준화를 수행하지 않고 군집 분석을 실행합니다.이 값은 이미 비례하여 표준화하면 일부 관계형 정보가 손상됩니다. 사실, 줄거리를 보면 실제로 한 차원의 정보 만 있다고 생각합니다. (적어도 샘플 데이터 집합에서는 실제 데이터 집합이 다를 수 있습니다.) 비즈니스 관점에서 볼 때 녹색 제품을 구매할 가능성이 큰 사람들을 별개의 고객 집단으로 인식하는 것이 중요하다고 생각합니다. 첫 번째 주성분 (이 데이터 세트의 분산의 99.5 %를 차지함)에서 점수를 추출하고이를 군집화합니다.

pc.a.props = prcomp(adj.props[,1:2], center=T, scale=T)
cumsum(pc.a.props$sdev^2)/sum(pc.a.props$sdev^2)
# [1] 0.9946557 1.000000
pc.a.props$x
#           PC1         PC2
# c0 -1.7398975 -0.03897251
# c1 -0.1853614 -0.04803648
# c2  1.6882400 -0.06707115
# c3  0.2370189  0.15408015
library(mclust)
mc = Mclust(pc.a.props$x[,1])
summary(mc)
# ----------------------------------------------------
# Gaussian finite mixture model fitted by EM algorithm 
# ----------------------------------------------------
# 
# Mclust E (univariate, equal variance) model with 3 components:
# 
#  log.likelihood n df       BIC       ICL
#       -2.228357 4  6 -12.77448 -12.77448
# 
# Clustering table:
# 1 2 3 
# 1 2 1 

+1은 구성 데이터임을 인식했지만 컴포지션에 표준 변환 기술을 사용하지 않는 이유는 무엇입니까? 이 이상한 "평균 조정 카운트"아이디어 대신 데이터? 그것은 나에게 특별 해 보입니다. 이것 또는 이와 비슷한 것에 대한 특별한 언급이 있습니까? 단순한 중심 로그 비율 변환 후 변환 된 데이터의 첫 번째 PC 점수를 클러스터링하는 것보다 이것이 더 나은 이유는 무엇입니까? (이것은 작곡가 데이터 분석 응용 프로그램의 합리적인 검토자가 요구할 것입니다)
usεr11852

감사합니다, @ usεr11852. > 2이지만 유한 한 옵션은 다항식입니다. 이것은 이전디 리클 렛 (공 액체 )이있는 (1 가지 형태의 실험적) 베이지안 분석 입니다. 다른 옵션도 가능합니다. 그러나 비율이 0으로 어떻게 작동하는지 즉시 알 수는 없습니다.
gung-복직 모니카

2
링크 주셔서 감사합니다. 구성 요소 차원이 0이 아닌 단일 값을 갖는 경우 가산 로그 비율 변환에 사용할 수 있습니다 (명백한 대치 개념 제외; 여기 주석 참조 ). CLR은 기하 평균을 사용하기 때문에 꺼져 있습니다. "제로 팽창 된 구성 데이터"에 대한 연구가 있었다; 예를 들어 여기 , 여기여기를 참조 하십시오 .
usεr11852

1
나보다이 주제에 대해 더 많이 알고있는 것 같습니다. @ usεr11852. 내 대답은 실제로 상황의 본질에 대한 이러한 사실을 명시 적으로 / 문제를 제기하고 예비 제안을 제공하려고했습니다. 왜 자신의 (더 나은 정보) 답변을 제공하지 않습니까?
gung-복직 모니카

7

변수가 함께 속해 있기 때문에 변수를 개별적으로 변환하는 것이 현명하지 않습니다 (알 수 있듯이). .

당신의 장소에서, 나는 카운트를 포함하는 변수를 기반으로 모든 고객 쌍 사이의 카이 제곱 거리 (카운트에 완벽한)를 계산할 것입니다. 그런 다음 계층 적 군집화 (예 : 평균 연계 방법 또는 완전한 연계 방법-중심을 계산하지 않으므로 유클리드 거리가 필요하지 않음) 또는 임의의 거리 행렬로 작업하는 다른 클러스터링을 수행하십시오.

질문에서 예제 데이터 복사 :

-----------------------------------------------------------
customer | count_red  |    count_blue   | count_green     |
-----------------------------------------------------------
c0       |    12      |        5        |       0         |
-----------------------------------------------------------
c1       |     3      |        4        |       0         |
-----------------------------------------------------------
c2       |     2      |       21        |       0         |
-----------------------------------------------------------
c3       |     4      |        8        |       1         |
-----------------------------------------------------------

쌍을 고려 c0하고 c1및 계산 카이 제곱 자신에 대한 통계를 2x3주파수 테이블. 평범한 유클리드 거리를 계산할 때처럼 제곱근을 취하십시오. 그것은 당신의 거리입니다. 거리가 0에 가까우면 두 고객이 비슷합니다.

그것은 당신의 테이블에있는 행의 합계가 다르다는 것을 당신을 귀찮게 수 있으며, 당신이 비교할 때 그래서 카이 제곱 거리에 영향을 미치는 c0c1c0c2. 그런 다음 파이 제곱 거리 의 근을 계산하십시오 . Phi-sq = Chi-sq/N여기서 N현재 고려되는 두 행 (고객)의 총계 수입니다. 따라서 전체 카운트까지의 거리 wrt가 정규화됩니다.

Here is the matrix of sqrt(Chi-sq) distance between your four customers
 .000   1.275   4.057   2.292
1.275    .000   2.124    .862
4.057   2.124    .000   2.261
2.292    .862   2.261    .000

And here is the matrix of sqrt(Phi-sq) distance 
.000    .260    .641    .418
.260    .000    .388    .193
.641    .388    .000    .377
.418    .193    .377    .000

따라서, 데이터의 임의의 두 열 사이의 거리는 상기 (평방. 루트) 인 카이 또는 피 평방 통계2 x p주파수 테이블 ( p데이터의 열들의 수이다). 현재 2 x p테이블 의 열 이 0으로 완료되면 해당 열을 잘라 내고 0이 아닌 나머지 열을 기준으로 거리를 계산하십시오 (예, SPSS가 거리를 계산할 때 수행하는 방식). 카이-제곱 거리는 실제로 가중 유클리드 거리입니다.


이 정교한 답변에 감사드립니다. K-means (암시 적 유클리드 거리)가이 유스 케이스에 올바른 선택입니까? 나는 그것이 아닌 것으로 의심하고 당신은 그것을 확인했습니다. 그러나 나는 여전히 왜 그런지 이해하지 못한다 . 1) 왜 카이-제곱 (또는 제곱-제곱) 거리가 카운트 데이터에 적합한 선택일까요? 2) 내 원래의 질문으로 돌아온다 : 왜 모든 변수가 "함께 속해있는 것"이외의 다른 방식으로 취급되어야하는 좋은 (수학적 / 임시적) 주장이 있는가?
pederpansen

고객이 한 번 구매할 때 세 가지 색상 중에서 선택합니다. 세 가지 색상은 개념적으로 독립적 인 "변수"가 아닙니다. 또한 귀하의 데이터는 중요합니다. 카이 제곱 기반 측정 값이 최적이어야한다는 것이 즉시 분명했습니다. 마지막 요점과 관련하여 다시 물어볼 수 있습니다. 왜 다른 치료를 받아야합니까? A는 클러스터링 작업을 수행 할 수있는 솔루션을 제공했습니다. 마음에 들지 않는 부분이나 의심스러운 부분이 있습니까?
ttnphns

2
나는 또한 k- 평균 (분산 최소화)이 갈 길이라고 생각하지 않습니다. k- 평균은 means를 사용 합니다 . 데이터는 정수이며 많은 0이 있습니다. 군집 중심은 정수가 아니며 0이 거의 없습니다. 데이터 포인트 완전히 다른데 어떻게 대표 할 수 있습니까? 결론 : k- 평균에 맞게 데이터를 변환하기 위해 싸우지 마십시오. 문제를 이해하고 다른 방법이 아닌 알고리즘을 문제에 맞 춥니 다. 당신은 K-수단 문제에 데이터를 맞는 경우, 여전히 잘못된 문제가있을 수 있습니다 ...
Anony - 무스 - 종료 될

1
변수를 표준화하여 분산을 동일하게 만들면 데이터 테이블 열의 총계를 같게하는 것과 거의 같습니다. 비대칭을 변환 할 때 테이블에서 더 크지 만 더 적은 수를 늘리는 것과 거의 같습니다. 당신이 그것을 할 수도 있고 (그 후에도 내가 제안한 것처럼 chi 또는 phi를 계산할 수도 있습니다), 그러나 당신은 원본 데이터를 왜곡했음을 인식하십시오. 그것이 보증 되었습니까? 귀중한 정보를 발견하고 숨기지 않았습니까? 데이터를 고문 할 필요가 없었습니까? 결국, 당신은 이러한 성찰을 결정하는 유일한 사람입니다.
ttnphns

2
부적절한 정규화를 통해 기본 속성을 쉽게 파괴 할 수 있습니다. 예를 들어 각 행에서 데이터의 합계가 1이면 각 열을 정규화하면이 속성이 삭제됩니다. 이러한 데이터에서는 예를 들어 분기 측정 (분포 거리)을 고려해야합니다. 데이터를 계산할 때 Jaccard와 같은 설정된 교차 측정 값이보다 유익 할 수 있습니다. 그러나 이진 벡터가 필요합니다. 기타
종료-익명-무스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.