0

500.000 人の顧客の母集団を 12 の代表的なサンプルに分割する必要があり、毎月連絡を取る必要があります。

12 のサンプルは、製品およびこの製品のライフ サイクル クラス (A、B、C) 内の代表的なものでなければなりません。 手段: 製品 ID およびライフサイクル クラス (連結可能) ごとに階層化された比例サンプルが必要です。

また、必要なサンプルは 1 つだけではなく、母集団全体を 12 のサンプルに分割します。

結果は、階層化されたサイクル ID (1 - 12) が追加された元のテーブルになります。

フェ:

cust_id, product, lifecycle, NEW: cycle_id
10000, 4004, A, 3
10000, 2000, B, 6
10001, 3000, B, 12

1 人の顧客が複数の製品を借りることができますが、顧客と製品の組み合わせは一意です。

顧客と製品の各組み合わせは、12 サイクル内で 1 回だけ使用する必要があります (したがって、元に戻すことはできません)。

Rでこれを行うにはどうすればよいですか?

サンプル データ行:

cust_id, product, lifecycle
10000, 4004, A
10000, 2000, B
10001, 3000, B
10002, 2000, A
10004, 4004, C
...
4

1 に答える 1

0

これは醜いが機能的な解決策です。奇妙で複雑なサブセット化で申し訳ありませんが、残念ながら by() は非常に奇妙な方法でデータを保存します。

mysamp <- function(dat){
  samp <- runif(length(dat)) #get 12 random numbers
  samp <- ceiling(samp*12) #standardize between 1 and 12
  return(samp)
}

これは、母集団を 12 のサンプルに分割するために使用する関数です。ここで、「zz」がデータセットであるとします。

cust <- c(101, 101, 102, 105, 107)
prod <- c(4004, 2000, 3000, 3000, 4004)
life <- c('A', 'B', 'B', 'B', 'A')
zz <- data.frame(cust, prod, life)
prodlife <- paste0(zz$prod, zz$life)
zz <- data.frame(zz, prodlife)

あなたに与える

> zz
  cust prod life prodlife
1  101 4004    A    4004A
2  101 2000    B    2000B
3  102 3000    B    3000B
4  105 3000    B    3000B
5  107 4004    A    4004A

次に、cycle.id を入れるために 0 の列を作成する必要があります (私の例では「cyc」と呼んでいます)。zz$prodlife を追加したときと同じように、それを data.frame に添付します。次に、これらのステートメントを使用してサンプリングし、サンプルを列に割り当てることができます。

cycle <- by(newzz$cust, newzz$prodlife, mysamp)
for(i in 1:length(cycle)){
    for(j in 1: length(cycle[i][[1]])){
        zz$cyc[zz$prodlife == names(cycle)[i]][j] <- cycle[i][[1]][j]
    }
}

by() ステートメントはそこですべての作業を行っており、恐ろしい for ループはサンプリングされた値を正しい場所に割り当てているだけです。「by」クラスは不便にサブセット化されているため、この割り当てを行うためのより効率的な方法を思い付くことができませんでしたが、他の人ができるかもしれません...? いずれにせよ、これは私に与えました:

> zz
  cust prod life prodlife cyc
1  101 4004    A    4004A   6
2  101 2000    B    2000B   5
3  102 3000    B    3000B   7
4  105 3000    B    3000B   8
5  107 4004    A    4004A   1

もちろん、この例はサンプルが正しく成層化されているかどうかを判断するには小さすぎますが、うまくいくはずです。ハッピーコーディング!

于 2012-07-03T15:29:11.827 に答える