Combien de temps durent les guerres en moyenne ? Si une guerre comme celle actuellement en cours en Iran a duré jusqu’à présent 74 jours, combien de temps pouvons-nous espérer qu’elle durera au total ? Pour toutes sortes de raisons, les esprits curieux s’y intéressent. Heureusement, il existe des ensembles de données très bien organisés, notamment les corrélats de la guerre, qui permettent de répondre facilement à ces questions.
Une mise en garde s’applique à tout cela : je ne suis pas un historien militaire, juste un amateur intéressé. Je suis très ouvert à ce qu’on me signale des erreurs d’interprétation ou de méthode.
Répartition des durées des guerres
Les données Corrélats de Guerre nous permettent par exemple de voir qu’il s’agit de la répartition (sur une échelle logarithmique) des durées des guerres post-Napoléon :
Vous pouvez voir que j’ai comparé cela à une distribution log-normale et j’ai constaté qu’elle n’avait pas de queues aussi grosses que cela. Mais ce n’est pas grave, je ne m’inquiète pas trop de la forme précise, car plus tard j’utiliserai des méthodes empiriques assez simples.
Ces données ne concernent que les guerres interétatiques, qui diffèrent des guerres intra-étatiques (par exemple les guerres civiles) et extra-étatiques (par exemple avec des acteurs externes non étatiques). Comme je suis intéressé par une population de référence à laquelle comparer la guerre actuelle entre les États-Unis, Israël et l’Iran, c’est la population interétatique que je veux.
La durée médiane d’une guerre est de 139 jours et la moyenne de 408 jours.
La guerre de quatre jours figurant dans l’ensemble de données est ce qu’on appelle la « guerre du football » de 1969 entre le Honduras et le Salvador. La guerre de 3 734 jours était la « Phase II de la guerre du Vietnam », bien plus connue, impliquant les États-Unis, l’Australie, le Vietnam, le Cambodge et d’autres.
Voici le code pour importer les données du projet Correlates of War et tracer ce premier tracé de densité :
library(tidyverse)
library(lubridate)
library(janitor)
library(glue)
library(ggrepel)
library(scales)
#
#----- import interstate war data----------------------
interstate <- read_csv(" |>
clean_names() |>
mutate(start_date = as.Date(sprintf("%04d-%02d-%02d", start_year1, start_month1, start_day1)),
end_date = as.Date(sprintf("%04d-%02d-%02d", end_year1, end_month1, end_day1)))
interstate_wars <- interstate |>
group_by(war_num, war_name) |>
summarise(earliest_start= min(start_date),
latest_end = max(end_date),
bat_death = sum(bat_death)) |>
mutate(duration = as.numeric(latest_end - earliest_start),
start_year = year(earliest_start)) |>
ungroup()
# what years covered? 1823 to 2003 at time of writing
range(interstate_wars$start_year)
#==========================plots=================
simple_caption <- "Source: Correlates of War, Inter-State War Data; analysis by freerangestats.info"
#-----------------distribution of duration------------
summary(interstate_wars$duration)
sim_norm <- data.frame(duration = 10 ^ (rnorm(1e6,
mean = log10(interstate_wars$duration),
sd = sd(log10(interstate_wars$duration)))))
interstate_wars |>
ggplot(aes(x = duration)) +
geom_density() +
geom_rug() +
geom_density(data = sim_norm, colour = "orange") +
annotate("text", x= 1, y = 0.18, label = "Simulated log-normal distribution",
colour = "orange", hjust = 0) +
annotate("text", x= 300, y = 0.51, label = "Empirical distribution of war durations",
colour = "black", hjust = 0) +
# carefully chosen labels for x axis:
scale_x_log10(label = comma, breaks = c(range(interstate_wars$duration), 10, 100, 1000)) +
labs(x = "Duration of wars (in days, logarithmic scale)",
y = "Density",
title = "Distribution of war durations, 1823 to 2003",
subtitle = "More concentrated, less-fat tails than a log-normal distribution",
caption = simple_caption) +
# use coord to limit x axis so statistical calculations are all done on full data:
coord_cartesian(xlim = c(1, 8000))
OK, donc ma principale tâche analytique ici est de déterminer la durée conditionnelle attendue d’une guerre qui a atteint 74 jours – la durée jusqu’à présent de la guerre entre les États-Unis, Israël et l’Iran. Oui, je sais qu’il y a un cessez-le-feu incomplètement observé, mais il y a aussi un blocus (ou deux), et c’est sans ambiguïté un acte de guerre au regard du droit international. Je considère donc la guerre comme étant en cours.
Mon tableau pour répondre à cette question est celui-ci :
Ce qui se passe ici, c’est :
- la fonction de distribution cumulée empirique des durées est la ligne sombre – essentiellement la fréquence cumulée sur l’axe vertical, mais exprimée en proportion.
- la ligne grise est un simple lisseur LOESS de cette fréquence cumulée, utile pour modéliser des valeurs qui ne correspondent pas exactement aux données.
- les lignes rouges montrent la durée de la guerre actuelle et sa place dans la répartition des guerres de 1823 à 2003. Il s’agit d’environ 0,33 (défini dans le code ci-dessous comme la variable
current_cf), ce qui signifie que la guerre actuelle est déjà plus longue qu’environ 33 % des guerres. - la ligne bleue horizontale est à mi-chemin dans l’espace vertical entre la ligne rouge horizontale et 1. Là où elle rencontre la ligne lissée et laisse tomber une ligne bleue verticale, cela montre la durée médiane attendue d’une guerre qui a atteint ce point de 0,33 sur la fréquence cumulée.
Nous constatons donc que pour les guerres qui durent jusqu’à 74 jours, nous nous attendons à ce que la durée totale médiane soit de 261 jours. C’est un peu sombre pour ceux d’entre nous qui pensent que même une prolongation jusqu’en juin sera effectivement très mauvaise pour l’économie mondiale, mais c’est bon à savoir. Bien sûr, il y a beaucoup de guerres qui durent 74 jours et s’arrêtent peu de temps après, donc il y a aussi de l’espoir.
Voici le code pour effectuer cette inférence statistique et dessiner le graphique :
#-------------------cumulative distribution--------------
interstate_cumulative <- interstate_wars |>
arrange(duration) |>
mutate(cumulative_freq = 1:n() / n())
# smoothed model of the cumulative distribution, including estimates of where
# the Iran war is on it:
model <- loess(cumulative_freq ~ log(duration), data = interstate_cumulative)
current_dur <- 74 # as at 13 May 2025 - war started 28 February 2026
current_cf <- predict(model, newdata = data.frame(duration = current_dur))
# inverse model to estimate duration given a cumulative frequency, useful for
# annotations on the chart:
inv_model <- loess(duration ~ x,
data = data.frame(duration = interstate_cumulative$duration,
x = fitted(model)))
# of wars that last this long, what is the median cumulative frequency (i.e. half-way to 1):
conditional_median_freq <- (1 + current_cf) / 2
# of wars with that median cumulative frequency, convert it back into a duration,
conditional_median_dur <- predict(inv_model, data.frame(x = conditional_median_freq))
# Draw chart of cumulative distribution:
interstate_cumulative |>
ggplot(aes(x = duration, y = cumulative_freq)) +
geom_smooth(method = "loess", colour = "grey80") +
geom_line() +
# note that (seems a bit odd) need to manually do the scale transform to geom_segment here:
geom_segment(x = log10(current_dur), xend = log10(current_dur), y = -Inf, yend = current_cf, colour = "red") +
geom_segment(x = 0, xend = log10(current_dur), y = current_cf, yend = current_cf, colour = "red") +
geom_segment(x = log10(conditional_median_dur), xend = log10(conditional_median_dur), y = -Inf, yend = conditional_median_freq, colour = "blue") +
geom_segment(x = 0, xend = log10(conditional_median_dur), y = conditional_median_freq, yend = conditional_median_freq, colour = "blue") +
annotate("text", x = current_dur * 0.95, y = 0.39, label = "Current Iran war", colour = "red", hjust = 1) +
annotate("text", x = conditional_median_dur * 1.05, y = 0.62, colour = "blue", hjust = 0, vjust = 1,
label = glue("Median expectation conditional
on at least {current_dur} days")) +
scale_x_log10(label = comma, breaks = c(10, current_dur, 100, conditional_median_dur, 1000)) +
labs(x = "Total duration of war (in days, logarithmic scale)",
y = "Cumulative frequency of wars",
title = "Expectations of duration of Iran war, based on modern inter-state wars' duration",
subtitle = glue("Comparison to wars from 1823 to 2003. The median war that lasts {current_dur} days goes on to last {round(conditional_median_dur)} days."),
caption = simple_caption)
Nous pouvons utiliser la même approche pour calculer non seulement la durée médiane de la guerre (à condition d’atteindre 74 jours), mais également d’autres centiles. Par exemple, ci-dessous, nous pouvons construire un intervalle de prédiction de 80 % (entre les quantiles 0,1 et 0,9) d’une durée totale de 94,9 et 1 752 jours. En d’autres termes, à partir de ces 74 jours, seulement 10 % des guerres auront une durée totale de 94,9 jours ou moins (soit 21 jours supplémentaires).
Dans l’ensemble, c’est une large gamme bien sûr ; la principale chose que cela nous dit, c’est que les guerres durent plus longtemps que beaucoup de gens ne le souhaiteraient, et qu’il existe une grande variation dans la durée des guerres.
# some prediction intervals, conditional on getting to 74 days:
probs <- c(0.05, 0.1, 0.5, 0.8, 0.9, 0.95)
more_freqs <- probs * (1 - current_cf) + current_cf
conditional_dur <- predict(inv_model, data.frame(x = more_freqs))
tibble(probability = probs, duration = conditional_dur)
# so 80% of wars that reach 74 days will have a total duration between 95 and 1,752 days
probability duration
<dbl> <dbl>
1 0.05 82.3
2 0.1 94.9
3 0.5 261.
4 0.8 1141.
5 0.9 1752.
6 0.95 2119.
Durée et autres facteurs
J’avais donc répondu à ma question principale mais j’étais naturellement curieux de connaître d’autres relations aussi. De toute évidence, on s’attend à ce que des guerres plus longues entraînent davantage de morts au combat ; pouvons-nous voir cela dans les données ? Oui, nous pouvons :
J’aime ce graphique car il présente l’ampleur de près de deux siècles de guerre entre États dans une visualisation simple.
Nous voyons également que s’il existe une tendance dans la relation entre la durée, les décès et le moment où la guerre a commencé (l’année de début représentée en couleur dans le graphique ci-dessus), ce n’est pas évident. Nous y reviendrons dans le graphique suivant, mais d’abord, voici le code pour créer le nuage de points ci-dessus.
#------------------Compare duration and number of deaths----------------
interstate_wars |>
ggplot(aes(x = duration, y = bat_death, label = war_name)) +
geom_point(aes(colour = start_year), size = 3.5) +
geom_text_repel(colour = "grey50", size = 2, seed = 123) +
scale_y_log10(label = comma) +
scale_x_log10(label = comma) +
scale_colour_viridis_c() +
labs(title = "Inter-state wars, 1823-2003",
colour = "Starting year",
x = "Duration in days",
y = "Number of battle deaths",
caption = simple_caption) +
theme(legend.position = c(0.15, 0.8))
J’étais un peu inquiet à propos de cette histoire de « deux siècles ». Les guerres récentes sont-elles toutes beaucoup plus courtes, ou peut-être beaucoup plus longues, que les guerres plus anciennes ? Si tel est le cas, cela limiterait grandement mes conclusions sur la durée probable de la guerre. J’ai donc préparé une intrigue supplémentaire pour vérifier s’il y avait une relation évidente, plus rigoureusement qu’une simple couleur frappante sur l’intrigue précédente. J’ai été un peu surpris de constater qu’en réalité il n’y a pas de réelle augmentation ou réduction de la durée de la guerre au fil du temps :
J’aime aussi beaucoup ce graphique car il nous donne une comparaison instantanée de notre guerre actuelle entre les États-Unis, Israël et l’Iran avec certaines de celles de l’histoire. On voit qu’elle est déjà plus longue que la rébellion des Boxers, mais pas aussi longue que les îles Falkland ou la guerre du Kosovo (pour tous ces noms j’utilise ceux fournis par le projet Correlates of War – je suis bien conscient que ce sont des étiquettes contestées).
Voici mon dernier morceau de code dessinant ce dernier graphique :
#------------Compare duration with when in history it happened---------------
interstate_wars |>
arrange(bat_death) |>
ggplot(aes(x = earliest_start, y = duration)) +
geom_hline(yintercept = current_dur, colour = "red") +
geom_point(aes(size = bat_death), shape = 1) +
geom_text_repel(aes(label = war_name), colour = "steelblue", size = 3, seed = 123) +
annotate("text", x= as.Date("1820-01-01"), y = current_dur + 8, hjust = 0,
label = "Duration of 2026 US-Israel-Iran war so far", colour = "red") +
scale_y_log10(label = comma) +
scale_size_area(label = comma, max_size = 25) +
labs(title = "Inter-state wars, 1823-2003",
subtitle = glue("Compared to the USA-Israel-Iran war as at {Sys.Date()}"),
x = "Start of war",
y = "Duration of war (days)",
size = "Number of batlle deaths:",
caption = simple_caption)
C’est tout, les amis. Restez en sécurité là-bas.
En rapport
PakarPBN
A Private Blog Network (PBN) is a collection of websites that are controlled by a single individual or organization and used primarily to build backlinks to a “money site” in order to influence its ranking in search engines such as Google. The core idea behind a PBN is based on the importance of backlinks in Google’s ranking algorithm. Since Google views backlinks as signals of authority and trust, some website owners attempt to artificially create these signals through a controlled network of sites.
In a typical PBN setup, the owner acquires expired or aged domains that already have existing authority, backlinks, and history. These domains are rebuilt with new content and hosted separately, often using different IP addresses, hosting providers, themes, and ownership details to make them appear unrelated. Within the content published on these sites, links are strategically placed that point to the main website the owner wants to rank higher. By doing this, the owner attempts to pass link equity (also known as “link juice”) from the PBN sites to the target website.
The purpose of a PBN is to give the impression that the target website is naturally earning links from multiple independent sources. If done effectively, this can temporarily improve keyword rankings, increase organic visibility, and drive more traffic from search results.