Thống kê với python

Giá trị trung bình, trung vị, và mốt

Python là một ngôn ngữ mạnh mẽ, với nhiều tính năng thú vị và thích hợp dùng để phân tích các thống kê. Một vài hàm quan trọng được sử dụng để tính giá trị trung bình và đo lường giá trị trung tâm.

  1. mean() : Hàm này sẽ trả về giá trị trung bình của tập dữ liệu được truyền vào. Trong trường hợp tham số bị trống thì StatisticsError sẽ được hiển thị.
  2. mode() : Hàm này sẽ trả về giá trị có số lần xuất hiện nhiều nhất trong tập dữ liệu.
import statistics as sta

data = [1, 2, 3, 3, 2, 2, 2, 1]

# using mean() and mode() to calculate average and mode of list elements
mean = sta.mean(data) # 2
mode = sta.mode(data) # 2

print(mode)
  1. median() : Hàm này được dùng để tính giá trị trung vị của tập dữ liệu.
  2. median_low() : Hàm này được dùng để tính giá trị trung vị,trong trường hợp số phần tử trong tập dữ liệu mà chúng ta có là số chẵn thì hàm này sẽ so sánh giá trị của 2 số trung vị và trả về giá trị nhỏ hơn giữa hai số đó.
  3. median_high() :Hàm này được dùng để tính giá trị trung vị,trong trường hợp số phần tử trong tập dữ liệu mà chúng ta có là số chẵn thì hàm này sẽ so sánh giá trị của 2 số trung vị và trả về giá trị lớn hơn giữa hai số đó.
import statistics as sta

data = [1, 2, 2, 3, 3, 3]

# measure of center location 
median = sta.median(data) # 2.5
median_low = sta.median_low(data) # 2
median_high = sta.median_high(data) # 3

Đo lường các khoảng

  1. variance() : Hàm này được tính toán phương sai đo độ lệch của dữ liệu
  2. stdev() : Hàm này được sử dụng để tính toán độ lệch chuẩn
import statistics as sta

data = [1, 2, 2, 3, 3, 3]

# measure of center location
variance = sta.variance(data) # 0.6666666666666666
st_dev = sta.stdev(data) # 0.816496580927726

Ví dụ:

Giả sử bạn là một người đi xin việc và bạn đang quan tâm đến thu nhập của nhân viên hai doanh nghiệp. Theo số liệu thống kê có được thì mức thu nhập của nhân viên 2 doanh nghiệp đó lần lượt như sau: A=[35 15 5 8 15 18 15 28 5], B=[17 10 22 14 15 19 15 20 12]. Hãy đưa ra nhận xét của bạn về 2 doanh nghiệp này.

Tính giá trị trung bình, trung vị và mốt của từng doanh nghiệp:

import statistics as st

A = [35, 15, 5, 8, 15, 18, 15, 28, 5]
B = [17, 10, 22, 14, 15, 19, 15, 20, 12]


def measure(data):
    mean_data = st.mean(data)
    median_data = st.median(data)
    mode_data = st.mode(data)
    return mean_data, median_data, mode_data


print(measure(A)) // # 16 15 15
print(measure(B)) // # 16 15 15

Hãy nhìn vào các giá trị mà ta có được, ta thấy rằng các giá trị trung bình, mốt và trung vị của cả 2 doanh nghiệp này đều bằng nhau, như thế thì chúng ta không biết phải chọn doanh nghiệp nào khi mà cả 3 con số quan trọng nhất đều bằng nhau. Hãy vẽ hình ra rồi so sánh nhé

Qua hình vẽ ta có thể thấy thì có lẽ dường như A có sự khác biệt về lương so với B, lúc này nếu chỉ dựa vào trung bình, trung vị và mốt thì kết quả sẽ không được chuẩn xác vì thế ta cần phải dùng đến các đại lượng khác để đo lường độ phân tán của dữ liệu. Một cách đơn giản nhất đó là dùng max và min để tính. Lúc này ta có:

range_A = max(A) - min(A) # 30
range_B = max(B) - min(B) # 12

Như vậy là A có mức lương biến động nhiều hơn B vì (30 > 12). Tuy nhiên thì phương pháp vẫn tồn tại nhược điểm là phụ thuộc vào các giá trị ngoại biên, chẳng hạn nếu giá trị max cao bất thường thì có thể sẽ gây ra nhầm lẫn khi đi đến kết luận. Một cách khác nữa đó là đi tìm giá trị Phương sai và độ lệch chuẩn. Hai giá trị phương sai và độ lệch chuẩn được ưa thích hơn trong việc phân tích thống kê. và cả hai con số này có thể được hiểu một cách đơn giản đó chính là sự khác biệt trung bình của các giá trị so với giá trị trung bình. Ngoài ra ta còn cần đến cả khoảng phân vị giữa các giá trị để cho phương sai ít bị ảnh hưởng bởi giá trị ngoại biên nhất.

import statistics as st
import numpy as np

A = [35, 15, 5, 8, 15, 18, 15, 28, 5]
B = [17, 10, 22, 14, 15, 19, 15, 20, 12]


def measure(data):
    var_data = st.pvariance(data)
    st_dev_data = st.pstdev(data)
    percentile = np.percentile(data, 75) - np.percentile(data, 25)
    return var_data, st_dev_data, percentile


print(measure(A)) # (90.88888888888889, 9.533566430716728, 10.0)
print(measure(B)) # (13.333333333333334, 3.6514837167011076, 5.0)

Đến đây là ta đã có đủ cơ sở để có thể đưa ra các đánh giá như sau:

  • Bạn sẽ chọn doanh nghiệp A nếu như bạn là người thích mạo hiểm và tự tin vào năng lực của bản thân, có thể ban đầu lương của bạn không cao nhưng nếu bạn được thăng tiến thì mức lương dành cho bạn sẽ rất ấn tượng.
  • Bạn sẽ chọn doanh nghiệp B nếu như bạn muốn ổn định, không có biến động nhiều về mức lương, tuy nhiên thì mức lương cao nhất ở bên B sẽ thấp hơn mức cao nhất ở bên A