聚类的Python实现(一):数据导入和处理

聚类的Python实现(一):数据导入和处理_第1张图片


RAYW,互联网数据分析。

博客:zhihu.com/people/wang-rui-54-41

本例中,使用用户注册时间(注册天数reg_length)、活跃(最近活跃间隔天数rec_act_length、近7日活跃天数act_days)和变现(近7日日均广告点击量ad_pd、近7日日均阅读量read_pd)三个维度进行聚类。

库导入

在这里用到了os用来处理路径,numpy、pandas都是数据分析处理的常用库,matplotlib作简单的图形看指标分布,重头戏就是sklearn啦,用来完成我们的聚类建模。

import os
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

mpl.rcParams['font.sans-serif'] = ['simhei'#指定默认字体  
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

%matplotlib inline  #开启matplotlib图形显示

数据导入

首先载入原数据,pandas为我们提供了多种方案,不论是csv、excel或是使用sql从数据库中提取,都并不困难,本例中从csv读入。

#使用pandas读取csv生成DataFrame
data = pd.read_csv('user_value_source_data.csv')
 [['reg_length','rec_act_length','act_days','ad_pd','read_pd']]

数据观察

数据观察是非常重要的一个步骤,通过数据观察发现数据中的脏数据、缺失,或是不合理的异常数据,都能够帮助我们提高数据质量,更好的实现接下来的聚类工作。

本例中的数据源共63W条用户数据,对于这样量级的数据,我们肯定不能逐个进行检查和查看,要借助于描述性统计工具和分布图来查看。本例中数据取自公司数据库,较为规整,全部为数值形式,相对来说观察和处理均处理较为简单。

字段属性及描述性统计

#查看字段相关信息,包括字段名,数据条数,是否存在空值,字段类型等
data.info() 

#
#Int64Index: 623202 entries, 0 to 732007
#Data columns (total 5 columns):
#reg_length        623202 non-null float64
#rec_act_length    623202 non-null int64
#act_days          623202 non-null int64
#ad_pd             623202 non-null float64
#read_pd           623202 non-null float64
#dtypes: float64(3), int64(2)
#memory usage: 28.5 MB

#查看各个字段的描述性统计结果
data.describe()  

# reg_length    rec_act_length  act_days    ad_pd   read_pd
# count 623202.000000   623202.000000   623202.000000   623202.000000   623202.000000
# mean  690.140974  1.756763    5.183326    0.765262    3.048918
# std   481.744966  1.562748    2.343711    1.716068    5.806001
# min   1.000000    1.000000    1.000000    0.000000    0.000000
# 25%   219.000000  1.000000    3.000000    0.000000    0.000000
# 50%   677.000000  1.000000    7.000000    0.143000    0.286000
# 75%   1119.000000 2.000000    7.000000    0.714000    3.000000
# max   1537.000000 7.000000    7.000000    14.857000   29.857000

查看数值分布

以日均广告点击量字段为例,作出数据分布直方图,可以看到数据偏态分布,聚集于靠近0的位置。发现各个字段基本都存在这种情况,因此可以考虑对数据进行对数处理,使得分布更加均匀。

#作出该字段的分布直方图
ad_pd = data['ad_pd']
plt.figure()
ad_pd.plot.hist(bins=2000,figsize=(10,6),xlim=[0,100])

数据处理

缺失值处理

当前数据并不存在缺失,可以省略这步骤,当只存在少量缺失数据时,可以直接剔除数据,对聚类的影响较小,若字段为类型变量,有时缺失本身可以作为一类,具有一定业务含义。

此外,有时缺失值并不一定为空值,也可能以特定字符串形式出现,如'NULL','空',或某一特定数值,如-1,999等,在做数据处理时要记得查看是否有类似形式数据,或某一单一数值分布异常多。对于这种情况,可以使用replace()方法将缺失值统一成我们希望的形式。

#dropna方法,详细方法可查看pandas文档
data.dropna()

#将'NULL'替换为空值
data.replace('NULL','')

异常值处理

前文数据观察中,我们看了各字段数据的分布,根据业务逻辑,若字段中存在异常大的数值,则我们应考虑剔除,避免影响聚类结果。

#写一个筛选条件即可
filter_ = ( data['ad_pd'] < 100 ) &( data['read_pd'] < 200 )
data = data[filter_]

数据标准化

本例中数据偏态分布,可先做对数处理,再使用Z-Score进行标准化。

def standardize(df):
    data_log = df.apply(lambda x: np.log(x+1))
    Zdata = data_log.apply(lambda x: round((x-x.mean())/x.std(),4))
    return Zdata


聚类的Python实现(一):数据导入和处理_第2张图片

§ §

Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以公安部、工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。


更多推荐


Python迭代器使用详解


一文读懂Python可迭代对象、迭代器和生成器


用Python爬取金融市场数据


搭建CNN模型破解网站验证码


用Python进行图文识别(OCR)


投稿邮箱:[email protected]


聚类的Python实现(一):数据导入和处理_第3张图片

点击下方阅读原文免费成为数据科学俱乐部会员

你可能感兴趣的:(聚类的Python实现(一):数据导入和处理)