Вот и началось познание курса "Предобработка данных"
В курсе 8 тем рассчитанных на 35 часов. Посмотрел, тем мало, а часов даже больше, чем в предыдущей теме. Дал себе установку что справлюсь и погнал учиться, выделения на занятия часа по три в день а иногда и больше. В запланированное время не уложился, так как при выполнении контрольного проекта пытался изобрести велосипед, а от нас требовалось сделать только поверхностные выводы. Сдавал проект на проверку три раза, при этом пытался поспорить с проверяющим ("ревьюером"), у которого, видимо, есть указание от вышестоящего руководства, что решение и выводы не должны отличаться от средне-стандартных. Но есть в этом и плюс: приобрел неоценимый опыт, в корректировке неверных решений, и согласовании его с проверяющим. Код проектной работы выложу в данном посте, а темы будут отдельно.
Курс в своем составе содержал следующие темы:
1. ПД. Введение..
3. ПД. Изменение типов данных.
6. ПД. Системное и критическое мышление в работе аналитика.
7. ПД. Проектная работа. Исследование надёжности заёмщиков.
Вернуться в раздел: Я.Практикум
Дорогой друг!
Я внимательно наблюдал за твоими действиями на сайте через вебвизор.
Если ты добрался до этой страницы, то скорее всего ты проходишь платное обучение на курсах.
Благодаря моим стараниям, целую главу ты можешь закрыть за сутки, а то и быстрее.
Думаю, что сэкономленное время, ты потратил с пользой, в то время как я сидел и пыхтел над заданиями.
Лучшая благодарность от тебя, это пожертвования на мой IT - проект.
Жертвуй столько, сколько не жалко, но и не скупись, чтобы было не стыдно.
Большое тебе спасибо, за твою благодарность!
Исследование надежности заемщиков
Это первая часть проекта, она будет проверена автоматически. Вторую часть проверит ревьюер.
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.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%)
Вот пожалуй и всё в этой теме.
Ячейки с кодом можете скопировать и запустить в Jupyter Notebook
Вернуться в раздел: Я.Практикум
Следующая тема: "Исследовательский анализ данных"