Thống Kê Cơ Bản Cho Machine Learning: Từ Mô Tả Dữ Liệu Đến Tương Quan

Thống kê đóng vai trò nền tảng trong Machine Learning, cung cấp các công cụ và phương pháp để hiểu, xử lý và đưa ra quyết định dựa trên dữ liệu. Bài viết này sẽ trình bày các khái niệm thống kê cơ bản nhất, minh họa bằng công thức toán học và code Python, giúp bạn xây dựng nền tảng vững chắc cho hành trình khám phá Machine Learning.

Mô Tả Tập Dữ Liệu

Để hiểu rõ hơn về dữ liệu, việc mô tả nó một cách trực quan là rất quan trọng. Giả sử bạn thực hiện 6 lần chạy 100m và ghi lại thời gian (tính bằng giây) cho mỗi lần. Kết quả sẽ là một tập dữ liệu gồm 6 giá trị (quan sát). Chúng ta có thể sử dụng bảng để tổ chức dữ liệu:

Lần Chạy Thời Gian (Giây)
1 25.1
2 21.2
3 17.9
4 23.0
5 24.6
6 19.5

Ngoài ra, biểu đồ cột cũng là một công cụ hữu ích để trực quan hóa dữ liệu:

from matplotlib import pyplot as plt

Lan_chay = [1,2,3,4,5,6]
So_giay = [25.1, 21.2, 17.9, 23.0, 24.6, 19.5]

plt.plot(Lan_chay, So_giay)
plt.ylabel("Số giây")
plt.xlabel("Lần chạy")
plt.title("Thống kê số giây sau mỗi lần chạy")
plt.xticks(Lan_chay)
plt.show()

Biểu đồ giúp ta nhanh chóng nhận biết được các xu hướng và điểm nổi bật trong dữ liệu. Tuy nhiên, để hiểu sâu hơn, chúng ta cần các phương pháp đo lường thống kê.

Xu Hướng Tập Trung (Central Tendencies)

Xu hướng tập trung là một phương pháp đo lường quan trọng, giúp xác định giá trị tiêu biểu cho một tập dữ liệu. Ba tham số phổ biến nhất là:

  • Số trung bình (Mean/Average): Tổng của tất cả các giá trị chia cho số lượng giá trị.
  • Số trung vị (Median): Giá trị nằm ở giữa tập dữ liệu đã được sắp xếp.
  • Mode: Giá trị xuất hiện nhiều nhất trong tập dữ liệu.

Mean (Trung bình)

Trung bình cộng được tính bằng tổng của tất cả các giá trị trong tập dữ liệu, chia cho số lượng giá trị đó. Ví dụ, thời gian chạy trung bình của 6 lần chạy được tính như sau:

Mean = (25.1 + 21.2 + 17.9 + 23.0 + 24.6 + 19.5) / 6 = 21.88

Trong đó si là số giây của lần chạy thứ i. Hàm Python để tính mean:

def mean(mau):
  return sum(mau) / len(mau)

So_giay = [25.1, 21.2, 17.9, 23.0, 24.6, 19.5]
print(mean(So_giay)) # Kết quả: 21.883333333333333

Median (Trung vị)

Trung vị là giá trị nằm chính giữa tập dữ liệu đã được sắp xếp. Nếu số lượng giá trị là số chẵn, trung vị là trung bình của hai giá trị ở giữa. Xét hai tập dữ liệu sau:

  • S1 = {7, 3, 2, 4, 3}
  • S2 = {8, 7, 5, 6, 4, 3}

Sắp xếp lại:

  • S1 = {2, 3, 3, 4, 7} => Median(S1) = 3
  • S2 = {3, 4, 5, 6, 7, 8} => Median(S2) = (5+6)/2 = 5.5

Hàm Python để tính median:

def median(v):
  n = len(v)
  sorted_v = sorted(v)
  midpoint = n // 2
  if n % 2 == 1:
    return sorted_v[midpoint]
  else:
    lo = midpoint - 1
    hi = midpoint
    return (sorted_v[lo] + sorted_v[hi]) / 2

S1 = [7, 3, 2, 4, 3]
S2 = [8, 7, 5, 6, 4, 3]
print(median(S1)) # Kết quả: 3
print(median(S2)) # Kết quả: 5.5

Quantile

Quantile là dạng tổng quát của median, chia tập dữ liệu thành p phần bằng nhau. Median là 2-quantile. Một Quantile phổ biến khác là Tứ phân vị (quartile) – 4-quantiles.

Hàm Python trả về một quantile theo tỉ lệ p:

def quantile(x, p):
  p_index = int(p * len(x))
  return sorted(x)[p_index]

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(quantile(x, 0.25)) # Kết quả: 3 (Tứ phân vị thứ nhất)

Mode (Giá trị xuất hiện nhiều nhất)

Mode là giá trị xuất hiện nhiều lần nhất trong tập dữ liệu.

  • S1 = {1, 1, 3, 3, 3, 4} -> Mode(S1) = 3
  • S2 = {1, 2, 3} -> Mode(S2) = {1, 2, 3}
  • S3 = {1, 2, 2, 1} -> Mode(S3) = {1, 2}

Hàm Python để tìm mode:

from collections import Counter

def mode(x):
  counts = Counter(x)
  max_count = max(counts.values())
  return [value for value, count in counts.items() if count == max_count]

S1 = [1, 1, 3, 3, 3, 4]
S2 = [1, 2, 3]
S3 = [1, 2, 2, 1]

print(mode(S1)) # Kết quả: [3]
print(mode(S2)) # Kết quả: [1, 2, 3]
print(mode(S3)) # Kết quả: [1, 2]

Đo Lường Sự Biến Thiên của Dữ Liệu (Variation of Data)

Ngoài xu hướng tập trung, việc đo lường mức độ biến thiên của dữ liệu cũng rất quan trọng. Các tham số thường được sử dụng bao gồm:

  • Range (Khoảng biến thiên): Hiệu giữa giá trị lớn nhất và nhỏ nhất.
  • Interquartile Range (IQR – Khoảng tứ phân vị): Hiệu giữa tứ phân vị thứ ba và tứ phân vị thứ nhất.
  • Standard Deviation (Độ lệch chuẩn): Đo lường mức độ phân tán của dữ liệu so với giá trị trung bình.
  • Variance (Phương sai): Bình phương của độ lệch chuẩn.
  • Standard Error (Sai số chuẩn): Ước tính độ lệch chuẩn của trung bình mẫu.

Range (Khoảng biến thiên)

Được tính bằng cách lấy giá trị lớn nhất trừ giá trị nhỏ nhất trong mẫu. Hàm Python tính Range:

def data_range(x):
  return max(x) - min(x)

So_giay = [25.1, 21.2, 17.9, 23.0, 24.6, 19.5]
print(data_range(So_giay)) # Kết quả: 7.2

Deviation (Độ lệch)

Đo lường sự phân tán của dữ liệu so với giá trị trung tâm. Tổng độ lệch của tất cả các quan sát so với giá trị trung bình là:

Vì các giá trị si có thể lớn hơn, bằng, hoặc nhỏ hơn Mean, nên tổng độ lệch d có thể bằng 0. Để khắc phục, ta có thể sử dụng giá trị tuyệt đối hoặc bình phương độ lệch.

Phương sai (Variance) và Độ lệch chuẩn (Standard Deviation)

Phương sai đo lường sự phân tán của dữ liệu bằng cách tính trung bình của các bình phương độ lệch so với giá trị trung bình. Công thức phương sai mẫu (sample variance):

Độ lệch chuẩn là căn bậc hai của phương sai, giúp đưa độ phân tán về cùng đơn vị với dữ liệu gốc.

import math

def sum_of_squares(s):
  return sum(s_i * s_i for s_i in s)

def mean(s):
  return sum(s) / len(s)

def deviation(s):
  s_Mean = mean(s)
  return [s_i - s_Mean for s_i in s]

def variance(s):
  n = len(s)
  d = deviation(s)
  return sum_of_squares(d) / (n - 1)

def standard_deviation(s):
  return math.sqrt(variance(s))

So_giay = [25.1, 21.2, 17.9, 23.0, 24.6, 19.5]
print(variance(So_giay)) # Kết quả: 7.94966666666667
print(standard_deviation(So_giay)) # Kết quả: 2.819515239568426

Tính Tương Quan (Correlation)

Hệ số tương quan cho biết mức độ mạnh mẽ của mối quan hệ tuyến tính giữa hai biến số ngẫu nhiên. Tương quan có thể dương (positive) hoặc âm (negative). Tương quan dương cho thấy hai biến cùng tăng hoặc cùng giảm, trong khi tương quan âm cho thấy một biến tăng khi biến kia giảm.

Hiệp phương sai (covariance) đo lường sự biến thiên đồng thời của hai biến. Công thức hiệp phương sai của hai biến x, y:

Công thức tính hệ số tương quan dựa trên hiệp phương sai:

Trong đó sdxsdy lần lượt là độ lệch chuẩn của x và y.

def dot(x, y):
  return sum(x_i * y_i for x_i, y_i in zip(x, y))

def covariance(x, y):
  n = len(x)
  return dot(deviation(x), deviation(y)) / (n - 1)

def correlation(x, y):
  stdev_x = standard_deviation(x)
  stdev_y = standard_deviation(y)
  if stdev_x > 0 and stdev_y > 0:
    return covariance(x, y) / (stdev_x * stdev_y)
  else:
    return 0

Temperature = [14.2, 16.4, 11.9, 15.2, 18.5, 22.1, 19.4, 25.1, 23.4, 18.1, 22.6, 17.2]
Ice_Cream_Sales = [215, 325, 185, 332, 406, 522, 412, 614, 544, 421, 445, 408]

print(correlation(Temperature, Ice_Cream_Sales)) # Kết quả: 0.9575055686056194

Đồ thị cho thấy mối tương quan dương giữa nhiệt độ và doanh số bán kem. Hệ số tương quan gần 0.9575 cho thấy mối quan hệ này rất mạnh mẽ.

Lưu ý quan trọng: Tương quan không đồng nghĩa với quan hệ nhân quả.

Kết luận

Bài viết này đã giới thiệu các khái niệm thống kê cơ bản, từ mô tả dữ liệu đến đo lường xu hướng tập trung, biến thiên và tương quan. Nắm vững những kiến thức này là bước quan trọng để xây dựng nền tảng vững chắc cho việc học và ứng dụng Machine Learning. Trong các bài viết tiếp theo, chúng ta sẽ khám phá các khái niệm về xác suất và vai trò của nó trong Machine Learning.