Очистка данных: обработка пропущенных значений, выбросов и повторяющихся значений

анализ данных

 В процессе очистки данных в основном обрабатываются пропущенные значения, выбросы и повторяющиеся значения. Так называемая очистка предназначена для выполнения таких операций, как отбрасывание, заполнение, замена и дедупликация данных для достижения цели устранения исключений, исправления ошибок и восполнения отсутствующих данных.

1. 4 способа справиться с отсутствующими столбцами данных

 Есть два типа отсутствующих данных:

  • Отсутствующие записи строк, также известные как отсутствующие записи данных;
  • Потеря значений столбцов данных, то есть записи данных с отсутствующими значениями в некоторых столбцах по разным причинам.

Здесь мы сосредоточимся на обработке пропущенных значений типов столбцов данных, Обычно существует четыре идеи обработки:

  1. выбрасывать
  2. Завершение Завершение является более распространенным способом работы с пропущенными значениями, чем отбрасывание.Обычно используемые методы завершения:
    • Статистический метод: для данных числового ряда используйте среднее значение, средневзвешенное значение, медиану и другие методы для составления; для категориальных данных используйте значение с наибольшим режимом категории для составления.
    • модельный метод
    • Экспертное завершение
    • Другие методы
  3. метод преобразования правды
  4. не обрабатывать

На этапе предварительной обработки данных также рекомендуется не обрабатывать записи данных с пропущенными значениями. Этот тип мышления в основном зависит от более поздних приложений для анализа данных и моделирования.Многие модели имеют допуск или гибкие методы обработки пропущенных значений, поэтому их нельзя обрабатывать на этапе предварительной обработки. Общие модели, которые могут автоматически обрабатывать пропущенные значения, следующие: - Игнорировать, пропущенные значения не участвуют в расчете расстояния, например KNN; - Принимать пропущенные значения как состояние распределения и участвовать в процессе моделирования, например различных деревьев решений и их вариантов; - Расчет не основан на расстоянии, поэтому расчет на основе расстояния значения устранит влияние самого себя, такого как DBSCAN.

2. Не очищайте и не удаляйте аномальные данные.

2.1 Выбросы обычно отражают результаты хозяйственной деятельности

2.2 Модель обнаружения аномалий

2.3 Моделирование данных для учета выбросов

3. Нужно ли устранять дублирование данных?

В следующих случаях тщательно выполняйте дедупликацию данных (не рекомендуется).

  1. Повторяющиеся записи используются для анализа правил эволюции.
  2. Дублирование записей для обработки дисбаланса проб
  3. Дублирующиеся записи используются для выявления проблем с бизнес-правилами.

1. Обработка пропущенных значений

import pandas as pd # 导入Pandas库
import numpy as np # 导入Numpy库
from sklearn.preprocessing import Imputer # 导入sklearn.preprocessing中的Imputer库

# 生成缺失数据
df = pd.DataFrame(np.random.randn(6, 4), columns=['col1','col2','col3','col4']) # 生成一份数据

df.iloc[1, 1] = np.nan #增加缺失值
df.iloc[4, 3] = np.nan
print(df)

       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
1  0.044689       NaN  1.399678  1.341892
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
4  0.385922 -0.523917  1.227749       NaN
5  0.615499  0.138902 -0.523084 -0.608018
# 查看哪些值缺失
nan_all = df.isnull() # 获取所有数据框中的N值
print(nan_all) # 打印输出
    col1   col2   col3   col4
0  False  False  False  False
1  False   True  False  False
2  False  False  False  False
3  False  False  False  False
4  False  False  False   True
5  False  False  False  False
# 获得含有NA的列
nan_col = df.isnull().any()  # 查找含有至少1个缺失值的列,any()方法用来返回指定轴中的任何元素为True
print("获得含有NA的列")
print(nan_col)


获得含有NA的列
col1    False
col2     True
col3    False
col4     True
dtype: bool
# 获得全部为NA的列
nan_col2 = df.isnull().all() # 查找全部缺失值的列,其中all()方法用来返回指定轴的所有元素都为True
print("获取全部为NA的列")
print(nan_col2)


获取全部为NA的列
col1    False
col2    False
col3    False
col4    False
dtype: bool

1.1 Отбросить пропущенные значения

df2 = df.dropna() # 直接丢弃含有NA的行记录
print(df2)
       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
5  0.615499  0.138902 -0.523084 -0.608018

1.2 Дополнение пропущенных значений

1.2.1 Замена отсутствующих значений конкретными значениями с помощью sklearn

 Используйте метод предварительной обработки данных Sklearn для обработки пропущенных значений. Сначала создайте объект предварительной обработки, создав метод Imputer. Параметры описываются следующим образом:

  • стратегия: строка отсутствующих значений по умолчанию, значение по умолчанию NaN, значение стратегии может бытьсреднее (среднее),медиана,most_frequent;
  • ось: используется для установки оси ввода, значение по умолчанию равно 0, то есть столбец используется для логики расчета.
nan_model = Imputer(missing_values='NaN', strategy='mean', axis=0) # 建立替换规则:将值为Nan的缺失值用均值做替换
nan_result = nan_model.fit_transform(df) # 应用模型规则
print(nan_result)
[[-1.00285617 -0.07899506 -0.60695655 -1.62471244]
 [ 0.04468906 -0.15452215  1.39967806  1.34189211]
 [-0.25801157 -0.34136463  0.12636506 -2.01033919]
 [-0.76607272  0.03276415  0.03368498 -0.68469122]
 [ 0.38592178 -0.52391692  1.2277487  -0.7171737 ]
 [ 0.61549888  0.13890169 -0.5230837  -0.60801774]]

1.2.2 Замена пропущенных значений конкретными значениями с помощью Pandas

 Метод обработки Pandas для отсутствующих значений — df.fillna (), Двумя основными параметрами в этом методе являются: значение и метод. Первый заменяет отсутствующие значения фиксированными значениями (или указанными вручную), второй заменяет отсутствующие значения с помощью методов по умолчанию, предоставляемых Pandas, следующие методы поддерживаются методами:

  • pad и ffill: заменить пропущенные значения предыдущими значениями
  • backfill и bfill: заменить отсутствующие значения более поздними значениями
# 用后面的值替换缺失值
nan_result_pd1 = df.fillna(method='backfill') 
print(nan_result_pd1)
       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
1  0.044689 -0.341365  1.399678  1.341892
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
4  0.385922 -0.523917  1.227749 -0.608018
5  0.615499  0.138902 -0.523084 -0.608018
# 用后面的值替换缺失值,限制每列只能替换一个缺失值
nan_result_pd2 = df.fillna(method='bfill', limit=1) 
print(nan_result_pd2)
       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
1  0.044689 -0.341365  1.399678  1.341892
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
4  0.385922 -0.523917  1.227749 -0.608018
5  0.615499  0.138902 -0.523084 -0.608018
# 用前面的值替换缺失值
nan_result_pd3 = df.fillna(method='pad') 
print(nan_result_pd3)
       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
1  0.044689 -0.078995  1.399678  1.341892
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
4  0.385922 -0.523917  1.227749 -0.684691
5  0.615499  0.138902 -0.523084 -0.608018
# 用0替换缺失值
nan_result_pd4 = df.fillna(0) 
print(nan_result_pd4)
       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
1  0.044689  0.000000  1.399678  1.341892
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
4  0.385922 -0.523917  1.227749  0.000000
5  0.615499  0.138902 -0.523084 -0.608018
# 用不同值替换不同列的缺失值
nan_result_pd5 = df.fillna({'col2':1.1, 'col4':1.4}) 
print(nan_result_pd5)
       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
1  0.044689  1.100000  1.399678  1.341892
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
4  0.385922 -0.523917  1.227749  1.400000
5  0.615499  0.138902 -0.523084 -0.608018
# 用平均数代替,选择各自列的均值替换缺失值
nan_result_pd6 = df.fillna(df.mean()['col2':'col4']) 
print(nan_result_pd6)
       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
1  0.044689 -0.154522  1.399678  1.341892
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
4  0.385922 -0.523917  1.227749 -0.717174
5  0.615499  0.138902 -0.523084 -0.608018
# 使用replace方法替换缺失值
nan_result_pd7 = df.replace(np.nan, 0)
print(nan_result_pd7)
       col1      col2      col3      col4
0 -1.002856 -0.078995 -0.606957 -1.624712
1  0.044689  0.000000  1.399678  1.341892
2 -0.258012 -0.341365  0.126365 -2.010339
3 -0.766073  0.032764  0.033685 -0.684691
4  0.385922 -0.523917  1.227749  0.000000
5  0.615499  0.138902 -0.523084 -0.608018

2. Обработка выбросов

 Существует много правил и методов для определения выбросов.Здесь порог, полученный стандартизацией Z, используется в качестве стандарта оценки.Когда стандартизированная оценка превышает порог, это ненормально.

import pandas as pd # 导入Pandas库

#生成异常数据
df = pd.DataFrame({'col1':[1, 120, 3, 5, 2, 12, 13], 'col2':[12, 17, 31, 53, 22, 32, 43]})
print(df)
   col1  col2
0     1    12
1   120    17
2     3    31
3     5    53
4     2    22
5    12    32
6    13    43

2.1 Оценка выбросов по методу Z-Score

df_zscore = df.copy() # 复制一个用来存储Z-Score得分的数据框
cols = df.columns # 获得数据框的列名
print(cols)
for col in cols: # 循环读取每列
    df_col = df[col] # 得到每列的值
    z_score = (df_col - df_col.mean()) / df_col.std() # 计算每列的z-score得分
    df_zscore[col] = z_score.abs() > 2.2 # 判断Z-Score得分是否大于2.2,如果是则为True,否则则为False
print(df_zscore)
Index(['col1', 'col2'], dtype='object')
    col1   col2
0  False  False
1   True  False
2  False  False
3  False  False
4  False  False
5  False  False
6  False  False

 В приведенном выше примере настройка порога является ключом к определению того, является ли он ненормальным или нет.Обычно, когда порог больше 2, это уже относительно ненормальное значение производительности.  Ключевыми моментами, которые следует учитывать при оценке выбросов, являются:Как определить выбросы\color{red}{Как оценивать выбросы}. Для тех, у кого есть фиксированные бизнес-правила, бизнес-правила могут применяться напрямую, а для тех, у кого нет фиксированных бизнес-правил, для суждения могут использоваться общие модели данных, то есть модели, основанные на распределении вероятностей (например, диапазон стандартного отклонения нормального распределения). ), методы на основе кластеров (такие как KMeans), методы на основе плотности (такие как LOF), методы на основе классификации (KNN), методы на основе статистики (такие как методы квантилей) и т. д., определение выбросов в данном время имеет сильный субъективный цвет оценки, который необходимо выбрать в соответствии с реальной ситуацией.

3. Обработка повторяющихся значений

import pandas as pd 

# 生成重复数据
data1 = ['a', 3]
data2 = ['b', 2]
data3 = ['a', 3]
data4 = ['c', 2]
df = pd.DataFrame([data1, data2, data3, data4], columns=['col1','col2'])
print(df)
  col1  col2
0    a     3
1    b     2
2    a     3
3    c     2

3.1 Оценка дублирующихся данных

isDuplicated = df.duplicated() # 判断重复数据记录
print(isDuplicated)
0    False
1    False
2     True
3    False
dtype: bool

3.2 Удалить повторяющиеся значения

3.2.1 Удалить все записи с одинаковым значением столбца в записи данных

new_df1 = df.drop_duplicates() # 删除数据记录中所有列值相同的记录
print(new_df1)
  col1  col2
0    a     3
1    b     2
3    c     2

3.2.2 Удалить записи с одинаковым значением col1 в записях данных

new_df2 = df.drop_duplicates(['col1'])
print(new_df2)
  col1  col2
0    a     3
1    b     2
3    c     2

3.2.3 Удаление записей с одинаковым значением col2 в записях данных

new_df3 = df.drop_duplicates(['col2'])
print(new_df3)
  col1  col2
0    a     3
1    b     2

3.2.4 Удалить записи с одинаковым значением указанного столбца (col1/col2) в записи данных

new_df4 = df.drop_duplicates(['col1','col2'])
print(new_df4)
  col1  col2
0    a     3
1    b     2
3    c     2

4. Краткое изложение технических моментов

  1. Создайте новый фрейм данных через pd.DataFrame;
  2. Выберите конкретный через df.iloc[]столбец или объект;
  3. Используйте Pandas isnull(), чтобы определить, является ли значение пустым;
  4. Используйте all() и any(), чтобы определить, содержит ли каждый столбец хотя бы один True или все True;
  5. Используйте dropna() Pandas, чтобы напрямую отбрасывать недостающие значения.
  6. Используйте метод Imputer в Sklearn.preprocessing для заполнения и замены отсутствующих значений, который поддерживает 3 метода заполнения:mean (среднее), median (медиана), most_frequent (мода);
  7. Используйте fillna Pandas для заполнения пропущенных значений, поддержки дополнительных пользовательских значений и общих предопределенных методов;
  8. Получить копию объекта с помощью копирования, что часто используется в сценариях, когда исходный объект и скопированный объект используются одновременно;
  9. Перебирает итерируемый список значений через цикл for.
  10. Настроить формулу расчета z-оценки;
  11. Судя по повторяющимся записям данных с помощью дубликата Pandas();
  12. Удалите повторяющиеся записи с помощью drop_duplicates() Pandas, указав определенные столбцы или все.