Comentarios iniciais

Quase sempre, começa-se uma análise estatística com a importação de arquivos não-estruturados (excel ou dat, por exemplo) seguida pelo tratamento do conjunto de dados. No entanto, quando se trabalha no ambiente R Markdown, é preciso carregar a base de dados (com a função load no setup) já tratada e deixar todos os códigos utilizados para tratamento dos dados apenas como comentários (usando o # antes do argumento) ou com chunks desativados eval = false. Dessa maneira, evita-se que o R markdown realize novamente toda etapa inicial, que frequentemente é impossível em função das alterações já realizadas.

Dessa maneira, você irá perceber que a etapa de ler as planilhas, organizar os dados, criar variáveis, mesclar ou unir bases não está sendo realizada integralmente, uma vez que tem o #, mas apenas algumas partes necessárias à análise. Você também irá reparar que agora existe a função load dentro do bloco de códigos do r setup e você deverá alterar o destino do arquivo. Preservei seus comentários e comandos anteriores para que você verifique o passo a passo.

Um aspecto muito importante no ambiente R markdown (e R no geral) é fazer com que os objetos sejam facilmente identificáveis e que apenas os objetos fundmentais estejam carregados no ambiente de trabalho. Para que isso seja alcançado, irei remover objetos que, neste momento, não estão em uso. Caso alguma análise precise de algum objeto específico, irei carregá-lo.

#rm(list=setdiff(ls(), c("fase_completa", "projectbkm", "projectinfo", "uso")))

Repare que abaixo há suas hipóteses de pesquisa e que agora vamos responde-las uma a uma. É fundamental lembrar que existme hipóteses que foram previamente traçadas e que os dados auxiliarão na análise delas. No entanto, esse processo gera resultados que, por sua vez, podem impulsionar a formulação de novas hipóteses de trabalho.

A ingracao da Estatistica com Analise de Dados quase sempre pede um fluxo de trabalho em que o processo é dado pelo seguinte fluxograma:

library(DiagrammeR) #flowcharts
## Warning: package 'DiagrammeR' was built under R version 3.5.3
grViz("digraph flowchart {
      # node definitions with substituted label text
      
      node [
      fontname = Helvetica,
      fontcolor = white,
      fillcolor = 'darkslategray', 
      shape = rectangle,
      style = filled]
      
      A[label = 'Criação de vetores específicos para base']
      B[label = 'Modelação e organização do formato desse novo objeto']
      C[label = 'Tabulação e visualização dos padrões observados']
      D[label = 'Análise estatística de dados'] 
      E[label = 'Checar pressupostos'] 

      F[label = 'Escrita dos resultados de maneira correta']

      node [fillcolor = 'white', style = filled]
      A -> B -> C -> D -> E -> F
      
     }")

Hipótese 1.1

Menu inicial

H1.1: O conhecimento prévio existente numa base de conhecimento de projetos ajuda o gerente de projeto a tomar decisões compatíveis com seu perfil de gestão evitando impactos negativos no projeto.

Resposta: Essa hipótese será trabalhada pela comparação do rendimento antes e depois da implementação da base do conhecimento. Os grupos serão tratados como independentes. inicialmente, o teste T para amostras/grupos independens será realizado. Esse teste tem os seguintes pressupostos (Gravetter & Wallnau, 2014; Rochon, Gondan, & Kieser, 2012):

  • A variável dependente é contínua (no caso, profitability),
  • As observações/medidas em cada grupo são independentes uma das outras,
  • A medida obtida é, na população, normalmente distribuída ou, ao menos, a diferença entre as médias é normalmente distribuída,
  • A variância da medida entre os grupos é homogenea (princípio da homocedasticidade),

Por esses pressupostos, costuma-se usar que o teste T lida com uma variável dependente independente e identicamente distribuída (i.i.d.). Além disso, o teste T é um teste paramétrico. Nesse sentido, um modelo paramétrico é caracterizado por uma família de distribuições indexada por um parâmetro, que é sempre desconhecido. Uma violação frequentemente presente em pesquisas empíricas é o da homocedasticidade e, neste sentido, pequenas adaptações pdoem ser feitas no teste T para permitir que ele se torne mais robsto a essa violação. Tais modificações são conhecidas como Welch Test, que foi, então, realizado.

#base projectbkm Essa ? a base anterior da implementa??o da base de conhecimento
#base projectinfo Essa ? a base posterior ? implementa??o da base do conhecimento

#Backup: Esse passo eu sempre fa?o para caso eu precise retornar ? base original
backup_projectbkm <- projectbkm
backup_projectinfo <- projectinfo

#Antes
projectbkm %>%  #get  ds
  summarise_at(vars(profitability), list(~mean, ~sd))
##        mean       sd
## 1 -10.77415 15.25588
#Depois
projectinfo %>% 
  summarise_at(vars(profitability), list(~mean, ~sd))
## # A tibble: 1 x 2
##    mean    sd
##   <dbl> <dbl>
## 1  2.80  5.90
#Teste T para amostras independentes. Lembrar que H0 estipula que mu1-mu2=0 e Ha ? o caso contr?rio
t.test(projectbkm$profitability, projectinfo$profitability)
## 
##  Welch Two Sample t-test
## 
## data:  projectbkm$profitability and projectinfo$profitability
## t = -8.8994, df = 114.47, p-value = 9.769e-15
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -16.59543 -10.55257
## sample estimates:
##  mean of x  mean of y 
## -10.774145   2.799857
#plot
projectbkm %>% 
  dplyr::select(profitability) %>% 
  mutate(time = "Before") -> b1

projectinfo %>% 
  dplyr::select(profitability) %>% 
  mutate(time = "After") -> b2

#merge dataset
base_plot <- bind_rows(b1, b2)

# plot
ggplot(base_plot, aes(x =  fct_relevel(time, c("Before","After")) , y = profitability)) +
  geom_bar(stat= "summary") +
  labs(x = "Time", y = "Profitability", title = "supposed effect of the intervention on profitability")
## No summary function supplied, defaulting to `mean_se()

rm(b1,b2, base_plot)

A comparação entre os valores médios da rentabilidade antes e depois mostrou-se significativa (t(114.47) = -8.90, p < .001),permitindo concluir que os valores anteriores à implementação da base do conhecimento eram significativamente inferiores aos obtidos após tal implementação.

No entanto, uma vez que o teste T tem diferentes pressupostos e que esses comumeiramente são violados, o teste Mann-Whitney (MW) costuma ser utilizado em situações como essas. O MW é um teste não-paramétrico, o que signfiica que o objetivo não é estimar um parametro e, portanto, não é dependente de uma distribuição específica e pré-estabelecida. Como pressupostos, o MW solicita tem os seguintes pressupostos:

  • A variável dependente é, ao menos, ordinal (no caso, profitability),
  • As observações/medidas em cada grupo são independentes uma das outras,
wilcox.test(projectbkm$profitability, projectinfo$profitability) 
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  projectbkm$profitability and projectinfo$profitability
## W = 4556, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0

Os resultados do MW também foram significativos (W = 4556, p < 0.01)

Hipótese 1.2

Menu inicial

H1.2: Existe um perfil de gerente dentro da classificação DISC que contribui mais para o ganho de rentabilidade sugerindo uma contratação desse tipo de perfil para implantação de projetos ERP.

Resposta: Repare que a modelagem da hipótese deixa claro que o perfil é a variável independente e a rentabilidade é a varável dependente. Nessa situação, a investigação pode ser feita por uma ANOVA one-way. Modelos de análise de variância constituem uma classe de modelos que relacionam uma variável resposta contínua com variáveis independentes categóricas nominais. Pela ANOVA, modela-se todas as combinações lineares dos dados, bem como suas médias e a variabilidade entre estas médias. Os resultados são tomados globalmente (omnibus test) e, por isso, comparações post-hoc podem ser realizadas caso resultados globais significativos sejam alcançados.

Como a ANOVA é um caso particular de um modelo de regressão é, portanto, sujeita aos mesmos pressupostos:

  • A variável dependente é contínua (no caso, profitability),
  • Existe independência dos resíduos
  • Os resíduos sào normalmente distribuídos
  • A variância da medida entre os grupos é homogenea (princípio da homocedasticidade),

Existem diferentes formas de verificar e/ou testar os pressupostos, como exposto a seguir:

A independência dos resíduos é formalmente testada em séries temporais, sendo virtualmente desnecessária em medidas transversais.

A normalidade dos resíduos é investigada por um qq-plot ou um gráfico de densidade. Testes formais, como o teste kolgomorov-smirnof e o teste shapiro-wilk podem ser realizados. Ambos assumem \(H_0\) como normalidade residual.

A homogeneidade das variâncias pode ser realizada via teste de Bartlett, Levene, Fligner-Killeen e Brown-Forsyth. Em todos, a \(H_0\) assume homogeneidade.

Quando existe uma violação desses pressupostos, é possível tomar uma função dos dados, realizar versões robustas da ANOVA ou substituir a ANOVA por testes livres de distribuição (não paramétricas).

Dessa maneira, a rotina a seguir realiza cada uma das seguintes etapas:

    1. Apresentação dos resultados descritivos de cada um dos perfis
    1. ANOVA one-way
    1. Verificação dos ajustes do Modelo
    1. Comparação pareada dos níveis (grupos) que compõem a VI

Resultados descritivos

library(summarytools)
## 
## Attaching package: 'summarytools'
## The following object is masked from 'package:tibble':
## 
##     view
stats <- by(data = base_merge_disc$profitability, INDICES = base_merge_disc$Perfil, FUN = descr, style = 'rmarkdown')
view(stats, method = 'pander') 
## Descriptive Statistics  
## profitability by Perfil  
## Data Frame: base_merge_disc  
## N: 4462  
## 
##                           D         I        S
## ----------------- --------- --------- --------
##              Mean      2.35      3.31     0.93
##          Std.Dev.      4.33      6.83     4.72
##               Min    -19.75    -15.55    -8.84
##                Q1      0.00      0.00     0.00
##            Median      1.71      1.65     0.00
##                Q3      4.70      5.35     6.22
##               Max     17.02     31.09     7.64
##               MAD      2.54      2.94     3.17
##               IQR      4.70      5.35     5.20
##                CV      1.84      2.06     5.06
##          Skewness     -0.01      1.21    -0.63
##       SE.Skewness      0.04      0.03     0.16
##          Kurtosis      5.67      3.39     0.09
##           N.Valid   4462.00   7060.00   230.00
##           % Valid    100.00    100.00   100.00

ANOVA individual por DISC

#Rodar o modelo
prof_disc_individual <- aov(profitability ~ Perfil, data = base_merge_disc)

#Verificar os resultados
anova_stats(car::Anova(prof_disc_individual, type = 3)) %>% kable() %>% kable_styling(bootstrap_options=c('striped','hover', 'condensed','responsive'),position='center', font_size = 12,full_width=F)
term sumsq meansq df statistic p.value etasq partial.etasq omegasq partial.omegasq cohens.f power
(Intercept) 24715.803 24715.803 1 694.832 0 0.055 0.056 0.055 0.056 0.243 1
Perfil 3412.936 1706.468 2 47.974 0 0.008 0.008 0.007 0.008 0.090 1
Residuals 417922.358 35.571 11749 NA NA NA NA NA NA NA NA

Os resultados indicaram que existe efeito significativo do Perfil na Profitabilitu (F(2, 11749) = 47.97, p < 0.01).

Normalidade dos resíduos

#Normalidade dos res?duos
#qqplot
ggplot(prof_disc_individual, aes(sample = rstandard(prof_disc_individual))) + 
  geom_qq() + 
  stat_qq_line()

O gráfico acima apresenta a distribuição teórica e a empírica dos resíduos. A linha diagonal indica o local em que a normalidade residual estaria presente. É possível verificar que em uma única fração do intervalo dos dados, há convergência para normalidade. Outro teste gráfico é feito a partir da densidade da distribuição residual, tal como exposto abaixo.

#densidade
qplot(prof_disc_individual$residuals, geom="density")

Formalmente, o teste de Kolmogorov-Smirnov ou o Shapiro-Wilk são utilizados para testar a hipótese de normalidade dos resíduos. Ambos assumem \(H_0\) na direção da normalidade.

ks.test(prof_disc_individual$resid, pnorm)
## Warning in ks.test(prof_disc_individual$resid, pnorm): ties should not be
## present for the Kolmogorov-Smirnov test
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  prof_disc_individual$resid
## D = 0.39939, p-value < 2.2e-16
## alternative hypothesis: two-sided
#shapiro.test(prof_disc_individual$residuals[1:5000])

Tal como observado graficamente, a hipótese nula de normalidade foi rejeitada pela estatística de teste alcancada pelo Kolmogorov-Smirnov (D = 0.4, p < 0.01). Nesse sentido, os resultados apontam para violação da normalidade dos resíduos.

Homogeneidade das variâncias

Tal como anteriormente descrito, tanto técnicas gráficas como testes formais podem ser conduzidos para verificar esse pressuposto. Em relação às técnicas gráficas, o Homogeneity of Variance Plot apresenta os desvios-absolutos da mediana. Já o teste de Levene é frequentemente utilizado para verificar esse pressuposto. Tal como informado previamente, a \(H_0\) desse teste assume homocedasticidade.

car::leveneTest(base_merge_disc$profitability ~ base_merge_disc$Perfil) #homogeneidade dos dados
## Levene's Test for Homogeneity of Variance (center = median)
##          Df F value    Pr(>F)    
## group     2     154 < 2.2e-16 ***
##       11749                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#bartlett.test(profitability ~ Perfil, data = base_merge_disc)
#fligner.test(profitability ~ Perfil, data = base_merge_disc)

#hov(profitability ~ Perfil, data = base_merge_disc)
hovPlot(profitability ~ Perfil, data = base_merge_disc)

Apesar dos pressupostos da normalidade e homocedasticidade terem sido violados, uma das possíveis sequências analíticas pode ser feita continuando as análises e justificando os resultados a partir do Teorema Central do Limite. Este teorema garante que, independente da distribuição dos valores das observações individuais, a média desses valores irá seguir, aproximdamente uma distribuição normal.

Posto isso, dado que a ANOVA foi significativa, isso significa que a adição do preditor (perfil) teve capacidade de reduzir a variância residual da resposta (profitability). Isso também permite que a comparações de todos os possíveis contrastes gerem valores significativos. Dessa maneira, a realização de testes de comparação das médias entre os grupos foi realizada. Essa etapa é chamada de post-hoc.

Post-hoc

#compara??o entre as m?dias
mmc(prof_disc_individual, linfct = mcp(Perfil = "Tukey"))
## Tukey contrasts
## Fit: aov(formula = profitability ~ Perfil, data = base_merge_disc) 
## Estimated Quantile = 2.284902 
## 95% family-wise confidence level
## $mca
##      estimate    stderr     lower    upper   height
## I-D 0.9571491 0.1140628 0.6965267 1.217771 2.832120
## I-S 2.3775100 0.3996178 1.4644226 3.290598 2.121939
## D-S 1.4203610 0.4032716 0.4989250 2.341797 1.643365
## $none
##    estimate     stderr      lower    upper    height
## I 3.3106944 0.07098147 3.14850876 3.472880 3.3106944
## D 2.3535454 0.08928584 2.14953603 2.557555 2.3535454
## S 0.9331844 0.39326331 0.03461637 1.831752 0.9331844
#TukeyHSD(prof_disc_individual, "Perfil") #post hoc
#emmeans(prof_disc_individual, pairwise ~ Perfil, adjust = "tukey")
adj.means <- effect('Perfil', prof_disc_individual) %>% as.data.frame()

ggplot(adj.means, aes(Perfil,fit, group=1)) +
  geom_line() +
  geom_point() +
  #theme_bw() +
  geom_hline(aes(yintercept = 0), color="blue", linetype="dashed") + 
  geom_text(aes(label = paste(round(fit,2)),y = fit-.3, x = Perfil)) +
  labs(title = "Escolher titulo") + 
  theme(legend.position="bottom")

ANOVA Robusta

Testes robustos são comumeiramente realizados quando os testes tradicionais apresentam violações dos pressupostos. Nesse sentido, a ANOVA robusta verifica o efeito do perfil na profitability considerando as médias aparadas em 20%. Nesse sentido, pontos anômalos/atípicos (outliers) não são considerados na análise. Conforme reportado na tabela a seguir, os resultados são convergentes aos encontrados previamente (F(2, 370.07) = 11.576, p < 0.01).

library(WRS2)
## Warning: package 'WRS2' was built under R version 3.5.3
## 
## Attaching package: 'WRS2'
## The following object is masked from 'package:HH':
## 
##     ancova
prof_disc_individual_rob <- t1way(profitability ~ Perfil, data = base_merge_disc)

A comparação pareada, virtualmnente, alcançou os mesmos resultados.

lincon(profitability ~ Perfil, data = base_merge_disc)
## Call:
## lincon(formula = profitability ~ Perfil, data = base_merge_disc)
## 
##           psihat ci.lower ci.upper p.value
## D vs. I -0.28612 -0.46993 -0.10231 0.00020
## D vs. S  0.74451  0.03980  1.44922 0.01230
## I vs. S  1.03063  0.32634  1.73491 0.00059

Kruskal-Wallis individual por DISC

O KW é, baiscamente, uma ANOVA de uma via após ranquear os resultados da variável dependente (profitability). No entanto, ao fazer isso, ele se desvincula de uma distribuição típica e, portanto, é considerado um teste não-paramétrico. Como pode ser visto na tabela a seguir, os resultados do KW foram virtualmente idênticos aos alcançados pela ANOVA (X2(2) = 24.438, p < 0.01).

prof_disc_individual_kw <- kruskal.test(profitability ~ Perfil, base_merge_disc)
car::Anova(aov(profitability ~ Perfil, base_merge_disc), type=3)
## Anova Table (Type III tests)
## 
## Response: profitability
##             Sum Sq    Df F value    Pr(>F)    
## (Intercept)  24716     1 694.832 < 2.2e-16 ***
## Perfil        3413     2  47.974 < 2.2e-16 ***
## Residuals   417922 11749                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Anova(aov(rank(profitability) ~ Perfil, base_merge_disc), type=3)

A interpretação do KW é, no entanto, algo diferente. Como o que é feito antes da modelagem dos dados é um ranqueamento. Quando os valores são significativos, isso significa que existe uma diferença significativa nos ranqueamentos médios entre os grupos.

Esses resultados foram importantes à pesquisa e permitiram levantar uma investigação exploratória para verificar a possível influência do perfil de personalidade (otido pelo DISC) no rendimento médio obtido após a implementação da base do conhecimento. Isso também permitiu verificar com maior profundidade os GPs que participaram dessa pesquisa.

Para verificar esse novo problema de pesquisa, será necessário ter informações da base projectinfo e da base uso. Para que não haja prejuízos nessa etapa, iremos limpar todas as possíveis inconsistências entre as bases e um novo objeto (base_merge_disc) aglutinará as informações. A esse momento, essas informações serão omitas para preservar a assertividade do relatório.

#vamos contar os PM_ID
projectinfo %>% count(PM_ID)
uso %>% count(PM_ID)

#clean names and remove spaces of each variable (vai deixar lowercase todas as variaveis)
projectinfo$PM_ID <- gsub(" ", "", projectinfo$PM_ID, fixed = TRUE)
uso$PM_ID <- gsub(" ", "", uso$PM_ID, fixed = TRUE)

#Finalmente, unir as bases
base_merge_disc <- left_join(projectinfo, uso, by="PM_ID")

#Transform perfil em fator
base_merge_disc <- base_merge_disc %>% 
  mutate(Perfil = as.factor(Perfil))


O *boxplot* a seguir re?ne o Perfil e a Rentability. ? importante atentar que, formalmente, os testes de hip?teses estimam valores m?dios e n?o medianos. Algumas excessoes ocorrem em vers?es n?o-param?tricas de testes de hip?tese em que as distribui??es dos diferentes grupos s?o sim?tricas em suas formas.
#create a tempdataset to gather median values
base_merge_disc %>% 
  group_by(Perfil) %>% 
  summarise(Median=round(median(profitability),3)) -> med_temp

ggplot(base_merge_disc, aes(x=Perfil, y=profitability)) + 
  geom_boxplot() +
  labs(title = "Relacão entre Profitability em fun??o do Perfil do GP") +
  geom_text(data = med_temp, aes(label = Median, x = Perfil, y = 0),  size=5) #recover median values from specific ds
#remove unused dataset
rm(med_temp)
A distribui??o de cada perfil encontra-se abaixo: **Era essa a VD??**

base_merge_disc %>% 
  dplyr::select(key=Perfil, value=profitability) %>% 
  gather()  -> plot_perfil_density
  
ggplot(plot_perfil_density, aes(x = value, y = key, fill=key)) + 
  geom_density_ridges(
    jittered_points = TRUE,
    position = position_points_jitter(width = 0.05, height = 0),
    point_shape = '|', point_size = 3, point_alpha = 1, alpha = 0.8
  ) +
  theme_ridges() +
  theme(legend.position="none") +
  labs(fill="", x="Profitability", y="")

Hipotese 2.1

Menu inicial

H2.1: Uma vez que o deliberable 2_26 tem um elevado padr?o de uso, tem-se a hip?tese de que existe rela??o entre o perfil de gest?o e o tipo de a??o a ser tomada por problemas em determinados entreg?veis.

Resposta: A base fase_completa ser? utilizada para essa hip?tese com um filtro espec?fico para a deliverable_2_26. O c?digo abaixo realiza uma apresenta??o tabular. Ser? verificado para o deliverable 2_26 as diferentes solu??es tomadas por perfil de GP. Nesse deliverable, precisamos fazer uns testes para verificar Perfil X Solu??o.

fase_completa %>%  #get datasaet
  filter(F_deliver == "2_26") %>% #filter
  group_by(Perfil, Solution) %>%  #grouping variable
  count() %>%  #sum unique
  bind_rows(group_by(.,Perfil) %>% #create new variable to sum up
              summarise(n=sum(n)) %>%
              mutate(Solution='Total')) %>% 
  bind_rows(group_by(.,Solution) %>% #  #create new variable to sum up
              summarise(n=sum(n)) %>%
              mutate(Perfil='Total')) %>%
  spread(Perfil, n, fill="0") %>%  #spread format
  kable() %>% kable_styling() %>% 
  row_spec(14, bold = T, color = "black", background = "white") %>% 
    footnote(general = "A Legenda a seguir apresenta as defini??es utilizadas na Tabela. ",
           number = c("D: Dominance ", "I: Influence", "S: Steadiness")) #report in a nice style
Solution D I S Total
Solution 1 45 6 1 52
Solution 10 6 84 0 90
Solution 11 5 11 6 22
Solution 12 8 7 0 15
Solution 17 12 23 2 37
Solution 2 11 73 2 86
Solution 3 11 4 4 19
Solution 4 5 13 0 18
Solution 5 112 25 1 138
Solution 6 19 154 3 176
Solution 7 20 19 15 54
Solution 8 10 19 1 30
Solution 9 49 13 0 62
Total 313 451 35 799
Note:
A Legenda a seguir apresenta as defini??es utilizadas na Tabela.
1 D: Dominance
2 I: Influence
3 S: Steadiness

Agora, para verificar a rela??o entre o Perfil e as solu??es para o deliverable_2_26, o gr?fico abaixo foi realizado.

fase_completa %>% #get ds 
  filter(F_deliver == "2_26") %>% #filter
  group_by(Perfil, Solution) %>% #group
  count() %>%  #sum up
  spread(Perfil, n, fill="0") %>% #wide format
  gather(key, value, D:S) %>% #turn into long
  mutate(freq = as.numeric(value)) %>% 
  ggplot(., aes(x = Solution, y=freq, fill=key)) + 
  geom_col(position = "stack") +
  theme(legend.position="bottom") #change legend position

Finalmente, o teste formal para verificar se existe rela??o entre o perfil de gest?o e o tipo de a??o a ser tomada por problemas em determinados entreg?veis, o qui-quadrado de independ?ncia deve ser realizado.

#Qui quadrado, uma vez que ha duas variaveis categoricas e voce deseja ver a associacao entre elas 
fase_completa %>% #get ds 
  filter(F_deliver == "2_26") %>% 
 do(tidy(chisq.test(.$Solution, .$Perfil)))
## Warning in chisq.test(.$Solution, .$Perfil): Chi-squared approximation may
## be incorrect
## # A tibble: 1 x 4
##   statistic  p.value parameter method                    
##       <dbl>    <dbl>     <int> <chr>                     
## 1      463. 6.17e-83        24 Pearson's Chi-squared test

No teste qui-quadrado de associa??o, ha hip?tese nula ? de que as duas vari?veis s?o independentes. Em outras palavras, n?o existe associa??o entre elas. Quando se rejeita a hip?tese nula, isso significa que h? evid?ncias de depend?ncia entre as vari?veis. Ou seja, elas est?o associadas.

Uma vez que o valor do Qui quadrado foi significativo, existem algumas maneiras de verificar a poss?vel tend?ncia de um perfil (D, I ou S) na utiliza??o das diferentes solu??es que s?o poss?veis a serem consultadas. Uma forma simples de proceder com isso ? criar uma matriz de resposta em que a utiliza??o ser? computada e, em seguida, a investiga??o sobre uma poss?vel intera??o o Perfil e a Solu??o na utiliza??o da base. Como a vari?vel dependente ? uma contagem, ser? utilizado a familia poisson para modelagem dos dados. A interpreta??o ? meio tricky. D? uma olhada em https://stats.stackexchange.com/questions/11096/how-to-interpret-coefficients-in-a-poisson-regression por favor.

#Ser? necess?rio criar uma base com as contagens de cada uso
fase_completa %>%  #get datasaet
  filter(F_deliver == "2_26") %>% #filter
  group_by(Perfil, Solution) %>%  #grouping variable
  count() -> j

#Aqui o modelo de regress?o ser? realizado
phoc <- glm(n ~ Solution * Perfil, family = "poisson", data = j)
#summary(phoc)
tidy(phoc) %>% print(n=nrow(.))
## # A tibble: 35 x 5
##    term                        estimate std.error statistic   p.value
##    <chr>                          <dbl>     <dbl>     <dbl>     <dbl>
##  1 (Intercept)                   3.81       0.149    25.5   7.88e-144
##  2 SolutionSolution 10          -2.01       0.435    -4.64  3.55e-  6
##  3 SolutionSolution 11          -2.20       0.471    -4.66  3.15e-  6
##  4 SolutionSolution 12          -1.73       0.384    -4.50  6.75e-  6
##  5 SolutionSolution 17          -1.32       0.325    -4.07  4.74e-  5
##  6 SolutionSolution 2           -1.41       0.336    -4.19  2.81e-  5
##  7 SolutionSolution 3           -1.41       0.336    -4.19  2.81e-  5
##  8 SolutionSolution 4           -2.20       0.471    -4.66  3.15e-  6
##  9 SolutionSolution 5            0.912      0.176     5.17  2.39e-  7
## 10 SolutionSolution 6           -0.862      0.274    -3.15  1.62e-  3
## 11 SolutionSolution 7           -0.811      0.269    -3.02  2.55e-  3
## 12 SolutionSolution 8           -1.50       0.350    -4.30  1.69e-  5
## 13 SolutionSolution 9            0.0852     0.206     0.412 6.80e-  1
## 14 PerfilI                      -2.01       0.435    -4.64  3.55e-  6
## 15 PerfilS                      -3.81       1.01     -3.77  1.66e-  4
## 16 SolutionSolution 10:PerfilI   4.65       0.606     7.68  1.62e- 14
## 17 SolutionSolution 11:PerfilI   2.80       0.693     4.05  5.18e-  5
## 18 SolutionSolution 12:PerfilI   1.88       0.676     2.78  5.37e-  3
## 19 SolutionSolution 17:PerfilI   2.67       0.562     4.74  2.10e-  6
## 20 SolutionSolution 2:PerfilI    3.91       0.542     7.21  5.49e- 13
## 21 SolutionSolution 3:PerfilI    1.00       0.728     1.38  1.68e-  1
## 22 SolutionSolution 4:PerfilI    2.97       0.683     4.35  1.35e-  5
## 23 SolutionSolution 5:PerfilI    0.515      0.488     1.06  2.91e-  1
## 24 SolutionSolution 6:PerfilI    4.11       0.498     8.25  1.62e- 16
## 25 SolutionSolution 7:PerfilI    1.96       0.540     3.64  2.76e-  4
## 26 SolutionSolution 8:PerfilI    2.66       0.584     4.55  5.46e-  6
## 27 SolutionSolution 9:PerfilI    0.688      0.535     1.29  1.98e-  1
## 28 SolutionSolution 11:PerfilS   3.99       1.18      3.38  7.12e-  4
## 29 SolutionSolution 17:PerfilS   2.01       1.27      1.59  1.12e-  1
## 30 SolutionSolution 2:PerfilS    2.10       1.27      1.65  9.79e-  2
## 31 SolutionSolution 3:PerfilS    2.80       1.17      2.39  1.67e-  2
## 32 SolutionSolution 5:PerfilS   -0.912      1.43     -0.640 5.22e-  1
## 33 SolutionSolution 6:PerfilS    1.96       1.19      1.65  9.85e-  2
## 34 SolutionSolution 7:PerfilS    3.52       1.07      3.30  9.76e-  4
## 35 SolutionSolution 8:PerfilS    1.50       1.46      1.03  3.02e-  1

Uma vez que esse resultado ? ?rido para interpreta??o, o gr?fico abaixo visa auxiliar a mesma. Jair, repare que ? basicamente o mesmo gr?fico exposto anteriormente .

ggplot(j,aes(x=Solution,y=n)) + 
  geom_bar(stat="identity") + 
  facet_grid(.~Solution + Perfil,scale="free") +
  theme(axis.text.x=element_text(angle=90)) + 
  theme(strip.text.x=element_text(angle=90))

#exluir a base tempor?ria criada para essa an?lise, bem como o vetor do post hoc do qui quadradp
rm(j, phoc)

Nova Hipotese 2

Menu inicial

H2: Existe rela??o entre o perfil de gest?o e o tipo de a??o a ser tomada por problemas em determinados entreg?veis.

o Prova Proposta: Ser? verificado para o deliverable 2_26 as diferentes solu??es tomadas por perfil de GP, uma vez que esse foi o deliverable que representa a maior necessidade de acesso a base. Nesse deliverables precisamos fazer uns testes para verificar Perfil X Solu??o. Ser? apenas utilizada a base USO.

fase_completa %>%  #get datasaet
  filter(F_deliver == "2_26")-> escolha_2_26

source("http://pcwww.liv.ac.uk/~william/R/crosstab.r")
#crosstab(escolha_2_26, row.vars = "Solution", col.vars = "Perfil", type = "f")

Existe uma associa??o significativa entre Perfil e Solu??es (p = chisq.test(4.997501210^{-4}), o que indica que essas duas vari?veis n?o s?o independentes entre si. Uma das formas que se pode verificar se existe uma diferen?a signficativa da utiliza??o de cada solu??o em cada perfil ? pela compara??o dos resultados observados em cada solu??o pelo resultado m?dio de cada perfil. Para esse teste, assumiu-se como Hip?tese nula de que o valor da utiliza??o de cada solu??o seria o valor m?dio alcan?ado em cada Perfil. Jair, fale com o Prof. Barroso, pois essa tomada de decis?o inferencial poder? receber muitas cr?ticas…

#Jair, n?o repare a sintexe... est? bem desorganizada de sentiod l?gico e generaliz?vel
escolha_2_26 %>%  #get datasaet
    group_by(Perfil, Solution) %>%  #grouping variable
    count() %>%  #sum unique
    bind_rows(group_by(.,Perfil) %>% #ADD MEAN
                summarise(n=mean(n) %>% round(.,1)) %>%
                 mutate(Solution='yM?dia')) %>% 
  bind_rows(group_by(.,Perfil) %>% #ADD STANDARD DEVIATION
              filter(Solution != "yM?dia") %>% 
              summarise(n=sd(n) %>% round(.,1)) %>%
              mutate(Solution='z_Desvio')) %>% 
  spread(Perfil, n, fill="0") -> tab_hipotese2


tab_hipotese2 <- tab_hipotese2 %>% 
  mutate_if(is.character, as.numeric)
## `mutate_if()` ignored the following grouping variables:
## Column `Solution`
#D
tab_hipotese2 <- tab_hipotese2 %>% 
  mutate(D_Tvalor = D - tab_hipotese2$D[tab_hipotese2$Solution == "yM?dia"]/
           ((tab_hipotese2$D[tab_hipotese2$Solution == "z_Desvio"])/sqrt(13)),
         D_PValor =  2*pt(D_Tvalor, 12, lower=FALSE))
#I
tab_hipotese2 <- tab_hipotese2 %>% 
  mutate(I_Tvalor = I - tab_hipotese2$I[tab_hipotese2$Solution == "yM?dia"]/
           (tab_hipotese2$I[tab_hipotese2$Solution == "z_Desvio"]/sqrt(13)),
         I_PValor =  2*pt(I_Tvalor, 12, lower=FALSE))
#S
tab_hipotese2 <- tab_hipotese2 %>% 
  mutate(S_Tvalor = S - tab_hipotese2$S[tab_hipotese2$Solution == "yM?dia"]/
           (tab_hipotese2$S[tab_hipotese2$Solution == "z_Desvio"]/sqrt(13)),
         S_PValor =  2*pt(S_Tvalor, 12, lower=FALSE))

#Arrange columns

tab_hipotese2 <- tab_hipotese2 %>% 
  dplyr::select(Solution, D, D_PValor, I, I_PValor, S, S_PValor) %>% 
  mutate_at(vars(-Solution), funs(round(.,2))) %>% 
  filter(Solution != "yM?dia" & Solution != "z_Desvio")
## Warning: funs() is soft deprecated as of dplyr 0.8.0
## please use list() instead
## 
## # Before:
## funs(name = f(.)
## 
## # After: 
## list(name = ~f(.))
## This warning is displayed once per session.
#Display tab
tab_hipotese2 %>% kable() %>% kable_styling()
Solution D D_PValor I I_PValor S S_PValor
Solution 1 45 0.00 6 0.01 1 1.94
Solution 10 6 0.01 84 0.00 0 1.99
Solution 11 5 0.06 11 0.00 6 0.01
Solution 12 8 0.00 7 0.00 0 1.99
Solution 17 12 0.00 23 0.00 2 1.72
Solution 2 11 0.00 73 0.00 2 1.72
Solution 3 11 0.00 4 0.28 4 0.40
Solution 4 5 0.06 13 0.00 0 1.99
Solution 5 112 0.00 25 0.00 1 1.94
Solution 6 19 0.00 154 0.00 3 1.10
Solution 7 20 0.00 19 0.00 15 0.00
Solution 8 10 0.00 19 0.00 1 1.94
Solution 9 49 0.00 13 0.00 0 1.99

Uma das formas poss?veis de verificar as chances de uso de cada uma das solu??es em fun??o dos perfil se d? por uma regress?o log?stica multinomial. Esse modelo permite verificar a rela??o funcional de uma vari?vel dependente com mais de dois n?veis sem ordena??o espec?fica e vari?veis independentes tanto cont?nuas quanto discretas.

Nesse caso espec?fico, dado que a categoria de refer?ncia das solu??es ? a Solu??o 17, a modelagem ocorre da seguinte forma:

\(ln(\frac{Solucao 1}{Solucao 17}) = b_0 + b_1(Perfil = I) + b_2(Perfil = S)\)

#Modelo de regressao logistica

escolha_2_26 <- escolha_2_26 %>% 
  mutate(Solution17 = relevel(factor(Solution), ref="Solution 17"))

#Jair, fiz isso s? para fins de cmopara??o
escolha_2_26 <- escolha_2_26 %>% 
  mutate(Perfil_S = relevel(factor(Perfil), ref="S"))


#Change the intercept to solution17

mod_escolha <- multinom(formula = Solution17 ~ factor(Perfil), data = escolha_2_26)
## # weights:  52 (36 variable)
## initial  value 2049.394537 
## iter  10 value 1630.323923
## iter  20 value 1613.598148
## iter  30 value 1612.481155
## iter  40 value 1612.337606
## final  value 1612.334460 
## converged
summary(mod_escolha)
## Call:
## multinom(formula = Solution17 ~ factor(Perfil), data = escolha_2_26)
## 
## Coefficients:
##             (Intercept) factor(Perfil)I factor(Perfil)S
## Solution 1   1.32158998    -2.665132347     -2.01492801
## Solution 10 -0.69327056     1.988655022    -11.71546199
## Solution 11 -0.87561795     0.138040410      1.97408587
## Solution 12 -0.40568325    -0.783842490    -13.39845257
## Solution 2  -0.08713467     1.242158834      0.08692829
## Solution 3  -0.08723530    -1.661922312      0.78024521
## Solution 4  -0.87569394     0.305184543    -12.30143661
## Solution 5   2.23342979    -2.149981427     -2.92627303
## Solution 6   0.45932119     1.442187548     -0.05396141
## Solution 7   0.51065406    -0.701671274      1.50409403
## Solution 8  -0.18247475    -0.008510761     -0.51093743
## Solution 9   1.40673228    -1.977195002    -16.22480954
## 
## Std. Errors:
##             (Intercept) factor(Perfil)I factor(Perfil)S
## Solution 1    0.3248719       0.5618416    1.267096e+00
## Solution 10   0.4999792       0.5525980    3.499289e+02
## Solution 11   0.5322747       0.6463041    9.746369e-01
## Solution 12   0.4564275       0.6282223    5.489690e-04
## Solution 2    0.4174025       0.4810447    1.083602e+00
## Solution 3    0.4174134       0.6838988    9.613363e-01
## Solution 4    0.5322887       0.6354025    1.441610e-03
## Solution 5    0.3037237       0.4191995    1.261644e+00
## Solution 6    0.3687188       0.4311933    9.844847e-01
## Solution 7    0.3651299       0.4789915    8.366123e-01
## Solution 8    0.4281569       0.5286111    1.297453e+00
## Solution 9    0.3220683       0.4734232    1.646268e-04
## 
## Residual Deviance: 3224.669 
## AIC: 3296.669
#Calcular a signific?ncia das variaveis no modelo
z <- summary(mod_escolha)$coefficients/summary(mod_escolha)$standard.errors
#Calcular o que ? significativo nesse modelo via wald test
p <- round((1 - pnorm(abs(z), 0, 1)) * 2,1)
#OR
#exp(coef(mod_escolha))
#p
cbind(coef(mod_escolha),p)
##             (Intercept) factor(Perfil)I factor(Perfil)S (Intercept)
## Solution 1   1.32158998    -2.665132347     -2.01492801         0.0
## Solution 10 -0.69327056     1.988655022    -11.71546199         0.2
## Solution 11 -0.87561795     0.138040410      1.97408587         0.1
## Solution 12 -0.40568325    -0.783842490    -13.39845257         0.4
## Solution 2  -0.08713467     1.242158834      0.08692829         0.8
## Solution 3  -0.08723530    -1.661922312      0.78024521         0.8
## Solution 4  -0.87569394     0.305184543    -12.30143661         0.1
## Solution 5   2.23342979    -2.149981427     -2.92627303         0.0
## Solution 6   0.45932119     1.442187548     -0.05396141         0.2
## Solution 7   0.51065406    -0.701671274      1.50409403         0.2
## Solution 8  -0.18247475    -0.008510761     -0.51093743         0.7
## Solution 9   1.40673228    -1.977195002    -16.22480954         0.0
##             factor(Perfil)I factor(Perfil)S
## Solution 1              0.0             0.1
## Solution 10             0.0             1.0
## Solution 11             0.8             0.0
## Solution 12             0.2             0.0
## Solution 2              0.0             0.9
## Solution 3              0.0             0.4
## Solution 4              0.6             0.0
## Solution 5              0.0             0.0
## Solution 6              0.0             1.0
## Solution 7              0.1             0.1
## Solution 8              1.0             0.7
## Solution 9              0.0             0.0

Nesse sentido, é poss?vel concluir que participantes com o Perfil I estão associados com a diminui??o no log da raz?o de chances ? escolha da Solu??o 1 vs. Solu??o 17 na quantidade de -2.67. Frequentemente, para ganhar facilidade interpretativa, altera-se algebricamente os resultados para conseguir ter a possibilidade de falar sobre Raz?o de chances. Por exemplo, a raz?o de chances do Perfil I usar a Solução 1 vs. Solução 17 ? de \[exp^{-2.66}\]. A Raz?o de chances Perfil S comparado ao Perfil D usar a solu??o 1 em vez da Solução 17 ? \(exp^{-2.01}\).

Hipotese 3

Menu inicial

Ap?s reuni?o em Novembro 5 e e-mail na mesma data, em que: Conclus?o, n?s temos que provar que a frequ?ncia da solu??o 17 ? menor que a m?dia de uso das solu??es na base uso. Das 3449 ocorr?ncias temos 12 solu??es em uso.

H3: O perfil de lideran?a do gerente condiciona sua tend?ncia na tomada de decis?o independente da fase do projeto

Prova Proposta: Precisamos analisar a solu??o S17, que ? uma solu??o n?o existe na base de forma. Fazer alguns testes nessa solu??o e verificar qual perfil usa mais ela e se os resultados apontam alguma relev?ncia do tipo, estamos perdendo conhecimento ou existe um potencial de aquisi??o de novo conhecimento para base
Alguns pontos a ser considerados:
1. Freq_relativa est? em 4.64 2. A m?dia das solu??es ? 7.69 (T?cnicamente, a m?dia das propor??es das solu??es…)
3. Fazer um gr?fico das solu??es em torno da m?dia.
4. Fazer um teste q quadrado entre 4.64 e 7.69 e fazer as an?lises.

uso %>%
  count(Solution) %>% 
  mutate(Props=prop.table(n)) %>% 
  bind_rows(summarise_all(., funs(if(is.numeric(.)) mean(.) else "Media")))
## # A tibble: 14 x 3
##    Solution        n  Props
##    <chr>       <dbl>  <dbl>
##  1 Solution 1   246  0.0713
##  2 Solution 10  405  0.117 
##  3 Solution 11   91  0.0264
##  4 Solution 12   81  0.0235
##  5 Solution 17  160  0.0464
##  6 Solution 2   348  0.101 
##  7 Solution 3    83  0.0241
##  8 Solution 4    78  0.0226
##  9 Solution 5   583  0.169 
## 10 Solution 6   758  0.220 
## 11 Solution 7   175  0.0507
## 12 Solution 8   159  0.0461
## 13 Solution 9   282  0.0818
## 14 Media        265. 0.0769

O gr?fico a seguir apresenta as propor??es das distribui??es das solu??es

uso %>%
  count(Solution) %>% #count frequencies
  mutate(Props=prop.table(n)) %>%  #transform to proportions
  bind_rows(summarise_all(., funs(if(is.numeric(.)) mean(.) else "Media"))) %>% #compute the grand mean
  mutate(Position = fct_reorder(Solution, Props)) %>%  #arrange by props
  mutate(Colorir = if_else(Solution == "Media","purple","grey50")) %>% #get colors
  ggplot(., aes(x=Position, y=Props, fill = Colorir)) +  #plot
  geom_col(colour = "black",show.legend = FALSE) + 
  coord_flip()

#scale_x_discrete(limits=c("Solution 9","Media","Solution 8"))

Formalmente, apesar de bastante controverso, uma forma de verificar se a propor??o de uso da Solu??o 17 ? inferior ao que estamos chamando de propor??o m?dia, ? computar o intervalo de confian?a para cada solu??o, al?m de executar esse procedimento ? m?dia. Essa tarefa anal?tica envolve alguma programa??o externa ?s sintaxes padr?es tidyverse e dplyr.

uso %>%
  count(Solution) %>% #count frequencies
  mutate(Props=prop.table(n)) %>%  #transform to proportions
  bind_rows(summarise_all(., funs(if(is.numeric(.)) mean(.) else "Media"))) %>% #compute the grand mean
  mutate(Position = fct_reorder(Solution, Props)) %>%  #arrange by props
  mutate(Colorir = if_else(Solution == "Media","purple","grey50")) -> j 

  #Crate a new variable in the dataset to gather all looping reuslts
  j <- j %>% mutate(lower = '')  
  
  #looping
  for(i in 1:nrow(j)) { 
    j$lower[i] <- blakerci(j$n[i], 3449, conf.level=0.95)
  }
  
  #row to columns
  j <- separate(data = j, col = lower, into = c("lower", "upper"), sep = ",")
  
  #replace strings
  j <- j %>% mutate(lower = gsub("c(", "", lower, fixed = TRUE),
                    upper = gsub(")", "", upper, fixed = TRUE)) 
  
  #Transform to numeric
  j <- j %>% mutate_at(vars(lower, upper), funs(as.numeric(.)))
  
  #Change string
  j <- j %>% mutate(Solution = gsub("Solution ", "S", .$Solution))

  #change position
  j <- j %>% mutate(Position = fct_reorder(Solution, Props))

De posse dessas informações, a Tabela abaixo apresenta os resultados. Uma vez que a Solution 17 tem intervalos inferiores e fora dos intervalos da m?dia, ? poss?vel concluir que seu uso foi significativamente menor do que o uso m?dio. Visando preven??o de poss?veis erros inferenciais, o IC 95% foi calculado pelo M?todo Exato de Blaker, que ? considerado conservador, uma vez que realiza o intervalo de confian?a a partir de uma fun?ao densidade mesmo em uma vari?vel bin?ria, cujo função de probabilidade é de massa.

j %>% dplyr::select(-c(Position,Colorir)) %>% kable(digits = 3)
Solution n Props lower upper
S1 246.000 0.071 0.063 0.080
S10 405.000 0.117 0.107 0.129
S11 91.000 0.026 0.021 0.032
S12 81.000 0.023 0.019 0.029
S17 160.000 0.046 0.040 0.054
S2 348.000 0.101 0.091 0.111
S3 83.000 0.024 0.019 0.030
S4 78.000 0.023 0.018 0.028
S5 583.000 0.169 0.157 0.182
S6 758.000 0.220 0.206 0.234
S7 175.000 0.051 0.044 0.059
S8 159.000 0.046 0.039 0.054
S9 282.000 0.082 0.073 0.091
Media 265.308 0.077 0.068 0.086

O gr?fico a seguir visa a mesma apresenta??o

ggplot(data=j, aes(x=Position, y=Props, colour=Colorir)) + 
  geom_point(cex = 2) + 
  geom_line() +
  #geom_ribbon(aes(ymin=j$lower, ymax=j$upper), linetype=2) +
  geom_errorbar(aes(ymin=lower, ymax=upper), width=.2, size=.7,
                position=position_dodge(.9)) +
  guides(fill=FALSE, color=FALSE) # (supress the legend)
## geom_path: Each group consists of only one observation. Do you need to
## adjust the group aesthetic?

Essa parte embaixo serve como um complemento e ilustro os passos anteriores que fizemos

Resposta: A base fase_completa ser? utilizada e o teste de propor??es ser? calculado para essa finalidade.

fase_completa %>% 
  mutate(n_encontrado = if_else(Solution == "Solution 17","novo","antigo")) %>% 
  group_by(n_encontrado) %>% 
  summarise(n=n()) %>% 
  mutate(sum = prop.table(n)*100) %>%
  bind_rows(summarise_all(., funs(if(is.numeric(.)) sum(.) else "Total")))
## # A tibble: 3 x 3
##   n_encontrado     n    sum
##   <chr>        <int>  <dbl>
## 1 antigo        3289  95.4 
## 2 novo           160   4.64
## 3 Total         3449 100
prop.test(160, 3449, p = 0.05, alternative = "greater")
## 
##  1-sample proportions test with continuity correction
## 
## data:  160 out of 3449, null probability 0.05
## X-squared = 0.87166, df = 1, p-value = 0.8248
## alternative hypothesis: true p is greater than 0.05
## 95 percent confidence interval:
##  0.04071041 1.00000000
## sample estimates:
##          p 
## 0.04639026

Os resultados mostraram que a propor??o das utiliza??es da solution 17 n?o ? igual ou inferior a 5%.

Como o deliverable_2_26 ? o mais utilizado, surgiu a necessidade de verificar a poss?vel exist?ncia entre o perfil de gest?o e o tipo de a??o tomada considerando apenas esse perfil. Novamente, o teste qui-quadrado foi realizado e se mostrou significativo.

#Qui quadrado, uma vez que ha duas variaveis categoricas e voce deseja ver a associacao entre elas 
fase_completa %>% 
  filter(F_deliver == "2_26") %>% 
  do(tidy(chisq.test(.$Solution, .$Perfil, simulate.p.value = TRUE)))
## # A tibble: 1 x 4
##   statistic  p.value parameter method                                      
##       <dbl>    <dbl> <lgl>     <chr>                                       
## 1      463. 0.000500 NA        "Pearson's Chi-squared test with simulated ~

E a tabela abaixo concatena tais resultados.

fase_completa %>%  #get datasaet
    #filter(F_deliver == "2_26") %>% 
  group_by(Perfil, Solution) %>%  #grouping variable
  count() %>%  #sum unique
  bind_rows(group_by(.,Perfil) %>% #create new variable to sum up
              summarise(n=sum(n)) %>%
              mutate(Solution='Total')) %>% 
  bind_rows(group_by(.,Solution) %>% #  #create new variable to sum up
              summarise(n=sum(n)) %>%
              mutate(Perfil='Total')) %>%
  spread(Perfil, n, fill="0") %>%  #spread format
  kable() %>% kable_styling() %>% 
  row_spec(14, bold = T, color = "black", background = "white") %>% 
    footnote(general = "A Legenda a seguir apresenta as defini??es utilizadas na Tabela. ",
           number = c("D: Dominance ", "I: Influence", "S: Steadiness")) #report in a nice style
Solution D I S Total
Solution 1 201 43 2 246
Solution 10 48 352 5 405
Solution 11 32 32 27 91
Solution 12 30 51 0 81
Solution 17 52 100 8 160
Solution 2 42 301 5 348
Solution 3 25 35 23 83
Solution 4 24 53 1 78
Solution 5 466 113 4 583
Solution 6 84 665 9 758
Solution 7 65 67 43 175
Solution 8 51 103 5 159
Solution 9 229 50 3 282
Total 1349 1965 135 3449
Note:
A Legenda a seguir apresenta as defini??es utilizadas na Tabela.
1 D: Dominance
2 I: Influence
3 S: Steadiness

Formalmente, essa etapa encerra a resposta à hipótese 3.

Novas perguntas

Em abril / 2019,

#renomeei o dataframe apenas para deixar tudo mais facil
#library(readxl)
#DataFrameModelo <- read_excel("C:/Users/luisf/Dropbox/Puc-Rio/Consultoria - Jair Azevedo/DataFrameModelo.xlsx")
#View(DataFrameModelo)

dados <- DataFrameModelo

#rename
dados <- dados %>% mutate(media_ganho = `Média do Ganho de Rentabilidade`)
#check
dados %>% count(media_ganho)
dados %>% count(`Média do Ganho de Rentabilidade`)

#3 blocks design
dados %>% 
  summarise(mean(media_ganho))

dados <- dados %>% 
  mutate(classe = case_when(
    media_ganho < 2.67 ~ "C",
    media_ganho >= 6.67~ "A",
    TRUE ~ "B"))

dados <- dados %>% mutate(classe = factor(classe))

dados <- dados %>% mutate(Classe_Ganho = factor(Classe_Ganho))

plot_rawdata <- ggplot(dados, aes(media_ganho)) +
  geom_density()

plot_classe <- qplot(dados$Classe_Ganho, geom = "bar")
grid.arrange(plot_rawdata, plot_classe)

#anova
library(nnet) #pacote para realizar regressao logistica multinomial. Essa regressao é realizada quando temos uma VD categórica com mais de dois níveis
library("DescTools") #calcular o pseudo-R2
## Warning: package 'DescTools' was built under R version 3.5.3
## 
## Attaching package: 'DescTools'
## The following object is masked from 'package:HH':
## 
##     OddsRatio
#cria o modelo (repare que a funcao multinom é aquela que vai estipular as variaveis)
mod_escolha <- multinom(formula = Classe_Ganho ~ `Numero de Projetos` + 
                          factor(`Perfil DISC`) + QTD_Uso_base, data = dados)
## # weights:  15 (8 variable)
## initial  value 103.269555 
## iter  10 value 98.031225
## final  value 97.680049 
## converged
#criterio Akaike
summary(mod_escolha)
## Call:
## multinom(formula = Classe_Ganho ~ `Numero de Projetos` + factor(`Perfil DISC`) + 
##     QTD_Uso_base, data = dados)
## 
## Coefficients:
##   (Intercept) `Numero de Projetos` factor(`Perfil DISC`)I QTD_Uso_base
## B    1.426485           0.03653776             -0.5703095  -0.03168942
## C    3.561262          -0.52544625             -0.1632074  -0.07083640
## 
## Std. Errors:
##   (Intercept) `Numero de Projetos` factor(`Perfil DISC`)I QTD_Uso_base
## B    1.606061           0.04477274              0.5082090   0.04484033
## C    1.989736           0.42080144              0.5545382   0.05208400
## 
## Residual Deviance: 195.3601 
## AIC: 211.3601
PseudoR2(mod_escolha, which = NULL) #Isso é para gerar o pseudo-R2
##   McFadden 
## 0.04926286
## Na base anterior, você fez um modelo de regressao linear 
mod_linear <- lm(dados$`Média do Ganho de Rentabilidade` ~ dados$`Numero de Projetos` + dados$`Perfil DISC` + dados$QTD_Uso_base)
summary(mod_linear)

Modelo estatísticos podem ser avaliados por diferentes maneiras. Em modelos de regressão logística, O poder explanatório que as variáives independentes (entrada) possuem na variável dependente (saída) é acessado pelo Pseudo R2 e, de forma inversa, da função logaritmo de verossimilhança (-2LL). Existem algumas maneiras distintas de computar o R2 e a estatística McFadden é tipicamente utilizada e encontra-se em sua apresentação algébrica abaixo:

\(R^{2}_{\text{McFadden}} = 1- \frac{log(L_c)}{log(L_{\text{null}})}\)

Le é o likelihood maximizado para o modelo atual e Lnull é este valor correspondente ao modelo nulo, que conta apenas como o intercepto como preditor. Dado que essa estatística retorna valores eno intervalo 0-1, considera-se que resultados iguais ou superiores a 0.4 são necessários para indicar ajuste adequado do modelo testado (McFadden, 1994).

Machine learning (ML)

dados_ml <- dados_ml %>% mutate(perfil_D = if_else(`Perfil DISC` == "D",1,0))
dados_ml <- dados_ml %>% rename(media_ganho = `Média do Ganho de Rentabilidade`)
dados_ml <- dados_ml %>% rename(n_projetos = `Numero de Projetos`)
dados_ml2 <- dados_ml %>% dplyr::select("media_ganho", "n_projetos", "QTD_Uso_base", "perfil_D")

Três grandes de algorítimos estão presentes em técnicas de ML, que são: 1. supervisionados, 2. não supervisionados e 3. de reforço. O algoritmo de Regressão linear é do tipo supervisionado e é calcado nos pontos de dados para encontrar a melhor função da reta para modelar uuma variável desfecho contínua.

Random forest

library(randomForest)
## Warning: package 'randomForest' was built under R version 3.5.3
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following object is masked from 'package:dplyr':
## 
##     combine
## The following object is masked from 'package:ggplot2':
## 
##     margin
library(caret)
## Warning: package 'caret' was built under R version 3.5.3
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
## The following object is masked from 'package:survival':
## 
##     cluster
## The following object is masked from 'package:purrr':
## 
##     lift
dados$Perfil_DISC <- as.factor(dados$`Perfil DISC`)
dados$Classe_ganho <- as.factor(dados$Classe_Ganho)
dados$Numero_de_Projetos <- dados$`Numero de Projetos`

# sorteando os conjuntos de treinamento e teste

dados %>% dplyr::select(Perfil_DISC,    Numero_de_Projetos, QTD_Uso_base, Classe_ganho) -> df1

set.seed(42)
sample.int(94, 75, replace = FALSE) -> esc 
trein <- df1[esc, ]
test  <- df1[-esc, ]
# formulando o modelo
form <- formula(Classe_ganho ~ .) # define Classe_ganho como target
target <- all.vars(form)[1]
modelrf_CG <- randomForest(formula=form, data=df1, ntree=300, mtry=1, 
                           importance=TRUE, localImp=TRUE,
                           na.action=na.roughfix, replace=FALSE)

Veja os resultados do treinamento

Importância das variáveis preditoras

round(head(modelrf_CG$importance,4),5)
##                           A        B        C MeanDecreaseAccuracy
## Perfil_DISC        -0.01782  0.00730 -0.02153             -0.00863
## Numero_de_Projetos  0.02778  0.00369  0.07078              0.02951
## QTD_Uso_base        0.00517 -0.00980  0.01489              0.00225
##                    MeanDecreaseGini
## Perfil_DISC                 0.90771
## Numero_de_Projetos          3.34830
## QTD_Uso_base                5.10894

Matriz de confusão do treinamento

modelrf_CG$confusion
##    A  B  C class.error
## A  8 12 12   0.7500000
## B 11  8 16   0.7714286
## C  2 11 14   0.4814815
# Aplicando o modelo do conjunto de teste
prev <- predict(modelrf_CG, test, type="response")
MC2 <- caret::confusionMatrix(prev, test$Classe_ganho)$table

Matriz de confusão do teste

MC2
##           Reference
## Prediction A B C
##          A 6 0 0
##          B 1 4 3
##          C 1 2 2