Menu
CoddyTech

Kiểm định t

Thuộc phần Thống kê cho machine learning trong hành trình Machine Learning của Coddy. Bài học 45 trên 64.

Trước khi có máy tính, thống kê có một cách làm nhanh: kiểm định t (t-test). Một công thức tính ngay giá trị p từ các giá trị trung bình, độ phân tán và kích thước nhóm:

from scipy import stats

result = stats.ttest_ind(sans, serif)
print(np.round(result.pvalue, 3))
print(np.round(result.statistic, 2))

Với nghiên cứu về phông chữ, đoạn này in ra 0.031 và -2.61. 1000 lần xáo trộn cho kết quả 0.039, gần như thường lệ.

1000 hiệu số sau khi xáo trộn trong nghiên cứu về phông chữ được biểu diễn bằng biểu đồ tần suất màu nhạt, với đường cong hình chuông của phép kiểm định t nằm chồng lên trên và một đường đỏ nét đứt tại khoảng cách thực tế là -6.6. Chú giải ghi p = 0.039 cho các lần xáo trộn và 0.031 cho công thức

Giá trị t là khoảng cách tính theo sai số chuẩn; dấu của nó chỉ cho biết nhóm nào đứng trước. Công thức này giả định dữ liệu có dạng hình chuông, vì vậy với các nhóm nhỏ có dữ liệu lệch, hãy tin vào kết quả xáo trộn.

Nó cũng kiểm tra xem một mô hình có thực sự vượt trội hơn mô hình khác hay không.

challenge icon

Thử thách

Trung bình

Một nhà sản xuất sơn đo thời gian khô của ba loại lớp phủ. Phần code có sẵn lưu số phút khô của từng loại trong times, liệt kê ba pairs, định nghĩa permutation_p(a, b) và đọc level.

  1. In giá trị p (p-value) của kiểm định t cho matte và satin cạnh giá trị p từ phép xáo trộn.
  2. Kiểm tra từng cặp theo thứ tự loại lớp phủ xuất hiện trước, rồi in cặp có giá trị p nhỏ nhất.
  3. Đếm số cặp có giá trị nhỏ hơn level.

Làm tròn giá trị p đến 3 chữ số thập phân. Một nhà sản xuất khác, với mức 0.05:

matte vs satin: t-test 0.012, simulation 0.023
Clearest difference: satin vs gloss (p = 0.0)
Pairs that differ: 3 of 3

Tự làm thử

import numpy as np
import pandas as pd
from scipy import stats


# Kiểm định hoán vị trong hai bài học trước: trả về giá trị p khi so sánh a với b
def permutation_p(a, b, shuffles=1000, seed=0):
    rng = np.random.default_rng(seed)
    pooled = np.concatenate([a, b])
    diffs = []
    for i in range(shuffles):
        shuffled = rng.permutation(pooled)
        diffs.append(shuffled[len(a):].mean() - shuffled[:len(a)].mean())
    real = b.mean() - a.mean()
    return (np.abs(np.array(diffs)) >= np.abs(real)).mean()


paint = pd.read_csv("paint.csv")
times = {
    "matte": paint[paint["finish"] == "matte"]["minutes"],
    "satin": paint[paint["finish"] == "satin"]["minutes"],
    "gloss": paint[paint["finish"] == "gloss"]["minutes"],
}
pairs = [("matte", "satin"), ("matte", "gloss"), ("satin", "gloss")]
level = float(input())

# Viết code bên dưới
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Thống kê cho machine learning

Tự luyện tập: Trình biên dịch Python online