7

Đây là một chuyến tham quan nhanh thú vị bằng cách sử dụng một chương trình Python rất ngắn, chiếu sáng cơ sở hơi phản trực giác cho luật của Benford. Nhanh chóng, thú vị và mới mẻ. Tất cả chúng ta đều ở đây phải không?

Một thời gian trước, tôi đã viết về cách các chữ số hàng đầu của giai thừa theo luật của Benford . Đó là, nếu bạn chỉ nhìn vào chữ số đầu tiên của một chuỗi các giai thừa, chúng không được phân bổ đều. Thay vào đó, 1 là phổ biến nhất, sau đó là 2, v.v. Cụ thể, tỷ lệ các giai thừa bắt đầu bằng  n là khoảng 10 log (1 + 1 / n ).

Ai đó đã chứng minh rằng việc phân phối giới hạn các chữ số hàng đầu của các yếu tố đáp ứng chính xác luật của Benford . Nhưng nếu chúng ta không biết điều này, chúng ta có thể sử dụng một thống kê chi bình phương để đo lường kết quả thực nghiệm phù hợp với kỳ vọng như thế nào. Như tôi đã thảo luận trong bài trước , các bài kiểm tra thống kê không áp dụng ở đây, nhưng dù sao chúng cũng có thể hữu ích trong việc cho chúng ta cách đo kích thước của độ lệch so với lý thuyết.

Luật của Benford minh họa rõ hơn về bài kiểm tra chi bình phương so với ví dụ về phần còn lại chính  vì các thùng có kích thước không đồng đều, nói chung chúng được phép nói chung. Trong bài còn lại chính, tất cả chúng đều có cùng kích thước.

Bài viết gốc về các chữ số hàng đầu của giai thừa giải thích lý do tại sao chúng ta tính các chữ số hàng đầu theo cách chúng ta làm. Chỉ có một chi tiết đã thay đổi: Bài đăng gốc đã sử dụng Python 2 và bài này sử dụng Python 3. Phân chia số nguyên là mặc định trong Python 2, nhưng bây giờ trong Python 3 chúng ta phải sử dụng //để yêu cầu phân chia số nguyên một cách rõ ràng mặc định.

Đây là một âm mưu phân phối các chữ số hàng đầu cho 500 giai thừa đầu tiên.

Và đây là mã để tính toán thống kê chi bình phương:


    from math import factorial, log10

    def leading_digit_int(n):
        while n > 9:
            n = n//10
        return n

    def chisq_stat(O, E):
        return sum( [(o - e)**2/e for (o, e) in zip(O, E)] )

    # Waste the 0th slot to make the code simpler.
    digits = [0]*10

    N = 500
    for i in range(N):
        digits[ leading_digit_int( factorial(i) ) ] += 1

    expected = [ N*log10(1 + 1/n) for n in range(1, 10) ]

    print( chisq_stat(digits[1:], expected) )

Điều này đưa ra một thống kê chi bình phương là 7.693, rất gần với giá trị trung bình là 8 cho phân bố chi bình phương với tám bậc tự do. (Có tám bậc tự do, không phải chín độ, bởi vì nếu chúng ta biết có bao nhiêu giai thừa bắt đầu bằng các chữ số từ 1 đến 8, chúng ta biết có bao nhiêu bắt đầu bằng 9.)

Vì vậy, thống kê chi bình phương cho thấy rằng độ lệch so với luật của Benford chỉ là những gì chúng ta mong đợi từ dữ liệu ngẫu nhiên theo luật của Benford. Và như chúng tôi đã nói trước đây, đề nghị này hóa ra là chính xác.

|