描述性统计
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, 呈现右偏分布
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. 异常值
在处理异常值之前, 先来通过箱线图看看异常值.
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)
可以看到以上6个连续型变量均有不同程度的异常值, 由于k-means算法对异常值较敏感, 因此选择剔除它
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)
原有样本容量:440, 剔除后样本容量:318
在剔除一次异常值之后, 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
可以看到现在的数据集中已经不存在异常了, 但是样本容量也从440大幅度下降为97, 因此这里不建议彻底删除.
4. 可视化分析
这里直接采用seaborn的pairplot方法
import seaborn as sns sns.pairplot(del_df)
变量之间存在不同程度的相关关系, 以及在剔除异常值之后连续型变量依然表现为高度偏态分布.
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)