Introduction
In addition to being a fun and educational exercise in and of itself, I wanted to use the exercise to answer an interesting question (well, at least one interesting to me!). So I explored a few of the various APIs that NYT makes available, and many presented potentially interesting ideas. In the end, maybe because I had been struggling to find a good novel to read, I ended up choosing the books API. But I didn’t just want to pull down a list of best sellers. I wanted to dig into the data just a bit and see if I could uncover something interesting, so I decided to find out whether Fiction books stay on the best sellers list longer than do Non-Fiction books or vice versa. At this point, I’ve only confirmed feasibility of what I’d like to do, but I haven’t actually captured any data, so I don’t know what the answer is yet.
According to the NYT API README page, the best sellers list URI format is as follows:
http://api.nytimes.com/svc/books/{version}/lists/[date/]{list-name}[.response_format]? [optional-param1=value1]&[...]&api-key={your-API-key}
library(jsonlite)
library(dplyr)
library(tidyr)
library(ggplot2)
library(ggthemes)
api_key = 'api-key=368fbac19ccc4179ae2db761a426699d'
base_url = 'https://api.nytimes.com/svc/books/v3/lists/'
resp_format = '.json'
fict = 'combined-print-and-e-book-fiction'
nonfict = 'combined-print-and-e-book-nonfiction'
fict_url = paste0(base_url, fict, resp_format, '?', api_key)
fict_res = fromJSON(fict_url)
fict_df = fict_res$results$books
fict_df$category = 'fiction'
nonfict_url = paste0(base_url, nonfict, resp_format, '?', api_key)
nonfict_res = fromJSON(nonfict_url)
nonfict_df = nonfict_res$results$books
nonfict_df$category = 'nonfiction'
nytbestsellers = bind_rows(fict_df, nonfict_df)
nytbestsellers$vendor_link = paste0('[Amazon](', nytbestsellers$amazon_product_url, ')')
nytbestsellers$cover = paste0("<img src=", nytbestsellers$book_image, " width='50px'/>")
Top 5 in NYT Best Sellers List
Let’s first have a look at the top five fiction and non-fiction books currently on the list.
knitr::kable(nytbestsellers[1:5, c('category', 'rank', 'title', 'description', 'author', 'vendor_link', 'cover')], row.names = FALSE, caption = 'New York Times Best Sellers - Top 5 in Fiction')
| fiction |
1 |
THE GIRL ON THE TRAIN |
A psychological thriller set in the environs of London is full of complications and betrayals. |
Paula Hawkins |
Amazon |
 |
| fiction |
2 |
VINCE FLYNN: ORDER TO KILL |
Flynn’s character, the C.I.A. operative Mitch Rapp, uncovers a dangerous Russian plot. Flynn died in 2013. |
Kyle Mills |
Amazon |
 |
| fiction |
3 |
SMALL GREAT THINGS |
A medical crisis entangles a black nurse, a white supremacist father and a white lawyer. |
Jodi Picoult |
Amazon |
 |
| fiction |
4 |
TWO BY TWO |
A man who became a single father when his marriage and business collapsed learns to take a chance on a new love. |
Nicholas Sparks |
Amazon |
 |
| fiction |
5 |
A MAN CALLED OVE |
A curmudgeon's gruff exterior masks a generosity of spirit. Originally published in Sweden in 2014. |
Fredrik Backman |
Amazon |
 |
knitr::kable(nytbestsellers[21:25, c('category', 'rank', 'title', 'description', 'author', 'vendor_link', 'cover')], row.names = FALSE, caption = 'New York Times Best Sellers - Top 5 in Non-Fiction')
| nonfiction |
1 |
KILLING THE RISING SUN |
The host of “The O’Reilly Factor” recounts the final years of World War II. |
Bill O'Reilly and Martin Dugard |
Amazon |
 |
| nonfiction |
2 |
BORN TO RUN |
The singer-songwriter's autobiography. |
Bruce Springsteen |
Amazon |
 |
| nonfiction |
3 |
FILTHY RICH |
The story of a South Florida financier convicted of soliciting sex from underage girls. |
James Patterson and John Connolly with Tim Malloy |
Amazon |
 |
| nonfiction |
4 |
HILLBILLY ELEGY |
A Yale Law School graduate looks at the struggles of the white working class through the story of his own childhood in the Rust Belt. |
J D Vance |
Amazon |
 |
| nonfiction |
5 |
LOVE WARRIOR |
After her husband confesses to multiple infidelities, a woman struggles to grow — and so does he. |
Glennon Doyle Melton |
Amazon |
 |
Weeks on NYT Best Sellers List
Next, we’ll take a look at how long books have been on their respective best sellers lists. Based on the histograms below, there doesn’t seem to be a discernible difference between the two book categories (aside from the fiction category having one book that has been on the list for a very long time, which happens to be The Girl on the Train).
nytbestsellers %>% ggplot(aes(x = weeks_on_list, col = category, fill = category)) +
geom_histogram(alpha = 0.5, binwidth = 1, position = 'identity') +
facet_grid(category ~ .) +
scale_fill_economist() + scale_color_economist() +
ggtitle('Number of Weeks on NYT Best Sellers List Histogram')

Turnover of NYT Best Sellers
Perhaps the amount of turnover within the top 20 of each category might prove more interesting. Let’s look at how many new books were added to each list that weren’t there the previous week. Fortunately, the API results provide each book’s ranking for the previous week. All we need to do is count how many were not in the top 20 in the previous week.
And again, there does not seem to be a significant difference. There were 10 new non-fiction additions compared to 9 new fiction additions. I suppose it’s interesting that there is that much turnover from week-to-week. Perhaps in a future study we could look at turnover over time.
nytbestsellers %>% mutate(newAddition = ifelse(rank_last_week == 0, 'New Addition', 'Not New Addition')) %>%
group_by(category, newAddition) %>%
summarise(n = n()) %>%
mutate(freq = n / sum(n)) %>%
ggplot(aes(x = category, y = freq, fill = newAddition)) +
geom_bar(stat = 'identity') +
scale_fill_economist() + scale_color_economist() +
ggtitle('Proportion of New Additions to NYT Best Sellers List')

Rank Changes of NYT Best Sellers
I’m running out of things to compare here! One last comparison then - let’s have a look at how much movement in rankings took place within each category from the previous week to the current week. We’ll evaluate the change in rank from week-to-week. For those books that were not ranked in the previous week, we’ll assume that they were all ranked 21st (just outside of the best sellers list).
Alas, when comparing the average absolute value of rank change, fiction books seem to have moved around just a bit more than non-fiction books; however, without a benchmark, it’s hard to say how big of a difference this really represents.
nytbestsellers %>% mutate(rankChange = ifelse(rank_last_week == 0, 21, rank_last_week) - rank) %>%
group_by(category) %>%
summarise(avgAbsRankChange = mean(abs(rankChange)))
All in all, this was a fun exercise even if the takeaways from the data analysis were not earth shattering. Perhaps looking at this data over time would prove more interesting…
LS0tCnRpdGxlOiAiREFUQTYwNy1XZWVrNyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IHlldGkKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tCgojSW50cm9kdWN0aW9uICAKCkluIGFkZGl0aW9uIHRvIGJlaW5nIGEgZnVuIGFuZCBlZHVjYXRpb25hbCBleGVyY2lzZSBpbiBhbmQgb2YgaXRzZWxmLCBJIHdhbnRlZCB0byB1c2UgdGhlIGV4ZXJjaXNlIHRvIGFuc3dlciBhbiBpbnRlcmVzdGluZyBxdWVzdGlvbiAod2VsbCwgYXQgbGVhc3Qgb25lIGludGVyZXN0aW5nIHRvIG1lISkuIFNvIEkgZXhwbG9yZWQgYSBmZXcgb2YgdGhlIHZhcmlvdXMgQVBJcyB0aGF0IE5ZVCBtYWtlcyBhdmFpbGFibGUsIGFuZCBtYW55IHByZXNlbnRlZCBwb3RlbnRpYWxseSBpbnRlcmVzdGluZyBpZGVhcy4gSW4gdGhlIGVuZCwgbWF5YmUgYmVjYXVzZSBJIGhhZCBiZWVuIHN0cnVnZ2xpbmcgdG8gZmluZCBhIGdvb2Qgbm92ZWwgdG8gcmVhZCwgSSBlbmRlZCB1cCBjaG9vc2luZyB0aGUgYm9va3MgQVBJLiBCdXQgSSBkaWRuJ3QganVzdCB3YW50IHRvIHB1bGwgZG93biBhIGxpc3Qgb2YgYmVzdCBzZWxsZXJzLiBJIHdhbnRlZCB0byBkaWcgaW50byB0aGUgZGF0YSBqdXN0IGEgYml0IGFuZCBzZWUgaWYgSSBjb3VsZCB1bmNvdmVyIHNvbWV0aGluZyBpbnRlcmVzdGluZywgc28gSSBkZWNpZGVkIHRvIGZpbmQgb3V0IHdoZXRoZXIgRmljdGlvbiBib29rcyBzdGF5IG9uIHRoZSBiZXN0IHNlbGxlcnMgbGlzdCBsb25nZXIgdGhhbiBkbyBOb24tRmljdGlvbiBib29rcyBvciB2aWNlIHZlcnNhLiBBdCB0aGlzIHBvaW50LCBJJ3ZlIG9ubHkgY29uZmlybWVkIGZlYXNpYmlsaXR5IG9mIHdoYXQgSSdkIGxpa2UgdG8gZG8sIGJ1dCBJIGhhdmVuJ3QgYWN0dWFsbHkgY2FwdHVyZWQgYW55IGRhdGEsIHNvIEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBhbnN3ZXIgaXMgeWV0LiAgCgpBY2NvcmRpbmcgdG8gdGhlIE5ZVCBBUEkgUkVBRE1FIHBhZ2UsIHRoZSBiZXN0IHNlbGxlcnMgbGlzdCBVUkkgZm9ybWF0IGlzIGFzIGZvbGxvd3M6ICAKYGh0dHA6Ly9hcGkubnl0aW1lcy5jb20vc3ZjL2Jvb2tzL3t2ZXJzaW9ufS9saXN0cy9bZGF0ZS9de2xpc3QtbmFtZX1bLnJlc3BvbnNlX2Zvcm1hdF0/YApgW29wdGlvbmFsLXBhcmFtMT12YWx1ZTFdJlsuLi5dJmFwaS1rZXk9e3lvdXItQVBJLWtleX1gICAgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKbGlicmFyeShqc29ubGl0ZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdndGhlbWVzKQoKYXBpX2tleSA9ICdhcGkta2V5PTM2OGZiYWMxOWNjYzQxNzlhZTJkYjc2MWE0MjY2OTlkJwpiYXNlX3VybCA9ICdodHRwczovL2FwaS5ueXRpbWVzLmNvbS9zdmMvYm9va3MvdjMvbGlzdHMvJwpyZXNwX2Zvcm1hdCA9ICcuanNvbicKCmZpY3QgPSAnY29tYmluZWQtcHJpbnQtYW5kLWUtYm9vay1maWN0aW9uJwpub25maWN0ID0gJ2NvbWJpbmVkLXByaW50LWFuZC1lLWJvb2stbm9uZmljdGlvbicKCmZpY3RfdXJsID0gcGFzdGUwKGJhc2VfdXJsLCBmaWN0LCByZXNwX2Zvcm1hdCwgJz8nLCBhcGlfa2V5KQpmaWN0X3JlcyA9IGZyb21KU09OKGZpY3RfdXJsKQpmaWN0X2RmID0gZmljdF9yZXMkcmVzdWx0cyRib29rcwpmaWN0X2RmJGNhdGVnb3J5ID0gJ2ZpY3Rpb24nCgpub25maWN0X3VybCA9IHBhc3RlMChiYXNlX3VybCwgbm9uZmljdCwgcmVzcF9mb3JtYXQsICc/JywgYXBpX2tleSkKbm9uZmljdF9yZXMgPSBmcm9tSlNPTihub25maWN0X3VybCkKbm9uZmljdF9kZiA9IG5vbmZpY3RfcmVzJHJlc3VsdHMkYm9va3MKbm9uZmljdF9kZiRjYXRlZ29yeSA9ICdub25maWN0aW9uJwoKbnl0YmVzdHNlbGxlcnMgPSBiaW5kX3Jvd3MoZmljdF9kZiwgbm9uZmljdF9kZikKCm55dGJlc3RzZWxsZXJzJHZlbmRvcl9saW5rID0gcGFzdGUwKCdbQW1hem9uXSgnLCBueXRiZXN0c2VsbGVycyRhbWF6b25fcHJvZHVjdF91cmwsICcpJykKbnl0YmVzdHNlbGxlcnMkY292ZXIgPSBwYXN0ZTAoIjxpbWcgc3JjPSIsIG55dGJlc3RzZWxsZXJzJGJvb2tfaW1hZ2UsICIgd2lkdGg9JzUwcHgnLz4iKQpgYGAKCiNUb3AgNSBpbiBOWVQgQmVzdCBTZWxsZXJzIExpc3QgIAoKTGV0J3MgZmlyc3QgaGF2ZSBhIGxvb2sgYXQgdGhlIHRvcCBmaXZlIGZpY3Rpb24gYW5kIG5vbi1maWN0aW9uIGJvb2tzIGN1cnJlbnRseSBvbiB0aGUgbGlzdC4gIAoKYGBge3J9CmtuaXRyOjprYWJsZShueXRiZXN0c2VsbGVyc1sxOjUsIGMoJ2NhdGVnb3J5JywgJ3JhbmsnLCAndGl0bGUnLCAnZGVzY3JpcHRpb24nLCAnYXV0aG9yJywgJ3ZlbmRvcl9saW5rJywgJ2NvdmVyJyldLCByb3cubmFtZXMgPSBGQUxTRSwgY2FwdGlvbiA9ICdOZXcgWW9yayBUaW1lcyBCZXN0IFNlbGxlcnMgLSBUb3AgNSBpbiBGaWN0aW9uJykgCgprbml0cjo6a2FibGUobnl0YmVzdHNlbGxlcnNbMjE6MjUsIGMoJ2NhdGVnb3J5JywgJ3JhbmsnLCAndGl0bGUnLCAnZGVzY3JpcHRpb24nLCAnYXV0aG9yJywgJ3ZlbmRvcl9saW5rJywgJ2NvdmVyJyldLCByb3cubmFtZXMgPSBGQUxTRSwgY2FwdGlvbiA9ICdOZXcgWW9yayBUaW1lcyBCZXN0IFNlbGxlcnMgLSBUb3AgNSBpbiBOb24tRmljdGlvbicpCmBgYAoKI1dlZWtzIG9uIE5ZVCBCZXN0IFNlbGxlcnMgTGlzdCAgCgpOZXh0LCB3ZSdsbCB0YWtlIGEgbG9vayBhdCBob3cgbG9uZyBib29rcyBoYXZlIGJlZW4gb24gdGhlaXIgcmVzcGVjdGl2ZSBiZXN0IHNlbGxlcnMgbGlzdHMuIEJhc2VkIG9uIHRoZSBoaXN0b2dyYW1zIGJlbG93LCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBkaXNjZXJuaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBib29rIGNhdGVnb3JpZXMgKGFzaWRlIGZyb20gdGhlIGZpY3Rpb24gY2F0ZWdvcnkgaGF2aW5nIG9uZSBib29rIHRoYXQgaGFzIGJlZW4gb24gdGhlIGxpc3QgZm9yIGEgdmVyeSBsb25nIHRpbWUsIHdoaWNoIGhhcHBlbnMgdG8gYmUgKlRoZSBHaXJsIG9uIHRoZSBUcmFpbiopLiAgICAKCmBgYHtyfQpueXRiZXN0c2VsbGVycyAlPiUgZ2dwbG90KGFlcyh4ID0gd2Vla3Nfb25fbGlzdCwgY29sID0gY2F0ZWdvcnksIGZpbGwgPSBjYXRlZ29yeSkpICsKICBnZW9tX2hpc3RvZ3JhbShhbHBoYSA9IDAuNSwgYmlud2lkdGggPSAxLCBwb3NpdGlvbiA9ICdpZGVudGl0eScpICsKICBmYWNldF9ncmlkKGNhdGVnb3J5IH4gLikgKyAKICBzY2FsZV9maWxsX2Vjb25vbWlzdCgpICsgc2NhbGVfY29sb3JfZWNvbm9taXN0KCkgKyAKICBnZ3RpdGxlKCdOdW1iZXIgb2YgV2Vla3Mgb24gTllUIEJlc3QgU2VsbGVycyBMaXN0IEhpc3RvZ3JhbScpCmBgYAoKI1R1cm5vdmVyIG9mIE5ZVCBCZXN0IFNlbGxlcnMgIAoKUGVyaGFwcyB0aGUgYW1vdW50IG9mIHR1cm5vdmVyIHdpdGhpbiB0aGUgdG9wIDIwIG9mIGVhY2ggY2F0ZWdvcnkgbWlnaHQgcHJvdmUgbW9yZSBpbnRlcmVzdGluZy4gTGV0J3MgbG9vayBhdCBob3cgbWFueSBuZXcgYm9va3Mgd2VyZSBhZGRlZCB0byBlYWNoIGxpc3QgdGhhdCB3ZXJlbid0IHRoZXJlIHRoZSBwcmV2aW91cyB3ZWVrLiBGb3J0dW5hdGVseSwgdGhlIEFQSSByZXN1bHRzIHByb3ZpZGUgZWFjaCBib29rJ3MgcmFua2luZyBmb3IgdGhlIHByZXZpb3VzIHdlZWsuIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIGNvdW50IGhvdyBtYW55IHdlcmUgbm90IGluIHRoZSB0b3AgMjAgaW4gdGhlIHByZXZpb3VzIHdlZWsuICAKCkFuZCBhZ2FpbiwgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UuIFRoZXJlIHdlcmUgMTAgbmV3IG5vbi1maWN0aW9uIGFkZGl0aW9ucyBjb21wYXJlZCB0byA5IG5ldyBmaWN0aW9uIGFkZGl0aW9ucy4gSSBzdXBwb3NlIGl0J3MgaW50ZXJlc3RpbmcgdGhhdCB0aGVyZSBpcyB0aGF0IG11Y2ggdHVybm92ZXIgZnJvbSB3ZWVrLXRvLXdlZWsuIFBlcmhhcHMgaW4gYSBmdXR1cmUgc3R1ZHkgd2UgY291bGQgbG9vayBhdCB0dXJub3ZlciBvdmVyIHRpbWUuICAKCmBgYHtyfQpueXRiZXN0c2VsbGVycyAlPiUgbXV0YXRlKG5ld0FkZGl0aW9uID0gaWZlbHNlKHJhbmtfbGFzdF93ZWVrID09IDAsICdOZXcgQWRkaXRpb24nLCAnTm90IE5ldyBBZGRpdGlvbicpKSAlPiUKICBncm91cF9ieShjYXRlZ29yeSwgbmV3QWRkaXRpb24pICU+JQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgbXV0YXRlKGZyZXEgPSBuIC8gc3VtKG4pKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBjYXRlZ29yeSwgeSA9IGZyZXEsIGZpbGwgPSBuZXdBZGRpdGlvbikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHNjYWxlX2ZpbGxfZWNvbm9taXN0KCkgKyBzY2FsZV9jb2xvcl9lY29ub21pc3QoKSArIAogIGdndGl0bGUoJ1Byb3BvcnRpb24gb2YgTmV3IEFkZGl0aW9ucyB0byBOWVQgQmVzdCBTZWxsZXJzIExpc3QnKQpgYGAKCiNSYW5rIENoYW5nZXMgb2YgTllUIEJlc3QgU2VsbGVycyAgCgpJJ20gcnVubmluZyBvdXQgb2YgdGhpbmdzIHRvIGNvbXBhcmUgaGVyZSEgT25lIGxhc3QgY29tcGFyaXNvbiB0aGVuIC0gbGV0J3MgaGF2ZSBhIGxvb2sgYXQgaG93IG11Y2ggbW92ZW1lbnQgaW4gcmFua2luZ3MgdG9vayBwbGFjZSB3aXRoaW4gZWFjaCBjYXRlZ29yeSBmcm9tIHRoZSBwcmV2aW91cyB3ZWVrIHRvIHRoZSBjdXJyZW50IHdlZWsuIFdlJ2xsIGV2YWx1YXRlIHRoZSBjaGFuZ2UgaW4gcmFuayBmcm9tIHdlZWstdG8td2Vlay4gRm9yIHRob3NlIGJvb2tzIHRoYXQgd2VyZSBub3QgcmFua2VkIGluIHRoZSBwcmV2aW91cyB3ZWVrLCB3ZSdsbCBhc3N1bWUgdGhhdCB0aGV5IHdlcmUgYWxsIHJhbmtlZCAyMXN0IChqdXN0IG91dHNpZGUgb2YgdGhlIGJlc3Qgc2VsbGVycyBsaXN0KS4gIAoKQWxhcywgd2hlbiBjb21wYXJpbmcgdGhlIGF2ZXJhZ2UgYWJzb2x1dGUgdmFsdWUgb2YgcmFuayBjaGFuZ2UsIGZpY3Rpb24gYm9va3Mgc2VlbSB0byBoYXZlIG1vdmVkIGFyb3VuZCBqdXN0IGEgYml0IG1vcmUgdGhhbiBub24tZmljdGlvbiBib29rczsgaG93ZXZlciwgd2l0aG91dCBhIGJlbmNobWFyaywgaXQncyBoYXJkIHRvIHNheSBob3cgYmlnIG9mIGEgZGlmZmVyZW5jZSB0aGlzIHJlYWxseSByZXByZXNlbnRzLiAgCgpgYGB7cn0Kbnl0YmVzdHNlbGxlcnMgJT4lIG11dGF0ZShyYW5rQ2hhbmdlID0gaWZlbHNlKHJhbmtfbGFzdF93ZWVrID09IDAsIDIxLCByYW5rX2xhc3Rfd2VlaykgLSByYW5rKSAlPiUKICBncm91cF9ieShjYXRlZ29yeSkgJT4lCiAgc3VtbWFyaXNlKGF2Z0Fic1JhbmtDaGFuZ2UgPSBtZWFuKGFicyhyYW5rQ2hhbmdlKSkpCmBgYAoKQWxsIGluIGFsbCwgdGhpcyB3YXMgYSBmdW4gZXhlcmNpc2UgZXZlbiBpZiB0aGUgdGFrZWF3YXlzIGZyb20gdGhlIGRhdGEgYW5hbHlzaXMgd2VyZSBub3QgZWFydGggc2hhdHRlcmluZy4gIFBlcmhhcHMgbG9va2luZyBhdCB0aGlzIGRhdGEgb3ZlciB0aW1lIHdvdWxkIHByb3ZlIG1vcmUgaW50ZXJlc3RpbmcuLi4gIAoKCg==