Sebagai contoh aplikasi, pertimbangkan dua properti berikut pengguna Stack Overflow: reputasi dan jumlah tampilan profil .
Diharapkan bahwa bagi sebagian besar pengguna, kedua nilai tersebut akan proporsional: pengguna tingkat tinggi menarik lebih banyak perhatian dan karenanya mendapatkan lebih banyak tampilan profil.
Karena itu, menarik untuk mencari pengguna yang memiliki banyak tampilan profil dibandingkan dengan total reputasi mereka.
Ini dapat menunjukkan bahwa pengguna tersebut memiliki sumber ketenaran eksternal. Atau mungkin hanya karena mereka memiliki gambar dan nama profil unik yang menarik.
Lebih matematis, setiap titik sampel dua dimensi adalah pengguna, dan setiap pengguna memiliki dua nilai integral mulai dari 0 hingga + tak terhingga:
- reputasi
- jumlah tampilan profil
Kedua parameter tersebut diharapkan akan bergantung secara linear, dan kami ingin mencari titik sampel yang merupakan outlier terbesar untuk asumsi tersebut.
Solusi naif tentu saja dengan hanya mengambil tampilan profil, dibagi berdasarkan reputasi, dan urutkan.
Namun, ini akan memberikan hasil yang tidak bermakna secara statistik. Misalnya, jika pengguna menjawab pertanyaan, mendapat 1 upvote, dan karena alasan tertentu memiliki 10 tampilan profil, yang mudah dipalsukan, maka pengguna itu akan muncul di depan kandidat yang jauh lebih menarik yang memiliki 1000 upvotes dan 5000 tampilan profil. .
Dalam kasus penggunaan yang lebih "dunia nyata", kita dapat mencoba menjawab misalnya "startup mana yang paling bermakna unicorn?". Misalnya, jika Anda menginvestasikan 1 dolar dengan ekuitas kecil, Anda membuat unicorn: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656
Data nyata dari dunia nyata yang bersih dan mudah digunakan
Untuk menguji solusi Anda untuk masalah ini, Anda bisa menggunakan file praproses kecil (75M terkompresi, ~ 10M pengguna) yang diekstrak dari dump data 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
yang menghasilkan file users_rep_view.dat
yang disandikan UTF-8 yang memiliki format dipisahkan ruang teks biasa yang sangat sederhana:
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
Begini tampilannya data pada skala log:
Maka akan menarik untuk melihat apakah solusi Anda benar-benar membantu kami menemukan pengguna aneh baru yang tidak dikenal!
Data awal diperoleh dari dump data 2019-03 sebagai berikut:
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
Sumber untukusers_xml_to_rep_view_dat.py
.
Setelah memilih outlier Anda dengan memesan ulang users_rep_view.dat
, Anda bisa mendapatkan daftar HTML dengan hyperlink untuk dengan cepat melihat pilihan teratas dengan:
./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html
Sumber untukusers_rep_view_dat_to_html.py
.
Script ini juga bisa berfungsi sebagai referensi cepat tentang cara membaca data ke Python.
Analisis data manual
Segera dengan melihat grafik gnuplot kita melihat bahwa seperti yang diharapkan:
- datanya kira-kira proporsional, dengan varian yang lebih besar untuk pengguna dengan rep rendah atau jumlah tampilan rendah
- rep rendah atau jumlah tampilan rendah pengguna lebih jelas, yang berarti bahwa mereka memiliki ID akun yang lebih tinggi, yang berarti bahwa akun mereka lebih baru
Untuk mendapatkan intuisi tentang data, saya ingin menelusuri beberapa poin yang jauh dalam beberapa perangkat lunak plot interaktif.
Gnuplot dan Matplotlib tidak bisa menangani dataset sebesar itu, jadi saya memberi VisIt kesempatan untuk pertama kalinya dan itu berhasil. Berikut ini adalah ikhtisar terperinci dari semua perangkat lunak yang telah saya coba: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461
OMG itu sulit dijalankan. Saya harus:
- unduh executable secara manual, tidak ada paket Ubuntu
- mengonversi data ke CSV dengan meretas dengan
users_xml_to_rep_view_dat.py
cepat karena saya tidak dapat dengan mudah menemukan cara memberi makan file-file yang dipisahkan oleh ruang (pelajaran dipelajari, lain kali saya akan langsung menuju CSV) - berjuang selama 3 jam dengan UI
- ukuran titik default adalah pixel, yang menjadi bingung dengan debu di layar saya. Pindah ke bola 10 piksel
- ada pengguna dengan 0 profil view, dan VisIt dengan benar menolak untuk melakukan plot logaritma, jadi saya menggunakan batasan data untuk menyingkirkan titik itu. Ini mengingatkan saya bahwa gnuplot sangat permisif, dan dengan senang hati akan merencanakan apa pun yang Anda lemparkan padanya.
- tambahkan judul sumbu, hapus nama pengguna, dan hal-hal lain di bawah "Kontrol"> "Anotasi"
Begini tampilan jendela Visit saya setelah saya bosan dengan pekerjaan manual ini:
The Letters adalah poin yang saya pilih secara manual dengan fitur Pilihan yang luar biasa:
- Anda dapat melihat ID yang tepat untuk setiap titik dengan meningkatkan presisi titik apung di jendela Pilihan> "Format Float" ke
%.10g
- Anda kemudian dapat membuang semua poin pilihan tangan ke file txt dengan "Simpan Pilihan sebagai". Ini memungkinkan kami untuk menghasilkan daftar URL profil menarik yang dapat diklik dengan beberapa pemrosesan teks dasar
TODO, pelajari cara:
- lihat string nama profil, mereka dapat dikonversi ke 0 secara default. Saya baru saja menempel Id profil ke browser
- pilih semua poin dalam persegi panjang sekaligus
Dan akhirnya, berikut adalah beberapa pengguna yang mungkin akan menunjukkan pesanan Anda:
pengguna rep sangat rendah dengan jumlah tampilan sangat besar dan profil informasi rendah.
Pengguna ini sepertinya mengarahkan lalu lintas dari suatu tempat entah bagaimana.
Terkait: ada meta utas untuk manipulasi badge pertanyaan emas terkenal oleh pengguna, tapi saya tidak bisa menemukannya sekarang.
Jika ada terlalu banyak pengguna seperti itu, maka analisis kami akan sulit, dan kami perlu mencoba mempertimbangkan parameter lain untuk menghindari "penipuan" tersebut:
- A 1 143100 2445750 https://stackoverflow.com/users/2445750/muhammad-mahtab-saleem
- D 60 51111 2139869 https://stackoverflow.com/users/2139869/xxn
- E 40 23067 5740196 https://stackoverflow.com/users/5740196/listcrawler
- F 11 7738 3313079 https://stackoverflow.com/users/3313079/rikitikitaco
- G 136 11123 4102129 https://stackoverflow.com/users/4102129/abhishek-deshpande
- K 377 24453 1012351 https://stackoverflow.com/users/1012351/overstack
- L 1489 57515 1249338 https://stackoverflow.com/users/1249338/frosty
- M 1767 40986 2578799 https://stackoverflow.com/users/2578799/naresh-walia
- Saya menemukan sekelompok pengguna ini menarik, semuanya sangat dekat di grafik:
- H 58 4331 1818755 https://stackoverflow.com/users/1818755/eerongal
- Saya 103 4366 1816274 https://stackoverflow.com/users/1816274/angelov
- J 157 4688 688552 https://stackoverflow.com/users/688552/oylex
ketenaran eksternal:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex Model Victoria's Secret: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood SO co-founder
- Y 29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky SO co-founder
- pengguna dengan reputasi tertinggi cenderung mendapatkan lebih banyak tampilan profil karena muncul di "pengguna dengan reputasi tertinggi" kueri / daftar Google:
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert terlibat dalam desain C #
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc pengguna # 2 teratas, jumlah jawaban gila
profil unik:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen Gambar itu sendiri! Saya juga berpikir dia adalah seorang moderator sebelumnya.
- R 143904 144287 895245 https://stackoverflow.com/users/895245/ciro-santilli-%e6%96%b0%e7%96%86%e6%94%b9%e9%80%a0%e4%b8%ad % e5% bf% 83996icu% e5% 85% ad% e5% 9b% 9b% e4% ba% 8b% e4% bb% b6
- T 291742 161929 560648 https://stackoverflow.com/users/560648/lightness-races-in-orbit
pengguna rep tinggi yang diskors pada saat itu. Ah, konyol perwakilan Anda pergi ke 1 aturan:
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
tidak yakin, saya tergoda untuk mengatakan manipulasi tampilan:
- Q 65788 126085 50776 https://stackoverflow.com/users/50776/casperone
- S 15655 81541 293594 https://stackoverflow.com/users/293594/xnx
- W 12019 37047 2227834 https://stackoverflow.com/users/2227834/unheilig
- X 1421 27963 1255427 https://stackoverflow.com/users/1255427/jack-nicholson
Solusi yang memungkinkan
Saya pernah mendengar tentang interval kepercayaan skor Wilson dari https://www.evanmiller.org/how-not-to-sort-by-average-rating.html yang "menyeimbangkan proporsi peringkat positif dengan ketidakpastian. dari sejumlah kecil pengamatan ", tapi saya tidak yakin bagaimana memetakan itu untuk masalah ini.
Dalam posting blog itu, penulis merekomendasikan algoritma tersebut untuk menemukan item yang memiliki lebih banyak upvotes daripada downvotes, tetapi saya tidak yakin apakah ide yang sama berlaku untuk masalah tampilan profil / upvote. Saya berpikir untuk mengambil:
- profil dilihat == upvotes di sana
- naik turun di sini == turun di sana (keduanya "buruk")
tapi saya tidak yakin apakah itu masuk akal karena pada masalah naik / turun, setiap item yang disortir memiliki N 0/1 suara acara. Tetapi pada masalah saya, setiap item memiliki dua peristiwa yang terkait: mendapatkan upvote, dan mendapatkan tampilan profil.
Apakah ada algoritma terkenal yang memberikan hasil yang baik untuk masalah seperti ini? Bahkan mengetahui nama masalah yang tepat akan membantu saya menemukan literatur yang ada.
Bibliografi
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positive-correlated-to-the-level-of-reputa
- Tes untuk pencilan bivariat
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- Apakah ada cara sederhana untuk mendeteksi outlier?
- Bagaimana seharusnya outlier ditangani dalam analisis regresi linier?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
Diuji di Ubuntu 18.10, VisIt 2.13.3.