Là một ứng dụng ví dụ, hãy xem xét hai thuộc tính của người dùng Stack Overflow: danh tiếng và số lượt xem hồ sơ .
Đối với hầu hết người dùng, hai giá trị này sẽ tỷ lệ thuận với nhau: người dùng đại diện cao thu hút nhiều sự chú ý hơn và do đó có được nhiều lượt xem hồ sơ hơn.
Do đó, thật thú vị khi tìm kiếm người dùng có nhiều lượt xem hồ sơ so với tổng danh tiếng của họ.
Điều này có thể chỉ ra rằng người dùng đó có một nguồn danh tiếng bên ngoài. Hoặc có thể chỉ là họ có hình ảnh và tên hồ sơ kỳ quặc thú vị.
Về mặt toán học, mỗi điểm mẫu hai chiều là một người dùng và mỗi người dùng có hai giá trị tích phân từ 0 đến + vô cùng:
- uy tín
- số lượt xem hồ sơ
Hai tham số này được dự kiến sẽ phụ thuộc tuyến tính và chúng tôi muốn tìm các điểm mẫu là các ngoại lệ lớn nhất cho giả định đó.
Tất nhiên, giải pháp ngây thơ sẽ chỉ là lấy quan điểm hồ sơ, chia theo danh tiếng và sắp xếp.
Tuy nhiên, điều này sẽ cho kết quả không có ý nghĩa thống kê. Ví dụ: nếu một người dùng trả lời về câu hỏi, có 1 upvote và vì lý do nào đó có 10 lượt xem hồ sơ, dễ giả mạo, thì người dùng đó sẽ xuất hiện trước một ứng cử viên thú vị hơn có 1000 lượt xem và 5000 lượt xem hồ sơ .
Trong trường hợp sử dụng "thế giới thực" hơn, chúng ta có thể cố gắng trả lời ví dụ "khởi nghiệp nào là kỳ lân có ý nghĩa nhất?". Ví dụ: Nếu bạn đầu tư 1 đô la với vốn chủ sở hữu nhỏ, bạn tạo một con kỳ lân: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656
Bê tông sạch dễ sử dụng dữ liệu thế giới thực
Để kiểm tra giải pháp của bạn cho vấn đề này, bạn chỉ có thể sử dụng tệp nhỏ được xử lý trước (75M, ~ 10 triệu người dùng) được trích xuất từ kết xuất dữ liệu Stack Overflow 2019-03 :
wget https://github.com/cirosantilli/media/raw/master/stack-overflow-data-dump/2019-03/users_rep_view.dat.7z
7z x users_rep_view.dat.7z
tạo ra tệp được mã hóa UTF-8 users_rep_view.dat
có định dạng phân tách không gian văn bản đơn giản rất đơn giản:
Id Reputation Views DisplayName
-1 1 649 Community
1 45742 454747 Jeff_Atwood
2 3582 24787 Geoff_Dalgas
3 13591 24985 Jarrod_Dixon
4 29230 75102 Joel_Spolsky
5 39973 12147 Jon_Galloway
8 942 6661 Eggs_McLaren
9 15163 5215 Kevin_Dente
10 101 3862 Sneakers_O'Toole
Đây là cách dữ liệu trông như thế nào trên thang đo log:
Sau đó, sẽ rất thú vị để xem liệu giải pháp của bạn có thực sự giúp chúng tôi khám phá những người dùng kỳ quặc mới chưa biết!
Dữ liệu ban đầu được lấy từ kết xuất dữ liệu 2019-03 như sau:
wget https://archive.org/download/stackexchange/stackoverflow.com-Users.7z
# Produces Users.xml
7z x stackoverflow.com-Users.7z
# Preprocess data to minimize it.
./users_xml_to_rep_view_dat.py Users.xml > users_rep_view.dat
7z a users_rep_view.dat.7z users_rep_view.dat
sha256sum stackoverflow.com-Users.7z users_rep_view.dat.7z > checksums
Nguồn chousers_xml_to_rep_view_dat.py
.
Sau khi chọn các ngoại lệ của bạn bằng cách sắp xếp lại users_rep_view.dat
, bạn có thể nhận danh sách HTML có siêu liên kết để xem nhanh các lựa chọn hàng đầu với:
./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html
Nguồn chousers_rep_view_dat_to_html.py
.
Kịch bản này cũng có thể phục vụ như một tài liệu tham khảo nhanh về cách đọc dữ liệu vào Python.
Phân tích dữ liệu thủ công
Ngay lập tức bằng cách nhìn vào biểu đồ gnuplot, chúng ta thấy điều đó như mong đợi:
- dữ liệu là một tỷ lệ xấp xỉ, với phương sai lớn hơn cho người dùng có số lượt xem thấp hoặc số người xem thấp
- Người dùng ít đại diện hoặc số lượt xem thấp thì rõ ràng hơn, điều đó có nghĩa là họ có ID tài khoản cao hơn, điều đó có nghĩa là tài khoản của họ mới hơn
Để có được một số trực giác về dữ liệu, tôi muốn đi sâu vào một số điểm xa trong một số phần mềm vẽ đồ họa tương tác.
Gnuplot và Matplotlib không thể xử lý một tập dữ liệu lớn như vậy, vì vậy tôi đã cho VisIt một lần chụp đầu tiên và nó đã hoạt động. Dưới đây là tổng quan chi tiết về tất cả các phần mềm vẽ đồ họa mà tôi đã thử: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461
OMG thật khó để chạy. Tôi phải:
- tải về thực thi thủ công, không có gói Ubuntu
- chuyển đổi dữ liệu sang CSV bằng cách hack
users_xml_to_rep_view_dat.py
nhanh chóng vì tôi không thể dễ dàng tìm thấy cách cung cấp cho các tệp được phân tách không gian (bài học đã học, lần sau tôi sẽ đi thẳng vào CSV) - chiến đấu trong 3 giờ với UI
- kích thước điểm mặc định là một pixel, bị lẫn với bụi trên màn hình của tôi. Di chuyển đến các hình cầu 10 pixel
- có một người dùng có 0 lượt xem hồ sơ và VisIt đã từ chối thực hiện âm mưu logarit, vì vậy tôi đã sử dụng các giới hạn dữ liệu để thoát khỏi điểm đó. Điều này nhắc nhở tôi rằng gnuplot rất dễ dãi, và sẽ vui vẻ vạch ra bất cứ điều gì bạn ném vào nó.
- thêm tiêu đề trục, xóa tên người dùng và những thứ khác trong "Điều khiển"> "Chú thích"
Đây là cách cửa sổ VisIt của tôi trông giống như sau khi tôi cảm thấy mệt mỏi với công việc thủ công này:
Chữ cái là những điểm mà tôi đã chọn thủ công với tính năng Chọn tuyệt vời:
- bạn có thể thấy Id chính xác cho từng điểm bằng cách tăng độ chính xác của dấu phẩy động trong cửa sổ Chọn> "Định dạng nổi" thành
%.10g
- sau đó bạn có thể kết xuất tất cả các điểm đã chọn vào một tệp txt với "Lưu chọn dưới dạng". Điều này cho phép chúng tôi tạo một danh sách có thể nhấp các URL hồ sơ thú vị với một số xử lý văn bản cơ bản
TODOs, tìm hiểu làm thế nào để:
- Xem các chuỗi tên hồ sơ, chúng được chuyển đổi thành 0 theo mặc định. Tôi vừa dán Id hồ sơ vào trình duyệt
- chọn tất cả các điểm trong một hình chữ nhật trong một lần
Và cuối cùng, đây là một vài người dùng có thể sẽ hiển thị cao khi đặt hàng của bạn:
người dùng đại diện rất thấp với số lượt xem khổng lồ và hồ sơ thông tin thấp.
Những người dùng này có khả năng chuyển hướng lưu lượng truy cập từ một nơi nào đó.
Liên quan: đã có một chủ đề meta cho thao tác huy hiệu vàng câu hỏi nổi tiếng của người dùng, nhưng tôi không thể tìm thấy nó ngay bây giờ.
Nếu có quá nhiều người dùng như vậy, thì phân tích của chúng tôi sẽ khó khăn và chúng tôi cần cố gắng xem xét các tham số khác để tránh "gian lận" như vậy:
- A 1 143100 2445750 /programming//users/2445750/muhammad-mahtab-saleem
- D 60 51111 2139869 /programming//users/2139869/xxn
- 40 4067 5740196 /programming//users/5740196/listcrawler
- F 11 7738 3313079 /programming//users/3313079/rikitikitaco
- G 136 11123 4102129 /programming//users/4102129/abhishek-deshpande
- K 377 24453 1012351 /programming//users/1012351/overstack
- L 1489 57515 1249338 /programming//users/1249338/frosty
- M 1767 40986 2578799 /programming//users/2578799/naresh-walia
- Tôi thấy cụm người dùng này thú vị, tất cả đều ở gần trong biểu đồ:
- H 58 4331 1818755 /programming//users/1818755/eerongal
- Tôi 103 4366 1816274 /programming//users/1816274/angelov
- J 157 4688 688552 /programming//users/688552/oylex
danh tiếng bên ngoài:
- O 29799 170854 2274694 /programming//users/2274694/lyndsey-scottex Mô hình bí mật của Victoria: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 /programming//users/1/jeff-atwood SO đồng sáng lập
- Y 29230 75102 4 /programming//users/4/joel-spolsky SO đồng sáng lập
- người dùng có uy tín cao nhất có xu hướng nhận được nhiều lượt xem hồ sơ hơn vì họ xuất hiện trên "danh sách người dùng có danh tiếng cao nhất" truy vấn / danh sách của Google:
- U 542861 401220 88656 /programming//users/88656/eric-lippert tham gia thiết kế C #
- V 852319 396830 157882 /programming//users/157882/balusc người dùng số 2 hàng đầu, vô số câu trả lời điên rồ
hồ sơ kỳ quặc:
- N 13690 108073 63550 /programming//users/63550/peter-mortensen Đó là hình ảnh của chính mình! Tôi cũng nghĩ rằng anh ấy là một người điều hành trước đây.
- R 143904 144287 895245 /programming//users/895245/ciro-santilli-%e6%96%b0%e7%96%86%e6%94%b9%e9%80%a0%e4%b8%ad % e5% bf% 83996icu% e5% 85% quảng cáo% e5% 9b% 9b% e4% ba% 8b% e4% bb% b6
- T 291742 161929 560648 /programming//users/560648/lightness-races-in-orbit
người dùng đại diện cao đã bị đình chỉ tại thời điểm đó. Ah, đại diện ngớ ngẩn của bạn đi đến 1 quy tắc:
- B 1 77456 285587 /programming//users/285587/your-common-sense
không chắc chắn, tôi muốn nói thao tác xem:
- Q 65788 126085 50776 /programming//users/50776/casperone
- S 15655 81541 293594 /programming//users/293594/xnx
- W 12019 37047 2227834 /programming//users/2227834/unheilig
- X 1421 27963 1255427 /programming//users/1255427/jack-nicholson
Phương pháp khả thi
Tôi đã nghe về khoảng tin cậy của điểm Wilson từ https://www.evanmiller.org/how-not-to-sort-by-aenses-rating.html trong đó "cân bằng [tỷ lệ] tỷ lệ xếp hạng tích cực với độ không chắc chắn của một số lượng nhỏ các quan sát ", nhưng tôi không chắc làm thế nào để ánh xạ vấn đề đó.
Trong bài đăng trên blog đó, tác giả khuyến nghị thuật toán đó để tìm các mục có nhiều upvote hơn downvote, nhưng tôi không chắc liệu ý tưởng tương tự có áp dụng cho vấn đề xem upvote / hồ sơ hay không. Tôi đã nghĩ đến việc dùng:
- lượt xem hồ sơ == upvotes there
- upvotes here == downvotes there (cả "xấu")
nhưng tôi không chắc liệu nó có hợp lý hay không bởi vì trong vấn đề tăng / giảm, mỗi mục được sắp xếp có N 0/1 sự kiện bình chọn. Nhưng về vấn đề của tôi, mỗi mục có hai sự kiện liên quan đến nó: nhận upvote và nhận chế độ xem hồ sơ.
Có một thuật toán nổi tiếng nào mang lại kết quả tốt cho loại vấn đề này không? Ngay cả khi biết tên vấn đề chính xác sẽ giúp tôi tìm thấy tài liệu hiện có.
Thư mục
- https://meta.stackoverflow.com/questions/307117/are-profile-view-on-stack-overflow-poseitively-correlated-to-the-level-of-reputa
- Kiểm tra ngoại lệ bivariate
- /programming/41462073/multivariate-outlier-detection-USE-r-with-probability
- Có một cách đơn giản để phát hiện các ngoại lệ?
- Làm thế nào các ngoại lệ nên được xử lý trong phân tích hồi quy tuyến tính?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
Đã thử nghiệm trong Ubuntu 18.10, VisIt 2.13.3.