5-Factor Model of Personality
5-Factor Model of Personality

В качестве повышения собственного уровня в программировании я решил написать бота в Телеграм, который проводит тестирование по 5-Factor Model of Personality. Простыми словами, это тест, в котором участники отвечают в формате от «Полностью согласен» до «Полностью не согласен» на ~50 вопросов, на подобие «я душа компании» или «я часто беспокоюсь». На выходе, мы получаем результаты от 1 до 100 по пяти факторам — Открытость к опыту, Сознательность, Экстраверсия, Доброжелательность, Невротизм (эмоциональная стабильность).

Интерпретировать результаты можно таким нехитрым способом. Например, мы получаем 70 по экстраверсии — это означает, что, если бы в комнате находились 100 человек, расположенных в порядке возрастания их экстраверсии, то мы стояли бы на 70 месте. То есть, мы были бы более общительны, чем 70% людей в комнате. Надеюсь, что звучит нетрудно.

Думаю, что выбор языка python для написания бота в Телеграм является незамысловатым решением, так как большинство ботов написаны на питоне и обилие библиотек на питоне для работы с API Телеграм сильно упрощает работу и позволяет сконцентрироваться на предмете работы. Библиотеку использовал python-telegram-bot.

Правильность подсчета результатов является основой любого теста. Для данного бота я взял эти данные. Там содержатся более миллиона итогов прохождений данного тестирования другими людьми. Что нам нужно, это:

  1. получить результаты для каждой записи из этой базы

  2. посчитать показатели по каждому фактору

  3. сохранить их

  4. позже использовать как основу для подсчета результатов в Телеграм боте

Быстро пробегусь по каждому пункту.

import pickle as pkl
import numpy as np
import pandas as pd
  1. pd.read_csv('data.csv')

  2. Каждый вопрос добавляет баллы в зависимости от ответа (не согласен — 1, согласен — 5). Все ответы по каждому фактору суммируются и делятся на количество вопросов. Также, есть вопросы, которые нужно «нормализовать», то есть вычесть ответ из 6. Например, «я общителен» — ответ со значением 5, «я люблю одиночество» — 1. Здесь мы должны вычесть из 6 значение второго ответа, чтобы получить средний балл 5 по экстраверсии ((5+5)/2).

  3. С помощью библиотеки pickle, надо сделать dump данных, чтобы не высчитывать эти данные каждый раз при использовании бота.

model_file_name = 'test.pickle'
pkl.dump(df, open(model_file_name, 'wb'))
  1. Высчитываем процентиль.

model_file_name = 'test.pickle'
df = pkl.load(open(model_file_name, 'rb'))

extraversion = pd.Series(df['extraversion'])

# по сути, мы повторяем пункт 2 для ответов пользователя
# случайные значения
user_values = [2.1, 3.2, 3.4, 4.1, 2.8]

# здесь мы берем первое значение (только для примера)
extraversion_quantile = (
  ((extraversion < user_values[0]).sum())/extraversion.count()
) * 100

Сама механика общения с ботом построена на ConversationHandler. Ответы сохраняются в контексте коллбэков, а по итогу, считаются средние значения пользователя и соотносятся со значениями с модели выше. Здесь я не буду вставлять код, но его можно посмотреть github.

Переводы вопросов, а также интерпретацию результатов, а именно, что означает высокий/средний/низкий показатель по тому или иному фактору, я доверил Chat-GPT.

Попробовать бота можно тут.

Другие боты можно глянуть на моем сайте.

Спасибо за прочтение.

Комментарии (5)


  1. Lainhard
    25.08.2023 06:49

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

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

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

    3) поделиться результатом теста, все мы животные социальные, порой хочется пройти тест и дать ссылку товарищу и посмотреть наши различия.


    1. keeeparis Автор
      25.08.2023 06:49

      Да, согласен.

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

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


  1. amir_abdusamatov
    25.08.2023 06:49

    Хотелось бы знать какой показатель является высоким/средним/низким. А то я узнаю описание всех пунктов, а к какому отнести себя хз)


    1. keeeparis Автор
      25.08.2023 06:49

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


      1. keeeparis Автор
        25.08.2023 06:49

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