Когда ты любишь то, чем ты занимаешься – это болезнь. Хорошо, если тебе нравится не коллекционировать марки, потому что мало кто способен выслушивать то, как ты можешь часами рассуждать насчёт отличий английских марок 30х от бельгийских, которые выпускались в 40х. Просто прекрасно, если тебе нравится валить боком или кататься на сноуборде, потому что тогда наверняка у тебя будет парочка историй, которые будут интересны кому-то, кроме таких же сумасшедших как ты.
А мне нравится заниматься анализом данных и статистикой. И в этом есть свои плюсы. Потому что мне нравится думать. И минусы. Потому что часов 6 крайних я провёл, пытаясь разобраться, почему же так криво строятся графики, а до этого часа два пытался понять, что же не так с кодировкой и почему нельзя нормально спарсить пару значений. Но в конце концов я довёл работу до приемлиемого результата.
А занимался я всего-навсего тем, что анализировал 300 топ комментаторов на TJournal.ru. Собственно всё это я пишу, потому что хочу показать, как проводятся исследования сейчас, и как этот процесс можно улучшить. Для начала ты находишь интересный источник данных. Затем ты эти данные собираешь, загружаешь в какую-нибудь среду/программу/пишешь скрипт, обратываешь результаты, рисуешь графики и пишешь текст.
Данные я взял при помощи Grab – замечательной либы под питон, но потом уже понял, что отчёт будет лучше оформлять в ipython notebook, а в нём есть какая-то странность с парсингом юникода, который Grab сожрал на ура. Поэтому, как я уже написал выше, пришлось воспользоваться Beautiful Soup, но это ерунда.
В общем, кому нужны подробности, может скачать ipynb или html со всем кодом и попробовать всё проделать сам. Там же я и написал про косяки. Кстати, буду рад узнать, почему yticks ставил у меня подписи исходя из исходного индекса, а не из нового, а также, почему всё так грустно с кодировками в ipython notebook.
tj.head()
Что приходит на ум, когда мы видим эту табличку? Естественно, что хочется узнать, насколько много комментариев собирает каждый человек. Поделим карму на количество комментариев, и обзовём этот параметр “крутостью”:
tj['awesomeness'] = tj.karma/tj.comments
А теперь уже посмотрим на описательные статистики, среднее значение, квантили и дисперсию:
tj.describe()
Это как раз тот случай, когда активные комментаторы, попавшие в рейтинги могут заставить нас подумать, что большинство людей из списка оставляет в среднем комментария, но это не так. На самом деле, медиана показывает, что большинство людей, чтобы попасть в список оставило 23 комментария.
Тоже самое оказывается верным и для кармы. Есть ребята, которые получили значительно больше кармы в среднем, чем остальные, что даёт нам 134 очка кармы для наших топовых 300 комментаторов, тогда как большинство всё-таки получило около 71 очков кармы.
Опять-таки из-за наличия в выборке людей, которые “срывают куш”, мы снова смотрим на медиану крутости и понимаем, что в основном комментарии на сайте собирают около 3х плюсиков.
Также по этой табличке мы видим, что кто-то был настолько активен, что оставил аж 590 комментариев. Посмотрим, кто это был.
tj[tj.comments==590]
Кстати, индекс у нас построился на основе того, как были сначала отсортированны данные (что заставило изобрести небольшие костыли, чтобы работать с данными чуть ниже, но не суть), поэтому мы видим, что it-trend-у его активность принесла 3 место в рейтинге.
Ещё интеренсо посмотреть, кто же (постил больше всех смешных кратинок) наиболее удачно комментирует посты на протяжении достаточно долгого времени.
tj.sort(['awesomeness'],ascending=False).head()
Мы видим вполне ожидаемую ситуацию, при которой несколько человек, запостив 1 комментарий получили кучу плюсиков и попали в этот топ. Всё-таки интереснее знать, чьи комментарии реально стоит читать.
Для этого возьмём в качестве критического значения 11 комментариев, потому что 75% участников списка оставили больше этого числа (25% перцентиль распределения комментариев).
tj[tj.comments>11].sort(['awesomeness'],ascending=False)[:20]
Мы же так и не узнали пока 20 топ-комментариев. Ну точнее, мы видели эту статистику на офицальном сайте, но мы же посчитали наш параметр “крутости”:
tj.sort(['karma','awesomeness'],ascending=False)[:20]
А теперь посмотрим на тех, кто оставил больше всего комментариев:
tj.sort(['comments','awesomeness'],ascending=False)[:20]
Поскольку выборка у нас очень маленькая, да и TJ молодой ресурс, мы даже не можем сказать, что эти люди особо флудили, чтобы попасть в рейтинг, потому что медиана “крутости” получилась около 3.
Выводы: пока что данных слишком мало. Попадают в топ, как и те, кто оставил по одному смешному/интересному/достойному комментарию, так и те, кто живёт на TJ.
Теперь посмотрим на то, что в итоге отняло у меня больше всего времени. Графики. Они вышли слишком большими, поэтому полную версию лучше смотреть в исходнике.
Собственно, посмотря на графики можно понять, что ничего особо больше интересного исходя из этих данных мы понять не можем. В целом, от идеи, до написании статьи у меня ушло порядка 8 часов. Но я делал это не только для удовольствия. Мою голову никак не покидает идея о том, что такие отчёты в 21 веке должны генерироваться в автоматическом режиме. Поэтому через месяц, два или чуть позже такая возможность появится в Мерку.
Comments are closed.