Используем свободное ПО — Ещегодник https://tushavin.ru Информационно-образовательный сайт для студентов, аспирантов и коллег Тушавина В. А., созданный и наполняемый им самим безвозмездно в свободное от остальных забот время Mon, 30 Jan 2023 03:28:42 +0000 ru-RU hourly 1 https://i0.wp.com/tushavin.ru/wp-content/uploads/2016/09/cropped-веб1.png?fit=32%2C32&ssl=1 Используем свободное ПО — Ещегодник https://tushavin.ru 32 32 117157397 Рисуем графы онлайн и с помощью Excel https://tushavin.ru/risuem-grafy-onlajn-i-s-pomoshhyu-excel/ Mon, 21 Mar 2022 22:11:24 +0000 https://tushavin.ru/?p=2885 Читать далее «Рисуем графы онлайн и с помощью Excel»

]]>
Как выяснилось, теперь для того, чтобы нарисовать граф на языке описания dot с помощью graphviz не обязательно его устанавливать на свой компьютер, а можно просто воспользоваться соответствующим online-сервисом.

Пример схемы из статьи на этом сайте

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

Пример изображения в формате png

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

X1(t)X2(t)X3(t)
X1(t+1)0,10,50,1
X2(t+1)0,200,2
X3(t+1)0,70,50,7
Исходные данные в табличном виде
Представление в Excel

Для того, чтобы сгенерировать соответствующие строки кода нам надо развернуть таблицу (unpivot table). Современный Excel делает это с помощью power query, а старый только с помощью кода на Visual Basic, например, такого:

Sub M_snb()
    sn = Cells(1).CurrentRegion
    x = Cells(1).CurrentRegion.Rows(1).SpecialCells(2).Count
    y = UBound(sn, 2) - x
   
    ReDim sp(1 To x * (UBound(sn) - 1), 1 To 4)
   
    For j = 1 To UBound(sp)
       m = (j - 1) Mod (UBound(sn) - 1) + 2
       n = (j - 1) \ (UBound(sn) - 1) + y + 1
       sp(j, 1) = sn(m, 1)
       sp(j, 2) = sn(m, 2)
       sp(j, 3) = sn(1, n)
       sp(j, 4) = sn(m, n)
    Next
   
    Cells(20, 1).Resize(UBound(sp), UBound(sp, 2)) = sp
End Sub

Добавив это код в нашу таблицу, можно запустить макрос M_snb и получим следующее:

Преобразованная с помощью макроса таблица

Нас интересуют строчки начиная с 23. Добавляем простую формулу (см. сроку формул) и заполняем её вниз. Обратите внимание, что в колонке A у нас момент времени (t+1), а в колонке С — момент времени t, поэтому склейка в строку идет именно так, как показано в формуле [(t)->(t+1)].

Знак «&» в Excel используется для склейки строк. Строки в Excel заключаются в кавычки. Две кавычки подряд внутри кавычек интепретируются Excel как символ одиночной кавычки.

Собираем код (строку № 27 с нулевым значением я удалил):

digraph G {
X1->X1 [label="0,1"]
X1->X2 [label="0,2"]
X1->X3 [label="0,7"]
X2->X1 [label="0,5"]
X2->X3 [label="0,5"]
X3->X1 [label="0,1"]
X3->X2 [label="0,2"]
X3->X3 [label="0,7"]
}
Граф к коду выше

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

Символ \n в данном случае обозначает перевод строки, что позволяет написать название в две строки, как показано на рисунке ниже.

digraph G {
X1 [label="X1\nвыключено"]
X2 [label="X2\nсломано"]
X3 [label="X3\nв ремонте"]
    
X1->X1 [label="0,1"]
X1->X2 [label="0,2"]
X1->X3 [label="0,7"]
X2->X1 [label="0,5"]
X2->X3 [label="0,5"]
X3->X1 [label="0,1"]
X3->X2 [label="0,2"]
X3->X3 [label="0,7"]
}
Итоговый результат

Таким вот несложным образом можно без особого труда нарисовать очень объемные графы.

]]>
2885
Визуализация регрессии https://tushavin.ru/vizualizatsiya-regressii/ Tue, 08 Mar 2022 20:03:24 +0000 https://tushavin.ru/?p=2684 Читать далее «Визуализация регрессии»

]]>
Частой ошибкой при регрессионом анализе, которая встречается в работах студентов (чего греха таить, и аспирантов), является отсутствие графиков регрессии. Казалось бы, все посчитали, всем критериям удовлеворяет, чего еще надо. Ан, нет, не тут то было.

Квартет Энскомба

Для подтверждения это мысли рассмотрим такой курьезный пример, как “Квартет Энскомба” – специально подобранные в 1973 году данные английским математиком Ф. Дж. Энскомбом для иллюстрации важности применения графиков для статистического анализа, и влияния выбросов значений на свойства всего набора данных. Эти данные состоят из четырёх пар \(x\) и \(y\) с практически равным средним значением (\(M[x_i] = 9\), \(M[y_i] = 7.5\)) и дисперсией между соответствующими элементами пар (\(D[x_i] = 11\), \(D[y_i]\approx 4.13\)) , а также равным коэффициентом корреляции (\(cor(x_i,y_i) = 0.816\)). Модель линейной регрессии, построенная методом МНК для всех вариантов описывается уравнением \(y = 3.00 + 0.500x\). Графики представлены на рисунке ниже, из которого видно, насколько могут различаться данные, описываемые внешне статистически одинаково.

Код для построения графиков и графики приводятся ниже.

Необязательно устанавливать R и RStudio для работы с приведенным ниже кодом. Достаточно зарегистрироваться на сайте https://rstudio.cloud/

 

# Загружаем данные и выводим загруженную таблицу 
load(url("https://tushavin.ru/RStudio/Ansc.Rda"))
knitr::kable(Ansc)
x1 x2 x3 x4 y1 y2 y3 y4
10 10 10 8 8.04 9.14 7.46 6.58
8 8 8 8 6.95 8.14 6.77 5.76
13 13 13 8 7.58 8.74 12.74 7.71
9 9 9 8 8.81 8.77 7.11 8.84
11 11 11 8 8.33 9.26 7.81 8.47
14 14 14 8 9.96 8.10 8.84 7.04
6 6 6 8 7.24 6.13 6.08 5.25
4 4 4 19 4.26 3.10 5.39 12.50
12 12 12 8 10.84 9.13 8.15 5.56
7 7 7 8 4.82 7.26 6.42 7.91
5 5 5 8 5.68 4.74 5.73 6.89

Рассчитываем статистику

options(digits=3) # Устанавливаем вывод 3 знаков
apply(Ansc,2,mean) # считаем средние для колонок
##  x1  x2  x3  x4  y1  y2  y3  y4 
## 9.0 9.0 9.0 9.0 7.5 7.5 7.5 7.5
apply(Ansc,2,var)  # считаем дисперсию колонок
##    x1    x2    x3    x4    y1    y2    y3    y4 
## 11.00 11.00 11.00 11.00  4.13  4.13  4.12  4.12
attach(Ansc) # Позволяет обращаться к колонкам по названию столбца
#считаем корелляцию между x и y для каждой пары
cat(cor(x1,y1),cor(x2,y2),cor(x3,y3),cor(x3,y3))
## 0.816 0.816 0.816 0.816
lm(y1~x1)
## 
## Call:
## lm(formula = y1 ~ x1)
## 
## Coefficients:
## (Intercept)           x1  
##         3.0          0.5

Выводим графики

# вывод 4 графиков на лист и смещение границ
# настройки сохраняем
oldpar<-par(mfrow=c(2,2),mar=c(4,4,1,1))
plot(y1~x1,xlab="X",ylab="Y",xlim=c(4,19),ylim=c(4,13),pch=19)
abline(a=3,b=0.5)
plot(y2~x2,xlab="X",ylab="Y",xlim=c(4,19),ylim=c(4,13),pch=19)
abline(a=3,b=0.5)
plot(y3~x3,xlab="X",ylab="Y",xlim=c(4,19),ylim=c(4,13),pch=19)
abline(a=3,b=0.5)
plot(y4~x4,xlab="X",ylab="Y",xlim=c(4,19),ylim=c(4,13),pch=19)
abline(a=3,b=0.5)

Квартет Энскомба. Четыре пары значений с одинаковыми средними, дисперсиями, корреляцией и уравнением регрессии. Рисунок иллюстрирует важность применения графиков для статистического анализа.

Построим регрессионные модели для каждого из четырех случаев

summary(lm(y1~x1)) # Первая пара
## 
## Call:
## lm(formula = y1 ~ x1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.9213 -0.4558 -0.0414  0.7094  1.8388 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    3.000      1.125    2.67   0.0257 * 
## x1             0.500      0.118    4.24   0.0022 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.24 on 9 degrees of freedom
## Multiple R-squared:  0.667,  Adjusted R-squared:  0.629 
## F-statistic:   18 on 1 and 9 DF,  p-value: 0.00217
summary(lm(y2~x2)) # Вторая пара
## 
## Call:
## lm(formula = y2 ~ x2)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -1.901 -0.761  0.129  0.949  1.269 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    3.001      1.125    2.67   0.0258 * 
## x2             0.500      0.118    4.24   0.0022 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.24 on 9 degrees of freedom
## Multiple R-squared:  0.666,  Adjusted R-squared:  0.629 
## F-statistic:   18 on 1 and 9 DF,  p-value: 0.00218
summary(lm(y3~x3)) # Третья пара
## 
## Call:
## lm(formula = y3 ~ x3)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -1.159 -0.615 -0.230  0.154  3.241 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    3.002      1.124    2.67   0.0256 * 
## x3             0.500      0.118    4.24   0.0022 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.24 on 9 degrees of freedom
## Multiple R-squared:  0.666,  Adjusted R-squared:  0.629 
## F-statistic:   18 on 1 and 9 DF,  p-value: 0.00218
summary(lm(y4~x4)) # Четвертая пара
## 
## Call:
## lm(formula = y4 ~ x4)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -1.751 -0.831  0.000  0.809  1.839 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)    3.002      1.124    2.67   0.0256 * 
## x4             0.500      0.118    4.24   0.0022 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.24 on 9 degrees of freedom
## Multiple R-squared:  0.667,  Adjusted R-squared:  0.63 
## F-statistic:   18 on 1 and 9 DF,  p-value: 0.00216

Обратимся к моделям. Все четыре примера проходят по критерию Фишера, коэффициенты значимы, коэффициент детерминации везде 0,67, однако на графиках видно, что нормальная регрессия у нас только в первом случае.

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

par(oldpar)       # возвращаем сохраненные настройки
options(digits=7) # Значение по умолчанию
detach(Ansc)      # Отсоединяем имена таблиц
rm(Ansc)          # Удаляем таблицу из памяти

Коэффициент корреляции и графики регрессии

Как вы должны помнить, для модели парной линейной регрессии коэффициент детерминации \(R^2\) равен квадрату обычного коэффициента корреляции между y и x.

Напоминаю, что коэффициент корреляции, сокращенно r, — это число от -1 до 1, которое отражает силу линейной связи между двумя числовыми переменными. Например, допустим, вы опросили 30 человек об их весе и росте и изобразили эти 30 пар (вес, рост) на диаграмме рассеяния.

Если все 30 точек данных идеально ложатся на возрастающую линию, то корреляция между этими двумя переменными будет равна r = 1.

Если же общая форма зависимости (вес, рост) возрастающая, но 30 точек данных не идеально ложатся на одну линию, то r будет где-то между 0 и 1; чем ближе точки данных к прямой линии, тем ближе к 1 будет r.

Если зависимость убывающая, то r будет лежать между 0 и -1, а если линейная зависимость между весом и ростом вообще отсутствует, r будет равен 0.

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

Чтобы проиллюстрировать это, Яном Ванховым (Jan Vanhove) была написана функция R, plot_r(), которая принимает на вход коэффициент корреляции и размер выборки и выводит 16 совершенно разных диаграмм рассеяния, которые все характеризуются одним и тем же коэффициентом корреляции.

Для пояснения графиков используется материал указанного автора «What data patterns can lie behind a correlation coefficient?«.

Коэффициент корреляции равен 0.5 (r=0.5)

Построим такие графики с коэффициентом корреляции 0.5 и размером выборки 35.

# Для установки пакета используете две строки ниже без #
# library(devtools)
# install_github("janhove/cannonball")

library(cannonball)
plot_r(r = 0.5, n = 35)

Коэффициент корреляции 0.5, детерминации 0.25. Для просмотра в полном размере нажмите на рисунок.

Верхний ряд

Обычно, что когда студенты думают о взаимосвязи с коэффициентом корреляции 0,5, они представляют себе что-то вроде графиков (1) и (2). На обоих графиках базовая зависимость между X и Y линейна, а значения Y нормально распределены относительно наилучшим образом подходящей прямой линии. Небольшое различие между (1) и (2) заключается в том, что для (1) X распределен нормально, а для (2) X распределен равномерно. Эти два графика отражают тот тип отношений, который должен был отразить r.

График (3) отличается от (1) и (2) тем, что переменная X теперь взята из смещенного распределения. В этом случае большинство значений X сравнительно малы, но одно значение X довольно велико. Такое распределение может быть, когда X представляет собой, например, результаты выполнения участниками трудного задания (эффект пола). В этом случае одно или несколько выходящих за рамки, но истинных значений X могут иметь (не будут иметь) “высокий рычаг”, то есть они могут неоправданно повлиять на коэффициент корреляции, вытянув его вверх или вниз.

Проблема в (4) похожа на проблему в (3), но теперь большинство значений X сравнительно большие, а несколько — довольно низкие, возможно, потому что X отражает выполнение участниками задания, которое было для них слишком легким (эффект потолка). Здесь также аутсайдеры могут иметь “высокий рычаг”, т.е. они могут чрезмерно влиять на коэффициент корреляции, так что он не будет точно характеризовать основную часть данных.

Второй ряд

Графики (5) и (6) представляют собой вариации на ту же тему, что и графики (3) и (4): Значения Y не распределены нормально относительно линии регрессии, а смещены. В таких случаях некоторые отклоняющиеся, но истинные значения Y могут (не обязательно) иметь “высокий рычаг”, т.е. они могут тянуть коэффициент корреляции вверх или вниз гораздо сильнее, чем обычные точки данных.

Графики (7) и (8) — это два примера, когда изменчивость значений Y относительно прямой линии увеличивается и уменьшается, соответственно, по мере увеличения X, хотя, конечно, в данном примере это не очень понятно. Это явление известно как гетероскедастичность. Основные проблемы со слепым полаганием на коэффициенты корреляции в присутствии гетероскедастичности, на мой взгляд, заключаются в том, что (а) “r = 0,5” одновременно занижает то, насколько хорошо Y можно оценить по X для низких (высоких) значений X, и завышает то, насколько хорошо Y можно оценить по X для высоких (низких) значений X, и (б) просто сообщая коэффициент корреляции, вы упускаете важный аспект данных. Кроме того, гетероскедастичность может повлиять на вашу инференциальную статистику (инференциальная статистика — это отрасль статистики, которая делает выводы о соответствующей популяции из набора данных, полученных из выборки, подвергнутой случайным, наблюдательным и выборочным вариациям. Как правило, результаты получают из случайной выборки населения, а выводы, полученные из выборки, затем обобщают для представления всей совокупности).

Третий ряд

График (9) иллюстрирует, что коэффициенты корреляции выражают силу линейной связи между двумя переменными. Если связь не линейная, то они малоинформативны. В данном случае r = 0,5 сильно занижает силу связи XY, которая оказывается нелинейной (в данном случае квадратичной). То же самое относится и к (10), где r = 0,5 занижает силу связи XY и упускает из виду циклический характер связи.

Графики (11) и (12) иллюстрируют, как единственная помеха, например, из-за технической ошибки, может дать вводящие в заблуждение коэффициенты корреляции. В (11) однин выброс данных дает сильную положительную корреляцию; если бы учитывались только данные слева, наблюдалась бы отрицательная связь (пунктирная красная линия). Слепое использование r = 0,5 неверно характеризует большую часть данных. В (12) зависимость значительно сильнее, чем r = 0,5 для основной массы данных (пунктирная красная линия); выброс снижает коэффициент корреляции. Графики (11) и (12) отличаются от графиков (3) и (4) тем, что в графиках (3) и (4) все значения X были взяты из одного и того же, но смещенного распределения и, как таковые, являются настоящими точками данных; в графиках (11) и (12) выбросы были вызваны механизмом, отличным от других точек данных (например, ошибкой кодирования или техническим сбоем).

Четвертый ряд

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

Ситуация на графике (14) похожа на ситуацию в (13), но значительно хуже ее: Набор данных содержит две группы, но в отличие от (13), общая тенденция, отражаемая r = 0,5, скрывает тот факт, что внутри каждой из этих групп связь XY на самом деле отрицательная. График (14) часто, но не всегда, дает такую картину, которая известна как парадокс Симпсона.

На графике (15) показана ситуация, когда исследователи, вместо того чтобы изучать взаимосвязь XY по всему диапазону X, изучали только случаи с самыми экстремальными значениями X. Выборка по крайним значениям завышает коэффициенты корреляции (см. причину № 2, по которой я не очень люблю коэффициенты корреляции). Другими словами, если вы возьмете выборку из 150 случаев XY и посмотрите только на 50 самых экстремальных значений X, вы получите коэффициент корреляции, который с большой вероятностью будет больше, чем тот, который вы наблюдали бы, если бы рассмотрели все 150 случаев.

Наконец, график (16) — это то, что на самом деле представляют собой многие коэффициенты корреляции. Например, данные X и Y неровные, потому что они представляют собой данные подсчета или ответы на вопросы анкеты. Не факт, что коэффициенты корреляции для таких моделей сами по себе обманчивы, но мы явно говорим о другой модели, чем на графиках (1) и (2).

А если коэффициент корреляции равен нулю (r=0)?

plot_r(r = 0, n = 35)

Коэффициент корреляции 0, детерминации 0. Для просмотра в полном размере нажмите на рисунок.

Главное, что видно из этих графиков, это то, что r = 0 не обязательно означает отсутствие связи XY. Это ясно из графиков (9) и (10), которые демонстрируют сильную нелинейную зависимость. Графики (11) и (12) также подчеркивают этот момент: Существует сильная взаимосвязь для большей части данных, но эта тенденция аннулируется одной точкой данных. Иногда, как показано на графике (14), тенденция, присутствующая в двух подгруппах, может быть не видна в агрегированном анализе; однако в данном примере это не так.

А если коэффициент корреляции равен 0,75 (r=0,75)?

Как мы помним, коэффициент детерминации для модели с константой принимает значения от 0 до 1. Чем ближе значение коэффициента к 1, тем сильнее зависимость. При оценке регрессионных моделей это интерпретируется как соответствие модели данным. Для приемлемых моделей предполагается, что коэффициент детерминации должен быть хотя бы не меньше 50 % (в этом случае коэффициент множественной корреляции превышает по модулю 70 %).

Посмотрим на такие графики

plot_r(r = 0.75, n = 35)

Коэффициент корреляции 0.75, детерминации 0.56. Для просмотра в полном размере нажмите на рисунок.

Комментарии, надеюсь, излишни. Пояснения к рисунку аналогичны пояснениям к первому примеру с r=0.5

Мораль: мало построить регрессионную модель, надо еще построить ее график.
]]>
2684
Дерево текущей реальности (TOC) в Graphviz https://tushavin.ru/derevo-tekushhej-realnosti-toc-v-graphviz/ Fri, 23 Jun 2017 10:09:36 +0000 https://tushavin.ru/?p=1274 Читать далее «Дерево текущей реальности (TOC) в Graphviz»

]]>
Рассмотрим еще один пример работы с graphviz — рисование дерева текущей реальности. » Дерево текущей реальности (ДТР) – это инструмент для анализа проблем (рис. 1.12). С его помощью можно изучить причинно-следственные связи, определяющие текущую ситуацию» [1].

Дерево текущей реальности (ДТР)

 

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

  • прямоугольники
  • овалы
  • соединительные линии
  • соединительные стрелки
  • также дополнительно нужны кружки для многостраничной схемы

Все это делается следующим образом.

  • прямоугольники: [shape = box];
  • овалы: [shape = oval,label=»»,height=0.1];
  • соединительные линии [dir=none];
  • соединительные стрелки — и так есть;
  • кружки: [shape=circle];

Также ориентируем документ сверху вниз (rankdir=BT) и выставляем шрифт.

Собственно, скрипт:

digraph PS3 {
resize=auto;
charset="utf8";
node [fontname="Verdana"];
rankdir=BT;
node [shape = box];
T102 [label="102. Сотрудники не до конца пони-\nмают значимость внедрения ПС"];
T301 [label="301.У руководства нет опыта\nвнедрения инструметов ПС"];
T302 [label="302. Для успешного внедрения\nнужно, чтобы каждый сотрудник \nбыл вовлечен в процесс "];
T303 [label="303. Для внедрения ПС\nтребуются доп. затраты ре \nсурсов"];
T304 [label="304. Ресурсы, направленные на мероприятия ПС\nограниченны"];
T305 [label="305. Руководство старается вовлечь \nво внедрение ПС\nбольшую часть сотрудников"];
T306 [label="306.Руководство желает \nвнедрить ПС"];
T307 [label="307.Руководство не хочет\nискать истинные \nпроблемы"];
T308 [label="308. Руководство\nобычно не проводит анализ \nпо степени значимости\nинициатив\nпо внедрению ПС "];
T309 [label="309. Отделы боятся\nнесправедливого\nраспределения ресурсов "];
T310 [label="310.Вовлечение\nвсего персонала\nв мероприятия ПС позволят\nраспределить равномерно ре\nсурсы "];
T311 [label="311.Не происходит\nраспределение мероприятий во важности, \nдля получения скорых результатов "];
T311А [label="311А. План мероприятий, \nкоторый не нацелен на\nрешение проблем предприятия, \nне приведет к улучшениям "];
T312 [label="312. Выделяемые ресурсы \nна внедрение ПС\nраспределены равномерно"];
T313 [label="313. Лишь некоторые мероприятия \nпо внедрению ПС \nповышают производительность и эффективность предприятия "];
T314 [label="314. Руководство \nне заостряет внимание\nна существующие проблемы \n(слабые места) "];
T315 [label="315.Нерациональное распределение \nресурсов уменьшает эффект\nпроводимых мероприятий ПС"];
T316 [label="316.Мероприятия, \nкоторые проводятся\nдля внедрения ПС,не\nулучшают производительность \nв целом "];
T317 [label="317. План мероприятий, \nкоторый не нацелен на\nрешение проблем предприятия, \nне приведет к улучшениям "];
T318 [label="318. Улучшения на предприятии\nне происходят, \nпока существуют\nнерешенные проблемы "];
T319 [label="319.Ресурсы тратятся\nна мероприятия, \nне влияющие на поизв-сть "];
T320 [label="320.Устранение проблем\n(слабых мест) оттягивают"];
T212 [label="212. Большинство думает, \nчто реальных результатов либо долго ждать, \nлибо совсем не будет"];
node [shape=circle];
"711"; "211";"112";
node [shape = oval,label="",height=0.1];
Z1;Z2;Z3;Z4;Z5;Z6;Z7;Z8;
T102->T301;
T301->Z1 [dir=none];
T301->T307;
T302->T305;
T303->"711";
T306->Z1 [dir=none];
T305->Z1 [dir=none];
Z1->T308;
Z1->T308;
Z1->T308;
T304->Z2 [dir=none];
T303->Z2 [dir=none];
T305->Z2 [dir=none];
Z2->T310;
Z2->T310;
Z2->T310;
T307->T311;
T308->T311;
T310->Z3 [dir=none];
T309->Z3 [dir=none];
Z3->T312;
Z3->T312;
T311A->Z4 [dir=none];
T311->Z4 [dir=none];
T305->Z4 [dir=none];
Z4->T313;
Z4->T313;
Z4->T313;
T312->T314;
T312->Z5 [dir=none];
T313->T316;
T314->Z6 [dir=none];
T315->Z6 [dir=none];
T313->Z5 [dir=none];
Z5->T319;
Z5->T319;
Z6->T320;
Z6->T320;
T319->"112";
T317->Z7 [dir=none];
T313->Z7 [dir=none];
Z7->T318;
Z7->T318;
T317->T311A;
T320->Z8 [dir=none];
T316->Z8 [dir=none];
T318->Z8 [dir=none];
Z8->T212;
Z8->T212;
Z8->T212;
"211"->T212;
}

 

Результат (кликабельно).

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

Дерево будущей реальности (ДБР)

Построение принципиально не отличается от ДТР. Элементы те же.

 

Литература

  1. Детмер У Теория ограничений Голдратта. Системный подход к непрерывному совершенствованию. М.: Альпина Паблишер, 2017. 855 с.
]]>
1274
По итогам защиты ВКР бакалавра https://tushavin.ru/po-itogam-zashhity-vkr-bakalavra/ Thu, 08 Jun 2017 07:48:24 +0000 https://tushavin.ru/?p=1258 Читать далее «По итогам защиты ВКР бакалавра»

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

Отсутствие подтверждения статистических гипотез.

Если у вас раньше брак был 5 изделий из 100, а стал 3 изделия из 102 можно ли делать выводы, что брак уменьшился в 1.7 раза? Нет! Убедимся это простым расчетом в R.

> bad<-c(3,5)
> count<-c(100,102)
> prop.test(bad,count)

2-sample test for equality of proportions with continuity correction

data: bad out of count
X-squared = 0.11036, df = 1, p-value = 0.7397
alternative hypothesis: two.sided
95 percent confidence interval:
-0.08252672 0.04448751
sample estimates:
prop 1 prop 2
0.03000000 0.04901961

Warning message:
In prop.test(bad, count) :
аппроксимация на основе хи-квадрат может быть неправильной

Нулевая гипотеза в двнном случае, что пропорции одинаковы. Она подтверждается (p-value = 0.7397 > 0.05). Warning при расчетах говорит о том, выборка маловата для оценки параметра. Иными словами, говорить в приведенном случае об улучшении при таких то данных не приходится.

Рассмотрим похожий вариант. Все те же цифры, но в 10 раз больше.

> bad<-c(30,50)
> count<-c(1000,1020)
> prop.test(bad,count)

2-sample test for equality of proportions with continuity correction

data: bad out of count
X-squared = 4.3154, df = 1, p-value = 0.03777
alternative hypothesis: two.sided
95 percent confidence interval:
-0.036961241 -0.001077974
sample estimates:
prop 1 prop 2
0.03000000 0.04901961

Как видим, теперь гипотеза об одинаковости пропорций отвергается ( p-value = 0.03777 < 0.05) и налицо улучшение процесса.

Неверно построенные контрольные карты

Как известно, для контроля качества по альтернативному признаку используются следующие карты (см. ГОСТ Р ИСО 7870-2-2015. Статистические методы. Контрольные карты. Часть 2. Контрольные карты Шухарта)

 

C-карта. В таких контрольных картах строится график числа дефектов (в партии, в день, на один станок, в расчете на 100 футов трубы и т.п.). При использовании карты этого типа делается предположение, что дефекты контролируемой характеристики продукции встречаются сравнительно редко, при этом контрольные пределы для данного типа карт рассчитываются на основе свойств распределения Пуассона (распределения редких событий).
U-карта. В карте данного типа строится график относительной частоты дефектов, то есть отношения числа обнаруженных дефектов к n — числу проверенных единиц продукции (здесь n обозначает, например, число футов длины трубы, объем партии изделий). В отличие от C-карты, для построения карты данного типа не требуется постоянство числа единиц проверяемых изделий, поэтому ее можно использовать при анализе партий различного объема.
Np-карта. В контрольных картах этого типа строится график для числа дефектов (в партии, в день, на станок), как и в случае С-карты. Однако, контрольные пределы этой карты рассчитываются на основе биномиального распределения, а не распределения редких событий Пуассона. Поэтому данный тип карт должен использоваться в том случае, когда обнаружение дефекта не является редким событием (например, когда обнаружение дефекта происходит более чем у 5% проверенных единиц продукции). Этой картой можно воспользоваться, например, при контроле числа единиц продукции, имеющих небольшой брак.
P-карта. В картах данного типа строится график процента обнаруженных дефектных изделий (в расчете на партию, в день, на станок и т.д.). График строится так же, как и в случае U-карты. Однако контрольные пределы для данной карты находятся на основе биномиального распределения (для долей), а не распределения редких событий. Поэтому P-карта наиболее часто используется, когда появление дефекта нельзя считать редким событием (если, например, ожидается, что дефекты будут присутствовать в более чем 5% общего числа произведенных единиц продукции).

Поэтому построение U-карты для брака 30% в подавляющем большинстве случаев будет методически неверно. Далее, если у вас различный объем выборки, то, по уму, и контрольные границы будут различными. Рекомендую использовать пакет qcc в R, там все это делается проще.

Для построения контрольных карт используется команда qcc со следующим параметром type:

  • «xbar» карта средних значений
  • «R» R-карта размахов
  • «S» S-карта стандартных отклонений
  • «xbar.one» карта индивидуальных значений
  • «p» карта пропорций (p-карта)
  • «np» карта числа несоответствий (np-карта)
  • «c» c-карта
  • «u» u-карта
  • «g» g-карта (карта редких событий)

Рассмотрим построение карты на примере имеющихся в пакете данных orangejuice

Концентрат замороженного апельсинового сока упакован в картонные банки размером 6 унций. Эти банки формуются на машине из картона с прикрепление металлической нижней панели. Затем проверяют, может ли емкость быть заполнена жидкость без протечек, как на боковом шве, так снизу в местах крепления. Если это происходит, банка считается несоответствующей. Данные собирали в виде 30 образцов по 50 банок каждый с интервалом в полчаса в течение трех смен, когда машина работала непрерывно. Для 15 использовался новый полуфабрикат из картона, который планируется вводить в производство. Образец 23 был получен, когда неопытный оператор был временно назначен на машину. После первых 30 образцов была произведена настройка машины. Затем еще 24 образца были взяты из рабочего процесса.

Данные содержат 54 наблюдения следующих четырех величин:

  • sample — номер измерения;
  • D — числ дефектов;
  • size — размер выборки;
  • trial -признак настройка (TRUE) или производство (FALSE)
> library(qcc)
> data(orangejuice)
> head(orangejuice)
sample D size trial
1 1 12 50 TRUE
2 2 15 50 TRUE
3 3 8 50 TRUE
4 4 10 50 TRUE
5 5 4 50 TRUE
6 6 7 50 TRUE
> qcc(orangejuice[orangejuice$trial,2],sizes=orangejuice[orangejuice$trial,3],type="p")

Аналогично можно построить контрольную карту со старыми и новыми значениями.

> qcc(orangejuice[orangejuice$trial,2], sizes=orangejuice[orangejuice$trial,3], newdata=orangejuice[!orangejuice$trial,2], newsizes=orangejuice[!orangejuice$trial,3],type="p")

SWOT анализ

Во всех работах без исключения SWOT-анализ делается просто для того, чтобы занять две-три страницы темы. Смысла в нем практического никакого, делается он неверно, сделанные на основании него выводы (в 80% случаев они просто отсутствуют) настолько тривиальны, что даже говорить о них не хочется. Рецензенты в большинстве случаев отмечают это в замечаниях. Если вы проектируете какую-нибудь инновацию это совершенно бесполезный инструмент, поскольку это инструмент стратегического планирования, а не DFSS. Не позорьтесь, выберите что-нибудь другое в качестве основы своего исследования.

 

]]>
1258
Немного про марковский анализ https://tushavin.ru/nemnogo-pro-markovskij-analiz/ Tue, 23 May 2017 09:40:54 +0000 https://tushavin.ru/?p=1213 Читать далее «Немного про марковский анализ»

]]>
Вчера в процессе обсуждения дипломов всплыла тема марковского анализа и стало ясно, что тема вызывает непонятный страх у студентов и они считают это чем-то излишне сложным. Попробуем разобраться, как пользоваться этим инструментом и что можно с ним делать при написании ВКР и решени других задач.

Итак, в соответствии с ГОСТ Р ИСО/МЭК 31010-2011

В.24 Марковский анализ

В.24.1 Краткий обзор

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

В.24.2 Область применения

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

Там еще много умных и хороших слов, но они почему-то не вдохновляют студентов. Поэтому попробуем разобраться на простом примере.

Пусть студент читает эту статью и в процессе чтения может находиться в двух состояниях: ему интересно или ему скучно. Пусть известны вероятности перехода из одного состояния в другое на каждую минуту чтения.

Напоминаю, что такие картинки легко рисуются с помощью graphviz


# Здесь и далее граф строится с помощью команды dot из пакета graphviz

digraph x01 {
rankdir=LR;
Interested->Bored [ label = "0.2" ];
Bored->Interested [ label = "0.3" ];
}

Пусть в изначально всем было интересно, и мы имели ситуацию (интересно;скучно): (100%;0%)


Рассмотрим первую минуту. Скучно стало 0,2*100%=20%. Интересно стало 0%*0,3=0%. Таким образом, к концу первой минуты имеем ситуацию  (80%;20%).

Вторая минута. Скучно стало 80%*0,2=16%. Т.е. Интересно всё остается 64% студентов, но при этом обрело интерес 20%*0,3=6%. Таким образом 70% интересно.  Скучно осталось 14% и добавилось 16%, получилось 30%.

Так рассуждать, конечно, занимательно, но всё-таки перейдем на язык математики. Пусть имеется матрица начальных состояний:

\[\begin{bmatrix}
1  \\
0
\end{bmatrix} \]

и матрица перехода

I(t) B(t)
I(t+1) 0.8 0.3
B(t+1) 0.2 0.7

\[\begin{bmatrix}
0.8 & 0.3 \\
0.2 & 0.7
\end{bmatrix}\]
Их произведение даст нам:

\[\begin{bmatrix}
0.8 & 0.3 \\
0.2 & 0.7
\end{bmatrix} \begin{bmatrix}
1  \\
0
\end{bmatrix}=\begin{bmatrix}
0.8 \\
0.2
\end{bmatrix}\]

Попробуем сделать это же самое в R.

> p<-matrix(c(1,0),nrow=2) > p
     [,1]
[1,]    1
[2,]    0
> p<-matrix(c(1,0),nrow=2)
> p
 [,1]
[1,] 1
[2,] 0
> trans<-matrix(c(0.8,0.3,0.2,0.7),nrow=2,byrow=T)
> trans
 [,1] [,2]
[1,] 0.8 0.3
[2,] 0.2 0.7
> (p<- trans %*% p)
 [,1]
[1,] 0.8
[2,] 0.2
> (p<- trans %*% p)
 [,1]
[1,] 0.7
[2,] 0.3
> (p<- trans %*% p)
 [,1]
[1,] 0.65
[2,] 0.35
> (p<- trans %*% p)
 [,1]
[1,] 0.625
[2,] 0.375
> (p<- trans %*% p)
 [,1]
[1,] 0.6125
[2,] 0.3875
> (p<- trans %*% p)
 [,1]
[1,] 0.60625
[2,] 0.39375
> (p<- trans %*% p)
 [,1]
[1,] 0.603125
[2,] 0.396875
> (p<- trans %*% p)
 [,1]
[1,] 0.6015625
[2,] 0.3984375
> (p<- trans %*% p)
 [,1]
[1,] 0.6007813
[2,] 0.3992188
> (p<- trans %*% p)
 [,1]
[1,] 0.6003906
[2,] 0.3996094
> (p<- trans %*% p)
 [,1]
[1,] 0.6001953
[2,] 0.3998047
> (p<- trans %*% p)
 [,1]
[1,] 0.6000977
[2,] 0.3999023
> (p<- trans %*% p)
 [,1]
[1,] 0.6000488
[2,] 0.3999512
> (p<- trans %*% p)
 [,1]
[1,] 0.6000244
[2,] 0.3999756
> (p<- trans %*% p)
 [,1]
[1,] 0.6000122
[2,] 0.3999878
> (p<- trans %*% p)
 [,1]
[1,] 0.6000061
[2,] 0.3999939
> (p<- trans %*% p)
 [,1]
[1,] 0.6000031
[2,] 0.3999969
> (p<- trans %*% p)
 [,1]
[1,] 0.6000015
[2,] 0.3999985
> (p<- trans %*% p)
 [,1]
[1,] 0.6000008
[2,] 0.3999992
> (p<- trans %*% p)
 [,1]
[1,] 0.6000004
[2,] 0.3999996
> (p<- trans %*% p)
 [,1]
[1,] 0.6000002
[2,] 0.3999998
> (p<- trans %*% p)
 [,1]
[1,] 0.6000001
[2,] 0.3999999
> (p<- trans %*% p)
 [,1]
[1,] 0.6
[2,] 0.4
> (p<- trans %*% p)
 [,1]
[1,] 0.6
[2,] 0.4

Как мы видим, система оказалась в состоянии стохастического равновесия. Т.е. в каждый момент времени разным студентам интересно и скучно, но пропорция сохраняется: 60% интересно и 40% скучно. Собственно, на идее того, что системы такого вида стремятся к состоянию стохастического равновесия основано решение различных практических задач.

Например, прямая задача. Известны вероятности переходов, но неизвестно состояние равновесия. Заменяем конкретные числа на вероятности состояния в общем виде и имеем тождество:

\[ \begin{bmatrix}
0.8 & 0.3 \\
0.2 & 0.7
\end{bmatrix}\begin{bmatrix}
p \\ 1-p
\end{bmatrix} = \begin{bmatrix}
p \\ 1-p
\end{bmatrix} \]

Которое можно записать как систему уравнений:

\[\begin{cases}p\times0.8+(1-p)\times0.3=p \\
p\times0.2+(1-p)\times0.7=1-p \end{cases} \]

Из первого уравнения находим \( p=0.6 \), соответственно \( 1-p=0.4 \)

Тут любопытный студент возможно спросит, а что делать с тремя состояниями? Да абсолютно то же самое! Напишем в матричном виде

\[ \begin{bmatrix}
0.8 & 0.1 & 0.1\\
0.1 & 0.6 & 0.8 \\
0.1 & 0.3 & 0.1 \\
\end{bmatrix}\begin{bmatrix}
p \\ q \\ (1-p-q)
\end{bmatrix}=\begin{bmatrix}
p \\ q \\ (1-p-q)
\end{bmatrix} \]

Далее напишем систему уравнений решим и получим результат.

Решим обратную задачу. Пусть мы видим, что в каждый момет времени у нас интересно 70% студентам, а скучно 30%. Мы знаем, что в среднем студенту становится интересно через 5 минут слушания. Какова вероятность того, что ему станет скучно? Т.е. надо определить вероятности перехода из состояния «Интересно» в «Cкучно» — x. При этом вероятность перехода в обратную сторону (интенсивность восстановления системы) равен 1/5=0.2 («интересно» через 5 минут, частота дискретизации 1 минута).

Имеем систему:

\[ \begin{bmatrix}
1-x & 0.2 \\
x & 0.8
\end{bmatrix}\begin{bmatrix}
0.7 \\ 0.3
\end{bmatrix}=\begin{bmatrix}
0.7 \\ 0.3
\end{bmatrix}\]

Откуда имеем: \( 0.7\times(1-x)+0.3\times 0.2=0.7 \) и \(x=0.086\) (или \(x=6/70\))

Проверяем в R:


> p<-matrix(c(0.7,0.3),nrow=2) > p
     [,1]
[1,]  0.7
[2,]  0.3
> trans<-matrix(c(1-6/70,6/70,0.2,0.8),nrow=2,byrow=F) > trans
           [,1] [,2]
[1,] 0.91428571  0.2
[2,] 0.08571429  0.8
> trans %*% p
     [,1]
[1,]  0.7
[2,]  0.3

Как видим, все верно. На всякий случай уточняю, что считать не обязательно в процентах от студентов. Можно и в студентах. Например, для группы в 20 человек имеем:


> p<-matrix(c(14,6),nrow=2) 
> p
     [,1]
[1,]   14
[2,]    6
> trans<-matrix(c(1-6/70,6/70,0.2,0.8),nrow=2,byrow=F) 
> trans
           [,1] [,2]
[1,] 0.91428571  0.2
[2,] 0.08571429  0.8
> trans %*% p
     [,1]
[1,]   14
[2,]    6

Теперь, предположим, мы улучшили  какой-то из показателей, например, студенту становится интересно не через 5 минут, а через 4. Что изменится в нашей системе, если считать, что интенсивность отказа (студенту становится скучно) не изменилось? Имеем снова прямую задачу на нахождение стохастического равновесия с известной матрицей переходов. Как её решать описано выше, на этом останавливаться не будем, а просто промоделируем пошагово изменение системы и построим график.

> p<-matrix(c(0.7,0.3),nrow=2) 
> p
 [,1]
[1,] 0.7
[2,] 0.3
> 
> trans<-matrix(c(1-6/70,6/70,0.25,0.75),nrow=2,byrow=F) 
> trans
 [,1] [,2]
[1,] 0.91428571 0.25
[2,] 0.08571429 0.75
> result<-rep(0,40)
> for(i in 1:40) {
+ result[i]<-p[1,1] 
+ p<-trans %*% p }
> plot(result,pch=19,xlab="Время, мин", ylab="Доля заинтересованных студентов")
> p
 [,1]
[1,] 0.7446808
[2,] 0.2553192

Таким образом, если у вас имеется система, которую можно свести к задаче такого вида не вижу, отчего бы не использовать её в вашей ВКР.

 

]]>
1213
Игры с природой https://tushavin.ru/imperfect/ Mon, 26 Dec 2016 11:01:34 +0000 http://tushavin.ru/?p=851 Читать далее «Игры с природой»

]]>
В игре с природой участвуют два игрока: один из них, обозначим его через А, — лицо, принимающее решение; другой, обозначим его через П, — природа. Игрок А действует осознанно, стремясь принять наиболее выгодное для себя решение, а природа П, в отличие от него , принимает то или иное свое состояние неопределенным образом, не противодействуя злонамеренно игроку А, не преследуя конкретной цели и абсолютно безразлично к результату игры, т.е. природа П, являясь игроком в игре, не является ни противником, ни союзником игрока А.

Пусть игрок А обладает m возможными стратегиями А1,…,Аm, а природа П может находиться в одном из n своих состояний П1,…,Пn. Предполагается обычно, что игрок А в состоянии оценить результаты выбора им каждой из своих стратегий Аi, i=1,…,m, при каждом состоянии природы Пj, j=1,…,n, количественно выражающиеся действительными числами аij.

Эти числа, называемые выигрышами игрока А, можно записать в виде матрицы:

library(knitr)
mtx<-matrix(c(2,1,2,
            3,5,6,
            1,4,2,
            4,3,1.5),ncol=4)
rownames(mtx)<-paste0("A~",1:nrow(mtx),"~")
colnames(mtx)<-paste0("П~",1:ncol(mtx),"~")
kable(mtx)
П1 П2 П3 П4
A1 2 3 1 4.0
A2 1 5 4 3.0
A3 2 6 2 1.5

Чистые стратегии

Критерий Байеса

Имеется вектор весов W, описывающий состояния природы.

(w<-c(0.5,0.1,0.2,0.2))
## [1] 0.5 0.1 0.2 0.2
sum(w)
## [1] 1

Тогда произведение B=A*W дает

B<-mtx %*% w
colnames(B)<-"П~B~"
kable(B)
ПB
A1 2.3
A2 2.4
A3 2.3

Оптимальная стратегия есть максимум

max(B)
## [1] 2.4

Таким образом, выигрывает стратегия A2.

Критерий Байеса-Лапласа

О состоянии природы ничего не известно, вероятности предполагаем равными.

(w<-c(0.25,0.25,0.25,0.25))
## [1] 0.25 0.25 0.25 0.25
BL<-mtx %*% w
colnames(BL)<-"П~B~"
kable(BL)
ПB
A1 2.500
A2 3.250
A3 2.875

Оптимальная стратегия есть максимум

max(BL)
## [1] 3.25

Таким образом, выигрывает стратегия A2.

Критерий Вальда

Оптимальной среди чистых стратегий покритерию Вальда считается та чистая стратегия, прикоторой минимальный выигрыш является максимальным среди минимальных выигрышей всех чистых стратегий. Таким образом, оптимальная стратегия по критерию Вальда гарантирует при любых состояниях природы выигрыш, не меньший максимина.

V<-as.matrix(apply(mtx,1,min))
colnames(V)<-"П~W~"
kable(V)
ПW
A1 1.0
A2 1.0
A3 1.5
max(V)
## [1] 1.5

Таким образом, по критерию Вальда лучшей является третья стратегия.

Критерий Ходжа-Лемана

Имеется матрица, состоящая из оценки стратегий по критериям Байеса и Вальда

kable(HL<-cbind(B,V))
ПB ПW
A1 2.3 1.0
A2 2.4 1.0
A3 2.3 1.5

И имеется коэффициент l,описывающий степень доверия к состоянию природы. Обратный коэффициент, равен 1-l описывает степень пессимизма.

(w<-c(0.75,0.25))
## [1] 0.75 0.25
kable(HLM<-HL %*% w,col.names = "КХЛ")
КХЛ
A1 1.975
A2 2.050
A3 2.100

Оптимальной стратегией по критерию Ходжа-Лемана является стратегия А3 с наибольшим показателем эффективности:

max(HLM)
## [1] 2.1

Максимаксный критерий

Вероятность состояний неизвестны. Решение принимается в условиях неопределенности.

M<-as.matrix(apply(mtx,1,max))
colnames(M)<-"П~M~"
kable(M)
ПM
A1 4
A2 5
A3 6
max(M)
## [1] 6

Оптимальной стратегией по максимаксному критерию является стратегия А3 с наибольшим показателем эффективности 6.

Критерий пессимизма-оптимизма Гурвица

Имеется матрица, состоящая из оценки стратегий по критериям Вальда и Максимакса. Критерий Гурвица устанавливает баланс между случаями крайнего пессимизма и крайнего оптимизма путем взвешивания обоих способов поведения соответствующими весами (1 — y) и y, где 0<y<1. Значение y от 0 до 1 может определяться в зависимости от склонности лица, принимающего решение, к пессимизму или к оптимизму. При отсутствии ярко выраженной склонности y = 0,5 представляется наиболее разумной.

kable(HV<-cbind(V,M))
ПW ПM
A1 1.0 4
A2 1.0 5
A3 1.5 6
(w<-c(0.5,0.5))
## [1] 0.5 0.5
kable(HVM<-HV %*% w,col.names = "КГ")
КГ
A1 2.50
A2 3.00
A3 3.75
max(HVM)
## [1] 3.75

Оптимальной стратегией по максимаксному критерию является стратегия А3 с наибольшим показателем эффективности 3.75.

Критериц Сэвиджа (критерий сожаления)

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

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

Строим матрицу потерь

mtx1<- matrix(rep(apply(mtx,2,max),nrow(mtx)),byrow=T,ncol=ncol(mtx))-mtx
kable(mtx1)
П1 П2 П3 П4
A1 0 3 3 0.0
A2 1 1 0 1.0
A3 0 0 2 2.5

Находим максимальный риски (сожаление)

S<-as.matrix(apply(mtx1,1,max))
colnames(S)<-"П~S~"
kable(S)
ПS
A1 3.0
A2 1.0
A3 2.5

Находим минимальный риск. Оптимальной стратегией по максимаксному критерию является стратегия А2 с наименьшим риском:

min(S)
## [1] 1
]]>
851
Получение данных с Yandex в R https://tushavin.ru/r-yandex-2016/ Tue, 20 Dec 2016 12:36:15 +0000 http://tushavin.ru/?p=776 Читать далее «Получение данных с Yandex в R»

]]>
Обратились ко мне с вопросом, как получить данные для обработки в R, например, для выявления зависимости курса валюты от прочих рыночных котировок. Если мы перейдет на страницу новостей Яндекса, то увидим графики и табличные данные, хотелось бы их как-то получить. Опишу пошагово как я решал эту задачу.

Для начала, откроем эту страницу в режиме просмотра кода. По идее, для динамического построения графиков может использоваться xml или json. Поиск в коде находит нам следующую строку:

<a class="link link_ajax link_theme_normal i-bem" data-bem='{"link":{}}' tabindex="0" href="/quotes/index.html">Ещё</a></div></div><div class="quote i-bem" data-bem='{"quote":{"signValDigit":4,"animation":true,"url":"/quotes/graph_1.json"}}'>

Интересует именно ссылка “/quotes/graph_1.json”. Вспоминаем HTML, понимаем, что это ссылка на данные от корня сайта, иными словами, она имеет вид https://news.yandex.ru/quotes/graph_1.json.

Теперь надо разобраться, как импортировать json в R. Ищем. Первая же ссылка дает ответ.

 

Необходимо установить пакет и выполнить команды:

install.packages("rjson") 
library("rjson") 
json_file <- "https://news.yandex.ru/quotes/graph_1.json" 
json_data <- fromJSON(file=json_file)

Попробуем код, с учетом того, что получаем списковые данные (list), а нам нужна таблица (data frame), конвентируем хитрым образом список.

# install.packages("rjson")
library("rjson")
json_file <- "https://news.yandex.ru//quotes/graph_1006.json" 
l <- fromJSON(file=json_file) 
df <- data.frame(matrix(unlist(l$prices), nrow= length(l$prices), byrow=T),stringsAsFactors=FALSE) 
tail(df) 
##                X1    X2
## 6302 1.481748e+12 53.79
## 6303 1.481835e+12 54.19
## 6304 1.481921e+12 55.26
## 6305 1.481927e+12 55.33
## 6306 1.482180e+12 54.76
## 6307 1.482235e+12 55.46
df$Dat=format(as.Date(df$X1/3600/24/1000, origin = "1970-01-01"),"%Y-%m-%d") 
tail(df)
##                X1    X2        Dat
## 6302 1.481748e+12 53.79 2016-12-14
## 6303 1.481835e+12 54.19 2016-12-15
## 6304 1.481921e+12 55.26 2016-12-16
## 6305 1.481927e+12 55.33 2016-12-16
## 6306 1.482180e+12 54.76 2016-12-19
## 6307 1.482235e+12 55.46 2016-12-20

Вроде все работает. Напишем функцию, которая будет получать данные с Yandex и возвращать в виде таблицы. В качестве первого аргумента передаем цифровой код Яндекс (смотрим в адресной строке), в качестве второго задаем имя колонки:

GetYandexData<-function(idx,valuename="Value") {
  json_file <- paste0("https://news.yandex.ru//quotes/graph_",idx,".json")
  l <- fromJSON(file=json_file)
  df <- data.frame(matrix(unlist(l$prices), nrow= length(l$prices), byrow=T),stringsAsFactors=FALSE)
  df$Dat=format(as.Date(df$X1/3600/24/1000, origin = "1970-01-01"),"%Y-%m-%d")
  names(df)[2]<-valuename
  return(df[,c(3,2)]) 
}

z1<-GetYandexData(1006,"Brent")
z2<-GetYandexData(10,"Gold")
z3<-GetYandexData(1,"USD")

mytable<-merge(merge(z1,z2),z3)
tail(mytable)
##             Dat Brent   Gold     USD
## 5107 2016-12-16 55.26 1135.4 61.7515
## 5108 2016-12-16 55.26 1136.8 61.7515
## 5109 2016-12-16 55.33 1135.4 61.7515
## 5110 2016-12-16 55.33 1136.8 61.7515
## 5111 2016-12-19 54.76 1141.0 61.7931
## 5112 2016-12-20 55.46 1134.4 61.7967

Новогодние ёлочки на графике

Можно было бы на этом остановиться, но посмотрим как  можно построить интересный график с помощью расширения ggplot2.

Добавим технические колонки в отдельной таблице

graphData <- mytable
graphData$year=as.factor(format(as.Date(graphData$Dat),"%Y"))
graphData$month=as.factor(format(as.Date(graphData$Dat),"%m"))
graphData$wd=as.factor(format(as.Date(graphData$Dat),"%u"))
tail(graphData)
##             Dat Brent   Gold     USD year month wd
## 5107 2016-12-16 55.26 1135.4 61.7515 2016    12  5
## 5108 2016-12-16 55.26 1136.8 61.7515 2016    12  5
## 5109 2016-12-16 55.33 1135.4 61.7515 2016    12  5
## 5110 2016-12-16 55.33 1136.8 61.7515 2016    12  5
## 5111 2016-12-19 54.76 1141.0 61.7931 2016    12  1
## 5112 2016-12-20 55.46 1134.4 61.7967 2016    12  2
# "В лесу родилась ёлочка..."
# См. http://www.r-bloggers.com/geom_christmas_tree-a-new-geom-for-ggplot2-v2-0/
# Нижеследующий код нужен для построения елочек
library(ggplot2)
GeomChristmasTree <- ggproto("GeomChristmasTree", Geom,
 required_aes = c("x", "y"),
 default_aes = aes(shape = 19, colour = "black", 
 fill = "green4", size = 3,
 linetype = 1, alpha = 1,
 fontsize = 1),
 draw_key = draw_key_polygon,
 
 draw_panel = function(data, panel_scales, coord) {
 coords <- coord$transform(data, panel_scales)
 
 # each tree has 4*branches + 3 points
 if (length(coords$size) == 1) {
 tsize <- rep(pmax(1, round(coords$size)), length(coords$x))
 theight <- rep(pmax(0, round(coords$size)), length(coords$x))
 } else {
 tsize <- pmax(1, round(coords$size))
 theight <- pmax(0, coords$size)
 }
 
 # scale factors
 r01x <- diff(range(coords$x))/100
 r01y <- diff(range(coords$y))/100
 
 # coords
 longx <- unlist(lapply(seq_along(coords$x), function(i) {
 if (tsize[i] == 1) {
 dx <- -c(0.3, 0.3, 1.2, 0, -1.2, -0.3, -0.3)
 } else {
 dx <- -c(0.3, 0.3, rep(c(1.2,0.3), tsize[i]-1), 1.2, 0, -1.2, rep(c(-0.3,-1.2), tsize[i]-1), -0.3, -0.3)
 }
 r01x*dx + coords$x[i]
 }))
 longy <- unlist(lapply(seq_along(coords$y), function(i) {
 if (tsize[i] == 1) {
 dy <- c(-0.5, 0, 0, theight[i], 0, 0, -0.5)
 } else {
 dy <- c(-0.5, 0, 0, rep(1:(tsize[i]-1), each=2), theight[i], rep((tsize[i]-1):1, each=2), 0, 0, -0.5)
 }
 r01y*dy + coords$y[i]
 }))
 longid <- unlist(sapply(seq_along(coords$y), function(i) {
 rep(i, each=4*tsize[i]+3)
 }))
 
 grid::polygonGrob(
 longx, 
 longy,
 id = longid,
 gp = grid::gpar(col = coords[,"colour"],
 fill = coords[,"fill"],
 fontsize = 10)
 )
 }
)
geom_christmas_tree <- function(mapping = NULL, data = NULL, stat = "identity",
                                position = "identity", na.rm = FALSE, show.legend = NA, 
                                inherit.aes = TRUE, ...) {
  layer(
    geom = GeomChristmasTree, mapping = mapping,  data = data, stat = stat, 
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )
}
# "В лесу она росла..."

# Строим график зависимости курса от цены на нефть


ggplot(subset(graphData,year=="2016"), aes(x=Brent, y=USD)) + 
  stat_density_2d(aes(color=month))+
    geom_christmas_tree(aes(fill=month,size=wd)) +
  labs(x="Цена на Нефть Brent (ICE.Brent), USD/баррель",y="Курс USD ЦБ РФ, руб.")+
  scale_fill_discrete(name = "Месяц")+
  scale_size_discrete(guide=FALSE)+
  scale_color_discrete(guide=FALSE)+
  theme_bw()+theme(text=element_text(size=14))
## Warning: Using size for a discrete variable is not advised.

# Сохраняем картинку. Размер в дюймах.
ggsave("Pic1.png",width=6,height=6,dpi=300)
]]>
776
Настройка R-Portable https://tushavin.ru/rstudio_instalacion/ Thu, 01 Dec 2016 11:13:48 +0000 http://tushavin.ru/?p=677 Читать далее «Настройка R-Portable»

]]>
Как установить R-Portable на флеш-накопитель

  1. Скачиваем и устанавливаем на флешку платформу PortableApp.
  2. Скачиваем и устанавливаем R Portable.
  3. Скачиваем и устанавливаем RStudio Portable.

Все необходимое установлено. Теперь настраиваем. Для этого делаем следующие действия.

  1. Запускаем приложение Start  в корне флеш-накопителя. Видим в трее новый значок, если на него нажать открывается окно.

pic01

2. Запускаем RStudioPortable. Видим вот такое окно:

pic02

Необходимо указать путь к R. Для этого нажимаем кнопку Browse и на флеш-накопителе выбираем папку F:\PortableApps\R-Portable\App\R-Portable\bin (в моём случае это диск F, у вас может быть другой). Приобретает вот такой вид (поскольку у меня 64-битная ОС).

pic03

Выбираем ту, что больше нравится, я выбрал 64-битную и нажимаем OK. Видим вот такое окно.

pic04

Соглашаемся и получаем запущенную RStudio

pic05

Теперь необходимо установить пакеты расширения, которые нам пригодятся в работе. Для этого полностью скопируем команду

source(url("https://tushavin.ru/RStudio/installall.R"))

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

3. Переходим к проверке работы. Открываем материал по линейному программированию. Внизу видим раздел «Решение с пакетом lpSolve» и прямо под ним код. Копируем его полностью, вставляем после приглашения, нажимаем Enter. Вставляем еще две команды:

result
result$solution

Результат должен совпасть с описанным в заметке.

 

]]>
677
ПО для курса по обработке данных в R https://tushavin.ru/89-2/ Wed, 21 Sep 2016 11:16:51 +0000 http://tushavin.ru/?p=89 Читать далее «ПО для курса по обработке данных в R»

]]>
Необходимо установить следующее ПО

  1. Язык R
  2. RStudio

Рекомендуется устанавливать под Windows не в предложенные папки по умолчанию, а в C:\R и C:\RStudio чтобы потом не было проблем с установкой дополнительных пакетов и обновлений из-за конфликта прав доступа.

Богатая библиотека по R и RStudio на русском для самостоятельного изучения доступна вот тут.

Предварительно для занятий согласована аудитория 54-01 на БМ.

Пожалуйста, не забудьте пройти опрос по способу проведению занятий.

]]>
89
XLSTAT free edition https://tushavin.ru/xlstat-free-edition/ Thu, 09 Jun 2016 06:55:19 +0000 http://tushavin.ru/?p=168 Вышла бесплатная версия статистического расширения для Excel

]]>
168