Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР / ЛР1 / Лабораторная работа 1

.pdf
Скачиваний:
14
Добавлен:
25.06.2023
Размер:
329.13 Кб
Скачать

Лабораторная работа №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.

дата и время окончания сессии

 

 

 

 

Группировки, которые можно сделать:

 

 

 

 

 

-

количество визитов по устройствам/каналам

 

 

 

 

привлечения

 

 

 

 

 

 

 

- среднее продолжительность

сессий

для

 

 

 

 

каждого устройства и тд

 

 

 

 

 

 

 

 

 

 

 

 

Соседние файлы в папке ЛР1