Örnek bir uygulama olarak, Stack Overflow kullanıcılarının iki özelliğini izlemeyi düşünün: itibar ve profil görünümü sayıları .
Çoğu kullanıcı için bu iki değerin orantılı olması beklenir: yüksek rep kullanıcıları daha fazla dikkat çeker ve bu nedenle daha fazla profil görünümü elde eder.
Bu nedenle, toplam itibarlarına kıyasla çok sayıda profil görüntülemesine sahip kullanıcıları aramak ilginçtir.
Bu kullanıcının harici bir şöhret kaynağına sahip olduğunu gösterebilir. Ya da belki ilginç ilginç profil resimleri ve isimleri var.
Daha matematiksel olarak, her iki boyutlu örnek noktası bir kullanıcıdır ve her kullanıcının 0 ila + sonsuz arasında değişen iki integral değeri vardır:
- itibar
- profil görüntüleme sayısı
Bu iki parametrenin doğrusal olarak bağımlı olması beklenir ve bu varsayımın en büyük aykırı değerleri olan örnek noktaları bulmak isteriz.
Naif çözüm elbette sadece profil görüşlerini almak, itibara bölünmek ve sıralamak olacaktır.
Ancak, bu istatistiksel olarak anlamlı olmayan sonuçlar verecektir. Örneğin, bir kullanıcı soruya cevap verdiğinde, 1 yukarı oy aldıysa ve bazı nedenlerden dolayı sahte olması kolay 10 profil görünümü varsa, bu kullanıcı 1000 yukarı ve 5000 profil görüntülemesine sahip çok daha ilginç bir adayın önünde görünecektir. .
Daha "gerçek bir dünya" kullanım örneğinde, örneğin "hangi girişimler en anlamlı tek boynuzlu atlar?" Örneğin, küçük bir özkaynak ile 1 dolar yatırım yaparsanız, bir tek boynuzlu at yaratırsınız: https://www.linkedin.com/feed/update/urn:li:activity:6362648516858310656
Beton temiz, kullanımı kolay gerçek dünya verileri
Bu soruna çözümünüzü test etmek için, 2019-03 Yığın Taşması veri dökümünden çıkarılan bu küçük (75M sıkıştırılmış, ~ 10M kullanıcı) önceden işlenmiş dosyayı kullanabilirsiniz :
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
users_rep_view.dat
çok basit bir düz metin alanı ayrılmış formatı olan UTF-8 kodlu dosyayı üretir :
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
Veriler bir günlük ölçeğinde şöyle görünür:
Daha sonra çözümünüzün yeni bilinmeyen ilginç kullanıcıları keşfetmemize gerçekten yardımcı olup olmadığını görmek ilginç olacaktır!
İlk veriler 2019-03 veri dökümünden aşağıdaki gibi elde edilmiştir:
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
İçin kaynakusers_xml_to_rep_view_dat.py
.
Sıralamanızı yeniden users_rep_view.dat
sıralayarak seçtikten sonra , en iyi seçimleri hızlı bir şekilde görüntülemek için köprüler içeren bir HTML listesi alabilirsiniz:
./users_rep_view_dat_to_html.py users_rep_view.dat | head -n 1000 > users_rep_view.html
xdg-open users_rep_view.html
İçin kaynakusers_rep_view_dat_to_html.py
.
Bu komut dosyası, verilerin Python'a nasıl okunacağına hızlı bir başvuru olarak da hizmet edebilir.
Manuel veri analizi
Hemen gnuplot grafiğine bakarak beklediğimiz gibi görüyoruz:
- veriler yaklaşık orantılıdır ve düşük rep veya düşük görüntüleme sayısı kullanıcıları için daha büyük varyanslar vardır
- düşük rep veya düşük görüntüleme sayısı kullanıcıları daha nettir, bu da daha yüksek hesap kimliklerine sahip oldukları anlamına gelir. Bu, hesaplarının daha yeni olduğu anlamına gelir
Veriler hakkında bazı sezgiler elde etmek için, bazı interaktif çizim yazılımlarında bazı uzak noktaları incelemek istedim.
Gnuplot ve Matplotlib böyle büyük bir veri kümesini işleyemedi, bu yüzden VisIt'a ilk kez bir çekim yaptım ve işe yaradı. Denediğim tüm çizim yazılımlarına ayrıntılı bir genel bakış: /programming/5854515/large-plot-20-million-samples-gigabytes-of-data/55967461#55967461
OMG koşmak zor oldu. Yapmak zorundaydım:
- yürütülebilir dosyayı manuel olarak indirin, Ubuntu paketi yok
- verileri
users_xml_to_rep_view_dat.py
hızlı bir şekilde hackleyerek CSV'ye dönüştürün çünkü alandan ayrılmış dosyaları nasıl besleyeceğimizi kolayca bulamadım (öğrendiğim ders, bir dahaki sefere CSV için düz gideceğim) - kullanıcı arayüzü ile 3 saat boyunca savaş
- varsayılan nokta boyutu, ekranımdaki tozla karışan bir pikseldir. 10 piksel küreye gitme
- 0 profil görüntülemesine sahip bir kullanıcı vardı ve VisIt logaritma grafiğini yapmayı reddetti, bu yüzden bu noktadan kurtulmak için veri sınırları kullandım. Bu bana gnuplot'un çok izin verici olduğunu ve ona attığınız her şeyi mutlu bir şekilde çizeceğini hatırlattı.
- "Kontroller"> "Ek Açıklamalar" altında eksen başlıkları ekleyin, kullanıcı adını kaldırın ve diğer işlemleri yapın
Bu manuel çalışmadan bıktıktan sonra VisIt pencerem şöyle görünüyordu:
Harfler, harika Seçimler özelliği ile manuel olarak seçtiğim noktalardır:
- Seçtikler penceresinde "Kayan Biçim" bölümündeki kayan nokta hassasiyetini artırarak her nokta için kesin kimliği görebilirsiniz.
%.10g
- daha sonra "El ile Farklı Kaydet" i kullanarak tüm elle toplanan noktaları bir txt dosyasına dökebilirsiniz. Bu, bazı temel metin işlemleriyle tıklanabilir ilginç profil URL'lerinin tıklanabilir bir listesini oluşturmamızı sağlar
YAPILACAKLAR, şunları yapmayı öğrenin:
- profil adı dizelerine bakın, varsayılan olarak 0'a dönüştürülürler. Profil ID'leri tarayıcıya yeni yapıştırdım
- bir kerede bir dikdörtgen içindeki tüm noktaları seç
Ve son olarak, siparişinizde büyük olasılıkla ortaya çıkması gereken birkaç kullanıcı:
büyük görüntüleme sayısı ve düşük bilgi profilli çok düşük rep kullanıcıları.
Bu kullanıcılar bir şekilde trafiği bir yerden yönlendiriyor olabilir.
İlgili: Bir kullanıcı tarafından ünlü soru altın rozet manipülasyonu için bir meta iplik vardı , ama şimdi bulamıyorum.
Bu tür kullanıcılardan çok fazla varsa, analizimiz zor olacaktır ve bu tür bir dolandırıcılıktan kaçınmak için diğer parametreleri düşünmeye çalışmamız gerekir:
- 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
- Grafikte bu kadar yakın olan bu kullanıcı kümesini ilginç buluyorum:
- H 58 4331 1818755 https://stackoverflow.com/users/1818755/eerongal
- I 103 4366 1816274 https://stackoverflow.com/users/1816274/angelov
- J 157 4688 688552 https://stackoverflow.com/users/688552/oylex
dış şöhret:
- O 29799 170854 2274694 https://stackoverflow.com/users/2274694/lyndsey-scottex Victoria's Secret modeli: https://en.wikipedia.org/wiki/Lyndsey_Scott
- P 45742 454747 1 https://stackoverflow.com/users/1/jeff-atwood SO kurucu ortağı
- Y 29230 75102 4 https://stackoverflow.com/users/4/joel-spolsky SO kurucu ortağı
- en yüksek itibar kullanıcıları, "en yüksek itibar sahibi kullanıcılar" Google sorgularında / listelerinde göründükleri için daha fazla profil görüntüleme alma eğilimindedir:
- U 542861 401220 88656 https://stackoverflow.com/users/88656/eric-lippert C # tasarımında yer aldı
- V 852319 396830 157882 https://stackoverflow.com/users/157882/balusc üst # 2 kullanıcı, delice cevap miktarı
ilginç profiller:
- N 13690 108073 63550 https://stackoverflow.com/users/63550/peter-mortensen Kendi fotoğrafı! Ben de daha önce bir moderatör olduğunu düşünüyorum.
- 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
o sırada askıya alınan yüksek rep kullanıcıları. Ah, senin aptalın 1 kurala gidiyor
- B 1 77456 285587 https://stackoverflow.com/users/285587/your-common-sense
emin değilim, görünüm manipülasyon demeye cazipim:
- 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
Olası çözümler
Ben duydum Wilson skoru güven aralığı dan https://www.evanmiller.org/how-not-to-sort-by-average-rating.html hangi "denge [s] belirsizlikle pozitif değerlendirmesi oranı "ancak bunu bu sorunla nasıl eşleştireceğimden emin değilim.
Bu blog gönderisinde yazar, algoritmanın downvotes'tan çok daha fazla upvotes içeren öğeleri bulmasını önerir, ancak aynı fikrin upvote / profil görünümü problemi için geçerli olup olmadığından emin değilim. Almayı düşünüyordum:
- profile views == orada oylar
- upvotes here == orada downvotes (her ikisi de "kötü")
ancak yukarı / aşağı oylama sorununda, sıralanan her öğenin N 0/1 oy olayları olduğundan mantıklı olup olmadığından emin değilim. Ama benim sorunumda, her öğenin kendisiyle ilişkili iki olay var: upvote almak ve profil görünümünü almak.
Bu tür bir sorun için iyi sonuçlar veren iyi bilinen bir algoritma var mı? Kesin problem ismini bilmek bile mevcut literatürü bulmama yardımcı olacaktır.
Kaynakça
- https://meta.stackoverflow.com/questions/307117/are-profile-views-on-stack-overflow-positively-correlated-to-the-level-of-reputa
- İki değişkenli aykırı değerler için test
- /programming/41462073/multivariate-outlier-detection-using-r-with-probability
- Aykırı değerleri tespit etmenin basit bir yolu var mı?
- Doğrusal regresyon analizinde aykırı değerlerle nasıl başa çıkılmalıdır?
- https://math.meta.stackexchange.com/questions/26137/who-maximizes-the-ratio-of-people-reached-to-questions-answered
Ubuntu 18.10, VisIt 2.13.3'te test edilmiştir.