1. DATA

language <- read.csv("data/stex.csv", fileEncoding = "latin1")

1. Name and source

“Big data suggest strong constraints of linguistic similarity on adult language learning” The data set is called stex.csv. It was posted by Job Schepens, Roeland van Hout, and T. Florian Jaeger. I downloaded it on October 11, 2026.

2. Collector and purpose

The data was collected by the Dutch exam board (CvTE) and compiled by Schepens, van Hout, and Jaeger. It comes from raw data with fully anonymized results on the State Examination of Dutch as a Second Language. The data was collected to examine the linguistic similarities between the learner’s native language and the new language.

3. Collection

Every row in the dataset represents the first official testing score of a unique learner. The columns contain the information as based on questionnaires filled in at the time of the exam. From 1992 to 2006, learner’s education was measured by means of a side-by-side matrix question in the learner’s questionnaire, so years of education was estimated. From 2006 onward, the question about learners’ education was directly asked.

4. Licence and permissions

The data is shared on Zenodo under a Creative Commons Attribution 4.0 International (CC BY 4.0) licence. This means anyone may copy, share, and adapt the data for any purpose, including commercially, as long as they give appropriate credit to the original authors (Schepens, van Hout, and Jaeger), link to the licence, and indicate if changes were made. This report credits the authors in the citation (section 9) and does not change any values in the data.

5. Structure

There are 50235 rows and 16 columns. The names of the columns are as follows: L1, C, L1L2, L2, AaA, LoR, Edu.day, Sex, Family, ISO639.3, Enroll, Speaking, morph, lex, new_feat, new_sounds.

Column Meaning Stored as Units Range or levels
L1 Learner’s first (native) language chr 70 languages; documentation treats it as categorical
C Learner’s country of birth chr 119 countries
L1L2 First language and best additional language (besides Dutch) combined chr 737 combinations
L2 Best additional language besides Dutch chr 44 levels; “Monolingual” if none
AaA Age at arrival in the Netherlands int years 0 to 88, median 26
LoR Length of residence in the Netherlands int years 0 to 59, median 3
Edu.day Amount of daily education int ordinal code 1 (low) to 4 (very high); stored as a number but really an ordered category; 9 NA
Sex Learner’s gender chr Female, Male
Family Language family of the first language chr 14 families
ISO639.3 Ethnologue code for the first language chr 70 codes
Enroll Secondary-school gross enrollment rate in birth country, year of arrival int percent 8 to 148
Speaking STEX speaking proficiency score int STEX scale points 270 to 685, median 516
morph Morphological distance between first language and Dutch num unitless distance -0.017 to 0.327; 1,809 NA
lex Lexical distance between first language and Dutch num unitless distance 0.010 to 0.595, median 0.399
new_feat Phonological distance: number of new sound features int count of features 6 to 32; 2,016 NA
new_sounds Phonological distance: number of new sound categories int count of sounds 13 to 27; 2,016 NA

6. Missing values

There are 9 missing values in ‘Edu.day’, 1809 in ‘morph’, 2016 in ‘new_feat’, and 2016 in ‘new_sounds’. Every other column is complete. In the CSV file, a missing value is written as NA. The missing values follow a pattern, since they pertain to whole languages rather than individual learners. For instance, Afrikaans or Pashto have no ‘morph’ value, and Chinese or Danish has no ‘new_feat’ or ‘new_sounds’ value. The missing education values are scattered across different languages and countries with no pattern, suggesting unanswered questionnaire items.

7. Known issues

According to the source documentation, ‘Edu.day’ was estimated from a matrix questionnaire before 2006 and then directly asked afterwards, and the file has no year column to tell this apart. Also, everyone in the file chose to take the state exam, so the results describe exam takers, not all immigrants to the Netherlands. 9 of the languages have fewer than 30 learners, so the average score data is much less reliable than the larger groups. Lastly, there are 883 rows that are completely identical. Since there are no learner IDs, it is difficult to tell if this is a repeat or not.

8. Changes you made

# read.csv("data/stex.csv", fileEncoding = "latin1")

The file is saved in Latin-1, not UTF-8, so the language name Éwé may display incorrectly unless the file is read with fileEncoding = “latin1”. No values were changed.

9. Citation

The source says to cite all versions by using the DOI. –> Job Schepens, Roeland van Hout, & T. Florian Jaeger. (2019). Dataset for: “Big data suggest strong constraints of linguistic similarity on adult language learning” [Dataset]. Zenodo. https://doi.org/10.5281/zenodo.2863533

2. RESEARCH QUESTION

Background

Adults moving to a new country differ in how well they acquire and learn the language. If there are patterns between the learner’s native language and how well they learn the new one, it may inform teachers and policymakers who needs support. It would allow for more equitable learning programs or lengths if it is expected for certain groups to be at different levels.

The question

How is the mean STEX speaking score (points) of learners who share a first language related to the lexical distance between that language and Dutch (0 = identical, 0.6 = unrelated), and does that relationship look the same for learners who arrived in the Netherlands at different ages (years)?

3. VARIABLES OF INTEREST

4. DATA WRANGLING

# One row per first language: mean speaking score, number of learners, 
# and lexical distance (the same value for every speaker of a language)
language_means <- language |>
  group_by(L1) |>
  summarise(mean_speaking = mean(Speaking), n_learners = n(), lex = first(lex), .groups = "drop")

# Age of arrival in five categories for Figure 3
language <- language |>
  mutate(age_group = cut(AaA,
                         breaks = c(-Inf, 17, 24, 29, 34, Inf), 
                         # creating the categories, lower and upper bands of infinity
                         labels = c("0-17 years", "18-24 years", "25-29 years",
                                    "30-34 years", "35 years or older"))) 
                         # captions for each age group

# One row per first language within each age group
age_language_means <- language |>
  group_by(age_group, L1) |>
  summarise(mean_speaking = mean(Speaking), n_learners = n(), lex = first(lex), .groups = "drop") |>
  filter(n_learners >= 20) # groups with fewer than 20 learners filtered out 
# because their means are unreliable, as discussed in part 1, #7.

The columns I used had no missing values, so nothing was removed from the data. However, I averaged the groups by language and grouped age into different ranges for the figures.

5. FIGURES AND THEIR INTERPRETATIONS

Figure 1:

ggplot(language_means, aes(x = mean_speaking, 
                           y = reorder(L1, mean_speaking))) +
  geom_point(aes(size = n_learners), alpha = 0.85, color = "darkred") +
  geom_vline(xintercept = mean(language$Speaking), linetype = "dashed") +
  scale_size_area(max_size = 5, breaks = c(50, 500, 5000)) +
  labs(title = "Mean speaking scores differ by over 70 points across first languages",
       x = "Mean STEX speaking score (points)", 
       y = "First language", 
       size = "Number of learners") +
  theme_minimal() +
  theme(axis.text.y = element_text(size = 6))
Mean STEX speaking score for each of the 70 first languages in the data, sorted from highest to lowest. Each point is one first language, whose size shows the number of learners, and the dashed line is the mean of all learners. Germanic languages have the highest means and several African and Asian languages the lowest.

Mean STEX speaking score for each of the 70 first languages in the data, sorted from highest to lowest. Each point is one first language, whose size shows the number of learners, and the dashed line is the mean of all learners. Germanic languages have the highest means and several African and Asian languages the lowest.

Figure 1 shows that learners’ mean speaking scores differ widely depending on their first language. Speakers of German have the highest mean, 555 points, and speakers of Somali the lowest, 482 points: a gap of 72 points. For the question, this establishes that there is a large difference between language groups to explain. The figure cannot show why the groups differ.

Figure 2:

ggplot(language_means, aes(x = lex, y = mean_speaking)) +
  geom_point(aes(size = n_learners), alpha = 0.5, color = "darkred") +
  geom_smooth(method = "lm", se = FALSE, color = "grey") +
  scale_size_continuous(breaks = c(50, 500, 5000)) +
  labs(title = "Languages further from Dutch have lower mean speaking scores",
       x = "Lexical distance from Dutch (0 = identical)",
       y = "Mean STEX speaking score (points)", 
       size = "Number of learners") +
  theme_minimal()
Mean STEX speaking score against the lexical distance between each first language and Dutch. Each point is one first language, sized by its number of learners, and the line is a straight-line fit. Languages whose vocabulary is further from Dutch have lower mean scores.

Mean STEX speaking score against the lexical distance between each first language and Dutch. Each point is one first language, sized by its number of learners, and the line is a straight-line fit. Languages whose vocabulary is further from Dutch have lower mean scores.

Figure 2 shows that much of the gap in Figure 1 lines up with how different a language’s vocabulary is from Dutch. The correlation between lexical distance and mean score across the 70 languages is -0.72, and the fitted line drops about 8.7 points for every 0.1 increase in distance. For the question, this means languages that are lexically further from Dutch have lower mean speaking scores. This figure cannot show whether the pattern is the same for learners of every age, which is what Figure 3 addresses.

Figure 3:

ggplot(age_language_means, aes(x = lex, y = mean_speaking)) +
  geom_point(aes(size = n_learners), alpha = 0.5, color = "darkred") +
  geom_smooth(method = "lm", se = FALSE, color = "grey") +
  facet_wrap(~ age_group, nrow = 1) +
  scale_size_area(max_size = 5, breaks = c(50, 500, 2000)) +
  scale_x_continuous(breaks = c(0, 0.3, 0.6)) +
  labs(x = "Lexical distance from Dutch (0 = identical)",
       y = "Mean speaking score (STEX points)", size = "Number of learners",
       title = "Pattern holds at every age, but is weaker for arrivals before age 18") +
  theme_minimal() +
  theme(legend.position = "bottom", panel.spacing = unit(1, "lines")) # space out the panels
Mean STEX speaking score against lexical distance from Dutch, in one panel per age-at-arrival group. Each point is one first language within that age group (only groups with at least 20 learners), sized by its number of learners, and each line is a straight-line fit. Scores fall with distance in every panel, most steeply for learners who arrived as adults.

Mean STEX speaking score against lexical distance from Dutch, in one panel per age-at-arrival group. Each point is one first language within that age group (only groups with at least 20 learners), sized by its number of learners, and each line is a straight-line fit. Scores fall with distance in every panel, most steeply for learners who arrived as adults.

young <- filter(age_language_means, age_group == "0-17 years")
adult <- filter(age_language_means, age_group != "0-17 years")

Figure 3 shows that the relationship between lexical distance and speaking score holds for each age group. However, it appears to be less pronounced for learners who arrived before the age of 18. Across the four adult panels, the correlation between lexical distance and average speaking score is -0.7, while in the 0-17 panel it is only -0.48. The range of mean scores across these age groups goes from 526 points for learners who arrived before 18 to 508 points for those who arrived at 35 or older. For the question, this means that the relationship between lexical distance and speaking score holds for every adult age group, while the relationship is weaker for those who arrived before the age of 18. The figure cannot establish that age is a causal factor.

6. DISCUSSION

Summary. Mean speaking scores differ by up to 72 points depending on the learner’s first language (Figure 1). Figure 2 demonstrates how much of that difference correlates with the lexical distance of the first language from Dutch. Across the 70 languages the correlation is -0.72, and scores drop about 8.7 points per 0.1 of distance. That relationship holds for every age-at-arrival group, but it is less pronounced for learners who arrived before age 18 (Figure 3).

Implications. Based on these results, language schools could set different standards for different groups of learners, and by setting these expectations, could make the learning environments more equitable. For learners whose first language is lexically distant from Dutch, who might need more preparation or assistance to reach the same speaking score, they could have different course lengths or support planned. However, individuals may differ, and since these results are not causal, this would be a guide for planning, not for specific judgments.

Limitations. A limitation specific to the data is that lexical distance has a single value per language, and 35 of the 70 languages share the maximum value, so the measure cannot tell apart most of the languages that are lexically unrelated to Dutch. A limitation specific to the design is that the learners chose to take the state exam, so these results describe the exam takers, not all immigrants.

Future directions. Moving forward, the next analysis could bring in the ‘morph’ column, which computes the measure of how differently words are built. Then, the data could be filtered to only the languages that share the maximum value of ‘lex’. Creating a plot of the mean speaking score against ‘morph’ for those languages, with one point per language sized by its number of learners as done in this analysis, will show if morphological distance could explain some of the differences in speaking scores that lexical distance could not.

7. GENERATIVE AI DISCLOSURE

I used Claude AI to help me with this report. Since the license on Kaggle and Zenodo were listed differently, I used Claude to help me determine what the specific permissions were for this data set and decided on CC BY 4.0 license. I used it on Field #6 to help determine the patterns of the missing values in the data. I used it on Field #7 to determine any caveats that I may have missed from the data, and it helped me determine that there were seemingly duplicate rows as well as some languages with very few learners. It helped me articulate my research question more concisely. I used it to help me write the inline code in the variables of interest section. I used it to help me space out the panels on Figure 3, as well as how to adjust the point sizes per number of learners on all figures. It also helped me on step 4 of data wrangling to make sure my data was grouped accurately, particularly with the tweak “.groups =”drop”“. I used it to help with inline r for writing correlation coefficients Figure 2, 3, and the summary paragraph. Lastly, I had Claude scan my final PDF to ensure I did not miss any aesthetic corrections, and it recommended I add a YAML header and setup chunk so that figures would stay where its chunk is rather than move to wherever they fit. Claude also helped me fix the error of needing to read the file with Latin1.