数据分析的基本流程,一般分为四个步骤(对应四个工作过程):
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings sns.set(style="darkgrid", font_scale=1.2) plt.rcParams["font.family"] = "SimHei" plt.rcParams["axes.unicode_minus"] = False warnings.filterwarnings("ignore")
data = pd.read_csv("data.csv") print(data.shape) data.head() data.sample()
符合整洁数据的三个特点:
data.info() t = data.isnull().sum() t = pd.concat([t, t / len(data)], axis=1) # 左右拼接,横向拼接 t.columns = ["缺失值数量", "缺失值比例"] display(t)
对于缺失值,可以使用如下的方式处理 :
删除缺失值
仅适合于缺失数量很少的情况
填充缺失值
数值变量
均值填充
中值填充
插值填充
类别变量
众数填充
单独作为一个类别
额外处理说明
缺失值小于20%,直接填充
缺失值在20% ~ 80%,填充变量后,同时增加一列,标记该列是否缺失,参与后续建模
缺失值大于80%,将该列转换为二值变量(例如1与0),用来表示记录是否缺失
print(data["CRIM"].skew()) sns.distplot(data["CRIM"].dropna())
data.fillna({"CRIM": data["CRIM"].median()}, inplace=True)
data.describe() # 显示数据的统计信息,可作为一种简单的异常探索方式
根据正态分布的特性,可以将3σ之外的数据,视为异常值。
mean, std = data["CRIM"].mean(), data["CRIM"].std() lower, upper = mean - 3 * std, mean + 3 * std print("均值:", mean) print("标准差:", std) print("下限:", lower) print("上限:", upper) ## 获取在3倍标准差之外的数据 data["CRIM"][(data["CRIM"] < lower) | (data["CRIM"] > upper)]
箱线图是一种常见的异常检测方式,其采用四分位的方式进行检测。
sns.boxplot(data=data["CRIM"])
对于异常值,可以采用如下的方式处理 :
如果数据中存在较大的异常值,可以通过取对数来进行转换,这样可以得到一定的缓解。例如,变量呈现右偏分布(不适合左偏分布),可以进行取对数转换。
fig, ax = plt.subplots(1, 2) # 子图的行列数 fig.set_size_inches(15, 5) sns.distplot(data["CRIM"], ax=ax[0]) sns.distplot(np.log(data["CRIM"]), ax=ax[1])
取对数的方式比较简单,不过也存在一些局限:取对数只能针对正数操作。不过可以通过如下的方式进行转换: np.sign(x) * np.log(np.abs(x) + 1)
print(data.duplicated().sum()) # 发现重复值 data[data.duplicated(keep=False)] # 查看哪些记录出现了重复值
data.drop_duplicates(inplace=True) # 直接删除重复值
本文作者:a
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!