Where I come from, many ice cream places offer a flavor called blue moon. In the freezer case, its unnatural coloration immediately draws attention amidst the more pedestrian offerings of chocolate, vanilla, and strawberry.
Photo by Bill McChesney, via Wikipedia. CC-BY-2.0
Its actual flavor (and coloration) varies from purveyor to purveyor, each with their own secret recipe. According to Mashed.com, “Some say that the ice cream has a breakfast cereal sweetness similar to Froot Loops, while others take in notes of almond or citrus.” In truth, it’s been so long since I’ve had any, I can’t really remember. All I know is that it’s a standard offering at ice cream shops.
Or so I thought. In recent years, I have come to learn that it’s not widely available throughout the United States. It is, instead, a regional flavor, with various articles describing it as a “Midwestern favorite,” and an “iconic Midwestern frozen treat.” But nothing I read was able to give more detail about where blue moon was found — only anecdotal, unsatisfying generalizations about the Midwest. No one had hard data, and, most importantly, no one had maps. The true distribution of this flavor was a mystery that I needed to solve.
And so, I’ve spent a large chunk of the last couple of weeks doing so. Let’s start with the maps, and then later I’ll walk you through how I got the data. For fun, I mapped the data four different ways, so pick your favorite (and click on any to look at a larger version):
I think these maps show pretty clearly that blue moon is a regional flavor, though there are a few possible outposts elsewhere in the United States. However, they only sort of validate all the anecdotal articles about it being a “Midwestern” flavor. Minnesota is as Midwestern a state as they come, but it looks like blue moon is scarce in large parts of the state. Likewise Ohio and Iowa. The Blue Moon Core Area (BMCA), as I’m going to start calling it from now on, is really centered on a subset of the Midwest: mainly Wisconsin and Michigan, and parts of Indiana and Illinois.
These maps also explain why I didn’t realize that this wasn’t a popular flavor everywhere: I’ve lived pretty much my whole life in the BMCA.
Notice that while these maps show the distribution of blue moon, two of them also symbolize how much you should trust the map. What’s that about? Well, let’s talk about how these were built, and all the caveats that entails.
Originally, I was hoping for some way to parse through a whole bunch of menus of ice cream parlors, searching for the term “blue moon.” There are large databases of restaurant menus out there, and there are APIs that let you access those data. But after looking through the data offerings of places like Zomato, Foursquare, and others, I couldn’t find a way to get quite what I wanted (at least for free). I considered doing some manual searches, instead — just picking a few example cities and looking at a few dozen menus of flavors, but that quickly bogged down, too.
Eventually, I gave up on trying to search for the occurence of blue moon on actual menus and decided instead to do keyword searches via Yelp. Through their API (and their website, for that matter), you can specify a location, and a search term. So, if I picked an area and searched for “blue moon,” I might get places that have blue moon ice cream. Might. And here’s where we come to the noise in the data, of which there are two kinds.
When you search for “blue moon” on Yelp, one of the big places it looks is the text of user reviews. So, a place might turn up on my search because someone’s review said, “I like the blue moon flavor here best!” That’s great — that confirms that this place has blue moon. But, there are other ways a place might turn up on the search even if it doesn’t have blue moon. I spot-checked the data and found that sometimes a place would turn up because someone said something like “we only go here once in a blue moon.” Or one person who said, “if the prices were any higher we would just go to Blue Moon Bar.”
There’s also a brand of beer called Blue Moon, and there may be establishments that have Blue Moon in their name. Those are other sources of false positive signals.
For some other results, I noticed there were no reviews mentioning the term “blue moon,” but Yelp gave a result anyway. Not sure what they’re relying on — maybe menu information (though in the two examples I checked, Yelp didn’t offer a menu for that place)? So, here, I can’t really tell if that’s helping either the signal or the noise.
I have no doubt that there are ice cream places out there that offer blue moon, but that didn’t turn up on my Yelp searches. Maybe no one said anything about it in a review, or it’s not on a menu or website that Yelp could check. I would guess, though, that this sort of problem isn’t likely to be concentrated in any given area of the map. An ice cream place in Wisconsin, is not more or less likely to get overlooked in this way than a place in Arizona. So this shouldn’t affect the regional pattern we see.
And there are also, likewise, ice cream places (whether or not they have blue moon) that just don’t show up on Yelp, or weren’t correctly placed into their “ice cream” category (which I used to filter my results).
So, now that we have some caveats for our search data, let’s talk about how those data were collected. I did not just hang out on the Yelp website searching over and over for “blue moon” in different locations. Instead, I had a script do that for me.
It took many hours of false starts and revisions, but here’s the method I eventually came up with (on the sixth try). I created a grid of points that covered the US at an interval of 25km (in my projected coordinate system). Then I later added one for parts of Canada (I was curious if blue moon had crossed over the border from Michigan, but it turns out it largely has not). There were about 19,000 points in total.
I then had my script feed each of these coordinates, one at a time, into the Yelp search API. For the first pass, I searched for any place that was in their “ice cream” category, within 20km of the location I was searching (though Yelp warns that when you set a search radius, they take it only as a “suggestion” and will expand or shrink it without telling you, when they deem fit). The grid points are spaced at 25km, so this creates some overlap between them. The goal here was to basically find every single ice cream place that Yelp knew about. I got a lot of duplicates, which helped assure me that I was covering the area pretty well, and when I filtered through them all I came up with about 39,000 unique ice cream parlors.
I then repeated the search, but this time I included the term “blue moon” (in quotes, to keep the two words together), and I widened the search radius to 40km (the maximum) to really make sure I didn’t miss anything. This time, I came up with 771 unique places which were a subset of the total ice cream parlor dataset.
I lied: I actually did the searches in the opposite order, but I thought it would be easier to explain it if I talked about the simpler search first.
Now we know where (some of) the blue moon places are, and we also know where (most of) the ice cream places area — so we have something to normalize our data with. From here, it was just a matter of visualizing everything, to see what proportion of ice cream places also had blue moon. I first tried the ever-trendy method of hexagonal binning.
Note that there are no numbers on this map. Instead, your chances of finding blue moon just range from “not great” to “pretty fair.” Given the weakness of our data, it’s important not to say too much. Vagueness can be good, and I’m leaning here on what I have called salutary obfuscation. Giving numbers might lead people to place more trust in the map than is warranted.
Also the numbers might seem unimpressive. The largest hexagons represent areas where about 10% of ice cream places had blue moon. That doesn’t seem like a lot for an “iconic” flavor, but again, we’re likely missing a fair number of blue moon occurrences here. That’s also the reason I still showed hexagons for areas where I did not find blue moon. I don’t want to suggest that it’s actually absent from that area, because we cannot be that confident in our search. Instead I just say that the chances are “not great,” which is very different than labeling it “0%” or saying it’s not possible.
But what’s that bit about trusting the data? Well, see that giant hexagon in the southwest, on the border between New Mexico and Arizona? 9% of the ice cream places in the area came up on the blue moon search. So it looks like it’s fairly popular (given the caveat that 10% is pretty high in our data set). Except that if you look at the data, there were only 11 ice cream places in the whole hexagon, 1 of which had blue moon. So the small sample size means it’s hard to trust that this is real and not a blip due to noise. On the other hand, some of the hexagons have hundreds of ice cream places, and dozens of blue moon ones, making it them more robust and unlikely to change much due to noise in the data.
So, the “should you trust the data” question is really “how many ice cream parlors are there in each hexagon?”. Here, I’ve made the hexagons more or less transparent based on that number. Any hexagon with 250 or more ice cream parlors was fully opaque (an arbitrary cutoff), down to 20% opacity for hexagons with only one ice cream parlor. Locations with zero ice cream parlors were removed.
I next tried doing a raster-based map, visualizing a kernel density surface.
Here, I did a 200km radius for blue moon places, and the same for all ice cream places. Then I just took the ratio of the surfaces. I didn’t play with the kernel density parameters too much, except for the radius. A wider radius basically means the end result is blurrier, and I wanted to be vague and blurry because, again, the data can only be trusted to give a general pattern. But, this large radius also creates false impressions at times. There’s a big thumbprint in Idaho, for example. There are a few blue moon places there, but they are all concentrated around one city. However, the kernel density spreads them out into the surrounding area, which is misleading. So there was a tradeoff here (though the large hexagons sort of offer a similar tradeoff).
Here I put stripes over the map in the areas of poor data (again, arbitrarily defined; this time to be locations that had under 100 ice cream parlors). The two symbologies don’t pair quite as “cleanly” as the hexagon method. The chance of finding blue moon is shown by a light-to-dark ramp. But the data quality stripes also darken areas, making them seem like less. It’s not too bad, but unideal. Maybe. Or maybe it’s good to darken those places and make them look like less blue moon is there because we’re not confident in them.
Now, since the first two maps in the series (hexes and kernel density) have problems with low sample sizes in some regions, I decided to make a simple choropleth map of the states.
Not much to say here, except each state had enough ice cream places that I didn’t feel the need to indicate anything about data quality. The result is that we now have a simpler visualization, which is a big advantage. Of course, states are arbitrary, and culture (including food) doesn’t stick to state lines. So this map misses out on some of the subtleties of the pattern — but, it’s also probably the most easily digestible by a mass audience.
Finally, I did one last map (a month after the others). It’s another choropleth, but this time I made up my own area units. Remember the initial list of 39,000-ish ice cream places from Yelp?
Well, I decided to use those dots to define arbitrary regions, such that each region would have roughly the same number of ice cream places. I defined 128 of them, such that each region had either 291 or 292 ice cream shops. This took a long time, because I did it manually rather than figuring out a better way. Then I made another choropleth.
The units are perhaps not always sensibly drawn. But, at least each area is now on equal footing: with the same number of ice cream shops in each, we once again do not need to worry about dividing by small numbers and getting noisy data, as we did in the first two maps.
Weird & interesting projects like this take me a long while, and I’m a freelancer. So, if you derive some value/amusement from it, please consider donating to support my continued work.
Of the four maps, I think the kernel density is the prettiest, but the hexagon map is probably best in terms of showing the pattern at the level of detail that it deserves. The two choropleths are simpler, and the state choropleth is definitely going to be most familiar to an audience.
So there you have it: some hard-won evidence for the distribution of a regional ice cream flavor. Given the subject matter, I’m pretty sure the ratio between “amount of time and effort I devoted to this” vs. “amount people care about it” is going to be pretty unfavorable compared to a lot of my other projects, but I will be able to rest easy at night knowing that I have done what I needed to.