Dưới đây là một phiên bản rút gọn của mã shasan của, tính toán khoảng tin cậy 95% của giá trị trung bình của mảng a
:
import numpy as np, scipy.stats as st
st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
Nhưng sử dụng StatsModels' tconfint_mean được cho là thậm chí đẹp hơn:
import statsmodels.stats.api as sms
sms.DescrStatsW(a).tconfint_mean()
Các giả định cơ bản cho cả hai là mẫu (mảng a
) được vẽ độc lập với phân phối chuẩn không có độ lệch chuẩn (xem MathWorld hoặc Wikipedia).
Đối với cỡ mẫu lớn n, trung bình mẫu được phân bố bình thường và có thể tính khoảng tin cậy bằng cách sử dụng st.norm.interval()
(như được đề xuất trong nhận xét của Jaime). Nhưng các giải pháp trên cũng đúng đối với các n nhỏ, trong đó st.norm.interval()
cho các khoảng tin cậy quá hẹp (tức là "sự tự tin giả"). Xem answer của tôi cho một câu hỏi tương tự để biết thêm chi tiết (và một trong những nhận xét của Russ tại đây).
Dưới đây là một ví dụ trong đó các tùy chọn đúng cho (chủ yếu) giống hệt nhau khoảng tin cậy:
In [9]: a = range(10,14)
In [10]: mean_confidence_interval(a)
Out[10]: (11.5, 9.4457397432391215, 13.554260256760879)
In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
Out[11]: (9.4457397432391215, 13.554260256760879)
In [12]: sms.DescrStatsW(a).tconfint_mean()
Out[12]: (9.4457397432391197, 13.55426025676088)
Và cuối cùng, kết quả không chính xác sử dụng st.norm.interval()
:
In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)
sp.stats.stderr không được dùng nữa. Tôi thay thế sp.stats.sem và nó hoạt động rất tốt! – Bmayer0122
Nhập 'scipy' không nhất thiết phải nhập tất cả các gói phụ tự động. Tốt hơn là nhập gói phụ 'scipy.stats' một cách rõ ràng. – Vikram
Cẩn thận với việc sử dụng "riêng tư" của 'sp.stats.t._ppf'. Tôi không thoải mái với điều đó mà không giải thích thêm. Tốt hơn nên sử dụng trực tiếp 'sp.stats.t.ppf', trừ khi bạn chắc chắn mình biết mình đang làm gì. Khi kiểm tra nhanh [nguồn] (https://github.com/scipy/scipy/blob/v0.13.0/scipy/stats/distributions.py#L1474), có một số lượng mã được bỏ qua bằng '_ppf'. Có thể lành tính, nhưng cũng có thể là một nỗ lực tối ưu hóa không an toàn? – Russ