Выпивка, неформальная беседа, несколько графиков помогли кому-то взглянуть на данные в новом свете.
Фотография некрасивая по сравнению с тем, что люди публикуют в своих блогах, но с этим старым листом бумаги связана интересная история.

Несколько дней назад я чистил сумку, в которой слишком много отделений - типично для швейцарского снаряжения, и я нашел карман, к которому не прикасались годами. Небольшой потайной карман, в котором хранятся визитки, мятые бумаги и квитанции из прошлого. Именно тогда я обнаружил старую испачканную бумагу с грубым наброском того, что я нацарапал около 4 лет назад.
Пространственная информация: ирландский бар в Денвере, штат Колорадо.
Термодинамическая информация: исключительно жаркий вечер, идеально подходящий для цитрусовых напитков.
Временная информация: около 18:30.
Я приехал с восточного побережья в Денвер на коммерческую встречу с потенциальным клиентом, и все прошло не так хорошо, как планировалось. В конце концов, они урезали бюджет, и мое предложение было перенесено на следующий квартал. Мой обратный рейс был на следующее утро, и вечером у меня был запланирован ужин с этим клиентом. Что ж, консалтинг делает вас знатоком еды и напитков. Мы с Дэном решили встретиться в местном баре, чтобы выпить, прежде чем отправиться на ужин.
Поскольку это был особенно жаркий день, мы решили продлить наше пребывание в баре и выпить еще пару сортов пива (также потому, что Денвер довольно популярен в пивоварении, поэтому можно было попробовать много крафтового пива). Дэн рассказывал мне о происходящей реструктуризации бизнеса, которая на данный момент приведет к сокращению бюджета во всей организации. Их идея заключалась в том, чтобы сделать организацию стройной и гибкой и нанять больше людей в сфере технологий и аналитики.
Разговор каким-то образом перешел на создание новых отделов и поиск руководителей отделов внутри организации.
Я провел первичное исследование агентных моделей, и благодаря Томасу Шеллингу мне понравилось использовать это утверждение в разговорах, и это была прекрасная возможность.
То, что вы видите на макроскопическом уровне, может быть неверным на микроскопическом уровне.
Я, должно быть, нарисовал для него график на листе бумаги выше, чтобы показать ему, как люди из разных отделов связаны друг с другом и как иногда те, кто имеет высшие звания в отделе, могут не быть `` опорными точками '' или самыми важными в повседневной работе. Итак, , прежде чем прийти к твердому выводу, узнайте, что разные люди делают на своей работе, и не полагайтесь только на данные, предоставленные их руководителями, или на должность, которую они занимают. Я дал ему несколько идей о том, как это сделать и какие инструменты он мог бы использовать.
Три или четыре месяца вперед я снова встретил Дэна при запуске нового проекта, и именно тогда он сказал мне, что создал графики для небольших частей организации и количественно оценил важность людей в бизнес-среде. Я смоделирую случай, который он упомянул и который его заинтересовал.
Данные
Employee.csv содержит три основных столбца. Сотрудник_1 и Сотрудник_2 - это пара из двух человек, которые взаимодействовали бы друг с другом. Вес - это мера взаимодействия между ними. Это простой подсчет того, сколько раз Сотрудник_1 и Сотрудник_2 обменивались электронными письмами или присутствовали на одной встрече. Наблюдения проводились за последние 3 месяца.
Данные были собраны путем чтения метаданных электронной почты и SMTP-серверов, и при этом никто не нарушил конфиденциальность.
Настройте БД графиков
Нажмите «Добавить базу данных», введите имя пользователя и пароль, и все готово.


После добавления базы данных щелкните три горизонтальные точки, и в разделе «Управление» вы добавите несколько плагинов, которые сделают вашу работу немного проще.
На вкладке Plugins установите APOC и Graph Data Science Library.

Идите вперед, запустите свою БД и откройте браузер Neo4j. (Обратите внимание, что когда вы создаете свою БД впервые, количество узлов и связей будет равно 0)
Местоположение данных
Если вы используете macOS, то / Users / ‹ваша папка пользователя› / Library / Application Support / com.Neo4j.Relate / Data / dbmss / ‹папка, относящаяся к БД› / import /
Поместите ваши файлы .csv в папку импорта.
‹Папка, относящаяся к БД, которую вы создали выше› - Если это ваш первый проект, то у вас будет только одна папка в / dbmss, поэтому поместите туда свой .csv в / import небрежно и дерзко.
(Только для пользователей Mac: указанную выше папку намного легче найти в Windows или Linux, так как в macOS / Users / ‹ваша пользовательская папка› / Library скрыта, поэтому вы можете ввести / Users / ‹ваша пользовательская папка› / Library в прожектор поиск и добраться до папок)
Приколы
Загрузите CSV в БД
LOAD CSV WITH HEADERS FROM "file:///employee.csv" AS row
MERGE (emp1:Employee {name: row.Employee_1})
MERGE (emp2:Employee {name: row.Employee_2})
MERGE (emp1)-[r:INTERACTS]->(emp2) ON CREATE SET r.weight = toInteger(row.Weight)
Посмотрим, как это выглядит
Match(n) return(n)

Что ж, это простой график, который мало что делает для меня, кроме как говорит мне о том, что люди связаны друг с другом.
Найдем степень и взвешенную степень для каждого из сотрудников.
Степень - количество сотрудников, к которым подключен сотрудник.
Взвешенная степень - сумма весов отношений для каждого сотрудника.
#Degree MATCH (c:Employee) RETURN c.name AS employee, size( (c)-[:INTERACTS]-() ) AS degree ORDER BY degree #Weighted-Degree MATCH (c:Employee)-[r:INTERACTS]-() RETURN c.name AS employee, sum(r.Weight) AS weighteddegree ORDER BY weighteddegree


Цифры для степени и взвешенной степени сильно различаются, нам нужна более надежная метрика.
Попробуем найти PageRank для каждого из сотрудников. Он более надежен и фиксирует статус сотрудников на уровне всего графа, чем только на уровне их узлов.
#Create
CALL gds.graph.create('employee-interactions', 'Employee', {INTERACTS: {orientation: 'UNDIRECTED'}})
#Stream
CALL gds.pageRank.stream('employee-interactions') YIELD id, pgscore Return gds.util.asNode(id).name AS name, pgscore ORDER BY pgscore
#Write
CALL gds.pageRank.write('employee-interactions', {writeProperty: 'pageRank'})

PageRank кажется более контролируемым, а не разбросанным, как взвешенная степень и градус. Это может быть гораздо лучшая метрика для измерения мощности каждого узла.
Я также хочу выполнить некоторую кластеризацию по сотрудникам, то есть какие из них являются сильно связанными подграфами в графе. С точки зрения графиков, я хочу обнаружить сообщества.
Я понятия не имел, как это сделать, но быстрый поиск помог.
#Create
CALL gds.graph.create('employee-weighted', 'Employee', {INTERACTS: {orientation: 'UNDIRECTED', properties: 'Weight'}})
#Write
CALL gds.labelPropagation.write('employeee-weighted', {writeProperty: 'community', maxIterations: 15, relationshipWeightProperty: 'Weight'})
Все запросы загружаются на Github здесь.
Теперь, когда у меня есть все необходимое, я могу использовать библиотеку Neo4j Graph Data Science Library для визуализации данных.

Он запустит пользовательский интерфейс, который на языке Neo4j называется NEuler (Ной-лер).
После подключения вам нужно будет выбрать метку, какое свойство веса вы хотите использовать для построения графика. Я выбрал Employee и PageRank соответственно.
Выберите параметры в раскрывающемся списке, чтобы сделать график ярким и понятным.

И вот результаты,

На графике показаны связи и различные сообщества, существующие в небольшом пуле сотрудников. Чем толще грань между сотрудниками, тем выше взаимодействие, основанное на рейтинге страницы.
А теперь давайте сосредоточимся на интересном наблюдении Дэна.
Анализ сетевых факторов влияния
Сью, Аманда, Крис, Марк и Ян работали в бухгалтерии, и Сью взяла на себя роль главы отдела. Вы должны увидеть, что грань между ней и Яном довольно мрачная. У Яна большая разница между ней и Алексом (основным заинтересованным лицом и важным человеком в экосистеме организации). Мало того, Ян - единственный мост, соединяющий бухгалтерию с остальной частью организации.
Перед тем, как Дэн выполнил упражнение (которое должно быть похожей на то, что я здесь придумал), имя Яна фигурировало в списке тех, кого увольняли из своего отдела. Она не является тяжеловесом в своем бухгалтерии, но, тем не менее, она поднимает большой вес, и это никогда бы не было реализовано, если бы мы принимали во внимание только отзывы сотрудников.
Простое изображение показало, что Ян - влиятельный человек в своей организации, хотя ее оценка внутри отдела может быть низкой, ее зависимость между отделами делает ее незаменимой.
Ее не только спасли от увольнения, но и в следующем цикле она получила должность от отдела Алекса.
Мысли
Graph DB позволяет избежать ошибки, если взглянуть на организационную структуру только с качественной точки зрения. К счастью, для Яна это было не так.
Это возможность смотреть на данные в графическом виде, вы видите закономерности, которые в противном случае вы могли бы пропустить. Помимо этого, многие люди являются наглядными учениками, представляют им таблицу и график, чаще всего они тянутся к графику.
После этого могу сказать, что посещение бара в тот вечер было плодотворным!
Пожалуйста, дайте мне знать ваши комментарии, и вы можете использовать репозиторий Github здесь.