PageRenderTime 54ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/plot_evaluations.R

https://bitbucket.org/dalloliogm/leipzig_feedback_2013
R | 226 lines | 148 code | 18 blank | 60 comment | 0 complexity | 40df333348e47697f9cffa1235799d05 MD5 | raw file
  1. #!/usr/bin/env Rscript
  2. #
  3. # Generate Plots to visualize students' evaluations on the Leipzig workshop
  4. library(ggplot2)
  5. library(reshape)
  6. library(stringr)
  7. feedback <- read.delim("evaluations2013.csv", sep=',', quote='"', header=T, na.strings="")
  8. orig.names = names(feedback)
  9. names(feedback)[10:22] <- str_match(names(feedback)[10:22], "How.*lectures\\.\\.\\.\\.(.*)\\.\\..*?")[,2] # Rate of lectures
  10. names(feedback)[62:65] <- str_match(names(feedback)[62:65], "How.*talks\\.\\.\\.\\.(.*)\\.\\..*?")[,2] # Rate of talks
  11. names(feedback)[23:35] <- str_match(names(feedback)[23:35], "Do.*work\\.\\.\\.\\.(.*)\\.\\..*?")[,2] # Relevance of lectures
  12. names(feedback)[66:69] <- str_match(names(feedback)[66:69], "Do.*work.\\.\\.\\.\\.(.*)\\.\\..*?")[,2] # Relevance of talks
  13. names(feedback)[36:48] <- str_match(names(feedback)[36:48], "How.*lectures\\.\\.\\.\\.(.*)\\.\\..*?")[,2] # Length of lectures
  14. names(feedback)[70:73] <- str_match(names(feedback)[70:73], "How.*talks\\.\\.\\.\\.(.*)\\.\\..*?")[,2] # Length of talks
  15. pdf("results/plots/feedback_charts_2013.pdf", paper="a4r", width=1280, height=1024, title="Leipzig workshop feedback 2013")
  16. generic_questions_plot = list (theme_bw(),
  17. geom_bar(aes(x=answer)),
  18. facet_wrap(~question, scales='free', nrow=3),
  19. opts(axis.text.x=theme_text(angle=0, hjust=0.5, vjust=1 ))
  20. )
  21. barchart_plot = list (theme_bw(),
  22. geom_bar(width=1, colour="#0072B2"),
  23. opts(legend.position='bottom'),
  24. facet_wrap(~variable, nrow=3),
  25. opts(axis.text.x=theme_text(angle=45, hjust=1, vjust=1 )),
  26. # opts(axis.text.x=theme_text(angle=90, hjust=0.4 )),
  27. # scale_fill_brewer(palette="RdPu"),
  28. scale_fill_brewer(palette="Blues"),
  29. scale_color_identity("black"),
  30. # scale_fill_brewer(palette="Greens"),
  31. # coord_polar(theta='y'),
  32. scale_x_discrete("answer")
  33. )
  34. pie_plot = list (theme_bw(),
  35. geom_bar(width=1),
  36. opts(legend.position='bottom'),
  37. facet_wrap(~variable, nrow=3),
  38. opts(axis.text.x=theme_text(angle=45, hjust=1, vjust=1 )),
  39. # opts(axis.text.x=theme_text(angle=90, hjust=0.4 )),
  40. # coord_polar(theta='y'),
  41. # scale_fill_brewer(type="seq", palette=2),
  42. scale_x_discrete("answer")
  43. # scale_fill_brewer(palette="RdPu")
  44. # coord_polar()
  45. # scale_fill_brewer(palette="PuRd")
  46. )
  47. violin_plot = list (theme_bw(),
  48. # geom_violin(aes(x=variable, y=as.numeric(answer), fill=1), fill="#0072B2""#56B4E9"),
  49. geom_violin(aes(x=variable, y=as.numeric(answer)), fill="#0072B2", colour="black"),
  50. opts(legend.position='none'),
  51. # facet_wrap(~variable, nrow=3),
  52. opts(axis.text.x=theme_text(angle=45, hjust=1, vjust=1 )),
  53. scale_x_discrete("Lecture")
  54. # scale_y_continuous(breaks=plot_labels)
  55. )
  56. student_barchart_plot = list(theme_bw(),
  57. geom_bar(aes(x=answer, fill=answer), colour="#31A354"),
  58. facet_wrap(~Timestamp, nrow=3),
  59. opts(legend.position='none'),
  60. opts(axis.text.x=theme_text(angle=45, hjust=1, vjust=1 )),
  61. # scale_fill_brewer(palette="RdPu"),
  62. # scale_fill_brewer(palette="PuRd"),
  63. # scale_fill_brewer(type="seq", palette=5),
  64. scale_fill_brewer(palette="Greens"),
  65. scale_x_discrete("Student (Timestamp of when the feedback form was filled)")
  66. )
  67. student_violin_plot = list(theme_bw(),
  68. # geom_violin(aes(x=Timestamp, y=as.numeric(answer), fill='#0072B2'), fill="#56B4E9"),
  69. # geom_violin(aes(x=Timestamp, y=as.numeric(answer)), fill="#0072B2"),
  70. # geom_violin(aes(x=Timestamp, y=as.numeric(answer)), fill="#009E73"), # Green009E73
  71. # geom_violin(aes(x=Timestamp, y=as.numeric(answer)), fill="#018571"),
  72. # geom_violin(aes(x=Timestamp, y=as.numeric(answer)), fill="#238B45"),
  73. # geom_violin(aes(x=Timestamp, y=as.numeric(answer)), fill="#74C476"),
  74. geom_violin(aes(x=Timestamp, y=as.numeric(answer)), fill="#31A354", colour="black"),
  75. opts(legend.position='none'),
  76. opts(axis.text.x=theme_text(angle=45, hjust=1, vjust=1 )),
  77. scale_x_discrete("Student (Timestamp of when the feedback form was filled)")
  78. )
  79. # Generic questions
  80. plot_title = "Generic questions"
  81. print(plot_title)
  82. #print(summary(feedback))
  83. #feedback.overall <- subset(feedback, select=c(1, 4:6, 8, 9, 86:90, 94, 98, 102))
  84. feedback.overall <- subset(feedback, select=c(1:4, 6, 7, 9, 74:76))
  85. feedback.overall.long <- melt(feedback.overall, id.vars="Timestamp")
  86. feedback.overall.long <- feedback.overall.long[complete.cases(feedback.overall.long),]
  87. feedback.overall.long$question <- factor(feedback.overall.long$variable)
  88. feedback.overall.long$question <- gsub("(\\w*\\.\\w*\\.\\w*\\.\\w*\\.\\w*\\.\\w*\\.\\w*)\\.", "\\1\n", feedback.overall.long$question, perl=T)
  89. feedback.overall.long$question <- gsub("\n$", "", feedback.overall.long$question, perl=T)
  90. feedback.overall.long$question <- gsub("\\.", " ", feedback.overall.long$question, perl=T)
  91. # FIX: manually fixing some labels
  92. feedback.overall.long$question <- gsub("What did .*ratio of teaching versus scientific lectures\n", "What did you think\nof the ratio of teaching versus\nscientific lectures", feedback.overall.long$question, perl=T)
  93. feedback.overall.long$question <- gsub("In general.*\n.*\n.*", "In general what did\nyou think about the length\nof the course", feedback.overall.long$question, perl=T)
  94. # FIX: merging "Department bullettin", "mailing list" and "Internal Institute mail" answers together
  95. feedback.overall.long$answer <- factor(feedback.overall.long$value)
  96. feedback.overall.long$answer <- gsub("^mailing.*", "Mailing list\n(Institute/\nDepartment/\nother)", feedback.overall.long$answer, perl=T)
  97. feedback.overall.long$answer <- gsub("^I.*needed", "I needed", feedback.overall.long$answer, perl=T)
  98. feedback.overall.long$answer <- gsub("^internal.*", "Mailing list\n(Institute/\nDepartment/\nother)", feedback.overall.long$answer, perl=T)
  99. feedback.overall.long$answer <- gsub("^Department.*", "Mailing list\n(Institute/\nDepartment/\nother)", feedback.overall.long$answer, perl=T)
  100. # FIX: manually fixing some answer labels
  101. feedback.overall.long$answer <- gsub("^Evoldir.*", "Evoldir\nwebsite", feedback.overall.long$answer, perl=T)
  102. feedback.overall.long$answer <- gsub("^More scientific.*", "More scientific\nlectures, please", feedback.overall.long$answer, perl=T)
  103. feedback.overall.long$answer <- gsub("^More teaching.*", "More teaching\non programming", feedback.overall.long$answer, perl=T)
  104. feedback.overall.long$answer <- gsub("10 years", "10\nyears", feedback.overall.long$answer, perl=T)
  105. feedback.overall.long$answer <- gsub("([\\w()']*\\s[\\w()']*)\\s", "\\1\n", feedback.overall.long$answer, perl=T)
  106. feedback.overall.long$answer <- gsub("\\.", " ", feedback.overall.long$answer, perl=T)
  107. ggplot(data=feedback.overall.long) + generic_questions_plot + ggtitle(plot_title)
  108. feedback.overall <- subset(feedback, select=c(1, 77:78, 79, 83, 85, 87:90))
  109. feedback.overall.long <- melt(feedback.overall, id.vars="Timestamp")
  110. feedback.overall.long <- feedback.overall.long[complete.cases(feedback.overall.long),]
  111. feedback.overall.long$question <- factor(feedback.overall.long$variable)
  112. feedback.overall.long$question <- gsub("(\\w*\\.\\w*\\.\\w*\\.\\w*\\.\\w*\\.\\w*\\.\\w*)\\.", "\\1\n", feedback.overall.long$question, perl=T)
  113. # feedback.overall.long$question <- gsub("(\\w*\\.\\w*\\.\\w*\\.\\w*\\.\\w*)\\.", "\\1\n", feedback.overall.long$question, perl=T)
  114. feedback.overall.long$question <- gsub("\n$", "", feedback.overall.long$question, perl=T)
  115. feedback.overall.long$question <- gsub("\\.", " ", feedback.overall.long$question, perl=T)
  116. # FIX: manually fixing some labels
  117. feedback.overall.long$question <- gsub("What did .*ratio of teaching versus scientific lectures\n", "What did you think\nof the ratio of teaching versus\nscientific lectures", feedback.overall.long$question, perl=T)
  118. feedback.overall.long$question <- gsub("In general.*\n.*\n.*", "In general what did\nyou think about the length\nof the course", feedback.overall.long$question, perl=T)
  119. # FIX: merging "Department bullettin", "mailing list" and "Internal Institute mail" answers together
  120. feedback.overall.long$answer <- factor(feedback.overall.long$value)
  121. feedback.overall.long$answer <- gsub("^mailing.*", "Mailing list\n(Institute/\nDepartment/\nother)", feedback.overall.long$answer, perl=T)
  122. feedback.overall.long$answer <- gsub("^I.*needed", "I needed", feedback.overall.long$answer, perl=T)
  123. feedback.overall.long$answer <- gsub("^internal.*", "Mailing list\n(Institute/\nDepartment/\nother)", feedback.overall.long$answer, perl=T)
  124. feedback.overall.long$answer <- gsub("^Department.*", "Mailing list\n(Institute/\nDepartment/\nother)", feedback.overall.long$answer, perl=T)
  125. # FIX: manually fixing some answer labels
  126. feedback.overall.long$answer <- gsub("^Evoldir.*", "Evoldir\nwebsite", feedback.overall.long$answer, perl=T)
  127. feedback.overall.long$answer <- gsub("^More scientific.*", "More scientific\nlectures, please", feedback.overall.long$answer, perl=T)
  128. feedback.overall.long$answer <- gsub("^More teaching.*", "More teaching\non programming", feedback.overall.long$answer, perl=T)
  129. feedback.overall.long$answer <- gsub("10 years", "10\nyears", feedback.overall.long$answer, perl=T)
  130. feedback.overall.long$answer <- gsub("([\\w()']*\\s[\\w()']*)\\s", "\\1\n", feedback.overall.long$answer, perl=T)
  131. # feedback.overall.long$answer <- gsub("([\\w()']*\\s[\\w()']*)\\s", "\\1\n", feedback.overall.long$answer, perl=T)
  132. feedback.overall.long$answer <- gsub("\\.", " ", feedback.overall.long$answer, perl=T)
  133. ggplot(data=feedback.overall.long) + generic_questions_plot + ggtitle(plot_title)
  134. # Quality of the lecture
  135. #png("feedback_quality_piechart.png")
  136. #dev.new()
  137. plot_title = "How would you rate the quality of the following lectures?"
  138. print(plot_title)
  139. feedback.quality <- subset(feedback, select=c(1, 10:22, 62:65))
  140. print(summary(feedback.quality))
  141. feedback.quality.long <- melt(feedback.quality, id.vars="Timestamp")
  142. feedback.quality.long <- feedback.quality.long[complete.cases(feedback.quality.long),]
  143. plot_labels = rev(c("Very Good", "Good", "Average", "Poor", "Very Poor"))
  144. feedback.quality.long$answer <- factor(feedback.quality.long$value, levels=plot_labels)
  145. qplot(answer, data=feedback.quality.long, fill=answer, main=paste(plot_title, "(Bar charts)")) + barchart_plot
  146. #qplot(data=feedback.quality.long, x=answer, stat="bin", fill=answer, main=paste(plot_title, "(Pie charts)")) + pie_plot + coord_polar(theta="y")
  147. ggplot(data=feedback.quality.long) + violin_plot + scale_y_continuous("answer", breaks=1:length(plot_labels), labels=plot_labels) + ggtitle(paste(plot_title, "(Violin plots)"))
  148. ggplot(data=feedback.quality.long) + student_barchart_plot + ggtitle("Distribution of answers by student (Quality of Lectures and Talks)")
  149. ggplot(data=feedback.quality.long) + student_violin_plot + scale_y_continuous("answer", breaks=1:length(plot_labels), labels=plot_labels) + ggtitle("Distribution of answers by student (Quality of Lectures and Talks)")
  150. #ggplot(data=feedback.quality.long) + violin_plot
  151. #dev.off()
  152. # Relevance of the lecture
  153. #png("feedback_relevance_piechart.png")
  154. #dev.new()
  155. plot_title = "Do you think the lecture is or will be relevant to your work?"
  156. print(plot_title)
  157. feedback.relevance <- subset(feedback, select=c(1, 23:35, 66:69))
  158. print(summary(feedback.relevance))
  159. feedback.relevance.long <- melt(feedback.relevance, id.vars="Timestamp")
  160. # FIX: the questions on the talks had Yes/No answer options, while the questions on the lectures had "Very Relevant/Probably/Probably not" options.
  161. # Solution: merging "Yes" with "Very Relevant" answers, and "No" with "Probably not".
  162. feedback.relevance.long <- feedback.relevance.long[complete.cases(feedback.relevance.long),]
  163. feedback.relevance.long$answer <- feedback.relevance.long$value
  164. #feedback.relevance.long$answer <- gsub("^Probably$", "Probably", feedback.relevance.long$answer)
  165. feedback.relevance.long$answer <- gsub("^Probably not", "Probably not/No", feedback.relevance.long$answer)
  166. feedback.relevance.long$answer <- gsub("^Not.at.all$", "Probably not/No", feedback.relevance.long$answer)
  167. feedback.relevance.long$answer <- gsub("^Not at all", "Probably not/No", feedback.relevance.long$answer)
  168. feedback.relevance.long$answer <- gsub("^Not at all.*", "Probably not/No", feedback.relevance.long$answer)
  169. feedback.relevance.long$answer <- gsub(".*Not.*", "Probably not/No", feedback.relevance.long$answer, perl=T)
  170. feedback.relevance.long$answer <- gsub("Not.*", "Probably not/No", feedback.relevance.long$answer, perl=T)
  171. feedback.relevance.long$answer <- gsub("^No$", "Probably not/No", feedback.relevance.long$answer)
  172. feedback.relevance.long$answer <- gsub("^Very relevant \t", "Very relevant/Yes", feedback.relevance.long$answer)
  173. feedback.relevance.long$answer <- gsub("^Very relevant", "Very relevant/Yes", feedback.relevance.long$answer)
  174. feedback.relevance.long$answer <- gsub("^Very.*", "Very relevant/Yes", feedback.relevance.long$answer)
  175. feedback.relevance.long$answer <- gsub("^Yes$", "Very relevant/Yes", feedback.relevance.long$answer)
  176. #plot_labels = rev(c("Very relevant/Yes", "Relevant", "Probably", "Probably not/No", "I don't know"))
  177. plot_labels = rev(c("Very relevant/Yes", "Probably", "Probably not/No", "Not at all", "I don't know"))
  178. print(levels(factor(feedback.relevance.long$answer)))
  179. feedback.relevance.long$answer <- factor(feedback.relevance.long$answer, levels=plot_labels)
  180. # FIX: "I don't know" answers should not be included in the violin plots, or at least they should be colored differently. Otherwise, it seems that a "I don't know" answer is better or worst than the other answers.
  181. #feedback.relevance.long.noIdontknow = subset(feedback.relevance.long, answer != "I don't know")
  182. feedback.relevance.long.noIdontknow = feedback.relevance.long
  183. qplot(data=feedback.relevance.long.noIdontknow, x=answer, fill=answer, main=paste(plot_title, "(Bar charts)")) + barchart_plot
  184. #qplot(data=feedback.relevance.long.noIdontknow, stat="bin", x=answer, fill=answer, main=paste(plot_title, "(Pie charts)")) + pie_plot + coord_polar(theta="y")
  185. print(summary(feedback.relevance.long.noIdontknow))
  186. ggplot(data=feedback.relevance.long.noIdontknow) + violin_plot + scale_y_continuous("answer", breaks=1:length(plot_labels), labels=plot_labels)+ ggtitle(paste(plot_title, "(Violin plots)"))
  187. #ggplot(data=feedback.relevance.long.noIdontknow) + violin_plot + scale_y_continuous("answer", breaks=1:length(plot_labels))+ ggtitle(paste(plot_title, "(Violin plots)"))
  188. ggplot(data=feedback.relevance.long.noIdontknow) + student_barchart_plot + ggtitle("Distribution of answers by student (Relevancy of Lectures and Talks)")
  189. ggplot(data=feedback.relevance.long.noIdontknow) + student_violin_plot + scale_y_continuous("answer", breaks=1:length(plot_labels), labels=plot_labels) + ggtitle("Distribution of answers by student (Relevancy of Lectures and Talks)")
  190. #dev.off()
  191. #dev.off()
  192. # Length
  193. #png("feedback_length_piechart.png")
  194. #dev.new()
  195. plot_title = "How would you rate the length of the following lectures?"
  196. print(plot_title)
  197. feedback.length <- subset(feedback, select=c(1, 36:48, 70:73))
  198. feedback.length.long <- melt(feedback.length, id.vars="Timestamp")
  199. feedback.length.long <- feedback.length.long[complete.cases(feedback.length.long),]
  200. plot_labels = rev(c("Too long", "Just right", "Too short"))
  201. feedback.length.long$answer <- factor(feedback.length.long$value, levels=plot_labels)
  202. qplot(data=feedback.length.long, fill=answer, x=answer, main=paste(plot_title, "(Bar charts)")) + barchart_plot
  203. #ggplot(data=feedback.length.long, aes(x=answer, fill=factor(answer)), main=paste(plot_title, "(Pie charts)")) + pie_plot + coord_polar(theta="y")
  204. ggplot(data=feedback.length.long) + violin_plot + scale_y_continuous("answer", breaks=1:length(plot_labels), labels=plot_labels) + ggtitle(paste(plot_title, "(Violin plots)"))
  205. ggplot(data=feedback.length.long) + student_barchart_plot + ggtitle("Distribution of answers by student (Length of Lectures and Talks)")
  206. ggplot(data=feedback.length.long) + student_violin_plot + scale_y_continuous("answer", breaks=1:length(plot_labels), labels=plot_labels) + ggtitle("Distribution of answers by student (Length of Lectures and Talks)")
  207. #dev.off()
  208. dev.off()