Suy ra các ngày có khả năng dựa trên các ngày liên quan khác trong tập dữ liệu không đầy đủ


7

Tôi đang thực hiện những bước đầu tiên của tôi trong khoa học dữ liệu và học máy. Tôi đang thử nghiệm một dự án mà tôi không biết ngay cả những cách tiếp cận nào tôi có thể bắt đầu, vì vậy tôi đánh giá cao bất kỳ khách hàng tiềm năng nào:

Tôi có một bộ dữ liệu (để giải thích vì lợi ích) của sinh viên tốt nghiệp. Tập dữ liệu hoàn chỉnh ở chỗ nó chứa toàn bộ dân số; tất cả các hồ sơ nên có một ngày tốt nghiệp.

Tuy nhiên, do thất bại trong việc lưu giữ hồ sơ, hồ sơ cũ có ngày tốt nghiệp bị mất tích.

Nó có các tính năng sau:

  • Để tốt nghiệp từ năm 2014, chúng tôi có bằng tốt nghiệp
  • Đối với tốt nghiệp trước năm 2014, ngày tốt nghiệp bị thiếu
  • Đối với tất cả học sinh, chúng tôi có một ngày sinh
  • Đối với nhiều sinh viên, tốt nghiệp sẽ tương quan với ngày sinh. Ví dụ, thường có thể họ tốt nghiệp 21 năm sau khi họ được sinh ra. Tuy nhiên, một số sẽ là sinh viên trưởng thành để họ có thể tốt nghiệp nhiều năm sau 21 tuổi.
  • ID chứng chỉ nhiều hoặc ít hơn theo thứ tự và số. Có thể giả định rằng ID chứng chỉ gần nhau do đó đại diện cho sinh viên tốt nghiệp cùng một lúc
  • Phép ẩn dụ có phần thiếu sót; cho rằng sinh viên có thể tốt nghiệp vào bất cứ ngày nào

Thách thức của tôi là tạo ra một cách tiếp cận có thể suy ra ngày tốt nghiệp cho tất cả sinh viên, dựa trên ngày sinh.

Cách tiếp cận tôi đã suy nghĩ về việc đi một cái gì đó như thế này:

  1. Đối với tất cả các sinh viên có sẵn cả hai ngày, hãy chọn một chế độ (tốt nghiệp_age)
  2. Nhóm các sinh viên vào các thùng của (giả sử) 1000, theo ID chứng chỉ tuần tự
  3. Tìm tháng và năm sinh phổ biến nhất cho các sinh viên trong mỗi thùng
  4. Thêm chế độ (tốt nghiệp_age) vào tháng / năm phổ biến nhất cho một thùng cụ thể và gán đó là tốt nghiệp_date cho tất cả học sinh trong thùng

Một mẫu trong gấu trúc có thể trông giống như:

graduations = [
       # Old data with missing graduation dates
       {'certificate_id': '090029, 'birth_date': '01/01/1983', 'graduation_date': NaT},
       {'certificate_id': '090048, 'birth_date': '04/01/1983', 'graduation_date': NaT},
       ...
       # This is 'normal' students graduating roughly 21 years after
       # their birth date
       {'certificate_id': '120015, 'birth_date': '01/01/1993', 'graduation_date': 01/03/2014},
       {'certificate_id': '120019, 'birth_date': '01/04/1993', 'graduation_date': 04/03/2014},
       # However there are many exceptions, mature students or those
       # graduating early
       {'certificate_id': '120150, 'birth_date': '01/01/1966', 'graduation_date': 05/03/2014},
       {'certificate_id': '120155, 'birth_date': '01/04/1996', 'graduation_date': 06/03/2014}, 
       ]

       df = pd.DataFrame(graduations)

Bất kỳ trợ giúp sẽ được đánh giá cao, ngay cả khi bạn có thể cho tôi biết loại vấn đề này được gọi là gì để tôi có thể nghiên cứu thêm hoặc để cho tôi biết điều đó là không thể với bộ dữ liệu này. Tôi hiện không chắc chắn các thẻ chính xác là gì!


4
Bạn có một số cơ hội ấn tượng để tạo ra những thành kiến ​​sâu sắc nhưng tinh tế. Có lẽ điều quan trọng nhất để nhận ra mối quan tâm về sự thiên vị trong mẫu phụ của bạn về ngày tốt nghiệp đã biết. Đây không phải là đại diện, bởi vì vẫn có thể có nhiều sinh viên (lớn tuổi) chưa tốt nghiệp - và do đó sẽ có xu hướng mất nhiều thời gian hơn hầu hết. Nó giống như vấn đề nghĩa trang nổi tiếng: khi bạn lượm lặt ngày sinh và ngày mất từ ​​bia mộ, bạn sẽ kết luận rằng tuổi thọ gần đây đã tăng lên đáng kể!
whuber

Cảm ơn bình luận của bạn. Tôi nghĩ rằng tôi có thể đã vượt quá mức tương tự trong một nỗ lực để làm cho mọi thứ đơn giản hơn. Trong trường hợp này, có thể giả định rằng tất cả các hồ sơ trong bộ dữ liệu nên có ngày tốt nghiệp. Đó là, chúng là các hồ sơ lịch sử - dữ liệu không đầy đủ do lỗi lưu giữ hồ sơ thay vì lấy mẫu. Bộ hồ sơ là một quần thể hoàn chỉnh, chỉ thiếu dữ liệu trong một cột.
phần nào đó là

1
Thông tin đó có tầm quan trọng cơ bản đến mức bạn nên chỉnh sửa bài đăng của mình để đưa nó vào.
whuber

1
Cảm ơn bạn đã bình luận @ DavidC.Norris; nói chung tôi nghĩ rằng nó là chính xác trong gấu trúc để sử dụng NaNcho NULL. Xem: pandas.pydata.org/pandas-docs/urdy/missing_data.html . Tuy nhiên, đọc lại một lần nữa tôi phát hiện ra rằng về mặt kỹ thuật tôi nên có NaT(không phải là một thời gian) - tôi đã chỉnh sửa điều này.
phần nào

2
Mọi người đã gợi ý một cách tinh tế và tôi nghĩ rằng tôi thực sự sẽ tuyên bố: Nếu bạn có thể suy nghĩ lại về phân tích của mình để coi dữ liệu này là bị kiểm duyệt thay vì cố gắng áp đặt ngày, tôi thực sự nghĩ bạn nên làm điều đó. Bạn không cung cấp đủ chi tiết để biết liệu đây có phải là một gợi ý hợp lý hay không. Nhưng nếu những gì bạn đang sử dụng ngày tháng là để tính thời gian họ tốt nghiệp, thì đó là một vấn đề kiểm duyệt có thể được xử lý theo nhiều cách khác nhau.
StatNoodle

Câu trả lời:


1

Bạn đã mô tả một vấn đề dữ liệu bị thiếu , và cụ thể là một trong những kiểm duyệt . (Là một thiết bị ghi nhớ để giữ kiểm duyệt thẳng trong đầu tôi từ hiện tượng tương tự cắt ngắn , tôi thích nghĩ về văn bản trong một báo cáo bôi đen-out bởi 'kiểm duyệt'. Bạn biết đó một từ hoặc câu đó, nhưng bạn chỉ cần don 'Tôi không biết nó nói gì , đây là tình huống của bạn với' ngày tốt nghiệp 'của bạn. Ngược lại, nếu 2 chương cuối của báo cáo bị bỏ qua một cách âm thầm, thì báo cáo đã bị cắt ngắn . Trong trường hợp này, không chỉ bạn sẽ không biết những gì là trong những chương, nhưng bạn thậm chí sẽ không biết nếu có đãbất kỳ chương nào. Đáng chú ý, câu hỏi của @ whuber ở trên là về việc phân biệt sự khác biệt này trong dữ liệu của bạn.)

Trong vấn đề dữ liệu bị thiếu cụ thể này, bạn có một cơ chế dữ liệu bị thiếu khá đơn giản : ngày bị thiếu chính xác khi 'tốt nghiệp' xảy ra trước năm 2014. Nếu bạn đang giải quyết vấn đề đồng nhất thời gian thiếu bất kỳ xu hướng thế tục quan trọng nào, thì bạn có thể coi thực tế này là một lợi thế. Trong trường hợp đó, bạn không gặp phải tình huống thiếu dữ liệu vì một số lý do có thể cung cấp thông tin về một số đặc điểm cực kỳ quan trọng của 'học sinh'.

Trong dữ liệu bị mất biệt ngữ, thuật ngữ cụ thể cho những gì bạn đang cố gắng làm là để quy cho ngày mất tích. Tất nhiên, mục đích của việc buộc tội là cho phép bạn giữ lại các hồ sơ với các giá trị còn thiếu, để tránh thực tiễn thời trung cổ của cái gọi là phân tích trường hợp hoàn chỉnh , liên quan đến việc thực hiện dữ liệu tuyệt vời trong các lĩnh vực khác trong khung dữ liệu của bạn cho 'tội phạm 'Của' liên kết 'với một giá trị ngày bị thiếu. (Tôi đã giả định rằng bạn làm trong thực tế có rất nhiều cột trong dữ liệu của bạn mà bạn đã bỏ qua từ khung dữ liệu ví dụ của bạn, nó là sự tồn tại của các thông tin có giá trị trong các cột bổ sung đó sẽ biện minh cho một mong muốn thực hiện sự đổ tội như vậy.)

Theo như một số đọc tốt về dữ liệu bị thiếu , thực hiện tra cứu Wikipedia về các thuật ngữ in nghiêng khác nhau trong câu trả lời của tôi sẽ là một khởi đầu tốt. Tài liệu tham khảo chính tắc về "Suy luận và dữ liệu bị thiếu" là Rubin 1976 . Nếu bạn là người có khuynh hướng Bayes thì việc xử lý tiền phạt (mặc dù đầy thách thức) trong Chương 8 của BDA3 có thể được sử dụng cho bạn. Thay vào đó, bạn có thể tận hưởng phần giới thiệu thực tế về phần mềm thông qua việc khám phá phần mềm như MICE . (Xin lỗi tôi không biết về các lựa chọn Pythonic về vấn đề này, nhưng tôi phải cho rằng có một số.)


Để giải quyết một câu hỏi được hỏi bởi @CliffAB trong bình luận bên dưới, có thể hữu ích khi đối chiếu cách tiếp cận dựa trên tranh luận đã chọn của bạn với các cách tiếp cận khác, 'fancier' để kiểm duyệt. Ví dụ phổ biến nhất về kiểm duyệt trong phân tích dữ liệu xảy ra trong bối cảnh các mô hình tồn tại (theo thời gian đến sự kiện) . (Xem ở đây để biết lý do tại sao lại như vậy.) Các mô hình sống sót sử dụng ước tính của hàm sống sót , cho dù có được theo kiểu tham số hay không tham số , và các mô hình quá trình này hỗ trợ suy luận mà không thực hiện việc bỏ qua rõ ràng về thời gian sự kiện bị mất. Bạn rất có thể tấn công dữ liệu của mình bằng các cách tiếp cận như thế này và không bao giờ phải áp đặt một giá trị duy nhất!

Một điểm cuối cùng: Tôi đặt 'fancier' trong các trích dẫn sợ hãi ở trên vì một lý do. Giả sử bạn đã thực hiện mô hình thời gian đến sự kiện awesomest bao giờ, cho vấn đề hiện tại của bạn. Thực tế, giả sử mô hình của bạn rất tuyệt vời, trên thực tế, bạn không thể ước tính được bằng MCMC . Mã MCMC của bạn sẽ luôn luôn coi các lần bị thiếu là các biến tiềm ẩn và chắc chắn sẽ có một dòng trong mã của bạn nơi bạn tạo số giả ngẫu nhiên và sử dụng nó để điền vào biến tiềm ẩn đó. Do đó, bạn sẽ thấy mình 'buộc tội' dữ liệu còn thiếu của mình, mặc dù theo cách có tính nguyên tắc và mạch lạc nhất có thể tưởng tượng được.


1
Một vài lưu ý: trong khi tôi khá chắc chắn tôi biết ý của bạn về kiểm duyệt so với cắt ngắn, tôi nghĩ thật khó hiểu khi đưa vào một ví dụ nghe có vẻ như kiểm duyệt khi mô tả kiểm duyệt. Thứ hai, kiểm duyệt là một loại dữ liệu bị thiếu rất đặc biệt: đó là thông tin một phần, không giống như NA hoàn toàn không có ý nghĩa. Không rõ ràng với tôi tại thời điểm MICE kiểm duyệt dữ liệu, nhưng tôi tin rằng bạn có thể. Bạn có biết làm thế nào MICE xử lý nó?
Vách đá AB

1
@CliffAB, cảm ơn bạn đã bình luận + câu hỏi của bạn. Tôi đã làm rõ rằng tất cả những gì nói về 'kiểm duyệt' hoàn toàn là lời đề nghị khiêm tốn của tôi về một thiết bị ghi nhớ. Câu hỏi về thành ngữ mã hóa thích hợp cho dữ liệu ( NAvấn đề) nên được phân biệt với các vấn đề về mô hình hóa . Cả dữ liệu bị cắt và kiểm duyệt sẽ được mã hóa như NAtrong R (hoặc .bằng SAS). Nhưng cách người lập mô hình xử lý các 'mục' như vậy phụ thuộc vào bản chất / cơ chế của 'sự thiếu'.
David C. Norris

1
@CliffAB, khi tôi sử dụng bản thân mình, thông thường là thông qua gói Hisc của Frank Harrell (thông qua rms ). Việc trích dẫn MICE của tôi là một nỗ lực hướng OP đến một gói tập trung đặc biệt vào vấn đề của OP, nhưng theo hiểu biết của tôi thì rmssử dụng thuật toán giống như MICE.
David C. Norris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.