Legea cifrelor prime
Teorema lui Benford, cunoscută și sub numele de Legea cifrelor prime, este o teoremă din teoria probabilităților care se aplică în special numărului de apariții ale cifrelor în numerele naturale sau în alte seturi de date numerice. Aceasta afirmă că în multe seturi de date, cifra "1" apare de cele mai multe ori în prima poziție, urmată de cifra "2", iar cifra "9" apare cel mai rar.
Mai precis, teorema lui Benford afirmă că distribuția cifrelor în numerele dintr-un set de date urmează o anumită distribuție care poate fi prevăzută. Această distribuție se bazează pe logaritmul zecimal al numerelor, astfel încât cifra "1" apare aproximativ în 30% din cazuri, cifra "2" în 17,6% din cazuri, iar cifra "9" apare în doar 4,6% din cazuri.
Această teoremă are o serie de aplicații practice, inclusiv în detectarea fraudei fiscale, în analiza financiară și în alte domenii în care datele numerice sunt importante.
Calcularea distribuției cifrelor
Există o funcție în Microsoft Excel care poate fi utilizată pentru a calcula distribuția cifrelor într-un set de date. Această funcție se numește "FREQUENCY" și poate fi utilizată în combinație cu alte funcții pentru a obține distribuția cifrelor.
Pentru a utiliza această funcție, urmați acești pași:
Selectați celula unde doriți să afișați distribuția cifrelor.
Scrieți formula "=FREQUENCY(RANGE, DIGITS)" în această celulă, unde "RANGE" este intervalul de date pe care doriți să-l analizați, iar "DIGITS" este numărul de cifre care vă interesează. De exemplu, dacă doriți să analizați distribuția cifrelor de la 1 la 1000, utilizați intervalul A1:A1000 ca argument RANGE și 1, 2, 3, 4, 5, 6, 7, 8 sau 9 ca argument DIGITS.
Apăsați Enter pentru a finaliza formula. Rezultatul va fi un vector de numere care reprezintă numărul de apariții ale fiecărei cifre în intervalul specificat.
Pentru a afișa distribuția cifrelor sub formă de grafic, selectați intervalul de celule care conțin vectorul de numere și apoi faceți clic pe fila "Insert" din meniul principal. Selectați tipul de grafic pe care doriți să îl utilizați și Excel va genera automat un grafic care arată distribuția cifrelor.
Este important să rețineți că această funcție poate fi utilizată numai pentru a calcula distribuția cifrelor într-un set de date și nu poate fi utilizată pentru a determina dacă un set de date urmează sau nu teorema lui Benford. Pentru a determina dacă un set de date urmează teorema lui Benford, este necesară o analiză suplimentară.
Deși funcția "FREQUENCY" din Microsoft Excel poate fi utilizată pentru a calcula distribuția cifrelor într-un set de date, ea nu poate fi utilizată în mod direct pentru a determina dacă setul de date urmează sau nu teorema lui Benford.
Acest lucru se datorează faptului că teorema lui Benford este o afirmație probabilistică care se bazează pe distribuția logaritmică a numerelor din setul de date, și nu pe distribuția simplă a cifrelor.
Pentru a determina dacă un set de date urmează sau nu teorema lui Benford, este necesar să se calculeze distribuția logaritmică a numerelor din setul de date și să se compare aceasta cu distribuția așteptată conform teoremei lui Benford. Acest lucru necesită de obicei mai multe pași, inclusiv calcularea logaritmului zecimal al fiecărui număr din setul de date și apoi calcularea distribuției cifrelor în aceste logaritme.
De asemenea, trebuie să se ia în considerare faptul că teorema lui Benford nu este aplicabilă în toate cazurile și că există situații în care distribuția cifrelor dintr-un set de date poate fi diferită de cea așteptată conform teoremei. Prin urmare, analiza suplimentară este necesară pentru a determina dacă teorema lui Benford este aplicabilă în cazul particular al setului de date analizat.
Calcularea distribuției logaritmice
Pentru a calcula distribuția logaritmică a numerelor dintr-un set de date folosind Microsoft Excel, urmați acești pași:
Selectați o celulă goală și introduceți formula "=LOG10(A1)", unde A1 este prima celulă din setul de date pe care doriți să îl analizați. Această formulă va calcula logaritmul zecimal al numărului din celula A1.
Copiați această formulă în jos pe întreaga coloană corespunzătoare setului de date.
Selectați o altă celulă și introduceți formula "=FREQUENCY(RANGE, INTERVALS)", unde "RANGE" este intervalul de celule care conțin logaritmii calculați anterior și "INTERVALS" este intervalul de valori în care doriți să împărțiți distribuția logaritmică. De exemplu, dacă doriți să împărțiți distribuția logaritmică în 9 intervale egale (corespunzătoare cifrelor 1-9), utilizați intervalul de celule care conține logaritmii calculați anterior ca argument RANGE și numărul 9 ca argument INTERVALS.
Apăsați Enter pentru a finaliza formula. Rezultatul va fi un vector de numere care reprezintă numărul de valori din setul de date care se încadrează în fiecare interval al distribuției logaritmice.
Pentru a afișa distribuția logaritmică sub formă de grafic, selectați intervalul de celule care conțin vectorul de numere și apoi faceți clic pe fila "Insert" din meniul principal. Selectați tipul de grafic pe care doriți să îl utilizați și Excel va genera automat un grafic care arată distribuția logaritmică.
Este important să rețineți că distribuția logaritmică a numerelor dintr-un set de date poate fi afectată de valori atipice sau de eroare de măsurare. De aceea, este important să analizați și să interpretați rezultatele obținute în contextul particular al setului de date.
Documentație :
- https://benfords-law.netlify.app
- https://en.wikipedia.org/wiki/Benford%27s_law
- Benford's Law: Applications for Forensic Accounting, Auditing, and Fraud Detection - Mark J. Nigrini (Author)
Cod de test:
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main()
{
// Declaram variabilele necesare
int freq[9] = {0}; // vector pentru a contoriza frecventa aparitiei cifrelor 1-9
int count = 0; // numarul de valori din setul de date
string filename; // numele fisierului care contine setul de date
double num; // numarul curent din setul de date
// Citim numele fisierului care contine setul de date
cout << "Introduceti numele fisierului: ";
cin >> filename;
// Deschidem fisierul pentru citire
ifstream input(filename);
// Citim fiecare numar din fisier si calculam frecventa cifrelor
while (input >> num) {
// Calculam prima cifra a numarului curent
int digit = int(num / pow(10, floor(log10(num)))) + 1e-9;
// Contorizam frecventa cifrei
if (digit >= 1 && digit <= 9) {
freq[digit - 1]++;
count++;
}
}
// Afisam distributia cifrelor
cout << "Distributia cifrelor conform legii lui Benford: " << endl;
for (int i = 0; i < 9; i++) {
double expected = log10(1.0 + 1.0 / (i + 1)) * count;
double actual = freq[i];
cout << i + 1 << ": " << actual << " (expected " << expected << ")" << endl;
}
// Inchidem fisierul
input.close();
return 0;
}
Acest program citește un set de numere dintr-un fișier (numele
fișierului este introdus de la tastatură), calculează prima cifră a
fiecărui număr, contorizează frecvența fiecărei cifre și afișează
distribuția cifrelor conform legii lui Benford. Pentru a compila și rula
acest program, trebuie să salvați codul sursă într-un fișier cu
extensia .cpp și să îl compilați folosind un compilator C++ (de exemplu,
g++ pe sistemele Unix/Linux). De asemenea, asigurați-vă că fișierul cu
setul de date se află în același director cu fișierul sursă al
programului.Pentru întrebari și/sau consultanță tehnică vă stau la dispozitie pe blog sau pe email simedruflorin@automatic-house.ro. O seară plăcută tuturor !