Các quy trình được tổ chức để làm sạch dữ liệu


34

Từ sự say mê hạn chế của tôi với khoa học dữ liệu bằng R, tôi nhận ra rằng việc làm sạch dữ liệu xấu là một phần rất quan trọng trong việc chuẩn bị dữ liệu để phân tích.

Có bất kỳ thực hành hoặc quy trình tốt nhất để làm sạch dữ liệu trước khi xử lý nó? Nếu vậy, có công cụ tự động hoặc bán tự động nào thực hiện một số trong những thực tiễn tốt nhất này không?


1
có lẽ đó là ý tưởng tốt để xóa một chút, ý của bạn trong việc làm sạch dữ liệu , có vẻ hơi khó hiểu đối với ý kiến ​​của tôi
MolbOrg

2
Giải thích thêm về việc làm sạch dữ liệu có nghĩa là gì sẽ hữu ích. Trong ngữ cảnh nơi tôi làm việc, việc dọn dẹp không liên quan gì đến định dạng - Tôi chỉ gọi đó là phân tích cú pháp / nhập - Nhưng thay vào đó, nó có nghĩa là nói dữ liệu người dùng ồn ào và xác minh sự thống nhất. Các kỹ thuật sử dụng là dữ liệu cụ thể, từ các quy tắc thống kê đơn giản, đến các thuật toán mờ, đặc biệt là khi dữ liệu thưa thớt.
AdrianBR

Câu trả lời:


21

R có chứa một số tiêu chuẩn chức năng cho thao tác dữ liệu, có thể được sử dụng để làm sạch dữ liệu, trong mình căn cứ gói ( gsub, transform, vv), cũng như trong các gói của bên thứ ba khác nhau, chẳng hạn như stringr , Reshape / reshape2 , và plyr / dplyr . Các ví dụ và thực tiễn sử dụng tốt nhất cho các gói này và các chức năng của chúng được mô tả trong bài viết sau: http://vita.had.co.nz/ con / tidy-data.pdf .

Ngoài ra, R cung cấp một số gói đặc biệt tập trung vào làm sạch và chuyển đổi dữ liệu:

Một cách tiếp cận toàn diện và chặt chẽ để dữ liệu làm sạch trong R, bao gồm các ví dụ và sử dụng editrulesdeducorrect gói, cũng như mô tả về công việc ( framework ) của dữ liệu làm sạch trong R, được trình bày trong các giấy tờ sau đây, mà tôi khuyên bạn nên: http : //cran.r-project.org/doc/contrib/de_Jrid+van_der_Loo-Int sinhtion_to_data_cleaning_with_R.pdf .


2
Tôi cũng sẽ thêm dplyr, đó là một cách tối ưu hóa lại các plyrcông cụ nhất định và data.tablelà một cách tiếp cận hoàn toàn khác để thao tác dữ liệu. Cả hai bởi Hadley Wickham.
Shadowtalker

@ssdecontrol: Tôi đồng ý - đã cập nhật câu trả lời. Hadley là tác giả của dplyrgói, nhưng không phải là data.tablemột.
Alexanderr Blekh

16

Theo quan điểm của tôi, câu hỏi này phù hợp cho câu trả lời hai bước. Phần đầu tiên, chúng ta gọi nó là tiền xử lý mềm , có thể được coi là việc sử dụng các thuật toán khai thác dữ liệu khác nhau để xử lý dữ liệu theo cách làm cho nó phù hợp để phân tích thêm. Lưu ý rằng đây có thể là bản phân tích, trong trường hợp mục tiêu đủ đơn giản để được xử lý trong một lần bắn.

Phần thứ hai, tiền xử lý cứng , thực sự có trước bất kỳ quy trình nào khác, và có thể được coi là việc sử dụng các công cụ hoặc tập lệnh đơn giản để dọn sạch dữ liệu, chọn nội dung cụ thể cần xử lý. Đối với vấn đề này, POSIX cung cấp cho chúng ta một bộ công cụ ma thuật tuyệt vời, có thể được sử dụng để soạn thảo các kịch bản tiền xử lý ngắn gọn - và rất mạnh mẽ.

Ví dụ: đối với những người xử lý dữ liệu đến từ các trang web xã hội (twitter, facebook, ...), việc truy xuất dữ liệu thường mang lại các tệp có định dạng rất cụ thể - mặc dù không phải lúc nào cũng có cấu trúc độc đáo, vì chúng có thể chứa các trường bị thiếu, và vì vậy . Đối với những trường hợp này, một awktập lệnh đơn giản có thể dọn sạch dữ liệu, tạo ra một tệp đầu vào hợp lệ để xử lý sau. Từ tập ma thuật, người ta cũng có thể chỉ ra grep, sed, cut, join, paste, sort, và vô số toàn bộ các công cụ khác.

Trong trường hợp đơn giản, tệp nguồn có quá nhiều nitty-gritties, cũng có thể cần phải tạo ra một bó các phương thức để dọn sạch dữ liệu. Trong các trường hợp như vậy, thường sử dụng các ngôn ngữ script (trừ các ngôn ngữ shell), chẳng hạn như Python, Ruby và Perl. Điều này cho phép xây dựng các API để chọn dữ liệu cụ thể theo cách rất đơn giản và có thể sử dụng lại. Các API như vậy đôi khi được công khai bởi các tác giả của chúng, chẳng hạn như IMDbPY , Stack Exchange API và nhiều người khác.

Vì vậy, trả lời câu hỏi: có thực hành tốt nhất? Nó thường phụ thuộc vào nhiệm vụ của bạn. Nếu bạn sẽ luôn xử lý cùng định dạng dữ liệu, tốt nhất là viết một tập lệnh có tổ chức để xử lý trước; trong khi đó, nếu bạn chỉ cần một đơn giản và nhanh chóng lên sạch trên một số dữ liệu, dựa vào các công cụ POSIX cho các kịch bản ngắn gọn vỏ rằng sẽ làm toàn bộ công việc nhiều nhanh hơn so với một kịch bản Python, hoặc lâu hơn. Vì việc dọn dẹp phụ thuộc cả vào tập dữ liệu và mục đích của bạn, thật khó để hoàn thành mọi thứ. Tuy nhiên, có rất nhiều API khiến bạn gặp vấn đề.


hm - lấy dữ liệu, định dạng dữ liệu (awk sed grep Stuff), loại bỏ nhiễu như bước đầu tiên, sau đó đi sâu hơn. vì vậy ban đầu không phải là tiền xử lý cứng , nếu sử dụng máy điều nhiệt của bạn
MolbOrg

@MolbOrg Vâng, đó là những gì tôi muốn nói. Tôi đã gọi phần tiền xử lý cứng là phần kịch bản và phần tiền xử lý mềm sử dụng thuật toán khai thác dữ liệu thường làm giảm kích thước của vấn đề (dọn sạch cơ sở dữ liệu). Tôi cũng lưu ý rằng phần thứ hai, tiền xử lý cứng, thực sự đến trước bất kỳ quá trình nào khác . Nếu nó không rõ ràng với các điều khoản như vậy, tôi sẵn sàng xem xét bất kỳ đề xuất nào khác để cải thiện câu trả lời.
Rubens

1
ah vâng, đã không chú ý đầy đủ, tiền xử lý dữ liệu thô . Đã kiểm tra atm - có perl oneliner chậm hơn 3 lần so với grep) cho chuỗi 3,5kk trong 300MB, đối với perl mất 1,1 giây, trong grep 0,31 giây. Tôi bài viết cưa nơi điểm mà regexp perl là chậm, chậm hơn sau đó nó có thể là trong thực tế, (i nghi ngờ đó cũng là cho grep quá) http://swtch.com/~rsc/regexp/regexp1.html
MolbOrg

@MolbOrg Tham khảo tốt đẹp! AFAIK, grepsử dụng regex cơ bản POSIX theo mặc định và cho phép mở rộng regex POSIX khi chạy như grep -Evà cho PCRE khi chạy như grep -P.
Rubens

1
Đây là một bài viết rất tốt. R là tuyệt vời cho thao tác dữ liệu nhưng có thể khá cồng kềnh với việc làm sạch dữ liệu vì cú pháp dài dòng của nó để thao tác chuỗi và tuân thủ khá cứng nhắc các danh sách và ma trận cho cấu trúc dữ liệu.
Shadowtalker

11

Một lý do khiến việc làm sạch dữ liệu hiếm khi hoàn toàn tự động là vì có quá nhiều phán xét cần thiết để xác định "sạch" nghĩa là gì đối với vấn đề, phương pháp và mục tiêu cụ thể của bạn.

Nó có thể đơn giản như việc đưa ra các giá trị cho bất kỳ dữ liệu bị thiếu nào hoặc có thể phức tạp như chẩn đoán lỗi nhập dữ liệu hoặc lỗi chuyển đổi dữ liệu từ các quy trình tự động trước đó (ví dụ: mã hóa, kiểm duyệt, chuyển đổi). Trong hai trường hợp cuối cùng này, dữ liệu có vẻ tốt bởi bề ngoài nhưng nó thực sự sai. Chẩn đoán như vậy thường yêu cầu phân tích và kiểm tra thủ công, và cả thông tin ngoài băng như thông tin về nguồn dữ liệu và phương pháp họ sử dụng.

Ngoài ra, một số phương pháp phân tích dữ liệu hoạt động tốt hơn khi dữ liệu bị lỗi hoặc bị thiếu để trống (hoặc N / A) thay vì bị bỏ qua hoặc đưa ra một giá trị mặc định. Điều này đúng khi có các đại diện rõ ràng về sự không chắc chắn và thiếu hiểu biết, chẳng hạn như các chức năng Niềm tin của Dempster-Shafer.

Cuối cùng, thật hữu ích khi có chẩn đoán và số liệu cụ thể cho quy trình làm sạch. Các giá trị bị thiếu hoặc sai được phân phối ngẫu nhiên hoặc chúng được tập trung theo bất kỳ cách nào có thể ảnh hưởng đến kết quả phân tích. Thật hữu ích để kiểm tra tác động của các chiến lược hoặc thuật toán làm sạch thay thế để xem liệu chúng có ảnh hưởng đến kết quả cuối cùng hay không.

Trước những lo ngại này, tôi rất nghi ngờ về bất kỳ phương pháp hoặc quy trình nào xử lý việc làm sạch dữ liệu theo cách hời hợt, ung dung hoặc hoàn toàn tự động. Có rất nhiều ác quỷ ẩn trong những chi tiết đó và nó trả tiền để khiến chúng chú ý nghiêm trọng.


1
Như một bình luận phụ: Tôi nghĩ rằng việc phát hiện ra dữ liệu ảm đạm gây ra bởi một số vấn đề tiếp theo là một kỹ năng vàng. Nhiều lần tôi đã tự hỏi tại sao phân tích của tôi tạo ra kết quả kỳ lạ và khi tôi nhìn vào đường ống, tôi thấy một số lỗi. Ví dụ: Tôi tự hỏi tại sao tất cả dữ liệu của tôi bị lệch nhiều về giá cao - CÁCH ra khỏi mô hình tinh thần của tôi. Khi tôi hỏi xung quanh, tôi phát hiện ra rằng một số nhà thầu phụ đã hiểu nhầm về việc giao ban và cung cấp dữ liệu cho các nhóm thu nhập cao, trong khi chúng tôi đã đưa ra dữ liệu hỗn hợp ...
Christian Sauer

Vâng! Lỗi dữ liệu thường là dấu hiệu của các vấn đề quá trình. Biết nơi trong quá trình các lỗi được đưa ra và cũng là cơ chế, sẽ giúp ích rất nhiều cho quá trình làm sạch. Nhưng tốt hơn vẫn là khắc phục các vấn đề về quy trình để chúng tạo ra dữ liệu sạch (hoặc sạch hơn).
MrMeritology

5

Về làm sạch tự động: Bạn thực sự không thể tự động làm sạch dữ liệu, vì số lượng lỗi và định nghĩa của lỗi thường phụ thuộc vào dữ liệu. Ví dụ: Cột "Thu nhập" của bạn có thể chứa các giá trị âm, đó là một lỗi - bạn phải làm gì đó về các trường hợp. Mặt khác, một cột "tiết kiệm hàng tháng" có thể chứa các giá trị âm một cách hợp lý.

Các lỗi như vậy phụ thuộc nhiều vào miền - vì vậy, để tìm ra chúng, bạn phải có kiến ​​thức về miền, một thứ mà con người vượt trội, quy trình tự động không quá nhiều.

Nơi bạn có thể và nên tự động hóa là các dự án lặp đi lặp lại. Ví dụ, một báo cáo phải được sản xuất hàng tháng. Nếu bạn phát hiện ra lỗi, bạn nên đặt một số quy trình tự động có thể phát hiện ra các loại lỗi này trong các tháng tiếp theo, giải phóng thời gian của bạn.


5

Tôi nghĩ rằng không có kỹ thuật phổ biến để "làm sạch" dữ liệu trước khi thực hiện nghiên cứu thực tế. Mặt khác, tôi đang hướng tới thực hiện nhiều nghiên cứu có thể tái tạo nhất có thể. Bằng cách thực hiện nghiên cứu tái sản xuất, nếu bạn sử dụng các kỹ thuật làm sạch có lỗi hoặc với các thông số / giả định kém, nó có thể bị người khác phát hiện.

Có gói R đẹp đan giúp rất nhiều trong nghiên cứu tái sản xuất.

Tất nhiên, không phải tất cả các nghiên cứu đều có thể được sao chép hoàn toàn (ví dụ: dữ liệu Twitter trực tiếp), nhưng ít nhất bạn có thể ghi lại các bước làm sạch, định dạng và tiền xử lý một cách dễ dàng.

Bạn có thể kiểm tra đánh giá của tôi đã chuẩn bị cho khóa học Nghiên cứu sinh sản tại Coursera .


3

OpenRefine (trước đây là Google Refine) là một công cụ tuyệt vời nơi bạn có thể tương tác thực hiện việc dọn dẹp và biến đổi dữ liệu. Đầu ra cuối cùng của bạn có thể được xuất sang nhiều định dạng tiêu chuẩn (json, csv) hoặc bất kỳ định dạng tùy chỉnh nào (ví dụ: wiki).

Các bản sao chính xác có thể được xử lý trong OpenRefine bằng cách sắp xếp + sử dụng tính năng "để trống". Ngoài ra, nó có tính năng phân cụm chuỗi gần đúng (mờ) trong đó bạn có thể nhóm các bản sao tìm kiếm tương tự như tên công ty hoặc địa chỉ. Tính năng này một mình làm cho nó tuyệt vời.


1
Đây là một công cụ tuyệt vời, báo cáo dưới.
cảm ơn_in_advance

2

Có toàn bộ khóa học dành cho việc này ở Coursera. Bạn có thể muốn xem qua các kỹ thuật họ đề cập và phần quan trọng là biết khi nào nên sử dụng cái gì.

https://www.coursera.org/learn/data-cleaning

Luôn luôn tốt hơn để làm điều đó bằng tay thay vì tự động hóa vì mỗi tập dữ liệu có vấn đề và vấn đề riêng và không phải tất cả các bước đều có thể áp dụng cho tất cả các bộ dữ liệu.

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.