Categories
Election Data Analysis Election Forensics Election Integrity Interesting programming technical

Potential duplicate registrants in VA voter list via Hamming Distance

Using the 2022-11-23 Registered Voter List (RVL) and the 2023-01-26 Voter History List (VHL) purchased from the VA Department of Elections (ELECT) I wrote up an analysis script to check for potentially duplicated registrant records in the RVL and cross reference duplicate pairings with the VHL to identify potential duplicate votes. This was my initial attempt at quantifying the number of potentially duplicate records in the RVL, and I have since updated the code to use a more rigorous Levenshtein distance metric, as well as making improvements to the parsing routines, bugfixes, etc. The details of the Hamming distance work are summarized below, and left up here for reference. For the latest and up to date information, please see the newer article posted here.

Errata note: One of the code bugs I discovered was that some of the entries did not actually get checked as they were accidentally skipped, so the numbers below are lower than the numbers presented in the newer work.

Please note that I will not publish voter Personally Identifiable Information (PII) on this blog. I have substituted fictitious PII information for all examples given below, and cryptographically hashed all voter information in the downloadable results file. I will make available the detailed information to those that have the authorization to receive and process voter data upon request (contact us).

Summary of Results:

We should mathematically expect approximately 11 exact string collisions in the full RVL dataset when comparing (First Name + Middle Name + Last Name + Suffix + Full DOB), but instead we see 1982 such collisions, which is over an order of magnitude increase from the expected value. While its possible that some of these collisions are false positives, there are quite a number of them that are deserving of further scrutiny.

Method:

For every entry in the latest RVL, I performed a string distance comparison, based on Hamming distance, between every possible pair of strings of (FIRST NAME + MIDDLE NAME + LAST NAME + SUFFIX + FULL DOB).  So for the ~6M different RVL entries, we need to compute ~3.6 x 10^13 different string comparisons. A hamming distance of 0 indicates the strings being compared are identical, a hamming distance of 1 indicates that there is a single character different between the two strings, a hamming distance of 2 indicates 2 characters are different, etc.  This obviously is a very computationally intensive process and it took over two days to complete the processing, once I got the bugs worked out.  (I’ve been quietly working on this one for a while now … )

Note that the Hamming distance only compares each respective position in a string and does not account for adding or removing a character completely from a string. A metric that does include addition and subtraction is the Levenshtein Edit Distance, which is much more computationally expensive (but more rigorous) metric. The Hamming distance is related to the Levenshtein distance in that it is mathematically the upper bound on the Levenshtein distance for arbitrary strings. I haven’t yet finished making an optimized GPU accelerated version of the Levenshtein edit distance metric, but it is in the works and I will redo this analysis with the new metric once that is completed.

I aggregated all of the Hamming distance pairings that were less than or equal to 3 characters different in order to identify potential (key word) duplicated registrants, and additionally for each pairing looked at the voter history information for each registrant in the pair to determine if there was a potential (again … key word) for multiple ballots to be cast by the same person in any given election.  As we allow for more characters to be different, we potentially are including many more likely false positive matches, even if we are catching more true positives.

For example: At a Hamming distance of 4 the strings of “Dave Joseph Smith M 10/01/1981” and “Tony Joseph Smith M 10/01/1981” at the same address would produce a potential match, but so would “Davey Joseph Smith M 10/01/1981” and “David Josiph Smith M 10/02/1981”. The first pair is more likely to be a false positive due to twins, while the second is more likely to be due to typo’s, mistakes, or use of nicknames and might warrant further investigation. A much stronger potential match would be something like “David Josiph Smith M 10/01/1981” and “David Joseph Smith M 10/01/1981”, with a Hamming distance of 1 at the same address. In an attempt to limit false positives, I have clamped the Hamming distance checks to <= 3 in this analysis.

One of the drawbacks of using Hamming distance over a more complete metric such as Levenshtein, is that the Hamming distance would give a very high score, and would therefore filter out of our results, an example pairing such as: “David Joseph Smith M 10/01/1981” and “Dave Joseph Smith M 10/01/1981”. The change from “id” to “e” adds/subtracts a character making the rest of the characters in the remainder of the string shift position and also not match. A Levenshtein metric would correctly return a small distance of 2, whereas the hamming distance returns 27. (As mentioned earlier, I am working on a Levenshtein implementation, but it is not yet complete.)

Note that with the official records obtained from ELECT, and in accordance with the laws of VA, I do not have access to the social security number or drivers license numbers for each registration record, which would help in identifying and discriminating potential duplicate errors vs things like twins, etc. I only have the first name, middle name, last name, suffix, month of birth, day of birth, year of birth, gender, and address information that I can work with.  I can therefore only take things so far before someone else (with investigative authority and ability to access those other fields) would need to step in and confirm and validate these findings.

Results:

The summary totals are as follows, with detailed examples.

Hamming Distance0123
Number of Potential Duplicate Registrant Pairs1982327621864120642
Number of Potential Duplicate Ballots110324831210175872

According to my derivations and simulations that are described in detail at the end of this article, we should only expect to see an average of 11 (+/- 3) potential duplicate pairs (a.k.a. “collisions”) at a Hamming distance of 0. This is over two orders of magnitude different than what we observe in the compiled results table above. Such a discrepancy deserves further investigation and verification.

Examples of Types of Issues Observed:

NOTE THE BELOW INFORMATION HAS HAD THE VOTER PERSONALLY IDENTIFIABLE INFORMATION (“PII”) FICTIONALIZED. WHILE THESE ARE BASED ON REAL DATA TO ILLUSTRATE THE DIFFERENT TYPES OF OBSERVATIONS, THEY DO NOT REPRESENT REAL VOTER INFORMATION.

Example #1: The following set of records has the exact match (Hamming Distance = 0) of full name and full birthdate (including year), but different address and different voter ID numbers AND there was a vote cast from each of those unique voter ID’s in the 2020 General Election.  While it’s remotely possible that two individuals share the exact same name, month, day and year of birth … it is probabilistically unlikely (see section below on mathematical derivation of probabilities if interested), and should warrant further scrutiny.

Voter Record A:

AMY BETH McVOTER 12/05/1970 F 12345 CITIZEN CT

Voter Record B:

AMY BETH McVOTER 12/05/1970 F 5678 McPUBLIC DR

Example #2: This set of records has a single character different (Hamming distance of 1) in their first name, but middle name, last name, birthdate and address are identical AND both records are associated with votes that were cast in the 2020, 2021, and 2022 November General Elections.  While it is possible that this is a pair of 23 year old twins (with same middle names) that live together, it at least bears looking into.

Voter Record A:

TAYLOR DAVID VOTER 02/16/2000 M 6543 OVERLOOK AVE NW

Voter Record B:

DAYLOR DAVID VOTER 02/16/2000 M 6543 OVERLOOK AVE NW

Example #3: This set of records has two characters different (Hamming distance of 2) in their birthdate, but name and address are identical AND the birth years are too close together for a child/parent relationship, AND both records are associated with votes that were cast in the 2020 and 2022 November General Elections. 

Voter Record A:

REGINA DESEREE MACGUFFIN 02/05/1973 F 123 POPE AVE

Voter Record B:

REGINA DESEREE MACGUFFIN 03/07/1973 F 123 POPE AVE

Example #4: This set of records has again a single character different (Hamming distance of 1) in the first name (but not the first letter this time) and the last name, birthdate and address are identical.  There were also multiple votes cast in the 2019 and 2022 November General from these registrants.

Voter Record A:

EDGARD JOHNSON 10/19/1981 M 5498 PAGELAND BLVD

Voter Record B:

EDUARD JOHNSON 10/19/1981 M 5498 PAGELAND BLVD

Example #5: This set of records has two characters different (Hamming distance of 2) in the first and middle names and the last name, birthdate, gender and address are identical.  There were also multiple votes cast in the 2021 and 2022 November General from these registrants. Again it is possible that these records represent a set of twins given the information that ELECT provides.

Voter Record A:

ALANA JAVETTE THOMPSON 01/01/2003 F 123 CHARITY LN

Voter Record B:

ALAYA YAVETTE THOMPSON 01/01/2003 F 123 CHARITY LN

Example #6: The following set of records has the exact match (Hamming Distance = 0) of full name and full birthdate (including year), and same address but different voter ID numbers.  There was no duplicated votes in the same election detected between the two ID numbers.

Voter Record A:

JAMES TIBERIUS KIRK 03/22/2223 M 1701 Enterprise Bridge

Voter Record B:

JAMES TIBERIUS KIRK 03/22/2223 M 1701 Enterprise Bridge

Example #7: The following set of records has the exact match (Hamming Distance = 0) of full name and full birthdate (including year), same address but different gender and voter ID numbers.  There was no duplicated votes in the same election detected between the two ID numbers.

Voter Record A:

MAXWELL QUAID CLINGER 11/03/2004 M 4077 MASH DR

Voter Record B:

MAXWELL QUAID CLINGER 11/03/2004 U 4077 MASH DR

Results Dataset:

A full version of the aggregated excel data is provided below, however all voter information (ID, first name, middle name, last name, dob, gender, address) have been removed and replaced by a one-way hash number, with randomized salt, based on the voter ID. The full file with specific voter information can be provided to parties authorized by ELECT to recieve and process voter information, Election Officials, or Law Enforcement upon request.

On the mathematical probability of matches:

2023-05-27: I have moved my derivation of the expected value of the number of collisions to a separate post, available here.

Categories
Election Data Analysis Election Forensics Election Integrity technical

Discrepancies between official VA turnout report and Voter History information

Now that the Voter History List and corresponding list of those who voted in the 11-08-2022 November General election has been released by the VA dept. of elections (“ELECT”), we have compiled and compared the results from the official turnout statistics on the ELECT website (here) to the information contained in both the Daily Absentee List (“DAL”) and Voter History List (“VHL”) information.

These are all “official” datasets provided by ELECT, and they should theoretically all match. However, there are a number of discrepancies in the official records that need to be explained. Performing simple differences between the accumulated totals for each locality exposes these issues. For example:

  • Why does the official results on the ELECT website show the total number of ballots cast for Albemarle County to be 11,105 less than the number of ballots recorded in the VHL? Why do the DAL file records show 11,429 more cast absentee (Early or Mail) ballots than the ELECT official results in Albemarle County? A: The Albemarle electoral board looked into this matter when we brought it to their attention and they reported that the registrar had made a transcription error and submitted the wrong line when submitting the election results to ELECT. While mistakes do happen, this explanation still begs the question as to why did ELECT not catch or flag these discrepancies, and what procedures are in place to prevent, catch or rectify these issues.
  • Why does Richmond City show 25,500 more ballots cast in the official turnout results on the ELECT website than are present in the VHL? Why are there 325 more absentee (Early or Mail) ballots in the ELECT website data than the DAL file?
  • Why is the sum of the absolute value of discrepancies between the VHL and the official results on the ELECT website 69,381?
  • Why is the sum of the absolute value of discrepancies in absentee ballots (Early or Mail) between the DAL and the official results on the ELECT website 28,515?
  • Why does the VHL data records contain zero “Election Day” records for Covington City?
  • … etc

We have notified a number of local electoral board members, registrars and election integrity groups, and postponed publishing this data until after they were able to validate the existence of these discrepancies, in the hopes that they can discover the source of the discrepancies and rectify the issues.

As a further dive into the data, we also computed and noted the following additional issues. Documentation on these specific discrepancies are available upon request by entities that are able to receive and process election data according to VA law and ELECT requirements. We will not publish the details publicly on this blog as they reveal personal voter information, but will give the summary results below. Please contact us for further information.

  • There were 3,354 records of valid absentee ballots cast recorded in the VHL that did not have corresponding entries (matched by voter ID) in the DAL record.
  • There were also 19,723 records of valid absentee ballots cast recorded in the DAL that did not have corresponding entries (matched by voter ID) in the VHL record.
  • The VHL contained 6 records of ballots cast in the VA Nov 2022 election that do not have a corresponding registration record in the Registered Voter List (RVL) dated 11/23/2022.
  • The VHL contained 93 records of ballots cast in any election that do not have a corresponding registration record in the Registered Voter List (RVL) dated 11/23/2022.
  • The 11/23/2022 statewide RVL contained 1,197 records that had duplicate records with different voter IDs, based on performing an exact match to first name, middle name, last name, suffix, full date-of-birth, and gender.

Background and Methodology:

The DAL file is supposed to track all of the transactions for the non-election day ballots for a specific election. This includes any Mail-In or Early In-Person ballots. (Any non-election day ballot is considered to be an “absentee” ballot in VA.) It is updated daily throughout the course of the election and is finalized once the election is certified. The VA 2022 election was certified by all of the localities by 11-18-2022. The last version of the DAL file we purchased and obtained from ELECT and used for this analysis was dated 12/13/2022, and it had been unchanged for a number of weeks by that point. We downloaded and archived copies of the DAL file multiple times per day in order to track the changes near-real-time over the course of the election cycle. (The day-to-day changes to the DAL records over time are documented in other blog entries.)

The VHL is updated by election officials after the election has concluded by adding the “voter credit” into VERIS (the state election database) for all registered voters that cast a ballot in the election (either absentee or on election day). The VHL contains information covering the last 4 years of election history for each currently registered voter. As of mid-January we were informed that all of the voter credit updates had been completed in the VERIS database for the 2022 General Election. (Why this isn’t done automatically similar to the DAL file entries and made available before election certification?) The version of the VHL that we purchased and obtained from ELECT and used for this analysis is from 1/26/2023. We specifically tried to time our purchase of the VHL to occur after the voter credit updates had been completed but before the scheduled maintenance process of removing longstanding “inactive” voters had taken place. We note that even if some “Inactive” voters had been removed from the VHL by the time we purchased the VHL, that should not impact this analysis, as the act of voting in the 2022 election would require the voters status to be listed as “Active”.

The “official” turnout report page on the ELECT website (here, again) was downloaded and converted to an excel spreadsheet on 2/4/2023. The notes on the website page is that the information content was last updated on 12/06/2022. (We have archived a pdf copy of the site as we downloaded it for reference attached to the bottom of this post.) All of the local electoral boards had completed their canvass by 11/18/2022 and submitted their information to ELECT, so there is no reason that this information should be missing any data.

The official turnout results from ELECT tabulate the Early Voting, Election Day, By Mail, and Provisional ballots cast and accounted for during the 2022 General Election. The DAL file includes information as to the Mail-In, Early Voting, and Absentee Provisional ballots cast. The VHL contains information as to all voters who cast a ballot in the election, and broken down by Election Day, Absentee (either Early or Mail-In), and Provisionals for each sub-group. Theoretically all of these data files should match exactly.

We note that there is a known issue that could potentially, but rarely, cause the number of ballots reported in the VHL to be strictly less than the number of ballots in the official results reported on the ELECT webpage. Due to the time delay between the close of the election and the update and publication of the VHL, there can be registrants that have been legitimately removed due to death, etc during that interval and their corresponding voting record is also removed when that happens. In the data presented below, this would manifest as a positive (+) discrepancy, but even so, these numbers should be relatively small.

We also again note that we made every effort to purchase the VHL dataset after all of the voter credit information was updated but before the department of elections performed their annual removal of records that had been inactive for more than 2 federal elections. Even so, if the voter was “inactive” and slated for removal, they wouldn’t be showing up in the count of ballots cast anyway. The act of casting a ballot immediately moves a voter into the “active” category.

The official turnout results are collated by locality, so we took the DAL and VHL information and accumulated their tallies to match the official turnout report breakdown. We then subtracted the DAL +/or VHL results from the official results to determine how much of a discrepancy exists between each of the datasets.

Terminology:

  • delta EV (DAL): This is the change in the Early Vote ballot numbers as calculated by subtracting the DAL “On Machine” ballots from the official turnout report “Early Vote” tally.
  • delta ByMail (DAL): This is the change in the Mail In ballot numbers as calculated by subtracting the DAL (“Pre-Processed” + “Marked”) ballots from the official turnout report “Mail In” tally.
  • Net DAL: The net sum of the DAL differences in each locality
  • Sum Abs Value DAL: The sum of the absolute values of the DAL differences in each locality.
  • delta ED (VHL): This is the change in Election Day ballot numbers as calculated by subtracting the VHL (“Election Day” AND NOT “Provisional”) ballots from the official turnout report “Election Day” tally.
  • delta Provisional (VHL): This is the change in Provisional ballot numbers as calculated by subtracting the VHL “Provisional” ballot total from the official turnout report “Provisional” tally.
  • delta Early or Mail (VHL):  This is the change in Early OR Mail-In ballot numbers as calculated by subtracting the VHL (“Absentee” AND NOT “Provisional”) ballots from the official turnout report (“Early Voting” + “Mail In”) tally.
  • delta Provisional (VHL): This is the change in Provisional ballot numbers as calculated by subtracting the VHL “Provisional” ballots from the official turnout report “Provisional” tally.
  • Net VHL: The net sum of the VHL differences for each locality   
  • Sum Abs Value VHL: The sum of the absolute values of the VHL differences for each locality

Data Results:

We present the data and results in the following EXCEL spreadsheet. Tab 1 is the ELECT website data with differences between the DAL and VHL data on the right hand side. Tab 2 is the accumulated DAL data by locality. Tab 3 is the accumulated VHL data by locality.

The screen capture of the ELECT website data from 2/4/2023 is also here:

https://digitalpollwatchers.org/wp-content/uploads/2023/02/ELECT-Turnout-Results-Screenshot-2023-02-04-1.pdf