Исследование больших объёмов информации

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

Поскольку я ещё не сталкивался с проблемой анализа данных такого объёма, этому придётся учиться в процессе решения задачи. По-видимому, объём данных составит порядка 5 ГБ. При этом хранение данных и необходимые вычисления можно будет производить на настольном компьютере — но только в специализированных программах, заточенных под большие объёмы данных (Excel, например, не подойдёт). Если же вычисления будут занимать слишком много времени, мне понадобится окунуться в увлекательный мир распределённых вычислений и освоить Hadoop.

1. Сначала я выведу на экран с помощью консольных команд несколько сотен первых символов, чтобы посмотреть какие разделители используются между различными полями и записями. (Эти команды не загружают файлы в оперативную память целиком и большой размер файла не должен быть проблемой). Затем также с помощью консольных команд, выпишу 200 случайно выбранных записей в отдельный файл в формате CSV и пристально посмотрю на него в Excel’е. Меня будут интересовать форматы записей (время, дата, IP адреса, географические координаты, etc) и диапазоны принимаемых значений (проценты, 5-бальные оценки, логические переменные, дни недели, номер дня в году, часы, секунды/минуты, etc), а также, то, можно ли какие-то из полей выразить через другие (в первую очередь линейно). Обращу внимание, на разные поля, имеющие одинаковый формат, проверю, если ли среди них такие, в которых одно поле всегда больше другого (это может быть временем начала и конца какого-либо процесса). Посмотрю, есть ли какие-нибудь поля, значение которых только возрастают или убывают (записи могут быть упорядочены по времени, номерам транзакций или идентификаторам и это позволит мне найти эти поля и обратить на них внимание).

Это позволит мне быстро познакомиться с различными полями, начать рассматривать некоторые из них в совокупности (если они выражаются друг через друга или имеют одинаковый формат) и, например, не тратить в дальнейшем время на вычисление дисперсии IP-адресов.

2. Изучу какую-нибудь реализацию парадигмы MapReduce, попутно пробуя новые знания на предложенном файле.

3. Изучу приложение для визуализации статистических данных (возможно среду R)

4. Проверю гипотезы из 1-го пункта на всех данных (или на достаточно крупной выборке, если на это будет уходить слишком много времени). Если в какой-то из них появятся исключения, посмотрю, можно ли немного изменить гипотезу, чтобы ей удовлетворяли все данные (например, дата принимает значение 0, если она не известна).

Найду для всех записей максимальные и минимальные значения, а затем для ускорения процесса буду исследовать только 50 000 случайно выбранных записей.

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

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

Для проверки гипотезы о зависимости двух величин я буду использовать точечные диаграммы и строить для них регрессии. Для «пары десятков полей» получится более 200 диаграмм и управиться с ними будет довольно проблематично, но, если на предыдущих этапах отсеять нерелевантые поля и достаточно будет исследовать, например, 10 полей, то диаграмм будет уже только 55 и их беглый анализ займёт не слишном много времени. Если у меня будет сильное ощущения, что несколько поля должны зависеть друг от друга, но эту зависимость не получится обнаружить на точечных диаграммах, я буду исследовать их с помощью машинного обучения (изучая его в процессе).

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

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

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