Hướng dẫn dùng median data python

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Phân tích số liệu thống kê giúp chúng ta hiểu được toàn bộ thông tin. Điều này ứng dụng trong rất nhiều lĩnh vực như thống kê sinh vật học và phân tích kinh doanh.

Thay vì duyệt qua các data point riêng lẻ, thì chỉ cần nhìn vào giá trị trung bình hoặc phương sai của bộ dữ liệu là có thể biết được xu hướng và các đặc trưng mà chúng ta có thể đã bỏ qua khi quan sát tất cả các dữ liệu ở định dạng thô. Nó cũng làm cho việc so sánh giữa hai bộ dữ liệu lớn trở nên dễ dàng và có ý nghĩa hơn.

Nhận ra những nhu cầu này, Python đã cung cấp cho chúng ta module statistics.

Trong hướng dẫn này, bạn sẽ học về các cách khác nhau để tính trung bình và đo lường độ chênh (spread) của một tập hợp dữ liệu nhất định. Trừ khi có những quy ước khác, tất cả các hàm trong mô-đun này hỗ trợ các tập dữ liệu đầu vào cơ bản int, float, decimalfraction.

Tính Trung bình

Bạn có thể sử dụng hàm mean(data) để tính trung bình của một số dữ liệu nhất định. Nó được tính bằng cách chia tổng của tất cả các data point cho số data point. Nếu dữ liệu rỗng, một StatisticsError sẽ được đưa ra. Dưới đây là vài ví dụ:

import statistics
from fractions import Fraction as F
from decimal import Decimal as D

statistics.mean([11, 2, 13, 14, 44])
# returns 16.8

statistics.mean([F(8, 10), F(11, 20), F(2, 5), F(28, 5)])
# returns Fraction(147, 80)

statistics.mean([D("1.5"), D("5.75"), D("10.625"), D("2.375")])
# returns Decimal('5.0625')

Bạn đã học được rất nhiều hàm để tạo ra các số ngẫu nhiên trong hướng dẫn trước của chúng tôi. Hãy sử dụng chúng ngay bây giờ để tạo ra dữ liệu của chúng ta và xem liệu trung bình cuối cùng có bằng với những gì chúng ta mong đợi hay không.

import random
import statistics

data_points = [ random.randint(1, 100) for x in range(1,1001) ]
statistics.mean(data_points)
# returns 50.618

data_points = [ random.triangular(1, 100, 80) for x in range(1,1001) ]
statistics.mean(data_points)
# returns 59.93292281437689

Với hàm randint(), giá trị trung bình dự kiến ​​sẽ gần với trung điểm của cả hai cực trị, và với sự phân bổ tam giác, nó được cho là gần với mức low + high + mode / 3. Vì vậy, trung bình trong trường hợp đầu tiên và thứ hai tương ứng là 50 và 60,33, gần với những gì chúng ta thực sự có được.

Tính Mode

Mean là một chỉ số xác định giá trị trung bình rất tốt, nhưng một vài giá trị phân cực có thể dẫn đến một trung bình xa điểm giữa thật sự. Trong một số trường hợp, cần xác định data-point thường xuyên nhất trong một tập dữ liệu. Hàm mode() sẽ trả về data point phổ biến nhất từ ​​số rời rạc cũng như dữ liệu không phải là số. Đây là hàm thống kê duy nhất có thể được sử dụng với dữ liệu không phải là số.

import random
import statistics

data_points = [ random.randint(1, 100) for x in range(1,1001) ]
statistics.mode(data_points)
# returns 94

data_points = [ random.randint(1, 100) for x in range(1,1001) ]
statistics.mode(data_points)
# returns 49

data_points = [ random.randint(1, 100) for x in range(1,1001) ]
statistics.mode(data_points)
# returns 32

mode(["cat", "dog", "dog", "cat", "monkey", "monkey", "dog"])
# returns 'dog'

Mode của các số nguyên được tạo ngẫu nhiên trong một phạm vi nhất định có thể là bất kỳ số nào vì tần suất xuất hiện của mỗi số không dự đoán được. Ba ví dụ trong đoạn code ở trên chứng minh điểm đó. Ví dụ cuối cùng trình bày cho chúng ta thấy cách chúng ta có thể tính được mode của dữ liệu không phải là số.

Tính Trung vị

Dựa vào mode để tính toán một giá trị trung điểm có thể gây chút hiểu nhầm. Như chúng ta đã thấy trong phần trước, nó sẽ luôn là data point phổ biến nhất, bất kể tất cả các giá trị khác trong bộ dữ liệu. Một cách khác để xác định trung vị là sử dụng hàm median(). Nó sẽ trả về giá trị trung vị của dữ liệu số cho trước bằng cách tính trung bình của hai điểm giữa nếu cần. Nếu số data point là lẻ, nó sẽ trả về điểm giữa. Nếu số data point là chẵn, nó sẽ trả về trung bình của hai giá trị trung vị.

Vấn đề với hàm median() là giá trị cuối cùng có thể không phải là một data point thật sự khi số data point là chẵn. Trong những trường hợp như vậy, bạn có thể sử dụng median_low() hoặc median_high() để tính toán trung vị. Với số data point chẵn, các hàm này sẽ trả về giá trị nhỏ hơn và lớn hơn của hai điểm giữa tương ứng.

import random
import statistics

data_points = [ random.randint(1, 100) for x in range(1,50) ]
statistics.median(data_points)
# returns 53

data_points = [ random.randint(1, 100) for x in range(1,51) ]
statistics.median(data_points)
# returns 51.0

data_points = [ random.randint(1, 100) for x in range(1,51) ]
statistics.median(data_points)
# returns 49.0

data_points = [ random.randint(1, 100) for x in range(1,51) ]
statistics.median_low(data_points)
# returns 50

statistics.median_high(data_points)
# returns 52

statistics.median(data_points)
# returns 51.0

Trong trường hợp cuối cùng, trung vị thấp và cao là 50 và 52. Điều này có nghĩa là không có data point có giá trị 51 trong tập dữ liệu của chúng ta, nhưng hàm median() vẫn tính trung vị là 51,0.

Đo Độ lệch của Dữ liệu

Xác định có bao nhiêu data point lệch khỏi giá trị điển hình hoặc trung bình của bộ dữ liệu cũng quan trọng không kém tính giá trị trung tâm hoặc trung bình. Mô-đun statistics có bốn hàm khác nhau để giúp chúng ta tính toán độ lệch này của dữ liệu.

Bạn có thể sử dụng hàm pvariance(data, mu=None) để tính phương sai của một bộ dữ liệu nhất định.

Đối số thứ hai trong trường hợp này là không bắt buộc. Giá trị của mu, khi được cung cấp, phải bằng với trung bình của dữ liệu nhất định. Trung bình được tính tự động nếu giá trị bị thiếu. Hàm này rất hữu ích khi bạn muốn tính phương sai của toàn bộ tập hợp. Nếu dữ liệu của bạn chỉ là một mẫu của tập hợp, bạn có thể sử dụng hàm variance(data, xBar=None) để tính toán phương sai của mẫu dữ liệu. Ở đây, xBar là trung bình của mẫu dữ liệu cho trước và được tính tự động nếu không được cung cấp.

Để tính toán độ rõ tiêu chuẩn của tập hợp và độ lệch tiêu chuẩn của mẫu dữ liệu, bạn có thể sử dụng các hàm pstdev(data, mu=None)stdev(data, xBar=None) tương ứng.

import statistics
from fractions import Fraction as F

data = [1, 2, 3, 4, 5, 6, 7, 8, 9]

statistics.pvariance(data)     # returns 6.666666666666667
statistics.pstdev(data)        # returns 2.581988897471611
statistics.variance(data)      # returns 7.5
statistics.stdev(data)         # returns 2.7386127875258306

more_data = [3, 4, 5, 5, 5, 5, 5, 6, 6]

statistics.pvariance(more_data)   # returns 0.7654320987654322
statistics.pstdev(more_data)      # returns 0.8748897637790901

some_fractions = [F(5, 6), F(2, 3), F(11, 12)]
statistics.variance(some_fractions)
# returns Fraction(7, 432)

Như minh chứng từ ví dụ trên, phương sai nhỏ hơn hàm ý rằng nhiều data point có giá trị gần hơn với giá trị trung bình. Bạn cũng có thể tính độ lệch chuẩn của các số thập phân và phân số.

Phần Tóm tắt

Trong hướng dẫn cuối cùng của loạt bài này, chúng ta đã tìm hiểu về các hàm khác nhau có sẵn trong mô-đun statistics. Bạn có thể đã quan sát thấy rằng dữ liệu đưa ra cho các hàm đã được sắp xếp trong hầu hết các trường hợp, nhưng không bắt buộc phải làm như vậy. Tôi đã sử dụng các danh sách được sắp xếp trong hướng dẫn này vì chúng giúp dễ dàng hơn để hiểu cách giá trị trả về bởi các hàm khác nhau có liên quan đến dữ liệu đầu vào.