Chương 2: Các phân bố

Trở về Mục lục cuốn sách

2.1  Các histogram

Một trong những cách hay nhất để miêu tả một biến là báo những giá trị xuất hiện trong bộ số liệu, và báo mỗi giá trị xuất hiện bao lần. Thông tin miêu tả này được gọi là dạng phân bố của biến lượng đó.

Cách biểu diễn thông dụng nhất cho phân bố là một histogram, vốn là một biểu đồ cho thấy tần số của từng giá trị. Về phương diện này, “tần số” nghĩa là số lần mà giá trị xuất hiện. 

Trong Python, một cách hiệu quả để tính tần số là dùng một từ điển. Cho trước một dãy các giá trị, t:

hist = {}
for x in t:
    hist[x] = hist.get(x, 0) + 1

Thì kết quả là một từ điển nhằm ánh xạ từ các giá trị đến tần số. Một cách khác, bạn có thể sử dụng lớp Counter được định nghĩa trong module có tên collections:

from collections import Counter
counter = Counter(t)

Kết quả là một đối tượng Counter, vốn là một lớp con của từ điển.

Một lựa chọn khác là sử dụng phương thức value_counts của pandas, mà ta đã thấy trong chương trước. Nhưng trong cuốn sách này tôi đã tạo một lớp Hist, để biểu diễn các histogram và cung cấp các phương thức hoạt động với histogram.

2.2  Biểu diễn các histogram

Một constructor tên Hist có thể nhận vào một dãy, một từ diển, một chuỗi (Series) của pandas, hay một Hist khác. Bạn có thể khởi tạo một đối tượng Hist như sau:

>>> import thinkstats2
>>> hist = thinkstats2.Hist([1, 2, 2, 3, 5])
>>> hist
Hist({1: 1, 2: 2, 3: 1, 5: 1})

Đối tượng Hist cung cấp Freq, phương thức này nhận một gía trị rồi trả lại tần số xuất hiện của gía trị đó:

>>> hist.Freq(2)
2

Toán tử cặp ngoặc vuông cũng thực hiện điều tương tự:

>>> hist[2]
2

Nếu bạn tra tìm một gía trị mà chưa từng xuất  hiện, thì tần số của nó bằng 0.

>>> hist.Freq(4)
0

Values thì trả lại một danh sách chưa được sắp xếp các gía trị có trong Hist:

>>> hist.Values()
[1, 5, 3, 2]

Để lặp qua các gía trị theo thứ tự, bạn có thể dùng hàm lập sẵn có tên sorted:

for val in sorted(hist.Values()):
    print(val, hist.Freq(val))

Hoặc bạn có thể dùng Items để lặp qua các cặp gíá trị – tần số:

for val, freq in hist.Items():
     print(val, freq)

2.3  Vẽ các histograms


Hình 2.1: Histogram của cân nặng trẻ sơ sinh tính tròn số theo pound.

 


Để phục vụ cuốn sách này tôi đã viết một module có tên thinkplot.py ; module này cung cấp các hàm để vẽ các Hist và những đối tượng khác được định nghĩa trong  thinkstats2.py. Module được dựa trên pyplot, vốn thuộc về gói matplotlib. Hãy xem mục 0.2 để biết cách cài đặt matplotlib.

Để vẽ nên hist bằng thinkplot, hãy thử các lệnh sau:

>>> import thinkplot
>>> thinkplot.Hist(hist)
>>> thinkplot.Show(xlabel='value', ylabel='frequency')

Bạn có thể đọc tài liệu về thinkplot ở http://greenteapress.com/thinkstats2/thinkplot.html.


Hình 2.2: Histogram của phần lẻ cân nặng trẻ sơ sinh.

2.4  Các biến NSFG

Bây giờ ta hãy trở về dữ liệu từ NSFG. Mã lệnh dành cho chương này ở file first.py. Muốn biết thông tin về việc tải về và làm việc với mã lệnh này, hãy xem mục 0.2.

Khi bắt đầu làm việc với một bộ dữ liệu mới, tôi khuyên bạn nên khám phá các biến định sử dụng, xem xét từng biến một, và một cách làm hợp lý là nhìn vào những histogram.

Ở mục 1.6 chúng ta đã chuyển đổi agepreg từ phần trăm của năm sang thành năm, và kết hợp birthwgt_lb cùng birthwgt_oz vào một đại lượng, totalwgt_lb. Ở mục này tôi dùng các biến đó để minh họa một số đặc điểm của histogram.


Hinh 2.3: Histogram về tuổi người mẹ ở cuối thai kì.

 


Tôi sẽ bắt đầu bằng việc đọc dữ liệu và chọn những bản ghi có sinh nở thành công:

    preg = nsfg.ReadFemPreg()
    live = preg[preg.outcome == 1]

Biểu thức trong ngặc vuông là một chuỗi (Series) các gía trị boolean nhằm chọn các hàng trong khung dữ liệu (DataFrame) và trả lại một DataFrame mới. Tiếp theo, tôi phát sinh và vẽ nên histogram của birthwgt_lb cho các ca sinh.

    hist = thinkstats2.Hist(live.birthwgt_lb, label='birthwgt_lb')
    thinkplot.Hist(hist)
    thinkplot.Show(xlabel='pounds', ylabel='frequency')

Khi tham số truyền vào Hist là một chuỗi (Series) của pandas, thì bất cứ gía trị nan (gía trị không phải số) nào cũng bị bỏ đi. label là một chuỗi xuất hiện trong chú giải khi Hist được vẽ nên.


Hình 2.4: Histogram của thai kì tính theo tuần.

 


Hình 2.1 biểu diễn kết qủa. Gía trị thường gặp nhất, gọi là mốt, bằng 7 pound. Phân bố gần giống dạng hình chuông, chính là hình của phân bố chuẩn, còn được gọi là phân bố  Gauss. Nhưng khác với một phân bố chuẩn thực sự, phân bố này bất đối xứng; nó có một cái đuôi dài về phía trái so với về phía phải.

Hình 2.2 cho thấy histogram của birthwgt_oz, vốn là phần ounce [phần lẻ của pound] trong cân nặng sinh nở. Về lý thuyết, ta mong đợi dạng phân bố này là đều; nghĩa là tất cả gía trị phải có cùng tần suất. Song thực ra, 0 là gía trị phổ biến nhất, còn 1 và 15 ít gặp hơn, có lẽ bởi vì người báo cáo đã làm tròn những cân nặng nào gần sát trị số nguyên.

Hình 2.3 cho thấy histogram của agepreg, tuổi của người mẹ ở cuối thai kì. Mốt bằng 21 năm. Phân bố này rất gần tựa như hình chuông, song có đuôi kéo dài sang phải hơn là sang trái; đa số người mẹ ở những tuổi 20, còn những tuổi 30 thì ít hơn.

Hình 2.4 thể hiện histogram của prglngth, chiều dài của thai kì tính theo tuần. Cho đến giờ gía trị thông thường nhất là 39 tuần. Đuôi phía trái dài hơn phía phải; các trẻ sinh sớm thường thấy hơn, còn thai ít khi lâu qúa 43 tuần, và bác sĩ thường can thiệp trong trường hợp như vậy.

2.5  Giá trị biệt lập

Nhìn vào histogram, có thể dễ phát hiện gía trị thông dụng nhất và hình dạng phân bố, nhưng các gía trị hiếm thì thường không nhìn thấy được.

Trước khi tiếp tục, ta nên kiểm tra xem có các gía trị biệt lập không, đó là những gía trị cực hạn có thể do sai số trong đo đạc và ghi chép, hoặc có thể là con số báo đúng về những hiện tượng hiếm.

Hist cung cấp các phương thức Largest và Smallest, vốn nhận vào một số nguyên n là trả lại n gía trị lớn nhất hoặc nhỏ nhất từ histogram:

    for weeks, freq in hist.Smallest(10):
        print(weeks, freq)

Trong danh sách các thai kì của những ca sinh  thành công, 10 giá trị thấp nhất là [0, 4, 9, 13, 17, 18, 19, 20, 21, 22]. Các giá trị dưới 10 tuần rõ ràng bị lỗi; lý giải phù hợp nhất là kết quả không được ghi chép đúng. Những giá trị cao hơn 30 tuần thì có thể hợp lý. Giữa 10 và 30 tuần thì khó chắc chắn; một vài giá trị có thể là lỗi, nhưng một số cũng biểu thị các ca sinh sớm.

Về phía kia của khoảng số liệu, những giá trị cao nhất là:

weeks  count
43     148
44     46
45     10
46     1
47     1
48     7
50     2

Đa số bác sĩ đều gợi ý đẻ can thiệp trong trường hợp thai kì vượt quá 42 tuần, bởi vậy những giá trị lớn hơn đều đáng ngạc nhiên. Đặc biệt, giá trị 50 tuần có vẻ không khả dĩ về mặt y học.

Cách tốt nhất để xử lý các điểm biệt lập thì phụ thuộc vào “kiến thức ngành”, tức là số liệu này đến từ đâu và nó có ý nghĩa gì. Và nó cũng phụ thuộc vào việc bạn dự định phân tích kiểu gì. 

Ở ví dụ này, câu hỏi khởi đầu là liệu con đầu lòng có xu hướng chào đời sớm (hay muộn) không. Khi người ta hỏi câu này, thì thường họ quan tâm đến các thai nhi tương đối đầy đủ tháng, bởi vậy tôi sẽ tập trung phân tích những ca mang thai hơn 27 tuần.

2.6  Con đầu lòng

Bây giờ ta có thể so sánh dạng phân bố của thai kì trẻ đầu lòng và trẻ sinh sau. Tôi chia DataFrame các ca sinh thành công theo birthord, và tính các histogram tương ứng:

    firsts = live[live.birthord == 1]
    others = live[live.birthord != 1]

    first_hist = thinkstats2.Hist(firsts.prglngth)
    other_hist = thinkstats2.Hist(others.prglngth)

Sau đó tôi vẽ các histogram này lên cùng trục:

    width = 0.45
    thinkplot.PrePlot(2)
    thinkplot.Hist(first_hist, align='right', width=width)
    thinkplot.Hist(other_hist, align='left', width=width)
    thinkplot.Show(xlabel='weeks', ylabel='frequency',
                   xlim=[27, 46])

thinkplot.PrePlot nhận vào số histogram ta dự định vẽ; hàm này nhận thông tin nêu trên để chọn tập hợp màu phù hợp.


Figure 2.5: Histogram các thai kì.

thinkplot.Hist normally dùng align=’center’ bởi vậy các cột đều được căn giữa trị số tương ứng. Nhưng để vẽ hình trên, tôi dùng align=’right’ và align=’left’ để đặt những cột tương ứng vào bên trái và bên phải trị số.

Với width=0.45, bề rộng tổng cộng của hai cột bằng 0.9, và chừa ra chỗ trống giữa từng cặp số liệu.

Sau cùng, tôi chỉnh lại trục để chỉ cho hiển thị các số liệu giữa 27 và 46 tuần. Hình 2.5 biểu diễn kết quả.

Histograms rất hữu ích vì chúng khiến cho những giá trị thường xuất hiện trở nên rõ ràng lập tức. Nhưng loại biểu này không phải tốt nhất khi ta muốn so sánh hai dạng phân bố. Ở đây, có ít “trẻ đầu lòng” hơn so với “con sinh sau,” vì vậy một số điểm khác biệt lộ rõ trong histogram lại do các kích cỡ mẫu. Ở chương tiếp theo chúng ta giải quyết điều này bằng các hàm mật độ khối xác suất.

2.7  Tóm tắt dạng phân bố

Một histogram là hình thức mô tả đầy đủ cho dạng phân bố của một mẫu; nghĩa là khi có histogram, ta có thể tái tạo lại được các giá trị trong mẫu (dù không được thứ tự).

Nếu chi tiết về phân bố là quan trọng thì có thể cần trình bày một histogram. Song thường ta muốn tóm tắt dạng phân bố chỉ bằng một vài đặc trưng thống kê mô tả.

Một vài đặc tính mà có thể ta muốn báo cáo gồm có:

  • xu thế trung tâm: Liệu các giá trị có xu thế cụm lại quanh một điểm cụ thể không?
  • số đông: Có hơn một cụm như vậy không?
  • độ tản mát: Độ biến động trong các giá trị có nhiều không?
  • đuôi: Xác suất giảm đi nhanh không khi di chuyển khỏi số đông?
  • giá trị biệt lập: Có những giá trị cực hạn nằm xa số đông không?

Các đặc trưng thống kê được chỉ định giải đáp những câu hỏi trên thì được gọi là các đặc trưng thống kê tóm tắt. Cho đến giờ, đặc trưng thống kê thông dụng nhất là số trung bình, vốn được dùng để mô tả xu thế trung tâm của phân bố. 

Nếu bạn có một mẫu gồm n giá trị, xi, thì giá trị trung bình, μ, là tổng của các giá trị trên chia cho số các giá trị; nói cách khác

μ = (1 / n)∑i xi

Các từ “trị trung bình” và “average” đôi khi có thể dùng thay thế được cho nhau, nhưng tôi vẫn muốn phân biệt:

 

  • “Trị trung bình” của một mẫu là đặc trưng thống kê được tính theo công thức trên.
  • “average” là một trong nhiều đặc trưng thống kê mà bạn có thể chọn để mô tả giá trị điển hình hay xu thế trung tâm.

 

Đôi khi trị trung bình là một cách mô tả tốt một tập hợp các giá trị. Chẳng hạn, các quả táo nói chung đều có kích thước gần bằng nhau (ít ra là táo bày bán ở siêu thị). Vì vậy nếu tôi mua 6 quả táo và khối lượng tổng cộng là 3 pound thì cũng có lý khi nói rằng mỗi quả táo nặng cỡ nửa pound.

Nhưng bí đỏ thì đa dạng hơn. Chẳng hạn ở vườn nhà, tôi trồng bí và một ngày kia thua hoạch được 3 quả bí để bày, mỗi quả nặng 1 pound và hai quả bí pie, mỗi quả nặng 3 pound, và một quả bí Atlantic Giant® nặng đến 591 pound. Trị trung bình của mẫu này là 100 pound, nhưng nếu tôi nói “Quả bí trung bình ở vườn nhà tôi nặng 100 pound,” thì sẽ là sai, hoặc chí ít sẽ gây ngộ nhận. Trong trường hợp này, không có trung bình nào có ý nghĩa vì không có quả bí điển hình nào có khối lượng như vậy.

 

2.8  Phương sai

Nếu không có một con số nào đặc trưng được cho khối lượng quả bí thì tốt hơn là chúng ta dùng hai con số: trị trung bình và phương sai.

Phương sai là một đặc trưng thống kê tóm tắt được dùng để mô tả độ phân tán hay mức độ rải rác của phân bố. Phương sai của một tập hợp giá trị thì bằng

σ2 = (1 / n)∑i (xi - μ)2

Số hạng xi μ được gọi là “độ lệch so với trung bình,” vì vậy phương sai là giá trị trung bình của bình phương độ lệch. Căn bậc hai của phương sai, S, là độ lệch chuẩn.

Nếu bạn đã có kinh nghiệm từ trước, bạn có thể gặp một công thức phương sai có n−1 ở mẫu số thay vì n. Đặc trưng thống kê đó được dùng  để ước lượng phương sai trong tổng thể bằng cách dùng một mẫu. Ta sẽ trở lại vấn đề này trong Chương 8.

Các cấu trúc dữ liệu Pandas đều cung cấp phương thức để tính trị trung bình, phương sai, và độ lệch chuẩn:

    mean = live.prglngth.mean()
    var = live.prglngth.var()
    std = live.prglngth.std()

Với tất cả những ca sinh thành công, thai kì trung bình bằng 38.6 tuần, độ lệch chuẩn bằng 2.7 tuần, nghĩa là ta nên coi mức độ chênh lệch 2-3 tuần là điều thông thường.

Phương sai của thai kì bằng 7.3, cái này khó diễn giải, đặc biệt là vì đơn vị bằng tuần2, hay “tuần bình phương.” Phương sai thì hữu ích trong một số phép tính, nhưng nó không phải là một đặc trưng tóm tắt tốt.

2.9  Cỡ hiệu ứng

Cỡ hiệu ứng là một đặc trưng thống kê tóm tắt được dùng để mô tả kích cỡ của một hiệu ứng. Chẳng hạn, để mô tả sự khác biệt giữa hai nhóm, một lựa chọn hiển nhiên là hiệu số giữa các trị trung bình. 

Thai kì trung bình cho trẻ đầu lòng là 38.601; với trẻ sinh sau là 38.523. Khác biệt bằng 0.078 tuần, tính ra là 13 giờ. Chỉ bằng một phần nhỏ của thai kì, sự khác biệt trên vào khoảng 0.2%.

Nếu ta giả sử rằng ước tính trên là đúng, thì mức độ khác biệt này không có hệ quả đáng kể nào. Thực ra, nếu không quan sát rất nhiều ca sinh đẻ thì có lẽ chẳng ai có thể nhận ra khác biệt trên.

Một cách khác để chuyển tải ý nghĩa của cỡ hiệu ứng là để so sánh hiệu số giữa hai nhóm với độ biến động trong từng nhóm. Trị số d của Cohen là một đặc trưng thống kê nhằm mục đích này; nó được định nghĩa như là

d = \frac{\bar{x}_1 - \bar{x}_2} { s }

trong đó \bar{x}_1\bar{x}_1 là các trị trung bình của từng nhóm còn s là “độ lệch chuẩn gộp chung”. Sau đây là mã lệnh Python để tính trị số d của Cohen:

def CohenEffectSize(group1, group2):
    diff = group1.mean() - group2.mean()

    var1 = group1.var()
    var2 = group2.var()
    n1, n2 = len(group1), len(group2)

    pooled_var = (n1 * var1 + n2 * var2) / (n1 + n2)
    d = diff / math.sqrt(pooled_var)
    return d

Ở ví dụ này, hiệu số giữa các trị trung bình bằng 0.029 lần độ lệch chuẩn, tức là rất nhỏ. Để tiện đối chiếu, khác biệt về độ cao người nam giới và phụ nữ thì bằng khoảng 1.7 lần độ lệch chuẩn (xem https://en.wikipedia.org/wiki/Effect_size).

2.10  Báo cáo kết quả

Ta đã thấy được vài cách mô tả hiệu số về thai kì (nếu có) giữa trẻ đầu lòng và trẻ sinh sau. Làm thế nào ta có thể báo những kết quả trên?

Câu trả lời phụ thuộc vào ai là người đặt câu hỏi. Một nhà khoa học có thể sẽ quan tâm đến các hiệu ứng thật, bất kì nó nhỏ đến mức nào. Một bác sĩ có thể chỉ quan tâm đến những hiệu ứng có ý nghĩa về y khoa; tức là những khác biệt có ảnh hưởng đến quyết định điều trị. Một phụ nữ mang thai có thể quan tâm đến những kết quả có liên quan tới cô ấy, như các xác suất sinh sớm hoặc muộn.

Cách mà bạn báo cáo kết quả cũng phụ thuộc vào mục tiêu của bạn. Nếu phải biểu diễn ý nghĩa của một hiệu ứng, bạn có thể chọn đặc trưng thống kê, như rủi ro tương đối, để nhấn mạnh sự khác biệt. Nếu bạn cần trấn an bệnh nhân, bạn có thể chọn số thống kê mà đặt khác biệt này vào bối cảnh.

Dĩ nhiên quyết định của bạn còn bị định hướng bởi đạo đức ngành nghề. Thuyết phục cũng được thôi; bạn nên thiết kế những báo cáo và hiển thị số thống kê nhằm kể lại câu chuyện thạt rõ ràng. Nhưng bạn cũng nên cố hết sức để báo cáo trung thực, và nhận định những sự bất định và các hạn chế.

2.11  Bài tập

Bài tập 1.   Dựa vào các kết quả từ những bài tập trước, chẳng hạn bạn được yêu cầu phải tóm tắt những gì bạn đã biết về vấn đề liệu trẻ đầu lòng có chào đời muộn hay không. Bạn sẽ dùng đặc trưng thống kê nào nếu muốn đưa vào chuyện kể trong bản tin buổi tối? Bạn sẽ dùng đặc trưng nào nếu muốn an ủi một bệnh nhân đang lo lắng?

Sau cùng, hãy tưởng tượng rằng mình là Cecil Adams, tác giả của The Straight Dope (http://straightdope.com), và nhiệm vụ của bạn là trả lời câu hỏi, “Liệu trẻ đầu lòng có chào đời muộn không?” Hãy viết bài trả lời dựa trên những kết quả trong chương này để giải đáp câu hỏi một cách rõ ràng, tập trung, và chính xác.

Bài tập 2.   Trong dữ liệu đã tải về, bạn sẽ tìm thấy một file có tên chap02ex.ipynb; mở nó ra. Một số ô đã được điền sẵn, bạn hãy chạy chúng. Những ô khác thì hướng dẫn cách làm bài tập. Hãy làm theo hướng dẫn này và điền câu trả lời. Một lời giải cho bài tập này được cho ở chap02soln.ipynb

Trong dữ liệu tải về, bạn sẽ tìm thấy một file tên là chap02ex.py; bạn có thể dùng file này để khởi đầu cho những bài tập tiếp theo. Lời giải của tôi có ở filechap02soln.py.

Bài tập 3.  Số đông (mode) của một dạng phân bố là giá trị hay xuất hiện nhất (xem http://wikipedia.org/wiki/Mode_(statistics)). Hãy viết một hàm có tên Mode nhận vào một đối tượng Hist và trả lại giá trị xuất hiện nhiều nhất. Một nhiệm vụ khó hơn là, hãy viết một hàm có tên AllModesnhận vào đối tượng Hist và trả lại một danh sách các cặp giá trị–tần số xếp theo thứ tự tần suất giảm dần.

Bài tập 4.   Dùng biến totalwgt_lb, hãy xét xem liệu trẻ đầu lòng có nhẹ hơn hay nặng hơn trẻ sinh sau. Tính trị số d của Cohen để định lượng sự khác biệt giữa các nhóm. Khác biệt này so với khác biệt về thai kì như thế nào?

2.12  Thuật ngữ

  • phân bố: The values that appear in a sample and the frequency of each.
  • histogram: Một ánh xạ từ giá trị đến tần số, hoặc một biểu đồ thể hiện ánh xạ này.
  • tần số: Số lần mà một giá trị xuất hiện trong mẫu.
  • số đông: Giá trị hay gặp nhất trong một mẫu, hoặc là một trong những giá trị hay gặp nhất này.
  • phân bố chuẩn: một dạng lý tưởng của phân bố hình chuông; còn gọi là phân bố Gauss. 
  • phân bố đều: Một phân bố mà trong đó tất cả các giá trị đều có cùng tần số.
  • đuôi: Phần của phân bố nằm về các phía cực hạn cao và thấp.
  • xu thế trung tâm: Đặc tính của một mẫu hoặc tổng thể; theo trực giác, đó là giá trị trung bình nhất. 
  • điểm biệt lập: Giá trị nằm cách xa xu thế trung tâm.
  • phân tán: Một độ đo mức rải rác của các giá trị trong một phân bố.
  • đặc trưng thống kê tóm tắt: Một đặc trưng thống kê để định lượng một khía cạnh nào đó của phân bố, như xu thế trung tâm hay phân tán.
  • phương sai: Đặc trưng thống kê tóm tắt thường được dùng để lượng hóa mức phân tán.
  • độ lệch chuẩn: Căn bậc hai của phương sai, cũng được dùng để đo mức phân tán.
  • cơ hiệu ứng: Một đặc trưng thống kê để định lượng kích cỡ của một hiệu ứng như khác biệt giữa các nhóm.
  • có ý nghĩa về mặt y học: Kết quả, chẳng hạn một khác biệt giữa hai nhóm, có liên quan trong thực hành y khoa.
Advertisements

Bạn nghĩ gì về bài viết này?

Filed under Think Stats

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s