knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)
setwd("~/Google Drive/GDrive/UFRGS/Ensino/20221 - ERE/ADP - Experimentos/Scripts Aulas")
Esse é um notebook do R, escrito em R Markdown. Quando tu executas o código no notebook, os resultados aparecem embaixo do código. Eu acho uma forma legal de garantir a reprodutibilidade das análises e de mesclar comentário com resultados das análises.
Eu estou usando, com o consentimento da minha aluna, uma base de dados proveniente de um TCC que eu orientei sobre marcas humanizadas. Ela coletou 326 casos via Qualtrics, em um design de 2 fatores entre participantes: Marca “Controle” e Marca “Humanizada”.
A condição de controle apresenta o tweet stream de uma marca fictícia de celulares, lidando com um problema de uma cliente.
A condição experimental apresenta a mesma marca fictícia em um tom conversacional descontraído, com gifs, imagens e informalidade.
Existem problemas de design e confounds (e.g., reclamação só na condição controle, múltiplas dimensões da humanização manipuladas de uma só vez, etc.), mas para efeitos de análise ignoraremos essas limitações por ora.
O primeiro passo é importar os dados. Eu recomendo usar sempre os dados “mais brutos”, ou seja, sem qualquer forma de processamento. No Qualtrics, essas opções são texto (TXT) ou texto - valores separados por vírgula (CSV). Ao exportar, podemos escolher se queremos os dados como variáveis nominais (“choice text”) ou números. Eu recomendo baixar os dois e usa-los de acordo com a necessidade. Não esquecer de pedir para o Qualtrics exportar a ordem da randomização das variáveis. Isso adiciona muitas variáveis à base de dados, mas é informação que pode ser útil. Outro desafio diz respeito ao formato de exportação. O Qualtrics, por default, exporta três “cabeçalhos” na base de dados, contendo nome da variável, descrições e enunciados. Se nós importarmos os dados diretos, o R julgará que todas as variáveis são strings e as operações com os dados serão limitadas (além, claro, de estarem erradas). Por isso, eu importo os dados apenas e, depois, adiciono os nomes das variáveis às bases de dados. Eu poderia abrir os dados no Excel e apagar duas linhas, mas eu quero evitar “tocar” na base de dados para minimizar chances de erro.
#importando dados numéricos como dn
require(readr)
dn<-read_csv("~/Google Drive/GDrive/UFRGS/Ensino/20221 - ERE/ADP - Experimentos/Scripts Aulas/TCC_Karen/TCC_Karen_Numeros.csv",
col_names = FALSE, skip = 3)
names(dn)<-read_csv("~/Google Drive/GDrive/UFRGS/Ensino/20221 - ERE/ADP - Experimentos/Scripts Aulas/TCC_Karen/TCC_Karen_Numeros.csv",
col_names = FALSE)[1,]
#importando dados em texto como dt
dt<-read_csv("~/Google Drive/GDrive/UFRGS/Ensino/20221 - ERE/ADP - Experimentos/Scripts Aulas/TCC_Karen/TCC_Karen_Strings.csv",
col_names = FALSE, skip = 3)
names(dt)<-read_csv("~/Google Drive/GDrive/UFRGS/Ensino/20221 - ERE/ADP - Experimentos/Scripts Aulas/TCC_Karen/TCC_Karen_Strings.csv",
col_names = FALSE)[1,]
Uma inspeção inicial mostra que a base “em texto” já considera as escalas como números. Podemos usar apenas essa para a análise. A função “head” mostra as primeiras cinco linhas da base / objeto. Aliás, essa função é comum a muitas linguagens de programação, inclusive ao Python.
head(dn)
## # A tibble: 6 × 53
## StartDate EndDate Status IPAddress Progress
## <dttm> <dttm> <dbl> <chr> <dbl>
## 1 2021-04-22 15:01:39 2021-04-22 15:06:26 0 179.232.95.187 100
## 2 2021-04-22 15:10:26 2021-04-22 15:12:16 0 179.232.95.187 100
## 3 2021-04-22 18:28:11 2021-04-22 18:30:43 0 189.6.242.184 100
## 4 2021-04-22 18:26:16 2021-04-22 18:32:21 0 177.79.5.161 100
## 5 2021-04-22 18:29:08 2021-04-22 18:32:58 0 187.71.140.167 100
## 6 2021-04-22 18:32:12 2021-04-22 18:35:56 0 186.219.134.85 100
## # … with 48 more variables: Duration (in seconds) <dbl>, Finished <dbl>,
## # RecordedDate <dttm>, ResponseId <chr>, RecipientLastName <lgl>,
## # RecipientFirstName <lgl>, RecipientEmail <lgl>, ExternalReference <lgl>,
## # LocationLatitude <dbl>, LocationLongitude <dbl>, DistributionChannel <chr>,
## # UserLanguage <chr>, Consentimento <dbl>, Q01 <dbl>, Q02 <dbl>, Q03 <dbl>,
## # Q04 <dbl>, Q05 <dbl>, Q06 <dbl>, Q07 <dbl>, Q08 <dbl>, Q09 <dbl>,
## # Q10 <dbl>, Q11 <dbl>, Q01 <dbl>, Q02 <dbl>, Q03 <dbl>, Q04 <dbl>, …
head(dt)
## # A tibble: 6 × 53
## StartDate EndDate Status IPAddress Progress
## <dttm> <dttm> <chr> <chr> <dbl>
## 1 2021-04-22 15:01:39 2021-04-22 15:06:26 IP Address 179.232.95.187 100
## 2 2021-04-22 15:10:26 2021-04-22 15:12:16 IP Address 179.232.95.187 100
## 3 2021-04-22 18:28:11 2021-04-22 18:30:43 IP Address 189.6.242.184 100
## 4 2021-04-22 18:26:16 2021-04-22 18:32:21 IP Address 177.79.5.161 100
## 5 2021-04-22 18:29:08 2021-04-22 18:32:58 IP Address 187.71.140.167 100
## 6 2021-04-22 18:32:12 2021-04-22 18:35:56 IP Address 186.219.134.85 100
## # … with 48 more variables: Duration (in seconds) <dbl>, Finished <lgl>,
## # RecordedDate <dttm>, ResponseId <chr>, RecipientLastName <lgl>,
## # RecipientFirstName <lgl>, RecipientEmail <lgl>, ExternalReference <lgl>,
## # LocationLatitude <dbl>, LocationLongitude <dbl>, DistributionChannel <chr>,
## # UserLanguage <chr>, Consentimento <chr>, Q01 <dbl>, Q02 <dbl>, Q03 <dbl>,
## # Q04 <dbl>, Q05 <dbl>, Q06 <dbl>, Q07 <dbl>, Q08 <dbl>, Q09 <dbl>,
## # Q10 <dbl>, Q11 <dbl>, Q01 <dbl>, Q02 <dbl>, Q03 <dbl>, Q04 <dbl>, …
Porque minha aluna já tinha me dito que ela testou duas vezes o questionário, eu sei que precisamos nos livrar das primeiras duas linhas de dados. Mas vamos confirmar se esse é o caso.
names(dt)
## [1] "StartDate" "EndDate" "Status"
## [4] "IPAddress" "Progress" "Duration (in seconds)"
## [7] "Finished" "RecordedDate" "ResponseId"
## [10] "RecipientLastName" "RecipientFirstName" "RecipientEmail"
## [13] "ExternalReference" "LocationLatitude" "LocationLongitude"
## [16] "DistributionChannel" "UserLanguage" "Consentimento"
## [19] "Q01" "Q02" "Q03"
## [22] "Q04" "Q05" "Q06"
## [25] "Q07" "Q08" "Q09"
## [28] "Q10" "Q11" "Q01"
## [31] "Q02" "Q03" "Q04"
## [34] "Q05" "Q06" "Q07"
## [37] "Q08" "Q09" "Q01"
## [40] "Q01" "Q02" "Q03"
## [43] "Q04_1" "Q04_2" "Q04_3"
## [46] "Q05" "Q06" "Q01"
## [49] "FL_20_DO" "CondControle_DO" "CondHumana_DO"
## [52] "Atitude_DO" "ItensHumanização_DO"
Ops. Parece que a nomeação das variáveis tem um problema. O Qualtrics nos permite nomear variáveis. Eu recomendo que as nomes sejam sempre (1) diagnósticos: nos permitam saber exatamente do que se trata a variável sem precisar recorrer ao questionário ou dicionário de variáveis e (2) simples: o menor número de caracteres possível (precisaremos digitar o nome das variáveis pelo menos uma vez), sem letras maiusculas (o R diferencia capitalização), sem acentuação (pode dar problema), não começando em números (o R não permite que objetos e variáveis tenham nomes que começam em números). Eu vou concertar os nomes das duas bases aqui. Eu li o questionário e destilei as características principais de cada variável.
nomes_corrigidos<-c("StartDate", "EndDate", "Status", "IPAddress", "Progress",
"Duration", "Finished", "RecordedDate", "ResponseId",
"RecipientLastName", "RecipientFirstName", "RecipientEmail",
"ExternalReference", "LocationLatitude", "LocationLongitude",
"DistributionChannel", "UserLanguage", "Consentimento",
"a1_reputacao", "a2_cara", "a3_prestigio", "a4_qualidade",
"a5_gosto", "a6_melhor", "a7_admiro", "a8_simpatia",
"a9_compraria", "a10_recomendaria", "a11_prefiro",
"h1_homens", "h2_humanas", "h3_amigos", "h4_personalidade",
"h5_atraente", "h6_medo", "h7_emocional", "h8_aberta",
"h9_etica", "humanizada", "genero", "idade", "escolaridade",
"freq_twitter", "freq_instagram", "freq_facebook",
"sabia_humanizada", "comentário", "sorteio", "condicao",
"CondControle_DO", "CondHumana_DO", "Atitude_DO",
"ItensHumanização_DO")
#ver se o número de variáveis nas bases "match" o número de variáveis que eu digitei
length(names(dt))
## [1] 53
length(names(dn))
## [1] 53
length(nomes_corrigidos)
## [1] 53
#já que eles todos têm o mesmo número de elementos
names(dt)<-nomes_corrigidos
names(dn)<-nomes_corrigidos
Agora sim, limpando a base de dados. Como eu havia comentado, a minha aluna rodou o estudo duas vezes e deixou esses dados na base. Precisamos eliminar.
names(dt)
## [1] "StartDate" "EndDate" "Status"
## [4] "IPAddress" "Progress" "Duration"
## [7] "Finished" "RecordedDate" "ResponseId"
## [10] "RecipientLastName" "RecipientFirstName" "RecipientEmail"
## [13] "ExternalReference" "LocationLatitude" "LocationLongitude"
## [16] "DistributionChannel" "UserLanguage" "Consentimento"
## [19] "a1_reputacao" "a2_cara" "a3_prestigio"
## [22] "a4_qualidade" "a5_gosto" "a6_melhor"
## [25] "a7_admiro" "a8_simpatia" "a9_compraria"
## [28] "a10_recomendaria" "a11_prefiro" "h1_homens"
## [31] "h2_humanas" "h3_amigos" "h4_personalidade"
## [34] "h5_atraente" "h6_medo" "h7_emocional"
## [37] "h8_aberta" "h9_etica" "humanizada"
## [40] "genero" "idade" "escolaridade"
## [43] "freq_twitter" "freq_instagram" "freq_facebook"
## [46] "sabia_humanizada" "comentário" "sorteio"
## [49] "condicao" "CondControle_DO" "CondHumana_DO"
## [52] "Atitude_DO" "ItensHumanização_DO"
E a variável sorteio. Vamos ver onde esses casos estão
head(dt$sorteio)
## [1] "KAREN - DESCONSIDERAR" "KAREN 2 - DESCONSIDERAR"
## [3] "51991838706" "51998036343"
## [5] "51980424234" "51 997799888"
São os dois primeiros casos. Vamos elimina-los das duas bases de dados. Eu vou criar uma base nova, sem esses dois casos. Eu não vou manter o mesmo nome, do contrário a base pode ser corrompida múltiplas vezes. Existem várias formas de fazer isso. Eu posso pedir para o R eliminar os casos cujas respostas para a variável sorteio são “KAREN - DESCONSIDERAR” e “KAREN 2 - DESCONSIDERAR” respectivamente. Ou, nesse caso, posso pedir só para apagar os dois primeiros casos. Daqui em diante usarei só a base “dt” que tem números nas escalas e texto quando apropriado.
d<-dt[-c(1,2),]
head(d$sorteio)
## [1] "51991838706" "51998036343"
## [3] "51980424234" "51 997799888"
## [5] "brunalimalampert@hotmail.com" "sinhorellivictoria@gmail.com"
Eu quero verificar quem acabou o questionário. Para isso, eu farei uma tabela e a colocarei em um formato mais amigável usando uma função do markdown, Kable.
require(knitr)
require(questionr)
table(d$Finished)
##
## FALSE TRUE
## 125 199
d$Acabou<-factor(d$Finished, levels = c("FALSE","TRUE"), labels = c("Não","Sim"))
t.acabou<-freq(d$Acabou, digits = 2, exclude = NA, total = T)
kable(t.acabou, caption = "Quantos acabaram o questionário")
| n | % | |
|---|---|---|
| Não | 125 | 38.58 |
| Sim | 199 | 61.42 |
| Total | 324 | 100.00 |
Muita gente não acabou o questionário. Muitos respondentes não inseriram o email ou telefone para o sorteio, outros não enviaram o questionário. TODOS os testes que eu farei aqui eliminam missings do processo de análise, e as não respostas acabariam sendo eliminadas. Mesmo assim, eu eliminarei os que não acabaram o questionário da amostra.
d.f<-subset(d, d$Acabou == "Sim")
A forma mais simples de fazer uma tabela de frequências é com o comando “table”. Ela é, também, a forma menos “pronta para o consumo”.
table(d.f$genero)
##
## Homem Mulher
## 67 132
prop.table(table(d.f$genero))*100
##
## Homem Mulher
## 33.66834 66.33166
O pacote usado acima “questionr” é um pacote com várias funções para lidar com estatísticas descritivas. Existem outros tantos pacotes para isso, mas eu vou com esse mesmo. Nele, a função “freq” monta uma tabela de frequência com totais. A função “kable” coloca essa tabela em um formato amigável para apresentaç
t.genero <- freq(d.f$genero, digits = 2, exclude = NA, total = T)
kable(t.genero, caption = "Distribuição de Respondentes por Gênero")
| n | % | |
|---|---|---|
| Homem | 67 | 33.67 |
| Mulher | 132 | 66.33 |
| Total | 199 | 100.00 |
Normalmente, para tabelas de frequências com poucos casos, eu não faço um gráfico. Digamos, entretanto, que eu queira fazer um gráfico de pizza.
require(ggsci)
require(ggplot2)
ggplot(t.genero[-3,], aes(x="", y=`%`,fill=rownames(t.genero[-3,]), label = round(`%`,2)))+
geom_bar(width = 1, stat = "identity")+
geom_text(position = position_stack(vjust = 0.5),size = 5)+
scale_fill_npg() +
labs(x=NULL,fill="Sexo",y="%",title="Gênero dos Respondentes")+
coord_polar("y", start=0)
Em seguida, vamos dar uma olhada na idade dos respondentes
mean(d.f$idade, na.rm = T)
## [1] 28.76884
sd(d.f$idade, na.rm = T)
## [1] 9.949206
library(psych)
describe(d.f$idade)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 199 28.77 9.95 25 26.94 4.45 18 84 66 2.26 6.32 0.71
Então, podemos observar que a média de idade é de 28.77 anos, com um desvio-padrão de 9.95.
Vamos fazer um gráfico? Para esse tipo de variável, faz mais sentido fazer um histograma.
ggplot(d, aes(x=idade)) +
geom_histogram(aes(y=..density..),binwidth = 1, color="grey",fill="grey")+
geom_density(alpha=.2, fill="green")+
geom_vline(aes(xintercept=mean(idade,na.rm=T)),color="blue",linetype="dashed",size=1)+
labs(title="Idade dos Respondentes",y=NULL,x="Idade")
Será que existem outliers na idade? Sim, mas não faremos nada a respeito! (Por que faríamos?)
idade.out<-boxplot(d.f$idade, col = "pink")
sort(idade.out$out)
## [1] 44 49 52 54 55 55 57 58 58 58 61 61 64 84
E como é a distribuição de respondentes por escolaridade?
t.escola <- freq(d.f$escolaridade, digits = 2, exclude = NA, total = T, sort = "dec")
kable(t.escola, caption = "Distribuição de Respondentes por Escolaridade")
| n | % | |
|---|---|---|
| Ensino Superior - Incompleto | 108 | 54.27 |
| Ensino Superior - Completo | 39 | 19.60 |
| Pós-graduação | 37 | 18.59 |
| Ensino Médio - Completo | 9 | 4.52 |
| Mestrado | 5 | 2.51 |
| Doutorado | 1 | 0.50 |
| Total | 199 | 100.00 |
Poderíamos fazer só um gráfico de pizza, mas para variar faremos um de colunas também.
library(ggrepel)
ggplot(t.escola[-7,], aes(x="", y=`%`,fill=rownames(t.escola[-7,]), label = round(`%`,2)))+
geom_bar(width = 1, stat = "identity")+
geom_text_repel(position = position_stack(vjust = 0.5),size = 5)+
scale_fill_simpsons() +
labs(x=NULL,fill="Sexo",y="%",title="Gênero dos Respondentes")+
coord_polar("y", start=0)
ggplot(t.escola[-7,], aes(x=rownames(t.escola[-7,]), y=`%`)) +
geom_col(fill = "lightblue")+
geom_text(aes(label = round(`%`, 1)), vjust = -.5)+
labs(x = "Escolaridade", y = "%", title = "Distribuição da Escolaridade")
Aqui eu criarei variáveis compostas (médias) para Atitude e Humanização da Marca e extrairei o Alfa de Cronbach.
d.f$atitude.df <- data.frame(d.f$a1_reputacao, d.f$a2_cara, d.f$a3_prestigio,
d.f$a4_qualidade, d.f$a5_gosto, d.f$a6_melhor,
d.f$a7_admiro, d.f$a8_simpatia, d.f$a9_compraria,
d.f$a10_recomendaria, d.f$a11_prefiro)
d.f$atitude<-rowMeans(d.f$atitude.df, na.rm = TRUE)
d.f$human.df <- data.frame(d.f$h1_homens, d.f$h2_humanas, d.f$h3_amigos, d.f$h4_personalidade,
d.f$h5_atraente, d.f$h6_medo, d.f$h7_emocional, d.f$h8_aberta,
d.f$h9_etica)
d.f$human <- rowMeans(d.f$human.df, na.rm = TRUE)
require(psych)
psych::alpha(d.f$atitude.df)
##
## Reliability analysis
## Call: psych::alpha(x = d.f$atitude.df)
##
## raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
## 0.96 0.96 0.96 0.67 22 0.004 2.3 1 0.75
##
## lower alpha upper 95% confidence boundaries
## 0.95 0.96 0.97
##
## Reliability if an item is dropped:
## raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r
## d.f.a1_reputacao 0.95 0.95 0.96 0.65 19 0.0047 0.0479
## d.f.a2_cara 0.97 0.97 0.97 0.76 32 0.0031 0.0017
## d.f.a3_prestigio 0.95 0.95 0.96 0.66 19 0.0045 0.0499
## d.f.a4_qualidade 0.95 0.95 0.96 0.66 20 0.0044 0.0513
## d.f.a5_gosto 0.95 0.95 0.96 0.65 19 0.0046 0.0485
## d.f.a6_melhor 0.95 0.95 0.96 0.66 19 0.0045 0.0493
## d.f.a7_admiro 0.95 0.95 0.96 0.66 19 0.0046 0.0483
## d.f.a8_simpatia 0.95 0.95 0.96 0.65 19 0.0047 0.0465
## d.f.a9_compraria 0.95 0.95 0.96 0.66 19 0.0046 0.0495
## d.f.a10_recomendaria 0.95 0.95 0.96 0.65 19 0.0046 0.0480
## d.f.a11_prefiro 0.95 0.95 0.96 0.66 19 0.0045 0.0496
## med.r
## d.f.a1_reputacao 0.75
## d.f.a2_cara 0.76
## d.f.a3_prestigio 0.75
## d.f.a4_qualidade 0.76
## d.f.a5_gosto 0.75
## d.f.a6_melhor 0.75
## d.f.a7_admiro 0.75
## d.f.a8_simpatia 0.75
## d.f.a9_compraria 0.75
## d.f.a10_recomendaria 0.75
## d.f.a11_prefiro 0.75
##
## Item statistics
## n raw.r std.r r.cor r.drop mean sd
## d.f.a1_reputacao 199 0.90 0.90 0.89 0.87 2.4 1.4
## d.f.a2_cara 199 0.33 0.36 0.26 0.25 2.6 1.0
## d.f.a3_prestigio 199 0.88 0.88 0.87 0.85 2.2 1.2
## d.f.a4_qualidade 199 0.84 0.85 0.83 0.81 2.2 1.1
## d.f.a5_gosto 199 0.90 0.90 0.89 0.88 2.4 1.2
## d.f.a6_melhor 199 0.87 0.87 0.86 0.84 2.1 1.2
## d.f.a7_admiro 199 0.89 0.88 0.88 0.86 2.2 1.3
## d.f.a8_simpatia 199 0.90 0.90 0.89 0.88 2.4 1.4
## d.f.a9_compraria 199 0.89 0.89 0.88 0.86 2.3 1.3
## d.f.a10_recomendaria 199 0.90 0.89 0.89 0.87 2.2 1.3
## d.f.a11_prefiro 199 0.87 0.87 0.86 0.84 2.0 1.1
##
## Non missing response frequency for each item
## 1 2 3 4 5 miss
## d.f.a1_reputacao 0.37 0.18 0.20 0.17 0.09 0
## d.f.a2_cara 0.18 0.21 0.44 0.15 0.02 0
## d.f.a3_prestigio 0.39 0.22 0.21 0.16 0.02 0
## d.f.a4_qualidade 0.32 0.25 0.32 0.09 0.02 0
## d.f.a5_gosto 0.34 0.21 0.26 0.13 0.06 0
## d.f.a6_melhor 0.46 0.17 0.27 0.07 0.04 0
## d.f.a7_admiro 0.43 0.18 0.22 0.12 0.06 0
## d.f.a8_simpatia 0.39 0.15 0.18 0.17 0.11 0
## d.f.a9_compraria 0.41 0.16 0.24 0.14 0.05 0
## d.f.a10_recomendaria 0.44 0.19 0.21 0.11 0.06 0
## d.f.a11_prefiro 0.50 0.17 0.23 0.08 0.03 0
psych::alpha(d.f$human.df)
##
## Reliability analysis
## Call: psych::alpha(x = d.f$human.df)
##
## raw_alpha std.alpha G6(smc) average_r S/N ase mean sd median_r
## 0.96 0.95 0.96 0.7 21 0.0043 2.7 1.3 0.72
##
## lower alpha upper 95% confidence boundaries
## 0.95 0.96 0.96
##
## Reliability if an item is dropped:
## raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r
## d.f.h1_homens 0.96 0.96 0.96 0.75 23 0.0041 0.013
## d.f.h2_humanas 0.95 0.95 0.95 0.69 18 0.0052 0.019
## d.f.h3_amigos 0.95 0.95 0.95 0.68 17 0.0055 0.015
## d.f.h4_personalidade 0.95 0.95 0.96 0.71 19 0.0047 0.022
## d.f.h5_atraente 0.96 0.96 0.96 0.74 23 0.0041 0.016
## d.f.h6_medo 0.95 0.95 0.95 0.69 18 0.0052 0.015
## d.f.h7_emocional 0.95 0.95 0.95 0.69 18 0.0052 0.020
## d.f.h8_aberta 0.95 0.95 0.95 0.68 17 0.0054 0.015
## d.f.h9_etica 0.95 0.95 0.95 0.70 18 0.0050 0.020
## med.r
## d.f.h1_homens 0.77
## d.f.h2_humanas 0.67
## d.f.h3_amigos 0.67
## d.f.h4_personalidade 0.76
## d.f.h5_atraente 0.77
## d.f.h6_medo 0.69
## d.f.h7_emocional 0.67
## d.f.h8_aberta 0.67
## d.f.h9_etica 0.70
##
## Item statistics
## n raw.r std.r r.cor r.drop mean sd
## d.f.h1_homens 199 0.68 0.70 0.64 0.62 2.6 1.2
## d.f.h2_humanas 199 0.91 0.91 0.91 0.89 2.7 1.5
## d.f.h3_amigos 199 0.94 0.93 0.93 0.92 2.7 1.7
## d.f.h4_personalidade 199 0.83 0.84 0.81 0.79 2.7 1.4
## d.f.h5_atraente 199 0.71 0.72 0.67 0.65 2.6 1.3
## d.f.h6_medo 199 0.91 0.90 0.90 0.88 2.9 1.8
## d.f.h7_emocional 199 0.91 0.91 0.90 0.88 2.8 1.5
## d.f.h8_aberta 199 0.93 0.92 0.93 0.91 2.9 1.7
## d.f.h9_etica 199 0.88 0.88 0.87 0.85 2.6 1.4
##
## Non missing response frequency for each item
## 1 2 3 4 5 miss
## d.f.h1_homens 0.27 0.18 0.35 0.13 0.08 0
## d.f.h2_humanas 0.38 0.11 0.17 0.17 0.18 0
## d.f.h3_amigos 0.44 0.04 0.12 0.15 0.25 0
## d.f.h4_personalidade 0.27 0.19 0.20 0.21 0.14 0
## d.f.h5_atraente 0.28 0.16 0.29 0.19 0.09 0
## d.f.h6_medo 0.40 0.08 0.05 0.14 0.34 0
## d.f.h7_emocional 0.34 0.13 0.15 0.20 0.19 0
## d.f.h8_aberta 0.41 0.08 0.05 0.17 0.30 0
## d.f.h9_etica 0.34 0.13 0.27 0.16 0.10 0
Vamos inspecionar as médias de atitude e médias de “humanização” da marca por condição. Mas antes disso, quantos casos temos por condição mesmo?
table(d.f$condicao)
##
## CondControle CondHumana
## 98 101
#fazendo mais "bonito"
d.f$condicoes <- factor(d.f$condicao, levels = c("CondControle", "CondHumana"),
labels = c("Controle", "Humanizada"))
t.condicao <- freq(d.f$condicoes, digits = 2, exclude = NA, total = T)
kable(t.condicao, caption = "Respondentes por Condição")
| n | % | |
|---|---|---|
| Controle | 98 | 49.25 |
| Humanizada | 101 | 50.75 |
| Total | 199 | 100.00 |
Mais ou menos equilibradas as condições. Agora vamos ver como as variáveis de interesse se distribuem por condições. Para isso, eu vou usar a função “describeBy”, do pacote psych.
desc.atitude <- describeBy(d.f$atitude,d.f$condicoes, mat = T, digits = 2)
names(desc.atitude)[2] <- "Condições"
row.names(desc.atitude)<-NULL
desc.human <- describeBy(d.f$human,d.f$condicoes, mat = T, digits = 2)
names(desc.human)[2] <- "Condições"
row.names(desc.human)<-NULL
desc.atitude
## item Condições vars n mean sd median trimmed mad min max range skew
## 1 1 Controle 1 98 1.62 0.65 1.36 1.53 0.40 1 3.73 2.73 1.32
## 2 2 Humanizada 1 101 2.89 0.93 3.09 2.91 1.08 1 4.82 3.82 -0.23
## kurtosis se
## 1 1.21 0.07
## 2 -0.73 0.09
desc.human
## item Condições vars n mean sd median trimmed mad min max range skew
## 1 1 Controle 1 98 1.64 0.70 1.44 1.52 0.66 1 4.11 3.11 1.60
## 2 2 Humanizada 1 101 3.78 0.81 3.89 3.83 0.82 1 5.00 4.00 -0.73
## kurtosis se
## 1 2.61 0.07
## 2 0.47 0.08
kable(desc.atitude[,c(2,4:6)], caption = "Médias de Atitude por Condição Experimental")
| Condições | n | mean | sd |
|---|---|---|---|
| Controle | 98 | 1.62 | 0.65 |
| Humanizada | 101 | 2.89 | 0.93 |
kable(desc.human[,c(2,4:6)], caption = "Médias de Humanização por Condição Experimental")
| Condições | n | mean | sd |
|---|---|---|---|
| Controle | 98 | 1.64 | 0.70 |
| Humanizada | 101 | 3.78 | 0.81 |
Podemos, também, fazer gráficos, mas as informações são redundantes.
ggplot(desc.atitude, aes(x=`Condições`, y=mean))+
geom_bar(stat = "identity", width = 0.5, fill = "lightblue")+
geom_errorbar(aes(ymax = mean + (1.96*se), ymin=mean - (1.96*se)),
position=position_dodge(width=0.9), width=0.25)+
coord_cartesian(ylim = c(1, 5))+
labs(title="Atitude em Relação à Marca por Condição Experimental",
y="Atitude Média", x="Condições")
ggplot(desc.human, aes(x=`Condições`, y=mean))+
geom_bar(stat = "identity", width = 0.5, fill = "pink")+
geom_errorbar(aes(ymax = mean + (1.96*se), ymin=mean - (1.96*se)),
position=position_dodge(width=0.9), width=0.25)+
coord_cartesian(ylim = c(1, 5))+
labs(title="Humanização da Marca por Condição Experimental",
y="Humanização Média", x="Condições")