[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.
Para os casos mencionados acima, o algoritmo de divisão deve atender aos dois requisitos a seguir:
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.
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:
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.
hist(df$Remainder)
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
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.