{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Основы анализа данных в Python\n", "\n", "## Домашнее задание №2А\n", "\n", "### Формат сдачи задания\n", "\n", "Для сдачи задания необходимо добавить в текущий ipynb-файл ячейки с кодом (и текстом, если требуются содержательные ответы на вопросы) после каждого задания, сохранить изменения и загрузить итоговый файл через запрос Dropbox по ссылке, предложенной преподавателем.\n", "\n", "Всего за задание можно получить 20 баллов. \n", "\n", "Дедлайн: 4 октября 23:59." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Часть 1 (12 баллов)\n", "\n", "В файле `responses_py.csv` сохранены результаты опроса пользователей, которые используют продукты проекта Jupyter в преподавании курсов по программированию. Основные столбцы в датафрейме:\n", "\n", "* `timestamp`: отметка времени;\n", "* `course`: название курса;\n", "* `school`: название университета;\n", "* `webpage_url`: ссылка на официальную страницу курса;\n", "* `materials_url`: ссылка на материалы курса в открытом доступе;\n", "* `instructor`: имена преподавателей;\n", "* `how_often`: как часто проходят занятия;\n", "* `students`: примерное число студентов на курсе;\n", "* `level`: уровень курса;\n", "* `prog_level`: уровень владения программированием, необходимый для курса;\n", "* `field`: к какой области наук относится курс;\n", "* `big_pain_run`: наибольшая проблема при проведении курса;\n", "* `tools`: ресурсы проекта Jupyter, используемые на курсе;\n", "* `assign_types`: типы заданий на курсе;\n", "* `assign_quest`: типы задач в заданиях;\n", "* `assign_grade`: способы проверки заданий;\n", "* `assign_eval`: критерии оценивания заданий;\n", "* `big_pain_grade`: наибольшая проблема при проверке заданий.\n", " \n", "Опрос был проведен в мае 2016 года Джессикой Хэмрик (Jessica Hamrick), список вопросов и оригинальный датафрейм с более длинными названиями столбцов можно найти в [репозитории](https://github.com/jupyter/surveys/tree/master/surveys/2016-05-education-survey) на Github." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 0 (0.5 балла)\n", "\n", "Загрузите данные из файла `responses_py.csv` и сохраните их в датафрейм `resp`. Выведите техническое описание датафрейма с типами всех столбцов, посмотрите на типы данных, с которыми вам предстоит работать." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 1 (1 балл)\n", "\n", "Выведите описательные статистики для всех столбцов. Проинтерпретируйте результаты для столбца `students`. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 2 (1 балл)\n", "\n", "Удалите строки датафрейма, которые содержат пропущенные значения в столбце с названием курса (`course`) и столбце со способами проверки заданий (`assign_grade`). Строки с пропусками в других столбцах должны остаться в датафрейме." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 3 (2 балла)\n", "\n", "Посмотрите на уникальные значения в столбце `assign_grade`. Добавьте в датафрейм столбец `nbgrader` со значениями 0 и 1, где 1 соответствует респондентам, которые указали в качестве используемых способов проверки заданий по программированию расширение *nbgrader*, а 0 – всем остальным респондентам. \n", "\n", "Обратите внимание: нас интересуют не только те респонденты, кто использует *nbgrader* и больше ничего, но и те, кто указал его как один из возможных способов проверки. Другими словами, тут надо учесть, что слово *nbgrader* может либо присутствовать в ячейке с ответом, либо отсутствовать." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 4 (3 балла)\n", "\n", "Вычислите долю респондентов, которые для проверки заданий по программированию используют расширение *nbgrader*. Постройте 95%-ный доверительный интервал для доли преподавателей, которые используют этот ресурс для проверки заданий. Проинтерпретируйте полученный доверительный интервал." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 5 (0.5 балла)\n", "\n", "Запустите строки кода ниже, чтобы добавить в датафрейм столбцы с минимальным и максимальным числом студентов, которые обучаются на курсах по Python (предполагается, что датафрейм назван `resp`, как было указано в самом первом задании):" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
0100250
21025
31025
61025
7Less than 10None
\n", "
" ], "text/plain": [ " 0 1\n", "0 100 250\n", "2 10 25\n", "3 10 25\n", "6 10 25\n", "7 Less than 10 None" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# метод .split() из модуля str разбивает строки в столбце \n", "# students по тире и возвращает столбец со списками внутри ячеек;\n", "# опция expand = True растягивает элементы списка на столбцы;\n", "# в итоге получаем датафрейм new с двумя столбцами, \n", "# минимальным и максимальным числом студентов;\n", "# добавляем столбец 1 с максимальным числом студентов в resp\n", "\n", "new = resp[\"students\"].str.split(\" - \", expand = True)\n", "resp[\"max_students\"] = new[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 6 (1 балл)\n", "\n", "Измените тип столбца `max_students` на *float* и сохраните изменения. Целочисленный тип *int* здесь не подойдет, так как в столбце есть пропущенные значения." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 7 (3 балла)\n", "\n", "Сгруппируйте строки датафрейма по значениям в столбце `nbgrader` и посчитайте среднее значение максимального числа студентов на курсе в каждой группе. Проверьте, используя подходящий статистический критерий, можно ли считать, что максимальное число студентов на курсах, где преподаватели используют расширение для автоматической проверки заданий *nbgrader*, и максимальное число студентов на курсах, где преподаватели проверяют задания иным способом, в среднем, различаются. Проинтерпретируйте полученные результаты, приняв уровень значимости 5% (уровень доверия 95%)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Часть 2 (8 баллов)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В файле `life_expect.csv` хранятся данные по ожидаемой продолжительности жизни за 2016 год и факторам, которые могут быть с ней связаны (данные Всемирной организации здравоохранения). Переменные в файле:\n", "\n", "* `country` и `region`: страна и регион;\n", "* `life_expect`: ожидаемая продолжительность жизни;\n", "* `adult_mortality`: взрослая смертность (вероятность умереть в возрасте от 15 до 60 лет на 1000 населения, т.е. домноженная на 1000);\n", "* `bmi`: индекс массы тела;\n", "* `alcohol`: потребление алкоголя (в литрах на душу населения);\n", "* `basic_water`: процент населения с доступом к чистой воде." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Загрузите данные из файла `life_expect.csv` и сохраните их в датафрейм `life`. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 8 (2 балла)\n", "\n", "Вычислите коэффициент корреляции Пирсона для ожидаемой продолжительности жизни (`life_expect`) и процентом населения, имеющим доступ к чистой воде (`basic_water`). Приняв уровень значимости равным 5% (уровень доверия 95%), проверьте гипотезу о равенстве истинного коэффициента корреляции нулю. Проинтерпретируйте полученные результаты." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 9 (2 балла)\n", "\n", "Вычислите коэффициент корреляции Спирмена для ожидаемой продолжительности жизни (`life_expect`) и процентом населения, имеющим доступ к чистой воде (`basic_water`). Приняв уровень значимости равным 5% (уровень доверия 95%), проверьте гипотезу о независимости показателей. Проинтерпретируйте полученные результаты." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задание 10 (4 балла)\n", "\n", "Добавьте в датафрейм столбец `overweight` со значениями 0 и 1, где 1 соответствует странам со средним значением индекса масса тела жителей выше 25 (понятно, что значения усреднены для всего населения, но для отдельных людей такие значения выходят за рамки нормы). \n", "\n", "Проверьте, используя подходящий статистический критерий, можно ли считать, что средняя ожидаемая продолжительность жизни отличается в странах с высоким индексом массы тела у населения и странах с нормальным индексом массы тела у населения. Проинтерпретируйте полученные результаты, приняв уровень значимости 5% (уровень доверия 95%)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }