Инструменты Python для визуализации результатов опросов/тестов
Одна из ключевых задач в анализе данных — сопоставление и визуализация разных наборов информации. Зачастую нам приходится иметь дело с результатами проведенных опросов, заполненными чек-листами по и т.д.
В этой статье мы расскажем о возможностях языка Python для визуализации пересечений множеств, об основных плюсах и минусах представленных методов.
Рассмотрим в качестве примера опрос для сотрудников по внутренним сервисам, т.к. в нем возможны совершенно разные вопросы, которые могут предполагать множественный выбор ответа, а не только «да» или «нет».
Допустим, что мы опросили 100 респондентов, причем у них было только 3 варианта ответа. На выходе мы получили следующую картину:
50 ответов – А и В;
25 ответов – А и С;
25 ответов – только А.
Гистограмма
На получившейся диаграмме мы видим, что ответ А выбрали 100 респондентов, ответ В – 50 и ответ С – 25, но она не показывает нам информацию о пересечении респондентов, выбравших кроме ответа А, ответы В или С. Кроме того, по этой диаграмме можно сделать ошибочное заключение, что в опросе приняли участие 175 респондентов.
Для решения этой проблемы лучше использовать диаграммы Венна – инструмент Python Matplotlib-Venn.
import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib_venn import venn3, venn3_circles from matplotlib_venn import venn2, venn2_circles
Подготавливаем и загружаем данные для анализа. В нашем вопросе 6 вариантов ответа, их мы распределяем по 6 столбцам. При выборе варианта ответа информация появится в поле, в обратном случае – поле останется пустым. Таким образом, мы получим 6 списков с информацией об индексах, выбравших тот или иной вариант респондентов.
df = pd.read_csv (‘Service_opros.csv’) nm = ‘Какими сервисами Вы пользовались?’ d1 = df[~df[nm].isnull()].index.tolist() # A d2 = df[~df[nm+’_1′].isnull()].index.tolist() # B d3 = df[~df[nm+’_2′].isnull()].index.tolist() # C d4 = df[~df[nm+’_3′].isnull()].index.tolist() # D d5 = df[~df[nm+’_4′].isnull()].index.tolist() # E d6 = df[~df[nm+’_5′].isnull()].index.tolist() # F
Диаграммы Венна очень просты и удобны. Мы передаем наборы с данными для последующего изучения. Venn2 используем при наложении двух наборов, Venn3 – трех. Разберем на примере трех наборов данных:
venn3([set(d1), set(d2), set(d5)], set_colors=(‘#3E64AF’, ‘#3EAF5D’, ‘#D74E3B’), set_labels = (‘A’, ‘B’, ‘E’), alpha=0.75) venn3_circles([set(d1), set(d2), set(d5)], lw=0.7) plt.show()
На диаграмме Венна показано, что по результатам опроса 895 респондентов выбрали сервис B, 164 респондента – сервис A и 111 респондентов – E. При этом мы видим, пересечение ответов: 127 респондентов использовали A и B, 79 – B и E, 37 – A и E, а также 30 респондентов, которые выбрали все три сервиса.
Если мы решим показать пересечение более трех наборов данных с помощью этого инструмента, то столкнемся со сложностями в восприятии итоговых диаграмм:
По рисунку сложно определить, сколько респондентов при опросе выбрали только 2 варианта A и C, на их пересечении также изображены варианты B и D. Обратите внимание, что размер пересечений на изображении не соответствует действительности. Например, респондентов, выбравших вариант B (895) и их должно быть больше, чем выбравших вариант С (211), но на диаграмме они равны.
Для решения данной проблемы воспользуемся Графиками UpSet, они не так просты для восприятия как диаграммы Венна, но решают вопрос визуализации пересечения нескольких наборов данных.
upset_df = pd.DataFrame() col_names = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’] nm = ‘Какими сервисами Вы пользовались?’ for idx, col in enumerate(df[[nm, nm+’_1′, nm+’_2′, nm+’_3′, nm+’_4′, nm+’_5′]]): temp = [] for i in df[col]: if str(i) != ‘nan’: temp.append(True) else: temp.append(False) upset_df[col_names[idx]] = temp upset_df[‘c’] = 1 example = upset_df.groupby(col_names).count().sort_values(‘c’) example
upsetplot.plot(example[‘c’], sort_by=»cardinality») plt.title(‘Какими сервисами Вы пользовались?’, loc=’left’) plt.show()
График UpSet
Столбцы вверху диаграммы показывают количество повторений комбинации вариантов. Матрица внизу – какую комбинацию описывает каждый столбец, а горизонтальная гистограмма – размер каждого отдельного набора.
Мы видим, что наиболее часто (800 респондентов) выбирали только ответ В, при этом ответ встречался более, чем 1000 раз. Следующий по популярности набор ответов среди респондентов – не выбран ни один ответ (примерно 200 человек так поступили), а реже всех встречался ответ F.
Стоит отметить, что один из вариантов вообще не отображался на диаграммах Венна: не выбран ни один ответ, а сейчас эта информация достаточно наглядно представлена.
На наш взгляд, диаграммы Венна удобны при работе с небольшим набором множеств, а графики Upset более наглядны, когда множеств три и более.
Python-сообщество
- Начало
- » Python для новичков
- » Создание теста с выбором ответов
#1 Июнь 6, 2020 14:39:33
oDoDo Зарегистрирован: 2020-05-05 Сообщения: 70 Репутация: 0 Профиль Отправить e-mail
Создание теста с выбором ответов
Как создавать тесты с выбором ответов?
Например:
x+2=4
А) x=2
B) x=4
C) x=3
D) x = 9
выбрав правильный ответ пишет “Правильно!” и переходит к следующему вопросу, иначе пишет “Ошибка” и предлагает пройти тест с начала.
#2 Июнь 7, 2020 11:17:21
xam1816 Зарегистрирован: 2020-05-11 Сообщения: 1310 Репутация: 113 Профиль Отправить e-mail
Создание теста с выбором ответов
class Task: def __init__(self,text,correct_variant,a,b,c='',d='',): self.text = text self.variant_of_answer=<> list_variant = ['a', 'b', 'c', 'd'] i = 0 for var in (a,b,c,d): if var != '': self.variant_of_answer[list_variant[i]]=var i+=1 self.correct_variant = correct_variant task_list = [] task_list.append(Task("x+2=4",'a','x=2','x=4','x=3','x=9')) task_list.append(Task("2+2*2",'b','8','6')) def display_task(n,task): print("Задача №<>:\n<>".format(n,task.text)) print("Варианты ответа:") for key,value in task.variant_of_answer.items(): print("<>) <>".format(key,value)) def check_variant(task): variant = input("Выберите вариант ответа: ") if variant in (task.variant_of_answer): if variant == task.correct_variant: print("Правильно\n") else: print("Не правильно\nПройти тест сначала?\n") choice = input("Введите да или нет: ") if choice in ('да',"нет"): if choice == "да": test() else: print("Все равно пройдите") test() else: print("это наверно да") test() else: print("Такого варианта нет!Введите маленькую латинскую букву варианта\n") check_variant(task) def test(): n = 0 for task in task_list: n+=1 display_task(n,task) check_variant(task) print("Вы прошли тест.Вы свободны") test()
Отредактировано xam1816 (Июнь 7, 2020 13:44:20)
Онлайн
#3 Июнь 7, 2020 13:12:08
AD0DE412 Зарегистрирован: 2019-05-12 Сообщения: 1130 Репутация: 44 Профиль Отправить e-mail
Создание теста с выбором ответов
однакож накрутили вы ) как человек это будет сдавать (предположу что это ему не для себя) то этож палево (тут ооп во все поля а он(она) базу не знает)
1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите и вставьте ссылку на его url
…
есчщо
Отредактировано AD0DE412 (Июнь 7, 2020 13:24:20)
Хочу создать несколько вариантов ответов
Например, перечислить в коллекции ( tuple , list , set , и т.п.) и через in проверить:
n = 'Не правильно!' if name not in ("16", "17", "18") else 'Отлично!' # OR: n = 'Отлично!' if name in ("16", "17", "18") else 'Не правильно!'
Либо стареньким способом через if :
if name == "16" or name == "17" or name == "18": n = 'Отлично!' else: n = 'Не правильно!' # OR: n = 'Отлично!' if name == "16" or name == "17" or name == "18" else 'Не правильно!'
Как сделать условие на проверку ответа пользователя в Python?
Ребят, всем привет! Python начал изучать недавно, много чего еще не знаю. Нужна ваша помощь.
Делал я программу которая выводит на экран рандомные примеры, которые пользователь должен был решать. И столкнулся с проблемой, что не знаю как сделать проверку того, что ввел пользователь. Помогите мне пж.
#coding utf8: #меню print("Выберете уровень сложности :") otv = (input("1 - Easy " + "2 - Medium" + "3 - Hard - ")) # если ввел верные данные if otv == "1": t2 = True print("Решите примеры ") #если ввел не верные данные if otv != "1": while True: print("Введенно не правильное действие") print("Попробуйте еще раз :") otv = (input("1 - Easy " + "2 - Medium" + " 3 - Hard - ")) if otv == "1": t2 = True print("Решите примеры ") break while t2: import random a = random.randint(0, 20) b = random.randint(0, 20) r = a + b otv1 = (input(str(a) + " + "+ str(b) + " = " )) if r == "otv1": v = "Верно " print(v) else: v1 = "Не верно " print(v1)
- Вопрос задан более трёх лет назад
- 4468 просмотров
10 комментариев
Простой 10 комментариев