Как-то раз, читая новости на Медузе, я обратил внимание на то, что у разных новостей разное соотношение лайков из 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

Поделиться с друзьями
-->

Комментарии (38)


  1. war_hol
    06.05.2016 11:59
    +4

    Еще нужно учесть что api facebook возвращает общее число share и like, а api vk.com только share. Поэтому цифра у FB часто намного выше.


    1. feriat
      06.05.2016 12:03

      Судя по всему, facebook туда не только share и like, но и комментарии подмешивает. Возможно этим можно объяснить размазанность данных fb. Можно попробовать повыгружать фейсбучные данные, и порезать их по типу активности.

      А где можно почитать, что api vk.com считает только share?


      1. war_hol
        06.05.2016 12:23

        Да, facebook подмешивает еще комментарии. Про vk.com информации не нашел, но опытным путем на материалах нашего сайта выяснили что там точно только shares.


        1. nckma
          06.05.2016 21:03
          +2

          Эх… почувствовал себя динозавром…
          У меня аккаунт в фейсбуке есть, но я хоть убейте не понимаю как им пользоваться: интерфейс странный и не предсказуемый.
          Никогда не понятно, что произойдет в ответ на твое действие.
          Это только у меня так или все мучаются?


          1. Al_Azif
            07.05.2016 08:17
            +5

            Все. Но все делают вид что там всё круто, легко и приятно, и ёмкость памяти равна 5 минутам.


          1. NSA
            10.05.2016 12:27

            О, первое подтверждение моему опыту. Я точно так же пытался использовать фейсбук, но не смог: ничего там не понял, неудобно жуть. Спрашивал у других, никто не сознаётся в таком же эффекте. Но оказывается, я всё-таки не один такой.


    1. KrOvean
      06.05.2016 16:01
      +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


      1. feriat
        06.05.2016 16:03

        KrOvean, именно эту ссылку я и показал у себя в комментарии выше. :-) И да, видно, что медуза использует like + share + comment. О причинах такого решения можно спросить samat
        В то же время, чтобы сразу выгружать эти данные, потребовалось бы намного больше времени, так как 22.5к урлов пришлось бы прокачивать по одному через АПИ фейсбука, а потом, в идеале, и контакта. Если будет время продолжить это исследование, я попробую посмотреть на это глубже


        1. KrOvean
          06.05.2016 16:05

          я дико извиняюсь)


        1. KrOvean
          06.05.2016 16:07
          +1

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


        1. samat
          06.05.2016 16:29

          ну это total, который возвращает fb :)


        1. samat
          06.05.2016 16:29

          насчет прокачивания через фб — это может быть не так сложно, там есть batch запросы, в вк могут быть проблемы


  1. encyclopedist
    06.05.2016 12:06

    Есть мини-кластер фейсбучной активности в 150 fb и около 70 vk, достаточно необычный

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


    1. feriat
      06.05.2016 12:12

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


  1. samat
    06.05.2016 12:55
    +19

    В чате технический директор Медузы, готов ответить на вопросы.

    feriat, снимаю шляпу, это очень-очень круто!


    1. feriat
      06.05.2016 13:17
      +7

      Самат, большое спасибо, а ещё благодарю за очень хорошее АПИ: я не видел ещё «неайтишного» сервиса, который представлял бы такие понятные и развернутые данные.


    1. Boomburum
      07.05.2016 00:59
      +1

      Коллеги, не желаете завести блог у нас на Хабре? ) Думаю, вам есть что рассказать нашей аудитории. Готов пообщаться и ответить на все вопросы.


      1. samat
        07.05.2016 19:40
        +1

        Чукча не особо писатель — у нас дорогая редакция пишет, а мы программируем.
        Иногда пишем вот сюда https://medium.com/meduza-dev/latest

        В чем профит перехода на хабр?


        1. Boomburum
          08.05.2016 00:55
          +1

          Профит в том, что ваши статьи будет читать целевая аудитория и у них будет больше, чем 1-2 комментария :)


  1. NYMEZIDE
    06.05.2016 14:25

    оффтоп: медуза антироссийкий проект и сайт.


    1. samat
      06.05.2016 14:27

      на хуй пошел
      а ты мурзилка


      1. NYMEZIDE
        06.05.2016 14:27

        ооо. от вас только такое и можно ожидать. не удивлен.


        1. samat
          06.05.2016 14:29

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


      1. nikerossxp
        06.05.2016 14:31

        лопнул по швам


  1. AllegroMod
    06.05.2016 14:55

    Добрый день! Скажите, какую программу вы использовали для визуализации данных?


    1. feriat
      06.05.2016 15:41
      +5

      AllegroMod, В аналитике данных python сейчас можно назвать мейнстримом. Я пользуюсь связкой Jupyter Notebooks (раньше назывались iPython, сменили название из-за того, что начали поддерживать другие языки программирования) плюс Pandas dataframe (обёртка над numpy с ну очень удобным интерфейсом для «верчения» данных, см. код) плюс библиотечка seaborn для красивой визуализации. Самая большая крутость Jupyter, по сравнению с «обычными» IDE, в том, что код запускается в ячейках последовательно, и можно исправлять «на лету» не перезапуская всё остальное. Ну и плюс визуализация прямо здесь же, и возможность делать полноценные отчёты с заголовками и текстовыми комментариями.

      А так весь код выложен на гитхабе, его можно открыть и посмотреть «моими глазами» прямо в интерфейсе. В целом могу подробнее поотвечать про технологии, если интересует что-то конкретное


  1. macleginn
    06.05.2016 15:00

    А Вы можете куда-нибудь выложить json с данными (чтобы не загружать сервер Медузы лишний раз)?


    1. HungryD
      06.05.2016 15:22
      +2

      на гитхабе лежит


  1. valemak
    06.05.2016 15:12
    +1

    По количеству комментариев и тенденции роста fb заметно опережает vk.

    Предполагаю, что всё меньше не-российских пользователей комментируют через российские социальные сети.


    1. feriat
      06.05.2016 15:35
      +1

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


      1. valemak
        06.05.2016 15:44
        +2

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

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


        1. Jerf
          07.05.2016 10:17
          +1

          А откуда известно, что доля украинской аудитории vk упала до нескольких процентов? Есть ли какие-то исследования, где было бы показано, что эта доля заметно уменьшилась? Я попробовал немного погуглить, но нашел только данные самих vk, в которых утверждается, что украинская аудитория vk на декабрь 2015 г. даже немного выросла по сравнению с январем 2014 г.
          Самим vk, конечно, не обязательно стоит верить, но ничего другого я коротким гуглением не нашел. Был бы благодарен ссылке, если такие сторонние исследования все-таки есть.


          1. valemak
            07.05.2016 11:16

            Нет, никаких данных у меня нет, это мои личные субъективные наблюдения не только за vk, но и за другими интернет-тусовками.

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


            1. Jerf
              07.05.2016 12:16
              +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 и упала, то, видимо, не более чем в полтора раза, и уж точно не на порядки.


              1. nikerossxp
                08.05.2016 02:25

                Но ведь кол-во помогающих alexa установить рейтинг гораздо ниже, чем тех, кто вообще не в курсе что это и зачем, и уж тем более не в состоянии поставить тулбар. Почему статистика данных не может быть наоборот?


              1. allestern
                10.05.2016 15:57

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


  1. dmitry_ch
    06.05.2016 16:48
    +1

    Еще бы антилайки сделать, чтобы определенно лажовые странички получали свою порцию негодования. Впрочем, это скорее коммент к соцсетям, чем к Медузе. Сейчас же, при наличии возможности только похвалить/расшарить, вывод о низком качестве содержимого и не сделать: малое кол-во лайков еще не показатель некачественного контента. Равно как и большое их число (как видно из этого поста) вовсе не гарантирует, что контент — нетленка на все времена.


  1. Akr0n
    07.05.2016 05:23
    +1

    Медуза все больше радует.