提到数据分析方法,可以分为三大类:回归分析、分类分析、聚类分析:
回归分析:训练出已知的两个不同的数组间的函数关系,并作出预测;
分类分析:从一组样本中,找出方法作出分类,并对未知参与训练的个体作出预测;
聚类分析:对一组样本作出区分,成为探索几个簇间差异的依据。
今天要分享的是聚类分析,分析摩拜用户的分类,数据源取自知乎友的网盘数据,有需要可以私信我。
聚类分析的特点:
1、是一种无监督的学习算法,没有严格意义的对错之分;
2、不同的人或者方法,聚类的结果可能不一样;
3、对噪点敏感,需要提出噪点;
4、数据形状大都是不规则的球形,分类算法需要能处理特殊形状
5、聚类分析的是数据之间的距离远近。
在分析之前,以下的数据都要经过标准化处理,即:均值和方差在Excel中能计算得出
数据主要字段如下:数据字段列表
一、数据清洗
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
mobike_user=pd.read_csv('mobike.csv')
mobike_user.info()
1、剔除聚类分析用不到的字段
A、unique()查询有多少个起始站,发现有许多个,而且不规律,暂时不计入影响因素,删除,以此类推终点站也删除。开始站名字不唯一,删除
B、继续删除不需要的字段:
mobike_user.drop(['user_id','bikeid','from_station_id','from_station_name','to_station_id','to_station_name'],axis=1,inplace=True)
整理完后发现还有一列:‘Unnamed:0’,也就是第一列,未命名的,可能是序号之类的,也删除,整理后最终的表格如下:
2、删除空值:
整理下看看有空值的占比,占比不大,可以删除:
mobike_user.isnull().sum()/len(mobike_user)
mobike_user.dropna(inplace=True)
mobike_user.isnull().any()剔除空值
3、删除异常值,如年龄为90-120岁之间的数据为异常
整体做描述统计分析:发现仅有两个字段做了描述性统计
看下整体字段的类型
tripduration为千位符格式,转为float类型,
mobike_user.tripduration=pd.to_numeric(mobike_user.tripduration.apply(lambda x:x.replace(",","")))
mobike_user.tripduration.describe()tripduration修改字段类型为floatage类型也直接转
修改字段类型后发现:
tripduration:有极值233732;age:有异常值101,
一般最大值比75%位数大三四倍就是异常值,调整数据,其中tripduration小于4000米,age小于70岁:调整年龄小于70岁调整tripduration小于4000米
剔除异常值结束后,开始完善字段格式,将起始终止时间转换成datatime数据类型,将剩余的类别型变量转换成数据型变量(get_dummies)
mobike_user.start_time=pd.to_datetime(mobike_user.start_time)
mobike_user.end_time=pd.to_datetime(mobike_user.end_time)
mobike_user=pd.get_dummies(mobike_user)
mobike_user.head()
二、数据标准化
整理后发现birthyear和age数据关系重复;usertype和gender数据关系重复,各取其中一个变量来分析,找出合适的特征变量存入X中,并将数据进行标准化。
mobike_user[['age','timeduration','tripduration','usertype_Customer','gender_Female']].corr()corr为分析相关性
发现'timeduration','tripduration',两者高度正相关,取其中一个。
x=mobike_user[['age','tripduration','usertype_Customer','gender_Female']]
from sklearn.preprocessing import scale
x=pd.DataFrame(scale(x))---scale为标准化数据语句
三、建立模型
1.不同分类模型的拟合
2.分析单变量维度的分群结果
3.使用轮廓系数评估模型效果
4.优化模型先尝试分为3类
对‘gender_male’和'usertype_Subscriber'进行可视化,两个变量的字段都是0或1,比较好观察处理结果,可视化的结果也很明显得展现了3种类别,分在4个角,说明这两个是比较好的特征变量。
第0组类型是customer,性别都有;第1组类型是Subscriber,性别为男;第2组类型是Subscriber,性别为女;
接下来尝试聚类的个数,其中,先从3个开始:
from sklearn import metrics
x_cluster=model.fit_predict(x)
score=metrics.silhouette_score(x,x_cluster)
print('聚类个数为3时,轮廓函数:',score)轮廓系数越高说明聚类效果越好
为了找到最佳的聚类个数,利用“肘”方法找出最佳聚类个数:肘部法则的计算原理是成本函数,成本函数是类别畸变程度之和,
每个类的畸变程度等于每个变量点到其类别中心的位置距离平方和,若类内部的成员彼此间越紧凑则类的畸变程度越小,反之,若类内部的成员彼此间越分散则类的畸变程度越大。在选择类别数量上,肘部法则会把不同值的成本函数值画出来。随着值的增大,平均畸变程度会减小;每个类包含的样本数会减少,于是样本离其重心会更近。但是,随着值继续增大,平均畸变程度的改善效果会不断减低。值增大过程中,畸变程度的改善效果下降幅度最大的位置对应的值就是肘部。
作者:enhengz
链接:https://www.jianshu.com/p/6dc5098bba1f