DTF — значит DaTaFrame. Разбираемся с 3 млн комментариев с DTF при помощи Data Science

Не так давно дорогой пользователь Карасик рассказал нам о том, что он смог посредством API сайта добыть почти три миллиона комментариев, а также поделился анализом собранной статистики. К моей великой радости, он оставил ссылку на дасатет, который решил исследовать и ваш покорный слуга.

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

DTF — значит DaTaFrame. Разбираемся с 3 млн комментариев с DTF при помощи Data Science

Датасет

Сырые данные представляют собой SQL-таблицу из 2913273 строк (скачать можно тут). Столбцы следующие: идентификатор, автор, содержание комментария (только текст) и время создания. В базе только те комментарии, что были запощены в период с 17 сентября 2023 года по 5 марта 2024 года — то есть, по сути, в относительно последние полгода жизни ресурса — за вычетом небольшой доли из-за ошибок выгрузки (подробности в посте Карасика).

Текстовое наполнение — это богатый кладезь лингвистической информации о пользователях DTF, которую я не умею извлекать и обрабатывать, и которая мне до поры до времени не интересна, а потому я оставляю эту часть работы для других исследователей. Меня больше интересует поведение, выраженное через числовые метрики.

Первое, что я сделал, это удалил дубликаты по двум признакам: автор и время создания. Очевидно, что один человек не сможет запостить два коммента одновременно, если это, конечно не баг. Конечно, в наборе есть тёзки, и вполне возможно, что они комментировали одновременно. Но здесь проблема в том, что в таблице комментариев указан только ник автора, а не его ID. Придётся смириться с этим и предположить, что тёзок мало, чтобы повлиять на статистику. Другая причина в образовании дубликатов — ошибки при выгрузке данных через API. Таким образом, после очистки датасет незначительно уменьшился до 2912335 строк.

Из них в 85175 комментариях не содержалось текста, а у 41 авторов не было имени. Первое — это в первую очередь комменты с картинками, гифками и прочими медиа. Второе — нет, не удаленные аккаунты (такие помечаются именами вроде «Новенький Мика» или «Неверный Валера»), а совокупные строки от всех аккаунтов с именем null (как, например, вот этот товарищ) или аналогичных, вызывающих NaN в таблице. Таких строк около 160, и они не портят статистику.

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

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

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

Если кто не знает, что такое гистограмма: по оси x отложено количество комментариев, по y — число авторов в пределах некоторого окна (бина)
Если кто не знает, что такое гистограмма: по оси x отложено количество комментариев, по y — число авторов в пределах некоторого окна (бина)

График абсолютно неинформативный, не в последнюю очередь из-за Ника СЦК и ему подобным, постящим какие-то невероятные тонны комментов. Если бы передо мной стояла задача строить на этих данных модель машинного обучения, мне надо было бы избавиться от них — это выбросы (без негатива, это такой общепринятый термин!).

Но и это бы не сильно помогло, ведь секрет тут в другом: ось x надо логарифмировать

DTF — значит DaTaFrame. Разбираемся с 3 млн комментариев с DTF при помощи Data Science

Вот теперь мы получили экспоненциальное распределение, с которым можно работать. Но на самом деле есть ещё кое-что. Давайте логарифмируем ось y.

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

Смотрите: как и положено правильному экспоненциальному распределению, оно линейно убывает. Но примерно с отметки в 20 комментариев происходит что-то странное — возникает нормальный горб (если вычесть экспоненту). Что это за горб, станет ясно ближе к концу этого лонга.

Статистика текстов

Следующими нужно рассмотреть параметры, которые как-то информативно охарактеризовали бы нам совокупность комментариев одного автора — другими словами, провести фич инжиниринг. Я остановил свой выбор на средней длине комментария, а также на среднеквадратичном отклонении этой длины. Первая величина показывает нам то, как часто степень комментатор «растекается по древу» (в пределах фиксированного числа комментариев), второе — степень разнообразия длин его текстов. Если СКО большое, значит автор не гнушается как короткими ответами, так и длинными тирадами.

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

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

DTF — значит DaTaFrame. Разбираемся с 3 млн комментариев с DTF при помощи Data Science

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

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

Для закрепления покажу трёхмерную диаграмму рассеяния, где это облако показано в разрезе числа комментариев:

То же облако, но вид сбоку. Линии внизу - следствие дискретности числа комментариев.
То же облако, но вид сбоку. Линии внизу - следствие дискретности числа комментариев.

Тоже, в общем, ничего особенного: тишь, гладь да благодать.

Статистика времени

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

Но что насчёт среза по авторам? Каждый из них будет характеризоваться набором временных меток, на основе которых можно ввести описание его активности. После некоторых изысканий я остановил свой выбор на выборке интервалов между двумя соседними комментариями в минутах. Число интервалов, очевидно, на единицу меньше, чем число комментариев, поэтому здесь за бортом остаются люди с одним комментарием. Зато мне не мешают комментарии без текста и удаленные комментарии, d-uh!

Для характеризации интервальной выборки я также выбрал среднее значение и СКО. Среднее значение лучше всего интерпретируемо в двух случаях: когда пользователь заходит ежедневно и оставляет комментарии в течение дня, либо когда за полгода он зашёл на сайт всего один раз, но за это время успел настрочить с десяток сообщений. В промежуточных случаях значение среднего интервала не настолько прозрачно, хотя всё ещё обладает классификационной силой (мы увидим это далее). Но оно в любом случае лучше, чем банальное вычисление аналогичной метрики путём деления полугода на число комментариев, уменьшенное на единицу. Анализ показал, что последнее значение может служить пределом для среднего интервала, но с точки зрения информативности оно полностью эквивалентно числу комментариев, поэтому нам не подходит.

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

Среднеквадратичное отклонение призвано явно описывать как раз такие промежуточные случаи активности. Условно говоря, если пользователь заходит раз в месяц оставить пятёрку комментариев в один день, его СКО будет сильно больше, когда он делает это раз в полгода или когда он заходит ежедневно. Правда, для вычисления СКО нужно минимум три комментария, что ещё немного сокращает выборку.

Давайте построим гистограммы обеих параметров:

Вот тут начинаются самые интересности. Оба распределения преимущественно логнормальные (самый частый интервал между комментариями — 15 дней), но обладают видимым хвостом в области малых значений. В случае со средним интервалом хвост обладает ярко выраженной побочной модой на 4 минутах.

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

DTF — значит DaTaFrame. Разбираемся с 3 млн комментариев с DTF при помощи Data Science

Мы видим, что данные распадаются на две части, которые накладываются друг на друга. Поэтому прибегнем к трёхмерной диаграмме рассеяния:

DTF — значит DaTaFrame. Разбираемся с 3 млн комментариев с DTF при помощи Data Science

Для наглядности я покрутил наше распределение:

Это, наверное, самый интересный график по нашим данным. Сбоку он похож на акулу с торчащими над водой плавником и спиной и состоит из двух частей: той, в которой временные параметры убывают с ростом комментариев, и той, в которой явной зависимости нет. Граница между ними выражена не ярко — в области больших значений временных обе совокупности пересекаются, но без большой потери значимости можно разделить их границей в те самые 20 комментариев за эти полгода.

«Плавник» — это область тех, кто комментирует очень часто. Он демонстрирует в основном линейную связь между всеми тремя осями, обрываясь сверху в среднем на 6-7 тысячах комментариев. Таким образом, эта линия никогда не достигает малый временных областей, заканчиваясь в районе 40-минутных интервалов и 120-минутных СКО. Обратная связь среднего интервала с числом комментариев логична и понятна: чем больше ты пишешь в пределах полугода, тем теснее твои комментарии. Интересно также и то, что чем больше ты пишешь, тем однороднее интервалы: мало кто пишет десятки комментариев в день, а потом пропадает на месяц.

«Плавник». Вид сверху (без среза по числу комментариев).
«Плавник». Вид сверху (без среза по числу комментариев).

«Спина» нашей акулы ведёт себя иначе. Связь между средним интервалом и его СКО выглядит немного нелинейной. Соответствующая диаграмма рассеяния обладает логнормальным ядром — следом от «плавника», а также прорезана ярко выраженными линиями.

«Спина». Вид сверху.
«Спина». Вид сверху.

Природа этих линий лучше ясна, если убрать логарифмирование осей:

DTF — значит DaTaFrame. Разбираемся с 3 млн комментариев с DTF при помощи Data Science

Точки вдоль каждой из линий соответствуют разному числу комментариев n, но всех их объединяет определенный поведенческий шаблон. Например, все комментаторы на линии с n=3 постят два комментария с небольшим интервалом и третий — вдалеке от них, на линии с n=4 шаблон такой: две пары близких комментариев, разделенные большим интервалом и так далее. Все остальные авторы с тем же числом комментариев, но иным шаблоном активности ложатся ниже этих линий. Доля шаблонного поведения убывает с ростом n, и после 8 на линиях уже почти не бывает точек.

Структура данных в «спине» до n=6 включительно
Структура данных в «спине» до n=6 включительно

Итак, мы видим, что количество оставленных комментариев — это хороший признак, который позволяет не только разделить общую совокупность на две части, но и стратифицировать «спину». Не могу не отметить, что для хорошего разделения на «плавник» и «спину» лучше использовать какой-нибудь алгоритм кластеризации, но для приблизительного анализа этого признака достаточно. Граница в 20 комментариев делит датасет на 12003 «плавника» и 34566 «спин».

Фундаментальная разница между этими двумя группами в том, как двигаются со временем их точки. Это можно оценить, опять же, через прирост числа комментариев (хотя это можно было бы подробнее исследовать анализом с наращиванием датасета, но я не стал). «Спины» постят очень редко, и с каждым новым комментарием, оставленным после долгого перерыва, растёт их интервал и СКО, и в конечном итоге они оказываются в жирном облачке высоких значений (см вид сверху). «Плавники», напротив, двигаются в область малых временных параметров. Новички начинают с редких комментариев на сайте и похожи на «спины», но со временем их активность приобретает регулярность, и они начинают смещаться вверх вдоль «плавника».

Пожалуй, «плавники» — это и есть то самое пресловутое «ядро сообщества», которое пытаются нащупать многие проекты (кто помнит споры об этом на TJ, тот поймёт). Но ядро выделено исключительно с позиции комментариев, надо об этом не забывать!

А вот каких-то различий между длиной текста комментария и соответствующим СКО для «плавников» и «спин» я не обнаружил, поэтому графиков приводить не буду.

Заключение

Проведенный мною анализ выше — это куцый кусочек того, что можно было бы сделать при наличии полного датасета, горы времени и, желательно, вознаграждения. Во-первых, это только комментарии, во-вторых, только за полгода, в третьих, без языкового моделирования. Ограниченность набора требует относиться с осторожностью к полученным выше результатам.

Тем не менее, я доволен проделанным. Когда прикасаешься к живым данным, всегда чувствуешь лёгкий трепет от того, какая масштабная картина может перед тобой открыться. При этом результат анализа часто непредсказуем. Я был готов к тому, что профиль комментаторской активности будет таким же однородным, как распределение по длине комментов, но то, что удалось найти два ярко выраженных кластера сравнимо с эмоциями от научного открытия.

Зачем это может быть нужно? Ну, тут вопрос скорее к комьюнити-менеджерам, ежели таковые существуют на DTF. Возможно, профиль активности коррелирует с какими-то полезными целевыми признаками вроде покупки преимума или просмотрах постов. Это значит, что обучив модельку классифицировать юзеров, Комитет сможет таргетировать действия и, в конце концов, увеличить прибыль от проекта.

Но главное, что, надеюсь, понимают DTFные боссы — это данные. Данные — это новое золото, говорит нам Форбс. А качественные данные — ещё больше золота. Я лишь приоткрыл завесу того, чем владеет Комитет, и увидел, что здесь они именно такие, с хорошими распределениями и достаточно разнообразные, оставленные людьми разного пола, возрастов, профессий, уровня жизни и тд и тп.

Как можно использовать комментарии на DTF? Ну, например, при тестировании алгоритмов, определяющих токсичность текста. Или для формирования геймерского корпуса текстов для обучения соответствующих языковых моделей. Вариантов можно найти много.

У Карасика есть вторая часть датасета с постами. Если вам понравится моя работа, дайте мне обратную связь, и, возможно, я возьмусь и за посты тоже.

Ну и на случай, если не хватает слов для восхищения, оставлю тут ссылку на свой ЯК.

7777
41 комментарий

Привет! Статья просто пушка бомба, очень много незнакомых мне слов, и это отлично
Могу кинуть ссылку на датасет с 25 миллионами комментов и постов, если все таки возьмёшься за это)
Если захочешь прям заняться, то могу попробовать выгрузить вообще со всеми параметрами, с количеством лайков на комменты, и кстати, с удаленными постами и комментами. Теоретическая возможность есть, просто займет больше времени.
По сути и пол года описывают +- те же закономерности, просто где-то больше, где-то меньше.
Если ты шаришь за машинное обучение и т.д., буду очень рад помощи или кооперации в дообучении модели на комментах. Очень хочется сделать ИИ-дтфера
А уровень токсичности уже исследовал @Инфернальный гавноед

8

Круто, но ты бы пояснял что ли для гуманитариев и прочих далёких...
А то вот приводишь ты факт, описывая график:
На картинке видно, что по длительности комментариев и её разбросу пользователи образуют примерно вытянутое однородное облако с небольшим хвостом рассеяния в области малых значенийНо никак это не анализируешь. Что это значит? О чём свидетельствует? Не понятно нифига.

5

Короче сорян, но статья не понравилась в итоге. Да, круто, работа проделана, но ты просто описал графики, никак их не проанализировав. "Вот смотрите тут пик в районе 4 показателя" — ну ок, это я итак вижу. И?
Ну или я настолько тупой, что не понял ничего.

7

За старания лайк, но: поработай над структурой текста. Очень тяжело читать такие объёмы без какого-то разделения

6

Да, получился скорее техрепорт

4

мне надо было бы избавиться от них — это выбросыИ в чём автор не прав ))

6