Отчёт об аномалиях
Скачать ANOMALIES.mdВсего найдено 31 инцидент. Методология: автоматизированный ETL-скрипт анализирует JSON и review.csv, проверяет типы полей, диапазоны, пересечения ID, кодировку и сдвиг колонок.
1. review.csv — это не отзывы, а те же компании
ВысокаяКолонки совпадают с JSON (id, name, category, city, address, rating, reviews_count, site, phone). Никаких полей «текст отзыва» или «дата» нет.
2. Пустые строки (2 шт.)
НизкаяСтроки в конце CSV, где все 9 полей пусты. Отфильтрованы на этапе загрузки.
3. Дубликаты ID (9 шт.)
СредняяПересечение JSON ↔ CSV (6 ID): c_000098, c_000246, c_000263, c_000425, c_000769, c_000851. Внутренние дубликаты CSV (3 ID): c_001049, c_001050, c_001075 — встречаются по 2 раза с идентичными данными.
4. Невалидный рейтинг (4 шт.)
Высокая| ID | Проблема | Действие |
|---|---|---|
| c_001083 | Текст N/A вместо числа | → NULL |
| c_001010 | Запятая 4,5 вместо точки (локаль) | → 4.5 |
| c_001122 | Отрицательный рейтинг -3 | → NULL |
| c_001186 | Вне диапазона 1–5: 7.2 | → NULL |
5. Невалидное число отзывов (3 шт.)
Высокая| ID | Проблема | Действие |
|---|---|---|
| c_001116 | Отрицательное (-10) | → NULL |
| c_001079 | Не целое (45.5) | → NULL |
| c_001187 | Текст «много» вместо числа | → NULL |
6. Сдвиг колонок (1 шт.)
ВысокаяID c_001015: поле category содержит «Пермь» (название города), city — адрес. Категория потеряна. Обнаружено по несовпадению с известными категориями.
7. Варианты написания городов (5 шт.)
Низкая«Москва», «москва», «Moscow», «Москва » (с пробелом) → нормализованы в «Москва». «Санкат-Петербург» (опечатка) → «Санкт-Петербург».
8. Mojibake — битая кодировка UTF-8 → CP1251 (3 поля)
Высокая| ID | Поле | Было | Стало |
|---|---|---|---|
| c_001008 | name | РћРћРћ «Заря Тех» | ООО «Заря Тех» |
| c_001128 | name | РћРћРћ «Темп Медиа» | ООО «Темп Медиа» |
| c_001128 | city | Санкт-Петербург | Санкт-Петербург |
9. Запись с id вне диапазона
НизкаяID c_900010 («Модуль Строй», Ростов-на-Дону). ID с префиксом c_9xxxxx вместо c_001xxx. Данные валидны — оставлена как есть.
10. Пустая строка вместо NULL
НизкаяВ JSON отсутствующие значения используют null, в CSV — пустые строки. Приведены к единому представлению (NULL).
11. Текстовая заглушка в site вместо URL (1 шт.)
Средняя| ID | Проблема | Действие |
|---|---|---|
| c_001064 | «нет сайта» вместо URL | → NULL |
12. Опечатка в протоколе URL (1 шт.)
Низкая| ID | Проблема | Действие |
|---|---|---|
| c_001020 | htp:// вместо http:// | → NULL |
13. Подозрительный site: одинаковый URL у разных компаний (2 шт.)
Средняяc_001135 (ООО «Дельта Про», Москва) и c_001088 (ООО «Вертикаль Тех», Краснодар) используют один сайт https://shared-site.ru. Возможно, тестовый домен.
14. Невалидный номер телефона (2 шт.)
Средняя| ID | Проблема | Действие |
|---|---|---|
| c_001004 | Буквы в номере: 8 (925) abc-12-34 | → NULL |
| c_001091 | Слишком короткий: +7 | → NULL |
Что НЕ нашлось (дополнительные проверки)
- Prompt injection / SQL injection— проверены текстовые поля на ключевые слова (DROP, ignore, <script>), управляющие символы, аномально длинные строки — ничего не найдено.
- Двойные кавычки — строка c_001145 содержит ООО «Ромашка» (экранированные кавычки в CSV) — корректно обработано парсером csv-parse.
Методология
Автоматизированный ETL-скрипт (scripts/load_data.ts) анализирует все JSON-файлы и review.csv. Каждая строка CSV проходит валидацию: типы полей, диапазоны значений, пересечение ID с JSON-базой, управляющие символы, паттерны mojibake, сдвиг колонок.