Python机器学习(二)

前言
因为多变量分析内容太多,而且涉及很多的统计学基础(绝大部分高中都学过),所以这一章算是复习,分两篇来写。

Multivariate Analysis(多变量分析)

多变量分析的意义就是研究多种自变量而得到因变量的表现。这看起来比单变量分析更加的真实和可靠,毕竟在现实生活中,各个事物都是互相联系的。

按生日和性别分析

南希认为同一时期的男性用户使用频率要远大于女性用户。因为根据之前的表图,男性用户使用总次数要远多于女性。艾瑞克认为研究这个方面的最好的办法就是绘制一个堆叠柱状图(stacked bar graph)(柱状图中每一个柱都有两种以上的颜色,这里颜色代表性别)
代码如下:

groupby_birthyear_gender = data.groupby(['birthyear', 'gender'])['birthyear'].count().unstack('gender').fillna(0)#以出生年月和性别排序,并将性别的索引由列改为行
groupby_birthyear_gender[['Male','Female','Other']].plot.bar(title = 'Distribution of birth years by Gender', stacked=True, figsize = (15,4))
plt.show()

Output:


image

代码含义:我们先将数据帧的列索引用unstack函数给转换为行索引,之后,将gender这一个列给分为三种:男,女,其他。这样我们就有了三种性别的不同的行程总数。

由图可知男士的确占大多数,但是也有例外。比如1947年出生的人使用单车的全为女性。1964和1994的人也大多是女性。

按生日和用户类型分析

在之前对80后用户的分析来看,所有的用户都是会员。南希非常好奇其他的年龄段的会员占比是多少?难道大多数都是普通用户?于是艾瑞克开始对生日和用户类型进行分析:

groupby_birthyear_usertype=data.groupby(['birthyear','usertype'])['birthyear'].count().unstack('usertype').fillna(0)#以出生年月和用户类型排序,并将用户类型的索引由列改为行
groupby_birthyear_usertype['Member'].plot.bar(title='Distribution of birth years by Usertype',stacked=True,figsize=(15,4))
plt.show()

Output:


image

南希看了非常惊讶:咋全都是会员?难道只有正式会员才需要填写生日?艾瑞克决定验证一下

print(data[data['usertype']=='Short-Term Pass Holder']['birthyear'].isnull().values.all())#验证普通会员是否有出生年月

Output:

True

果然,普通用户并没有填写生日。同样的,艾瑞克又验证了一下普通用户是否填写了性别,结果也是没有填写。说明我们没有任何关于普通用户的身份数据。
南希不得不重新考虑之前的推断:关于80后的品牌忠诚度。因为根本不知道80后的会员在80后总人数占多少。这个数据废弃了南希之前的推断。

时间序列分析

南希想知道基于开始日期的行程的频数。于是艾瑞克不得不把起始日期给转换为日期字符格式,他还做了更多,将日期拆分为多个小段(年,月,日,小时等)。

代码如下:

List_=list(data['starttime'])#把开始时间转换时间字符串
List_=[datetime.datetime.strptime(x, "%m/%d/%Y %H:%M") for x in List_]#将时间字符串转换为时间元组
data['starttime_mod']=pd.Series(List_,index=data.index)#Series函数创建索引
data['starttime_date'] = pd.Series([x.date() for x in List_],index=data.index)
data['starttime_year'] = pd.Series([x.year for x in List_],index=data.index)
data['starttime_month'] = pd.Series([x.month for x in List_],index=data.index)
data['starttime_day'] = pd.Series([x.day for x in List_],index=data.index)
data['starttime_hour'] = pd.Series([x.hour for x in List_],index=data.index)
data.groupby('starttime_date')['tripduration'].mean().plot.bar(title = 'Distribution of Trip duration by date', figsize = (15,4))
plt.show()

Output:


image

这个表格看起来有一种显而易见的走势。这就引出了时间序列的一些定义。

Time Series Components

下面是时间序列中最常见的三种走势图。

Seasonal Pattern(季节性走势)

image

如图所示,季节性走势总是有着时间规律,这些时期可以是一月中的周数,一年中的周数,也可以是一年中的月数。

Cyclic Pattern(循环走势)

循环走势唯一与季节性走势不同之处在于循环走势没有时间上的规律。

Trend(趋势)

趋势就是一段宏观上来看上升或降低的连续变量。这种走势可能不是很精准的线性走势,but when smoothing is applied it can generalize into either of the direction.(这句话不会翻译,大概意思知道)

由这几个走势;来看,南希认为这个时间行程的走势明显是季节性走势。
因为这个图的趋势总是有一段精确的时间间隔,这就是季节性。事实上,我们可以把分布给分为三种类型。一种是季节性,就是每隔一段时间就会重复。一种是
水平密度分布(flat density distribution),第三种就是线性分布。

到这第二部分完毕

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容