Feedback on ROE Seminar Series

In late August 2019, the seminar organizing committee (reachable at colloquium@lists.roe.ac.uk) designed and administered a survey to obtain feedback on the efficacy of the seminar series design.

This notebook analyzes the results. If you would like to perform your own analysis, please email the seminar organizing committee or Michael Petersen (michael.petersen@roe.ac.uk) for assistance.

We have omitted the demographic responses. We are confident that the reponses constitute a representative sample of ROE members. Additionally, no cross-tabs are reported in this analysis (i.e. no separation along demographic lines). An internal analysis did not indicate any significant results as a function of different demographic elements. Following standard practice, categories with fewer than five responses are noted, rather than reporting the results. The note should not be interpreted as though no reponses for the selections were recorded.

We received 49 total responses.

In [1]:
# standard python modules
import numpy as np

# enable markdown printing
from IPython.display import Markdown, display
def printmd(string):
    """wrap markdown printing"""
    display(Markdown(string))

# how-to
#printmd('**bold**')
#printmd('_italics_')


# plotting utilities
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline

# adjust rcparams to MSP style
mpl.rcParams['xtick.labelsize'] = 10
mpl.rcParams['ytick.labelsize'] = 10
mpl.rcParams['font.weight'] = 'medium'
mpl.rcParams['axes.linewidth'] = 1.5
mpl.rcParams['xtick.major.width'] = 1.5
mpl.rcParams['xtick.minor.width'] = 0.75
mpl.rcParams['xtick.minor.visible'] = True
mpl.rcParams['ytick.major.width'] = 1.5
mpl.rcParams['ytick.minor.width'] = 0.75
mpl.rcParams['ytick.minor.visible'] = True
In [2]:
# definition to read questions from the google forms format

def summarize_answer(question,\
                     multiple=True,\
                     delimiter=b'., ',\
                     criteria=0,\
                     significance=5):
    """summarize an answer to a question
    
    inputs
    ----------
    question     : (list)    Responses to a question in list format.
    multiple     : (boolean) True if the question allowed multiple responses
    delimiter    : (string)  Safeguard to delimit the google forms format
    criteria     : (boolean evaluation) Allow for cross-tab analysis
    significance : (integer) How many responses must be recorded for reporting
    
    
    returns
    ----------
    none -- printed results only.
    
    """
    
    if criteria!=0:
        question = question[criteria]
    
    
    if multiple:
        #answerlist = np.array([np.array(q.split(b',')) for q in question)
        flatanswers = np.array([])
        for x in np.array([np.array(q.split(delimiter)) for q in question]):
            flatanswers = np.concatenate([flatanswers,x])
    else:
        flatanswers = question
        
    flatanswers = np.array([q.strip(b'.').strip(b'') for q in flatanswers])
    
    #print(flatanswers)
    
    answers = np.unique(flatanswers[flatanswers!=b''])
    nanswers = np.zeros(answers.size)
    
    for ans in flatanswers:
        nanswers[ans==answers] += 1
        
    #print(answers,nanswers)
    
    for ans in (-1.*nanswers).argsort():
        if nanswers[ans] < significance:
            continue
        try:
            printmd('**'+str(int(nanswers[ans]))+'** - {0}'.format(\
                                  answers[ans].decode().lstrip()\
                                 ))
        except:
            printmd('**'+str(int(nanswers[ans]))+'** - {0}'.format(\
                                  answers[ans]\
                                 ))
    

Read the file format from Google Forms, and organize into a keyed dictionary.

In [3]:
keys = ["time","tenure","position","affiliation","gender","events",\
                "events_reason","dinner_reason","meeting_reason",\
                "host_reason","temperature","importance","alternate_seminar",\
                "format_change","lunch_idea","postgrad_format","format_comment",\
                "time_option","lecture_rank","higgs_rank","stobie_rank","emails",\
                "location_comment","pre_options_food","pre_options_drink","post_options",\
                 "food_suggestions","general_comments",\
                "coffee_temperature","coffee_number","coffee_speakers","coffee_attendance",\
                "coffee_announcements","coffee_time","coffee_format","coffee_policy",\
                "coffee_timing","coffee_comments"]

# read in the survey responses
Stats = np.genfromtxt('ROE-ColloquiumResponses-3',\
dtype={'names': list(keys),\
        'formats': ('S200','S200','S200','S200','S200','S200','S200','S200','S200','S200','i4','S400','S200','S200','S200','S200','S400','S200','S200','S200','S200','S200','S200','S200','S200','S200','S200','S400','i4','S200','S200','S200','S200','S200','S200','S200','S200','S200')},
                   delimiter='\t',skip_header=1)


# Read in the question prompts specifically
f= open('ROE-ColloquiumResponses-3'); a = f.readline()


# reorganize into a dictionary
QDict = {}
for ikey,key in enumerate(keys):
    QDict[key] = a.split('\t')[ikey]

Overall Seminar Quality

In [4]:
fig = plt.figure(figsize=(6,4))

ax1 = fig.add_axes([0.15,0.45,0.8,0.48])

temprange = np.arange(1,12,1)
tempval = np.zeros(temprange.size)

for x in Stats['temperature']:
    if x > 0:
        tempval[x-1] += 1

ax1.plot(temprange,tempval,color='black',drawstyle='steps-mid')#,linestyle='dashed')

#dates = np.array([x.decode().strip() for x in Stats['date']])

ax1.set_ylabel('# of responses',size=12)
ax1.set_xlabel('score',size=12)
ax1.set_title('N='+str(int(Stats['temperature'].size)),size=12)
printmd('_'+QDict['temperature']+'_')

ax1.tick_params(axis="y",which='both',direction="in"); ax1.tick_params(axis="x",which='both',direction="in",pad=5); ax1.yaxis.set_ticks_position('both'); ax1.xaxis.set_ticks_position('both')

When organising the seminar series, we seek input for suggestions, and try to construct a schedule which reflects a range of research topics. How do you think the organisers are doing?

Food results

If you are only concerned that we are shortchanging the food options, here are the results:

In [5]:
# talking about food...

# which questions?
foodkeys = ["pre_options_food","pre_options_drink","post_options"]

for qq in foodkeys:
    printmd('_'+QDict[qq]+'_')
    summarize_answer(Stats[qq],delimiter=b', ')
    print('')
        

Which refreshments would you like to see before and after the talk?

31 - Biscuits

23 - Fruit

17 - Cheese and Crackers

17 - Crisps

16 - Chocolate

11 - Vegan Options


Which provided drinks do you want before the talk?

35 - Coffee

22 - Tea (Caffeinated)

11 - Juice

10 - Tea (Decaffeinated)

8 - Soda water


What would you like to see for refreshments after the talk?

17 - Beer

11 - Wine

8 - I would prefer not to see alcohol at the seminar events


Programatic Questions

In [6]:
# programatic questions

# which questions?
programkeys = ["events","events_reason","dinner_reason","meeting_reason",\
                "host_reason","importance","alternate_seminar",\
                "format_change","lunch_idea","postgrad_format",\
                "time_option","emails"]
    
for qq in programkeys:
    printmd('_'+QDict[qq]+'_')
    summarize_answer(Stats[qq])
    print('')
        

Please tick all seminar events you have attended regularly in the past year.

15 - Seminar

8 - Seminar, Pre-seminar Coffee, Post-seminar Snacks and Drinks

6 - Seminar, Postgraduate Discussion with Speaker, Pre-seminar Coffee, Post-seminar Snacks and Drinks


Please select all reasons you may not have attended the 3.30-4.30 seminar time in the past year:

25 - My schedule is too busy

18 - I'm not interested in subject material

15 - I regularly attend; none of the below apply to me

5 - The location and time are not desireable


In the past year, have you attended a post-seminar dinner with the speaker?

27 - Yes, because I asked to attend or was asked to attend

10 - Yes, as the host of the speaker

8 - No, and I am not interested in attending


In the past year, did you ever meet with the speaker (other than dinner)?

22 - Yes, because I sought the speaker out before or after their talk

10 - No. I would like to, but I don't know how

8 - Yes: I contacted the speaker directly

5 - Yes: I contacted the organizer or host


Generally, whomever invites the speaker acts as the host. The host is responsible for coordinating the speaker's lunch and dinner and general schedule. Would you feel comfortable hosting a speaker?

18 - Yes, and I have hosted a speaker recently

8 - No, I consider myself to be too junior

7 - Yes, I just haven't been asked

7 - Yes, but I would need guidance (note: the organisers can provide guidance!)


The organizers also try to balance several competing factors when deciding who to invite. Which of the following would you rate as important factors to consider? Select as many as apply.

44 - Quality of speaking

41 - Scientific impact in the field

31 - Gender balance of speakers across the seminar series

11 - Level of seniority, prioritizing more junior scientists (note: we only invite PhD recipients)

7 - Level of seniority, prioritizing more established scientists (note: we only invite PhD recipients)

5 - Speakers from nearby (i.e. Scottish or northern England)


We are considering adding a seminar outside of the normal bounds of a researcher presenting on their current research. Which of the following would you enjoy seeing as part of the seminar series? Select as many options as you wish.

39 - A talk which is a broad review of a scientific topic

25 - A talk by a member of ROE on their own research

23 - A talk by a social scientist


One suggestion we are considering is splitting the seminar into a 30 minute general-interest presentation, followed by an hour of round-table-style discussion. Anyone could choose to attend one or both. Does this format interest you?

26 - Yes, I would like to try some seminars in this format

14 - No, I like the current hour-long seminar format


One suggestion we are considering is organizing a lunch which attendees would have to sign up for. Does this interest you?

20 - Yes, this would be an ideal format for me to interact with the speaker

11 - No, I think the host should be responsible for organizing lunch with and for the speakers

10 - Yes, but I wouldn't particularly like to attend


If you are a Postgraduate Student: Which of the following best describes your general impression of the (currently 2:45pm) discussion time with the speaker?

8 - I wouldn't change the format, but I would like more structure

5 - I enjoy the current format


What is your ideal seminar time range?

24 - Late Afternoon, 3-5

13 - Early Afternoon, 1-3

8 - Morning, 11-1


How do you feel about the current level of notification for seminars (Announcement at Stobie, email Monday morning, email morning of the talk, email 15 minutes before the talk)?

44 - Right amount