Como dividir aleatoriamente uma base de usuários usando o Módulo

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

[ad_1]

[This article was first published on R – Predictive Hacks, and kindly contributed to R-bloggers]. (Você pode relatar problemas sobre o conteúdo desta página aqui)


Quer compartilhar seu conteúdo em R-bloggers? clique aqui se você tiver um blog, ou aqui se não tiver.

Em muitos casos, é necessário dividir uma base de usuários em 2 ou mais depósitos. Por exemplo:

  • UCG: Muitas empresas que realizam campanhas promocionais, a fim de quantificar e avaliar o desempenho das campanhas, criam um Grupo de Controle Universal (UCG) que é uma amostra aleatória da base de usuários e não recebe nenhuma oferta ou mensagem.
  • Bucketize: Para fins de teste, é comum dividir a base de usuários em depósitos para poder compará-los a longo prazo.
  • Amostras para aprendizado de máquina: Uma base de usuários pode se tornar muito grande para que um modelo de aprendizado de máquina seja executado e, por esse motivo, é comum obter amostras aleatórias.

Os requisitos

Para os casos mencionados acima, o algoritmo de divisão deve atender aos dois requisitos a seguir:

  1. Deve haver uma função de mapeamento para que toda vez que encontrarmos um Usuário existente a ser atribuído ao mesmo grupo. Por exemplo, se o ID do usuário 152514 foi inicialmente atribuído ao UCG, então sempre será ao grupo UCG.
  2. Deve haver uma função de mapeamento para que cada novo usuário a ser atribuído a um grupo.

Podemos cumprir os requisitos acima aplicando a operação de módulo.

Exemplo de divisão da base de usuários com módulo

Vamos ver como podemos dividir o Userbase em dois depósitos. Digamos que queremos o 20% dos usuários em UCG e o resto 80% ser estar Ao controle. Normalmente, os UserIDs serão criptografados, de acordo com a conformidade com o GDPR. Abaixo, geramos alguns dados aleatórios:

library(tidyverse)
library(digest)
library(Rmpfr)
set.seed(5)


df%rowwise%>%mutate(Hash_Name = digest(paste(sample(LETTERS, 10, replace = TRUE), collapse = ""), 
                                             algo="md5", serialize=F),
                          Event_Date = lubridate::as_datetime( runif(1, 1546290000, 1577739600)))


head(df)

Resultado:

# A tibble: 6 x 3
# Rowwise: 
  Row_Number Hash_Name                        Event_Date         
                                                 
1          1 275db34231203750f10adb24c76b9619 2019-06-10 06:15:33
2          2 9a449c58ac6baed3b3648f0f3b5f8084 2019-03-27 21:38:34
3          3 e28e89ab554739a982c862cccf024464 2019-12-02 15:43:48
4          4 45b9aea890d3b98419cae72bb497e94b 2019-10-18 18:58:23
5          5 c4ce7434621d08f5195fbd1bfc1c20c2 2019-08-09 06:14:45
6          6 0b8a304be1015cacfcf31dd40ef6a381 2019-04-10 08:07:28

Para gerar números aleatórios, é melhor escolher o número primo para a operação do módulo. Para este exemplo, tomaremos o 997 que é um número primo. A outra coisa que precisamos fazer é converter o Hashed MD5 em numérico. Podemos fazer isso com o Rmpfr biblioteca em R. Resumindo:

  • Vamos converter o MD5 para numérico
  • Vamos dividir o número acima por 997 e vamos guardar o resto
df$Remainder 


Is it Random

This approach generates pseudo-random numbers. Let’s see if the distribution of the numbers (from 0 to 996) is random.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
hist(df$Remainder)
Como dividir aleatoriamente uma base de usuários usando o Módulo 1

Podemos aplicar um teste de qui-quadrado também.

chisq.test(table(df$Remainder))

Resultado:

	Chi-squared test for given probabilities

data:  table(df$Remainder)
X-squared = 995.2, df = 996, p-value = 0.5012

O O valor P é 0,5012 o que implica que os números gerados podem ser considerados aleatórios.

Agora, podemos dividir nosso UB em UCG e Ao controle do seguinte modo:

Se o restante for inferior a 200, então o UCG, caso contrário, Controle

df$Group 






Como dividir aleatoriamente uma base de usuários usando o Módulo 2

Verifique as proporções

Finalmente, queremos ter certeza de que a proporção é 80% vs 20% para Controle e UCG, respectivamente.

prop.table (table (df $ Group))

Resultado:

Control     UCG 
0.80002 0.19998 

Conclusão

Podemos usar a função módulo para dividir uma base de usuários de forma reproduzível e eficiente.



[ad_2]

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
Leia Também  Pequenas funções R inúteis e úteis - R Lorem Ipsum