Kiểm tra Kolmogorov-Smirnov hai mẫu bằng Python Scipy


81

Tôi không thể tìm ra cách thực hiện xét nghiệm KS hai mẫu ở Scipy.

Sau khi đọc tài liệu scipy kstest

Tôi có thể xem cách kiểm tra nơi phân phối giống với phân phối chuẩn chuẩn

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
test_stat = kstest(x, 'norm')
#>>> test_stat
#(0.021080234718821145, 0.76584491300591395)

Có nghĩa là tại giá trị p bằng 0,76, chúng ta không thể bác bỏ giả thuyết vô hiệu rằng hai phân phối là giống hệt nhau.

Tuy nhiên, tôi muốn so sánh hai phân phối và xem liệu tôi có thể bác bỏ giả thuyết rỗng rằng chúng giống hệt nhau hay không, chẳng hạn như:

from scipy.stats import kstest
import numpy as np

x = np.random.normal(0,1,1000)
z = np.random.normal(1.1,0.9, 1000)

và kiểm tra xem x và z có giống nhau không

Tôi đã thử ngây thơ:

test_stat = kstest(x, z)

và gặp lỗi sau:

TypeError: 'numpy.ndarray' object is not callable

Có cách nào để thực hiện kiểm tra KS hai mẫu bằng Python không? Nếu vậy tôi phải làm như thế nào?

Cảm ơn bạn trước


Bạn có thể đăng dòng và theo dõi lại?
cval

Câu trả lời:


122

Bạn đang sử dụng xét nghiệm KS một mẫu. Bạn có thể muốn kiểm tra hai mẫu ks_2samp:

>>> from scipy.stats import ks_2samp
>>> import numpy as np
>>> 
>>> np.random.seed(12345678)
>>> x = np.random.normal(0, 1, 1000)
>>> y = np.random.normal(0, 1, 1000)
>>> z = np.random.normal(1.1, 0.9, 1000)
>>> 
>>> ks_2samp(x, y)
Ks_2sampResult(statistic=0.022999999999999909, pvalue=0.95189016804849647)
>>> ks_2samp(x, z)
Ks_2sampResult(statistic=0.41800000000000004, pvalue=3.7081494119242173e-77)

Kết quả có thể được hiểu như sau:

  1. Bạn có thể so sánh statisticgiá trị được cung cấp bởi python với bảng giá trị quan trọng của KS-test theo kích thước mẫu của bạn. Khi statisticgiá trị cao hơn giá trị tới hạn, hai phân phối sẽ khác nhau.

  2. Hoặc bạn có thể so sánh p-valuevới mức ý nghĩa a , thường là a = 0,05 hoặc 0,01 (bạn quyết định, a càng thấp thì càng có ý nghĩa). Nếu giá trị p thấp hơn a , thì rất có thể hai phân phối là khác nhau.


1
Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn rât nhiều!
Akavall

2
Bạn giải thích những kết quả này như thế nào? Bạn có thể nói rằng các mẫu đến từ cùng một phân phối chỉ bằng cách nhìn vào statisticp-value?
FaCoffee

4
@FaCoffee Đây là những gì các tài liệu scipy nói: " Nếu thống kê KS là nhỏ hoặc các giá trị p là cao, sau đó chúng ta không thể bác bỏ giả thiết rằng các bản phân phối của hai mẫu đều giống nhau. "
user2738815

5

Đây là những gì các tài liệu scipy nói:

Nếu thống kê KS nhỏ hoặc giá trị p cao, thì chúng ta không thể bác bỏ giả thuyết rằng phân phối của hai mẫu là như nhau.

Không thể từ chối không có nghĩa là chúng tôi xác nhận.


bạn có thể giải thích câu trả lời của bạn chi tiết hơn không? cảm ơn trước!
King Tải lại

@KingReload Có nghĩa là khi giá trị p rất nhỏ, điều đó nói lên xác suất của hai mẫu này Không đến từ cùng một phân phối là rất thấp. Nói cách khác, xác suất hai mẫu này đến từ cùng một phân phối là rất cao. Nhưng bạn không thể chắc chắn 100% về điều đó do đó giá trị p không bao giờ bằng không. (Đôi khi chúng hiển thị là 0, nhưng thực ra, nó không bao giờ là 0). Đó là lý do tại sao người ta nói rằng Chúng tôi đã thất bại khi bác bỏ giả thuyết vô hiệu thay vì Chúng tôi chấp nhận giả thuyết rỗng . Chấp nhận rỗng giả thuyết = phân phối của hai mẫu đều giống nhau
MD Abid Hasan

3
giá trị p cao rất có thể chúng đến từ cùng một phân phối, giá trị p nhỏ có khả năng chúng không. @MDAbidHasan có nó ngược. Thật vậy, ví dụ trong tài liệu mà họ đưa ra một ví dụ: For an identical distribution, we cannot reject the null hypothesis since the p-value is high, 41%: >>> >>> rvs4 = stats.norm.rvs(size=n2, loc=0.0, scale=1.0) >>> stats.ks_2samp(rvs1, rvs4) (0.07999999999999996, 0.41126949729859719)
siêu anh hùng
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.