3. Отримання, очищення, структурування даних

Відкритий посібник з відкритих даних

3. Отримання, очищення, структурування даних

У розділі читач дізнається про основні етапи роботи з даними, засоби і техніки перетворення немашиночитаних даних в машиночитані, витягання погано структурованих даних з інтернету, а також як ці дані очищують і готують до аналізу

Отримання даних

Дуже добре, коли дані можливо отримати в машиночитаному форматі:

Це ще не гарантує, що дані можна використати такими, як вони прийшли, але принаймні дозволяє одразу перейти до їх очищення.

Але досить часто отримані дані можуть виявитися не в машиночитаному вигляді. Це можуть бути, зокрема:

  • начитка даних на диктофон;
  • паперові машинописи і навіть рукописи;
  • файли зображень зі сканами документів (.png, .gif, .jpg, .jpeg, .jpe, .jfif, .bmp, .tiff тощо);
  • багатосторінкові скановані документи — PDF і DjVu без експортовного тексту (лише зображення сторінок) та екзотика типу багатосторінкових TIFF1;
  • мультимедійні презентації у відеоформатах;
  • документи PDF і DjVu з експортовним текстом;
  • презентації PowerPoint (.ppt і .pptx) та OpenDocumentFormat (.odp),
  • документи офісних текстових редактоів, найчастіше Microsoft Word (.doc і .docx), рідше RTF та OpenDocumentFormat (.odt);
  • текстові файли (.txt);
  • веб-сторінки, що містять дані в тій чи іншій формі.

Неважко помітити, що наведений вище список складено від «неприємніших» до «приємніших» випадків, або, точніше, за неминучістю і безальтернативністю ручного введення. Пройдімося ним ще раз докладніше.

Робота з начиткою даних

Мабуть, найжорсткіший випадок. Звичайно, існують програми перетворення мовлення на текст, зокрема й такі, що підтримують українську мову, наприклад FSM Soft Speech to Text Translator TTS (для Android) чи CyberMova VoiceTypist (для Windows), але, позаяк їх створено як альтернативу введенню з клавіатури, для їхнього надійного функціювання начитка має бути нешвидкою, з чіткими паузами між реченнями, тощо. За допомогою розпізнавалки голосу ми отримуємо неструктурований текстовий файл, роботу з даними в якому розглянуто нижче у відповідному підрозділі. В результаті же ручного введення можливо одразу наповнювати електронну таблицю, що в більшості випадків виявиться і простіше, і швидше, і надійніше.

Робота з даними на папері й мікроплівках

Трапляються випадки, наприклад, якщо дані записано від руки в подобу амбарної книжки (так, таке трапляється і в XXI столітті, і не лише з неоцифрованими архівами), або перед нами сильно пошкоджений машинопис з накресленими олівцем таблицями, коли їх точно доведеться вводити вручну, бо жодна розпізнавальна програма не впорається з такою роботою досить надійно. Але навіть тоді ці документи варто належним чином оцифрувати, бодай для того, щоби мати їхню копію під рукою та і дати можливість ознайомлення з ними майбутнім прискіпливим читачам вашого дослідження.

Пласкі посторінкові оригінали можна сканувати за допомогою планшетного сканера. В параметрах сканування треба виставити достатню роздільну здатність, у більшості випадків це близько 300 крапок на дюйм. Чорно-білі оригінали слід сканувати у напівтоновому (grayscale) режимі, позаяк позірно чорно-білий (black and white) режим створює зображення з тільки білих і чорних пікселів, яке значно важче розпізнавати і яке значно гірше передає особливості оригіналу.

Деякі планшетні сканери дозволяють сканувати і прозорі оригінали, наприклад, мікроплівки формату 35мм, за допомогою відповідних вкладаних рамок. В цьому випадку варто виставляти роздільну здатність сканування, що дорівнює фізичній роздільній здатності сканера, яку можна знайти у документації на конкретний сканер. Слід пам’ятати, що найбільші значення роздільної здатності сканерів досягаються програмно і значно більші за фізичну роздільну здатність. Їх використання варто уникати. Найякісніше сканують прозорі оригінали спеціально розроблені для цього сканери, і, в разі необхідності роботи з мікрофільмованими даними варто приділити увагу знайденню відповідного сканера.

Непласкі та нерівні оригінали, типу товстих книжок, що погано розкриваються та документів, що можуть бути пошкоджені вкладанням у сканер, цілком можна перезнімати на цифрову фотокамеру. За можливості, зйомку треба проводити зі штатива, використовуючи спусковий тросик або затримку спуску для усунення коливань камери. Строга паралельність площин оригінала і матриці камери дуже бажана, але не обов’язкова. Розмір кадру варто виставляти не менше 5 мегапікселів.

Отримані зображення варто зберігати у файлах без компресії або із компресією без втрат якості. Наприклад, формат PNG — дуже годиться, для формата TIFF треба обирати LZW компресію, а формата JPEG варто уникати, оскільки він створює додаткові шуми і паразитні контури коло літер. Бажано дотримуватися правила «одна сторінка — один файл».

Робота з текстовими і табличними даними у зображеннях

Зображення документів, за винятком рукописних і дуже пошкоджених, непогано надаються до зчитування засобами програм-розпізнавалок тексту (OCR). Деякі з них, такі, як вільно доступний Tesseract, без спеціальних засобів розпізнають таблиці як простий текст, що не зовсім те, чого б хотілося. Більш просунуті розпізнавалки, такі як комерційний ABBYY Fine Reader, можуть розпізнавати таблиці і експортувати ці дані.

Тексти після читання розпізнавалкою потребують перевірки, оскільки розпізнавання символів — технологія а не магія, і навіть дуже просунута програма може помилятися, наприклад прочитувати літери як інші літери, групи літер як одну літеру та зчитувати бруд і пошкодження як символи. Деякі з таких помилок системні, зокрема, дуже типове нерозрізнення нуля і літери «О». Отож, якщо даних небагато, а якість розпізнавання — жахлива, продуктивнішим може виявитися перенабирання вручну.

Робота з графіками та діаграмами у зображеннях

Не всі дані в зображеннях є таблицями чи текстом. Частина з них є графіками, діаграмами та іншими візуалізаціями. Деякі з них неможливо перетворити на цифри, інакше, ніж вручну, а деякі — це стосується багатьох прикладів інфографіки2 — можуть не містити коректних даних взагалі.

Проте прості графіки, стовпчасті діаграми, гістограми тощо цілком придатні до автоматичної та напівавтоматичної обробки за допомогою спеціальних програм (див. Таблицю 4 в Додатках).

Чи не найпотужнішою з них — і, що приємно, вільною і платформно-незалежною — є браузерна програма (чи онлайн-сервіс) Web Plot Digitizer. Цей засіб може обробляти зображення графіків у декартових (навіть перекошених і неперпендикулярних) і полярних координатах, стовпчикові діаграми, гістограми, тренарні діаграми і мапи, а також заміряти кути і відстані в мапах. WebPlotDigitizer підтримує ручний і автоматичний режими роботи. Отримані в результаті оцифровки дані Web Plot Digitizer зберігає у CSV форматі.

Робота з багатосторінковими документами (PDF, DjVu, TIFF)

Формати багатосторінкових документів створювалися в першу чергу для збереження зовнішнього вигляду документа в усіх його особливостях. Багатосторінковий варіант TIFF по суті є просто багатьма зображеннями, не обов’язково одного розміру, колірності і якості, збереженими в одному файлі. Формат DjVu влаштований дещо цікавіше, і крім зображень сторінок документа, може містити текст, доступний для експорту. Формат PDF є по суті іншою формою мови PostScript, що використовується для якісного друку, тому в PDF, отриманому з електронного джерела (офісного текстового редактора, видавничої системи, тощо) має бути доступний для експорту текст. Але, з іншого боку, ніщо не заважає вкласти в PDF скановані зображення сторінок.

Якщо багатосторінковий документ не має доступного для експорту тексту, а наявна розпізнавалка текстів не вміє відкривати такий файл, чи не бачить його багатосторінковість, його треба розділити на окремі посторінкові файли зображень, і далі розпізнавати їх як описано у відповідних пунктах («Робота з текстовими і табличними даними у зображеннях» та «Робота з графіками та діаграмами у зображеннях») вище.

Багатосторінковий TIFF можна розділити на окремі файли, наприклад, за допомогою онлайн-інструмента Free Online Tiff Image Split. Також можна скористатися командою convert multipage.tif -scene 1 splitted_%02d.png пакета ImageMagick.

Отримані з електронного оригіналу PDF-файли можуть виглядати дуже охайно і сприйматися людиною на «ура» — часто це реальні макети паперових публікацій — але при цьому видавати дивні артефакти (зокрема, нові рядки замість пробілів або «зюкви»[^наприклад, латинку з діакритикою замість кирилиці — наслідок використання шрифтів з неунікодовим іменуванням гліфів] замість літер) під час експорту тексту копіюванням та функцією «зберегти тексти», надто тексту кирилицею. Але навіть з дуже-дуже правильних PDF файлів табличні дані часто виводяться мало- або непридатним для обробки чином, наприклад так:

Ascii
Sign
Ascii
Sign
Ascii
Sign
048
0
050
2
052
4
049
1
051
3
053
5

Для якісного експорту табличних даних можна використовувати такі інструменти як Tabula. Цю доступну для Windows, MacOs і Linux вільну програму написано на Java, тож вона вимагає наявності Java середовища у операційній системі. Tabula запускається у браузері, скерованому на http://127.0.0.1:8080/ і надає «вебсторінковий» інтерфейс, в якому можна завантажити оброблюваний PDF, автоматично чи вручну виділяти ділянки з даними і отримати CSV. Та ж табличка після обробки Tabula вигляда так:

Ascii ,Sign ,Ascii ,Sign ,Ascii ,Sign
048 ,0 ,050 ,2 ,052 ,4
049 ,1 ,051 ,3 ,053 ,5

Крім CSV, Tabula експортує TSV (значення, розділені табулятором) та JSON.

Робота з електронними документами та презентаціями

Якщо дані містяться в документі офісного редактора на кшталт DOC, DOCX, ODT, RTF, тощо, або у презентаціях типу PPT чи ODP, їх можна перенести до електронної таблиці копіпейстом.

В мультимедійних презентаціях та фільмах можна вихоплювати стоп-кадри де зображено таблиці чи графіки, зберігати їх у графічні файли і обробляти як вказано вище у пунктах «Робота з текстовими і табличними даними у зображеннях» та «Робота з графіками та діаграмами у зображеннях».

Веб-скрейпінг – отримання даних з веб-сторінок

Публікація даних в інтернеті не завжди означає їхню наявність в машиночитаному форматі. Як обходитися із випадками, коли ці дані «сховано» у зображеннях графіків, сканах документів, тощо, ми вже розглянули вище. Але досить часто ситуація цікавіша — дані нібито є, і їх включено до тіла HTML-сторінки, тобто позначено певними елементами розмітки. Ідеальним є випадок, коли їх закодовано у таблицю, тоді можна обійтися копі-пейстом. Так само не викликає великих проблем випадок, коли їх закодовано списком — він перетворюється на CSV простим пошуком-заміною. Але інколи дані структуровано, але не у вигляді таблиці чи списку — наприклад для кожного запису (рядка потрібної таблиці) на сайті існує окрема сторінка.

Хорошим прикладом такої ситуації може бути практично будь-який інтернет-магазин, де інформація про товар — назва, параметри чи характеристики, ціна розташовані (і закодовані засобами HTML) однаково для всіх товарів, але кожен товар чи група з кількох товарів доступні як окрема сторінка.

Копіювання таких даних вручну — нескладний, але непродуктивний і повільний процес, ускладнений неминучими помилками. Тому для такої роботи — вона називається «скрейпінг» (від англійського scraping — «зішкріба́ння, зачища́ння») або веб-скрейпінг — використовують різноманітні програмні засоби від простих скриптів до потужних онлайн-сервісів.

Володіючи навичками програмування і розуміючи спосіб, у який кодовано дані на веб-сайті, можна написати спеціальну програму, яка витягатиме потрібні дані. Приклади таких програм наявні багатьма мовами програмування, від Python до Common LISP і від R до Prolog. Принцип дії скрейперів в основному однаковий: за допомогою HTTP-протоколу програма отримує сторінку або множину сторінок (тому важливо розуміти, як будується URL потрібного діапазона сторінок) і за допомогою тих чи інших засобів її аналізу «видирає» дані (тому важливо знати, як саме яке поле даних закодоване в сторінці).

На щастя програмувально неписьменої більшості, вже написано досить багато досить гнучких засобів веб-скрейпінгу, і замість обкладатися підручниками з Perl чи Ruby, можна зосередитися на власне даних і процесі їх витягання.

щодо обмежень скрейпінгу

Не завжди дані, що їх можна перенести з веб-сторінки вручну, доступні до скрейпінгу. На заваді автоматичній обробці можуть стати:

  • Неструктурний або нерегулярно структурований HTML. Таке може ставатися внаслідок створення сторінок візуальними або офісними редакторами з орієнтацією суто на зовнішній вигляд сторінки. Взірцями такого коду часто грішать старі урядові сайти.
  • Системи автентифікації користувачів, мета яких – перешкодити автоматичному доступу. Це можуть бути системи кодів CAPTCHA або системи платного доступу.
  • Системи, що працюють в режимі сесій і використовують куки (cookies) браузера, щоб стежити за тим, що робить користувач.
  • Блокування системними адміністраторами доступу до масиву даних.
  • Зміна способу структурування даних внаслідок редизайну сайту. Найпідступнішим є те, що такий редизайн може бути невидимим для людини-читача, але повністю збивати з пантелику програму-скрейпер. Наприклад, з якихось своїх міркувань, розробники сайту почали подавати списком те, що раніше подавали потоком іменованих блоків. З точки зору семантичної етики вони зробили як краще, а створений для попереднього дизайну скрейпер не вичитає зі сторінки нічого.

Скрейпер в Google Spreadsheets

Почнімо з простого. Примітивний скрейпер міститься вже у табличному редакторі Google Spreadsheets. Тут є функція Import HTML, яка дозволяє завантажувати в документ прості таблички або списки.

Синтаксис функції
IMPORTHTML(url, query, index), де url — посилання на сторінку з таблицею ; query — запит, може бути або table (таблиця), або list (список); index — порядковий номер таблиці чи списку на сторінці (важливо в тих випадках, коли таблиць чи списків на сторінці багато)

Таким чином, створивши таблицю в Google Spreadsheets, достатньо в комірку (наприклад верхню ліву, А1) вставити =IMPORTHTML("https://en.wikipedia.org/wiki/Demographics_of_India"; "table"; 4) і натиснути Enter

Імпорт таблиці з Вікіпедії в Google Spreadsheets 1

Імпорт таблиці з Вікіпедії в Google Spreadsheets 1

В результаті чого ми присвоюємо цій комірці значення функції IMPORTHTML із заданими параметрами, і функція витягає в нашу електронну таблицю четверту таблицю зі сторінки на вікіпедії про демографію Індії.

Імпорт таблиці з Вікіпедії в Google Spreadsheets 2

Імпорт таблиці з Вікіпедії в Google Spreadsheets 2

У випадках, коли дані на сторінці добре структуровані, функція IMPORTHTML суттєво полегшує життя і дозволяє швидко перейти власне до аналізу даних.

Kimono

Досить популярний в минулому сервіс скрейпінгу даних — Kimono — у 2016 році припинив функціонування, але десктопну версію (для Windows і MacOS) можна завантажити на комп’ютер і використовувати локально: www.kimonolabs.com/desktop

Дуже докладна стаття про Kimono з прикладами та скріншотами (російською мовою): medium.com/data-journalism/kimono-4a60158a0d70

Import.io

Програма Import.io дозволяє витягувати дані зі сторінок в Інтернеті і зберігати їх в таблицю або в файл з даними для подальшого використання. Cервіс import.io має спрощену версію — magic.import.io, де досить ввести лише посилання на сторінку з потрібними даними.

Інструмент безкоштовний (для не більш ніж 10 000 запитів на місяць), для його використання потрібна реєстрація, також можна використовувати за допомогою облікового запису в Фейсбуці, Google+ або в деяких інших соціальних мережах.

Розширення браузера Chrome Scraper і Firefox DataScraper

Розширення для браузера Google Chrome (споріднених з ним Chromium, Iron тощо) Scraper перетворює дані з веб-сторінки на електронну таблицю.

Встановивши розширення, перейдіть на URL, дані з якого треба витягти. Виділіть текст, який треба перетворити на таблицю, і в контекстному меню, що викликається правою кнопкою миші, виберіть пункт «Scrape similar…» Якщо програма вихопила не зовсім те, що треба, можна редагувати значення XPath3 до досягнення потрібного результату. Отримані дані можна експортувати до Google Sheet.

Розширення DataScraper для Firefox працює подібним чином, але замість XPath використовує селектори JQuery4.

Розробницькі інструменти браузера

Іноді неможливість скопіювати дані зі сторінки як такої, можливо обійти, звернувшись до її вихідного кода. Всі браузери підтримують можливість його перегляду як безпосередньо, так і за допомогою розробницьких інструментів.

Досить часто веб-сторінки відображають дані, отримані за допомогою скриптів з інших URL у машиночитаній формі — (JSON, XML чи CSV), заповнюючи ними таблиці, мапи та інші конструкції. В такому випадку хорошою альтернативою скрейпінгу цих даних є перехоплення відповідних потоків інформації, їх можна проглянути за допомогою вкладки «Network» розробницьких інструментів. Сортування за розміром, найменування, тощо, можуть допомогти знайти серед скриптів той, що отримує потрібні дані. Далі можна скористатися вкладкою «response» для копіювання цих даних безпосередньо в текстовий редактор.

Інші засоби скрейпінгу

Різноманіття інструментів скрейпінгу дуже велике, і залежить лише від фантазії, технічної підготовки, наявного часу та натхнення. Дамо лише декілька посилань на матеріали за цією цікавою темою:

Імпорт даних з вебу за допомогою Екселя

Окрім способів імпорту даних з Інтернету за допомогою різних інструментів веб-скрейпінгу, описаних у попередньому підрозділі, імпортувати дані з вебу можна і за допомогою найпопулярнішої програми електронних таблиць — Microsoft Excel.

Звісно, імпорт даних за допомогою вбудованих можливостей Excel має свої обмеження (наприклад складність роботи з багатосторінковими документами), але для деяких завдань, і для тих, хто звик працювати з програмою Excel, він може бути досить зручним.

Щоб імпортувати дані в таблицю Excel, виберіть команду From Web (з вебу) в розділі Get External Data (Отримання зовнішніх даних) на вкладці Data (Дані).

У діалоговому вікні введіть адресу веб-сайту, з якого потрібно імпортувати дані і натисніть Go (Пуск). Сторінка буде завантажена в це же вікно для попереднього перегляду, її можна погортати і знайти потрібну інформацію.

Перед кожною з web-таблиць є маленька стрілочка, яка вказує, що ця таблиця може бути імпортована в Excel. Клацніть по ній, щоб вибрати дані для завантаження, а потім натисніть Import (Імпорт).

З’явиться повідомлення Downloading (Завантаження) — це означає, що Excel імпортує дані з зазначеної web-сторінки.

Виберіть клітинку, в якій будуть розміщені дані з інтернету, і натисніть ОК.

У вибраній комірці з’явиться системне повідомлення про те, що Excel імпортує дані.

Через деякий час інформація з обраної web-сторінки з’явиться в таблиці Excel.

Імпортовані дані можна використовувати так само, як і будь-яку іншу інформацію в Excel. Їх можна використовувати для побудови графіків, спарклайнів (міні-графіків), формул.

Один з плюсів імпорту даних з вебу в Excel — це можливість оновлення даних прямо в самій програмі. Так, достатньо натиснути команду Refresh All (Оновити все) на вкладці Data (Дані), і ця дія відправить запит web-сторінці і, якщо є більш свіжа версія даних, запустить процес оновлення в таблиці.

Якщо ж потрібно, щоб інформація в таблиці автоматично оновлювалася з якоюсь заданою періодичністю, виберіть елемент таблиці, що містить динамічні дані, і натисніть команду Properties (Властивості) в розділі Connections (Підключення) на вкладці Data (Дані).

У діалоговому вікні поставте галочку Refresh every (Оновлювати кожні) і вкажіть частоту оновлення в хвилинах. За замовчуванням Excel автоматично оновлює дані кожні 60 хвилин, але Ви можете встановити будь-який проміжок часу. Або, наприклад, вказати Excel оновлювати інформацію кожен раз при відкритті файлу.

Корисні посилання

Очищення даних

Навіть записуючи дані на папірці, важливо дотримуватися тих самих конвенцій в усіх записах, інакше можна прийти до непередбачуваних помилок (переплутані одиниці виміру, тощо). Для даних, призначених до машинної обробки, це ще важливіше. Дуже часто дані (це можуть бути дані, що описують ті самі чи подібні явища), зібрані з різних джерел можуть бути записані по різному, відтак у зведеній таблиці вони будуть «брудними».

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

Що таке чисті дані?

Чистими можна вважати дані, які:

  • не містять помилок та одруківок;
  • в межах одного типу чи класу мають уніфікований формат: дати зазначаються у єдиному форматі (скажімо 2015-01-01), числа мають однаковий роздільник для десяткових (або кома, або крапка, в одному наборі даних не має зустрічатись два різних роздільника десяткових);
  • назви всюди пишуться однаково (однаковий варіант напису однієї і тої ж адреси, номеру телефону, ПІБу людини тощо);
  • в одній комірці міститься лише один запис, і кожен запис займає лише одну комірку (тобто у наборі немає об’єднаних комірок).
Приклад брудних даних
Дата Місто Показник
2015-08-01 Київ 1 678 910
01-07-2015 Киев 1,567,890
1 черв 2015 Кийів 1 млн 456 тис 789
2015.06.01 Львів 1.345.678
2015/07/01 Львов 1 234 567

З брудними даними неможливо працювати: в них присутній часовий вимір, однак ми не зможемо вибудувати часову лінію, оскільки всі дати мають різний формат; тут присутній географічний вимір, однак ми не зможемо агрегувати дані за змінною «Місто», оскільки кожен раз назва міста пишеться інакше; тут також присутній числовий показник, однак ми не зможемо здійснювати над ним ніяких арифметичних операцій, оскільки всі числа записані у різних форматах.

Ті самі дані після очищення
Дата Місто Показник
2015-08-01 Київ 1678910
2015-07-01 Київ 1567890
2015-06-01 Київ 1456789
2015-06-01 Львів 1345678
2015-07-01 Львів 1234567

Чисті дані ми можемо фільтрувати, сортувати, здійснювати над ними арифметичні операції, візуалізувати та будувати на їх основі сервіси.

Найпростіший спосіб очистити дані — використати вбудовані функції електронної таблиці (наприклад, Excel або Google Spreadsheets). Для багатьох випадків неправильно поданих даних досить використання команди пошуку і заміни (Find & Replace). Так можна прибрати зайві пробіли у значеннях, помилкові символи, та інші прості патерни.

Для об’єднання вмісту двох комірок можна використати формулу CONCATENATE, наприклад, =CONCATENATE(A2," ",A3) виведе вміст другої і третьої комірок в першій колонці, розділивши їх пробілом.

Для розділення комірок до різних колонок використовуючи певний символ-роздільник, наприклад, кому, можна використати формулу SPLIT: =SPLIT(A2,", ",false)

Але часто буває, що масив даних занадто великий, або дані занадто «брудні», щоби можна було обійтися простими засобами електронної таблиці. В такому разі може стати у нагоді чудова програма Open Refine.

Open Refine

OpenRefine це інструмент для очищення даних, написаний на Java, що виконується локально і працює всередині веб-браузера, який запускається автоматично.

Open Refine дозволяє:

  • виявляти та виправляти помилки в даних, зокрема — знаходити різні варіанти написання назв і дат та приводити їх до єдиного вигляду;
  • знаходити та видаляти зайві символи та комбінації символів у даних, в тому числі за допомоги регулярних виразів;
  • розбивати стовпчики за певним роздільником або ж навпаки об’єднувати дані із певним роздільником;
  • фільтрувати дані за кількома показниками;
  • виділяти/видаляти стовпчики, змінювати структуру документу;
  • конвертувати дані в різні формати;
  • здійснювати базовий аналіз даних;
  • надсилати запити до різних АРІ (наприклад, геокодувати адреси);
  • зберігати всі трансформації даних в окремому проекті та застосовувати їх до інших документів.

Відеоприклад — очищення даних, отриманих із сайту Верховної Ради (голосування депутатів)

В Open Refine використовуються регулярні вирази (Regular expressions) — стандартний засіб опису складних патернів для пошуку і заміни. До них варто звернутися докладніше, оскільки вони наявні в багатьох інших програмах і мовах програмування, і іншого засобу складних пошуків-замін можна вважати що немає.

Регулярні вирази (Regular Expressions)

Очищення даних в текстовому файлі виконується низкою операцій пошуку-заміни. Роблячи таку роботу вручну, ми знаходимо ті записи, формат яких не відповідає бажаному і переписуємо їх правильно. Наприклад, знаходимо назву місяця і міняємо відповідний запис на його аналог у форматі РРРР-ММ-ДД. Якщо даних багато, ручне виконання таких замін дуже непродуктивне. Але простий пошук-заміна, типу того, що доступний за натиском CTRL+H у Word, малопомічний для таких операцій.

Тому для них використовується мова регулярних виразів (Regular Expressions, часто скорочуване до regexp).

Регулярні вирази виглядають страшно, але насправді вони досить прості. Більшість символів означають самі себе. Символи-шаблони та символи-операнди, а це . ^ $ * + ? { } [ ] \ | ( ) дозволяють задавати правила — які символи і скільки разів зустрінуті відповідатимуть шаблону. Ескейп-символ \ повертає символам-шаблонам і символам-операндам буквальне значення, натомість в поєднанні з деякими літерами позначає класи символів.

Кожен символ-шаблон може символізувати певну множину символів. Кількість входжень символів, що відповідають шаблону, задається множником, розташованим після шаблона. Символи можна групувати за допомогою дужок і потім звертатися до значення, що співпало з шаблоном у дужках.

Оскільки кількіcть дужок-зі-запам’ятовуванням обмежена дев’ятьма, існують дужки, що лише групують символи.

Простіше зрозуміти цю машинерію в дії. Звернімося до щойно наведеного прикладу з форматом дати:

було стало regexp пошук / коментар regex заміна
24 серпня 1991 року 1991-08-24 (\d{1,2})\s+сер.*?\s+(\d{4})\s+р\.?(?:оку)? $2-08-$1
13 сер 2013 р. 2013-08-13 див. вище див. вище
3 серпня 1795 1795-08-3 тут вираз дав не зовсім те, що хотілося  
0 середа 0000 р.оку 0000-08-0 вираз реально недосконалий, це він вибере теж  

Придивімося до виразу уважніше.

\d це шаблон для будь-якої цифри. У фігурних дужках після нього — кількість цифр: одна чи дві. Дужки довкола них означають, що ми запам’ятаємо, що саме співпало з шаблоном, і це буде змінна $1.

\s означає будь-який пробіл, + після нього, що цих пробілів може бути і більше одного. сер — початок слова «серпня», до якого це слово може скорочуватися. .*? — крапка це шаблон для будь-якого символа, зірочка означає будь-яку кількість (від нуля до нескінченності) таких символів, а знак питання змушує обрати найкоротшу послідовність з можливих. Чому тоді не обрано 0 символів? Бо далі йде наступний шаблон, \s+, з яким ми вже стикалися, і .*? якраз годиться збігтися з усіма символами перед ним.

(\d{4}) — рівно чотири цифри, які ми теж запам’ятаємо, це буде $2. Далі, після знайомого одного чи більше пробілів, іде літера «р» і (можливо) крапка. Це крапка, а не шаблон будь-якого символа, бо перед нею — ескейп-символ, і вона одна або її нема, бо множником стоїть знак питання: \.?

Конструкція (?:оку)? означає, що далі можуть один раз бути, а можуть і не бути літери «оку», саме в такій послідовності. Якби ми написали (оку)?, це означало б те саме, і «оку» або відсутність символів ставали би значенням змінної $3, але, оскільки після відкривної дужки стоять знак питання і двокрапка, жодної змінної тут не утворюється.

$2-08-$1 означає, що треба написати вміст змінної $2 (це у нас рік), дефіс, цифри «0» і «8», знов дефіс і вміст змінної $1 (це у нас день).

Як видно з прикладу, в регулярних виразах нема нічого надто неприступного для розуміння. Щоправда, справу ускладнює те, що реалізація регулярних виразів у різних мовах програмування і редакторах дещо відрізняється. Але принципи їх побудови лишаються дуже подібними. З певною натяжкою, до регулярних виразів можна віднести також патерни Lua.

Часткове порівняння діалектів мови регулярних виразів
метасимвол значення символа «старий»
regex
POSIX Perl Python Lua pattern
\ повертає звичайне значення метасимволам %
. крапка означає будь-який символ інколи крім символа нового рядка …крім символа нового рядка, а в [ ] завжди означає просто крапку …крім символа нового рядка
[ ] будь-який символ з наведених у квадратових дужках, наприклад [xyz] вибирає x, y, або z    
[^ ] будь-який символ крім наведених у квадратових дужках, наприклад [^xyz] вибирає a, 6, або №, але не x, y, або z    
^ позначає початок рядка
(або цілий рядок у багаторядковому режимі)
  початок рядка тільки на початку виразу, інакше звичайний символ
$ позначає кінець рядка
(або цілий рядок у багаторядковому режимі)
  кінець рядка тільки наприкінці виразу, інакше звичайний символ““
() дужки позначають підвираз, результат якого може бути викликаний далі — як у виразі пошуку, так і у виразі заміни  
Порожні дужки повертають число, що дорівнює позиції в рядку, наприклад ()ер() з рядком «волонтер» дасть значення 7 і 9, а з рядком «корупціонер» — 10 і 12
\n де n — цифра від 1 до 9, викликає значення видповідних підвиразів, номери — в порядку появи у виразі, тобто ([бм]а)\1* вибере «мама», «баба», «ма», «ба», але не «бама» чи «маба» $n — $1, $2   %n
* будь-яка кількість входжень попереднього шаблона, наприклад ні* вибиратиме н, ні, ніі, ніііііііііі, а [так]* вибиратиме і «так» і «кат» і навіть «атака».
\s будь-який пробіл нема       %s
\w будь-яка літера, нема       %a
\d будь-яка цифра, те саме що [0-9] нема       %d

Як видно з таблиці, різні реалізації регулярних виразів відрізняються достатнім чином, щоби перш ніж починати використовувати інструмент з «підтримкою регулярних виразів», поцікавитися можливостями і обмеженнями конкретної реалізації. Крім того, свої регулярні вирази на фазі виписування варто тестувати, для чого існують спеціальні сервіси:

regexr.com
Один з онлайн-сервісів для тестування регулярних виразів у реальному часі. Підсвітлює синтаксис, дає спливні підказки (англійською). Оскільки використовує браузер, працює зі стандартом регулярних виразів JavaScript.
regex101.com
Онлайн-сервіс для тестування регулярних виразів. Не підсвітлює синатксис, зате підтримує три діалекти regexp — вбудовані в php, javascript і python.

Оптимізація структури даних

Досить часто дані, що здаються зручно і прозоро впорядкованими, потребують докорінної структурної реорганізації. Не будь-яка людиночитабельна таблиця є добре машинооброблюваною. Можна сказати навіть, що таблиця, орієнтована на людське сприйняття є скоріше способом представлення даних, ніж охайно впорядкованим набором даних.

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

Для даних, організованих у таблицю, існує просте залізобетонне правило: кожна колонка є змінною, кожен рядок — окремим спостереженням. Такі дані називаються «охайними» (tidy), і їх можна легко і швидко трансформувати, аналізувати і візуалізувати.

Як і сім’ї, охайні, добре структуровані набори даних всі подібні, але кожен неохайний набір — неохайний по-своєму. Tidy Data by Hadley Wickham, vita.had.co.nz/papers/tidy-data.pdf

Таблиці, створені про людське око, далекі від дотримання цього правила. Наприклад, ось таблиця, взята з публікації Держстату:

Доходи населення за регіонами України у 2012-2014 роках, млн грн
Область 2012 2013 2014
Вінницька 35441 37323 39184
Волинська 19546 20609 21971
Дніпропетровська 95349 99995 109545
Донецька 128767 135362 114135

Ця таблиця непогано показує читачеві динаміку доходів населення, людині зручно порівнювати цифри за роками і за областями, вона компактна: одиниці виміру винесено в заголовка. Але вона малопридатна до машинної обробки. Наприклад (уявімо, що років і областей більше), її неможливо сортувати і складно фільтрувати. Крім того, назву змінної «рік» ніде, крім як в заголовку не вказано.

Та ж таблиця, приведена до охайної форми, може гірше сприйматися людиною, зате її можна сортувати і фільтрувати, в неї легко додати дані за іншими областями і роками.

Доходи населення за регіонами України, млн. грн
Область Рік Доходи
Вінницька 2012 35441
Вінницька 2013 37323
Вінницька 2014 39184
Волинська 2012 19546
Волинська 2013 20609
Волинська 2014 21971
Дніпропетровська 2012 95349
Дніпропетровська 2013 99995
Дніпропетровська 2014 109545
Донецька 2012 128767
Донецька 2012 135362
Донецька 2012 114135

Проблеми зі структуруванням даних найчастіше виникають через нерозуміння того, що саме у наборі даних є змінними. Строго кажучи, змінними є усе, що може набувати значень, як кількісних, так і якісних, а не лише, те що вимірюється в процесі спостереження. Змінні, значення яких відомі наперед, називаються фіксованими (наприклад, стать переважно може мати лише два значення: «чоловіча» та «жіноча»), на противагу вимірюваним.

Варто розташовувати колонки фіксованих змінних на початку таблиці, а вимірюваних — наприкінці.

П’ять основних проблем неохайних чи погано структурованих наборів даних:

  1. Заголовки в колонках містять значення, а не назви змінних
  2. Різні змінні записані в одну колонку
  3. Змінні записані як в рядках, так і в колонках
  4. Різні типи блоків спостережень записані в тій самій таблиці
  5. Один блок спостереження записано у кількох / багатьох таблицях

Ще один приклад (дуже) погано структурованих даних може бути таким:

  A B C D E F
1            
2   101 102 103 104 105
3 Стать Ч Ж Ч Ч Ч
4            
5   101 102 103 104 105
6 Глюкоза 134.1 120 124.8 83.1 105.2
7            
8   101 102 103 104 105
9 Інсулін 0.6 1.18 1.23 1.16 0.73

Ми можемо припустити, що це якісь дані лабораторних чи медичних спостережень, і очима прочитати дані у таблиці. Втім, для, скажімо, статистичної обробки цих даних такий спосіб запису інформації неприйнятний. Охайний набір чи масив даних (dataset) має виглядати так:

  A B C D
1 id стать глюкоза інсулін
2 101 Ч 134.1 0.6
3 102 Ж 120 1.18
4 103 Ч 124.8 1.23
5 104 Ч 83.1 1.16
6 105 Ч 105.2 0.73

Правильна структура даних дозволяє аналітику або комп’ютеру легко виділяти потрібні змінні, оскільки надає стандартний спосіб структурування набору даних.

Поради щодо охайно структурованих даних (від Карла Бромана):

  1. Будьте послідовними.
  • Використовуйте послідовні коди для категоріальних змінних.
  • Використовуйте один фіксований код для відсутніх значень.
  • Використовуйте послідовні назви змінних.
  • Ідентифікатори об’єктів мають бути записані відповідно до однієї системи.
  • Використовуйте однакову структуру даних в різних файлах.
  • Називайте файли за однією системою, і використовуйте її послідовно.
  • Використовуйте один загальний формат для всіх дат, переважно РРРР-ММ-ДД, наприклад 2016-06-21.
  • Будьте уважними щодо зайвих пробілах всередині комірок (клітинок в таблиці). Порожня клітинка (дані відсутні) відрізняється від начебто порожньої клітинки з пробілами. Тому «Київ» машина сприйматиме інакше, ніж «Київ» (з пробілом), і дані потребуватимуть додаткової очистки (див. «Очищення даних»).
  1. Найкращий спосіб збереження даних в таблиці — коли у колонках змінні, а в рядках — об’єкти (спостереження). У першому рядку мають міститися назви змінних (не використовуйте більше одного рядка для назв змінних).

  2. Заповнюйте всі комірки в таблиці, навіть коли дані відсутні — в такому разі варто мати спеціальне кодування для відсутніх даних.

  3. Вставляйте лише одне значення в комірку. Наприклад, у комірку може бути записана вага, наприклад «45 кг». Краще написати просто «45», а одиниці виміру винести в назву колонки, наприклад «вага_кг». А ще краще, назвати колонку «вага», а одиниці виміру винести в окремий словник даних.

  4. Створіть словник даних — окрему таблицю, в якій пояснювалися би змінні. Це буде частиною метаданих — дані про дані. Такий словник може містити:

    • Точну назву змінної, як це вказано в наборі даних («технічну» назву змінної);
    • Більш читабельну назву змінної, що може використовуватися, наприклад, для візуалізації даних;
    • Більш розлогий опис змінної;
    • Одиниці виміру;
    • Очікувані максимальні та мінімальні значення змінних, наприклад.
  5. Первинні дані не мають містити в комірках таблиці підрахунків чи формул.

  6. Не використовуйте виділення кольором чи типом шрифта як дані. Наприклад, у якійсь таблиці в Excel-і можна виділити рядки різним кольором, щоб позначити окремо чоловіків і жінок. Так робити не треба, краще створити окрему змінну (колонку), і відповідно закодувати кожен рядок.

  7. Називайте речі (змінні, файли) зрозуміло. Це може бути важко, але краще добре подумати, щоб назва була влучна і містка. Як правило, не варто використовувати пробіли в назвах змінних (тобто в заголовках колонок у таблицях з даними) або назвах файлів, замість них використовуйте дефіси (-) чи підкреслення (_).

  8. Регулярно робіть резервні копії ваших даних. І зберігайте їх в різних місцях.

  9. Застосовуйте функцію перевірки даних до клітинок (наприклад в Excel-і — goo.gl/TFB7vC ) для уникнення помилок

Джерело: kbroman.org/dataorg/

Зберігайте дані у простих текстових форматах (таких як CSV). Використовуючи кирилицю, чи інші символи, що виходять за межі ASCII («базової латинки»), будьте дуже уважні щодо кодування, в якому зберігаєте файл з даними. Всім буде спокійніше, якщо це UTF-8.

Метадані

Змінні в таблиці набору даних варто називати коротко і чітко. Всі розшифровки, уточнення а також застосовані одиниці виміру варто виносити до словника даних — окремої таблиці метаданих (даних про дані). Зрозуміло що і ця таблиця має бути охайно структурованою, наприклад:

Колонка Назва змінної Категорія Опис
id Ідентифікатор у базі Службова Ідентифікатор підприємця в базі даних. Ціле число.
name Ім’я Конфіденційна Ім’я об’єкта. Текст, записується у вигляді «ПРІЗВИЩЕ ІМʼЯ ПО-БАТЬКОВІ»
sex Стать Демографічна Стать підприємця. Змінна може набувати значення «Ч» (чоловік) або «Ж» (жінка)
bdate Дата народження Демографічна Дата народження підприємця. Формат – дата, записується у вигляді РРРР-ММ-ДД
edu Освіта Демографічна Рівень освіти підприємця. Записується цілим числом, може набувати таких значень:
      – 1 – неповна середня – 2 – середня – 3 – середня спеціальна – 4 – незакінчена вища – 5 – вища – 6 – вчений ступінь – 7 – немає даних (невідомо)
reg_date Рік реєстрації Економічна Рік реєстрації підприємця. Формат – дата, записується у вигляді РРРР-ММ-ДД
kved КВЕД Економічна Код класифікації видів економічної діяльності. Текстова змінна. Наприклад «52.62.0» або «31.09». УВАГА! Якщо КВЕДів у підприємця більше одного, то потрібно записувати кожен додатковий КВЕД окремим рядком (створювати окреме спостереження)

Сюди ж можна перенести всі фіксовані змінні, що мають в межах набору даних однакове значення.


  1. наприклад, деякі документи на data.gov.ua доступні саме як багатосторінкові TIFF

  2. Докладніше про різницю між візуалізацією даних і інфографікою йдеться у 4 розділі, присвяченому візуалізації даних

  3. Мова виразів, для визначення частини XML документа, або для обчислення величин (наприклад, рядкових, числових або булевих) на основі вмісту XML документа

  4. Поширена бібліотека для побудови динамічних вебсторінок