We used our editorial ‘robot’ ADAM (Automatic Data Article Machine) for the most challenging project yet: covering the national parliamentary elections in real time, on a local level. We dynamically generated news stories about the election results for all 355 municipalities in the Netherlands. Every time the results for a municipality were announced, an article was published within minutes. Each article was unique and included charts and graphs. In every story, local results were analysed and compared to previous elections and national averages. Besides these local stories, we wrote deeper analyses about local differences in election results and voting behaviour.
The project had a lot of impact! Many people read the stories generated by ADAM. Together, the articles were viewed more than a million times, making it one of the most well-read stories of the year for our publication.
But although page views are nice, our project had a much more important impact by offering every reader anywhere in the country fast, relevant information tailored to the place where they live.
In a normal news article or television programme, results are discussed only on a national level, and maybe a handful of municipalities are highlighted. But the local angle of elections is often much more interesting to our readers than a national story, especially in communities that deviate a lot from the national average.
This information is usually not available anywhere outside large cities, because small local newsrooms typically don’t have the resources to provide this kind of coverage. Using ADAM, inhabitants of municipalities big and small could get the information they needed during the election night.
This was proven by the fact that all 355 generated articles received views, ranging from tens for small municipalities to tens of thousands in large cities. Many people also shared their local results on social media.
Besides the local generated articles, we wrote data-driven stories about the differences in voting behaviour between areas of The Netherlands. These stories highlighted a widening gap between different groups within the population, which in turn makes it harder to form a government. The outcomes of these stories were also used in writing the generated article for each municipality.
The backbone of our project was our in-house editorial ‘robot’ ADAM, which stands for Automatic Data Article Machine. This tool was built using Python and runs in the cloud. We also developed a custom API to seamlessly integrate the articles generated by ADAM into our normal news website.
The election results were provided in real time by the Dutch press agency ANP through an API, which announced results for each municipality as the votes were counted.
To ingest this data, we built a Jupyter Notebook on Google Colab, where data was cleaned and analysed using the Pandas library, to generate the main data set that was inputted into ADAM and used to generate articles. In this process, a large amount of data we had prepared in advance was also added to the real time data.
We also extensively used Datawrapper and its API. For every municipality, as the results were processed, graphs and charts were generated in Datawrapper and embedded into the news stories.
What was the hardest part of this project?
This was the first time we’ve used ADAM to process real time data. In previous projects, we had plenty of opportunity to test and make corrections before publications. In election night, there is no such luxury, and failure is not an option.
Technically, being dependent on an outside data stream at such a crucial moment was a challenge, because we had to prepare for any eventuality.
Generating graphs and charts in real time using Datawrapper added another dependency to this process.
This required extensive testing in advance and scrupulous monitoring throughout the night. Any problems that did appear had to be solved in minutes.
There were also editorial challenges. To be relevant and provide value to our readers, these generated articles had to be more than just a fill-in-the-blank boilerplate story. In preparation, we identified many potential angles for local stories about the election results. These included noticing parties that did surprisingly well for that specific area, or local favourites that underperformed.
Sometimes the story was about how much had changed since the previous elections, but in other areas the more important headline had to do with the turn-out.
In the end, every local story was completely unique, with different focal points and angles throughout.
What can others learn from this project?
Our most essential lesson for other journalists is the importance of making stories relevant for your audience. This is true for any story, but in particular for data journalism, because many readers do not feel drawn to large amounts of numerical information.
By translating a large national news event to local stories, we created coverage that is more relevant, more interesting and provides more value for our readers.
The project underscored our belief that the reader or viewer should be at the centre of our work. In this project, real time data was almost instantly transformed into useful stories: in our view, that is the mission of any data journalist.
From a technical standpoint, a lesson for us was the use of Pandas and a Jupyter Notebook to create a data analysis process that could reliably be repeated many times to yield the results we needed.
The project also emphasised the need for rigorous testing, as well as asking colleagues from the rest of the newsroom for tips and feedback. This helped us catch problems or errors that would have been disastrous had they happened during the election night itself.