Детальный анализ Хабрахабра с помощью языка Wolfram Language (Mathematica)

12cba89588904b45ba9671c61609bb18.png Скачать пост в виде документа Mathematica, который содержит весь код использованный в статье, вместе с дополнительными файлами, можно здесь (архив, ~147 МБ).Анализ социальных сетей и всевозможных медиа-ресурсов является сейчас довольно популярным направлением и тем удивительнее для меня было обнаружить, что на Хабрахабре, по сути, нет статей, которые содержали бы анализ большого количества информации (постов, ключевых слов, комментариев и пр.), накопленного на нем за довольно большой период работы.

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

В посте будут рассматриваться статьи, относящиеся к хабам, всего в анализе участвовало 62000 статей из 264 хабов. Статьи, написанные только для корпоративных блогов компаний в посте не рассматривались.

Ввиду того, что база данных, построенная в посте, формировалась за некоторое время до публикации, а именно 26 апреля 2015 г., посты, опубликованные на Хабрахабре после этой даты (а также, возможно, новые хабы) в данном посте не рассматривались.

Импорт списка хабовИмпорт ссылок на все статьи ХабрахабраИмпорт всех статей ХабрахабраФункции извлечения конкретнных данных из символьного XML представления постаСоздание базы данных постов Хабрахабра с помощью DatasetРезультаты обработки данных— Краткий анализ хабов— Граф связей хабов на Хабрахабре— Количество статей в зависимости от времени— Количество изображений (видео), используемых в постах в зависимости от времени— Облака ключевых слов Хабрахабра и отдельных хабов— Сайты, на которые ссылаются в статьях на Хабрахабре— Коды, которые приводят в статьях на Хабрахабре— Частота встречи слов— Рейтинг и числа просмотров постов, а также вероятность достижения их определенных значений— Зависимость рейтинга и числа просмотров поста от времени публикации— Зависимость рейтинга поста от его объемаЗаключениеИмпортируем список хабов и представим их в виде встроенного формата баз данных Dataset для удобства дальнейшей работы.HabrAnalysisInWolframLanguage_1.png

HabrAnalysisInWolframLanguage_2.png

HabrAnalysisInWolframLanguage_3.png

HabrAnalysisInWolframLanguage_4.png

Функция импорта ссылки с n-й страницы некоторого хаба: HabrAnalysisInWolframLanguage_5.png

Функция импорта ссылок на все статьи, находящиеся в некотором хабе:

HabrAnalysisInWolframLanguage_6.png

Функция импорта ссылок на все посты из всех хабов (кроме корпоративных блогов):

HabrAnalysisInWolframLanguage_7.png

Импорт с сохранением в бинарный дамп-файл Wolfram Language (для последующего мгновенного использования) ссылок на все посты из всех хабов:

HabrAnalysisInWolframLanguage_8.png

Всего в базе ссылок на посты: HabrAnalysisInWolframLanguage_9.png

HabrAnalysisInWolframLanguage_10.png

При этом, среди них довольно много дублей, что связано с тем, что один и тот же пост часто относится к разным хабам. Всего дублирующихся постов ~30,6%, что видно из кода ниже.

HabrAnalysisInWolframLanguage_11.png

HabrAnalysisInWolframLanguage_12.png

Создадим список, состоящий из уникальных ссылок на посты:

HabrAnalysisInWolframLanguage_13.png

HabrAnalysisInWolframLanguage_14.png

Всего мы имеем 62000 ссылок, которые соответствуют такому же количеству статей.

HabrAnalysisInWolframLanguage_15.png

HabrAnalysisInWolframLanguage_16.png

Создадим функцию, отвечающую за импорт HTML кода веб-страницы (поста) в виде символьного XML объекта (XMLObject) по ссылке на эту страницу, которая на выходе создает серийный пакет .mx языка Wolfram Language.

HabrAnalysisInWolframLanguage_17.png

Запустим загрузку всех постов:

HabrAnalysisInWolframLanguage_18.png

После окончания загрузки мы получим 62000 файлов на жестком диске:

HabrAnalysisInWolframLanguage_19.png

После того, как мы подгрузили все посты с Хабрахабра в формате символьных XML объектов, нам потребуется извлечь из них интересющую нас информацию. Для этого мы создадим ряд функций, представленных ниже.Заголовок поста

HabrAnalysisInWolframLanguage_20.png

Список хабов, в которых опубликован пост

HabrAnalysisInWolframLanguage_21.png

Дата и время публикации поста в формате абсолютного времени (для удобства дальнейшей работы).

HabrAnalysisInWolframLanguage_22.gif

Рейтинг поста

HabrAnalysisInWolframLanguage_23.png

Количество просмотров поста

HabrAnalysisInWolframLanguage_24.png

Статистика гиперссылок, приведенных в посте

HabrAnalysisInWolframLanguage_25.png

Количество изображений, использованных в посте

HabrAnalysisInWolframLanguage_26.png

Количество комментариев к посту

HabrAnalysisInWolframLanguage_27.png

Количество видео, вставленных в пост

HabrAnalysisInWolframLanguage_28.png

Текст поста в стандартизованной форме (устранены абзацы, все буквы сделаны прописными)

HabrAnalysisInWolframLanguage_29.gif

Статистика кодов, приведенных в посте

HabrAnalysisInWolframLanguage_30.png

Ключевые слова

HabrAnalysisInWolframLanguage_31.png

В ряде случаев, доступ к постам закрыт по разным причинам. При этом, если перейти по соответствующей ссылки, можно увидеть страницу такого рода: HabrAnalysisInWolframLanguage_32.png

Создадим функцию, отсеивающую такие страницы:

HabrAnalysisInWolframLanguage_33.gif

Теперь подгрузим пути до всех файлов .mx, в которых хранятся посты:

HabrAnalysisInWolframLanguage_34.png

HabrAnalysisInWolframLanguage_35.png

И удалим закрытые:

HabrAnalysisInWolframLanguage_36.png

Всего было удалено около 0,5% постов, являющихся закрытыми:

HabrAnalysisInWolframLanguage_37.png

HabrAnalysisInWolframLanguage_38.png

Создадим функцию, которая будет создавать строку базы данных о постах Хабрахабра, которую мы получим ниже. Мы сделаем это с помощью созданных ранее функций, а также функции Association.

HabrAnalysisInWolframLanguage_39.png

Наконец, сформируем с помощью функции Dataset базу данных постов Хабрахабра:

HabrAnalysisInWolframLanguage_40.png

HabrAnalysisInWolframLanguage_41.png

HabrAnalysisInWolframLanguage_42.png

Краткий анализ хабов Найдем распределение количества хабов, в которых размещена статья: HabrAnalysisInWolframLanguage_43.png

HabrAnalysisInWolframLanguage_44.png

Представим этот фрагмент Dataset в виде таблицы:

HabrAnalysisInWolframLanguage_45.png

HabrAnalysisInWolframLanguage_46.png

Найдем самые большие Хабы по количеству статей:

HabrAnalysisInWolframLanguage_47.png

HabrAnalysisInWolframLanguage_48.png

Если рассмотреть только уникальные статьи (относящиеся только к одному хабу, то картина несколько изменится):

HabrAnalysisInWolframLanguage_49.png

HabrAnalysisInWolframLanguage_50.png

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

HabrAnalysisInWolframLanguage_51.png

HabrAnalysisInWolframLanguage_52.png

Граф связей хабов на Хабрахабре Создадим функцию, вычисляющую меру схожести двух хабов по спискам постов, которые в них опубликованы, на основе коэффициента Сёренсена: HabrAnalysisInWolframLanguage_53.gif

Создадим список всех возможных пар хабов (хабы компаний мы не рассматриваем):

HabrAnalysisInWolframLanguage_54.png

Вычислим для каждой пары хабов их коэффициент сходства:

HabrAnalysisInWolframLanguage_55.png

Создадим списки, задающие ребра графа и их веса:

HabrAnalysisInWolframLanguage_56.png

Для раскраски создадим функцию, нормирующую полученные значения коэффициента сходства на отрезок [0; 1]:

HabrAnalysisInWolframLanguage_57.png

Зададим цвет, толщину и прозрачность ребер в зависимости от коэффициента сходства. Чем больше вес ребра, тем оно толще и краснее. Чем его вес меньше, тем оно прозрачнее и тоньше.

HabrAnalysisInWolframLanguage_58.png

Полученный граф интерактивен, при наведении на каждую из вершин можно увидеть ее название.krf5t.gif

HabrAnalysisInWolframLanguage_59.png

HabrAnalysisInWolframLanguage_60.png

Можно также изменить стиль этого графа, отобразив названия вершин. Посмотреть этот граф в натуральном размере можно по ссылке (изображение, 12 МБ).

HabrAnalysisInWolframLanguage_61.png

HabrAnalysisInWolframLanguage_62.png

Количество статей в зависимости от времени Создадим функцию, визуализации количества опубликованных статей как на всем Хабрахабре, так и в некотором хабе: HabrAnalysisInWolframLanguage_63.png

Посмотрим на результаты ее работы. Из полученных графиков видно, что в настоящий момент, по-видимому, наблюдается выход количества публикуемых в год на Хабрахабре постов на плато, приближаясь к значению 11000 постов в год.

HabrAnalysisInWolframLanguage_64.png

HabrAnalysisInWolframLanguage_65.png

Начиная с 2012 года наблюдается стремительный рост публикаций в хабе «Математика»:

HabrAnalysisInWolframLanguage_66.png

HabrAnalysisInWolframLanguage_67.png

С 2011 года можно наблюдать затухание интереса к Flash:

HabrAnalysisInWolframLanguage_68.png

HabrAnalysisInWolframLanguage_69.png

В то же время, с 2010 года хаб «Game Development» растет просто как на дрожжах:

HabrAnalysisInWolframLanguage_70.png

HabrAnalysisInWolframLanguage_71.png

Что интересно, в хаб «Хабрахабр» поступает все меньше статей.

HabrAnalysisInWolframLanguage_72.png

HabrAnalysisInWolframLanguage_73.png

Количество изображений (видео), используемых в постах в зависимости от времени Создадим функцию, визуализации количества изображений (или видео), в опубликованных постах, как на всем Хабрахабре, так и в некотором хабе: HabrAnalysisInWolframLanguage_74.png

HabrAnalysisInWolframLanguage_75.png

HabrAnalysisInWolframLanguage_76.png

HabrAnalysisInWolframLanguage_77.png

HabrAnalysisInWolframLanguage_78.png

HabrAnalysisInWolframLanguage_79.png

HabrAnalysisInWolframLanguage_80.png

HabrAnalysisInWolframLanguage_81.png

HabrAnalysisInWolframLanguage_82.png

Посмотрим на некоторые хабы:

HabrAnalysisInWolframLanguage_83.png

HabrAnalysisInWolframLanguage_84.png

HabrAnalysisInWolframLanguage_85.png

HabrAnalysisInWolframLanguage_86.png

HabrAnalysisInWolframLanguage_87.png

HabrAnalysisInWolframLanguage_88.png

Облака ключевых слов Хабрахабра и отдельных хабов Найдем список количеств употребления ключевых слов среди всех анализируемых постов на Хабрахабре: HabrAnalysisInWolframLanguage_89.png

HabrAnalysisInWolframLanguage_90.png

Выберем 150 наиболее распространенных среди них:

HabrAnalysisInWolframLanguage_91.png

HabrAnalysisInWolframLanguage_92.png

Создадим из них облако слов, в котором размер слова (или словосочетания) прямо пропорционален количеству его указаний:

HabrAnalysisInWolframLanguage_93.png

HabrAnalysisInWolframLanguage_94.png

Мы также можем создать из некоторой строки маску:

HabrAnalysisInWolframLanguage_95.png

HabrAnalysisInWolframLanguage_96.png

и сделать на ее основе облако слов, содержащее уже 750 самых распространненных ключевых слов (словосочетаний):

HabrAnalysisInWolframLanguage_97.png

HabrAnalysisInWolframLanguage_98.png

Можно также сделать облако слов в любой форме:

HabrAnalysisInWolframLanguage_99.png

HabrAnalysisInWolframLanguage_100.png

Теперь создадиф функцию, которая будет визуализировать облака самых популярных ключевых слов некоторого хаба (по умолчанию будет использоваться 100 слов):

HabrAnalysisInWolframLanguage_101.png

100 ключевых слова хаба «Математика»:

HabrAnalysisInWolframLanguage_102.png

HabrAnalysisInWolframLanguage_103.png

30 ключевых слов хаба «Математика»:

HabrAnalysisInWolframLanguage_104.png

HabrAnalysisInWolframLanguage_105.png

Ключевые слова хаба «Программирование»:

HabrAnalysisInWolframLanguage_106.png

HabrAnalysisInWolframLanguage_107.png

Ключевые слова хаба «JAVA»:

HabrAnalysisInWolframLanguage_108.png

HabrAnalysisInWolframLanguage_109.png

200 ключевых слов хаба «Open source»:

HabrAnalysisInWolframLanguage_110.png

HabrAnalysisInWolframLanguage_111.png

Сайты, на которые ссылаются в статьях на Хабрахабре Создадим функцию, которая будет показывать сайты, на которые чаще всего ссылаются как на Хабрахабре вообще, так и в некотором хабе: HabrAnalysisInWolframLanguage_112.png

Найдем сайты, на которые чаще всего ссылаются на Хабрахабре:

HabrAnalysisInWolframLanguage_113.png

HabrAnalysisInWolframLanguage_114.png

Картина становится яснее, если убрать главный источник ссылок — сам Хабрахабр.

HabrAnalysisInWolframLanguage_115.png

HabrAnalysisInWolframLanguage_116.png

Найдем сайты, на которые чаще всего ссылаются в хабе «Математика» (при этом мы везде удалим сам Хабрахабр, так как на него всюду ссылаются, что очевидно, чаще всего):

HabrAnalysisInWolframLanguage_117.png

HabrAnalysisInWolframLanguage_118.png

Теперь посмотрим, скажем, на хаб «Разработка под iOS»:

HabrAnalysisInWolframLanguage_119.png

HabrAnalysisInWolframLanguage_120.png

А вот хаб ».NET»:

HabrAnalysisInWolframLanguage_121.png

HabrAnalysisInWolframLanguage_122.png

Коды, которые приводят в статьях на Хабрахабре Найдем долю статей, в которых нет вставок кода (здесь возможна серьезная погрешность, так как не всегда код вставляется авторами с помощью специального тэга — скажем, в этом посте он вставлен в виде изображений).HabrAnalysisInWolframLanguage_123.png

HabrAnalysisInWolframLanguage_124.png

Создадим функцию, которая будет показывать статистику языков вставок кода в посты, как на Хабрахабре вообще, так и в некотором хабе. При этом, если автор не указал код, то такой фрагмент будет помечен названием «SomeCode». Также, здесь мы не производим обработку названий языков, указанных авторами.

HabrAnalysisInWolframLanguage_125.png

Найдем распределение языков вставок кода для всего Хабрахабра:

HabrAnalysisInWolframLanguage_126.png

HabrAnalysisInWolframLanguage_127.png

Картина станет более ясной, если удалить вставки, у которых не указан язык программирования:

HabrAnalysisInWolframLanguage_128.png

HabrAnalysisInWolframLanguage_129.png

Картина становится яснее, если убрать главный источник ссылок — сам Хабрахабр.

HabrAnalysisInWolframLanguage_130.png

HabrAnalysisInWolframLanguage_131.png

Посмотрим теперь на самые популярные языки программирования вставок кода в хабе «Программирование»:

HabrAnalysisInWolframLanguage_132.png

HabrAnalysisInWolframLanguage_133.png

Хаб «Веб-разработка»:

HabrAnalysisInWolframLanguage_134.png

HabrAnalysisInWolframLanguage_135.png

Хаб «Настройка Linux»:

HabrAnalysisInWolframLanguage_136.png

HabrAnalysisInWolframLanguage_137.png

Хаб «Поисковые машины и технологии»:

HabrAnalysisInWolframLanguage_138.png

HabrAnalysisInWolframLanguage_139.png

Частота встречи слов Сервис Яндекса «Подбор слов» очень полезен, если вы хотите написать, скажем, статью, которая будет интересна широкой аудитории. Этот сервис позволяет посмотреть частоту поисковых запросов слов. На основе подгруженной информации о статьях Хабрахабра можно сделать некий аналог этого сервиса, выдающий частоту встречи слов (их групп или регулярных выражений) в тексте статей. Это позволяет проследить интерес аудитории к той или иной теме.Итак, создадим функцию, которая будет выдавать такого рода частоту встречаемости слов:

HabrAnalysisInWolframLanguage_140.gif

Теперь можно посмотреть разные вещи, скажем, можно сравнить, какое название ресурса «Хабрахабр» или «Хабр» чаще употребляется на Хабрахабре:

HabrAnalysisInWolframLanguage_141.png

HabrAnalysisInWolframLanguage_142.png

Или же можно сравнить частоту употребления названий различных языков программирования всюду на Хабрахабе:

HabrAnalysisInWolframLanguage_143.png

HabrAnalysisInWolframLanguage_144.png

Сравним частоту упоминаний математических пакетов (выражения вида «строка»~~_ (они использовались и в предыдущем примере) позволяют задавать коллекции строк с разными окончаниями, скажем, выражение «вольфрам»~~_ задаст коллекцию строк «вольфрам», «вольфраму», «вольфраме» и пр.):

HabrAnalysisInWolframLanguage_145.png

HabrAnalysisInWolframLanguage_146.png

Можно, конечно, интересоваться разными вещами, скажем, узнать частоту встреч слов группы «Россия», «США» и «Европа»:

HabrAnalysisInWolframLanguage_147.png

HabrAnalysisInWolframLanguage_148.png

Или же можно наблюдать постепенное угасание (заморозку) интереса к какой-то технологии:

HabrAnalysisInWolframLanguage_149.png

HabrAnalysisInWolframLanguage_150.png

Или рождение новой:

HabrAnalysisInWolframLanguage_151.png

HabrAnalysisInWolframLanguage_152.png

Также можно смотреть на частоту употребления слов в отдельных хабах. Скажем, частота употребления слов «iOS» и «Аndroid» в хабе «Разработка под iOS».

HabrAnalysisInWolframLanguage_153.png

HabrAnalysisInWolframLanguage_154.png

Или те же слова, но в хабе «Разработка под Android».

HabrAnalysisInWolframLanguage_155.png

HabrAnalysisInWolframLanguage_156.png

Можно сравнить частоту употребления названий операционных систем в хабе «Open source»:

HabrAnalysisInWolframLanguage_157.png

HabrAnalysisInWolframLanguage_158.png

с Хабрахабром в целом:

HabrAnalysisInWolframLanguage_159.png

HabrAnalysisInWolframLanguage_160.png

Рейтинг и числа просмотров постов, а также вероятность достижения их определенных значений Выделим пары рейтинг поста + числа просмотров поста: HabrAnalysisInWolframLanguage_161.png

HabrAnalysisInWolframLanguage_162.png

Построим их распределение на плоскости в обычном и логарифмическом масштабах:

HabrAnalysisInWolframLanguage_163.png

HabrAnalysisInWolframLanguage_164.png

Недостатком этих графиков является то, что они не отражают плотности распределения точек на них.

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

HabrAnalysisInWolframLanguage_165.png

HabrAnalysisInWolframLanguage_166.png

HabrAnalysisInWolframLanguage_167.png

Средний рейтинг поста на Хабрахабре равен 35, а среднее количество просмотров 14374.6

HabrAnalysisInWolframLanguage_168.png

HabrAnalysisInWolframLanguage_169.png

Однако, это не статистическая характеристика. Построим распределение пар (создадим распределение двумерной случайной величины):

HabrAnalysisInWolframLanguage_170.png

HabrAnalysisInWolframLanguage_171.png

Найдем математическое ожидание:

HabrAnalysisInWolframLanguage_172.png

HabrAnalysisInWolframLanguage_173.png

А также среднеквадратическое отклонение:

HabrAnalysisInWolframLanguage_174.png

HabrAnalysisInWolframLanguage_175.png

Также можно найти вероятность, например, того, что пост наберет определенный рейтинг:

HabrAnalysisInWolframLanguage_176.png

HabrAnalysisInWolframLanguage_177.png

Найдем теперь вероятность, того, что пост наберет определенное число просмотров:

HabrAnalysisInWolframLanguage_178.png

HabrAnalysisInWolframLanguage_179.png

Зависимость рейтинга и числа просмотров поста от времени публикации Из кода ниже видно, что за все время на Хабре все статьи набрали суммарный рейтинг порядка 2,1 млн., а суммарное количество их просмотров приближается к 1 млрд.: HabrAnalysisInWolframLanguage_180.png

HabrAnalysisInWolframLanguage_181.png

Выделим тройки время публикации поста + рейтинг поста + количество просмотров поста:

HabrAnalysisInWolframLanguage_182.png

Изучим поведение рейтинга постов в зависимости от времени публикации:

HabrAnalysisInWolframLanguage_183.png

HabrAnalysisInWolframLanguage_184.png

HabrAnalysisInWolframLanguage_185.png

HabrAnalysisInWolframLanguage_186.png

HabrAnalysisInWolframLanguage_187.png

HabrAnalysisInWolframLanguage_188.png

HabrAnalysisInWolframLanguage_189.png

HabrAnalysisInWolframLanguage_190.png

Изучим число просмотров  постов в зависимости от времени публикации:

HabrAnalysisInWolframLanguage_191.png

HabrAnalysisInWolframLanguage_192.png

HabrAnalysisInWolframLanguage_193.png

HabrAnalysisInWolframLanguage_194.png

HabrAnalysisInWolframLanguage_195.png

HabrAnalysisInWolframLanguage_196.png

HabrAnalysisInWolframLanguage_197.png

HabrAnalysisInWolframLanguage_198.png

Зависимость рейтинга поста от его объема Выделим пары вида длина поста + рейтинг поста (длина поста — мы будем ее называть далее объемом поста — врассчитывается как общее числов символов в посте): HabrAnalysisInWolframLanguage_199.png

HabrAnalysisInWolframLanguage_200.png

Построим их распределение на плоскости в обычном и логарифмическом масштабах:

HabrAnalysisInWolframLanguage_201.png

HabrAnalysisInWolframLanguage_202.png

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

HabrAnalysisInWolframLanguage_203.png

HabrAnalysisInWolframLanguage_204.png

HabrAnalysisInWolframLanguage_205.png

Средний объем поста на Хабрахабре равен 6007 символов.

HabrAnalysisInWolframLanguage_206.png

HabrAnalysisInWolframLanguage_207.png

Как и раньше, построим распределение рассматриваемых пар (создадим распределение двумерной случайной величины):

HabrAnalysisInWolframLanguage_208.png

HabrAnalysisInWolframLanguage_209.png

Найдем вероятность того, что пост с объемом не превышающим заданное количество символов наберет рейтинг не менее заданного:

HabrAnalysisInWolframLanguage_210.gif

HabrAnalysisInWolframLanguage_211.png

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

© Habrahabr.ru