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中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以公安部、工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。
更多推荐
Python迭代器使用详解
一文读懂Python可迭代对象、迭代器和生成器
用Python爬取金融市场数据
搭建CNN模型破解网站验证码
用Python进行图文识别(OCR)
投稿邮箱:[email protected]
▼点击下方阅读原文,免费成为数据科学俱乐部会员