Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Replace or Remove Invalid or Missing Data - Wolfram Mathematica

Подстановка или удаление недостающих или недействительных данных

При анализе данных, часто возникает необходимость очистить набор данных перед его анализом. Элементы данных с отсутствующими записями, или содержащие недопустимые значения, должны быть удалены или заменены возможными или ожидаемыми значениями.  Mathematica предоставляет удобную среду для такого вида предварительной обработки данные.

Общепринято использовать специальный символ, строку или число за пределами рассматриваемого диапазона для замещения недостающей информации в наборе данных. Во встроенных в Mathematica функциях, для этой цели используется символ Missing.

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

In[1]:=

ReplaceOrRemoveInvalidOrMissingDataRU_1.gif

Так выводятся значения gdps для первых 10 стран в алфавитном порядке:

In[2]:=

ReplaceOrRemoveInvalidOrMissingDataRU_2.gif

Out[2]=

ReplaceOrRemoveInvalidOrMissingDataRU_3.gif

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

Максимум не может быть абсолютно точно определен по исходным данным:

In[3]:=

ReplaceOrRemoveInvalidOrMissingDataRU_4.gif

Out[3]=

ReplaceOrRemoveInvalidOrMissingDataRU_5.gif

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

Воспользуемся функцией Count с шаблоном _Missing для подсчета выражений с заголовком Missing:

In[4]:=

ReplaceOrRemoveInvalidOrMissingDataRU_6.gif

Out[4]=

ReplaceOrRemoveInvalidOrMissingDataRU_7.gif

По сравнению с общим количеством данных в наборе (оно определено при помощи функции Length), количество отсутствующих значений относительно невелико:

In[5]:=

ReplaceOrRemoveInvalidOrMissingDataRU_8.gif

Out[5]=

ReplaceOrRemoveInvalidOrMissingDataRU_9.gif

Было бы вполне оправданно удалить отсутствующие элементы и продолжать анализ на оставшихся элементах набора данных. Самым простым способом удалить эти элементы данных является применение функции DeleteCases с тем же самым шаблоном, который использовался с функцией Count при подсчете выражений с заголовком Missing:

In[6]:=

ReplaceOrRemoveInvalidOrMissingDataRU_10.gif

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

In[7]:=

ReplaceOrRemoveInvalidOrMissingDataRU_11.gif

Out[7]=

ReplaceOrRemoveInvalidOrMissingDataRU_12.gif

Любые расчеты, которые могут быть выполнены над списком чисел, могут быть проведены над отфильтрованным набором данных.

    

В предыдущем примере был рассмотрен достаточно специфичный случай наличия недействительных значений в наборе данных: все они содержали заголовок Missing. На практике, представление недостающих данных меняется от случая к случаю. Человек, вводящий данные в таблицу, может ввести NA для значения, которое недоступно или неприменимо, а некоторые программы сбора данных могут отображать недостающие значения измерений специальным числом за пределами рассматриваемого диапазона. В связи с этим, очень важно понимать, что представляют собой данные, чтобы определить какие значения являются недействительными.

Здесь дан набор данных, где первый элемент представляет номер одной из двух групп, а два других элемента являются численными результатами измерений свойств отдельных объектов в этих группах:

In[8]:=

ReplaceOrRemoveInvalidOrMissingDataRU_13.gif

Отображение данных в табличной форме облегчает задачу поиска "проблемных" данных:

In[9]:=

ReplaceOrRemoveInvalidOrMissingDataRU_14.gif

Out[9]=

1 71.6 0.41
2 27.2 4.96
2 59.3 0.18
1 46. 2.72
2 42.2 1.06
1 89.1 3.75
4 88.6 1.9
1 62.3 1.8
1 82.7 NA
1 35.5 1.84

В данном случае есть две проблемы. Несмотря на то, что существуют только две группы, 1 и 2, в наличии есть также запись с номером группы 4. Кроме этого, есть не численная запись в третьем столбце. Необходимо выполнить некоторые преобразования для удаления или изменения проблемных элементов набора данных.

Действительные элементы набора данных должны содержать 1 или 2 в качестве первого элемента и числа в качестве второго и третьего элемента. Шаблон для данных такого типа будет следующим: {1|2, _?NumberQ, _?NumberQ}. Символ | указывает на альтернативный вариант: первый элемент должен быть 1 или 2. Функция NumberQ проверяет, является ли ее аргумент числом, а выражение _?NumberQ является шаблоном для проверки всех элементов. Можно использовать этот шаблон вместе с функциями MatchQ и Not, чтобы сформулировать функцию, которая идентифицирует неверные элементы данных.

Эта функция идентифицирует такие элементы данных, проверяя соответствие данных на входе заданному шаблону. Она возвращает значение True (Истина) если данные на входе не совпадают с шаблоном:

In[10]:=

ReplaceOrRemoveInvalidOrMissingDataRU_15.gif

Для удаления недействительных данных, используем функцию DeleteCases с выражением _?baddata в качестве шаблона:

In[11]:=

ReplaceOrRemoveInvalidOrMissingDataRU_16.gif

Out[11]=

ReplaceOrRemoveInvalidOrMissingDataRU_17.gif

Зачастую, наилучшим вариантом является не полное удаление недействительных значений, а их замена на возможные значения, рассчитанные на основе других элементов данные. Несмотря на это, для рассматриваемого набора данных не ясно, чем заменить запись, содержащую группу под цифрой 4, кроме как бросить жребий между 1 и 2. Возможно, в таких случаях , удаление подобной записи было бы оправдано.

Зададим функцию badgroup, которая будет определять, является ли запись набора данных недействительной, путем проверки соответствия первого элемента записи значения&# 1084; 1 или 2:

In[12]:=

ReplaceOrRemoveInvalidOrMissingDataRU_18.gif

Воспользуемся функцией DeleteCases с шаблоном  _?badgroup, для удаления элементов данных с недействительными для данного набора значениями:

In[13]:=

ReplaceOrRemoveInvalidOrMissingDataRU_19.gif

Out[13]=

ReplaceOrRemoveInvalidOrMissingDataRU_20.gif

Так как NA принадлежит к единственной записи, не имеющей значения в третьем столбце, которая относится к группе 1, вместо NA можно подставить среднее или медиану от всех элементов данных третьего столбца группы 1.

Замена недействительного значения средним может быть выполнена путем выборки элементов данных группы 1, расчета среднего для третьих элементов, являющихся числами, и подстановки полученного среднего значения вместо NA.

Используем функцию Select для выборки элементов данных группы 1:

In[14]:=

ReplaceOrRemoveInvalidOrMissingDataRU_21.gif

Out[14]=

ReplaceOrRemoveInvalidOrMissingDataRU_22.gif

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

In[15]:=

ReplaceOrRemoveInvalidOrMissingDataRU_23.gif

Out[15]=

ReplaceOrRemoveInvalidOrMissingDataRU_24.gif

Теперь воспользуемся правилом подстановки для замены NA найденным средним значением:

In[16]:=

ReplaceOrRemoveInvalidOrMissingDataRU_25.gif

Out[16]=

ReplaceOrRemoveInvalidOrMissingDataRU_26.gif

Применим функцию Grid для отображения отфильтрованных данных:

In[17]:=

ReplaceOrRemoveInvalidOrMissingDataRU_27.gif

Out[17]=

1 71.6 0.41
2 27.2 4.96
2 59.3 0.18
1 46. 2.72
2 42.2 1.06
1 89.1 3.75
1 62.3 1.8
1 82.7 2.104
1 35.5 1.84

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

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

In[18]:=

ReplaceOrRemoveInvalidOrMissingDataRU_28.gif

Для начала, зададим исходные данные заново, опустив запись с группой 4:

In[19]:=

ReplaceOrRemoveInvalidOrMissingDataRU_29.gif

Out[19]=

ReplaceOrRemoveInvalidOrMissingDataRU_30.gif

Заменим нечисленные значения данных в 3-ем столбце средним от соответствующей группы:

In[20]:=

ReplaceOrRemoveInvalidOrMissingDataRU_31.gif

Out[20]=

ReplaceOrRemoveInvalidOrMissingDataRU_32.gif

Как вариант, заменим нечисленные значения в 3-ем столбце медианами от соответствующей группы:

In[21]:=

ReplaceOrRemoveInvalidOrMissingDataRU_33.gif

Out[21]=

ReplaceOrRemoveInvalidOrMissingDataRU_34.gif

Затем, можно воспользоваться функцией Table для обработки набора данных столбец за столбцом. Применим комбинацию функций Transpose и Grid для отображения "очищенного" набора данных в табличной форме. В этом примере, в качестве значения для подстановки используется среднее д& #1083;я группы:

In[22]:=

ReplaceOrRemoveInvalidOrMissingDataRU_35.gif

Out[22]=

1 71.6 0.41
2 27.2 4.96
2 59.3 0.18
1 46. 2.72
2 42.2 1.06
1 89.1 3.75
1 62.3 1.8
1 82.7 2.104
1 35.5 1.84

Поскольку функция была создана для обработки одного столбца, Вы можете применять отдельные оценки для каждого столбца.

Здесь, недействительные элементы второго столбца заменены средним от соответствующей группы данного столбца, а недействительные элементы третьего столбца заменены медианой от соответствующей группы данного столбца:

In[25]:=

ReplaceOrRemoveInvalidOrMissingDataRU_36.gif

Out[25]=

1 71.6 0.41
2 27.2 4.96
2 59.3 0.18
1 46. 2.72
2 42.2 1.06
1 89.1 3.75
1 62.3 1.8
1 82.7 1.84
1 35.5 1.84