Christmas Novels

Counts for Santa and Christmas in different novels.
PydyTuesday
TidyTuesday
Author

Manish Datt

Published

December 30, 2025

TidyTuesday dataset of December 30, 2025

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
christmas_novel_authors = pd.read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-12-30/christmas_novel_authors.csv')
christmas_novel_text = pd.read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-12-30/christmas_novel_text.csv')
christmas_novels = pd.read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-12-30/christmas_novels.csv')
christmas_novel_authors
gutenberg_author_id author birthdate deathdate wikipedia aliases
0 37 Dickens, Charles 1812.0 1870.0 https://en.wikipedia.org/wiki/Charles_Dickens Boz/Dickens, Charles John Huffam
1 266 Wiggin, Kate Douglas Smith 1856.0 1923.0 https://en.wikipedia.org/wiki/Kate_Douglas_Wiggin Riggs, Kate Douglas Smith Wiggin/Smith, Kate D...
2 313 Thackeray, William Makepeace 1811.0 1863.0 https://en.wikipedia.org/wiki/William_Makepeac... Titmarsh, Michael Angelo/Thackeray, W. M./Titm...
3 362 Van Dyke, Henry 1852.0 1933.0 https://en.wikipedia.org/wiki/Henry_van_Dyke Dyke, Henry Van/Dyke, Henry Jackson Van/Dyke, ...
4 102 Alcott, Louisa May 1832.0 1888.0 https://en.wikipedia.org/wiki/Louisa_May_Alcott Barnard, A. M./Alcott, Louisa M. (Louisa May)/...
5 1324 Locke, William John 1863.0 1930.0 https://en.wikipedia.org/wiki/William_John_Locke Locke, William J. (William John)/Locke, W. J. ...
6 3695 Boyd, Mary Stuart 1860.0 1937.0 NaN NaN
7 2334 Hughes, Rupert 1872.0 1956.0 https://en.wikipedia.org/wiki/Rupert_Hughes NaN
8 2044 Finley, Martha 1828.0 1909.0 https://en.wikipedia.org/wiki/Martha_Finley Farquharson, Martha/Cousin Martha
9 5591 Brady, Cyrus Townsend 1861.0 1920.0 https://en.wikipedia.org/wiki/Cyrus_Townsend_B... NaN
10 3939 Miller, Alice Duer 1874.0 1942.0 https://en.wikipedia.org/wiki/Alice_Duer_Miller Duer, Alice
11 2497 Dawson, Coningsby 1883.0 1959.0 https://en.wikipedia.org/wiki/Coningsby_Dawson Dawson, Coningsby W. (Coningsby William)/Dawso...
12 5282 Brown, Abbie Farwell 1871.0 1927.0 https://en.wikipedia.org/wiki/Abbie_Farwell_Brown NaN
13 6328 Dalrymple, Leona 1884.0 1968.0 https://en.wikipedia.org/wiki/Leona_Dalrymple Dalrymple, C. Leona
14 1253 Barclay, Florence L. (Florence Louisa) 1862.0 1921.0 https://en.wikipedia.org/wiki/Florence_L._Barclay Barclay, Florence Louisa (Charlesworth), Mrs./...
15 7088 Parker, Theodore 1810.0 1860.0 https://en.wikipedia.org/wiki/Theodore_Parker Blodgett, Levi
16 3522 Williamson, C. N. (Charles Norris) 1859.0 1920.0 https://en.wikipedia.org/wiki/Charles_Norris_W... Williamson, Charles Norris
17 3796 Williamson, A. M. (Alice Muriel) 1869.0 1933.0 https://en.wikipedia.org/wiki/A._M._Williamson Williamson, Alice Muriel/Williamson, Mrs. C. N.
18 585 Butler, Ellis Parker 1869.0 1937.0 https://en.wikipedia.org/wiki/Ellis_Parker_Butler NaN
19 8241 Francis, Samuel W. (Samuel Ward) 1835.0 1886.0 https://en.wikipedia.org/wiki/Samuel_Ward_Francis Francis, Samuel Ward/Syntax, Samuel
20 2216 Richmond, Grace S. (Grace Smith) 1866.0 1959.0 https://en.wikipedia.org/wiki/Grace_S._Richmond Smith, Grace
21 9034 McIntosh, Maria J. (Maria Jane) 1803.0 1878.0 https://en.wikipedia.org/wiki/Maria_Jane_McIntosh McIntosh, Maria Jane/McIntosh, M. J. (Maria Ja...
22 357 Mitchell, S. Weir (Silas Weir) 1829.0 1914.0 https://en.wikipedia.org/wiki/Silas_Weir_Mitchell Mitchell, Weir/Mitchell, Silas Weir
23 9154 McMahan, Anna Benneson NaN NaN NaN NaN
24 9186 Leighton, John 1822.0 1912.0 https://en.wikipedia.org/wiki/John_Leighton_(a... Limner, Luke
25 2440 Stretton, Hesba 1832.0 1911.0 https://en.wikipedia.org/wiki/Hesba_Stretton Smith, Sarah
26 3531 Gale, Zona 1874.0 1938.0 https://en.wikipedia.org/wiki/Zona_Gale Breese, William Llywelyn, Mrs./Breese, William...
27 8194 Auerbach, Berthold 1812.0 1882.0 https://en.wikipedia.org/wiki/Berthold_Auerbac... Baruch, Moses
28 7166 Burnett, Alice Hale NaN NaN https://en.wikipedia.org/wiki/Alice_Hale_Burnett NaN
29 650 Hale, Edward Everett 1822.0 1909.0 https://en.wikipedia.org/wiki/Edward_Everett_Hale Ingham, Frederic/Darragh, J. Thomas/Hale, E. E...
30 38912 Gask, Lilian 1865.0 NaN https://en.wikipedia.org/wiki/Lilian_Gask NaN
31 2241 Frey, Hildegard G. 1891.0 1957.0 NaN Frey, Hildegard G. (Hildegard Gertrude)/Frey, ...
32 869 Allen, James Lane 1849.0 1925.0 https://en.wikipedia.org/wiki/James_Lane_Allen NaN
33 4001 Bacheller, Irving 1859.0 1950.0 https://en.wikipedia.org/wiki/Irving_Bacheller Bacheller, Addison Irving
34 3293 Eggleston, Edward 1837.0 1902.0 https://en.wikipedia.org/wiki/Edward_Eggleston NaN
christmas_novel_text
gutenberg_id text
0 46 A CHRISTMAS CAROL
1 46 NaN
2 46 IN PROSE
3 46 BEING
4 46 A Ghost Story of Christmas
... ... ...
114129 52935 think the givers found it more blessed than th...
114130 52935 Mr. Blake heard in his rounds I cannot tell. I...
114131 52935 must ask the Old Ebony.
114132 52935 NaN
114133 52935 [Illustration]

114134 rows × 2 columns

christmas_novels
gutenberg_id title gutenberg_author_id
0 46 A Christmas Carol in Prose; Being a Ghost Stor... 37
1 1902 The Old Peabody Pew: A Christmas Romance of a ... 266
2 2731 The Christmas Books of Mr. M.A. Titmarsh 313
3 4384 The Lost Word: A Christmas Legend of Long Ago 362
4 8694 The Abbot's Ghost, or Maurice Treherne's Tempt... 102
5 10707 A Christmas Mystery: The Story of Three Wise Men 1324
6 10813 A Versailles Christmas-Tide 3695
7 12881 Mrs. Budlong's Christmas Presents 2334
8 14534 Christmas with Grandma Elsie 2044
9 14606 And Thus He Came: A Christmas Fantasy 5591
10 14835 The Burglar and the Blizzard: A Christmas Story 3939
11 15552 Christmas Outside of Eden 2497
12 15709 The Christmas Angel 5282
13 15826 Uncle Noah's Christmas Inspiration 6328
14 16134 The First Christmas Tree: A Story of the Forest 362
15 16454 The Upas Tree: A Christmas Story for all the Year 1253
16 17006 Two Christmas Celebrations 7088
17 17456 The Romance of a Christmas Card 266
18 17510 When the Yule Log Burns: A Christmas Story 6328
19 17743 Rosemary: A Christmas story 3522
20 17743 Rosemary: A Christmas story 3796
21 17937 The Thin Santa Claus: The Chicken Yard That Wa... 585
22 18770 A Christmas Story\nMan in His Element: or, A N... 8241
23 19337 A Christmas Carol 37
24 19384 On Christmas Day In The Evening 2216
25 20018 Evenings at Donaldson Manor; Or, The Christmas... 9034
26 20180 Mr. Kris Kringle: A Christmas Tale 357
27 20210 Shakespeare's Christmas Gift to Queen Bess 9154
28 20251 Christmas Comes but Once a Year\r\nShowing Wha... 9186
29 20453 The Christmas Child 2440
30 20516 Christmas: A Story 3531
31 22665 Christian Gellert's Last Christmas\nFrom "Germ... 8194
32 22696 Colonel Crockett's Co-operative Christmas 2334
33 23569 Christmas Holidays at Merryvale\nThe Merryvale... 7166
34 32455 Christmas Eve and Christmas Day: Ten Christmas... 650
35 37547 The Fairies and the Christmas Child 38912
36 38983 The Camp Fire Girls Solve a Mystery; Or, The C... 2241
37 42919 Angel Unawares: A Story of Christmas Eve 3522
38 42919 Angel Unawares: A Story of Christmas Eve 3796
39 42923 The Doctor's Christmas Eve 869
40 44796 The Prodigal Village: A Christmas Tale 4001
41 52935 Mr. Blake's Walking-Stick: A Christmas Story f... 3293
# find duplicates in christmas_novels based on 'gutenberg_id'
duplicates = christmas_novels[christmas_novels.duplicated(subset=['gutenberg_id'], keep=False)]
duplicates
gutenberg_id title gutenberg_author_id
19 17743 Rosemary: A Christmas story 3522
20 17743 Rosemary: A Christmas story 3796
37 42919 Angel Unawares: A Story of Christmas Eve 3522
38 42919 Angel Unawares: A Story of Christmas Eve 3796
# remove row with nan
christmas_novel_text['text'] = christmas_novel_text['text'].fillna('')

grp_novel_text = (
    christmas_novel_text
    .groupby('gutenberg_id')['text']
    .apply(' '.join)
    .reset_index()
)
grp_novel_text
gutenberg_id text
0 46 A CHRISTMAS CAROL IN PROSE BEING A Ghost Stor...
1 1902 The Old Peabody Pew: A Christmas Romance of a ...
2 2731 THE CHRISTMAS BOOKS of MR. M. A. TITMARSH b...
3 4384 THE LOST WORD A Christmas Legend of Long Ago...
4 8694 THE ABBOT'S GHOST OR, MAURICE TREHERNE'S TEMP...
5 10707 "_I cannot tell how the truth may be: I say th...
6 10813 A VERSAILLES CHRISTMAS-TIDE By Mary Stuart B...
7 12881 MRS. BUDLONG'S CHRISTMAS PRESENTS BY RUPERT ...
8 14534 CHRISTMAS WITH GRANDMA ELSIE by MARTHA FINLE...
9 14606 AND THUS HE CAME A Christmas Fantasy by CYR...
10 14835 [Illustration: The Burglar] The Burglar an...
11 15552 [Illustration: Christmas Outside of Eden--Book...
12 15709 By Abbie Farwell Brown * * ...
13 15826 UNCLE NOAH'S CHRISTMAS INSPIRATION by LEONA ...
14 16134 THE FIRST CHRISTMAS TREE A Story of the Fores...
15 16454 [Illustration: "That figure was not his own." ...
16 17006 THE TWO CHRISTMAS CELEBRATIONS, A.D. I. and M...
17 17456 _The_ ...
18 17510 [Illustration: "The Doctor's old-fashioned hou...
19 17743 ROSEMARY: A CHRISTMAS STORY ROSEMARY: A CHRIST...
20 17937 [Illustration: "_Mrs. Gratz watched the t...
21 18770 [Transcriber's note: Irregularities in punctua...
22 19337 A CHRISTMAS CAROL By CHARLES DICKENS ILLUSTR...
23 19384 [Illustration: "It's a good thing to exerc...
24 20018 Transcriber's note: Phrases enclosed in "_" a...
25 20180 [Illustration: A SILENT GROUP ABOUT...
26 20210 [Illustration: Queen Elizabeth going to Whiteh...
27 20251 [Transcriber's Note: Rows of closely space...
28 20453 THE CHRISTMAS CHILD BY HESBA STRETTO...
29 20516 CHRISTMAS -----------------------------------...
30 22665 CHRISTIAN GELLERT'S LAST CHRISTMAS By Berthol...
31 22696 COL. CROCKETT'S CO-OPERATIVE CHRISTMAS RUPERT...
32 23569 THE MERRYVALE BOYS By ALICE HALE BURNETT ...
33 32455 CHRISTMAS EVE AND CHRISTMAS DAY. [Illustra...
34 37547 [Illustration: Cover] [Illustration: The ...
35 38983 The Camp Fire Girls ...
36 42919 Angel Unawares Angel Unawares A Story of C...
37 42923 THE DOCTOR'S CHRISTMAS ...
38 44796 THE PRODIGAL VILLAGE A Christmas Tale _By_ ...
39 52935 [Illustration] ...
# count how many times "santa" appears in each row of col text
grp_novel_text['santa_count'] = grp_novel_text['text'].str.lower().str.count('santa')
grp_novel_text['christmas_count'] = grp_novel_text['text'].str.lower().str.count('christmas')
grp_novel_text['word_count'] = grp_novel_text['text'].str.split().apply(len)
# sort by santa_count descending
grp_novel_text.sort_values(by=['christmas_count','santa_count'], ascending=False, inplace=True)
grp_novel_text
gutenberg_id text santa_count christmas_count word_count
29 20516 CHRISTMAS -----------------------------------... 6 239 35509
33 32455 CHRISTMAS EVE AND CHRISTMAS DAY. [Illustra... 2 224 63811
18 17510 [Illustration: "The Doctor's old-fashioned hou... 0 130 10639
12 15709 By Abbie Farwell Brown * * ... 4 109 15800
19 17743 ROSEMARY: A CHRISTMAS STORY ROSEMARY: A CHRIST... 6 104 38744
22 19337 A CHRISTMAS CAROL By CHARLES DICKENS ILLUSTR... 0 96 29289
37 42923 THE DOCTOR'S CHRISTMAS ... 9 89 64174
36 42919 Angel Unawares Angel Unawares A Story of C... 6 88 22330
0 46 A CHRISTMAS CAROL IN PROSE BEING A Ghost Stor... 0 86 28541
7 12881 MRS. BUDLONG'S CHRISTMAS PRESENTS BY RUPERT ... 4 75 13234
8 14534 CHRISTMAS WITH GRANDMA ELSIE by MARTHA FINLE... 7 66 67822
13 15826 UNCLE NOAH'S CHRISTMAS INSPIRATION by LEONA ... 0 60 10521
38 44796 THE PRODIGAL VILLAGE A Christmas Tale _By_ ... 2 50 26836
15 16454 [Illustration: "That figure was not his own." ... 0 46 43283
27 20251 [Transcriber's Note: Rows of closely space... 0 42 23188
17 17456 _The_ ... 11 41 15961
31 22696 COL. CROCKETT'S CO-OPERATIVE CHRISTMAS RUPERT... 0 41 5671
23 19384 [Illustration: "It's a good thing to exerc... 0 38 10667
2 2731 THE CHRISTMAS BOOKS of MR. M. A. TITMARSH b... 0 31 79958
32 23569 THE MERRYVALE BOYS By ALICE HALE BURNETT ... 2 29 6356
28 20453 THE CHRISTMAS CHILD BY HESBA STRETTO... 0 28 9764
34 37547 [Illustration: Cover] [Illustration: The ... 6 27 37770
16 17006 THE TWO CHRISTMAS CELEBRATIONS, A.D. I. and M... 0 24 8362
9 14606 AND THUS HE CAME A Christmas Fantasy by CYR... 2 21 8889
24 20018 Transcriber's note: Phrases enclosed in "_" a... 2 18 86595
11 15552 [Illustration: Christmas Outside of Eden--Book... 0 16 10386
25 20180 [Illustration: A SILENT GROUP ABOUT... 0 16 5726
1 1902 The Old Peabody Pew: A Christmas Romance of a ... 0 15 13372
35 38983 The Camp Fire Girls ... 0 15 53211
5 10707 "_I cannot tell how the truth may be: I say th... 0 13 5059
6 10813 A VERSAILLES CHRISTMAS-TIDE By Mary Stuart B... 0 13 19753
26 20210 [Illustration: Queen Elizabeth going to Whiteh... 0 13 4184
39 52935 [Illustration] ... 0 12 8891
10 14835 [Illustration: The Burglar] The Burglar an... 1 11 20692
20 17937 [Illustration: "_Mrs. Gratz watched the t... 26 10 4865
4 8694 THE ABBOT'S GHOST OR, MAURICE TREHERNE'S TEMP... 0 7 25978
14 16134 THE FIRST CHRISTMAS TREE A Story of the Fores... 0 6 7466
3 4384 THE LOST WORD A Christmas Legend of Long Ago... 0 5 9294
30 22665 CHRISTIAN GELLERT'S LAST CHRISTMAS By Berthol... 0 3 10272
21 18770 [Transcriber's note: Irregularities in punctua... 0 2 8349
# merge grp_novel_text with christmas_novels to get title
merged_novels = pd.merge(grp_novel_text, christmas_novels[['gutenberg_id', 'title']], on='gutenberg_id', how='left')
merged_novels[['gutenberg_id', 'title', 'santa_count', 'christmas_count', 'word_count']].sort_values(by=['christmas_count','santa_count'], ascending=False)
merged_novels['title_words'] = merged_novels.apply(lambda x: f"{x['title']} ({x['word_count']:,})", axis=1)
fig, ax = plt.subplots(1, 2, figsize=(10, 10), gridspec_kw={'wspace':0, 'hspace':0})
sns.scatterplot(data=merged_novels, x='santa_count', y='title', ax=ax[0], s=100, alpha=0.5, marker='s', color='crimson')
sns.scatterplot(data=merged_novels, x='christmas_count', y='title_words', ax=ax[1], s=100, alpha=0.5, marker='s', color='forestgreen')
ax[0].invert_xaxis()
ax[0].spines[['left', 'top', 'right','bottom']].set_visible(False)
ax[1].spines[['left', 'top', 'right', 'bottom']].set_visible(False)
ax[0].set_yticks([])
ax[1].tick_params(axis='y', length=0)
for label in ax[1].get_yticklabels():
    label.set_horizontalalignment('center')
ax[0].set_ylabel('')
ax[1].set_ylabel('')
ax[0].set_xlabel('')
ax[1].set_xlabel('')
ax[0].tick_params(axis='x', length=0)
ax[1].tick_params(axis='x', length=0)
for a in ax:
    a.grid(axis='x', color='gray', linestyle='--', linewidth=0.5, alpha=0.5)
    a.set_axisbelow(True) # Ensures dots stay on top of the gridlines

#fig.suptitle('Christmas vs Santa Mentions in Novels on Christmas', fontsize=16, y=1, fontfamily='serif')

ax[0].annotate('Santa', xy=(1, 1), xytext=(5, -1.8), fontsize=16, fontfamily='serif', color='crimson')
ax[0].annotate('vs', xy=(1, 1), xytext=(0.1, -1.8), fontsize=16, fontfamily='serif', color='black')
ax[1].annotate('Christmas', xy=(1, 1), xytext=(0, -1.8), fontsize=16, fontfamily='serif', color='forestgreen')
fig.supxlabel('Mentions', y=-0.01)
plt.subplots_adjust(bottom=0.15)

fig.savefig('Christmas_novels.png', dpi=300, bbox_inches='tight')
plt.tight_layout()
plt.show()