Alexa, what’s in a name?
Have you ever had a private conversation near your Amazon Echo and it suddenly lit up like an unwanted eavesdropping little creep? This happened to me and I wondered how much worse it is for women named Alexa. I understand that you can change an Echo’s wake word—you can force it to answer to “Amazon” or “Computer”—but most people don’t do that.
Is it enough of a problem that parents have stopped naming their kids Alexa? Conveniently, the Social Security Administration publishes an annual baby name dataset that goes back to 1880. We can check and see exactly how the trend has changed since the Echo was introduced a decade ago.

1. Prepare the data.
Begin by visiting ssa.gov and clicking the “National data” link. Download the archive and unzip it within the same folder as your Python script. The names folder will contain a comma-delimited text file for every year dating back to 1880. For example, the most recent file is named yob2023.txt. If you open the file, you’ll find the first few lines look like this:
Olivia,F,15270 Emma,F,13527 Charlotte,F,12596 Amelia,F,12311 Sophia,F,11944
There’s no header row but we can see there are three columns: name, sex, and count. In 2023, there were 15,270 female babies named Olivia.
To create our time series we’ll want to concatenate all the files into a single DataFrame, then filter it down to Alexa rows. Using a for
loop, read each file into a DataFrame and append
it to a list. Then use the concat
method to stack all the individual DataFrames into a single large one. Note that we have to manually define column labels because they aren’t present in the data.
import pandas as pd df_list = [] for year in range(1880, 2024): df = pd.read_csv(f"names/yob{year}.txt", names=["name", "sex", "count"]) df.loc[:, 'year'] = year df_list.append(df) df = pd.concat(df_list)
Create a view of the DataFrame that’s limited to Alexa rows. Let’s begin with 1975 to make the plot more readable.
df = df[df['name'] == "Alexa"] df = df[df['sex'] == "F"] df = df[df['year'] >= 1975]
Now we have a 49-row DataFrame with everything we need to create a plot. df.head()
looks like this:
name sex count year 701 Alexa F 211 1975 722 Alexa F 202 1976 791 Alexa F 189 1977 845 Alexa F 175 1978 874 Alexa F 176 1979
2. Plot the data.
I’ll use a custom mplstyle inspired by the Amazon color scheme below. It will be linked at the bottom of this post.
Set the style and create an Axes instance on which we can plot.
plt.style.use("wollen_amazon.mplstyle") fig, ax = plt.subplots()
We’re working with a time series so a continuous line plot makes sense. But with annual data points I think it’s a good idea to add markers at each point. It isn’t strictly necessary but it helps to communicate how the data is reported.
It would also be okay to represent the data as a bar plot, especially with data reported annually. But when highlighting a trend I prefer to plot a line.
ax.plot(df['year'], df['count'], marker="o", markersize=5)
We can combine ticks and window limits into a single set
method.
ax.set(xticks=range(1975, 2030, 5), xlim=(1974, 2026), yticks=range(0, 8000, 1000), ylim=(-100, 7100) )
Since we’re analyzing how the Echo affected baby name trends, let’s highlight its launch with an annotation. I like wedges but Matplotlib has several other built-in arrow style options.
ax.annotate("Amazon Echo\nLaunched", xy=(2014, 4100), xytext=(2014, 3200), size=10, ha="center", va="center", arrowprops={"arrowstyle": "wedge", "color": '#DDD'} )
Use text
to cite the Social Security Administration. Let’s place this in the upper-left corner. A left horizontal alignment (ha
) and top vertical alignment (va
) help snug up the text to grid lines.
ax.text(1975.2, 6950, "Data: U.S. Social Security Administration", size=10, ha="left", va="top" )
Finally, set a title and save the figure.
ax.set_title('Number of Babies Named "Alexa" | 1975–2023') plt.savefig("alexa_1975-2023.png", dpi=150)
3. The output.
The downward curve almost looks like an Amazon logo!
The Echo was rolled out in late 2014 and 2015 so it’s fair to say the name Alexa was already past its peak. It’s normal for names to rise and fall, although this fall appears steeper than it may have been otherwise. Alexa’s trend looks less like Allison’s 35-year decline from similar levels of popularity and more like the O.J. baby name crash of 1994.
If nothing else, it’s safe to attribute the short-lived 40% spike in 2015 to the Echo launch. Society was much more optimistic about AI-powered assistants a decade ago and “Alexa” captured that positive spirit. Of course, the practical problem of sharing the name quickly made itself apparent and the resurgence fell off a cliff. We’re now down to a few hundred Alexa babies per year.
Download the Matplotlib style.
Full code:
import pandas as pd import matplotlib.pyplot as plt df_list = [] for year in range(1880, 2024): df = pd.read_csv(f"names/yob{year}.txt", names=["name", "sex", "count"]) df.loc[:, 'year'] = year df_list.append(df) df = pd.concat(df_list) df = df[df['name'] == "Alexa"] df = df[df['sex'] == "F"] df = df[df['year'] >= 1975] print(df.head()) plt.style.use("wollen_amazon.mplstyle") fig, ax = plt.subplots() ax.plot(df['year'], df['count'], marker="o", markersize=5) ax.set(xticks=range(1975, 2030, 5), xlim=(1974, 2026), yticks=range(0, 8000, 1000), ylim=(-100, 7100) ) ax.annotate("Amazon Echo\nLaunched", xy=(2014, 4100), xytext=(2014, 3200), size=10, ha="center", va="center", arrowprops={"arrowstyle": "wedge", "color": '#DDD'} ) ax.text(1975.2, 6950, "Data: U.S. Social Security Administration", size=10, ha="left", va="top" ) ax.set_title('Number of Babies Named "Alexa" | 1975–2023') plt.savefig("alexa_1975-2023.png", dpi=150)