Если ты совсем торопишься, то можешь скачать проект в формате .ipynb:
1.Проектная работа
Что такое проект
Поздравляем! Вы прошли курс в тренажёре. Самое время проверить полученные знания на практике и решить аналитический кейс. Выполнять проект вы будете самостоятельно. С подробным описанием проекта мы вас познакомим, а сначала расскажем об особенностях проверки.
Как будут проверять проект
Это проект с полуавтоматической проверкой. Он состоит из двух частей: первая часть будет проверена автоматически в Jupyter-тренажёре, а вторую проверит ревьюер.
Проверка первой части проекта
Эта часть работы будет автоматически проверена в Jupyter-тренажёре. Задания предполагают один вариант решения — его и проверит тренажёр.
Проверка второй части проекта
Вашу работу проверит ревьюер — опытный аналитик. Он поможет улучшить проект.
Для этого ревьюер оценит:
- результаты каждого задания,
- соблюдение правил синтаксиса Python,
- стиль кода. В течение суток ревьюер вернётся с обратной связью. Например, предложит упростить сложную конструкцию в коде. Тогда вы сможете доработать проект и отправить ревьюеру обновлённый вариант.
Проект будет завершён, когда вы выполните все задания и обработаете комментарии ревьюера.
Описание проекта
Заказчик — кредитный отдел банка. Нужно разобраться, влияет ли семейное положение и количество детей клиента на факт погашения кредита в срок. Входные данные от банка — статистика о платёжеспособности клиентов.
Результаты исследования будут учтены при построении модели кредитного скоринга — специальной системы, которая оценивает способность потенциального заёмщика вернуть кредит банку.
Описание данных
children
— количество детей в семье
days_employed
— общий трудовой стаж в днях
dob_years
— возраст клиента в годах
education
— уровень образования клиента
education_id
— идентификатор уровня образования
family_status
— семейное положение
family_status_id
— идентификатор семейного положения
gender
— пол клиента
income_type
— тип занятости
debt
— имел ли задолженность по возврату кредитов
total_income
— ежемесячный доход
purpose
— цель получения кредита
Что важно учесть
На что нужно обратить внимание:
- Как вы описываете найденные в данных проблемы?
- Какие методы замены типов данных, обработки пропусков и дубликатов применяете?
- Категоризируете ли данные?
- Соблюдаете ли структуру проекта и поддерживаете аккуратность кода?
- Какие выводы делаете?
- Оставляете ли комментарии к шагам?
Держите под рукой шпаргалки и конспекты прошлых уроков.
Успехов!
2.Проект: Предобработка данных. Первая часть
Это первая часть проекта, она будет проверена автоматически. Вторую часть проверит ревьюер.
Исследование надежности заемщиков
1 Откройте таблицу и изучите общую информацию о данных
Задание 1. Импортируйте библиотеку pandas. Считайте данные из csv-файла в датафрейм и сохраните в переменную data
. Путь к файлу:
/datasets/data.csv
# импортируйте библиотеку pandas
import pandas as pd
# прочитайте csv-файл
try:
data = pd.read_csv('/datasets/data.csv')
except:
data = pd.read_csv('https://code.s3.yandex.net/datasets/data.csv')
Задание 2. Выведите первые 20 строчек датафрейма data
на экран.
# ваш код здесь
data.head(20)
Задание 3. Выведите основную информацию о датафрейме с помощью метода info()
.
# ваш код здесь
data.info()
2 Предобработка данных
2.1 Удаление пропусков
Задание 4. Выведите количество пропущенных значений для каждого столбца. Используйте комбинацию двух методов.
# ваш код здесь
data.isna().sum()
Задание 5. В двух столбцах есть пропущенные значения. Один из них — days_employed
. Пропуски в этом столбце вы обработаете на следующем этапе. Другой столбец с пропущенными значениями — total_income
— хранит данные о доходах. На сумму дохода сильнее всего влияет тип занятости, поэтому заполнить пропуски в этом столбце нужно медианным значением по каждому типу из столбца income_type
. Например, у человека с типом занятости сотрудник
пропуск в столбце total_income
должен быть заполнен медианным доходом среди всех записей с тем же типом.
# ваш код здесь
['total_income'].transform('median')), inplace=False)
for t in data['income_type'].unique():
data.loc[(data['income_type'] == t) & (data['total_income'].isna()), 'total_income'] = \
data.loc[(data['income_type'] == t), 'total_income'].median()
2.2 Обработка аномальных значений
Задание 6. В данных могут встречаться артефакты (аномалии) — значения, которые не отражают действительность и появились по какой-то ошибке. Таким артефактом будет отрицательное количество дней трудового стажа в столбце days_employed
. Для реальных данных это нормально. Обработайте значения в этом столбце: замените все отрицательные значения положительными с помощью метода abs()
.
# ваш код здесь
data['days_employed'] = data['days_employed'].abs()
Задание 7. Для каждого типа занятости выведите медианное значение трудового стажа days_employed
в днях.
# ваш код здесь
data.groupby('income_type')['days_employed'].agg('median')
Задание 8. Выведите перечень уникальных значений столбца children
.
# ваш код здесь
data['children'].unique()
Задание 9. В столбце children
есть два аномальных значения. Удалите строки, в которых встречаются такие аномальные значения из датафрейма data
.
# ваш код здесь
data = data[(data['children'] != -1) & (data['children'] != 20)]
Задание 10. Ещё раз выведите перечень уникальных значений столбца children
, чтобы убедиться, что артефакты удалены.
# ваш код здесь
data['children'].unique()
2.3 Удаление пропусков (продолжение)
Задание 11. Заполните пропуски в столбце days_employed
медианными значениями по каждому типу занятости income_type
.
# ваш код здесь
for t in data['income_type'].unique():
data.loc[(data['income_type'] == t) & (data['days_employed'].isna()), 'days_employed'] = \
data.loc[(data['income_type'] == t), 'days_employed'].median()
Задание 12. Убедитесь, что все пропуски заполнены. Проверьте себя и ещё раз выведите количество пропущенных значений для каждого столбца с помощью двух методов.
# ваш код здесь
data.isna().sum()
2.4 Изменение типов данных
Задание 13. Замените вещественный тип данных в столбце total_income
на целочисленный с помощью метода astype()
.
# ваш код здесь
data['total_income'] = data['total_income'].astype(int)
2.5 Обработка дубликатов
Задание 14. Обработайте неявные дубликаты в столбце education
. В этом столбце есть одни и те же значения, но записанные по-разному: с использованием заглавных и строчных букв. Приведите их к нижнему регистру.
# ваш код здесь
data['education'] = data['education'].str.lower()
Задание 15. Выведите на экран количество строк-дубликатов в данных. Если такие строки присутствуют, удалите их.
# посчитайте дубликаты
data.duplicated().sum()
2.6 Категоризация данных
Задание 16. На основании диапазонов, указанных ниже, создайте в датафрейме data
столбец total_income_category
с категориями:
- 0–30000 —
'E'
;
- 30001–50000 —
'D'
;
- 50001–200000 —
'C'
;
- 200001–1000000 —
'B'
;
- 1000001 и выше —
'A'
.
Например, кредитополучателю с доходом 25000 нужно назначить категорию 'E'
, а клиенту, получающему 235000, — 'B'
. Используйте собственную функцию с именем categorize_income()
и метод apply()
.
# создайте функцию categorize_income()
def categorize_income(income):
try:
if 0 <= income <= 30000:
return 'E'
elif 30001 <= income <= 50000:
return 'D'
elif 50001 <= income <= 200000:
return 'C'
elif 200001 <= income <= 1000000:
return 'B'
elif income >= 1000001:
return 'A'
except:
pass
# примените функцию методом apply()
data['total_income_category'] = data['total_income'].apply(categorize_income)
Задание 17. Выведите на экран перечень уникальных целей взятия кредита из столбца purpose
.
# ваш код здесь
data['purpose'].unique()
Задание 18. Создайте функцию, которая на основании данных из столбца purpose
сформирует новый столбец purpose_category
, в который войдут следующие категории:
'операции с автомобилем'
,
'операции с недвижимостью'
,
'проведение свадьбы'
,
'получение образования'
.
Например, если в столбце purpose
находится подстрока 'на покупку автомобиля'
, то в столбце purpose_category
должна появиться строка 'операции с автомобилем'
.
Используйте собственную функцию с именем categorize_purpose()
и метод apply()
. Изучите данные в столбце purpose
и определите, какие подстроки помогут вам правильно определить категорию.
# создайте функцию categorize_purpose()
def categorize_purpose(row):
try:
if 'автом' in row:
return 'операции с автомобилем'
elif 'жил' in row or 'недвиж' in row:
return 'операции с недвижимостью'
elif 'свад' in row:
return 'проведение свадьбы'
elif 'образов' in row:
return 'получение образования'
except:
return 'нет категории'
# примените функцию методом apply()
data['purpose_category'] = data['purpose'].apply(categorize_purpose)
3.Проект: Предобработка данных. Вторая часть
Эта часть работы (шаги 3 и 4) будет проверена вручную ревьюером. Вы можете выполнять любые вычисления и строить визуализации, которые помогут вам ответить на вопросы и сделать выводы.
В шаблоне вы увидите авторское решение первой части проекта (шаги 1 и 2). Сравните его со своим кодом.
Перед тем как приступить к решению второй части проекта, не забудьте выполнить все ячейки с кодом из шагов 1 и 2, чтобы загрузить все нужные данные.
💡 Если вашу работу отправили на доработку, пожалуйста, не удаляйте в Jupyter-тетрадке комментарии ревьюера. Так ревьюеру будет проще проверить изменения.
Вторая часть
Шаг 3. Исследуйте данные и ответьте на вопросы
Ответы на вопросы можно разместить в ячейках тетрадок Jupyter Notebook с типом markdown
.
- Задание 19. Есть ли зависимость между количеством детей и возвратом кредита в срок?
- Задание 20. Есть ли зависимость между семейным положением и возвратом кредита в срок?
- Задание 21. Есть ли зависимость между уровнем дохода и возвратом кредита в срок?
- Задание 22. Как разные цели кредита влияют на его возврат в срок?
- Задание 23. Приведите возможные причины появления пропусков в исходных данных.
- Задание 24. Объясните, почему заполнить пропуски медианным значением — лучшее решение для количественных переменных.
Ответы сопроводите интерпретацией — поясните, о чём именно говорит полученный вами результат.
Шаг 4. Напишите общий вывод
Оформление: Задание выполните в Jupyter Notebook. Программный код заполните в ячейках типа code
, текстовые пояснения — в ячейках типа markdown
. Примените форматирование и заголовки.
3.1 Есть ли зависимость между количеством детей и возвратом кредита в срок?
# Определим функцию
def my_mean(x):
return '{:.2%} '.format(x.mean())
# Вызовем функцию
data.groupby('children')['debt'].agg(['count', my_mean])
**Вывод:**
На вопрос:
Есть ли зависимость между количеством детей и возвратом кредита в срок?
Можно сделать следующий ответ:
Больше всего бросаются в глаза бездетные, у которых дела обстоят лучше всего. Нет детей - меньше непредвиденных расходов. А вот о группе с 5 детьми, рано делать вывод, ведь там всего 9 клиентов взявших кредит, выборка мала.
3.2 Есть ли зависимость между семейным положением и возвратом кредита в срок?
data.groupby(['family_status','family_status_id'])['debt'].agg(['count', my_mean]).sort_values('family_status_id')
Вывод:
На вопрос:
Есть ли зависимость между семейным положением и возвратом кредита в срок?
Можно сделать следующий ответ:
Да зависимость есть: семейное положение влияет на возврат кредита в срок:
-
Заёмщики, со статусом: "Не женат / не замужем", имеют задолженность по возврату кредитов 9,76 % (больше всех).
-
Заёмщики, со статусом: "вдовец / вдова", имеют задолженность по возврату кредитов 6,62 % (меньше всех).
- Овдовевшие это, как правило, возрастные люди, а они более ответственные. Да и скорее всего у них уже есть взрослые дети, которые могут помогать с выплатами. В целом, можно сказать так: самые безответственные те, кто никогда не был в браке.
3.3 Есть ли зависимость между уровнем дохода и возвратом кредита в срок?
data.groupby(['total_income_category'])['debt'].agg(['count', my_mean]).sort_values('my_mean')
Вывод:
Не прослеживается явная зависимость между уровнем дохода и возвратом кредита в срок, поскольку размеры групп не позволяют нам сделать корректный вывод.
3.4 Как разные цели кредита влияют на его возврат в срок?
data.groupby(['purpose_category'])['debt'].agg(['count', my_mean]).sort_values('my_mean')
Вывод:
На вопрос:
Как разные цели кредита влияют на его возврат в срок?
Можно сделать следующий ответ:
- Клиенты оформившие кредит на операции с недвижимостью, лучше всех возвращают кредит (7,26% невозврата кредита в срок)
- Клиенты оформившие кредит на операции с автомобилем, самые безответственные клиенты (9,35% невозврата кредита в срок)
- Между ними находятся: те кто брал кредит на проведение свадьбы (7,91%) и получение образования (9,25%)
3.5 Приведите возможные причины появления пропусков в исходных данных.
Скорее всего, пропуски возникли случайно, иначе эти люди не получили бы кредит. Если, конечно, нельзя взять кредит на недвижимость без указания этой информации.
3.6 Объясните, почему заполнить пропуски медианным значением — лучшее решение для количественных переменных.
Медиана не так чувствительна к выборосам, по сравнению со средним, например. Получается, мы всегда можем брать медиану (кроме тех случаев, когда нужно именно среднее). Если выборка смещена, то мы не ошибемся, а если распределение нормальное, где среднее очень близко к медиане, то тоже не ошибемся. Только тут важно понимать, что не стоит проводить заполнение пропусков, взятой медианой по всему столбцу, потому что это тоже искажение данных.
Шаг 4: Общий вывод.
В ходе исследования надёжности заемщиков были изучены полученные данные, обработаны и заполнены пропуски, удалены дубликаты и клиенты были объединены в группы по разным параметрам. По итогам проделанной работы по поставленным вопросам можно сделать следующие выводы:
Есть ли зависимость между количеством детей и возвратом кредита в срок?
Больше всего бросаются в глаза бездетные, у которых дела обстоят лучше всего. Нет детей - меньше непредвиденных расходов. А вот о группе с 5 детьми, рано делать вывод, ведь там всего 9 клиентов взявших кредит, выборка мала.
Есть ли зависимость между семейным положением и возвратом кредита в срок?
Да зависимость есть: семейное положение влияет на возврат кредита в срок:
Заёмщики, со статусом: "Не женат / не замужем", имеют задолженность по возврату кредитов 9,76 % (больше всех). Заёмщики, со статусом: "вдовец / вдова", имеют задолженность по возврату кредитов 6,62 % (меньше всех). Овдовевшие это, как правило, возрастные люди, а они более ответственные. Да и скорее всего у них уже есть взрослые дети, которые могут помогать с выплатами. В целом, можно сказать так: самые безответственные те, кто никогда не был в браке.
Есть ли зависимость между уровнем дохода и возвратом кредита в срок?
Не прослеживается явная зависимость между уровнем дохода и возвратом кредита в срок, поскольку размеры групп не позволяют нам сделать корректный вывод.
Как разные цели кредита влияют на его возврат в срок?
Клиенты оформившие кредит на операции с недвижимостью, лучше всех возвращают кредит (7,26% невозврата кредита в срок)
Клиенты оформившие кредит на операции с автомобилем, самые безответственные клиенты (9,35% невозврата кредита в срок)
Между ними находятся: те кто брал кредит на проведение свадьбы (7,91%) и получение образования (9,25%)
Дорогой друг!
Я внимательно наблюдал за твоими действиями на сайте через вебвизор.
Если ты добрался до этой страницы, то скорее всего ты проходишь платное обучение на курсах.
Благодаря моим стараниям, целую главу ты можешь закрыть за сутки, а то и быстрее.
Думаю, что сэкономленное время, ты потратил с пользой, в то время как я сидел и пыхтел над заданиями.
Лучшая благодарность от тебя, это пожертвования на мой IT - проект.
Жертвуй столько, сколько не жалко, но и не скупись, чтобы было не стыдно.
Большое тебе спасибо, за твою благодарность!
Следующая тема: ПД. Заключение.
Вернуться к разделу: "Предобработка данных"
Вернуться в оглавление: Я.Практикум