Pendant mon séjour récent en Nouvelle Angleterre, j’ai survolé le livre de Leonard Mlodinow, the drunkard’s walk. Et au hasard de mes lectures, je suis tombé sur la petite histoire suivante
Autrement dit, en utilisant les cinq derniers chiffres d’une quantité économique comme le us treasury balance, on aurait un générateur de nombre aléatoire…
Par contre la suite est un peu plus surprenante,
La loi de Benford (que j’avais pu évoquer ici ou là) parle des premiers chiffres, mais cette fois on parle deslast five digits. Donc visiblement l’évoquation n’est pas pertinente ici. Mais qui sait ? Ca reste malgré tout une histoire intéressante. Considérons – histoire de tester cette légende – les deux sources de données suivantes,http://treasurydirect.gov/ et http://economagic.com/. Sur ce dernier site, un petit travail de mise en forme des données est nécessaire.
b1=read.table("http://freakonometrics.free.fr/debtus1.txt", header=TRUE,sep="\t") b2=read.table("http://freakonometrics.free.fr/debtus2.txt", header=TRUE) X1=as.character(b1$Dollar.Amount) n1=nchar(X1) Y1=substr(X1,n1-8,n1-3) X1=as.numeric(substr(Y1,1,2))*1000+as.numeric(substr(Y1,4,6)) x=X1/100000 X2=b2$DEBT Y2=trunc(as.numeric(X2)) X2=as.character(Y2) n2=nchar(X2) Y2=substr(X2,n2-4,n2) y=as.numeric(Y2)/100000 y=y[y<1]
Pour rappel, un générateur aléatoire (standard) vérifie deux propriétés importantes
- les nombres doivent être tirés suivant une loi uniforme sur [0,1], i.e. ici, si on divise les nombres à 5 chiffres par 10000,
- les tirages doivent être indépendants entre eux.
La première propriété semble assez naturelle, et correspond à l’histoire racontée dans un commentaire posté ici (expliquant comment un casino avait été au bord de la faillite car une roulette faisait sortir certains chiffres trop souvent, et j’essayais de comprendre comment utiliser l’information qu’un chiffre sort plus souvent). La seconde est probablement encore plus importante.
- Visualisation de la distribution
La première idée est de visualiser la densité de nos séries de chiffres. Pour éviter les problèmes de bord (et comme c’est juste en introduction) on va utiliser un histogramme, et pas une estimation à noyau.
On obtient pour la première série la courbe rouge, et pour la seconde la courbebleue,
On note qu’a priori, pour la première série, l’hypothèse d’uniformité n’est peut être pas la plus réaliste…
- Test de Kolmogorov-Smirnov
On peut aussi mettre en œuvre un test de Kolmogorov-Smirnov afin de tester si la loi uniforme est adaptée.:
> ks.test(x,"punif") One-sample Kolmogorov-Smirnov test data: x D = 0.1047, p-value = 0.01645 alternative hypothesis: two-sided > ks.test(y,"punif") One-sample Kolmogorov-Smirnov test data: y D = 0.0456, p-value = 0.3581 alternative hypothesis: two-sided
On retrouve ici confirmée l’intuition précédante: la loi uniforme est pertinente pour la seconde série, pas la première.
- Les autocorrélations de la série
Travaillons uniquement sur la seconde série. On peut étudier l’autocorrélation de notre série de nombres, ou peut-être un peu plus malin, sur les quantiles gaussiens associés (les autocorrélations étant intéressantes pour les séries gaussiennes),:
ie. pour la série brute
et pour la série normalisée,
- Run test (de Wald–Wolfowitz)
L’idée est de comparer une série de chiffres à la médiane, s’ils sont plus grands, on note + (ou A) et sinon – (ou B). On crée alors une série du genre “+++−−++−−++++++−−−” et on compte les séries de + et les séries de -, les runs,
library(lawstat) runs.test(y,plot=TRUE) Runs Test - Two sided data: y Standardized Runs Statistic = -0.2462, p-value = 0.8055
Bref, la légende me semble à prendre avec des pincettes (car fonction de la source considérée), même si l’idée est intéressante (si l’on met de côté les aspects d’aléa moral). Et l’analyse sur la loi de Benford ne semble pas valide: les derniers chiffres sur les grands nombres ne se comportent pas du tout comme les premiers.
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (July 13, 2011). De la créativité des gangsters. Freakonometrics. Retrieved November 2, 2024 from https://doi.org/10.58079/ouid
Nice test. Also, just heard about this recent article on Benford’s law: http://projecteuclid.org/DPubS?serv… (via Cosma Shalizi)
Thanks Antonio for the comment.
OK, first, X1 ans X2 are from different databases… for some reasons, on the internet, you can find several databases for the same quantities. So yes, X1 is 56789.
Second, you are right, I should have compared with Benford to get that conclusion. What I was trying to say it that there are no reason at all to have Benford distribution, which is for first digists, not those in the middle, or at the end…. And if we want random numbers, the natural distribution you expect to find is the uniform distribution…
But it is not difficult to run a KS test for Benford in R: one just has to write a function for the cumulative distribution function, and then run a kstest function…
I’ll work on that when I’ll get back from holidays
Forgive me but I have no R knowledge so I am not sure to have well understood your piece of code.
For example, consider the following (financial) value:
123,456,789.01
Does X1 take 45789? If it is so, could you comment such task next time?
Does X2 take 56789, that is the last five integer digits? If it is so, could you add a one-line comment in the code next time?
Moreover, I have not understood the ground of your conclusion.
You make a test for the uniform distribution.
You make a test for the autocorrelation.
You make a test about the mediane.
How can you conclude about the Benford law?
Why didn’t you make the K-S test to compare the oberved distribution with the Benford expected one?
Thanks.