对数据进行充分的分析和特征工程可以产生良好的可视化效果,但人们在入门时经常面临问题, 让我们逐步了解数据预处理的不同步骤。
1. 使用什么编码平台?
虽然 Jupyter Notebook 是一个很好的起点,但 Google Colab 始终是协作工作的最佳选择。在这篇文章中,我将使用 Google Colab 展示数据预处理步骤。
2. 如何准备原始数据以供进一步分析?
在针对任何问题优化数据时,重要的是应遵循正确的步骤以达到正确的目的。
## 导入必要的库import numpy as npimport pandas as pd## Upload datasetfrom google.colab import filesuploaded = files.upload()
2.1 选择要上传的文件
## 读取一个csv 文件到pandas dataframedf = pd.read_csv(uploaded['data.csv'])## 读取一个json 文件到pandas dataframedf = pd.read_json(uploaded['data.json'])## 读取一个excel 文件到 pandas dataframedf = pd.read_excel(uploaded['data.xlsx'])
.csv 文件可以根据 ; 或任何其他分隔符(包括空格)分隔。
2.1.1 示例:以空格或制表符作为分隔符的 CSV 文件
## 读取一个csv 文件到dataframe包含分隔符或者Tab:df = pd.read_csv('data.csv', sep='\s+', engine='python')Output :Name Age City0 zhangsan 34 Sydney1 Lisi 31 Melbourne
2.1.2 示例:具有多个分隔符的 CSV 文件
## 读取一个 .csv 文件到dataframe 包含多种分隔符 :df = pd.read_csv('data.csv', sep='[:,|_]', engine='python')Input :Name,Age|City张三,34_Sydney李四:31,Melbourne王五,16:New YorkOutput :Name Age City0 张三 34 Sydney1 李四 31 Melbourne2 王五 16 New York
3. 描述数据有哪些不同的方法?
3.1 数据维度
df.shape # df是我们想要获取维度的数据框对象名
3.2 从数据集中删除重复项
df.drop_duplicates(inplace=True)
inplace=True 确保修改数据框对象而不创建其副本。如果您需要返回数据帧的副本,请使用 inplace=False 代替。
3.3 各数值列说明
df.describe()
describe() 有助于获得数据集的基本了解,包括最小值和最大值以及平均值、中值、标准差等。
3.4 获取数据集的前几行或最后几行
df.head(5) # 返回前5行 df.tail(5) # returns last '5' rows of the dataframe
3.4 列名
如果数据集包含大量特征(列),则有助于获取整个特征列表。使用 df.columns 以描述性格式返回数据帧所有列的名称。
df.columns Output: Index(['MSSubClass', 'LotFrontage', 'LotArea', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd', 'MasVnrArea', 'BsmtFinSF2', 'SalePrice'], dtype='object')
3.5 检查列的数据类型和每列的条目数:
df.info()
3.6 删除数字列中的特殊字符
现在,在某些情况下,包含数字数据的列可以具有“对象”数据类型。由于缺乏数据点,连续变量中可能会出现一些特殊字符,例如 ? 或 space。在这种情况下,我们将检查唯一条目以删除它们并更改数据类型:
for col in ['names of each column containing object datatype with numeric data points']: uni_val_col = df[col].unique() print ('The unique values in ' , col , 'are ', uni_val_col) ## Convert string datatype to float wherever required and change special characters to NaN for col in ['names of each column containing object datatype with numeric data points']: df[col] = pd.to_numeric(df[col], errors='coerce')
这会将某些列的特殊字符更改为 NaN(非数字)值并转换为 numeric 类型。
3.7 创建单独的连续和分类数据框
## 创建一个连续的列 df_cont = df.select_dtypes(include = ['int64','float64']) ##创建一个分类df_cat = df.select_dtypes(include =['object'])
3.8 从分类列中删除特殊字符
我们应该在分类列中检查类似的特殊字符(如第 3.6 节中提到的),并将它们替换为适当的值。
df.replace(to_replace=["?", ";"], value=np.nan)
4. 缺失值处理
没有最好的方法来估算缺失值。这始终取决于问题的类型。这里我们只关注执行分析时应遵循的程序。
4.1 查找缺失值百分比
在这里我们可以看到如何获得我们在 3.7 节中创建的连续数据帧中缺失值的百分比
# 连续数据帧中缺失值的百分比total = df_cont.isnull().sum().sort_values(ascending=False)percent = df_cont.isnull().sum()/df_cont.isnull().count()).sort_values(ascending=False) missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent']) f, ax = plt.subplots(figsize=(15, 6)) plt.xticks(rotation='90') sns.barplot(x=missing_data.index, y=missing_data['Percent']) plt.xlabel('df_cont', fontsize=15) plt.ylabel('Percent of missing values', fontsize=15) plt.title('Percent missing data by feature', fontsize=15) missing_data
我们可以对分类数据框 df_cat 应用相同的方法。df_cat
4.2 缺失值的插补
4.2.1 数值数据框
任何列的缺失值都可以通过平均值、中位数或众数来估算。如果列中的数据点偏差不大,则与连续数据点的均值相比,中位数是替换空值的更好选择。
df_cont.'columnname'.fillna(features.Unemployment.median(), inplace=True)
与其他方法相比,我更喜欢使用 KNN 插补来处理缺失值,因为它提供了更好的结果。
from sklearn.impute import KNNImputer imputer = KNNImputer(n_neighbors=10) df_data = imputer.fit_transform(df_cont) ## Creating a new dataframe of the imputed data df_num = pd.DataFrame(df_data, columns = df_cont.columns )
4.2.2 分类数据框
In case of categorical data points, we can replace it with mode对于分类数据点,我们可以将其替换为众数
## Replacing NaN with mode for a columndf_cat.replace({'NaN':'four'} , inplace =True)
5. 数据分发
5.1 数值数据框的图形表示
## Plot distplot for continuous data columns for col in df_num.columns: plt.figure() sns.distplot(df_num[col])
5.2 分类数据框的图形表示
## Plotting bar plots for categorical data columns for col in df_cat.columns: plt.figure() sns.countplot(x=col, data=df_cat) plt.xticks(rotation=90)
6.异常值的处理
6.1 异常值的百分比和其他描述性统计措施
Outliers are the extreme values of any feature which may or may not influence the model. To get the percentage of outliers present in each numerical or categorical attributes, we can use -异常值是可能影响也可能不影响模型的任何特征的极值。要获取每个数值或分类属性中存在的异常值的百分比,我们可以使用 -# Use the appropriate dataframe in place of "dataframe_name" in the code below, i.e. in this case df_num and df_cat df_outliers = pd.DataFrame(index=dataframe_name.columns, columns=['outliers', 'outliers%']) for col in dataframe_name.columns: if any(x in str(dataframe_name[col].dtype) for x in ['int', 'float']): df_outliers.loc[col, 'count'] = len(dataframe_name) df_outliers.loc[col, 'q1'] = dataframe_name[col].quantile(0.25) df_outliers.loc[col, 'q3'] = dataframe_name[col].quantile(0.75) df_outliers.loc[col, 'iqr'] = df_outliers.loc[col, 'q3'] - df_outliers.loc[col, 'q1'] df_outliers.loc[col, 'lower'] = df_outliers.loc[col, 'q1'] - (3 * df_outliers.loc[col, 'iqr']) df_outliers.loc[col, 'upper'] = df_outliers.loc[col, 'q3'] + (3 * df_outliers.loc[col, 'iqr']) df_outliers.loc[col, 'min'] = df[col].min() df_outliers.loc[col, 'max'] = df[col].max() df_outliers.loc[col, 'outliers'] = ((dataframe_name[col] < df_outliers.loc[col, 'lower']) | (df[col] > df_outliers.loc[col,'upper'])).sum() df_outliers.loc[col, 'outliers%'] = np.round(df_outliers.loc[col, 'outliers'] / len(dataframe_name) *100) df_outliers
我们还可以使用每个特征的箱线图来获得相同特征的图形表示。
6.2 异常值的处理
处理异常值的方法有多种,其中 z 分数是最简单的一种。
from scipy import stats z_scores = stats.zscore(dataframe_name) abs_z_scores = np.abs(z_scores) entries = (abs_z_scores < 3).all(axis=1) dataframe_name = dataframe_name[entries]
这样就完成了我们最初的数据预处理!我们现在可以从可视化和特征工程开始,使我们的数据集模型做好准备。