Are people “cheating” on crossword puzzles? Part 1

Are people “cheating” on crossword puzzles? Part 1

May 24, 2019    

I’ve been solving crossword puzzles for more than 15 years now. While I don’t cheat by Googling the clues, I do allow myself to research esoteric clues on Wikipedia to learn about them. However, I can’t help but notice the growing number of websites dedicated to just crossword puzzle answers. How many people are actually searching the web for these answers? Who’s “cheating”? Can we quantify this?

Using Google Trends

Fortunately, we have an excellent resource to help us determine this: Google Trends! This is an invaluable tool in my professional career and personal musings as it tracks what people are searching for. At work, it becomes a proxy of consumer interests and brand awareness. We can measure engagement of TV advertising by assume that a percentage of viewers might be piqued by our brand’s ad and search for the brand on Google. In this case, we can see when people are searching for specific crossword puzzle clues to get the answers.

It would be helpful to understand that Google doesn’t actually show exact search volumes of specific keywords, they present a normalized index from a sampled percentage of actual searches within the timeframe of our request. Here are some more details from Google.


Let’s use a clue from a crossword puzzle clue from 3/28/2019 as a demonstration:

2 Down: Subject of Hemingway’s “Death in the Afternoon”

Just searching for the entire clue in Google Trends shows that indeed there was a spike of searches on the day the crossword was published!


If we just isolate the clue to the subject “death in the afternoon”, we also see the spike:


The subject of Hemingway’s book “Death in the Afternoon” is bullfighting. Since the setting was distinctly spanish, the answer here is “CORRIDA”. Looks like there is a visible spike for corrida on the same day among its typical search trends:


By default, Google Trends show weekly data in the UI. But we can use the Python package pytrends to get more granular data through Google’s API

from pytrends.request import TrendReq
import pandas as pd
import matplotlib.pyplot as plt

pytrends = TrendReq(hl='en-US', tz=360)
kw_list = ["death in the afternoon"]
pytrends.build_payload(kw_list, cat=0, timeframe='today 3-m', geo='', gprop='')

trend_df = pytrends.interest_over_time()
_ = trend_df.plot(figsize=(16,5))
_.set_title('Daily Google Search Trend Index', loc='left', fontdict={'fontweight':'extra bold'})


Quantifying Spike - How many people are cheating?

Can we quantify the spike? Yes - relatively. For reference, Google explains its index as:

Numbers represent search interest relative to the highest point on the chart for the given region and time. A value of 100 is the peak popularity for the term. A value of 50 means that the term is half as popular. A score of 0 means there was not enough data for this term.

So if the number of searches on a national scale remains constant, and a topic with 1,000 average searches sees a spike up to a peak of 10,000 searches, then we can expect the index to go from 10 to 100.

But what do we measure the spike to? It’s easy to see a spike for esoteric clues whose search trends might usually be low, but when it’s a relatively popular subject, we need a way to measure the uplift by defining a baseline. Look at this popular clue and its search trend:

54 Across: Issa of “Insecure”

The popularity of Issa Rae, star of Insecure and many other TV shows make it more difficult to spot the spike on 3/28. We’ll need a baseline. We can arbitrary decide on a baseline of 6 weeks and see what looks like with a few lines in Python:

from datetime import datetime, timedelta

def get_daily_trends(keyword, pytrends):
    kw_list = [keyword]
    pytrends.build_payload(kw_list, cat=0, timeframe='today 12-m', geo='', gprop='')
    trend_df = pytrends.interest_over_time()

    return trend_df

def calculate_uplift(trend_df, keyword, spike_week, baseline_window=6):
    baseline_week_start = datetime.strptime(spike_week, '%Y-%m-%d') - timedelta(weeks=baseline_window)
    baseline_week_end = datetime.strptime(spike_week, '%Y-%m-%d') - timedelta(weeks=1)

    baseline_average = trend_df[baseline_week_start:baseline_week_end][keyword].mean()
    spike_value = trend_df[spike_week:spike_week][keyword].values[0]

    return spike_value / baseline_average

keyword = 'Issa of "Insecure"'
issa_df = get_daily_trends(keyword, pytrends)
calculate_uplift(issa_df, keyword, '2019-03-24', 6)

>>> Uplift of 2.74x

Now I can calculate the difference between the crossword puzzle’s published date or week to determine a multiplier (or percent increase) over a period of time before.

Index Change Multiplier % Increase
50 -> 100 2x 100%
25 -> 100 4x 200%
10 -> 100 10x 900%

Evaluating an Entire Puzzle

Now I’m ready to apply my “cheating algorithm” to an entire puzzle. With my New York Times crossword subscription, I’m able to retrieve a JSON file of the puzzle, and I can iterate through the clues and search on Google Trends. For the March 28th puzzle, here’s a list of “tough” clues that received an increase amount of searches.

Clue Multiplier
1A: Volunteer’s Offer 2.34
2D: Subject of Hemingway’s “Death in the Afternoon” 100
4D: Label on some packages of jerky 99
9A: Nickname for Cleveland Browns fans 50
23A: Down Under predator 100
25D: Banned pollutants 4.38
32A: Bonny miss 2.52
54A: Issa of Insure 1.88
55A: Boston Garden legend Bobby 100
59D: Cocoon dwellers 6

This quick analysis shows that yes, people are indeed cheating by Googling the clues for specific answers. What’s funny to me is that even a meta clue like 64 across that relates to the theme of the puzzle saw a 25x increase in searches:

64A: Request needed to understand four clues in this puzzle

Coming Up

In part 2 and 3 of this series, I’ll explore what kind of people are cheating with more Google Trend data, and how I might estimate puzzle difficulties just based on search volume. I’d assume easier puzzles on Monday would have less “cheat” compared to Saturday, but we’ll see!