Canvassing With Gestures

While the use of obscene gestures as part of any campaign communications strategy is to be discouraged, some gestures can be an intuitive and efficient means of data entry on mobile devices.  So as we knock on doors, anything that helps us shift focus from our phones to our neighbors not only saves time and effort, but also promotes a more positive image in our communities.

Canvasser has always supported the swipe gesture to proceed to the next household or household member, but with the release last week of v1.6 for both Android and iOS, we’ve introduced support for a powerful new gesture: Shake.

To enable this feature, simply open up Settings from the main menu.  The new Gestures section adds two new settings:

Screenshot_1563306118

The first setting assigns an action to be initiated when a shake gesture is detected.  This is disabled by default, but by tapping the control you can pick the option you’d like automatically entered into the Result field when your phone is shaken.  For canvassing, that’s usually “No contact” or “Left literature”, but “No answer” might be more appropriate if you’re on the phone working through a call list to remind people to vote.

The second setting is to provide audible feedback when an action is triggered by gesture, which is done using the built-in text-to-speech capabilities of your phone.  By default, this is enabled so that when you shake your phone you’ll immediately hear spoken feedback (e.g. “Left literature”) to indicate that the gesture was detected and Result field automatically filled.  You can then simply swipe to move on to the next household.

Note that the volume of the audible feedback will be subject to both the global and app-specific volume settings on your phone.  For more details on how to set these, click here for Android and here for iOS.

Shake gesture support will primarily be used from the household detail page, but with the v1.6.1 release we’ve added support for the voter detail page as well.

Of course, we’re just getting started with introducing more intuitive gestures to use with Canvasser that will help speed data entry when you’re out knocking on doors.  Personally, I’ve knocked on over 30,000 doors during my two last campaigns and so I have some opinions on what improves my efficiency, but I’m always anxious to hear more suggestions from the field.  If you have an idea for the next kick-ass new feature for Canvasser, please let me know at chad@voter-science.com.

How many votes will it take for the GOP to win the 2020 governor’s race in Washington State?

Washington State has been steadily growing, from 3.63 million voters in 2008 to a projected 4.45 million by 2020.   Here’s how the historical trends have looked since 2008, and the projection going forward to 2020. At this rate, it will take 1.76 million votes to win.

Image1

GOP statewide candidates are averaging around 40%-45% in competitive races.

However, traditionally GOP issues have gotten past the 50% mark, notably charters schools and anti-tax measures.

Image2

Getting the exact right voters in a District

Information specific to the WA state VRDB

In the WA VRDB, the City column may give the postal office associated with that voter; but if it’s an unincorporated precinct, they may not be able to actually vote in that city’s election. In other words, “City=Renton” gives 79k people, but nearly 25k are unincorporated and can’t actually vote.

In addition, individuals may provide the wrong value for City, which could be wrong.

Fortunately, the VRDB has a separate table, DistrictLookup, that specifies exactly the precincts for a given (DistrictType,DistrictName) pair.

So (DistrictType=”City/Town” and DistrictName=”City of Renton”) would give you the actual precincts for Renton City Council, which you can then join and compare with the VRDB to get the list of voters … which is around 50k voters. However, that query is much cumbersome to provide!

When using the query portal, Use the “DistrictTypeCity” field to select just voters in a city.

(DistrictTypeCity == XXX) corresponds to a join with the DistrictLookup table and (DistrictType== “City/Town” and DistrictName ==XXX)

There are similar new fields for supporting other DistrictTypes, such as School, Fire, Port, Other, etc.

 

Some Examples

1 City of Renton

When queried, this gives 79k voters as a result, which includes unincorporated areas that can’t vote in a Renton City Council race, but are still categorized under Renton for mailing purposes.

 

2 DistrictType Renton

This query will give just the Renton voters, and results in a list of 53k voters.

 

3 Renton Mailing Area

This  query shows you the voters in the Renton mailing area, but can’t vote in a Renton City Council race (which results in a list of roughly 26k voters).

 

Other trivia:

  1. Some voters may match multiple “DistrictType=City/Town”. For example, Tacoma is split into multiple districts, so a voter in Tacoma district 2 would match “CITY OF TACOMA” and “CITY TAC-2”.
  2. Some cities put their districts in “DistrictType=Other” instead of City/Town. It’s arbitrary.
  3. DistrictNames in the VRDB are not normalized. This isn’t really an issue for cities, but can be an issue for other districts. Each county can report it their own way. Sometimes that just means a capitalization difference, but here the different ways that CD 5 shows up:
    • Congressional District 5
    • CONG 05
    • Congressional District – 05
    • CONGRESSIONAL DISTRICT – 005
    • CONGRESSIONAL DISTRICT – 5
    • CONGRESSIONAL 5

Partisan divide widening dramatically in Olympia

For the past few years I’ve posted on our interactive online tool that analyzes the partisan distribution of our state legislature.  The goal is to call out members with the courage to vote independently of their caucus.  Often candidates will run as moderate or independent during the campaign, but we find that their floor votes in Olympia are right down party lines.  This tool provides some transparency into their actions, versus their intent.

http://www.whipstat.com/Projects/Records

If you recall, the methodology is simple:  The partisanship score for each floor vote is calculated as the percentage of Republican supporters minus the percentage of Democrat supporters, giving each a range from 100 (exclusively Republican) to -100 (exclusively Democrat) with unanimous votes scoring zero.  The member’s aggregate score is just the average of all the scores of floor votes they supported, minus the scores from those they opposed.

Looking back to 2003, we see a relatively normal distribution curve for both parties.  And while there isn’t as much overlap in the middle as there’s been in generations past, we do see that there are moderates on both sides of the aisle and even some true independents that have represented us in Olympia.

Partisan Leaderboard - All Policy Areas, Both Chambers (2013-2020)

It is interesting to note that during this time period the most independent members have run as Republicans and that Democrats are generally much less likely to vote against their party.  You can also easily identify the three members who have switched caucuses.

So now, consider the 2019 legislative session results:

Partisan Leaderboard - All Policy Areas, Both Chambers (2019-2020)

Notice a problem?

Both parties are now considerably more partisan and there are no independents (or arguably even moderates) left in the state legislature.

So how has this changed over time?  Let’s take a look…

Partisan Distribution by Party (2003-19)

In the above graph, range lines show a standard deviation above and below the mean.  Markers represent the median value.  The bars in the center represent the party balance, which has almost always favored Democrats.

What can we conclude?

  • Both parties have trended more partisan during this time period.
  • The median tends to consistently fall the left of the caucus mean with Democrats.
  • Democrats are now over twice as partisan as they were in 2003-04 under Gov. Gary Locke.
  • The partisan divide is almost twice as wide now as it was in 2007-08, when the Democrats had a 42 seat advantage.

Wrap-Up

This “death of the middle” I see as a unhealthy development for our state (and not just because I was one of the moderates unseated with this wave of political polarization).  Compromise is a necessary part of the political process, and we need moderates on both sides of the aisle willing to bridge the divide to find common ground.  During the 5 years there was divided control of the legislature, it admittedly took much longer to hammer out bipartisan agreements…but the resulting work product was worth it.  Our bipartisan budgets typically passed with 90% support, while only 57% voted for this last biennial budget (including no Republicans and not even every Democrat).

Clearly, changes are needed.

Exporting to a CSV is almost always the wrong thing

In general, when somebody asks to download their TRC data as a CSV, it’s often the wrong thing.  Once you’ve exported to a CSV, you lose out on the benefits of TRC, including our mobile canvassing apps.  It also causes problems like a) how do you keep the downloaded CSV in current with changes; b) how do ensure data collected from that CSV gets uploaded back to your account? And usually there’s a better way to accomplish their scenario…

Continue reading “Exporting to a CSV is almost always the wrong thing”

Changelog for VS Canvasser mobile app

Note that while Android and iOS release versions are coordinated, not every version is released on both platforms.  Generally, the Android builds are a bit more frequent, due to the higher market penetration and the fact that I personally test it in the field daily.

Here is a quick summary of the changes introduced with each release:

Release: 1.5
Sep 5, 9:50 PM: Full rollout. (Promoted from beta 1.5)

– Added voter history into ListView voter description
– Added household count to ListView household icon
– Fixed NullReferenceException in DetailView
– Updated to latest CarouselView and Xamarin.Forms packages
– Replaced various 3rd-party plug-ins with Xamarin.Essentials

Release: 1.4.2
July 24, 2:30 AM: Full rollout. (Promoted from beta 1.4.2)

– Restored WebVew hosted in NavigationPage for login
– Added Log In menu command
– Updated to pre-release Xamarin.Forms (fixed issue #2393)

Release: 1.4.1
July 20, 11:22 PM: Full rollout. (Promoted from beta 1.4.1)

– New menu item to Share sheet with other users
– Added transfer token for Plug-ins button to bypass Web client login
– Switched to using App Center errors to report exception handling
– Switch to CarouselView from Andrei Misiukevich to work around Issue #2637
– Swiping in CarouselView will now wrap around
– Fixed delay in bringing up Settings panel
– Sort by distance is now updated live as position changes

Release: 1.3.6
July 7, 5:10 PM: Full rollout. (Promoted from beta 1.3.6)

– Pins now update color and opacity with incremental sync of voter records

Release: 1.3.5
Jul 3, 11:33 PM: Full rollout. (Promoted from beta 1.3.5)

– Manual upload to cloud now syncs changes in all sheets, not just current one.
– Alert now displayed when manual upload is unsuccessful.
– Fixed closest household button
– Handled phone number formatting overflow
– Streamlined conversion for string types
– Switched to chat keyboard for comments
– Refined voter detail panel

Release: 1.3.3
Jul 1, 9:05 PM: Full rollout. (Promoted from beta 1.3.3)

– App name change to Canvasser, with new adaptive icon
– Back button from main page navigates to parent sheet
– Added Plug-in button in SheetDetailPage
– Added detail section on VoterDetailPage for custom columns
– Preserves last visible region for each sheet
– Fixes missing map pins after extended load
– Updated logic for dimming households (visited or all members dimmed)
– Filtered voters now show as dimmed
– Added automatic sync after connectivity is restored or successful login
– Exception handling for failed OpenSheet (e.g. loss of permission)
– Fixed household member list opacity update
– Updated target URL for Learn More button in About
– Simplification of WebView-based login/logout, with new icon

Release: 1.2.2
Apr 24, 8:33 PM: Full rollout. (Promoted from beta 1.2.2)

– Reverting to CarouselPage to try to work around infrequent crash from ObjectDisposedException
– Maintains sorted order of household members when switching to voter detail page

Release: 1.2.1
Apr 19, 8:37 PM: Full rollout.

– Added SearchBar on List tab
– Added male and female avatars
– Fixed icon color update
– Sorts household members by age
– Possible fix for System.ObjectDisposedException

Release: 1.2
Apr 16, 8:30 AM: Full rollout.

– New buttons on voter detail page to dial phone number and send email
– Auto formatting of phone number (US only)
– Preferred virtual keyboard variants for phone number and email entry
– Upgrade to ProGuard 6.0.2 bytecode optimization

Release: 1.1.3
Apr 12, 4:57 PM: Full rollout. (Promoted from beta 1.1.3)

– Sync changes when app sent to background
– Scroll corresponding list item into view when pin selected on map
– Added completion percentage to the sheet Info page
– Fixed off-by-one bug when applying missed changes from other users

Release: 1.1.2
Apr 6, 10:20 PM: Full rollout.

– Rolled back to Xamarin Forms v2.5.0.280555 to work around WebView login bug

Release: 1.1.1
Apr 6, 3:28 PM: Full rollout.

– Clears WebView cache after logout so that previous user’s cookies aren’t still present
– Fixes performance issues with CarouselPage by switching to CarouselView, which supports UI virtualization
– Fixes a crash when location services goes unexpectedly offline
– Fixed crash caused on some configurations by CarouselView linker error

Release: 1.1
Apr 3, 3:02 PM: Full rollout. (Promoted from beta 1.1)

– Swipe left or right in household or voter detail panels for next & previous
– My location button in household detail view to quickly index to closest address
– New default sorting of households is by address
– Exception handling for failed DateTime parsing

Comparing Precinct Results across Boundary Changes

While your individual vote is private, the aggregate vote of from your precinct (ie, neighborhood) is public. Campaigns often look at these precincts level results to answer questions like “How did the President do in my district?” and “How did this Initiative correlate with that candidate?”.

Merging precinct results from different races together to get these insights can be valuable – but only if the merge is done correctly! But what happens when you need to merge precinct results across different years and the precinct boundaries have changed? This is particularly significant when comparing precinct results from 2010 (before redistricting).

Here are several examples of precinct changes, going from an old (dotted blue line) to a new (solid red line) boundary.

BoundaryChanges

  • Rename – The precinct gets renamed from “A” to “X”, but covers the same area.
  • Split – The precinct gets split into 2 smaller precincts. “A” gets split into “X” and “Y”
  • Merge – Two smaller precincts get merged into a larger precinct. “A” and “B” get merged into “X”
  • Combination – a combination of the above, representing a potentially arbitrarily complex transformation.

Your precinct may even have kept the same name but still significantly changed boundaries! A precinct from 2010 and another from 2018 could have the same name, but refer to totally different voters or neighborhoods.

So naively, if you just measure results from old and new precincts, you could get a complete mixup.

Measure it!

We measured how much WA state 2018 precincts had changed since 2018 (before redistricting). We call this the “decay rate” (see VRDB decay rate).

Each point on the chart below represents how “intact” a 2010 precinct is compared to the same precinct name in 2018. Precincts that are 100% intact are stable and haven’t changed – those results can be merged safely by name. This chart shows the portion of precincts that stayed the same vs. changed.

PrecinctDecay2010-2018

In fact, it turns out over a third of the precincts were totally intact from 2010. But half were completely different! Merging precincts from that half could give completely random results. What’s interesting is how clustered the results were: over 80% of precincts are either nearly unchanged or completely changed. So this is a highly localized phenomena: some areas may not see it at all (and hence not even realize it exists), whereas other areas may be heavily impacted.

What can we do?

The good news is that once we recognize this, we can actually do geo spatial comparisons to map the old precincts into the new ones. This creates a transform that lets us compare precinct results across different boundaries.