«I used to be drawn to adventure, too, but then my knee was shot.» 🏹🦵
— Guard of Vaitran
📝 Project Description
For the final project in the «Programming for Creative Industries» course, I selected the People of Skyrim dataset from Kaggle. The dataset contains over 1000 rows and about 40 columns, detailing various characteristics of NPCs (non-playable characters) from the video game The Elder Scrolls V: Skyrim. I believe studying this dataset will provide a clear way to track how the developers reflected the game world’s unique features through its inhabitants. I wanted to observe specific characteristics of the Skyrim world by analyzing the characters' affiliations to particular locations, races, classes, and factions.
The project cover was created using Ideogram [1] with manual refinements in Photoshop.
- «A realistic old paper styled cover for an Elder Scrolls Skyrim data research project about game NPCs. There are various icons of Skyrim NPCs, including a bard, a bard, a mage, a warrior, and a thief. There is also the Skyrim logo in the center. The background is a parchment text»
🎯 What We Analyze and How?
I divided the project into three parts: the game world’s demographics, NPC classes, and NPC factions. In these sections, we will use the following types of infographics to display the data:
1) Pie chart 2) Stacked bar chart 3) Standard bar chart 4) Word cloud 5) Heat map
To analyze the dataset, I used the Python language and its libraries:
pandas (reading the .csv dataset) matplotlib.pyplot (generating certain charts) seaborn (predefined color schemes) matplotlib.font_manager (font import) wordcloud (word cloud) random (assigning random colors from the palette for the word cloud)
🎨 Graphic Design Solution
Searching for a graphic solution for the project: in-game books from Skyrim
I found a graphic solution for designing the charts in the project, inspired by the in-game book styling from Skyrim. It was important for me to capture a fantasy atmosphere in the graphics, which led me to use the handwritten font «Magic Cards,» which strongly associates with the Elder Scrolls universe (used in earlier installments of the series) combined with grunge paper textures and a warm color filter applied over the image in Photoshop.
✨ Introduction
🎮 What is Skyrim? Game Context
Skyrim is the northernmost, harshest, and coldest province on the continent of Tamriel. It is the homeland of the Nord race, who are naturally well-adapted to surviving there. Skyrim borders other provinces that players explored in previous games of the series—all of which are home to different races. To the west are High Rock and Hammerfell (races: Bretons and Redguards), to the south is Cyrodiil (race: Imperials), and to the east is Morrowind (race: Dark Elves, also known as Dunmer in the lore). The game world features all the traditional races of the universe, numerous different cities, characters, professions, and so on. Taken together, all the elements of Skyrim that made previous installments of the series so renowned establish both this game and its predecessors as some of the most detailed computer RPGs in the video game industry. For more details on the game and its universe, you can read, for example, on the Fan Wiki or the Classic Wiki.
👤 Skyrim Demographics
Bar Chart
This chart illustrates the racial makeup of the most populous cities in the Skyrim province, detailing the ratio of races and the population within each city.
Diagram & diagram code
During the construction of the first diagram, several awkward issues arose that required code refinement. The dataset is based on data from the Unofficial Elder Scrolls Pages, which, in turn, are built upon technical data from the game’s code. In the game’s code, the boundary between a character and a creature can be blurred due to technical engine characteristics. Because of this, the dataset among thousands of characters contains not only direct NPCs but also animals, undead, and other creatures assigned «technical» races. It is what it is! The game code thinks differently than the player does :)
For example, I definitively found creatures (animals) in the dataset classified as NPCs with the technical race «Animal,» and some older characters in the game, regardless of their actual race, are classified under the technical race «Elder.» There were quite a few such instances, and they were distorting the data on the diagram. To eliminate such errors, I strictly defined a list of valid races: this included the 10 in-game races available for character selection. These same races are considered the core races of the Elder Scrolls universe. This filtering was applied to all subsequent diagrams.
2. Defining 10 valid player races, excluding those with fewer than 14 NPC inhabitants. 1. Excluding cities with a population of fewer than 14 NPCs.
The same applied to cities, among other things. If I let the code run wild, it would map every single location classified as a settlement in the game. But there are just an overwhelming number of them, especially when compared to the truly important, large cities! Moreover, most of them house fewer than 6–14 characters. This tendency turned the diagram into an unreadable mess of tiny, barely discernible bars, so I decided to write a filter that would only include cities with a population over 14 characters in our diagram.
🤔 Interesting insights from the diagram
Skyrim is the homeland of the Nord people, and this is logically reflected in the demographic makeup of the province’s cities. As the indigenous people of these lands, the Nord constitute the majority of the population in virtually every settlement, and now we can see this clearly. But that’s not all! The smaller representation of other races in Skyrim contributes significantly to the world’s realism. This reinforces the lore that Skyrim is a terribly cold and inhospitable province. It is incredibly difficult for other races to adapt to life here, unlike the Nord, who are naturally predisposed to surviving in such conditions from birth. If the universe’s lore portrayed Skyrim as a more pleasant place, players would likely perceive a greater racial diversity within it.
Example: Population distribution of dark elves (dwarves) and bretons. There are the most dark elves in the cities of Dawnstar, Winterhold, Windhelm, and Riften (east). There are the most bretons in the cities of Markarth and Solitude (west).
Another notable detail is this: if we look at the map of the eastern region of Skyrim that borders Morrowind, we can clearly trace that the proportion of Dunmer (dark elf, Russian: тёмный эльф, Dunmer—an alternative in-game racial name) in the local cities is significantly higher than in other parts of the province. This is not coincidental, but a consequence of historical events. About two hundred years ago, a large-scale catastrophe occurred in the Dunmer homelands (Morrowind)—a volcanic eruption that destroyed a significant part of the province and rendered many of its territories uninhabitable. Forced to leave their native lands, the Dunmer scattered across the borders of neighboring provinces, including the border of Skyrim.
Although players are usually familiar with the Dunmer refugee camp in Windhelm, which established an entire ethnic quarter, this camp is only a small piece of a much broader picture. Their presence is also noticeable in Riften, another city located near the Morrowind border, and in Winterhold. Thus, by exploring our diagram, we can track the influence of past events on the world and population of Skyrim—events the game developers took into account when populating the world with characters.
⚔️ Common Classes
Word Cloud & Stacked Bar Chart
To display the prevalence of classes in the game world, I decided to create a word cloud using the WordCloud library and Random (to assign random colors from a specified palette). I also created a stacked bar chart that illustrates the percentage distribution of different class representatives across 10 in-game races.
Class Cloud (larger class = more popular) & cloud code
Stacked Bar Chart & Stacked Bar Chart Code
The classes in the dataset met the same fate as the races. There are numerous «technical» classes, some of which have only one or two characters. Many of these cannot be categorized. For instance, there are separate classes for guards, classes for single important characters, and so on. The following solution was found:
I asked ChatGPT (model o3-mini) [1] to read the character class column in my dataset, identify the most common classes (by the number of representatives), and divide them into three major groups: martial, magical, and rogue. I implemented this filtering in the code. Any classes falling outside the defined range are not included in the diagram.
- «Read the column containing character classes from my dataset. Identify the most common classes and categorize them into three groups: magical, combat, and rogue classes.»
Class Categorization in Code
🤔 Interesting insights from the diagram
According to the data, the warrior class is the most common in Skyrim. This makes sense: the province is harsh, survival demands strength, and the Nord people, who make up the majority, have historically favored axes and swords over magic. The developers accounted for this in the game world—the overwhelming majority of NPCs belong to combat classes, whether they are guards, legionaries, companions, or just mercenaries.
Contrary to the common stereotype of Khajiit being rogues, it is Dunmer who most often turn out to be members of the rogue classes. This is interesting because, within the world of the «Elder Scrolls, ” stereotypical thinking is widespread among not only players but also among the characters. Nord, as expected, rarely appears among mages, whereas Altmer (high elf—an alternative name for the race) almost entirely lack warriors—their race is considered the most magically gifted in the lore. Meanwhile, Bosmer, who are often portrayed exclusively as skilled archers, do not always choose this path in reality.












