Analisando a rotatividade com chaid

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


[Esteartigofoipublicadopelaprimeiravezem[Thisarticlewasfirstpublishedon Publicações no R Lover! um programador, e gentilmente contribuiu para os R-blogueiros]. (Você pode relatar um problema sobre o conteúdo desta página aqui)


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.

Este post tenta realizar várias coisas de forma concisa. Estou disponibilizando uma
nova função (chaid_table()) dentro do meu próprio
CGPfunctions pacote,
revisando algumas opções gráficas e revisitando nosso velho amigo CHAID – Chi
Ao quadrado ( chi ^ 2 ) Detecção de interação automatizada – para analisar a modelagem de um “real
mundo”
problema de negócios.

É baseado em uma postagem no blog
Learning Machines e investiga clientes
rotatividade para um provedor sem fio. A postagem original do blog faz um bom trabalho de
descrevendo um pacote chamado rattle e como foi usado. Eu vou usar
RStudio com uma variedade de pacotes que mencionarei ao longo do caminho.

A situação é extraída do livro Métodos Quantitativos de Gerenciamento. UMA
Abordagem prática
, (Autores: Canela, Miguel Angel; Alegre, Inés; Ibarra,
Alberto)
e os dados estiverem disponíveis ao público, você pode acessá-los de suas
Repositório do Github como churn.csv e salve-o em um diretório de sua escolha. Estavam
sendo solicitado a imaginar que somos um provedor sem fio e temos uma amostra de 5.000
clientes com 13 possíveis variáveis ​​preditoras, um número de identificação exclusivo e dados
sobre se um cliente (Sim) nos deixou por um provedor diferente ou ficou
conosco (não).

Os preditores são uma boa mistura de coisas que podemos saber sobre nossos clientes, como
há muito tempo que eles estão conosco, que tipo de dados e plano de ligações internacionais
eles têm, com que frequência nos chamam para suporte, com que frequência chamam outros
clientes nossos, etc., etc. A postagem original do blog tem uma mesinha agradável
listando todas as variáveis ​​que não reproduzirei aqui.

Parece que no livro eles adotaram uma abordagem clássica de regressão linear, e o
a postagem do blog se baseia em um modelo clássico de árvore de decisão. Ambas as abordagens conhecidas
com muitos apoiadores. Como eu escrevi antes
Eu realmente amo CHAID como uma ferramenta inicial de modelagem e explicação. Não necessariamente
porque é o mais preciso, ou o mais rápido, ou o mais moderno, mas bastante
porque é fácil explicar ao nosso cliente comercial, fácil
entender os resultados, fácil de usar e faz muito poucas suposições sobre o
natureza de nossos dados.

Nosso objetivo

Vamos imaginar que esta é a nossa primeira tentativa de usar os dados que temos disponíveis
prever “rotatividade” e procurar oportunidades para reduzi-la. Note que é
também é bom em um ambiente de negócios para evitar custos desnecessários e reduzir o desperdício. então
sim, obviamente, gostaríamos de impedir que as pessoas abandonassem nosso serviço
e procure maneiras possíveis de retê-las. Também gostaríamos de evitar
gastar dinheiro ou recursos para induzir as pessoas a ficar quando há muito pouco
probabilidade de eles partirem. Em outras palavras, estamos quase igualmente interessados ​​em
prever quem partirá e quem ficará.

Eu também pressionaria o caso de que, uma vez que esta é nossa primeira tentativa de modelagem, e
é provável que explicemos nossos resultados para pessoas que não falam nativamente
sobre “valores de p” ou “árvores de decisão” ou “precisão do modelo” nos quais devemos nos concentrar
ser capaz de explicar claramente nossos resultados, em vez de focar em quão profundo vamos ou
quão totalmente preciso é o nosso modelo.

Para este post, exploraremos uma situação relativamente superficial CHAID modelo
e algumas ferramentas para explorar os resultados em formato tabular e gráfico. Ler
em! Direi novamente abaixo, mas comentários e críticas são sempre bem-vindos via
disqus ou email. Você não terá problemas para encontrar os links dos ícones em alguns
locais.

Vamos carregar dplyr e CHAID (o que exige partykit) e pegue o conjunto de dados
do github.

library(dplyr)
library(ggplot2)
theme_set(theme_bw())
library(forcats)
library(ggmosaic)
# library(ggrepel)
# install.packages("partykit")
# install.packages("CHAID", repos="http://R-Forge.R-project.org")
library(CHAID)
# devtools::install_github("ibecav/CGPfunctions", build_vignettes = TRUE)
library(CGPfunctions)
library(knitr)
# churn <- read.csv("https://raw.githubusercontent.com/quants-book/CSV_Files/master/churn.csv")
churn <- read.csv("churn.csv")
str(churn)
## 'data.frame':    5000 obs. of  15 variables:
##  $ ID      : Factor w/ 5000 levels "350-1149","350-1404",..: 2915 4687 2525 2883 3989 1281 2466 1968 3481 4789 ...
##  $ ACLENGTH: int  77 105 121 115 133 95 50 157 35 96 ...
##  $ INTPLAN : int  0 0 0 0 0 0 1 0 0 0 ...
##  $ DATAPLAN: int  0 0 1 0 1 1 0 1 1 0 ...
##  $ DATAGB  : Factor w/ 7 levels "0","1.5G","100M",..: 1 1 2 1 2 7 1 6 7 1 ...
##  $ OMMIN   : num  80.8 131.8 212.1 186.1 166.5 ...
##  $ OMCALL  : int  70 66 57 64 61 85 96 73 56 99 ...
##  $ OTMIN   : num  166 132 195 231 176 ...
##  $ OTCALL  : int  67 105 140 125 74 98 73 71 77 99 ...
##  $ NGMIN   : num  18.6 5.1 14.9 26.5 36.1 11.1 34.5 15.3 21.6 12.4 ...
##  $ NGCALL  : int  6 6 14 16 11 2 10 8 7 2 ...
##  $ IMIN    : num  9.5 6.7 28.6 9.9 5.3 0 18.4 11.3 0 5.2 ...
##  $ ICALL   : int  4 2 8 4 2 0 7 3 0 2 ...
##  $ CUSCALL : int  1 0 1 1 1 1 1 3 0 0 ...
##  $ CHURN   : int  0 0 0 0 0 1 1 0 1 0 ...

Preparando os dados

Ok, temos os dados que precisamos.
A postagem original do blog
faz um bom trabalho falando sobre os dados brutos e explorando distribuições. Eu estou
não vou repetir esse trabalho aqui. Vou simplesmente focar no que precisamos fazer para
prepare-o para nossa análise CHAID.

Leia Também  StyloPay seleciona Tribe Payments para oferta global de carteira digital

As variáveis INTPLAN, DATAPLANe CHURN estão atualmente armazenados como
números inteiros 0/1, vamos torná-los verdadeiros fatores e rotulá-los como Não / Sim, respectivamente
apenas para maior clareza. Faremos isso com um mutate_at comando.

DATAGB precisa de um pouco de limpeza. Ele é armazenado como um fator, mas o pedido está errado
porque era inicialmente uma cadeia de caracteres. Muito mais conveniente para armazená-lo como
um fator ordenado e especifique a ordem correta. Você pode reordenar usando a base R
mas eu vou usar forcats::fct_relevel como um código de limpeza mais claro.

O restante das variáveis ​​são números reais ou números inteiros. Estes foram
vai converter em fatores, cortando-os em cinco mais ou menos iguais
caixas por variável. Também usaremos pedidos e rótulos consistentes ("Baixo",
“MedLow”, “Medium”, “MedHigh”, “High”). Para uma discussão muito mais longa sobre isso
veja meu artigo anterior.

Mas primeiro temos CUSCALL, que não deseja ser dividido em cinco compartimentos, para que
faça 4 escaninhos e identifique-os claramente ("0", "1", "2" e "Mais de 2") usando
fct_lump a partir de forcats.

NB: Existe uma diferença real entre como os fatores e os fatores ordenados são
manipulado por CHAID porque existem diferenças entre nominal e
variáveis ​​ordinais. Os fatores podem ser divididos de qualquer maneira. Fatores ordenados
sempre terá a sequência respeitada, assim você não poderá dividir 1: 5, pois
1, 2 e 5 vs 3 e 4. Verifique se você sabe qual deseja usar e por quê.

Nosso código e o quadro de dados resultante são assim.

churn % mutate_at(c("INTPLAN", "DATAPLAN", "CHURN"), 
                      factor, 
                      labels = c("No", "Yes"))

churn$DATAGB <- as.ordered(forcats::fct_relevel(churn$DATAGB, 
                                                "0", 
                                                "100M", 
                                                "250M", 
                                                "500M", 
                                                "1G", 
                                                "1.5G", 
                                                "2G"))

table(churn$DATAGB)
## 
##    0 100M 250M 500M   1G 1.5G   2G 
## 3449   74  168  291  410  522   86
churn$CUSCALL <- as.ordered(fct_lump(as_factor(churn$CUSCALL), 
                                     other_level = "More than 2"))

table(churn$CUSCALL)
## 
##           0           1           2 More than 2 
##        1095        1680        1277         948
churn % 
  mutate_if(is.numeric, 
            ~ ggplot2::cut_number(., 
                                  n=5,
                                  labels = FALSE)
            ) %>%
  mutate_if(is.integer,
            ~ factor(.,
                     labels = c("Low", "MedLow", "Medium", "MedHigh", "High"),
                     ordered = TRUE)
            )

churn % select(-ID)
str(churn)
## 'data.frame':    5000 obs. of  14 variables:
##  $ ACLENGTH: Ord.factor w/ 5 levels "Low"<"MedLow"<..: 2 3 4 4 4 3 1 5 1 3 ...
##  $ INTPLAN : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 2 1 1 1 ...
##  $ DATAPLAN: Factor w/ 2 levels "No","Yes": 1 1 2 1 2 2 1 2 2 1 ...
##  $ DATAGB  : Ord.factor w/ 7 levels "0"<"100M"<"250M"<..: 1 1 6 1 6 4 1 7 4 1 ...
##  $ OMMIN   : Ord.factor w/ 5 levels "Low"<"MedLow"<..: 1 1 4 3 3 4 2 1 3 3 ...
##  $ OMCALL  : Ord.factor w/ 5 levels "Low"<"MedLow"<..: 3 2 2 2 2 4 5 3 2 5 ...
##  $ OTMIN   : Ord.factor w/ 5 levels "Low"<"MedLow"<..: 2 1 3 4 2 3 2 1 2 3 ...
##  $ OTCALL  : Ord.factor w/ 5 levels "Low"<"MedLow"<..: 1 4 5 5 1 3 1 1 2 3 ...
##  $ NGMIN   : Ord.factor w/ 5 levels "Low"<"MedLow"<..: 3 1 3 4 5 2 5 3 4 2 ...
##  $ NGCALL  : Ord.factor w/ 5 levels "Low"<"MedLow"<..: 2 2 5 5 4 1 3 2 2 1 ...
##  $ IMIN    : Ord.factor w/ 5 levels "Low"<"MedLow"<..: 3 2 5 3 2 1 5 3 1 2 ...
##  $ ICALL   : Ord.factor w/ 5 levels "Low"<"MedLow"<..: 4 2 5 4 2 1 5 3 1 2 ...
##  $ CUSCALL : Ord.factor w/ 4 levels "0"<"1"<"2"<"More than 2": 2 1 2 2 2 2 2 4 1 1 ...
##  $ CHURN   : Factor w/ 2 levels "No","Yes": 1 1 1 1 1 2 2 1 2 1 ...

Construa o modelo

Agora que temos os dados organizados da maneira que queremos, podemos deixar CHAID Faz
é isso e nos diga o que queremos saber. Que combinação dos nossos 13
variáveis ​​preditoras melhor explicam ou prevêem por que nossos clientes estão nos deixando (ou
como mencionei antes, quais clientes têm mais probabilidade de ficar). Do jeito que faz
isso é diabolicamente simples e elegante. Para todos os 13 preditores, ele executa um ( chi ^ 2 )

teste de independência (também conhecido como associação) entre o preditor e nosso resultado
churn. Ao contrário de outros modelos de árvore, pode ser uma divisão de várias maneiras. Será
calcular um valor p para todas essas divisões possíveis (consulte a nota acima sobre ordinal
versus divisões nominais) e escolha a divisão de todas as divisões possíveis com o
menor valor de p ajustado de Bonferroni. Essa é a explicação mais simples, por favor
Veja o ?chaid página de ajuda para detalhes completos.

Só para terminar as longas passagens de texto e porque eu sou um aprendiz visual, vamos
faça um enredo em mosaico usando ggmosaic de
CUSCALL vs CHURN. Nós até fazemos um pouco de mágica para exibir a porcentagem de
rotatividade nas categorias de CUSCALL. chaid vai testar não só isso 4 x 2
tabela, mas também veja se combinar categorias adjacentes é uma divisão melhor.

p <- 
  ggplot(data = churn) + 
  geom_mosaic(aes(x = product(CUSCALL), fill = CHURN))

xxx <- ggplot_build(p)$data[[1]]

XXX % 
  group_by_at(vars(ends_with("__CUSCALL"))) %>% 
  mutate(NN = sum(.wt)) %>% 
  mutate(pct = paste0(round(.wt/NN*100, 1), "%")) %>% 
  select(-(xmin:weight))

p + geom_text(data = xxx, 
              aes(x = (xmin + xmax)/2, 
                  y = (ymin + ymax)/2, 
                  label = XXX$pct)) + 
  labs(y = NULL, 
       x = "Number of Customer Calls",
       title = "Amount of Churn by # of Customer Calls") +
  scale_y_continuous(labels = scales::label_percent(accuracy = 1.0),
                     breaks = seq(from = 0, 
                                  to = 1, 
                                  by = 0.10),
                     minor_breaks = seq(from = 0.05, 
                                        to = 0.95, 
                                        by = 0.10))

Claramente, visualmente, algo está acontecendo, mas vamos deixar o algoritmo decidir o que
as melhores divisões são. Ele continuará até ficar sem significantes
divisões ou outros critérios que definimos, como o tamanho dos compartimentos ou o número
de níveis que queremos no modelo.

Como estamos fingindo que é a primeira vez que utilizamos os dados, e como
queremos recomendações claras e fáceis de entender para fornecer aos líderes de negócios
agir, vamos dizer chaid limitar-se a apenas três "níveis" de
predição. Se você deseja entender melhor o que pode mudar para controlar
o modelo chaid eu sugiro que você volte para
um dos meus posts anteriores aqui.

Vamos construir um "solução" e colocá-lo em um objeto chamado solution e depois
imprima e plote-o usando os métodos internos de partykit.

solution <- CHAID::chaid(CHURN ~ ., 
                         data = churn,
                         control = chaid_control(maxheight = 3))

print(solution)
## 
## Model formula:
## CHURN ~ ACLENGTH + INTPLAN + DATAPLAN + DATAGB + OMMIN + OMCALL + 
##     OTMIN + OTCALL + NGMIN + NGCALL + IMIN + ICALL + CUSCALL
## 
## Fitted party:
## [1] root
## |   [2] INTPLAN in No
## |   |   [3] CUSCALL in 0
## |   |   |   [4] OMMIN in Low: No (n = 206, err = 3.4%)
## |   |   |   [5] OMMIN in MedLow, Medium, MedHigh: No (n = 593, err = 7.4%)
## |   |   |   [6] OMMIN in High: No (n = 179, err = 15.6%)
## |   |   [7] CUSCALL in 1
## |   |   |   [8] OMMIN in Low, MedLow: No (n = 577, err = 6.4%)
## |   |   |   [9] OMMIN in Medium, MedHigh: No (n = 597, err = 10.9%)
## |   |   |   [10] OMMIN in High: No (n = 330, err = 19.1%)
## |   |   [11] CUSCALL in 2
## |   |   |   [12] OMMIN in Low, MedLow: No (n = 466, err = 8.4%)
## |   |   |   [13] OMMIN in Medium, MedHigh, High: No (n = 679, err = 19.0%)
## |   |   [14] CUSCALL in More than 2
## |   |   |   [15] OMMIN in Low, MedLow, Medium: No (n = 516, err = 20.0%)
## |   |   |   [16] OMMIN in MedHigh, High: No (n = 334, err = 36.8%)
## |   [17] INTPLAN in Yes
## |   |   [18] OMMIN in Low, MedLow
## |   |   |   [19] OMCALL in Low, MedLow, Medium: No (n = 186, err = 46.2%)
## |   |   |   [20] OMCALL in MedHigh, High: Yes (n = 32, err = 21.9%)
## |   |   [21] OMMIN in Medium, MedHigh, High
## |   |   |   [22] IMIN in Low, MedLow, Medium: No (n = 33, err = 45.5%)
## |   |   |   [23] IMIN in MedHigh, High: Yes (n = 272, err = 25.0%)
## 
## Number of inner nodes:     9
## Number of terminal nodes: 14
plot(solution,
  main = "churn dataset, maxheight = 3",
  gp = gpar(
    lty = "solid",
    lwd = 2,
    fontsize = 8
  ))

Com uma taxa de rotatividade geral de cerca de 20%, podemos ver que mesmo este simples chaid

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

Esse modelo nos dá uma imagem muito mais clara de onde estão nossos riscos e oportunidades.
(Um lembrete de que você pode revisar como interpretar a saída de impressão e plotagem
aqui.) Podemos identificar centenas de
clientes que apresentam pouco risco de mudar de operadora no lado esquerdo da
traçar e, inversamente, vários pontos de acesso de alto risco para a direita com o
previsão de rotatividade aproximada de 80%!

Faz sentido neste momento verificar a precisão do nosso modelo. se nós fossemos
principalmente interessado em espremer o máximo de precisão possível
siga a abordagem que demonstro aqui
mas para um primeiro passo muito simples, fico feliz em sacrificar detalhes e a
risco de excesso de ajuste pela simplicidade deste projeto e pela facilidade com
onde podemos fazer sugestões para alterar as práticas de negócios.

caret::confusionMatrix(predict(solution), churn$CHURN)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   No  Yes
##        No  3957  739
##        Yes   75  229
##                                           
##                Accuracy : 0.8372          
##                  95% CI : (0.8267, 0.8473)
##     No Information Rate : 0.8064          
##     P-Value [Acc > NIR] : 1.013e-08       
##                                           
##                   Kappa : 0.2948          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.9814          
##             Specificity : 0.2366          
##          Pos Pred Value : 0.8426          
##          Neg Pred Value : 0.7533          
##              Prevalence : 0.8064          
##          Detection Rate : 0.7914          
##    Detection Prevalence : 0.9392          
##       Balanced Accuracy : 0.6090          
##                                           
##        'Positive' Class : No              
## 

Como no post original, podemos dizer claramente à nossa equipe de gerenciamento que
É necessário um foco adicional em nossos clientes que possuem planos de ligações internacionais.

Mais com o que temos

eu tenho que dar partykit crédito, o print e plot métodos embalar um monte de
informações em algum espaço eficiente. Mas eles também me deixam querendo
informações, especialmente no que diz respeito aos "nós internos". Para ser justo, parte de
o problema é que chaid é um pouco velho e não tira o máximo proveito de
partykit mas, independentemente de ser um grande fã de recuperar um objeto, posso fazer mais
análise em.

Foi o que eu disse a mim mesma quando comecei a escrever uma função que chamei
chaid_table(). É preciso nosso solution objeto e converte-o em um tibble

que está repleto de informações sobre nossa análise / modelo.

Uma rápida olhada nas 5 primeiras linhas deve fornecer uma idéia do que está lá.
Esperançosamente nodeID, parent, NodeN, Noe Yes são óbvias. Observe que
“No” e “yes” são realmente retirados dos níveis da variável de resultado, portanto
irá corresponder aos seus dados. "Ruletext" é um resumo simples em inglês da regra completa
para chegar neste nó. “Split.variable” é a variável que será usada para
divida o nó atual e produza nós filhos.

"Chisq" é óbvio, "df" é o grau de liberdade, "ajustadop" é o valor de p
após a correção bonferroni enquanto "valor bruto" é o valor não corrigido. o
colunas de regra de divisão são o código R que produziria a divisão.

review_me <- CGPfunctions::chaid_table(solution)

kable(review_me[1:5, ])
nodeIDpaiNãosimruletextsplit.variablechisqdfajustadoprawpvaluesplitrulesplit1split2split3
1N / D50004032968N / DINTPLAN715.7097310,00000000,00e + 00N / DN / DN / DN / D
2144773839638INTPLAN é "Não"CUSCALL149.7845530,00000000,00e + 00% INTPLAN em% c ('Não')% INTPLAN em% c ('Não')N / DN / D
3297889979INTPLAN é 'Não' e CUSCALL é '0'OMMIN20.2164820.00024454.07e-05INTPLAN% em% c ('Não') e CUSCALL% em% c ('0')% INTPLAN em% c ('Não')CUSCALL% em% c ('0')N / D
432061997INTPLAN é 'Não' e CUSCALL é '0' e OMMIN é 'Baixo'N / DN / DN / DN / DN / DINTPLAN% em% c ('Não') e CUSCALL% em% c ('0') e OMMIN% em% c ('Baixo')% INTPLAN em% c ('Não')CUSCALL% em% c ('0')OMMIN% em% c ("baixo")
5359354944INTPLAN é 'Não' e CUSCALL é '0' e OMMIN é 'MedLow', 'Médio', 'MedHigh'N / DN / DN / DN / DN / DINTPLAN% em% c ('Não') e CUSCALL% em% c ('0') e OMMIN% em% c ('MedLow', 'Médio', 'MedHigh')% INTPLAN em% c ('Não')CUSCALL% em% c ('0')OMMIN% em% c ('MedLow', 'Medium', 'MedHigh')

A melhor parte do IMHO sobre esse formato de petição é que você pode pedir aos lotes de dados
perguntas adicionais em um dplyr gasoduto. aqui estão dois óbvios:

  1. Qual a porcentagem de clientes que estão saindo se tiverem um internacional
    planejar versus não? (14% versus 63%)

  2. Você pode fornecer uma lista ordenada de onde nossas rotatividade têm maior probabilidade de ocorrer?
    (é claro - nos permite tomar boas decisões de negócios. Por exemplo, enquanto
    o nó 20 tem mais rotatividade em 78%, existem apenas 30 pessoas nesse nó
    enquanto o # 23 tem um pouco menos rotatividade e muito mais pessoas a influenciar.)

# Question #1 
review_me %>%
  select(nodeID:ruletext) %>%
  mutate(pctLeaving = Yes/NodeN * 100) %>% 
  filter(parent == 1) %>%
  kable(digits = 1, caption = "Question #1 answer")
(#tab: chaid_table4) Resposta da pergunta nº 1
nodeIDpaiNãosimruletextpctLeaving
2144773839638INTPLAN é "Não"14,3
171523193330INTPLAN é "Sim"63,1
# Question #2  
review_me %>%
  select(nodeID:split.variable) %>%
  mutate(pctLeaving = Yes/NodeN * 100) %>% 
  filter(is.na(split.variable)) %>%
  select(-parent, -split.variable) %>%
  arrange(desc(pctLeaving)) %>%
  kable(digits = 1, caption = "Question #2 answer")
(#tab: chaid_table4) Resposta da pergunta nº 2
nodeIDNãosimruletextpctLeaving
2032.725INTPLAN é "Sim" e OMMIN é "Baixo", "MedLow" e OMCALL é "MedHigh", "Alto"78,1
2327268204INTPLAN é 'Sim' e OMMIN é 'Médio', 'MedHigh', 'Alto' e IMIN é 'MedHigh', 'Alto'75,0
1918610086INTPLAN é 'Sim' e OMMIN é 'Baixo', 'MedLow' e OMCALL é 'Baixo', 'MedLow', 'Médio'46,2
22331815INTPLAN é "Sim" e OMMIN é "Médio", "MedHigh", "Alto" e IMIN é "Baixo", "MedLow", "Médio"45,5
16334211123INTPLAN é 'Não' e CUSCALL é 'Mais de 2' e OMMIN é 'MedHigh', 'Alto'36,8
15516413103INTPLAN é 'Não' e CUSCALL é 'Mais de 2' e OMMIN é 'Baixo', 'MedLow', 'Médio'20,0
1033026763.INTPLAN é 'Não' e CUSCALL é '1' e OMMIN é 'Alto'19.1
13679550129INTPLAN é 'Não' e CUSCALL é '2' e OMMIN é 'Médio', 'MedHigh', 'High'19,0
617915128.INTPLAN é 'Não' e CUSCALL é '0' e OMMIN é 'Alto'15,6
959753265INTPLAN é 'Não' e CUSCALL é '1' e OMMIN é 'Médio', 'MedHigh'10,9
1246642739.INTPLAN é 'Não' e CUSCALL é '2' e OMMIN é 'Baixo', 'MedLow'8.4
559354944INTPLAN é 'Não' e CUSCALL é '0' e OMMIN é 'MedLow', 'Médio', 'MedHigh'7.4
857754037.INTPLAN é 'Não' e CUSCALL é '1' e OMMIN é 'Baixo', 'MedLow'6.4
42061997INTPLAN é 'Não' e CUSCALL é '0' e OMMIN é 'Baixo'3.4.

Essas são apenas uma amostra do que você pode fazer com os dados em um petisco. Fique à vontade
experimentar.

Uma trama vale mais que mil palavras

Sou um grande fã de exibir dados graficamente sempre que possível. Eu acho isso
ajuda a direcionar para casa suas mensagens de projetos de ciência de dados. O outro novo
função que adicionei ao meu pacote
recentemente é PlotXTabs2() que é construído para exibir tabelas de referência cruzada bivariadas. Eu
emprestado pesadamente de ggstatsplot para permitir que você inclua opcionalmente
informação estatística.

Vamos usá-lo para exibir informações sobre a relação entre rotatividade
e plano internacional de nossos clientes. Primeiro, alguns gráficos simples exibindo apenas
orientação diferente dos eixos x e y e com e sem tubulação. Lá
existem muitas opções para falar aqui, então consulte
as páginas online ..
Meu próximo projeto é trazer plotagens de mosaico para a função.

CGPfunctions::PlotXTabs2(churn, 
                         CHURN, 
                         INTPLAN, 
                         bf.display = "sensible")

churn %>% CGPfunctions::PlotXTabs2(INTPLAN, 
                                   CHURN, 
                                   bf.display = "sensible")

A capacidade de canalizar dos dados para o gráfico é imensamente útil para
exibindo dados práticos. As duas parcelas finais se concentrarão no segundo nível de
o modelo, onde nossos clientes não têm plano de ligações internacionais. De novo
exibiremos os mesmos dados na ordem x / y invertida e no segundo gráfico desde
em mais níveis, selecionaremos uma paleta mais amigável para usuários com
potenciais desafios à vista.

churn %>% 
  filter(INTPLAN == "No") %>% 
  CGPfunctions::PlotXTabs2(CUSCALL, 
                           CHURN, 
                           bf.display = "sensible")

churn %>% 
  filter(INTPLAN == "No") %>% 
  CGPfunctions::PlotXTabs2(CHURN, 
                           CUSCALL, 
                           bf.display = "sensible", 
                           package = "ggthemes",
                           palette = "Color Blind")

Um exame final do porquê é importante

Então, eu queria terminar este post reforçando por que chaid pode ser uma ferramenta útil
mesmo que não seja o algoritmo mais novo ou o mais legal. Observe que a precisão
não era tão bom quanto alguns outros métodos, mas é uma ferramenta fantástica para
modelagem inicial. Observe que também é muito robusto e fornece respostas que
são facilmente explicados aos líderes empresariais.

Feito

Espero que tenham gostado do post. Comentários sempre bem-vindos. Especialmente por favor deixe
saber se você realmente usa as ferramentas e as acha úteis.

Mandril

CC BY-SA 4.0

Este trabalho está licenciado sob uma Licença Internacional Creative Commons Attribution-ShareAlike 4.0

var vglnk = {key: '949efb41171ac6ec1bf7f206d57e90b8'};

(função (d, t) {
var s = d.createElement
s.src = '//cdn.viglink.com/api/vglnk.js';
var r = d.getElementsByTagName
} (documento, 'script'));

Para Deixe um comentário para o autor, siga o link e comente no blog: Publicações no R Lover! um programador.

R-bloggers.com oferece atualizações diárias por email sobre notícias e tutoriais do R sobre o aprendizado do R e muitos outros tópicos. Clique aqui se você deseja publicar ou encontrar um emprego em ciência da dados / R.


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.



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