Gerar agregações.r 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. ## Gerar agregações: Cria agregações e representações gráficas com base nos dados da pesquisa
  2. ## Copyright (c) 2017, 2018 Adonay Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno>
  3. ## This program is free software: you can redistribute it and/or
  4. ## modify it under the terms of the GNU General Public License as
  5. ## published by the Free Software Foundation, version 3 of the
  6. ## License.
  7. ## This program is distributed in the hope that it will be useful, but
  8. ## WITHOUT ANY WARRANTY; without even the implied warranty of
  9. ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  10. ## General Public License for more details.
  11. ## You should have received a copy of the GNU General Public License
  12. ## along with this program. If not, see
  13. ## <https://www.gnu.org/licenses/>.
  14. ## Trata de grandes tabela de forma aprimorada.
  15. library(data.table)
  16. ## Ferramentas relacionadas à imputação e verificação de valores
  17. ## nulos.
  18. library(mice)
  19. library(VIM)
  20. ## Carrega os dados.
  21. dados <- read.csv("Dados.csv",
  22. check.names = FALSE,
  23. na.strings = "")
  24. dados <- data.table(dados)
  25. ## Parte a dimensão "e".
  26. outras_caracteristicas <-
  27. na.omit(unique(unlist(strsplit(as.character(dados[, e]),
  28. ","))))
  29. ## Parte as notas (para outras coisas além de "e").
  30. notas <- c()
  31. for (elemento in
  32. strsplit(na.omit(unique(unlist(strsplit(as.character(dados[, Notas]),
  33. ",")))),
  34. ": ")) {
  35. if (length(elemento) > 1) {
  36. notas <- append(notas,
  37. elemento[[1]])}
  38. else {
  39. notas <- append(notas,
  40. elemento)}}
  41. notas <- unique(notas)
  42. ## Não mencionar outras características ou notas não anula a questão,
  43. ## por isso usamos 0 ao invés de NA.
  44. dados[, (outras_caracteristicas) := 0]
  45. dados[, (notas) := as.character(0)]
  46. ## Para cada menção destas, cria uma coluna e para cada respondente
  47. ## atribui o número 1 em tal coluna.
  48. for (caracteristica in outras_caracteristicas) {
  49. dados[grep(caracteristica,
  50. dados[, e]), (caracteristica) := 1]}
  51. for (nota in notas) {
  52. linhas <- grep(nota,
  53. dados[, Notas])
  54. for (linha in linhas) {
  55. primeira_ocorrencia <-
  56. unlist(strsplit(grep(nota,
  57. unlist(strsplit(as.character(dados[linha,
  58. Notas]),
  59. ",")),
  60. value = TRUE)[[1]],
  61. ": "))
  62. if (length(primeira_ocorrencia) > 1) {
  63. dados[linha, (nota) :=
  64. paste(toupper(substr(primeira_ocorrencia[[2]],
  65. 1,
  66. 1)),
  67. substring(primeira_ocorrencia[[2]],
  68. 2),
  69. sep = "")]}
  70. else {
  71. dados[linha, (nota) :=
  72. primeira_ocorrencia]}}}
  73. ## Prepara as colunas com comparações aprimoradas. O valor NA em
  74. ## alguma delas denota que pelo menos uma das variáveis em comparação
  75. ## estava nula.
  76. combinacoes <- t(combn(rep(c(0,
  77. 1),
  78. 4),
  79. 4))
  80. combinacoes <- combinacoes[which(apply(combinacoes,
  81. 1,
  82. function(x) {
  83. !(list(x) %in%
  84. list(c(1,1,1,1)))})), ]
  85. combinacoes <- lapply(seq_len(nrow(combinacoes)),
  86. function(i) combinacoes[i, ])
  87. dimensoes <- list(list("Definição de programas livres",
  88. c(letters[1:4]),
  89. list("Convergente",
  90. list(c(1,
  91. 1,
  92. 1,
  93. 1))),
  94. list("Divergente",
  95. combinacoes)),
  96. list("Gestão universitária + Ensino-aprendizagem",
  97. c(letters[6:7]),
  98. list("Ambos",
  99. list(c(1,
  100. 1))),
  101. list("Gestão",
  102. list(c(1,
  103. 0))),
  104. list("Ensino",
  105. list(c(0,
  106. 1))),
  107. list("Nenhum",
  108. list(c(0,
  109. 0)))),
  110. list("Sustentabilidade + Economia local",
  111. c(letters[8:9]),
  112. list("Ambos",
  113. list(c(1,
  114. 1))),
  115. list("Sustentabilidade",
  116. list(c(1,
  117. 0))),
  118. list("Economia",
  119. list(c(0,
  120. 1))),
  121. list("Nenhum",
  122. list(c(0,
  123. 0)))),
  124. list("Competição + Colaboração",
  125. c(letters[10:11]),
  126. list("Ambos",
  127. list(c(1,
  128. 1))),
  129. list("Competição",
  130. list(c(1,
  131. 0))),
  132. list("Colaboração",
  133. list(c(0,
  134. 1))),
  135. list("Nenhum",
  136. list(c(0,
  137. 0)))),
  138. list("Compartilhamento digital + TCRSFDD",
  139. c(letters[12:13]),
  140. list("Ambos",
  141. list(c(1,
  142. 1))),
  143. list("Compartilhamento",
  144. list(c(1,
  145. 0))),
  146. list("TCRSFDD",
  147. list(c(0,
  148. 1))),
  149. list("Nenhum",
  150. list(c(0,
  151. 0)))),
  152. list("Intenção em contratos",
  153. c(letters[14:15]),
  154. list("Competitiva",
  155. list(c(0,
  156. 0))),
  157. list("Igual ao tipo",
  158. list(c(0,
  159. 1))),
  160. list("Inversa ao tipo",
  161. list(c(1,
  162. 0))),
  163. list("Colaborativa",
  164. list(c(1,
  165. 1)))))
  166. for (dimensao in dimensoes) {
  167. colunas <- dimensao[[2]]
  168. for (padrao in dimensao[- c(1, 2)]) {
  169. dados[which(apply(dados[, ..colunas],
  170. 1,
  171. function(x) {
  172. list(c(as.double(x))) %in%
  173. padrao[[2]]})), (dimensao[[1]]) :=
  174. padrao[[1]]]}}
  175. ## Salva cada consulta em seu arquivo específico.
  176. consultas_e_arquivos <-
  177. list(list("dados[, c(letters[1:4], letters[6:15]), with = FALSE]",
  178. "Dados primários.csv"),
  179. list("md.pattern(as.data.frame(dados)[, c(letters[1:4], letters[6:15])])",
  180. "Padrão das dimensões com observações de valores nulos.csv"),
  181. list("dados[, .N, by = c(letters[1:4])]",
  182. "Agregação a a d.csv"),
  183. list("dados[, .N, by = c(letters[6:7])]",
  184. "Agregação f e g.csv"),
  185. list("dados[, .N, by = c(letters[8:9])]",
  186. "Agregação h e i.csv"),
  187. list("dados[, .N, by = c(letters[10:11])]",
  188. "Agregação j e k.csv"),
  189. list("dados[, .N, by = c(letters[12:13])]",
  190. "Agregação l e m.csv"),
  191. list("dados[, .N, by = c(letters[14:15])]",
  192. "Agregação n e o.csv"),
  193. list("dados[, .N, by = c(names(dados)[c(17:(16 + length(outras_caracteristicas)))])]",
  194. "Agregação dos dados da dimensão e.csv"),
  195. list("dados[, .N, by = c(grep('^Compartilhamento digital$|^TCRSFDD$', names(dados), value = TRUE))]",
  196. "Agregação dos dados das notas sobre compartilhamento digital e TCRSFDD.csv"),
  197. list("dados[, .N, by = c(grep('^Contrato', names(dados), value = TRUE))]",
  198. "Agregação dos dados das notas sobre intenções de comportamento em contratos.csv"),
  199. list("dados[, .N, by = c(unlist(lapply(dimensoes, getElement, 1)))]",
  200. "Agregação aprimorada dos dados.csv"),
  201. list("dados[, .N, by = c(grep('^Definição', names(dados), value = TRUE), outras_caracteristicas)]",
  202. "Agregação aprimorada entre a definição de software livre e outras características.csv"),
  203. list("dados[, .N, by = c(grep('^Definição|^Gestão', names(dados), value = TRUE))]",
  204. "Agregação aprimorada entre a definição, gestão e ensino.csv"),
  205. list("dados[, .N, by = c(grep('^Definição|^Sustentabilidade', names(dados), value = TRUE))]",
  206. "Agregação aprimorada entre a definição, sustentabilidade e economia.csv"),
  207. list("dados[, .N, by = c(grep('[Cc]ontrato', names(dados), value = TRUE))]",
  208. "Agregação aprimorada entre as intenções de comportamento e suas notas.csv"))
  209. for (item_da_lista in consultas_e_arquivos) {
  210. write.csv(eval(parse(text = item_da_lista[[1]])),
  211. file = item_da_lista[[2]],
  212. na = "",
  213. row.names = FALSE)}
  214. ## Imprimo o histograma e o padrão em uma imagem .png. Você vai
  215. ## querer trocar `height' e `width' caso a função reclame de espaço
  216. ## vertical e horizontal insuficientes, respectivamente.
  217. png(file = "Histograma e padrão das dimensões com observações de valores nulos.png",
  218. bg = "transparent",
  219. family = "NimbusSan",
  220. height = 1024,
  221. pointsize = 12 * 90 / 72,
  222. res = 90,
  223. width = 768)
  224. aggr(as.data.frame(dados)[, c(letters[1:4],
  225. letters[6:15])],
  226. cex.axis = 0.7,
  227. labels = names(dados)[c(1:4,
  228. 6:15)],
  229. numbers = TRUE,
  230. sortVars = TRUE,
  231. ylab = c("Histograma das dimensões com valores nulos",
  232. "Padrão"))
  233. dev.off()
  234. ## Finaliza o arquivo .png.