
Лабораторная работа №1 Предварительный анализ данных
Цель работы: осуществить предварительную обработку данных csv-файла, выявить и устранить проблемы в этих данных.
Краткий теоретический материал
Подготовка данных для анализа называется предобработкой. Аналитик ищет проблемы в данных, оценивает их масштаб и пробует устранить.
Сложности с данными бывают двух видов:
•данные содержат мусор;
•данные корректны, но представлены в такой форме, что малопригодны для анализа.
Принцип GIGO означает буквально «мусор на входе — мусор на выходе (от англ. garbage in — garbage out,»), то есть данные должны быть обработаны.
Какие ошибки могут быть:
-некорректные названия столбцов
-дубликаты в данных
-скрытые повторы (например, одна и та же категория может быть записана по-разному – Фильм или movie, либо семья и СЕМЬЯ).
-пропуски значений
-аномалии (данные, которые не отражают действительность), например отрицательный возраст
-несоответствие типов данных действительности
-и другие.
Некорректные имена столбцов могут содержать:
-Пробелы в названиях (Как и в именах переменных, названия столбцов лучше писать без пробелов, в «змеином_регистре»)
-В названиях используют разные языки (буквы легко спутать)
-Слишком непонятные названия столбцов, которые не отражают суть столбца.
Для переименования столбцов вызывают метод датафреймов rename().
Унего один параметр columns — это словарь, в котором
•ключи — названия столбцов, которые вы хотите заменить (старые названия столбцов);
•значения — новые названия столбцов.
Переименовать можно как все столбцы датафрейма, так и только отдельные:
df = df.rename(columns={'Название1 ': 'col1', 'MIN': 'min_distance', 'MAX': 'max_distance'})
Дубликаты в данных Поиск явных дубликатов
Метод duplicated() ищет дубликаты. По умолчанию он признаёт дубликатами те строки, которые полностью повторяют уже встречавшиеся в датасете. Метод возвращает Series со значением True для таких строк.
print(df.duplicated().sum())
Чтобы избавиться от таких дубликатов, вызовем метод drop_duplicates():
df = df.drop_duplicates()
После удаления строчек лучше обновить индексацию: чтобы в ней не осталось пропусков. Для этого вызовем метод reset_index(). Он создаст новый датафрейм, где:
• |
индексы исходного датафрейма станут новой колонкой с |
|
названием index; |
• |
все строки получат обычные индексы, уже без пропусков. |
|
df = df.drop_duplicates().reset_index() |
Поиск неявных дубликатов
Неявные дубликаты можно найти методом unique(). Он возвращает
перечень уникальных значений в столбце: print(df[col1].unique())
Среди уникальных значений ищут неявные дубликаты:
•альтернативные написания одного и того же значения.
•ошибочные написания.
Удаление неявных дубликатов
Неправильные и альтернативные написания значений исправляют методом replace(). В первом аргументе ему передают нежелательное значение из таблицы. Во втором — новое значение, которое должно заменить дубликат:
df['col1'] = df['col1'].replace('футбо', 'футбол')
Поиск пропущенных значений
Специальный метод isna() найдёт все пропуски в таблице. Если значение отсутствует, он вернёт True, иначе — False.
Чтобы посчитать пропуски, результат работы isna() передадим методу sum():
print(df.isna().sum())
Обработка пропусков
В зависимости от целей исследования с пропусками можно обойтись поразному:
•Строки таблицы удаляют полностью, если они потеряли смысл из-за пропущенных значений. Иногда приходится признать, что часть данных бесполезна из-за пропусков — тогда от таких строк остаётся только избавиться.
•Иногда пропуски заполняют другими значениями. Это допустимо,
когда пропущенные значения неважны для целей исследования, но в тех же строках или столбцах остаются ценные данные.
Чтобы не лишиться строк с важными данными, заполним значения NaN в столбце imported_cases нулями.
Для этого вызывают специальный метод fillna(). Он вернёт копию исходного столбца, заменяя все NaN на значение из аргумента:
df['imported_cases'] = df['imported_cases'].fillna(0)
Метод dropna() удаляет строку или колонку, в которой встречается NaN (хотя бы один пропуск). Его поведением управляют два параметра:
•axis — ось, по которой будет ориентироваться метод. Если передать параметру значение 'columns', метод удалит столбцы, в которых встречается NaN. Если не указывать этот аргумент, метод удалит строки, в которых встречается NaN.
•subset — список с названиями столбцов, в которых метод должен искать NaN.
#удаление строк, в которых в столбцах total_cases, deaths или case_fatality_rate встречается NaN
df = df.dropna(subset=['total_cases', 'deaths', 'case_fatality_rate'])
# удаление столбцов, в которых в столбцах total_cases, deaths или case_fatality_rate встречается NaN
df = df.dropna(subset=['total_cases', 'deaths', 'case_fatality_rate'], axis='columns')
Категориальные и количественные переменные
Способ работы с пропущенными значениями зависит от их типа. В датафрейме pandas могут содержаться категориальные или количественные данные:
•Категориальная переменная принимает одно значение из ограниченного набора.
•Количественная — любое числовое значение в диапазоне.
ВPandas есть стандартный метод Pandas — to_numeric(), который превращает значения столбца в числовой тип float64 (вещественное число).
df['amount'] = pd.to_numeric(df['amount'])
У |
метода to_numeric() есть |
параметр errors. |
От |
значений, |
|||
принимаемых errors, |
зависят |
действия to_numeric при |
|
встрече |
с |
||
некорректным значением: |
|
|
|
|
|
•`errors='raise' — дефолтное поведение: при встрече с некорректным значением выдаётся ошибка, операция перевода в числа прерывается;
•`errors='coerce' — некорректные значения принудительно заменяются на
NaN;
•`errors='ignore' — некорректные значения игнорируются, но остаются.
df['amount'] = pd.to_numeric(df['amount'], errors='coerce')
Методом to_numeric() мы не только превратим строки в числовой тип там, где это возможно, но и выясним, на каких значениях метод не работает.
Особенность метода to_numeric() в том, что при переводе все числа будут иметь тип данных float. Это подходит далеко не всем значениям.
В нужный тип значения переводят методом astype(). Например, аргумент ('int') метода astype() означает, что значение нужно перевести в целое число:
Методы Pandas для работы с датой и временем
Вне зависимости от способа записи, дату и время нужно вводить в
арифметические операции. Для этого в Python существует особый тип данных
— datetime.
Методом to_datetime() превратим содержимое этого столбца в понятные для Python даты.
Для этого строку форматируют, обращаясь к специальной системе обозначений, где:
•%d — день месяца (от 01 до 31)
•%m — номер месяца (от 01 до 12)
•%Y — четырёхзначный номер года (например, 2019)
•Z — стандартный разделитель даты и времени
•%H — номер часа в 24-часовом формате
•%I — номер часа в 12-часовом формате
•%M — минуты (от 00 до 59)
•%S — секунды (от 00 до 59)
Преобразуем формат даты 01.04.2019Z11:03:00 из первой строчки
датафрейма:
1.Сначала номер дня месяца. В соответствии с таблицей форматов заменяем его на %d: %d.04.2019Z11:03:00
2. |
Далее |
точка (ее оставляем без |
изменений), потом |
номер |
|
месяца: %m: %d.%m.2019Z11:03:00 |
|
|
|
3. |
После |
четырёхзначный номер |
года, заменяем |
2019 |
|
на %Y: %d.%m.%YZ11:03:00 |
|
|
4.Букву Z оставляем без изменений: %d.%m.%YZ11:03:00
5.Номер часа в 24-часовом формате заменим на %H: %d.%m.%YZ%H:03:00
6.Количество минут обозначим %M: %d.%m.%YZ%H:%M:00
7. |
Завершим |
форматирование |
обозначением |
секунд %S: |
|
|
%d.%m.%YZ%H:%M:%S |
|
|
|
|
Вот |
такое |
выражение '%d.%m.%YZ%H:%M:%S' передают |
в |
||
аргумент format метода to_datetime() при |
переводе строковых |
значений |
|||
столбца 'date' в формат datetime: |
|
|
|
df['date_datetime'] = pd.to_datetime( df['date'], format='%d.%m.%YZ%H:%M:%S'
)
Группировка данных
Часто анализ данных начинают с разделения их на группы по какомунибудь признаку. Эта операция называется группировкой данных.
Вpandas данные группируют методом groupby(), который:
•Принимает в качестве аргумента название столбца, по которому нужно группировать. Например, год.
•Возвращает объект особого типа — DataFrameGroupBy. Это сгруппированные данные. Если применить к ним какой-нибудь метод pandas, они станут новой структурой данных типа DataFrame или Series.
Можно применить метод count или sum.
Сортировка данных |
|
|
|
||
В |
pandas |
для |
этого |
есть |
метод sort_values(). |
У sort_values() для датафрейма два параметра:
•by='имя столбца' — имя столбца, по которому нужно сортировать;
• ascending — порядок сортировки. По умолчанию для него установлено значение True. Для сортировки по убыванию установите значение False.
Сводные таблицы
Сводная таблица — ваш помощник для обобщения данных и их наглядного представления.
В Pandas для подготовки сводных таблиц вызывают метод pivot_table().
Аргументы метода:
•index — столбец или столбцы, по которым группируют данные (название товара)
•columns — столбец, по значениям которого происходит группировка (даты)
•values — значения, по которым мы хотим увидеть сводную таблицу (количество проданного товара)
•aggfunc — функция, применяемая к значениям (сумма товаров)
data_pivot = data_final.pivot_table(index=['category_name', 'subcategory_name'], columns='source', values='visits', aggfunc='sum')
Порядок выполнения
1.Получить у преподавателя набор данных для проведения анализа согласно цели выполняемой работы.
2.Загрузить датасет с помощью библиотеки pandas в Jupyter-ноутбуке .
3.Вывести первые 20 строк с помощью head.
4.Выполнить обзор данных – опишите колонки и вашу предметную область.
5.С помощью метода .info оцените данные. Этот метод возвращает
название столбцов, типы данных, количество ненулевых объектов каждом столбце.
6.Выведите на экран названия столбцов с помощью df.columns. Выявите проблемы с названиями, если они есть и устраните есть.
Дайте пояснения даже если проблемы не обнаружены, укажите, что вы проверили, что увидели в данных
7.Выявите пропуски и устраните их. Обязательно дайте пояснения.
8.Проверьте данные на наличие дубликатов, если они есть – удалите их. Обязательно дайте пояснения.
9.Проверьте все ли типы данных соответствуют действительности. При необходимости измените типы.
10.Придумайте, какие сводные таблицы можно создать по вашим данным и создайте сводную таблицу с помощью pivot_table.
11.Сделайте еще две группировки с помощью group_by или
pivot_table.
12.Сделайте выводе по проделанной работе.
Содержание отчета
1.Титульный лист
2.Цель работы
3.Вариант задания с кратким описанием набора данных
4.Пояснения и скриншоты по каждому пункту выполнения лабораторной работы
5.Ссылка на ваш Jupyter-ноутбук
6.Расширенный вывод по вашему исследованию
Варианты:
Варианты распределяем по списку. Лучше всего попросить старосту сформировать список с группой и вашим вариантом.
Указание варианта в отчете обязательно!
1 |
1auto.csv |
Этот набор данных содержит информацию о |
|
|
|
подержанных автомобилях. |
|
|
|
1. |
имя |
|
|
2. |
год |
|
|
3. |
цена продажи |
|
|
4. |
km_пройдено |
|
|
5. |
топливо |
|
|
6. |
продавец_тип |
|
|
7. |
коробка передач |
|
|
8. |
Владелец |
|
|
Группировки, которые можно сделать: |
|
|
|
|
- Средняя стоимость по типу продавца |
|
|
|
- Стоимость по годам и тд |
2 |
2salary.csv |
Содержит информацию о зарплатах. |
|
|
|
1. |
Год выплаты зп |
|
|
2. |
Уровень работы (EN Entry-level / Junior MI Mid- |
|
|
|
level / Intermediate SE Senior-level / Expert EX |
|
|
|
Executive-level / Director) |
|
|
3. |
Тип работы (PT Part-time FT Full-time CT |
|
|
|
Contract FL Freelance) |
|
|
4. |
Должность |
|
|
5. |
Зарплата за год |
|
|
6. |
Валюта зарплаты |
|
|
7. |
Зарплата в USD |
|
|
8. |
Страна проживания |
|
|
9. |
Общий объем удаленной работы, возможные |
|
|
|
значения: 0 Нет удаленной работы (менее 20%) |
|
|
|
50 Частично удаленная работа 100 Полностью |
|
|
|
удаленная работа (более 80%) |
|
|
10.Страна главного офиса |

11.Среднее кол-во людей, которые работали в компании в течение года (S менее 50 сотрудников (малая) M от 50 до 250 сотрудников (средняя) L более 250 сотрудников (крупная))
Группировки, которые можно сделать:
-Средняя зп по профессиям
-Средняя зп по уровню опыта и тд
3 |
3heart.csv |
Содержит информацию о сердечных болезнях. |
|
|||
|
|
1. |
возраст |
|
|
|
|
|
2. |
пол |
|
|
|
|
|
3. |
тип боли в груди (4 значения [TA: типичная |
|||
|
|
|
стенокардия, ATA: атипичная стенокардия, |
|||
|
|
|
NAP: |
неангинальная |
боль, |
ASY: |
|
|
|
бессимптомная]) |
|
|
|
|
|
4. |
артериальное давление в покое |
|
|
|
|
|
5. |
холестерин сыворотки в мг/дл |
|
|
|
|
|
6. |
уровень сахара в крови натощак > 120 мг/дл |
|||
|
|
7. |
ЭКГ в покое: результаты электрокардиограммы |
|||
|
|
|
в покое норма: нормальная, ST: аномалия ST-T |
|||
|
|
|
LVN: гипертрофия |
|
|
|
|
|
8. |
MaxHR: максимальная достигнутая частота |
|||
|
|
|
сердечных сокращений [Числовое значение от |
|||
|
|
|
60 до 202] |
|
|
|
|
|
9. |
стенокардия, вызванная физической нагрузкой |
|||
|
|
|
(да, нет) |
|
|
|
|
|
10. oldpeak = депрессия ST, вызванная физической |
||||
|
|
|
нагрузкой, по сравнению с состоянием покоя |
11.наклон пикового сегмента ST при нагрузке (Вверх: восходящий, Плоский: плоский, Вниз: нисходящий)
12. HeartDisease: выходной класс [1: болезнь сердца, 0: нормальный]
|
|
Группировки, которые можно сделать: |
|
|
|
|
- Среднее давление для каждого пола |
|
|
|
- Для каждого типа боли средний холестерин и |
|
|
|
тд |
4 |
4liver.csv |
Датасет заболеваемости печенью. |
|
|
|
Столбцы: |
|
|
|
1. |
Возраст пациента |
|
|
2. |
Пол пациента |
|
|
3. |
Общий билирубин |
|
|
4. |
Прямой билирубин |
|
|
5. |
Щелочная фосфатаза |
|
|
6. |
Аламиноаминотрансфераза |
|
|
||
|
|
7. |
Аспартатаминотрансфераза |
|
|
||
|
|
8. |
Всего белков |
|
|
|
|
|
|
9. |
Альбумин |
|
|
|
|
|
|
10.Соотношение альбуминов и глобулинов |
|
||||
|
|
11.Цель: |
поле, |
используемое |
для разделения |
||
|
|
|
данных на два набора (пациент с заболеванием |
||||
|
|
|
печени или без заболевания). |
|
|
||
|
|
Группировки, которые можно сделать: |
|
||||
|
|
|
- Средний билирубин для каждого пола |
|
|||
|
|
|
- Средний показатель для двух групп (тех, кто |
||||
|
|
|
болеет и тот, кто не болеет) и тд |
|
|||
|
|
|
|
|
|||
5 |
5music.csv |
Содержит |
информацию о прослушанных |
треках |
|||
|
|
пользователя: |
|
|
|
||
|
|
1. |
идентификатор пользователя; |
|
|
||
|
|
2. |
название трека; |
|
|
|
|
|
|
3. |
имя исполнителя; |
|
|
||
|
|
4. |
название жанра; |
|
|
||
|
|
5. |
город пользователя; |
|
|
||
|
|
6. |
время начала прослушивания; |
|
|
||
|
|
7. |
день недели. |
|
|
|
|
|
|
Группировки, которые можно сделать: |
|
||||
|
|
|
- количество прослушиваний каждого жанра |
||||
|
|
|
- Количество прослушиваний по дням недели |
||||
|
|
|
или городу |
|
|
|
|
|
|
|
|
|
|||
6 |
6games.csv |
Содержит данные о продаже игр. |
|
|
|||
|
|
1. |
Название игры |
|
|
|
|
|
|
2. |
Платформа |
|
|
|
|
|
|
3. |
Год выпуска |
|
|
|
|
|
|
4. |
Жанр |
|
|
|
|
|
|
5. |
Продажи в NA |
|
|
|
|
|
|
6. |
Продажи в EU |
|
|
|
|
|
|
7. |
Продажи в JP |
|
|
|
|
|
|
8. |
Другие продажи |
|
|
||
|
|
9. |
Оценка критиков |
|
|
||
|
|
10.Пользовательская оценка |
|
|
|||
|
|
11.Рейтинг |
|
|
|
||
|
|
Группировки, которые можно сделать: |
|
||||
|
|
|
- количество продаж по платформе/году/стране |
||||
|
|
|
- средний |
рейтинг |
критиков |
для |
|
|
|
|
жанра/платформы и тд |
|
|
||
|
|
|
|
|
|
|
|
7 |
7drivers.csv |
Набор данных о поездках в такси: |
|
|
|
|||
|
|
|
1. |
Дата начала |
|
|
|
|
|
|
|
2. |
Дата окончания |
|
|
|
|
|
|
|
3. |
Категория |
|
|
|
|
|
|
|
4. |
Место начала |
|
|
|
|
|
|
|
5. |
Место окончания |
|
|
|
|
|
|
|
6. |
Пройденные мили |
|
|
|
|
|
|
|
7. |
Цель поездки |
|
|
|
|
|
|
Группировки, которые можно сделать: |
|
|
||||
|
|
|
- количество поездок по категориям |
|
||||
|
|
|
- среднее количество миль по целям и тд |
|
||||
|
|
|
|
|
|
|||
8 |
8credit.csv |
Информация о заемщиках: |
|
|
|
|||
|
|
|
1. |
количество детей в семье |
|
|
|
|
|
|
|
2. |
общий трудовой стаж в днях |
|
|
||
|
|
|
3. |
возраст клиента в годах |
|
|
|
|
|
|
|
4. |
уровень образования клиента |
|
|
||
|
|
|
5. |
идентификатор уровня образования |
|
|||
|
|
|
6. |
семейное положение |
|
|
|
|
|
|
|
7. |
идентификатор семейного положения |
|
|||
|
|
|
8. |
пол клиента |
|
|
|
|
|
|
|
9. |
тип занятости |
|
|
|
|
|
|
|
10.имел ли задолженность по возврату кредитов |
|||||
|
|
|
11.ежемесячный доход |
|
|
|
||
|
|
|
12.цель получения кредита |
|
|
|
||
|
|
Группировки, которые можно сделать: |
|
|
||||
|
|
|
- |
средний |
доход |
по |
семейному |
|
|
|
|
|
положению/категории |
|
|
|
|
|
|
|
- средний стаж в зависимости от категории и тд |
|||||
|
|
|
|
|||||
9 |
9visits.csv |
Данные пользовательских сессии магазина. |
|
|||||
|
|
1. |
уникальный идентификатор пользователя |
|
||||
|
|
2. |
страна пользователя |
|
|
|
||
|
|
3. |
категория устройства пользователя |
|
|
|||
|
|
4. |
идентификатор |
рекламного источника, |
из |
|||
|
|
|
которого пришел пользователь |
|
|
|||
|
|
5. |
дата и время начала сессии |
|
|
|
||
|
|
6. |
дата и время окончания сессии |
|
|
|||
|
|
Группировки, которые можно сделать: |
|
|
||||
|
|
|
- |
количество визитов по устройствам/каналам |
||||
|
|
|
|
привлечения |
|
|
|
|
|
|
|
- среднее продолжительность |
сессий |
для |
|||
|
|
|
|
каждого устройства и тд |
|
|
|
|
|
|
|
|
|
|
|
|
|