一、数据质量分析
1.1 缺失值分析
df.info()
df.describe()
# df.isna().sum()
missing = df.isnull().sum().reset_index().rename(columns={0:'missNum'}) # 缺失值统计
# df.isna().mean()
missing['missRate'] = missing['missNum'] / df.shape[0] # 缺失值比例
miss_analy = missing[missing.missRate>0].sort_values(by='missRate', ascending=False) # 按缺失率排序
# 缺失比可视化
null_ = data.isna().mean().reset_index().sort_values(by=0)
null_1 = null_.rename(columns={'index':'特征',0:'缺失比'}).reset_index(drop=True)
plt.figure(figsize=(8,6))
sns.kdeplot(null_1['缺失比'],shade=True)
plt.figure(figsize=(8,6))
plt.barh(range(null_1.shape[0]),null_1['缺失比'],label='缺失比')
plt.legend(loc=4)
plt.ylabel('特征变量',fontsize=15);
# --------------------------------------
import missingno as msno
msno.matrix(df, labels=True) # 矩阵图
plt.style.use('seaborn')
%matplotlib inline
msno.bar(df, labels=True, sort='descending')
msno.heatmap(df) # 相关性热图
1.2 缺失值处理
- 缺失比例超80%:丢弃列或行。
- 缺失比例30%-80%:(分箱)补全?【缺失35%-55%用(常数-1填充)单独做一类】
- 缺失比例10%-30%:基于其他字段进行预测。
- 缺失比例低于10%:分类型变量用众数;连续型变量用均值(适用于近似正态分布数据,观测值较为均匀散布均值周围)、中位数(适用于偏态分布或者有离群点数据,中位数是更好地代表数据中心趋势;适用于含有负数的特征,适用于方差大于100的连续型变量)、加权均值。【也可以直接删除行】
2 异常值处理
lowestprice(当前酒店可定最低价)有小于0的,有等于1的值,明显属于异常值,我们用盖帽法处理此异常值。
col_01 = ['lowestprice','lowestprice_pre'] # 偏态严重
# 定义盖帽法函数
def block_lower(x):
# x是输入的Series对象,替换1%分位数
ql = x.quantile(.01)
out = x.mask(x<ql,ql)
return(out)
def block_upper(x):
# x是输入的Series对象,l替换99%分位数
qu = x.quantile(.99)
out = x.mask(x>qu,qu)
return(out)
data.loc[:,col_01]=data.loc[:,col_01].apply(block_upper)
data.loc[:,col_01]=data.loc[:,col_01].apply(block_lower)
data.loc[:,['lowestprice','lowestprice_pre']].describe([0.01,0.25,0.5,0.75,0.99],include='all').T # 盖帽法处理异常值
二、数据特征分析
分布分析
(1)定量数据等分布分析
plt.hist(df['historyvisit_7ordernum'],
bins=30, # 箱数
alpha=0.5,
histtype=u'bar', color='steelblue', edgecolor='none'
) # 直方图
# seaborn中的kdeplot可用于使用核密度估计绘制单变量或双变量分布。
# 核密度估计(KDE)图是一种可视化数据集中观测分布的方法,与直方图呈正相关。KDE在一个或多个维度上使用连续的概率密度曲线表示数据。
# 相对于柱状图,KDE可以生成一个不那么杂乱且更具可解释性的图,特别是在绘制多个分布时。但是,如果底层分布是有界的或不平滑的,它就有可能导致扭曲。
sns.kdeplot(df['historyvisit_7ordernum'], shade=True)
sns.displot(df['historyvisit_7ordernum']) # 频次直方图与KDE结合
df.groupby('historyvisit_7ordernum').smapleid.count() # 分布统计
(2)定性数据等分布分析
- 偏态(skewness) 是指数据分布偏斜程度。使用偏态系数(SK)来测度数据的偏态。
- 峰态(kurtosis) 是指数据分布的扁平程度。使用峰态系数(K)来测度数据的偏态。
list = list(np.random.randn(10000))
s = pd.series(list)
s.skew() # 偏态系数
s.kurt() # 峰态系数