Автор книги: Валентин Арьков
Жанр: Руководства, Справочники
Возрастные ограничения: +12
сообщить о неприемлемом содержимом
Текущая страница: 1 (всего у книги 3 страниц)
Частотный анализ числовых и текстовых данных
Учебное пособие
Валентин Юльевич Арьков
© Валентин Юльевич Арьков, 2023
ISBN 978-5-0059-8841-6
Создано в интеллектуальной издательской системе Ridero
Предисловие
Данная работа посвящена применению современных методов и технологий больших данных в курсе бизнес-аналитике и статистики. Анализ частоты появления различных значений – один из способов первоначальной обработки данных. Чаще всего его относят к описательной статистике (Descriptive Statistics). В последнее время также говорят об описательной аналитике (Descriptive Analytics). Подсчет частот имеет отношение распределению. Поэтому его восприятия материала желательно обладать пониманием основ теории вероятностей и математической статистики.
В данной работе мы рассмотрим примеры и приемы частотного анализа числовых и текстовых данных средствами Python.
К этому материалу следует относиться именно как к примерам. Потому что есть много способов выполнить одно и то же действие. Разные способы и разные алгоритмы могут дать в конечном счете один и тот же результат.
Данное пособие можно скачать совершенно бесплатно через сайт издательства Ридеро. Причем в разных форматах.
Введение
Частотный анализ – это изучение характеристик распределения случайной величины. Напомним, что распределение описывает вероятность (частоту) появления тех или иных значений статистического признака. Анализ формы и параметров распределения обычно относят к описательной статистике – Descriptive Statistics.
Язык Python во многом построен как объектно-ориентированный, поэтому мы имеем дело с объектами. А у объектов есть методы, которые соответствуют понятию функция и команда в традиционном программировании. Для упрощения мы будем говорить «функция», не углубляясь в технические подробности.
Мы будем выполнять работу в облачной среде Google Colab, но программу можно также использовать (с небольшими доработками) и в других средах. Основное преимущество Colab – это возможность приступить к работе, не занимаясь установкой программного обеспечения. Требования к компьютеру минимальные: наличие браузера и подключения к интернету.
1. Начало работы
1.1. Результаты и защита
Здесь мы обсудим первые шаги и основные моменты, касающиеся выполнения работы. В данной работе мы проводим обучение в режиме мастер-класса, когда студенты повторяют действия специалиста – «мастера своего дела». В данном выражении слово «класс» означает «занятия на выбранную тему». Это выражение позаимствовано из английского. Фактически, это английское выражение master class, записанное русскими буквами, а вовсе не перевод.
Программа на Python уже готова, её можно просмотреть, скачать и запустить. Мы обсуждаем её по частям, которые называются ячейками. Студентам нужно с этой программой ознакомиться и «поиграться», меняя некоторые параметры. В конечном счёте нужно достичь некоторого понимания и способности использовать и модифицировать эту готовую программу.
Поэтому в тексте даются пояснения и несложные задания. Во время защиты студент демонстрирует понимание материала и способность осмысленно использовать готовые команды и конструкции языка.
За счет такого подхода можно быстро войти в курс дела и сделать первые шаги в аналитике данных на Питоне.
Задание. Просмотрите в Википедии статью Мастер-класс.
1.2. Работа и отчет
Будем выполнять работу в облачном блокноте Jupyter Notebook в среде Google Colab.
https://colab.research.google.com/
Для работы понадобится подключение к интернет и учетная запись Google. Наш блокнот одновременно является инструментом для анализа данных и отчетом, в котором мы «документируем» все наши действия – шаг за шагом.
Для работы на локальном компьютере можно использовать бесплатную среду Anaconda с аналогичными возможностями.
https://www.anaconda.com/
Еще один вариант – это запуск на локальном компьютере контейнера с Anaconda и работа с ним через браузер.
1.3. Создание блокнота
При открытии страницы Colab выбираем создание нового блокнота: New Notebook. Задаём ему информативное название.
Блокнот состоит из ячеек, которые могут содержать программный код – Code — или текст – Text. Для создания очередной ячейки нажимаем соответствующую кнопку, см. рис.
Рис. Создание ячейки
Отчёт по лабораторной работе традиционно начинается с титульного листа. В нашем примере это будет текстовая ячейка, содержащая основные данные о выполненной работе и исполнителе (студенте).
В начале каждого раздела создаём текстовую ячейку с соответствующим названием. Двойным щелчком левой кнопки мыши переходим к редактированию ячейки. Для заголовков первого верхнего уровня используем символ решетки. После ввода текста для «запуска» ячейки на выполнение нажимаем комбинацию клавиш [Shift + Enter]. При этом автоматически создаётся новая кодовая ячейка.
Чтобы раскрыть структуру документа, нажимаем кнопку содержание Table of contents, см рис.
Рис. Заголовок раздела
Для оформления текста можно использовать разметку Markdown и HTML. При этом в правой половине ячейки открывается предварительный просмотр отформатированного текста, см. рис.
Рис. Титульный лист
2. Анализ числовых данных
2.1. Генерируем данные
В этой части работы мы познакомимся с возможностями анализа числовых данных.
Создадим новый раздел и озаглавим его: «Генерируем числовые данные». Обратим внимание, что мы можем перемещаться между разделами документа с помощью оглавления. Мы также можем сворачивать и разворачивать разделы, нажимая кнопку слева от заголовка раздела, см. рис.
Рис. Управление разделами
Сгенерируем выборку, состоящую из случайных чисел с заданным распределением.
В начале импортируем загружаем библиотеку numpy – Numerical Python Extensions. Библиотека позволяет работать с числовыми массивами и содержит много полезных математических функций. Здесь же мы назначаем короткий псевдоним np для удобства вызова функций, см. рис.
Рис. Загружаем библиотеку
По ходу выполнения работы вставляем комментарии. Это полезно и для себя, и для читателя. Комментарии начинаются с символа решетки #. Они сразу позволяют документировать ход работы. Так что у нас одновременно появляются и сама программа, и документация – описание к ней.
Зададим начальное состояние генератора случайных чисел. Вызываем функцию seed из встроенного модуля random. В качестве параметра укажем номер зачетной книжки, см. рис. Задавая одно и то же начальное состояние генератора, мы будет каждый раз получать один и тот же набор данных. На самом деле это псевдослучайные числа, которые получают путём вычислений. Внешне они выглядят как случайные.
Рис. Инициализация генератора
После выполнения ячейки слева от неё появляется зеленый символ «галочка». Кроме того, в квадратных скобках указано число. Оно указывает, в каком порядке выполнялись ячейки. В блокноте Jupyter можно выполнять ячейки в любом порядке, причем можно запускать их много раз.
Во время работы с блокнотом советуем регулярно нажимать комбинацию клавиш [Ctrl + S] для сохранения. Блокнот сохраняется на вашем облачном диске Google Drive.
Теперь мы вызываем генератор случайных чисел и передаем ему параметры распределения и объем выборки, см. рис.
Рис. Генерируем выборку
Выводим на экран первые 10 элементов массива x. Мы не указываем начальный индекс, поэтому используется нулевой элемент. После символа двоеточия указан номер 10, но элемент с номером 10 не выводится. Мы увидим только элементы с номерами от нуля до девяти – это особенность Python.
При работе в блокноте нам не обязательно использовать функцию print. Достаточно указать имя переменной, см. рис.
Рис. Начало массива
2.2. Гистограмма
Переходим к построению гистограммы.
Для создания графиков мы будем использовать библиотеку matplotlib. Из этой библиотеки мы загружаем модуль pyplot и назначаем ему псевдоним plt.
Теперь мы можем вызвать функцию построения гистограммы hist. В качестве параметра передаём имя нашего массива x. На экране появляется изображение гистограммы, причём количество интервалов группировки и их границы выбираются автоматически.
Над графиком выводится дополнительная информация: абсолютное частоты попадания в каждый интервал и границы интервалов группировки, см. рис.
Рис. Гистограмма: настройки по умолчанию
При построении гистограммы мы не указали количество интервалов группировки. По умолчанию используется 10 интервалов. Чтобы задать другое значение, укажем параметр bins, см. рис. Нам нужно подобрать «приемлемое» количество интервалов – не слишком мало и не слишком много. Меняем значение n и запускаем нашу ячейку на выполнение.
Обратим внимание, что при вызове функций в Python мы можем передавать им параметры в любом порядке и даже можем их пропускать. Чтобы справиться с такими ситуациями, мы явно указываем название параметра, затем ставим знак равенства и даём его значение, например, bins=n.
Команда plt.show () подавляет вывод служебной информации на экран. В этом случае мы выводим на экран только сам график.
Рис. Настройка числа интервалов
Если задать слишком мало интервалов группировки, получается «грубая» картина с крупными «ступеньками», см. рис., слева. Слишком много интервалов дадут излишние подробности на графике – это просто случайный шум, за которым плохо просматривается форма распределения, см. рис, справа.
Рис. Подбираем число интервалов
Постепенно увеличиваем количество интервалов, пока не получим компромисс между грубыми ступеньками и случайными отклонениями. График должен получиться достаточно подробным, но не зашумлённым.
Теперь перейдём к оформлению графика, см. рис.
Настроим размеры изображения с помощью функции plt.figure (figsize= (12, 6)). Параметр figsize получает значения ширины и высоты изображения в дюймах.
Передадим дополнительные параметры функции plt. hist:
– edgecolor=’black’ – чёрные границы столбиков;
– linewidth=2 – толщина линий;
– facecolor=’white’ – заливка столбиков белым цветом;
– density=True – пересчитать результаты группировки как плотность вероятности.
Теперь площадь под графиком равна единице, и нашу гистограмму можно будет сравнивать с теоретической кривой нормального распределения.
Наконец, с помощью функции plt. title мы выводим заголовок графика.
Рис. Оформление графика
2.3. Распределение
Рассчитаем теоретические значения плотности вероятности нормального распределения, см. рис.
Загружаем функцию нормального распределения norm из модуля stat библиотеки scipy.
Далее формируем одномерный массив (вектор) из 100 чисел в диапазоне от 60 до 140. В этих пределах расположена наша гистограмма. Для этого используем функцию linspace из библиотеки numpy.
Далее вычисляем значения плотности вероятности для нормального распределения с помощью функции norm. pdf. Название pdf в данном случае расшифровывается как probability density function – функция плотности вероятности. Задаем для этой функции те же параметры, что для генератора наших исходных данных:
– loc=mu – среднее значение (математическое ожидание);
– scale=sigma – стандартное отклонение («сигма»).
Здесь параметр loc означает location, то «расположение» среднего значения, то есть математического ожидания, которое обычно обозначается греческой буквой «мю».
Параметр scale определяет «размеры», или «размах» нашей кривой. Это среднее квадратическое отклонение, или С. К. О., или просто «сигма».
Строим график функции плотности с помощью функции plt.plot. Эта функция наносит на график точки и соединяет их прямыми отрезками. Поскольку точек и отрезков много, они сливаются и внешне выглядят как гладкая кривая.
Рассматриваем график и убеждаемся в правильности расчетов – обращаем внимание на среднее и разброс вокруг среднего (примерно три сигмы). В нашем примере это 100 плюс-минус 30, то есть от 70 до 130.
Рис. Плотность вероятности нормального распределения
Завершим оформление гистограммы – добавим теоретическую кривую и немного украсим изображение, см. рис.
При вызове функций plt. hist и plt.plot мы задаём параметр label. Это будет «метка» наших линий. Она нужна для оформления легенды, то есть вывода на график условных обозначений. Легенду мы выводим с помощью функции plt. legend () без параметров.
Для теоретического графика мы выбираем цвет с помощью параметра color. Линии разного цвета лучше воспринимаются, и эти цвета будут указаны в легенде.
Далее мы выводим заголовки по осям «икс» и «игрек»: plt. xlabel и plt. ylabel.
Наконец, на свободном месте графика выводим текст с помощью функции plt. text. Параметры этой функции следующие:
– x=130, y=0.033 – координаты левого нижнего угла текстового блока;
– s – строка текста для вывода на график (естественно, от английского слова string – строка).
Чтобы разобраться с этой строкой, придётся сосредоточиться. Итак, вначале указана буква f, что указывается на «форматированную строку», которая дана в кавычках. Далее мы выводим греческую букву «мю», для чего используем средства формул текстового редактора LaTeX: $mu$. Формулы здесь вводятся в обрамлении символа «доллара». Затем мы выводим числовое значение переменной mu. Для этого используем фигурные скобки: {mu}. Затем используем символ перехода на новую строку n – как и в стандартном формате вывода языка Си. Аналогично организуем вывод значения сигмы.
Рис. Оформление гистограммы
2.4. Полигон
Вместо гистограммы мы можем построить более гладкий график, который традиционно называется «полигон», то есть «ломаная линия». Дополнительно мы используем сглаживание, которое работает аналогично скользящей средней в динамике. Только здесь сглаживание работает по оси «иксов» вместо оси времени, см. рис.
Загружаем библиотеку seaborn и назначаем ей короткий псевдоним sns:
import seaborn as sns
Этот инструмент тесно интегрирован с двумя базовыми библиотеками Python: matplotlib и pandas.
Затем мы вызываем средство для построения графика распределения sns. displot – distribution plot. Здесь мы выбираем тип графика: kde – Kernel Density Estimate. Это оценивание формы распределения с использованием «ядерного» сглаживания графика. В данном случае «ядро» (kernel) – это набор весовых коэффициентов для взвешенной скользящей средней. Напомним, что идею простой и взвешенной скользящей средней мы обсуждаем в нашем курсе в разделе «Динамика».
В результате на экран выводится сглаженный график, построенный по нашим исходным данным.
Рис. Сглаженный график плотности
Мы можем управлять степенью сглаживания графика. Для этого имеется параметр bw_adjust, см. рис. Название его расшифровывается как bandwidth – «полоса пропускания фильтра». Значение по умолчанию: bw_adjust=1. Попробуем его уменьшить до 0,1 и увидим появление случайных отклонений.
Подробное описание функции:
https://seaborn.pydata.org/generated/seaborn.kdeplot.html
Рис. Управление сглаживанием
2.5. Кумулята
Переходим ко второму графику для формы распределения. Это график накопленных частот – кумулята.
Используем функцию plt. hist. Дополнительно используем следующие параметры:
– density=True – пересчет масштаба для приведения графика в соответствие с теорией;
– cumulative=True – вычисление накопленных (кумулятивных) частот.
Получаем ступенчатый график, что не вполне соответствует теории вероятностей. На самом деле, кумулята – это интеграл от гистограммы, поэтому нас интересует ломаная линия, а не столбики.
Если в текущей кодовой ячейке не вводить команду plt.show (), на экран выводится служебная информация, см. рис. Здесь первый массив – это значения интегральных вероятностей, второй массив – границы интервалов группировки данных. Эти массивы мы сможем использовать, чтобы построить свой, более грамотный график.
Рис. Столбиковая диаграмма накопленных частот
При вызове функции plt. hist мы можем собрать описанные выше служебные данные графика. Для этого мы укажем три переменных в круглых скобках как выходное (возвращаемое) значение, см. рис. Круглые скобки позволяют работать с несколькими переменными как с одним объектом. В Python это называется «кортеж» – tuple. После присваивания значений мы сможем использовать эти переменные по отдельности.
Возвращаясь к предыдущему рисунку, обратим внимание, что служебные данные содержат три объекта:
– список накопленных вероятностей;
– список границ интервалов;
– ссылки на столбики графика (Bar).
Нам понадобятся первые два объекта.
Рис. Сбор исходных данных для графика
Теперь можно заняться окончательным оформлением графика кумуляты (накопленных частот, интегральных вероятностей), см. рис.
Рис. Оформление графика кумуляты
Первая команды plt.figure с параметром figsize задаёт размеры графика.
Далее мы строим график кумуляты в виде ломаной линии командой plt.plot. В качестве координат по оси «иксов» мы используем список границ интервалов, начиная со второго по счёту элемента: x_cum [1: ]. Напомним, что в Python нумерация элементов начинается с нуля. Мы выбираем из этого списка только правые границы интервалов. В лекциях и во время практических занятий мы уже подробно обсуждали, почему накопленные частоты нужно привязывать к правым границам интервалов группировки. Смысл в том, что мы получаем количество элементов в интервале только к концу интервала.
В качестве координат по оси «игреков» мы берём значения накопленных частот (интегральных вероятностей) C_cum. Кстати говоря, размеры списков x_cum [1: ] и C_cum будут совпадать, потому что мы отбрасываем нулевой элемент в первом списке x_cum.
Мы выводим график не только прямыми отрезками, но используем маркеры-кружочки: marker=’o’.
Затем мы построим теоретические значения интегральной функции нормального распределения С. Для этого нам понадобится функция norm.cdf. Сокращение cdf расшифровывается как Cumulative distribution function – «кумулятивная (интегральная) функция распределения». В качестве параметров мы передадим
– xx – ранее построенный список значений «иксов»;
– loc=mu – математическое ожидание;
– scale=sigma – стандартное отклонение.
2. Анализ текстовых данных
2.1. Обработка текстов на естественном языке
При анализе текстов используют разные технологии. В качестве примера мы рассмотрим частотный анализ текстов. Это подсчёт числа появления слов в выбранном тексте. Иногда для такого метода используется выражение bag of words – «мешок слов».
Задание. Просмотрите в Википедии статью Мешок слов.
Нам предстоит построить гистограмму частот и облако слов (тегов). При выполнении лабораторной работы можно будет убедиться в том, что облако слов представляет собой визуальный аналог гистограммы. Это один из простых инструментов для оперативного анализа текстов больших объемов на предмет семантики / тематического содержания.
Задание. Просмотрите в Википедии статью Облако тегов.
В качестве исходных данных для частотного анализа мы используем автоматическую расшифровку (транскрибирование, субтитры) видеороликов Youtube. Аналогично можно проводить анализ выгрузки истории чатов в популярных мессенджерах типа Whatsapp, Telegram, Discord.
Таким образом, мы получаем в наше распоряжение большое количество разнообразных открытых источников неструктурированных текстовых данных большого объёма. В результате каждый студент получает индивидуальный вариант заданий.
Работа по анализу данных выполняется на облачной платформе Google Colab. Студенты смогут выполнять работу на любом компьютере, подключенном к интернет. Из программного обеспечения на локальном компьютере требуется только браузер. Также при обработке данных будет задействован табличный редактор типа MS Excel либо другой, совместимый по формату файлов, например, Libre Office Calc или Google Sheets.
Одно из направлений в технологиях анализа больших данных – это обработка текстов на естественном языке, то есть текстов, написанных живыми людьми. Соответствующее английское название: Natural Language Processing (NLP) – не путать с нейролингвистическим программированием.
Большое количество текстов доступно в оцифрованном виде – в сети предприятия либо в интернет. Однако, такие тексты, как правило, слабо структурированы и не предназначены для машинной обработки.
Один из подходов к анализу текстов на естественном языке – это изучение частоты появления в тексте различных слов. Наиболее часто встречающиеся слова могут иметь отношение к теме выступления или лекции, что позволяет в автоматизированном режиме выделить ключевые моменты содержания. Проще говоря, можно составить список так называемых КЛЮЧЕВЫХ СЛОВ.
При частотном анализе текста приходится попутно решать ряд дополнительных проблем. Отметим две основные трудности: обилие служебных слов и грамматическое/морфологическое разнообразие словоформ.
Во-первых, в текстах чаще всего встречаются служебные слова, не несущие смысла анализируемого сообщения. Это предлоги, местоимения, числительные и некоторые глаголы. Для фильтрации таких «лишних» слов требуется составлять вспомогательный список так называемых «стоп-слов». Причём этот список может существенно различаться в зависимости от категории анализируемого текста.
Во-вторых, в русском языке имеется достаточное количество различных форм одного и того же слова. Существительное: род, число, падеж. Глагол: род, вид, время, спряжение. Аналогичная картина наблюдается с местоимениями, прилагательными и наречиями. Здесь требуется привести каждое слово в первоначальную / словарную форму.
Кроме того, автоматическое транскрибирование (перевод аудиозаписи в текст) вносит в текст искажения за счёт неидеального распознавания устной речи. В расшифровке видео появляются ошибки, замена одних слов на другие, даже на слова из другого языка. Не следует забывать о жаргоне и ошибках в текстовых сообщениях в чатах, в том числе и намеренных (так называемый «олбанский язык»). В ряде случаев ошибки могут создавать дополнительный информационный шум. В некоторых ситуациях, наоборот, именно ошибки и служебные слова являются ценным источником информации.
Правообладателям!
Это произведение, предположительно, находится в статусе 'public domain'. Если это не так и размещение материала нарушает чьи-либо права, то сообщите нам об этом.