描述性统计

df.describe()

有两种渠道来源, 和三种地区, 各自分别占多少还需要进一步探索. 

新鲜产品每年支出: 范围3~112151, 中位数为8504, 均值为12000, 呈现右偏分布

奶制品每年支出: 范围55~73498, 中位数为3627, 均值为5796, 呈现右偏分布

食品杂货每年支出: 范围3~92780, 中位数为4756, 均值为7951, 呈现右偏分布

冷冻产品每年支出: 范围25~60869, 中位数为1526, 均值为3072, 呈现右偏分布

洗涤剂和纸制品每年支出: 范围3~40827, 中位数为817, 均值为2881, 呈现右偏分布

熟食每年支出: 范围3~47943, 中位数为965, 均值为1525, 呈现右偏分布

最火Python3 玩转实用小工具

4. 偏态和峰态

for i in range(2, 8):
    name = df.columns[i]
    print(name)
    print('    偏态系数为 {0}, 峰态系数为 {1}'.format(df[name].skew(), df[name].kurt()))
Fresh
    偏态系数为 2.561322751927935, 峰态系数为 11.536408493056006
Milk
    偏态系数为 4.053754849210881, 峰态系数为 24.669397750673077
Grocery
    偏态系数为 3.5874286903915453, 峰态系数为 20.914670390919653
Frozen
    偏态系数为 5.9079856924559575, 峰态系数为 54.68928069737255
Detergents_Paper
    偏态系数为 3.6318506306913645, 峰态系数为 19.009464335418212
Delicassen
    偏态系数为 11.151586478906117, 峰态系数为 170.69493933454066

可以看到均表现为尖峰, 高度偏态分布.

3. 数据预处理

没有缺失值, 因此不用缺失值处理

1. 异常值

在处理异常值之前, 先来通过箱线图看看异常值.

最火Python3 玩转实用小工具

import seaborn as sns
import matplotlib.pyplot as plt
def get_boxplot(data, start, end):
    fig, ax = plt.subplots(1, end-start, figsize=(24, 4))
    for i in range(start, end):
        sns.boxplot(y=data[data.columns[i]], data=data, ax=ax[i-start])
get_boxplot(df, 2, 8)

最火Python3 玩转实用小工具

 最火Python3 玩转实用小工具

 可以看到以上6个连续型变量均有不同程度的异常值, 由于k-means算法对异常值较敏感, 因此选择剔除它

最火Python3 玩转实用小工具

def drop_outlier(data, start, end):
    for i in range(start, end):
        field = data.columns[i]
        Q1 = np.quantile(data[field], 0.25)
        Q3 = np.quantile(data[field], 0.75)
        deta = (Q3 - Q1) * 1.5
        data = data[(data[field] >= Q1 - deta) & (data[field] <= Q3 + deta)]
    return data
del_df = drop_outlier(df, 2, 8)
print("原有样本容量:{0}, 剔除后样本容量:{1}".format(df.shape[0], del_df.shape[0]))
get_boxplot(del_df, 2, 8)

最火Python3 玩转实用小工具

原有样本容量:440, 剔除后样本容量:318

 最火Python3 玩转实用小工具

在剔除一次异常值之后, 6个连续变量的波动幅度也都都大致接近, 你可能会问为什么还有异常值存在? 现在的异常值是相对于新数据集产生的, 而我们把原数据集中的异常值已经剔除了, 通常来说, 对于异常值只需剔除一次即可, 如果彻底剔除的话, 样本容量可能会有大幅度的变化, 比如:

df_new = df.copy()
#直到第10次的时候图像上才没有出现异常值
for i in range(10):
    df_new = drop_outlier(df_new, 2, 8)
print("原有样本容量:{0}, 彻底剔除后样本容量:{1}".format(df.shape[0], df_new.shape[0]))
get_boxplot(df_new, 2, 8)
原有样本容量:440, 彻底剔除后样本容量:97

最火Python3 玩转实用小工具

可以看到现在的数据集中已经不存在异常了, 但是样本容量也从440大幅度下降为97, 因此这里不建议彻底删除.

4. 可视化分析

这里直接采用seaborn的pairplot方法

import seaborn as sns
sns.pairplot(del_df)

变量之间存在不同程度的相关关系, 以及在剔除异常值之后连续型变量依然表现为高度偏态分布.

最火Python3 玩转实用小工具

5. 特征工程

1. 离散型变量

将离散型变量处理成哑变量.

del_df['Channel'] = del_df.Channel.astype(str)
del_df['Region'] = del_df.Region.astype(str)
del_df = pd.get_dummies(del_df)

相关文章: