Skip to content

Instantly share code, notes, and snippets.

@lluang
Last active December 20, 2015 03:59
Show Gist options
  • Save lluang/6067230 to your computer and use it in GitHub Desktop.
Save lluang/6067230 to your computer and use it in GitHub Desktop.
Volunteer Retention Model
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Volunteer retention simulation"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Disaster Reponse Volunteer Retention\n",
"\n",
"- Overview, Design concept, and Details protocol\n",
"- Louis Luangkesorn\n",
"\n",
"## Problem \n",
" \n",
"- Much of community disaster response is based on the use of community volunteers who provide additional capability when the standing emergency response capacity is overwhelmed.\n",
"\n",
"- Community volunteer recruitment and retention is often influenced by the frequency and level of activity.\n",
"\n",
"- Objective: Explore the effect of the number of teams on the ability of response teams to recruit and retain volunteers. \n",
"\n",
"--\n",
"\n",
"## Model formulation \n",
" \n",
"- A given region has a random number of disasters per year that require a random number of response teams (one lead, and random number of support teams)\n",
"- Actual responses (lead or support) lead to improved publicity in the community and improved recruitment.\n",
"- Too many responses lead to burnout.\n",
"- Teams can respond as a lead or support.\n",
"- Only teams of a minimum size can be a lead team.\n",
"\n",
"## Purpose\n",
"\n",
"- To evaluate the effect of the number and concentration of teams on team recruitment and retention.\n",
"\n",
"- Project is motivated on the experiences of Community Evacuation Center Teams associated with the Western Pennsylvania Red Cross\n",
"\n",
"--\n",
"\n",
"## Entities, State Variables, and Scales\n",
"\n",
"- Entities\n",
"\t- Potential volunteers\n",
"\t- Teams\n",
"\t- Coordinator\n",
"- State variables\n",
"\t- Historical responses\n",
"- Scale\n",
"\t- Annual\n",
"\n",
"--\n",
"\n",
"## Process Overview and Scheduling\n",
"\n",
"- Teams recruit a random number of volunteers. Influenced by historical activity.\n",
"- Team members drop out of the team.\n",
"- Incidents occur during the year.\n",
"\t- Coordinator chooses a lead team and responding teams.\n",
"\t- For each incident a lead team is chosen from the teams of a minimum size.\n",
"\t- Each incident is of random size which determines how the size of the required volunteer base.\n",
"\t- Support teams can be chosen from any other teams until the volunteer base is reached.\n",
"\t- Teams can refuse a call. Usually based on number of responders and if team feels it has been too busy.\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from random import randint, random\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.cm as cm\n",
"import scipy"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def teamsrequired(numyears, avgincidentsperyear = 2.5, avgresponse = 20):\n",
" ''' Generate the sequence of teams needed per year\n",
" \n",
" Input:\n",
" - Number of years\n",
" - Average number of incidents per year\n",
" - Average number of people required per incident (must be greater than 1)\n",
" Output:\n",
" - List of years where each year has the number of teams requried for each incident.\n",
" '''\n",
" annualdisasters = scipy.random.poisson(float(avgincidentsperyear), numyears)\n",
" teamscalled = [scipy.random.poisson(avgresponse-1, annualdisasters[year])+1 for year in range(len(annualdisasters))]\n",
" return annualdisasters, teamscalled"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"numberyears = 25\n",
"disasters, teams = teamsrequired(numberyears)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"disasters"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 4,
"text": [
"array([3, 4, 3, 5, 3, 0, 2, 3, 1, 4, 3, 1, 1, 3, 5, 2, 2, 0, 4, 1, 5, 2, 1,\n",
" 3, 3])"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"teams"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 5,
"text": [
"[array([28, 22, 18]),\n",
" array([27, 19, 20, 18]),\n",
" array([19, 22, 19]),\n",
" array([26, 14, 18, 17, 18]),\n",
" array([19, 23, 20]),\n",
" array([], dtype=int64),\n",
" array([19, 11]),\n",
" array([21, 15, 18]),\n",
" array([14]),\n",
" array([24, 21, 19, 20]),\n",
" array([23, 21, 19]),\n",
" array([20]),\n",
" array([26]),\n",
" array([21, 17, 16]),\n",
" array([17, 16, 18, 13, 27]),\n",
" array([17, 27]),\n",
" array([26, 19]),\n",
" array([], dtype=int64),\n",
" array([16, 26, 25, 18]),\n",
" array([25]),\n",
" array([27, 20, 22, 15, 29]),\n",
" array([26, 14]),\n",
" array([21]),\n",
" array([22, 16, 27]),\n",
" array([22, 19, 23])]"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Team retention and recruitment\n",
"\n",
"Each team can draw from a fixed population. Each team starts with a certain number of members.\n",
"Each year, members randomly enter and leave the system.\n",
"\n",
"**To add**: $p_{retain}$ and $p_{recruit}$ should be functions of the size of the team and incidents called"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"numberteams = 20\n",
"sourcepopulation = 50\n",
"minsizelead = 6\n",
"avginitial = 8.5\n",
"pretain = 0.8\n",
"precruit = 0.05\n",
"fractioninitial = float(avginitial)/float(sourcepopulation)\n",
"neighborhood = scipy.random.binomial(1, fractioninitial, [1, int(numberteams), int(sourcepopulation)])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def individualchoice(current, pretain, precruit):\n",
" ''' Model the individual person decision to remain on a team or leave\n",
" '''\n",
" if current == 1:\n",
" next = scipy.random.binomial(1, pretain)\n",
" else:\n",
" next = scipy.random.binomial(1, precruit)\n",
" return next\n",
"\n",
"def updateteams(neighborhood, pretain, precruit):\n",
" ''' For each team, model the decisions of people within the team to leave within.\n",
" '''\n",
" \n",
" newneighborhood = scipy.zeros(shape(neighborhood))\n",
" for team in range(len(neighborhood)):\n",
" nextyear = [individualchoice(neighborhood[team][i], pretain, precruit) for i in range(len(neighborhood[team]))]\n",
" newneighborhood[team] = nextyear\n",
" #print nextyear\n",
" #print sum(newneighborhood), newneighborhood\n",
" return [newneighborhood]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"nextround = updateteams(neighborhood[0], pretain, precruit)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for i in range(numberyears):\n",
" nextround = updateteams(nextround[0], pretain, precruit)\n",
" neighborhood= vstack((neighborhood, nextround))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Assignment of teams to incidents\n",
"\n",
"Each incident has a minimum size. Add teams until the sum of members of teams reaches that size"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"timeindex = len(neighborhood)\n",
"timeindex\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 10,
"text": [
"26"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"currentteamsize = [[int(sum(neighborhood[yearindex][i])) for i in range(len(neighborhood[0]))] for yearindex in range(timeindex)]\n",
"currentteamsize"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 11,
"text": [
"[[14, 5, 10, 11, 8, 12, 8, 8, 9, 4, 9, 10, 8, 10, 5, 5, 12, 7, 6, 8],\n",
" [13, 10, 11, 9, 13, 7, 5, 8, 9, 10, 9, 10, 9, 11, 5, 6, 11, 12, 12, 9],\n",
" [13, 11, 9, 10, 17, 8, 7, 12, 8, 7, 10, 8, 10, 14, 7, 4, 10, 13, 10, 7],\n",
" [13, 12, 12, 6, 14, 8, 4, 11, 10, 8, 10, 9, 11, 15, 8, 6, 10, 10, 10, 6],\n",
" [12, 8, 10, 4, 11, 9, 6, 7, 9, 8, 7, 9, 11, 13, 10, 7, 12, 7, 11, 6],\n",
" [13, 8, 11, 5, 12, 9, 9, 7, 6, 6, 7, 11, 8, 10, 12, 9, 14, 8, 11, 9],\n",
" [12, 7, 13, 7, 16, 7, 7, 8, 7, 11, 6, 13, 12, 7, 12, 9, 10, 8, 9, 10],\n",
" [14, 8, 15, 8, 16, 7, 6, 7, 6, 11, 8, 12, 13, 8, 12, 8, 8, 8, 9, 11],\n",
" [14, 9, 18, 9, 15, 8, 7, 6, 7, 11, 7, 9, 12, 10, 11, 8, 7, 7, 10, 11],\n",
" [12, 7, 16, 10, 14, 5, 8, 5, 9, 10, 8, 9, 12, 13, 12, 9, 6, 8, 8, 12],\n",
" [9, 7, 15, 11, 13, 4, 9, 8, 7, 10, 7, 7, 11, 14, 11, 8, 8, 9, 7, 12],\n",
" [8, 7, 11, 8, 14, 4, 5, 3, 4, 11, 8, 8, 9, 15, 9, 8, 7, 13, 6, 10],\n",
" [7, 8, 12, 9, 14, 7, 9, 6, 9, 12, 6, 7, 10, 14, 7, 8, 6, 12, 5, 8],\n",
" [5, 11, 12, 10, 17, 6, 10, 6, 8, 10, 6, 6, 9, 10, 7, 7, 6, 11, 5, 8],\n",
" [7, 11, 12, 12, 13, 5, 10, 9, 7, 9, 7, 5, 9, 11, 8, 9, 6, 6, 5, 6],\n",
" [6, 8, 13, 11, 12, 5, 12, 7, 9, 9, 7, 7, 6, 8, 13, 9, 8, 5, 4, 6],\n",
" [9, 12, 12, 12, 11, 8, 11, 6, 9, 11, 6, 7, 8, 7, 13, 10, 8, 5, 3, 8],\n",
" [7, 9, 14, 11, 12, 9, 12, 6, 9, 9, 6, 11, 5, 9, 11, 9, 9, 4, 6, 6],\n",
" [9, 10, 13, 9, 9, 13, 14, 5, 6, 9, 7, 11, 7, 10, 12, 10, 9, 5, 7, 7],\n",
" [11, 12, 15, 11, 11, 11, 10, 4, 8, 11, 7, 12, 5, 9, 12, 11, 7, 9, 6, 7],\n",
" [11, 12, 12, 9, 6, 15, 11, 6, 8, 13, 5, 9, 6, 9, 9, 13, 7, 12, 8, 6],\n",
" [13, 10, 12, 8, 7, 12, 9, 8, 5, 10, 8, 7, 7, 11, 12, 11, 6, 9, 12, 6],\n",
" [13, 8, 13, 5, 4, 14, 12, 7, 8, 9, 9, 7, 9, 10, 11, 13, 6, 8, 11, 9],\n",
" [12, 6, 12, 8, 3, 14, 12, 10, 8, 6, 10, 6, 8, 9, 10, 16, 5, 7, 7, 10],\n",
" [12, 7, 15, 7, 7, 14, 13, 10, 5, 5, 9, 6, 6, 8, 8, 13, 5, 8, 7, 8],\n",
" [14, 15, 14, 9, 7, 11, 13, 12, 7, 5, 9, 7, 6, 8, 6, 13, 6, 5, 9, 11]]"
]
}
],
"prompt_number": 11
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data visualization\n",
"\n",
"Use a grid that shows how many members are in each team over time"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# From the Matplotlib gallery http://matplotlib.org/examples/api/image_zcoord.html\n",
"def format_coord(x, y):\n",
" col = int(x+0.5)\n",
" row = int(y+0.5)\n",
" if col>=0 and col<numcols and row>=0 and row<numrows:\n",
" z = X[row,col]\n",
" return 'x=%1.4f, y=%1.4f, z=%1.4f'%(x, y, z)\n",
" else:\n",
" return 'x=%1.4f, y=%1.4f'%(x, y)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"X = currentteamsize\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.add_subplot(111)\n",
"ax.imshow(X, cmap=cm.jet, interpolation='nearest')\n",
"numrows, numcols = shape(X)\n",
"ax.format_coord = format_coord\n",
"plt.xlabel('Team')\n",
"plt.ylabel('Year')\n",
"plt.show()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "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\n/w8Zy6kQ1xfiyQAAAABJRU5ErkJggg==\n"
}
],
"prompt_number": 13
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment