Говорят, что общение в отношениях - ключ к успеху. Без общения любые отношения практически мертвы. В эту эпоху технологии занимают центральное место в сфере коммуникации. В этой статье мы проанализируем сообщения WhatsApp между мной и моей невестой, и, в конце концов, вы сможете применить полученные знания к своим данным в WhatsApp. Мы будем использовать Python в этом анализе и, в частности, будем иметь дело с таблицами Pandas, визуализацией данных, очисткой данных и многим другим.

Прежде чем мы рассмотрим это, я хотел бы упомянуть, что мы были в этом отношении уже полтора года, и чаты доступны с 18 декабря 2019 года по 10 августа 2020 года (236 дней или 7 месяцев, 23 дня). Между этим периодом я уехал из своей родной страны и оставил ее дома. Мы коренные кенийцы, но в настоящее время я живу в Южной Африке.

Теперь перейдем к анализу данных. Я хочу, чтобы мы проделали это поэтапно, чтобы вам было понятно.

Шаг 1. Получение данных WhatsApp

WhatsApp позволяет пользователю загружать всю историю чата в текстовый файл. Для этого откройте беседу, для которой вы хотите получить данные. В верхнем правом углу нажмите на 3 точки ›Еще› Экспорт чата ›БЕЗ МЕДИА. После этого будет загружен текстовый файл, который будет содержать все сообщения преобразования от начала до конца. Для наглядности я сохранил свой как whatsapp.txt.

Шаг 2: взгляд на данные

При открытии файла whatsapp.txt вас встречает такой файл

  • Строка 1: это сообщение от WhatsApp, гарантирующее, что сообщения зашифрованы из конца в конец. Это особый случай, и мы пропустим его при анализе.
  • Строки 2–5: обычно каждая строка представляет отдельное сообщение от отправителя. Он будет содержать дату, время, отправителя, а затем сообщение.

Примечание. Есть два отправителя (моя невеста и я). Я сохранил имя моей невесты как Моя жена, Я ЛЮБЛЮ ТЕБЯ ❤, а мое имя пользователя в WhatsApp - koech christian.

Шаг 3. Обработка данных и их сохранение в CSV

Для каждой отдельной строки нам нужно извлечь дату и время отправки сообщения, отправителя и само сообщение.

  • Строка 2: это пустой список для хранения наших данных.
  • Строки 3 и 4: здесь мы читаем наш файл в режиме чтения (r) и просматриваем каждую строку за раз.
  • Чтобы понять строки 6–8, возьмем в качестве примера одну из наших строк:
line = 12/18/19, 08:15 - koech christian: Have woken up my dear.
In 6, we will strip the line of trailing white spaces and split the line by the hyphen (-)
Result: 
12/18/19, 08:15 #send_time
koech christian: Have woken up my dear. #message_section
Note: send_time still has both the date and the time while message_section has the sender and the message.
Code line 7: We will split the content of message_section by the first occurrence of a full colon (:) hence maxsplit = 1. If we don't do this split function may split at the middle of the message in case a sender uses a full colon.
You now know what 8 does.
  • Строки с 9 по 15: мы передаем интересующие нас значения в словарь, а затем добавляем их в данные.
  • Строки 19 и 20. Запишите данные в файл CSV с именем messages.csv.
  • Исключения, поднятые в строке 1, будут обрабатываться try...except....

Шаг 4. Посмотрите на файл CSV

Давайте загрузим CSV-файл (messages.csv), который мы сохранили на шаге 3, и посмотрим, как выглядят несколько строк.

Выход:

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

Когда мы вернемся в Кению, она редко болтает со мной в WhatsApp. Это означает, что количество сообщений до моей поездки в Южную Африку (дни до 2 февраля 2020 г.) наверняка будет меньше, чем сообщений, которые мы отправляем друг другу, когда я здесь.

Шаг 5. Анализ данных

При анализе данных мы будем использовать библиотеку Pandas для описательной статистики и модуль Pyplot в Matplotlib для визуализации результатов нашего анализа.

Давайте погрузимся!

Активные дни

Из 236 дней, за которые у нас есть данные, сколько дней мы фактически обменивались сообщениями WhatsApp?

Выход:

Active days:  222
First Day: 2019-12-18
Last Day:  2020-08-10
Difference of Dates:  236

Снова давайте рассмотрим, что на самом деле делает код.

  • Строка 1: преобразование строки даты в объект даты и времени Python.
  • Строки 3 и 4: определите количество активных дней, просто подсчитав количество уникальных значений в столбце Дата.
  • Строки с 6 по 10: получите первый и последний день истории чата. Сообщения, содержащиеся в беседе, поступают с 18 декабря 2019 г. по 8 августа 2020 г.
  • Строка 12–15: найдите разницу между первой и последней датами, определенными в 6–10.

Отсюда мы видим, что мы общались в WhatsApp 222 из 236 дней (94% времени). Фактически, 14 дней, которые имеют значение, существуют по выбору. Мы использовали другое средство общения (когда я вернулся в Кению). Пока я был в Южной Африке, у нас были 100% активные дни. Мы обнаружим это через мгновение.

У кого больше всего сообщений?

Думаю, больше всего сообщений пишу я, но разница не будет большой. Давайте посмотрим.

Выход:

Total Messages:  34491
My Wife, I LOVE YOU ❤   18030
koech christian         16461

Ой! Всего 34491 сообщение, и она написала большую часть сообщений. Она должна это услышать.

Первое и последнее сообщение (начало и конец дня)

Как я уже сказал, я уверен в этом: она в основном начнет день, а я в основном закрою день. Эта дама всегда спит, даже не пожелав спокойной ночи, и всегда извиняется утром.

Утренние и ночные сообщения (строки 1–7)

  • Строка 2: в этой строке мы сортируем DataFrame по дате и времени, так что мы выводим сообщение первого дня поверх дневного чата. . Мы также удаляем дубликаты, чтобы каждый день оставаться с самым ранним сообщением в DataFrame. Наконец, мы считаем ранние сообщения на отправителя.
  • Строка 3: Вывод (утреннее сообщение)
My Wife, I LOVE YOU ❤    157
koech christian           63
  • Строка 11: Вывод (последние сообщения дня)
koech christian          156
My Wife, I LOVE YOU ❤     64

Поразительное открытие! Это правда, что она пишет первое сообщение большую часть дней, а я пишу последнее сообщение чаще всего по ночам. Что даже удивительно, так это то, насколько они симметричны. Это как если бы мы выполняли «утреннюю пробежку» и «ночную пробежку» в равной степени.

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

Количество сообщений в день с течением времени

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

Я также ожидаю немного сообщений, когда я дома (Кения), и больше сообщений здесь (Южная Африка), потому что WhatsApp сейчас является основным каналом связи.

Давайте посмотрим.

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

Сглаживание тренда

Существует множество методов построения плавных линий тренда. Эти методы включают повторную выборку и скользящие окна.

Передискретизация

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

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

Pandas resample(), который разбивает индекс данных на временные интервалы и группирует данные по временным интервалам. Метод resample() возвращает объект Resampler, аналогичный функции pandas group-by(). Затем к группе данных для каждого временного интервала можно применить метод агрегирования, такой как mean(), median(), sum() и т. Д.

Сдвижные окна

Операции скользящего окна - еще одно важное преобразование данных временных рядов. Подобно понижающей дискретизации, скользящие окна разделяют данные на временные окна, и данные в каждом окне агрегируются с помощью такой функции, как mean(), median(), sum() и т. Д. Однако, в отличие от понижающей дискретизации, где временные интервалы не перекрываются, а вывод при более низкой частоте, чем входной, скользящие окна перекрываются и «прокручиваются» с той же частотой, что и данные, поэтому преобразованный временной ряд имеет ту же частоту, что и исходный временной ряд.

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

Из приведенного выше рисунка мы видим, что линия тренда (с размером окна 50 дней) действительно соответствует нашему прогнозу. До поездки (слева от пурпурной вертикальной линии) мы использовали WhatsApp реже, чем после поездки (справа). Также очевидно, что количество сообщений в день со временем уменьшается.

Наибольшее и наименьшее количество сообщений за день

Максимальный: 461 сообщение в день. Дата: 2020–02–13

Самый маленький: 1 сообщение в день. Даты: 2019–12–22, 2020–01–01 и др.

Анализ актуальных слов и предложений

Было бы очень интересно, если бы мы узнали общие слова / смайлы, используемые каждым из нас. В этом разделе мы делаем именно это.

Общее количество слов на отправителя

В этом разделе мы будем считать все слова для всех сообщений на отправителя (обратите внимание, что мы пропускаем некоторые слова-заполнители, такие как a, and, & the, как показано в строках 10 и 16 ниже)

Выход:

Number of words(Myself): 105612
Number of words(mylove): 113716

Опять таки! Она здесь побеждает !.

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

  • Операторы If… else… в строках 6 и 12 используются для кондиционирования фильтра для Отправителя.
  • Строки 8 и 14 в идеале делают то же самое. Давайте посмотрим на пример.
message = "Okay. Bye for now 💕💕💕💕"
word_list = message.strip().lower().translate(str.maketrans('', '', string.punctuation)).split(" ")
print(word_list)
Result: ['okay', 'bye', 'for', 'now', '💕💕💕💕']

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

Какие слова самые распространенные? Какие уникальные слова используются с течением времени?

Модуль Counter из библиотеки collections упрощает нам задачу. В строках 4 и 5 мы берем количество слов. Результатом является список пар кортежей с подсчетом слов, например,

text = "dog is a pet, hen is a bird"
result = Counter(text.split()).most_common()
print(result)
[('is', 2), ('a', 2), ('dog', 1), ('pet,', 1), ('hen', 1), ('bird', 1)]

Отсюда можно определить количество уникальных слов, просто получив длину результирующего списка (Строки 7–9).

Вывод строк 7–9:

Unique words used:
Unique words She used:  8783
Unique words I used:  7281

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

Далее мы хотим получить наиболее часто используемые слова

Обратите внимание, что у нас уже есть наиболее часто встречающиеся слова в двух переменных most_common_me и most_common_her. В следующем фрагменте кода мы просто выберем 10 лучших.

Как только у нас есть список наиболее распространенных слов и счетчиков, мы можем теперь иметь их в Pandas DataFrame, а также сделать несколько диаграмм, чтобы визуализировать это, как показано ниже.

Результаты:

Честно говоря, данные не лгут. Судя по ее статистике, я не удивлен, что I, you, my и love находятся на вершине списка. Она часто ими пользуется, и я всегда не удивляюсь, когда она пишет сообщение типа «Я люблю тебя, моя любовь» LoL !. С другой стороны, лучше всего я умею смеяться. Неудивительно, что 😂 находится на первом месте в десятке лучших. Но поверьте, я не использую много смайлов, я, вероятно, знаю только два смайлика: 😂 и 🙈.

На самом деле, давайте продолжим и проанализируем использование эмодзи.

Emoji Love

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

  • Строка 1–4: мы используем пакет emoji для извлечения смайлов из предложений с помощью функции extract_emojis, например,
extract_emojis("K😂ip 😆rono🤣   El😂ij😁 😆ah")
result: '😂😆🤣😂😁😆'
  • Строка 6–24. Просмотрите все сообщения и извлеките все смайлы в списки с указанием отправителя.

Выход:

Most Common emojis used (Me)
('😂', 1652)
('🙈', 270)
('😍', 85)
('😘', 52)
('😋', 45)
Most Common emojis used (Her)
('😂', 1577)
('♀', 132)
('🤦', 120)
('😘', 81)
('❤️', 67)

Сюжеты:

Мы самая веселая семья. Мы оба используем 😂 больше всего, но, конечно, я все еще использую больше, чем она.

Анализ времени и активности

Также интересно узнать распределение чатов во времени.

Мы разговариваем в основном по четвергам и пятницам, но особой разницы нет.

На рисунке выше показано распределение чата в среднем за день. Большую часть дней с 00:00 до 05:00 мы оба спим, и поэтому никакой активности не наблюдается. Общение постепенно увеличивается и достигает пика между 2000 и 21 часами, а затем также очень быстро снижается, когда мы снова засыпаем.

Последний анализ, который я сделал, заключался в определении самых длинных сообщений, которые мы когда-либо писали,

Опять же, она ведет к этому своим собственным самым длинным сообщением, содержащим 166 слов, в то время как у меня только 62.

Заключение

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

Вы можете воспроизвести то же самое, используя свои собственные данные WhatsApp, выполнив те же действия.

Как всегда, спасибо за чтение :-)