Найти в Дзене
МАКреатив

Статистический анализ по картинке

Название звучит как "приворот по фото", но я о чём - захотел я как-то проанализировать пару графиков, найти корреляции и столкнулся с парой сложностей: Оцифровка аналоговых графиков I. У меня был только график - картинка, самих данных (значений) не было. Принялся я по нему вычислять хотя бы наиболее важные точки - в итоге получилось ужасно долго и просто ужасно (человеческий глаз и осознанный мозг не может предоставить точность больше 10% деления, а ещё случаются незамеченные ошибки): Поэтому я написал специальную программу, которой с Вами делюсь: скачать можно здесь С её помощью получается почти идеальный вариант: Рассказываю как пользоваться, чтобы оцифровать значения графика: 4. Вписываем диапазон значений для рамки и нажимаем "Получить значения" 5. Дожидаемся результата и копируем его куда хотите, например, в Excel. Поиск корреляций и оценка их значимости на временных рядах II. Вторая проблема, с которой я столкнулся - это то, что как мне подсказали, указав на эту очень важную стат

Название звучит как "приворот по фото", но я о чём - захотел я как-то проанализировать пару графиков, найти корреляции и столкнулся с парой сложностей:

Оцифровка аналоговых графиков

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

получение значений графика руками
получение значений графика руками

Поэтому я написал специальную программу, которой с Вами делюсь: скачать можно здесь

С её помощью получается почти идеальный вариант:

получение значений графика с помощью ImageStat
получение значений графика с помощью ImageStat

Рассказываю как пользоваться, чтобы оцифровать значения графика:

  1. (Желательно предварительно подрихтовать картинку, чтобы график был тёмный, других тёмных элементов не было, рамка чтоб была серая, но это необязательно). Загружаем график, он сразу превращается в чёрно-белый
  2. Регулируем яркость (светлее/темнее), чтобы лишние элементы с области значений ушли, а график и рамка осталась (не нужно если область значений во всю картинку).
  3. Выделяем область значений, либо не касаясь рамки, либо повторяем пункт 2, чтобы она тоже исчезла
-3

4. Вписываем диапазон значений для рамки и нажимаем "Получить значения"

Программа также может распознать картинку как несколько графиков, если установить соответствующую галочку
Программа также может распознать картинку как несколько графиков, если установить соответствующую галочку

5. Дожидаемся результата и копируем его куда хотите, например, в Excel.

-5

Поиск корреляций и оценка их значимости на временных рядах

II. Вторая проблема, с которой я столкнулся - это то, что как мне подсказали, указав на эту очень важную статью - Корреляция между временными рядами: что может быть проще? : На случайных процессах (коими являются большинство графиков) по большей части не будут работать знакомые нам формулы из базовой теории вероятности (особенно на немарковских процессах).

К сожалению, при применении статистических методов на этот нюанс часто не обращают внимания. Однако, именно эта "мелочь" приводит к очень серьезным и нетривиальным следствиям с точки зрения обработки таких сигналов. Самые обычные формулы, описанные во всех учебниках, внезапно отказываются работать. А попытки их применения "в лоб" иногда дают, мягко говоря, весьма неожиданные результаты. Например, статистическая связь между числом пиратов и глобальным потеплением оказывается не просто "значимой", а "практически достоверной". Что удивительно, столкнувшись с такой ситуацией, даже достаточно грамотные исследователи не всегда понимают, где же тут "порылась собака" и припиывают причинно-следственную связь в желаемом направлении. Данные вроде бы правильные, а результат – ни в какие ворота...
А Вы твердо уверены, что всегда правильно оцениваете значимость таких корреляций?

Поэтому даже корреляция в 90% может быть обыденностью и ничего не значить) - её азы написаны для случайных величин (а не процессов, где Y зависит от Х), поэтому для начала нужно найти функцию распределения случайного процесса, в зависимости от которой нужно применять специальные, ей подходящие, законы. Это задача намного сложнее предыдущей, однако, моя программа, я думаю, хоть и не решит её полностью - может помочь:

Для правильного выбора доверительных интервалов и критических значений признака проверяемых гипотез - в общем чтобы результаты исследования опирались на математику, а не на первые найденные формулы в интернете - необходимо знать какое распределение у значений - нормальное, показательное, равномерное, какое-то ещё? И в зависимости от распределения пользоваться соответствующими формулами, таблицами, ограничениями и т.д.

Для этого прежде чем приступать к анализу, первым делом желательно вычислить эмпирическую функцию распределения и сравнить её с теоретической:

Распределения могут самыми разнообразными: двумерными, многомерными, с одним, двумя и более параметрами. Их намного больше шести показанных здесь для примера.
Распределения могут самыми разнообразными: двумерными, многомерными, с одним, двумя и более параметрами. Их намного больше шести показанных здесь для примера.

Итак, вычисление графика эмпирической функции распределения для случайных величин:

выберите нужную опцию
выберите нужную опцию

Вы можете спросить - это что за график такой, где Y не зависит от Х? Вот несколько примеров:

а) просто повернуть наш исходный график разницы температур от года на 90°, поменяв местами Х и Y (который будет уже не графиком, а плоской кривой) - зная год, можно узнать среднегодовую температуру, а вот зная температуру - не всегда можно однозначно сказать какой это год (этакая хеш-функция получается)

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

б) Вот следующее изображение, иллюстрирующее результаты опыта с броском игрового кубика со смещённым центром тяжести:

Функция распределения позволит статистику не только подсчитать математическое ожидание броска, но и, например, оценить корреляцию подсчётов выпадения какой-то редкой комбинации с чем-то ещё (температурой?)
Функция распределения позволит статистику не только подсчитать математическое ожидание броска, но и, например, оценить корреляцию подсчётов выпадения какой-то редкой комбинации с чем-то ещё (температурой?)

в) связать два графика через время:

-10

На графиках слева схематично показаны сколько виртуальной валюты в игре на смартфоне, не подключенном к сети электропитания, у конкретного мальчика в Калининграде, и какое напряжение в сети в конкретном доме в Анадыре в одно и то же время. Справа получившаяся пересекающаяся кривая этого напряжения от вышеупомянутых виртуальных денег. Поскольку напряжение не зависит от виртуальных денег (хотя апофенисты могут и тут придумать связь - чем я и занимался в прошлой моей статье Взаимосвязь температуры и населения (зато там можно скачать данные по температуре и населению за 10 000 лет), хоть и не утверждал, что мои выводы верны, и действительно на некоторых участках она видна), эту кривую можно считать геометрическим представлением случайной величины, а не процесса. И можно восстановить функцию распределения напряжения - последний график, который показывает, что напряжение распределено не равномерно, а имеет место быть нормальное распределение. Это можно было выяснить и из второго графика, однако, если у Вас в наличии только пересекающаяся кривая - моя программа Вам в этом поможет.

Переходим далее к функции распределения случайных процессов:

-11

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

Во-вторых, полная функция распределения случайного процесса многомерна: для одной реализации - она трёхмерна, для двух - уже пятимерна и так далее. Моя программа может дать значения только графика трёхмерной проекции функции распределения, поэтому это неполная информация о ней, однако и они могут дать некоторое представление. В теории, можно усовершенствовать программу и для больших измерений, но для ПК это будет чрезвычайно долго (уже трёхмерная проекция - без параллелизации, конечно, но - строится десятки минут)

Две реализации случайного процесса изменения температуры центральной Гренландии (синий - средние данные со всех ледников центральной Гренландии, красная - только GISP-2)
Две реализации случайного процесса изменения температуры центральной Гренландии (синий - средние данные со всех ледников центральной Гренландии, красная - только GISP-2)
Проекция эмпирической функции распределения случайного процесса изменения температуры центральной Гренландии
Проекция эмпирической функции распределения случайного процесса изменения температуры центральной Гренландии

Бонусом с помощью этой программы можно добиться интересных визуальных (не относящихся к математике) результатов, если вместо графика загрузить скриншот текста или фото:

Стилизация под текст "инопланетян" - Нужно скопировать значения графика в Excel, построить точечный график и заменить маркер на любое изображение
Стилизация под текст "инопланетян" - Нужно скопировать значения графика в Excel, построить точечный график и заменить маркер на любое изображение
Трёхмерная поверхность из фото
Трёхмерная поверхность из фото

Если Вам нужна программа помощнее и сложнее с кучей дополнительных функций можете использовать GSYS2.4 https://www.jcprg.org/gsys/2.4/, но и осваивать эту программу будет в разы сложнее.

Минусы GSYS по сравнению с моей программой ImageStat:
1. Не на русском
2. Точки придётся выставлять
вручную, но поверх графика - долго, муторно, небольшая ошибка и попадут только наиболее значимые точки - то есть автоматизация процесса слаба - если Вам нужно больше 1000 точек - есть смысл от программы только если Вам нужен 5-ый её плюс.
3. Формат вывода не совместим с Excel - придётся сначала сделать несколько замен

Плюсы:
1. Можно обрабатывать повёрнутые на несколько градусов графики без интерполяции - ухудшения точности
2. Можно обрабатывать графики с логарифмической шкалой
3. Можно запустить на линукс
4. Можно получить только значащие точки на апроксимированном графике
5. Поддерживает доверительные интервалы (погрешность для КАЖДОГО отдельного значения)
6. Поддерживает больше форматов изображений (PNG, к примеру), но пересохранить картинку в BMP / пакетно сконвертировать их набор - по моему, не проблема

Инструкция (полчаса потратил чтоб разобраться как это работает):
Ctrl+O
Xа - левая нижняя точка области значений графика - правая нижняя - Yа - левая нижняя - верхняя нижняя - вписать в Axis Manager крайние значения графика и тип шкал - Ad - (нажать на интересующее значение){повторять пока хватит сил} - [Если нужны ещё интервалы ошибок:]<выбираем режим X/Y err(sy для двустороннего интервала/asy для одностороннего) - (выделяем точку - край интервала){повторить для всех необходимых точек и осей}> //надеюсь, у Вас меньше 1000 точек// - Ctrl-S - Write