Комплексный анализ и прогнозирование данных в R с использованием машинного обучения

Авторы: Чайтанья Прамодх Касула и Айшвария Варала

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

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

В Латинской Америке для принятия этого решения используется популярный метод, называемый Proxy Means Test. Агентства смотрят на наблюдаемые атрибуты семьи, такие как материал потолка, количество комнат в доме, количество человек в доме и т. Д., Чтобы сделать вывод о праве семьи на получение помощи. Однако точность остается проблемой. Таким образом, Межамериканский банк развития предоставил сообществу Kaggle набор данных, чтобы предложить новые методы, которые могли бы эффективно направлять их на домохозяйства, нуждающиеся в социальной помощи.

Источник данных: набор данных, используемый в проекте, извлекается из Kaggle. URL-адрес источника данных: https://www.kaggle.com/c/costa-rican-household-poverty-prediction/overview

Описание данных: папка данных состоит из train.csv и test.csv с 9557 строками и 23856 строками соответственно. Однако в test.csv нет столбца «target», который определяет уровень бедности. Следовательно, только train.csv используется в качестве набора данных размером 3,08 МБ. Количество столбцов - 143. Каждая запись связана с одним человеком. Описание 143 столбцов находится в URL-адресе источника данных, упомянутого выше. Ниже приведены описания нескольких столбцов.
Целевой показатель: обозначает уровень бедности 1 = крайняя бедность, 2 = умеренная бедность, 3 = уязвимые домохозяйства, 4 = неуязвимые домохозяйства
Идхогар: уникальный идентификатор для каждого домохозяйства. В этом столбце указаны люди, принадлежащие к одному домохозяйству.
v2a1: Ежемесячная арендная плата, выплачиваемая каждым домохозяйством.
rooms: количество комнат в доме.
escolari: количество лет обучения и т. д.

Сопутствующие вопросы исследования:
R1: Можем ли мы построить модель, чтобы определить уровень бедности для различных домохозяйств Коста-Рики?
R2: Можем ли мы определить наиболее важные факторы / столбцы / предикторы, определяющие уровень бедности домохозяйства?
R3: Есть ли связь между полученным образованием, полом, главой семьи, количеством человек, количеством комнат в доме, зависимостью и технологией (мобильные телефоны, компьютер, телевизор, планшет) до уровня бедности домохозяйства?
R4: При отсутствии столбца "целевой" и с учетом особенностей в R3, насколько точно алгоритм кластеризации K-средних может помочь в присвоении ярлыка класса (определение уровня бедности / значения целевого столбца) для человека?

Типы данных переменных. С переменными в наборе данных связаны четыре типа данных:

  1. Логическое: целочисленное логическое (0 или 1), символьное логическое (да или нет). Столбцы, такие как paredblolad, noelec и т. Д.
  2. Тип данных с плавающей запятой. Например, meaneduc, перенаселенность и т. Д.
  3. Целочисленный тип данных. Например, возраст, аренда, комнаты, тамвив и т. Д.
  4. Буквенно-цифровой. Например, Ид, идхогар.

Распределение классов исследования данных: Распределение уровня бедности (распределение классов) очень несбалансированное, как показано на рис. 2. Числовые строки, принадлежащие классу «четыре», составляют 65,72% набора данных, но количество строки, относящиеся к классу «один», составляют всего 0,074%. Такое же неравномерное распределение наблюдалось в наборе данных на уровне домохозяйства, как показано на рис. 3. Для более детального понимания набора данных на уровне домохозяйства, пожалуйста, прочтите раздел «Набор данных домохозяйства».

Количество значений NaN в столбце month_rent_payment: 6860 строк содержат значения NaN в столбце «month_rent_payment». Столбцы «own_and_fully_paid_house», «own_paying_in_installments», «арендовано», «ненадежно» и «other_assigned_borrowed» содержат двоичные значения, которые обозначают 0 (FALSE) или 1 (TRUE). Из рис. 4 можно сделать вывод, что 5911 человек владеют домом и 961 человек владеют домом, но платят в рассрочку. Этот факт может быть очень полезен при предварительной обработке данных.

Предварительная обработка данных. Исходные названия столбцов были переименованы в их сокращенные эквиваленты на английском языке для облегчения справки, понимания и общения. Их можно найти в файле «changed_column_names.csv». Отныне ссылки на данные будут осуществляться через переименованные столбцы.

Обработка отсутствующих значений и разработка характеристик: Из исследовательских вопросов R1, R2 и R3 можно понять, что единицей анализа является домохозяйство. Однако каждая запись в наборе данных описывает атрибуты одного человека в домашнем хозяйстве. Людей, принадлежащих к одному домохозяйству, можно сгруппировать по столбцу "имя_дома", поскольку каждому из них присвоено одно и то же значение идентификатора. Значения «Household_identifer» уникальны для каждой семьи. Кроме того, всем людям в одном домохозяйстве присваивается одинаковое значение «целевого» класса (уровня бедности).

Отсутствующие значения обнаруживаются в нескольких столбцах набора данных. С учетом пояснений, приведенных в разделе «Анализ данных» над значениями NaN, представленными в столбце «ежемесячная_рента_плата», предполагается, что все люди, владеющие домом, не платят арендную плату. Осталось всего 7 человек. Поскольку их количество слишком мало, все строки со значениями NaN в столбце «month_rent_payment» заменяются нулем.

Столбец «number_of_tablets_household_own» также содержит значения NaN. Столбец owns_a_tablet указывает, есть ли у семьи планшет или нет. Если у домохозяйства нет планшета, его значение в столбце «number_of_tablets_household_own» заменяется нулем. Для каждого домохозяйства вычисляются средние значения столбцов "years_of_schooling" и "years_behind_in_school", которые присваиваются главе домохозяйства. Символьные логические значения (да или нет) в столбце «зависимость» были заменены на 1 или 0 соответственно. Такая же операция была проделана для столбцов «edjefe» и «edjefa».

Повторяющиеся столбцы удаляются из набора данных. Например, есть два столбца с одинаковым именем «age_squared», которые дублируют друг друга. Только один из них сохраняется. Кроме того, существует множество столбцов, которые представляют собой квадраты значений существующих столбцов, таких как overcrowding_squared, dependency_squared и т. Д. Все такие столбцы были удалены из набора данных, поскольку они не предоставляют дополнительной информации для модели. Кроме того, переменная класса «цель» состоит из уровней бедности в числовом формате 1, 2, 3 и 4. Они были заменены словами один, два, три и четыре соответственно. Столбцы (if_stepson_or_doughter, if_son_or_doughter_in_law, if_grandson_or_doughter, if_father_or_mother_in_law, if_brother_or_sister, if_brother_or_sister_in_law, if_other_family_member, if_spouse_or_partner, if_son_or_doughter, if_mother_or_father) несущественны и не подпадают под сферу действия ответов на вопросы исследования и, следовательно, были устранены. Пакеты «dplyr» (Wickham et al., 2017) и «stringr» (Wickham, 2019) используются для предварительной обработки данных. Для визуализации данных использовались пакеты «ggplot» (Wickham, 2016) и Tableau (Tableau Software, 2019). Пакет «corrplot» (Wei et al., 2017) использовался для построения корреляционной матрицы.

Использование корреляции для уменьшения количества признаков. Матрица корреляции была построена для 119 столбцов, которые остаются после этапа предварительной обработки. Визуализация такого огромного сюжета неуклюжа. Следовательно, высококоррелированные признаки, значение корреляции которых превышает 0,98, были извлечены из матрицы и нанесены на график отдельно. Поскольку программное обеспечение не может отображать длинные имена столбцов, они были представлены цифрами на рис. 5. Цифры от 1 до 14 на рисунке соответствуют столбцам «size_of_the_household», «home_size», «of_total_individuals_in_the_household», «total_persons_in_the_household», , 'toilet_connected_to_sewer_or_cesspool', 'if_household_head', 'region_brunca', 'if_widower', 'no_main_source_of_energy_used_for_cooking_no_kitchen', 'if_predominant_material_on_the_outside_wall_is_natural_fibers', 'electricity_from_cooperative', 'if_predominant_material_on_the_roof_is_natural_fibers', 'if_predominant_material_on_the_floor_is_wood' и 'if_predominant_material_on_the_roof_is_fiber_cement_mezzanine' соответственно. Целью построения графика корреляции является удаление сильно коррелированных столбцов из набора данных, поскольку они не предоставляют никакой дополнительной ценности. Из рисунка 5 видно, что «size_of_the_household», «home_size», «of_total_individuals_in_the_household», «total_persons_in_the_household» сильно коррелируют друг с другом. Следовательно, только один из этих столбцов включен в набор данных.

Набор данных о домохозяйстве. Глава домохозяйства считается представителем каждого домохозяйства. Следовательно, только строки, столбец if_household_head которых равен 1, становятся частью этого набора данных. Такие функции, как «years_of_schooling», которые связаны с одним человеком, были должным образом обработаны, чтобы отразить домашнее хозяйство во время предварительной обработки данных. Этот набор данных состоит из 2973 строк, и отныне он будет считаться набором данных о домохозяйстве.

Моделирование с использованием случайного леса: Чтобы ответить на первый вопрос исследования, набор данных о домохозяйстве используется для обучения случайного леса. Для данного случая, чей уровень бедности / целевой показатель неизвестен, обученная модель предсказала бы класс для этой строки. Случайный лес - это метод ансамблевого обучения, который строит деревья различной длины путем взятия выборок из набора данных (выборка начальной загрузки). Оставшиеся данные, которые не являются частью конструкции, часто называют набором данных Out-Of-Bag (OOB). Построенная модель затем использует набор данных OOB в качестве тестового набора и самостоятельно оценивает его производительность. Предполагая, что строки независимы друг от друга (как в нашем случае), нет необходимости выполнять перекрестную проверку отдельно при использовании случайного леса. Это неявно выполняется внутри компании с помощью данных OOB. Ошибка OOB для каждого построенного дерева решений может быть усреднена, чтобы представить общую частоту ошибок модели. Случайные леса также хорошо обобщают и избегают переобучения, что является одной из основных проблем, наблюдаемых в деревьях решений. Пакет под названием «randomForest» (Liaw et al., 2002) из ​​пакета «caret» (Kuhn et al., 2019) используется для обучения и тестирования данных.

Разделение набора данных на наборы для обучения и тестирования: из-за проблемы дисбаланса классов случайное разделение набора данных в соотношении 75:25 для обучающих и тестовых наборов не приводит к извлечению значительного количества связанных строк. с классом меньшинства в тестовой выборке. Следовательно, полученные метрики производительности не очень надежны. Таким образом, 75% данных из каждого класса стали частью обучающего набора, а 25% данных из каждого класса стали частью тестового набора. Следовательно, 75% и 25% данных из каждого класса составляют поезд и тестовый набор соответственно. Итоговое количество строк в поезде и тестовом наборе составляет 2230 и 744 соответственно.

Обучение: на первой итерации для обучения использовалось 112 столбцов (столбцы, оставшиеся после предварительной обработки). Буквенно-цифровые элементы, такие как столбцы «id» и «домашний_идентификатор», были удалены из обучающего набора. Для обучения классификатора используются следующие гиперпараметры: «ntree = 500» и «mtry = 10». Были протестированы различные значения «mtry», но значение «mtry», равное 10, привело к лучшей производительности. Чтобы уменьшить количество столбцов, используемых для обучения, значения MeanDecreaseinGini извлекаются из обученной модели. Значение среднего уменьшения индекса Джини напрямую связано с важностью характеристики. Чем больше среднее уменьшение значения индекса Джини для функции, тем больше ее значение для прогнозирования целевой переменной. На рис. 6 представлены 15 основных характеристик. В следующих итерациях для обучения будут использоваться только эти 15 функций. Это снижает стоимость обучения за счет уменьшения количества функций со 112 до 15.

Оценка ошибки OOB показана на рис. 7. Можно заметить, что ошибка класса для «четыре» очень меньше. Принимая во внимание, что классовая ошибка для «один», «два» и «три» высока. Модель была хорошо обучена для класса 4, потому что количество записей для класса 4 относительно велико и, следовательно, имеет низкую ошибку. Но из-за меньшего количества записей, связанных с классами «один», «два» и «три», модель не была обучена должным образом, отсюда и высокая ошибка.

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

Недостаточная выборка: случайная недостаточная выборка была проведена для четвертого класса. 35% записей, принадлежащих к классу «четыре», были выбраны случайным образом и включены в набор данных. Таким образом, количество записей, относящихся к классу «четыре», было сокращено с 1954 года до 684. Никаких выборок для записей, принадлежащих другим классам, не производилось. После недостаточной выборки на рисунках 8 и 9 показано распределение классов для поездов и тестовых наборов соответственно. На рис. 10 подробно описана оценка ошибки OOB для набора данных с недостаточной выборкой. Можно заметить, что оценка ошибки OOB для классов «один», «два» и «три» существенно не уменьшилась по сравнению с рис. 7. Ошибка класса для «четыре» увеличилась. Модель плохо работает ни с одним классом из-за меньшего количества записей, доступных для всех классов. Следовательно, недостаточная выборка набора данных, когда доступно меньшее количество записей, является плохим подходом, так как это может привести к недостаточному соответствию.

Передискретизация: случайная передискретизация была выполнена для классов «один», «два» и «три». Записи, связанные с упомянутыми классами, были продублированы соответствующим образом, чтобы минимизировать разницу в распределении классов. После передискретизации на рисунках 12 и 13 представлено распределение классов в обучающей и тестовой выборках соответственно. Модель была переобучена, и оценка ошибки OOB представлена ​​на рисунке 11.

Можно заметить, что имеется значительное уменьшение общей оценки ошибки OOB и ошибок соответствующего класса. Следовательно, передискретизация записей классов меньшинств способствует лучшему обучению и развитию моделей. На рисунках 14 и 15 показано изменение частоты ошибок обучения различных классов с увеличением количества деревьев во время недостаточной и избыточной выборки. Красный, зеленый, синий и фиолетовый цвета представляют классы «четыре», «один», «два» и «три» соответственно. Черная линия представляет общий коэффициент ошибок OOB. Во время передискретизации частота ошибок для всех классов уменьшается с увеличением количества деревьев.

Тестирование: общее количество записей в тестовом наборе составляет 488. Он составляет 25% записей, извлеченных из каждого класса. Столбцы target, id и family_identifier были удалены из тестового набора. Полученные данные отправляются в обученный классификатор случайных лесов для получения результатов. Для каждой записи в наборе тестов классификатор использует знания, полученные в ходе обучения, чтобы предсказать класс для этой записи. Прогнозируемые метки сравниваются с их исходными значениями в "целевом" классе, который определяет производительность модели.

Показатели эффективности. Точность - один из основных показателей для оценки моделей классификации. Это определяется следующим образом:

Однако в задачах классификации только точность не может использоваться для оценки классификатора. Более детально изучить полученные результаты можно с помощью матрицы неточностей. Матрица неточностей - это комбинация прогнозируемых и фактических значений разных классов. На его основе могут быть получены важные метрики, такие как точность (специфичность) и чувствительность (отзыв). Чувствительность также называется истинно положительным показателем. Специфичность также известна как истинная отрицательная ставка. Чем выше значения Accuracy, Sensitivity и Specificity для существующих классов, тем лучше модель.

Функция confusionMatrix из пакета caret (Kuhn et al., 2019) используется для получения матрицы неточностей путем предоставления фактических и прогнозируемых значений в качестве входных данных. На рисунках 16 и 17 представлены матрицы неточностей и характеристики классификатора для соответствующих методов. Однако показатели, представленные в генеральной совокупности, должны быть скорректированы, поскольку эти метрики предназначены для извлеченных выборок, а не для всей генеральной совокупности. Следовательно, полученные метрики необходимо скорректировать так, чтобы они отражали реальную численность населения.

Для выборки, если C1, C2, C3 и C4 обозначают метрику классификации для классов «один», «два», «три» и «четыре» соответственно, тогда его взвешенное значение метрики для всей / исходной совокупности обозначается от,

где N1, N2, N3, N4 представляют собой исходный / фактический размер генеральной совокупности, а S1, S2, S3, S4 представляют размер выборочной совокупности. Следовательно, взвешенная точность, взвешенная специфичность, взвешенная чувствительность для классификатора, обученного на данных с недостаточной выборкой, составляют 53,41%, 78,65% и 18,01% соответственно. Взвешенная точность, взвешенная специфичность, взвешенная отзывчивость для классификатора, обученного на наборе данных с передискретизацией, составляют 84,39%, 93,24% и 84,44% соответственно.

Оценка взаимосвязи между характеристиками, упомянутыми в R3, и уровнем бедности: чтобы оценить взаимосвязь между полученным образованием, полом, главой семьи, количеством человек, количеством комнат в доме, иждивенцем. и технологии (мобильные телефоны, компьютер, телевизор, планшет) до уровня бедности, модель обучается только с указанными ниже функциями. Затем обученная модель используется для прогнозирования записей в тестовом наборе. Чем ближе показатели эффективности нового классификатора к показателям эффективности старого классификатора (модель, обученная с использованием 15 основных важных функций), тем сильнее взаимосвязь между упомянутыми характеристиками и «целевым» (уровнем бедности).

Новая модель обучается с помощью классов «один», «два» и «три» с передискретизацией, но только с использованием функций «edjefa», «edjefe», «years_of_education_of_male_head_of_household_squared», «dependency», «overcrowding», «meaneduc», «years_of_schooling». ',' total_females_in_the_household ',' total_persons_in_the_household ',' no_of_mobile_phones ',' total_males_in_the_household ',' if_the_household_has_notebook_or_desktop_computer '. На рис. 18 подробно представлены полученные метрики производительности переобученной модели на тестовой выборке.

Общие скорректированные взвешенная точность, взвешенная чувствительность и взвешенная специфичность для исходной популяции составляют 81,11%, 0,8115 (81,15%) и 0,9059 (90,59%) соответственно. Результаты показывают, что функции сильно связаны с "целевым" классом. Их отсортированные значения MeanDecreaseGini, как показано на рис. 19. Среди выбранных функций наиболее важной особенностью является «годы_ обучения», а наименее важной - «if_the_household_has_notebook_or_desktop_computer».

Кластеризация. Методы кластеризации упрощают группировку записей на основе меры сходства. K-среднее - это известный метод кластеризации, который использует метрику расстояния (обычно евклидову) для кластеризации точек данных. Центроид является наиболее репрезентативной точкой кластера K-средних. Пакеты «cluster» (Rousseeuw et al., 2019), «factoextra» (Kassambara et al., 2017) и «purrr» (Henry et al., 2019) используются для алгоритма K-средних, визуализации кластера и локтя. график (рис. 20) соответственно. Функции, которые использовались в разделе «Оценка взаимосвязи между характеристиками, упомянутыми в R3, и уровнем бедности», использовались только для кластеризации, поскольку они связаны с факторами, упомянутыми в R3. Алгоритм K-средних был применен только к упомянутым функциям. Здесь единицей анализа является отдельный человек. Номер входного кластера был предоставлен как 8, так как это похоже на изгиб колена на графике локтя (рис. 20). Предварительно обработанные данные, которые использовались для случайного леса, также используются для K-средних. Столбец «target» удален из набора данных.

Рис. 21 показывает визуализацию 8 кластеров. Оси X и Y представляют собой уменьшенные размеры записей, которые представлены двумя главными компонентами с наибольшей дисперсией. Уменьшение размерности было выполнено с помощью PCA через пакет «factoextra» только для визуализации. В K-средних каждой записи назначается ближайший к ней центроид, который представлен номером кластера. Каждый цвет на графике представляет собой кластер.

Запись и номер ее кластера сравниваются для дальнейшего анализа. Цель состоит в том, чтобы определить, может ли K-Means объединять записи с одинаковыми уровнями бедности в кластеры. Стол. 1 представляет собой распределение индивидуальных уровней бедности в результирующих кластерах. Можно сделать вывод, что кластеризация K-средних неэффективна для определения уровня бедности, поскольку не было связи между результирующими кластерами и исходными уровнями бедности. Причина может быть связана с неравным распределением классов и нелинейностью данных. Минимизируя сумму квадратов внутри кластера, алгоритм придает больший вес большим кластерам, чем меньшим. Следовательно, четких групп не наблюдалось. Уровни бедности были распределены по кластерам. Чтобы проверить важность номера входного кластера, в качестве входных данных были предоставлены различные значения, и соответственно были сгенерированы кластеры K-средних. Однако увеличение количества кластеров не привело к образованию эффективных кластеров. В качестве эксперимента для генерации кластеров K-средних использовались 15 основных характеристик (которые являются непрерывными переменными), полученные из обученной модели случайного леса, вместо функций в R3. Это также не улучшило результат значительно.

Ответы на вопросы исследования:
Ответ для R1:
Да. Классификатор случайного леса был создан для успешного определения уровня бедности коста-риканских домохозяйств с хорошими показателями производительности. При наличии большего количества данных производительность модели может быть улучшена.
Ответ для R2: Да. Пятнадцать наиболее важных столбцов, определяющих уровень бедности для домохозяйства, в порядке убывания их важности: «годы_ обучения», «среднее образование», «возраст в годах», «зависимость», «перенаселенность», «количество_все_комнаты_в_доме», «без_мобильных_фонов». ',' edjefe ',' years_of_education_of_male_head_of_household_squared ',' number_of_children_0_to_19_in_household ',' month_rent_payment ',' edjefa ',' total_females_in_the_household ',' спален '/ 3хв_домах . Существует сильная взаимосвязь между характеристиками, относящимися к объектам, упомянутым в вопросе R3, и уровнем бедности домохозяйства.
Ответ для R4: Метод кластеризации K-средних неэффективен при кластеризации записей с одинаковым уровнем бедности. Следовательно, в отсутствие столбца «цель» и с данными функциями в R3 алгоритм кластеризации K-средних не может помочь в назначении метки класса для человека / человека.

Источники:
Хэдли Уикхэм, Ромен Франсуа, Лайонел Генри и Кирилл Мюллер (2019). dplyr: грамматика обработки данных. Пакет R версии 0.8.3. Https://CRAN.R-project.org/package=dplyr

Хэдли Уикхэм (2019). stringr: простые согласованные оболочки для общих строковых операций. Пакет R версии 1.4.0. Https://CRAN.R-project.org/package=stringr

Х. Уикхэм. ggplot2: Элегантная графика для анализа данных. Springer-Verlag New York, 2016. Программное обеспечение Tableau (2019). Получено с https://www.tableau.com/

Тайюн Вэй и Вильям Симко (2017). Пакет R 'corrplot': Визуализация корреляционной матрицы (версия 0. 84). Доступно по адресу https://github.com/taiyun/corrplot

А. Лиау и М. Винер (2002). Классификация и регрессия методом randomForest. Новости Р 2 (3), 18--22.

Макс Кун. Вклады Джеда Винга, Стива Уэстона, Андре Уильямса, Криса Кифера, Аллана Энгельхардта, Тони Купера, Закари Майера, Брентона Кенкеля, команды R Core, Майкла Бенести, Рейнальда Лескарбо, Эндрю Зима, Луки Скрукки, Юаня Танга, Кан Кандана и Тайлера Охота. (2019. caret: Обучение классификации и регрессии. Пакет R версии 6.0-84. Https://CRAN.R-project.org/package=caret

Maechler, M., Rousseeuw, P., Struyf, A., Hubert, M., Hornik, K. (2019). кластер: основы и расширения кластерного анализа. Пакет R версии 2.1.0.

Альбукадель Кассамбара и Фабиан Мундт (2017). factoextra: извлечение и визуализация результатов многомерного анализа данных. Пакет R версии 1.0.5. Https://CRAN.R-project.org/package=factoextra

Лайонел Генри и Хэдли Уикхэм (2019). purrr: Инструменты функционального программирования. Пакет R версии 0.3.2. Https://CRAN.R-project.org/package=purrr

Программное обеспечение Tableau (2019). Получено с https://www.tableau.com/