Làm cách nào tôi có thể ước tính giá trị N (hoặc phân vị thứ N) từ phân phối tần suất trong Excel?


2

Tôi có một bảng tính Excel chứa số lượng tần số thay vì dữ liệu thô. Tôi muốn có thể tìm thấy những thứ như giá trị 653 hoặc phần trăm thứ 95 một cách dễ dàng.

Ví dụ, giả sử dữ liệu thô là độ trễ trên mỗi gói. Dữ liệu đếm tần số tôi có thể trông giống như:

1ms = 1234567
3ms = 34254
5ms = 33034
7ms = 6901
10ms = 76

6901 gói rơi vào thùng "lớn hơn 5 mili giây, nhưng không quá 7 mili giây".

Vì các thùng khá nhỏ, tôi đã nghĩ rằng tôi có thể thực hiện một số mánh khóe để tính toán một số thông tin thống kê tiêu chuẩn như thể tôi có dữ liệu thô. Tính toán trung bình không yêu cầu điều này, nhưng một số thứ như độ lệch trung bình hoặc độ lệch chuẩn hoặc phần trăm thứ 99 đều dựa vào việc có phạm vi dữ liệu. Có ai giúp được không?


Đây có thể là một câu hỏi tốt hơn cho math.stackexchange.com, tùy thuộc vào mức độ chính xác về mặt toán học mà bạn muốn trở thành. Bạn phải đưa ra một số giả định về phân phối nội bộ của mỗi nhóm. Người ta có thể giả định phân phối đồng đều trong mỗi thùng. Đây sẽ là cách dễ nhất để làm và hiểu, nhưng dựa trên mức độ giảm theo cấp số nhân của ví dụ của bạn, đây có thể là một giả định khá tệ. Nếu bạn ổn với giả định này, tôi có thể giúp bạn viết một vài công thức.
Jarvin

1
Thực ra, thống kê.stackexchange.com bây giờ có lẽ tốt hơn khi tôi nghĩ về nó Nhưng bạn nên tách câu hỏi ra để tìm công thức phù hợp và áp dụng công thức đó trong excel, tôi không chắc bạn đang đấu tranh nhiều hơn với câu hỏi của bạn và điều đó sẽ quyết định nơi nào nên đăng. Nếu bạn muốn nó di chuyển, một quản trị viên có thể di chuyển nó đến trang web khác.
Jarvin

Câu trả lời:


1

Đối với tần suất bạn có, Excel không có đủ hàng để chứa dữ liệu thô. Tôi đã thu nhỏ tần số theo hệ số 100 (ngoại trừ tần số cuối cùng) để chúng phù hợp với bảng tính Excel. Nếu bạn chạy mã này, bạn sẽ nhận được dữ liệu thô, khi được sử dụng với công thức như

{=FREQUENCY($A$2:$A$13095,{1,3,5,7,10})}

cung cấp cho bạn (tần số giảm của tôi) 12345, 343, 330, 69, 7. Nó tạo ra các số ngẫu nhiên trong phạm vi của bạn.

Sub MakeRawData()

    Dim i As Long
    Dim dRaw As Double

    For i = 1 To 12345
        dRaw = Rnd
        Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = dRaw
    Next i

    For i = 1 To 343
        dRaw = (2 - 1 + 1) * Rnd + 1
        Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = dRaw
    Next i

    For i = 1 To 330
        dRaw = (4 - 3 + 1) * Rnd + 3
        Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = dRaw
    Next i

    For i = 1 To 69
        dRaw = (6 - 5 + 1) * Rnd + 5
        Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = dRaw
    Next i

    For i = 1 To 7
        dRaw = (9 - 7 + 1) * Rnd + 7
        Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = dRaw
    Next i

End Sub

Nó không hiệu quả khủng khiếp và có thể mất vài phút để chạy, nhưng nếu bạn không cần phải làm điều đó thường xuyên, đó không phải là một vấn đề lớn.


Cảm ơn mã. Vấn đề của tôi thực sự tồi tệ hơn những con số tôi đã đăng. Tôi đã có 100 thùng (1ms đến 100ms) và tổng số gói 38 millon.
kbyrd

Với khối lượng dữ liệu đó, có lẽ lưu trữ dữ liệu trong cơ sở dữ liệu (Access, SQL Server Express) và thao tác dữ liệu với Excel sẽ là cách tiếp cận tốt hơn? Thật không may, tôi không có bất kỳ kinh nghiệm thực tế nào với việc thao tác các bộ dữ liệu cơ sở dữ liệu lớn bằng Excel. Bạn có suy nghĩ gì không, @dkusleika?
technomalogical

Suy nghĩ ban đầu của tôi là một khi bạn đạt được khoảng 30 điểm dữ liệu trên mỗi nhóm, kết quả của thao tác dữ liệu sẽ không thay đổi. Nếu bạn lấy tập dữ liệu được tạo bởi mã ở trên, bạn sẽ nhận được trung bình giống như khi bạn có 38 triệu điểm dữ liệu. Nếu bạn đặt 38 triệu điểm dữ liệu vào cơ sở dữ liệu, bạn có thể sử dụng ADO để trích xuất chúng vào VBA (ví dụ tìm kiếm ADO tại dailydoseofexcel) nhưng 38 triệu sẽ mất một lúc trừ khi bạn sử dụng trình biên dịch hoặc một cái gì đó.
dkusleika

2

Tôi dự tiệc muộn khoảng 1,5 năm, nhưng tôi nghĩ tôi chỉ đăng bài cho bất kỳ ai khác vấp phải điều này.

Tôi nghĩ rằng đặt cược tốt nhất của bạn là nội suy một hàm phân phối tích lũy từ dữ liệu bạn có. Điều này có thể gây ra một số lỗi nghiêm trọng và vẫy tay, đặc biệt nếu dữ liệu mẫu bạn cung cấp gần với phân phối mà bạn đang làm việc. Tuy nhiên, nó chắc chắn đánh bại việc tạo (và lưu trữ!) Một triệu điểm dữ liệu giả từ một bản phân phối mà bạn chỉ đoán ở nơi đầu tiên.

Để có được CDF, bạn sẽ cần tính xác suất tích lũy cho mỗi nhóm. Tôi giả sử luôn có độ trễ, vì vậy hãy lấy 0 làm giá trị tối thiểu của bạn với tần suất là 0. Để tìm giá trị CDF ở mỗi nhóm giới hạn trên, hãy sử dụng công thức

(sum of frequencies in bucket and previous buckets)/(sum of all frequencies)

Đối với dữ liệu mẫu bạn cung cấp, các điểm xác suất tích lũy sẽ là

{(0,0); (1;0.943); (3,0.969); (5,0.995); (7,0.999); (10,1)}

Bây giờ, cho finessing. Nếu bạn có một số hiểu biết thông thường về phân phối trông như thế nào, ví dụ: bạn nghĩ đâu đó khoảng 25% độ trễ nhỏ hơn 0,1 ms, bạn có thể thêm những trực giác này vào dữ liệu của mình. Nếu bạn không có ý tưởng gì về việc phân phối sẽ như thế nào, thì bạn có thể chỉ cần cuộn với những gì bạn có.

Từ đây, bạn có hai lựa chọn: (a) nội suy tuyến tính giữa các điểm bạn có hoặc (b) phù hợp với một hình thức chức năng, chẳng hạn như phân phối beta, cho dữ liệu của bạn. (a) đơn giản hơn vì không yêu cầu hồi quy; tuy nhiên, nó sẽ không cung cấp cho bạn một bức tranh chi tiết hơn những gì bạn đã có và việc tính toán tần số đòi hỏi một chút công thức kung fu của Excel. . tuy nhiên, nó yêu cầu hồi quy, yêu cầu bổ trợ Bộ giải. Tôi thích tùy chọn (b) vì nó mang lại cho bạn nhiều lợi ích nhất cho bạn (nghĩa là, nỗ lực).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.