EDA: Goodreads — What Makes a Perfect Book?
The Short Version
An exploratory analysis of 11,000+ Goodreads books covering titles, authors, ratings, page counts, languages, publishers, and publication years. The notebook answers 21 structured questions for two audiences — readers trying to find what to pick up next, and publishers trying to understand what succeeds. The centerpiece is a hand-crafted composite popularity score that addresses a real flaw in using raw average ratings to rank books.
Problem
What makes a book popular — and how do you measure it fairly? Raw average rating rewards obscure books with a handful of perfect scores. Pure read count rewards old blockbusters with millions of accumulated ratings. Neither alone gives a fair picture. The project asks 21 questions about books and authors, with the popularity ranking problem as the analytical core.
Approach
Cleaning — The dataset had four issues addressed before analysis:
authorscolumn contained co-author entries separated by/(4,562 books affected) — only the first author was retained to avoid duplicate-identity problems in author-level aggregations.publishercolumn had the same/pattern — cleaned identically.num_pageshad a leading whitespace in the column name — stripped via rename.- Books with
num_pages ≤ 20orratings_count ≤ 100were filtered as noise (zero-page entries and unreviewed books).
Custom popularity score — A key insight: average_rating values cluster around 3.5–4.5, while ratings_count values range from hundreds to millions — they’re on incomparable scales. Rather than normalizing, the score raises average_rating to the 8th power (bringing it to ~65,000 for a 4.0-rated book, competitive with rating counts) then multiplies by ratings_count and scales down by 10⁵:
real_best_books = (average_rating⁸ × ratings_count) / 10⁵
This single formula rewards books that are both widely read and highly rated — neither metric can dominate alone.
21 questions answered, grouped by theme:
- Popularity: Top 10 books, top 10 authors (by composite score and by raw read count separately), top 10 publishers.
- Productivity: Top 10 most prolific authors by book count.
- Language: Most common languages, average rating per language, longest books by language.
- Size: Top 10 longest books, top 10 authors with the longest average book length.
- Engagement: Top 10 most text-reviewed books and authors, correlations between page count/text reviews/ratings count and average rating.
- Time: Average rating trend by year, average read count by year, best-rated book per publication year.
Result
Key findings:
- Most popular books: Harry Potter series dominates the composite score — high ratings and massive read counts.
- Most popular author: Stephenie Meyer tops the composite score (driven by Twilight’s enormous ratings count).
- Most prolific author ≠ most popular author — the two rankings share almost no overlap, confirming that volume and quality are independent.
- Most read book: Twilight by a significant margin in raw ratings count.
- Latin-language books have the highest average ratings — a small but highly rated sample.
- All books with 1M+ ratings have an average rating above 3.5 — popularity and quality are correlated at the extremes.
- All books over 1,500 pages have average ratings above 4.0 — readers who commit to long books rate them highly.
- Text reviews and ratings count are strongly correlated (the one relationship the regression plots confirmed as positive and strong).
- Average ratings are declining slightly over publication years — newer books tend to be rated lower, possibly due to recency effects and incomplete accumulation.
- An outlier spike in average read count around 1952 traced back to a single book: A Streetcar Named Desire — flagged, investigated, and explained inline.
- Most popular publisher: Arthur A. Levine Books (home of the Harry Potter US editions).
What I Learned
The composite scoring formula is the most creative analytical decision in this notebook — and the reasoning behind it (the scale mismatch between ratings and counts, solved by exponentiation rather than normalization) is the kind of problem that doesn’t have a textbook answer. It required thinking about what the metric means rather than just what’s available. The notebook also demonstrates a consistent habit of challenging the obvious answer: when sort_values('average_rating').head(10) produced an implausible list of obscure books, the response was to ask why and redesign the metric rather than accept a misleading result. The outlier investigation on the 1950s read-count spike is another example of the same instinct — a chart anomaly treated as a question to answer, not noise to ignore.