Meduza.io: а как же лайки?

Как-то раз, читая новости на Медузе, я обратил внимание на то, что у разных новостей разное соотношение лайков из Facebook и ВКонтакте. Какие-то новости мегапопулярны на fb, а другими люди делятся только во ВКонтакте. Захотелось присмотреться к этим данным, попытаться найти в них интересные закономерности. Заинтересовавшихся приглашаю под кат!


image


Data Scraping


Первым делом нужно получить данные для анализа. Предвкушая скорое расчехление Python + BeautifulSoup, я начал читать исходный код страниц. Разочарование ждало довольно быстро: эти данные подгружатся не сразу вместе с html'ой, а отложенно. Так как я не умею JavaScript, я начал искать ноги в сетевых соединениях страницы, и довольно быстро наткнулся на замечательную ручку API медузы:


https://meduza.io/api/v3/social?links=["shapito/2016/05/03/poliem-vse-kislotoy-i-votknem-provod-v-rozetku"]

Ручка возвращает приятную глазу json'ку:


image


Ну и конечно, раз links это массив, то сразу хочется попробовать подставить туда сразу несколько записей, и, ура, получаем интересующий нас список.


Даже парсить ничего не пришлось!


Теперь хочется получить данные о самих новостях. Здесь хочется поблагодарить хаброжителя sirekanyan за его статью, где он нашел другую ручку.


https://meduza.io/api/v3/search?chrono=news&page=0&per_page=10&locale=ru

Опытным путём удалось установить, что максимальное значение параметра per_page равно 30, а page около 752 на момент написания статьи. Важной проверка того, что ручка social выдержит все 30 документов, пройдена успешно.


Осталось только выгрузить! Я использовал простенький скрипт на питоне


stream = 'https://meduza.io/api/v3/search?chrono=news&page={page}&per_page=30&locale=ru'
social = 'https://meduza.io/api/v3/social'
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.3411.123 YaBrowser/16.2.0.2314 Safari/537.36'
headers = {'User-Agent' : user_agent }

def get_page_data(page):
    # Достаём страницы
    ans = requests.get(stream.format(page = page), headers=headers).json()
    # отдельно достаёт все социальные
    ans_social = requests.get(social, params = {'links' : json.dumps(ans['collection'])}, headers=headers).json()
    documents = ans['documents']
    for url, data in documents.iteritems():
        try:
            data['social'] = ans_social[url]['stats']
        except KeyError:
            continue
    with open('res_dump/page{pagenum:03d}_{timestamp}.json'.format(
        pagenum = page, timestamp = int(time.time())
    ), 'wb') as f:
        json.dump(documents, f, indent=2)

На всякий случай подставил валидный User-Agent, но и без этого всё работает.


Далее для распараллеливания и визуализации процесса очень помог скрипт моего бывшего коллеги, alexkuku. Подробнее про подход можно почитать в его посте, он позволил сделать вот такой мониторинг:


image


Данные выгрузились очень быстро, менее чем за 10 минут, никакой капчи или заметного замедления. Качал в 4 потока с одного айпишника, без каких-либо надстроек.


Data Minining


Итак, на выходе у нас получилась большая json'ка с данными. Теперь загоним её в pandas dataframe, и покрутим в Jupyter.


Загрузим нужные данные:


df = pd.read_json('database.json').T
df = df.join(pd.DataFrame(df.social.to_dict()).T)
df.pub_date = pd.DatetimeIndex(df.pub_date)
df['trust']=df.source.apply(lambda x: x.get('trust', None) if type(x) == dict else None)

Построим boxplot


df[['fb', 'tw','vk']].plot.box(logy = True);

image


Сразу несколько выводов:


  1. Twitter отключил возможность смотреть количество твитнувших новость. :-( Придется обойтись без него
  2. Распределение, как и ожидалось, крайне ненормально: есть очень сильные выбросы, которые заметны даже на лог-шкале (сотни тысяч репостов).
  3. При этом, среднее число репостов оказалось довольно близким: медиана 24 и 17 (здесь и далее, facebook и вконтакте, соответственно), распределение vk несколько более "размазано".

Так кто же те самые супер-репостнутые новости медузы? Угадаете?


image


Ответ:

image


Ну конечно же, первое это FB: там же иностранные языки, советские газеты, Серов. А во второй 5nizza, "Моя ориентация", политика. Не знаю, как по мне, так всё очевидно!


Единственное, в чем схожи предпочтения двух соц.сетей: это Ирина Яровая, да Цветаева с Гуфом.


Теперь, хочется посмотреть на scatter plot двух величин: ожидается, что данные будут хорошо коррелировать друг с другом.


df['logvk'] = np.log10(df.vk)
df['logfb'] = np.log10(df.fb)
# Без логарифмов совсем непонятная картинка
sns.regplot('logfb', 'logvk', data = df )

image


sns.set(style="ticks")
sns.jointplot('logfb', 'logvk', 
              data = df.replace([np.inf, -np.inf], np.nan).dropna(subset = ['logfb', 'logvk']),
              kind="hex")

image


Кажется, видно два кластера: один с центром в (2.3, 2.4), и второй размазанный около нуля. В целом нет цели провести анализ даже для низкочастотных новостей (тех, которые оказались неинтересными в соц.сетях), так что давайте ограничимся только записями с более 10 лайков в обеих сетях. Не забудем проверить, что мы избавились от незначительного числа наблюдений.


stripped = df[(df.logfb > 1) & (df.logvk > 1)]
print "Working with {0:.0%} of news, {1:.0%} of social network activity".format(
    float(len(stripped)) / len(df), float(stripped[['vk', 'fb']].sum().sum()) / df[['vk', 'fb']].sum().sum()
)
# Working with 47% of news, 95% of social network activity

Плотность:


sns.jointplot('logfb', 'logvk', data = stripped, kind="kde", size=7, space=0)

image


Выводы


  • Нашли плотный кластер соотношения комментирования: 220 в facebook, 240 во ВКонтакте.
  • Кластер вытянут больше в facebook: в этой соц.сети люди репостят более диапазонно, по сравнению с ВК, где пик достаточно "узкий"
  • Есть мини-кластер фейсбучной активности в 150 fb и около 70 vk, достаточно необычный

Теперь хочется посмотреть на это соотношений в динамике: возможно, оно менялось.


by_month = stripped.set_index('pub_date').groupby(pd.TimeGrouper(freq = 'MS')).agg({'fb':sum, 'vk':sum})
by_month.plot( kind = 'area')

image


Интересно, что при общем росте объема активности в соц.сетях, фейсбук растёт быстрее. Кроме того здесь не видно какого-то взрывного роста, который я ожидал бы увидеть в Медузе. Первые месяцы активность была довольно низкой, но уже к декабрю 2014 уровень стабилизировался, новый рост начался лишь через год.


Посмотрим на динамику плотности распределения комментариев из двух социальных сетей:


image


Довольно занятно, что второй кластер уменьшается со временем, и скорее является артефактом прошлого.


Наконец, хочется проверить, что соотношение социальных сетей не меняется от типа документа: у Медузы кроме новостей есть карточки, истории, шапито, галереи, а также полигон.


def hexbin(x, y, color, **kwargs):
    cmap = sns.light_palette(color, as_cmap=True)
    plt.hexbin(x, y, gridsize=20, cmap=cmap, **kwargs)

g = sns.FacetGrid(stripped.loc[::-1], col="document_type", margin_titles=True, size=5, col_wrap = 3)
g.map(hexbin, "logfb", "logvk", extent=[1, 4, 1, 4]);

image


В целом видно, что данные вполне себе однородны по классам, нет заметных перекосов. Я ожидал бы от "шапито" большей социальной активности, но этого эффекта не наблюдается.


Зато, если посмотреть на разбивку по уровню доверия к источнику, то приятно видеть, что ненадежный источник менее популярен в соц.сетях, особенно в фейсбуке:


image


Что дальше?


На этом мой вечер завершился, и я пошел спать.


  • Я попробовал обучить простенькую Ridle регрессию на word2vec данных из заголовков статей. Можно посмотреть на гитхабе, никакой особенной предсказательной силы там нет. Кажется, чтобы хорошо предсказывать количество лайков, стоит хотя бы обучить модель на полных текстах новостей.
  • На основе этих данных очень хорошо можно ловить "яркие" события, сильно всколыхнувшие общественность. При этом соотношение fb/vk может быть хорошим предиктором для типа новости.
  • Активность в соц.сетях, кажется, сейчас может быть таким же важным KPI для новостника, как и посещаемость. Можно посмотреть на авторов / источники популярных постов, и на этой базе давать оценку работе. В пользу этой идеи говорит контрастность по достоверности источника: в facebook меньше постят недостоверные новости. Думаю, в том или ином виде это уже применяется в журналистике.

Код на Github

Share post

Similar posts

Comments 40

    +4
    Еще нужно учесть что api facebook возвращает общее число share и like, а api vk.com только share. Поэтому цифра у FB часто намного выше.
      0
      Судя по всему, facebook туда не только share и like, но и комментарии подмешивает. Возможно этим можно объяснить размазанность данных fb. Можно попробовать повыгружать фейсбучные данные, и порезать их по типу активности.

      А где можно почитать, что api vk.com считает только share?
        0
        Да, facebook подмешивает еще комментарии. Про vk.com информации не нашел, но опытным путем на материалах нашего сайта выяснили что там точно только shares.
          +2
          Эх… почувствовал себя динозавром…
          У меня аккаунт в фейсбуке есть, но я хоть убейте не понимаю как им пользоваться: интерфейс странный и не предсказуемый.
          Никогда не понятно, что произойдет в ответ на твое действие.
          Это только у меня так или все мучаются?
            +5
            Все. Но все делают вид что там всё круто, легко и приятно, и ёмкость памяти равна 5 минутам.
              0
              О, первое подтверждение моему опыту. Я точно так же пытался использовать фейсбук, но не смог: ничего там не понял, неудобно жуть. Спрашивал у других, никто не сознаётся в таком же эффекте. Но оказывается, я всё-таки не один такой.
                0
                NSA Не один-не один, не переживайте. ИМХО по юзабилити ВК и Фейсбук — это просто небо и земля.

                Мой одногруппник на Хабре даже статью писал целую на эту тему:)
          +1
          это не совсем верно, фб возвращает все по полочкам, вопрос в том, какую из цифр берут разрабы: total_count или share_count. Я работаю с новостными сайтами и изначально у нас стоял total_count, посчитали это за баг и поставили share_count. Но им (редакции) стало обидно из-за меньшей цифры и все вернули обратно. По ссылке можно проверить любой линк: http://api.facebook.com/restserver.php?method=links.getStats&format=json&urls=https://meduza.io/news/2015/02/12/mvd-provelo-obysk-u-osnovatelya-fonda-marshall-capital-po-delu-o-hischenii-u-vtb
            0
            KrOvean, именно эту ссылку я и показал у себя в комментарии выше. :-) И да, видно, что медуза использует like + share + comment. О причинах такого решения можно спросить samat
            В то же время, чтобы сразу выгружать эти данные, потребовалось бы намного больше времени, так как 22.5к урлов пришлось бы прокачивать по одному через АПИ фейсбука, а потом, в идеале, и контакта. Если будет время продолжить это исследование, я попробую посмотреть на это глубже
              0
              я дико извиняюсь)
                +1
                а причины очевидны: редакции приятней, а юзеру интересно почитать, что же за новость с таким числом репостов:)
                  0
                  ну это total, который возвращает fb :)
                    0
                    насчет прокачивания через фб — это может быть не так сложно, там есть batch запросы, в вк могут быть проблемы
                0
                Есть мини-кластер фейсбучной активности в 150 fb и около 70 vk, достаточно необычный

                Разве это не остатки от "низкочастотного кластера" после отрезания?

                  0
                  Сложно сказать: «низкочастотники» расположены на уровне 10 fb, между 10 и 70 стабильно низкая плотность, начиная с третьего месяца (см. гифку). С другой стороны, на общем графике они действительно видны. Плюс ещё он со временем затухает
                  +19
                  В чате технический директор Медузы, готов ответить на вопросы.

                  feriat, снимаю шляпу, это очень-очень круто!
                    +7
                    Самат, большое спасибо, а ещё благодарю за очень хорошее АПИ: я не видел ещё «неайтишного» сервиса, который представлял бы такие понятные и развернутые данные.
                      +1
                      Коллеги, не желаете завести блог у нас на Хабре? ) Думаю, вам есть что рассказать нашей аудитории. Готов пообщаться и ответить на все вопросы.
                        +1
                        Чукча не особо писатель — у нас дорогая редакция пишет, а мы программируем.
                        Иногда пишем вот сюда https://medium.com/meduza-dev/latest

                        В чем профит перехода на хабр?
                          +1
                          Профит в том, что ваши статьи будет читать целевая аудитория и у них будет больше, чем 1-2 комментария :)
                        –1
                        Не знаю, куда багрепорт закинуть, поэтому пишу тут. Проблема с вашим приложением на андроиде (v5.0) такая: почитал какую-то статью в приложении Медузы, вышел оттуда, потом прилошло оповещение о какой-то новой статье, тыкаю на это оповещение, открывается приложение Медузы, и открывается старая статья, которую читал до этого. Новую статью, о которой пришло оповещение, уже вручную через меню приходится искать.
                        0
                        Добрый день! Скажите, какую программу вы использовали для визуализации данных?
                          +5
                          AllegroMod, В аналитике данных python сейчас можно назвать мейнстримом. Я пользуюсь связкой Jupyter Notebooks (раньше назывались iPython, сменили название из-за того, что начали поддерживать другие языки программирования) плюс Pandas dataframe (обёртка над numpy с ну очень удобным интерфейсом для «верчения» данных, см. код) плюс библиотечка seaborn для красивой визуализации. Самая большая крутость Jupyter, по сравнению с «обычными» IDE, в том, что код запускается в ячейках последовательно, и можно исправлять «на лету» не перезапуская всё остальное. Ну и плюс визуализация прямо здесь же, и возможность делать полноценные отчёты с заголовками и текстовыми комментариями.

                          А так весь код выложен на гитхабе, его можно открыть и посмотреть «моими глазами» прямо в интерфейсе. В целом могу подробнее поотвечать про технологии, если интересует что-то конкретное
                          0
                          А Вы можете куда-нибудь выложить json с данными (чтобы не загружать сервер Медузы лишний раз)?
                            +2
                            на гитхабе лежит
                            +1
                            По количеству комментариев и тенденции роста fb заметно опережает vk.

                            Предполагаю, что всё меньше не-российских пользователей комментируют через российские социальные сети.
                              +1
                              Как отмечали выше, сравнивать fb и vk надо аккуратно: в цифре фейсбука включаются не только сами репосты, но и лайки, и комментарии. Постараюсь в следующих сериях раскрыть это более подробно, если удастся выгрузить данные. В целом вроде бы vk всегда был российским, иностранцев там всегда было мизерное количество, несмотря на короткую кампанию по интернационализации где-то лет пять назад.
                                +2
                                До известных событий немалую часть составляли украинцы, сейчас их там в качестве активных пользователей уже на порядки меньше.

                                Если сравнивать с другими русскоязычными сообществами (даже с тем же Хабром), то доля жителей Украины обычно составляет 20-30% (мои наблюдения, может я и сильно ошибаюсь). Если сообщество сильно политизировано (vk с его многочисленными патриотическими группами и модой на ленточные аватарки можно к таковым отнести), то за последние 2 года доля украинцев в таком сообществе снижается всего до нескольких процентов. Лично я одну из причин, почему в fb рост, а в vk падение вижу в том числе и в этом. Отток ~15-20% активных пользователей — это немало.
                                  +1
                                  А откуда известно, что доля украинской аудитории vk упала до нескольких процентов? Есть ли какие-то исследования, где было бы показано, что эта доля заметно уменьшилась? Я попробовал немного погуглить, но нашел только данные самих vk, в которых утверждается, что украинская аудитория vk на декабрь 2015 г. даже немного выросла по сравнению с январем 2014 г.
                                  Самим vk, конечно, не обязательно стоит верить, но ничего другого я коротким гуглением не нашел. Был бы благодарен ссылке, если такие сторонние исследования все-таки есть.
                                    0
                                    Нет, никаких данных у меня нет, это мои личные субъективные наблюдения не только за vk, но и за другими интернет-тусовками.

                                    Кстати, я немного коряво выразился. Дело не в в том, что украинцы удаляются из vk. У многих своих знакомых наблюдаю максимальное снижение активности. Из анкеты убираются фото (или ставится не своя фотография, а что-то левое), информация из открытого доступа переносится в скрытый режим «только для друзей», все мои знакомые, которые раньше комментировали через Vkontakte теперь комментируют через Facebook и т.д. и т.п. Более-менее заметные публичные украинцы вообще не используют Vkontakte как площадку для микроблогов (за исключением тех, кто ориентирован на российскую аудиторию или декларирует абсолютную аполитичность). Это тоже приводит к тому что украинцы следом за публичными согражданами перестают использовать vk как инструмент комментирования на других сайтах.
                                      +2
                                      И все-таки, похоже, Вы неправы. По-видимому, просто Ваши данные по наблюдениям за знакомыми (как это часто бывает, когда рассматривается какой-то один круг общения) не являются статистически значимыми. Если речь и идет о снижении активности украинских пользователей на vk, то о не слишком большом, т.е. точно не на порядки, и даже не в два раза. Я придумал, как это проверить: alexa.com.

                                      Alexa точно нельзя обвинить в предвзятости, и их данные такие: по посещаемости среди украинских пользователей vk.com занимает 2 место (после гугла), facebook занимает 5 место. И более того, можно посмотреть детальные данные про vk и, например, хабр, который Вы приводили в пример, и сравнить. Оказывается, что у vk 9.9% посещений производятся украинскими пользователями, в то время как 70.7% — российскими. Для хабра картина такая: 13.0% посещений — украинские пользователи, 68.9% — российские. Замечу, что количество посещений — это именно мера активности пользователей.

                                      К сожалению, поскольку у меня нет платного аккаунта на Alexa, то не могу посмотреть детальные данные по facebook (в бесплатном показывают только первые 5 стран по посещаемости, и для facebook Украина и Россия туда, разумеется, не входят), а также, по тем же причинам, не могу привести количественные данные в абсолютном выражении (а не в процентах), но, по-моему, и так можно сделать некоторые выводы.

                                      А именно, если активность украинских пользователей на vk и упала, то, видимо, не более чем в полтора раза, и уж точно не на порядки.
                                        0
                                        Но ведь кол-во помогающих alexa установить рейтинг гораздо ниже, чем тех, кто вообще не в курсе что это и зачем, и уж тем более не в состоянии поставить тулбар. Почему статистика данных не может быть наоборот?
                                          0
                                          Решил, пусть и с опозданием, проверить гипотезу.
                                          К сожалению, сервисов показывающих долю стран в динамике в открытом доступе навскидку не нашлось. Кроме liveinternet, да и то, Вконтакте там закрыл доступ к географии. Зато Одноклассники не закрыли. Сеть ещё более патриотическая, и тенденция там должна быть даже ярче.
                                          Что ж, тенденция действительно заметна, но может быть не настолько сильна:
                                          До известных событий доля Украины колебалась между 11.4 и 12 процентами, причём пик пришёлся как раз на февраль 2014-го. С этого момента она стала неуклонно падать, достигнув дна — 10.4 — в августе-сентябре того же года. Потом произошла небольшая коррекция, и с тех пор она колеблется вокруг 10.8…
                                          Т.о. на максимуме доля сокращалась на 14% примерно.
                                          Для сравнения доля Беларуси и Казахстана всё это время стабильно растёт.
                                          (ссылка)
                                +1
                                Еще бы антилайки сделать, чтобы определенно лажовые странички получали свою порцию негодования. Впрочем, это скорее коммент к соцсетям, чем к Медузе. Сейчас же, при наличии возможности только похвалить/расшарить, вывод о низком качестве содержимого и не сделать: малое кол-во лайков еще не показатель некачественного контента. Равно как и большое их число (как видно из этого поста) вовсе не гарантирует, что контент — нетленка на все времена.
                                  +1
                                  Медуза все больше радует.

                                  Only users with full accounts can post comments. Log in, please.