Детальный анализ Хабрахабра с помощью языка Wolfram Language (Mathematica)
Скачать пост в виде документа Mathematica, который содержит весь код использованный в статье, вместе с дополнительными файлами, можно здесь (архив, ~147 МБ).Анализ социальных сетей и всевозможных медиа-ресурсов является сейчас довольно популярным направлением и тем удивительнее для меня было обнаружить, что на Хабрахабре, по сути, нет статей, которые содержали бы анализ большого количества информации (постов, ключевых слов, комментариев и пр.), накопленного на нем за довольно большой период работы.
Надеюсь, что этот пост сможет заинтересовать многих участников Хабрахабра. Я буду рад предложениям и идеям возможных дальнейших направлений развития этого поста, а также любым замечаниям и рекомендациям.
В посте будут рассматриваться статьи, относящиеся к хабам, всего в анализе участвовало 62000 статей из 264 хабов. Статьи, написанные только для корпоративных блогов компаний в посте не рассматривались.
Ввиду того, что база данных, построенная в посте, формировалась за некоторое время до публикации, а именно 26 апреля 2015 г., посты, опубликованные на Хабрахабре после этой даты (а также, возможно, новые хабы) в данном посте не рассматривались.
Импорт списка хабовИмпорт ссылок на все статьи ХабрахабраИмпорт всех статей ХабрахабраФункции извлечения конкретнных данных из символьного XML представления постаСоздание базы данных постов Хабрахабра с помощью DatasetРезультаты обработки данных— Краткий анализ хабов— Граф связей хабов на Хабрахабре— Количество статей в зависимости от времени— Количество изображений (видео), используемых в постах в зависимости от времени— Облака ключевых слов Хабрахабра и отдельных хабов— Сайты, на которые ссылаются в статьях на Хабрахабре— Коды, которые приводят в статьях на Хабрахабре— Частота встречи слов— Рейтинг и числа просмотров постов, а также вероятность достижения их определенных значений— Зависимость рейтинга и числа просмотров поста от времени публикации— Зависимость рейтинга поста от его объемаЗаключениеИмпортируем список хабов и представим их в виде встроенного формата баз данных Dataset для удобства дальнейшей работы.
Функция импорта ссылки с n-й страницы некоторого хаба:
Функция импорта ссылок на все статьи, находящиеся в некотором хабе:
Функция импорта ссылок на все посты из всех хабов (кроме корпоративных блогов):
Импорт с сохранением в бинарный дамп-файл Wolfram Language (для последующего мгновенного использования) ссылок на все посты из всех хабов:
Всего в базе ссылок на посты:
При этом, среди них довольно много дублей, что связано с тем, что один и тот же пост часто относится к разным хабам. Всего дублирующихся постов ~30,6%, что видно из кода ниже.
Создадим список, состоящий из уникальных ссылок на посты:
Всего мы имеем 62000 ссылок, которые соответствуют такому же количеству статей.
Создадим функцию, отвечающую за импорт HTML кода веб-страницы (поста) в виде символьного XML объекта (XMLObject) по ссылке на эту страницу, которая на выходе создает серийный пакет .mx языка Wolfram Language.
Запустим загрузку всех постов:
После окончания загрузки мы получим 62000 файлов на жестком диске:
После того, как мы подгрузили все посты с Хабрахабра в формате символьных XML объектов, нам потребуется извлечь из них интересющую нас информацию. Для этого мы создадим ряд функций, представленных ниже.Заголовок поста
Список хабов, в которых опубликован пост
Дата и время публикации поста в формате абсолютного времени (для удобства дальнейшей работы).
Рейтинг поста
Количество просмотров поста
Статистика гиперссылок, приведенных в посте
Количество изображений, использованных в посте
Количество комментариев к посту
Количество видео, вставленных в пост
Текст поста в стандартизованной форме (устранены абзацы, все буквы сделаны прописными)
Статистика кодов, приведенных в посте
Ключевые слова
В ряде случаев, доступ к постам закрыт по разным причинам. При этом, если перейти по соответствующей ссылки, можно увидеть страницу такого рода:
Создадим функцию, отсеивающую такие страницы:
Теперь подгрузим пути до всех файлов .mx, в которых хранятся посты:
И удалим закрытые:
Всего было удалено около 0,5% постов, являющихся закрытыми:
Создадим функцию, которая будет создавать строку базы данных о постах Хабрахабра, которую мы получим ниже. Мы сделаем это с помощью созданных ранее функций, а также функции Association.
Наконец, сформируем с помощью функции Dataset базу данных постов Хабрахабра:
Краткий анализ хабов Найдем распределение количества хабов, в которых размещена статья:
Представим этот фрагмент Dataset в виде таблицы:
Найдем самые большие Хабы по количеству статей:
Если рассмотреть только уникальные статьи (относящиеся только к одному хабу, то картина несколько изменится):
Также, найдем количество постов компаний (здесь не учитываются посты, написанные компанией только для своего блога):
Граф связей хабов на Хабрахабре Создадим функцию, вычисляющую меру схожести двух хабов по спискам постов, которые в них опубликованы, на основе коэффициента Сёренсена:
Создадим список всех возможных пар хабов (хабы компаний мы не рассматриваем):
Вычислим для каждой пары хабов их коэффициент сходства:
Создадим списки, задающие ребра графа и их веса:
Для раскраски создадим функцию, нормирующую полученные значения коэффициента сходства на отрезок [0; 1]:
Зададим цвет, толщину и прозрачность ребер в зависимости от коэффициента сходства. Чем больше вес ребра, тем оно толще и краснее. Чем его вес меньше, тем оно прозрачнее и тоньше.
Полученный граф интерактивен, при наведении на каждую из вершин можно увидеть ее название.
Можно также изменить стиль этого графа, отобразив названия вершин. Посмотреть этот граф в натуральном размере можно по ссылке (изображение, 12 МБ).
Количество статей в зависимости от времени Создадим функцию, визуализации количества опубликованных статей как на всем Хабрахабре, так и в некотором хабе:
Посмотрим на результаты ее работы. Из полученных графиков видно, что в настоящий момент, по-видимому, наблюдается выход количества публикуемых в год на Хабрахабре постов на плато, приближаясь к значению 11000 постов в год.
Начиная с 2012 года наблюдается стремительный рост публикаций в хабе «Математика»:
С 2011 года можно наблюдать затухание интереса к Flash:
В то же время, с 2010 года хаб «Game Development» растет просто как на дрожжах:
Что интересно, в хаб «Хабрахабр» поступает все меньше статей.
Количество изображений (видео), используемых в постах в зависимости от времени Создадим функцию, визуализации количества изображений (или видео), в опубликованных постах, как на всем Хабрахабре, так и в некотором хабе:
Посмотрим на некоторые хабы:
Облака ключевых слов Хабрахабра и отдельных хабов Найдем список количеств употребления ключевых слов среди всех анализируемых постов на Хабрахабре:
Выберем 150 наиболее распространенных среди них:
Создадим из них облако слов, в котором размер слова (или словосочетания) прямо пропорционален количеству его указаний:
Мы также можем создать из некоторой строки маску:
и сделать на ее основе облако слов, содержащее уже 750 самых распространненных ключевых слов (словосочетаний):
Можно также сделать облако слов в любой форме:
Теперь создадиф функцию, которая будет визуализировать облака самых популярных ключевых слов некоторого хаба (по умолчанию будет использоваться 100 слов):
100 ключевых слова хаба «Математика»:
30 ключевых слов хаба «Математика»:
Ключевые слова хаба «Программирование»:
Ключевые слова хаба «JAVA»:
200 ключевых слов хаба «Open source»:
Сайты, на которые ссылаются в статьях на Хабрахабре Создадим функцию, которая будет показывать сайты, на которые чаще всего ссылаются как на Хабрахабре вообще, так и в некотором хабе:
Найдем сайты, на которые чаще всего ссылаются на Хабрахабре:
Картина становится яснее, если убрать главный источник ссылок — сам Хабрахабр.
Найдем сайты, на которые чаще всего ссылаются в хабе «Математика» (при этом мы везде удалим сам Хабрахабр, так как на него всюду ссылаются, что очевидно, чаще всего):
Теперь посмотрим, скажем, на хаб «Разработка под iOS»:
А вот хаб ».NET»:
Коды, которые приводят в статьях на Хабрахабре Найдем долю статей, в которых нет вставок кода (здесь возможна серьезная погрешность, так как не всегда код вставляется авторами с помощью специального тэга — скажем, в этом посте он вставлен в виде изображений).
Создадим функцию, которая будет показывать статистику языков вставок кода в посты, как на Хабрахабре вообще, так и в некотором хабе. При этом, если автор не указал код, то такой фрагмент будет помечен названием «SomeCode». Также, здесь мы не производим обработку названий языков, указанных авторами.
Найдем распределение языков вставок кода для всего Хабрахабра:
Картина станет более ясной, если удалить вставки, у которых не указан язык программирования:
Картина становится яснее, если убрать главный источник ссылок — сам Хабрахабр.
Посмотрим теперь на самые популярные языки программирования вставок кода в хабе «Программирование»:
Хаб «Веб-разработка»:
Хаб «Настройка Linux»:
Хаб «Поисковые машины и технологии»:
Частота встречи слов Сервис Яндекса «Подбор слов» очень полезен, если вы хотите написать, скажем, статью, которая будет интересна широкой аудитории. Этот сервис позволяет посмотреть частоту поисковых запросов слов. На основе подгруженной информации о статьях Хабрахабра можно сделать некий аналог этого сервиса, выдающий частоту встречи слов (их групп или регулярных выражений) в тексте статей. Это позволяет проследить интерес аудитории к той или иной теме.Итак, создадим функцию, которая будет выдавать такого рода частоту встречаемости слов:
Теперь можно посмотреть разные вещи, скажем, можно сравнить, какое название ресурса «Хабрахабр» или «Хабр» чаще употребляется на Хабрахабре:
Или же можно сравнить частоту употребления названий различных языков программирования всюду на Хабрахабе:
Сравним частоту упоминаний математических пакетов (выражения вида «строка»~~_ (они использовались и в предыдущем примере) позволяют задавать коллекции строк с разными окончаниями, скажем, выражение «вольфрам»~~_ задаст коллекцию строк «вольфрам», «вольфраму», «вольфраме» и пр.):
Можно, конечно, интересоваться разными вещами, скажем, узнать частоту встреч слов группы «Россия», «США» и «Европа»:
Или же можно наблюдать постепенное угасание (заморозку) интереса к какой-то технологии:
Или рождение новой:
Также можно смотреть на частоту употребления слов в отдельных хабах. Скажем, частота употребления слов «iOS» и «Аndroid» в хабе «Разработка под iOS».
Или те же слова, но в хабе «Разработка под Android».
Можно сравнить частоту употребления названий операционных систем в хабе «Open source»:
с Хабрахабром в целом:
Рейтинг и числа просмотров постов, а также вероятность достижения их определенных значений Выделим пары рейтинг поста + числа просмотров поста:
Построим их распределение на плоскости в обычном и логарифмическом масштабах:
Недостатком этих графиков является то, что они не отражают плотности распределения точек на них.
Построим двумерную и трехмерную плотность распределения рассматриваемых пар:
Средний рейтинг поста на Хабрахабре равен 35, а среднее количество просмотров 14374.6
Однако, это не статистическая характеристика. Построим распределение пар (создадим распределение двумерной случайной величины):
Найдем математическое ожидание:
А также среднеквадратическое отклонение:
Также можно найти вероятность, например, того, что пост наберет определенный рейтинг:
Найдем теперь вероятность, того, что пост наберет определенное число просмотров:
Зависимость рейтинга и числа просмотров поста от времени публикации Из кода ниже видно, что за все время на Хабре все статьи набрали суммарный рейтинг порядка 2,1 млн., а суммарное количество их просмотров приближается к 1 млрд.:
Выделим тройки время публикации поста + рейтинг поста + количество просмотров поста:
Изучим поведение рейтинга постов в зависимости от времени публикации:
Изучим число просмотров постов в зависимости от времени публикации:
Зависимость рейтинга поста от его объема Выделим пары вида длина поста + рейтинг поста (длина поста — мы будем ее называть далее объемом поста — врассчитывается как общее числов символов в посте):
Построим их распределение на плоскости в обычном и логарифмическом масштабах:
Построим двумерную и трехмерную плотность распределения рассматриваемых пар:
Средний объем поста на Хабрахабре равен 6007 символов.
Как и раньше, построим распределение рассматриваемых пар (создадим распределение двумерной случайной величины):
Найдем вероятность того, что пост с объемом не превышающим заданное количество символов наберет рейтинг не менее заданного:
Надеюсь, что проведенный анализ смог заинтересовать вас, а также будет вам полезен. Безусловно, на основе полученной базы данных можно провести еще массу всевозможных исследований, скажем, ответить на такие вопросы: будет ли данный пост популярен (предсказание уровня популярности)? что влияет на количество комментариев? как найти оптимальную тему для поста? и многое другое. Но это уже темы для будущих постов.