Отсутствующее значение в наборе данных отображается в виде вопросительного знака, нуля, NaN или просто пустой ячейки.
Но как справиться с недостающими данными? Конечно, каждая ситуация индивидуальна и должна оцениваться по-разному.
Есть много способов справиться с пропущенными значениями.
Рассмотрим типичные варианты на примере набора данных «Титаник».
Эти данные представляют собой открытый набор данных Kaggle. Для анализа вам необходимо импортировать библиотеки Python и загрузить данные.
Для загрузки используется метод Pandas read.csv().
Путь к файлу в кавычках указывается в круглых скобках, чтобы Pandas считывал файл во фрейм данных (Dataframes — df) с этого адреса.
Путь к файлу может быть URL-адресом или локальным адресом файла.
# import the libraries import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline import matplotlib as plt import matplotlib as mpl import matplotlib.cm as cm import matplotlib.pyplot as plt from matplotlib import pyplot # import the dataset train_df = pd.read_csv(r'C:\Users\Tatiana\Desktop\Python\titanic\train.csv') train_df.head(2)
Показывает первые 2 строки загруженного фрейма данных.
Посмотрим на размер данных (количество строк, столбцов): train_df.shape
(891, 12) Чтобы просмотреть статистическую сводку по каждому столбцу и увидеть распределение данных в каждом столбце, используйте метод описать().
Этот метод показывает нам количество строк в столбце — count, среднее значение столбца — среднее, столбец стандартного отклонения — std, минимальное (min) и максимальное (max) значения, а также границу каждого квартиля.
- 25%, 50% и 75%.
Любые значения NaN автоматически пропускаются.
train_df.describe()
метод описания( ) По умолчанию метод описать ( ) пропускает строки и столбцы, которые не содержат чисел — категориальных признаков.
Чтобы включить сводку по всем столбцам, нужно в скобках добавить аргумент — include="all".
# describe all the columns
train_df.describe(include = "all")
описание метода (включить = «все») Для категориальных признаков этот метод показывает: — сколько уникальных значений в наборе данных — уникальных; высшие ценности; частота появления значений - фрег.
Метод info() — показывает информацию о наборе данных, индекс, столбцы и тип данных, ненулевые значения и использование памяти.
# look at the info
print(train_df.info())
показывает информацию о наборе данных, индекс, столбцы и тип данных, ненулевые значения и использование памяти.
В результате мы видим, что все столбцы, кроме столбцов «Возраст», «Кабина» и «На посадке», содержат 891 строку.
Столбец «Выжившие» представляет собой целевое значение.
Показывает, кто выжил, а кто нет. Этот столбец заполнен двоичными значениями: 0 - не выжил 1 - выжил Метод — value_counts().
Подсчет значений — хороший способ понять, сколько единиц каждой характеристики/переменной у нас есть.
train_df['Survived'].
value_counts()
подсчет значений в столбце «Выжившие» Из 891 пассажира выжили 342. sns.set_style('whitegrid')
sns.countplot(x='Survived',data=train_df,palette='RdBu_r')
график подсчета значений в столбце «Выжившие» Из 891 пассажира выжили 342, что составляет 38%.
figure, survive_bar = plt.subplots(figsize=(7, 7))
sns.barplot(x= train_df["Survived"].
value_counts().
index, y = train_df["Survived"].
value_counts(), ax = survive_bar) survive_bar.set_xticklabels(['Not Survived', 'Survived']) survive_bar.set_ylabel('Frequency Count') survive_bar.set_title('Count of Survival', fontsize = 16) for patch in survive_bar.patches: label_x = patch.get_x() + patch.get_width()/2 # find midpoint of rectangle label_y = patch.get_y() + patch.get_height()/2 survive_bar.text(label_x, label_y, #left - freq below - rel freq wrt population as a percentage str(int(patch.get_height())) + '(' + '{:.
0%}'.
format(patch.get_height()/len(train_df.Survived))+')',
horizontalalignment='center', verticalalignment='center')
График подсчета значений в столбце «Выжившие» Визуализация: Графики значений счета в столбцах - «Выжил», «Пкласс», «Пол», «СибСп», «Парч», «Встал» fig, myplot = plt.subplots(figsize = (15,6), nrows = 2,ncols = 3)
features = ["Survived","Pclass","Sex","SibSp","Parch","Embarked"]
row, col, num_cols = 0,0,3
for u in features:
sns.barplot(x = train_df[u].
value_counts().
index,y = train_df[u].
value_counts(), ax = myplot[row, col]) myplot[row, col].
set_xlabel("") myplot[row, col].
set_title(u + " Titanic", fontsize = 15) myplot[row, col].
set_ylabel("Count") col = col + 1 if col == 3: col = 0 row = row + 1 plt.subplots_adjust(hspace = 0.5) plt.subplots_adjust(wspace = 0.3) # i put roundbracket around x,y,z to make more sense. just like how x \in [1,2,3] # and if x is a tuple or bracket #we have u \in [(1,2,3),(2,3,5),.
] where u = (x,y,z) #for each patch in each graph from [0,0] to [1,2], we want to do the following. for v in range(2): for z in range(3): for patch in myplot[v,z].
patches: label_x = patch.get_x() + patch.get_width()/2 # find midpoint of rectangle label_y = patch.get_y() + patch.get_height()/2 myplot[v,z].
text(label_x, label_y, str(int(patch.get_height())) + '('+'{:.
0%}'.
format(
patch.get_height()/len(train_df.Survived))+')',
horizontalalignment='center', verticalalignment='center')
Графики подсчета значений в столбцах - «Выжил», «Пкласс», «Пол», «СибСп», «Парч», «Встал на борт».
Теперь давайте посмотрим на столбцы, в которых пропущены значения.
Существует два метода обнаружения недостающих данных: isnull() и notnull().
Результатом является логическое значение, указывающее, действительно ли значение, переданное в аргумент, отсутствует. True означает, что значение отсутствует, а False означает, что значение отсутствует. # Evaluating for Missing Data
missing_data = train_df.isnull()
missing_data.head(6)
Верно – пропущенные значения Используя цикл for в Python, мы можем быстро определить количество пропущенных значений в каждом столбце.
Как упоминалось выше, «Истина» представляет отсутствующее значение, а «Ложь» означает, что значение присутствует в наборе данных.
В теле цикла for метод «.
value_counts()» подсчитывает количество значений «True».
# Count missing values in each column
for column in missing_data.columns.values.tolist():
print(column)
print(missing_data[column].
value_counts())
print(" ")
количество пропущенных значений в каждом столбце.
количество пропущенных значений в каждом столбце.
Посмотрим, сколько пропущенных значений в каждом столбце.
train_df.isnull().
sum()
количество пропущенных значений в каждом столбце.
'Возраст' В столбце «Возраст» отсутствует 177 значений.
И нужно понять, систематическая это ошибка или какая-то случайная ошибка.
Например, может быть, у пассажиров 1-го класса (или женщин) не спросили об их возрасте (потому что это было неприлично), или они случайно его пропустили.
Понимание причины пропущенных значений определит, как бороться с этими недостающими данными.
Возраст необходимо сгруппировать с учетом того, отсутствует ли возраст или нет. Для группировки мы используем метод groupby().
Правда, без возраста Ложь — значение заполнено # missing age or not
train_df.groupby(train_df['Age'].
isnull()).
mean()
метод groupby().
True – нет возраста, False – значение заполнено Среди пассажиров, у которых отсутствовало значение возраста, были выжившие (около 30%) и умершие (около 70%) – столбец «Выжившие», True = 0,29. Эти пассажиры были в нижнем классе:
- столбец «Pclass» — True = 2,59 (это среднее значение по классу)
- Столбец «Тариф» — True = 22,15 (это средняя стоимость билета)
# Value Counts
train_df['Pclass'].
value_counts()
Подсчет значений в столбце «Pclass» Например, в 3 классе был 491 пассажир (это 55%).
train_df.groupby(['Pclass']) ['Survived'].
value_counts(normalize=True)
Выживаемость пассажиров по классам Для более детального анализа создадим новый столбец Age_NaN (двоичный классификатор).
Используем методwhere(), где пишем условие: - если в столбце «Возраст» нет значения, то в столбце «Возраст_NaN» присваиваем значение 0, если оно есть, то 1. # Let's create a new column 'Age_NaN'
# If there is no value in the "Age" column, then = 0 and yes value = 1
train_df['Age_NaN'] = np.where(train_df['Age'].
isnull(), 0,1)
train_df.head(6)
первые 6 строк фрейма данных с новым столбцом Age_NaN Подсчет значений в столбце Age_NaN # Value Counts
train_df['Age_NaN'].
value_counts()
Подсчет значений в столбце Age_NaN Выживаемость пассажиров в зависимости от наличия возрастных записей.
# Survived passengers by 'Age_NaN'
train_df.groupby(['Age_NaN']) ['Survived'].
value_counts(normalize=True)
Выживаемость пассажиров в зависимости от наличия возрастных записей.
И снова мы видим: - что среди пассажиров, у которых отсутствовало значение возраста, были выжившие (около 30%) и погибшие (около 70%).
Выживание пассажиров в зависимости от наличия возрастных и классовых записей.
train_df.groupby(['Age_NaN','Pclass']) ['Survived'].
value_counts(normalize=True)
Выживание пассажиров в зависимости от наличия возрастных и классовых записей.
pd.crosstab(train_df['Pclass'], train_df['Age_NaN'])
в зависимости от наличия записей о возрасте и классе.
В первый класс 30 пассажирам вход воспрещен.
Из 30 пассажиров выжили 46% (14 пассажиров), погибли 53% (16 пассажиров).
Общее количество пассажиров первого класса составило 216 (в этом наборе данных).
Во второй класс 11 пассажирам вход воспрещен.
Из 11 пассажиров выжили 36% (4 пассажира), погибли 63% (7 пассажиров).
Общее количество пассажиров второго класса составило 184 (в этом наборе данных).
В третий класс вход воспрещен 136 пассажирам.
Из 136 пассажиров выжили 25% (34 пассажира), погибли 75% (102 пассажира).
Общее количество пассажиров третьего класса составило 491 (в этом наборе данных).
Выживаемость пассажиров в зависимости от наличия возрастных и половых записей.
train_df.groupby(['Age_NaN','Sex']) ['Survived'].
value_counts(normalize=True)
Выживаемость пассажиров в зависимости от наличия возрастных и половых записей.
pd.crosstab(train_df['Sex'], train_df['Age_NaN'])
в зависимости от наличия записи о возрасте и поле.
У 53 женщин не было записей о возрасте.
Из 53 женщин выжили 68% (36 женщин), умерли 32% (17 женщин).
Всего было 314 женщин (в этом наборе данных).
У 124 мужчин не было записей о возрасте.
Из 124 мужчин выжили 13% (16 мужчин), умерли 87% (108 мужчин).
Всего мужчин было 577 (в этом наборе данных).
В третьем классе было много пассажиров, и многие погибли.
Пассажиры — мужчины, у которых был более дешевый билет и класс ниже, — имели меньше шансов выжить.
Потому что среди пассажиров, у которых отсутствовало значение возраста, были выжившие (около 30%) и погибшие (около 70%), причем пассажиры были из разных классов (из 3-го класса их было значительно больше), а среди пассажиров были мужчины и женщины (мужчин было значительно больше), то при опросе выживших и осмотре тел погибших возраст пассажира мог быть случайно упущен.
Поэтому делаем вывод, что возраст введен не случайно.
Решение: Заполните пропущенные значения средним значением.
# missing values are replaced by the average value
train_df['Age'].
fillna(train_df['Age'].
mean(), inplace = True)
sns.set_style('whitegrid')
%matplotlib inline
g = sns.FacetGrid(train_df, col='Survived')
g.map(plt.hist, 'Age', bins=10)
Выживаемость пассажиров в зависимости от возраста Давайте посмотрим на выживаемость пассажиров в зависимости от класса и возраста.
# Survived passengers by Pclass and Age
grid = sns.FacetGrid(train_df, col ='Survived', row ='Pclass', height = 3.5, aspect=1.5)
grid.map(plt.hist, 'Age', alpha=.
5, bins=10)
grid.add_legend();
карта выживаемости пассажиров в зависимости от класса и возраста 'Кабина' В столбце «Каюта» отсутствует 687 значений.
Поскольку пропущенных значений много, вы можете полностью удалить столбец «Каюта» или оставить недостающие данные как недостающие данные.
Здесь важно понять следующее: - Есть ли какая-то систематическая связь между выживанием и наличием у пассажира отдельной кабины.
Для группировки мы используем метод groupby().
Правда - нет упоминания о каюте Ложь — значение заполнено # missing cabin or not
# Relationship between the presence of a value in the "Cabin" column on the survival rate
train_df.groupby(train_df['Cabin'].
isnull()).
mean()
метод groupby().
True – о кабине нет упоминания, False – значение заполняется Те пассажиры, у которых нет записи - выжили около 30%.
А тех, у кого есть запись о наличии каюты - выжило 67%.
Вывод: существует взаимосвязь между выживанием и наличием хижины.
Решение: Создайте новый столбец Cabin_available (двоичный классификатор).
Используем методwhere(), где пишем условие: - Если в столбце «Кабина» нет значения, то в столбце «Кабина_доступен» присваиваем значение 0, если оно есть, то 1. # Let's create a new column 'Cabin_available'
# If there is no value in the "Cabin" column, then = 0 and yes value = 1
train_df['Cabin_available'] = np.where(train_df['Cabin'].
isnull(), 0,1)
train_df.head(6)
показывает первые 6 строк фрейма данных с новым столбцом Cabin_available Выживаемость пассажиров в зависимости от наличия бортовой записи: train_df.groupby(['Cabin_available']) ['Survived'].
value_counts(normalize=True)
Выживаемость пассажиров в зависимости от наличия записи в салоне train_df.pivot_table(
'PassengerId', 'Cabin_available', 'Survived', 'count').
plot(
kind='bar', stacked=True)
Схема выживаемости пассажиров в зависимости от наличия записи в салоне Теперь столбец «Каюта» можно удалить.
train_df.drop(['Cabin'], axis = 1, inplace = True)
train_df
фрейм данных без столбца «Каюта» «Приступил» В столбце «Порт посадки» отсутствуют два значения.
Это категорическая особенность.
Решение: Заменить пропущенные значения по частоте.
Замените отсутствующее значение значением, которое чаще всего появляется в определенном столбце.
train_df['Embarked'].
value_counts()
подсчет значений в столбце «На посадке» Наиболее распространенное значение S — 644. Пропущенные значения необходимо заменить на S. # replace the missing 'Embarked' values by the most frequent - S
train_df['Embarked'].
replace(np.nan, 'S', inplace = True) train_df['Embarked'].
describe()
Опишите() для столбца «Начало» после замены пропущенных значений.
Хороший! Теперь у нас есть набор данных без пропущенных значений.
(Хорошо! Теперь у нас есть набор данных без пропущенных значений.
) train_df.isnull().
sum()
набор данных без пропущенных значений
Теги: #Машинное обучение #python #программирование #Визуализация данных #Открытые данные #pandas #python3 #Numpy #matplotlib #визуализация данных #seaborn #очистка данных #предварительная обработка #обработка данных #пропущенные значения
-
Советы И Рекомендации По Процессору
19 Oct, 24 -
Результаты Джанго Дэш 2010
19 Oct, 24 -
Хостинг Pci Dss: Что Вам Нужно Знать
19 Oct, 24 -
Кукушки Негодуют.
19 Oct, 24