分类目录归档:参考资料整理

一些常用资料和知识的整理,大部分来源于书籍和网络资源

衡量数据的离散程度

  我们通常使用均值、中位数、众数等统计量来反映数据的集中趋势,但这些统计量无法完全反应数据的特征,即使均值相等的数据集也存在无限种分布的可能,所以需要结合数据的离散程度。常用的可以反映数据离散程度的统计量如下:

极差(Range)

  极差也叫全距,指数据集中的最大值与最小值之差:

Range

  极差计算比较简单,能从一定程度上反映数据集的离散情况,但因为最大值和最小值都取的是极端,而没有考虑中间其他数据项,因此往往会受异常点的影响不能真实反映数据的离散情况。

四分位距(interquartile range,IQR)

  我们通常使用箱形图来表现一个数据集的分布特征:

box-plot

  一般中间矩形箱的上下两边分别为数据集的上四分位数(75%,Q3)和下四分位数(25%,Q1),中间的横线代表数据集的中位数(50%,Media,Q2),四分位距是使用Q3减去Q1计算得到:

 interquartile-range

  如果将数据集升序排列,即处于数据集3/4位置的数值减去1/4位置的数值。四分位距规避了数据集中存在异常大或者异常小的数值影响极差对离散程度的判断,但四分位距还是单纯的两个数值相减,并没有考虑其他数值的情况,所以也无法比较完整地表现数据集的整体离散情况。

方差(Variance)

  方差使用均值作为参照系,考虑了数据集中所有数值相对均值的偏离情况,并使用平方的方式进行求和取平均,避免正负数的相互抵消:

Variance

  方差是最常用的衡量数据离散情况的统计量。

标准差(Standard Deviation)

  方差得到的数值偏差均值取平方后的算术平均数,为了能够得到一个跟数据集中的数值同样数量级的统计量,于是就有了标准差,标准差就是对方差取开方后得到的:

Standard-Deviation

  基于均值和标准差就可以大致明确数据集的中心及数值在中心周围的波动情况,也可以计算正态总体的置信区间等统计量。

平均差(Mean Deviation)

  方差用取平方的方式消除数值偏差的正负,平均差用绝对值的方式消除偏差的正负性。平均差可以用均值作为参考系,也可以用中位数,这里使用均值:

Mean-Deviation

  平均差相对标准差而言,更不易受极端值的影响,因为标准差是通过方差的平方计算而来的,但是平均差用的是绝对值,其实是一个逻辑判断的过程而并非直接计算的过程,所以标准差的计算过程更加简单直接。

变异系数(Coefficient of Variation,CV)

  上面介绍的方差、标准差和平均差等都是数值的绝对量,无法规避数值度量单位的影响,所以这些统计量往往需要结合均值、中位数才能有效评定数据集的离散情况。比如同样是标准差是10的数据集,对于一个数值量级较大的数据集来说可能反映的波动是较小的,但是对于数值量级较小的数据集来说波动也可能是巨大的。

  变异系数就是为了修正这个弊端,使用标准差除以均值得到的一个相对量来反映数据集的变异情况或者离散程度:

Coefficient-of-Variation

  变异系数的优势就在于作为一个无量纲量,可以比较度量单位不同的数据集之间的离散程度的差异;缺陷也是明显的,就是无法反应真实的绝对数值水平,同时对于均值是0的数据集无能为力。

  其实这篇文章只是对基础的统计知识的整理,可以从很多资料里面找到,很多统计学的书里面都是在“统计描述”章节中介绍这些基础的统计量,跟均值、中位数、众数等一起罗列,很少通过统计量的具体应用进行分类,而国外的一些书对知识点的介绍更多的是从实际应用的角度出发的,这里推荐《深入浅出统计学》这本书,虽然介绍的都是基础的统计知识,但可读性比较强,通俗易通,相比国内的一些统计学教程,更容易在大脑中建立起有效的知识索引,在具体应用中能够更加得心应手。

距离和相似度度量

  在数据分析和数据挖掘的过程中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分类和聚类算法,如K最近邻(KNN)和K均值(K-Means)。当然衡量个体差异的方法有很多,最近查阅了相关的资料,这里整理罗列下。

  为了方便下面的解释和举例,先设定我们要比较X个体和Y个体间的差异,它们都包含了N个维的特征,即X=(x1, x2, x3, … xn),Y=(y1, y2, y3, … yn)。下面来看看主要可以用哪些方法来衡量两者的差异,主要分为距离度量和相似度度量。

距离度量

  距离度量(Distance)用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大。

欧几里得距离(Euclidean Distance)

  欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:

Euclidean Distance

  因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。

明可夫斯基距离(Minkowski Distance)

  明氏距离是欧氏距离的推广,是对多个距离度量公式的概括性的表述。公式如下:

Minkowski Distance

  这里的p值是一个变量,当p=2的时候就得到了上面的欧氏距离。

曼哈顿距离(Manhattan Distance)

  曼哈顿距离来源于城市区块距离,是将多个维度上的距离进行求和后的结果,即当上面的明氏距离中p=1时得到的距离度量公式,如下:

Manhattan Distance

切比雪夫距离(Chebyshev Distance)

  切比雪夫距离起源于国际象棋中国王的走法,我们知道国际象棋国王每次只能往周围的8格中走一步,那么如果要从棋盘中A格(x1, y1)走到B格(x2, y2)最少需要走几步?扩展到多维空间,其实切比雪夫距离就是当p趋向于无穷大时的明氏距离:

Chebyshev Distance

  其实上面的曼哈顿距离、欧氏距离和切比雪夫距离都是明可夫斯基距离在特殊条件下的应用。

马哈拉诺比斯距离(Mahalanobis Distance)

  既然欧几里得距离无法忽略指标度量的差异,所以在使用欧氏距离之前需要对底层指标进行数据的标准化,而基于各指标维度进行标准化后再使用欧氏距离就衍生出来另外一个距离度量——马哈拉诺比斯距离(Mahalanobis Distance),简称马氏距离。

相似度度量

  相似度度量(Similarity),即计算个体间的相似程度,与距离度量相反,相似度度量的值越小,说明个体间相似度越小,差异越大。

向量空间余弦相似度(Cosine Similarity)

  余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。公式如下:

Cosine Similarity

皮尔森相关系数(Pearson Correlation Coefficient)

  即相关分析中的相关系数r,分别对X和Y基于自身总体标准化后计算空间向量的余弦夹角。公式如下:

Pearson Correlation Coefficient

Jaccard相似系数(Jaccard Coefficient)

  Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。如果比较X与Y的Jaccard相似系数,只比较xn和yn中相同的个数,公式如下:

Jaccard Coefficient

调整余弦相似度(Adjusted Cosine Similarity)

  虽然余弦相似度对个体间存在的偏见可以进行一定的修正,但是因为只能分辨个体在维之间的差异,没法衡量每个维数值的差异,会导致这样一个情况:比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异不小,但显然更加符合现实。

欧氏距离与余弦相似度

  欧氏距离是最常见的距离度量,而余弦相似度则是最常见的相似度度量,很多的距离度量和相似度度量都是基于这两者的变形和衍生,所以下面重点比较下两者在衡量个体差异时实现方式和应用环境上的区别。

  借助三维坐标系来看下欧氏距离和余弦相似度的区别:

distance and similarity

  从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似度cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。

  根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。

  上面都是对距离度量和相似度度量的一些整理和汇总,在现实的使用中选择合适的距离度量或相似度度量可以完成很多的数据分析和数据挖掘的建模,后续会有相关的介绍。

合并和比较度量

——数据的上下文4

Combined-and-Comparative-Metrics  往往我们在做分析的时候需要结合各类基本的指标进行二次计算合并得到一个可以用于进行综合评价或比较的度量,这个过程中就需要涉及到一些指标的合并技巧,和比较基准的设定。其实之前“数据上下文”的系列文章中也一再强调了我们需要为指标设定合理的参考系来评价指标的趋势或表现的好坏,之前提供了一系列的方法,但这篇文章里面要介绍的方法应该是最简单方便的,同时不失实用性,得益于《用户体验度量》这本书中的介绍,所以这篇文章更像是一篇读书笔记,内容基本整理总结自《用户体验度量》第8章——合并和比较度量,当然不再局限于用户体验层面,结合了网站分析层面的思考。

  这里我根据合并和比较类型的不同将内容分成:简单合并度量目标比较百分比评分度量均值比较标准化度量组间比较与专家绩效的比较

简单合并度量目标比较

  这是一个最简洁有效的KPI评价模式。首先说下简单合并,举个例子,电子商务网站每天产生很多订单,这些订单由许许多多的网站访问带来,一旦某个访问产生了订单,我们就说这个访问产生了转化,所以最基础的统计指标没有转化率,只有网站的访问量和订单数,转化率是由“订单数/访问数”计算得到的。那么为什么要计算转化率,用订单量来评价网站绩效不是也可以吗?很简单,因为订单量会受到网站访问量的影响,而很多时候网站的访问量无法控制,所以我们不能说100次访问产生的10个订单一定比150次访问产生的15个订单要差,如果用着两个指标的合并度量——转化率来评价,显然更科学,因为都是10%,两者的绩效是相当的。

  因为合并度量,如转化率、人均消费等指标一般较为稳定,波动幅度不会太大,我们一般会将这些指标作为网站的KPI,同时我们会为每个KPI设定一个预期的目标,比如我们设定网站的转化率目标是10%,那么我们来看看网站一个月内的目标达成比例有多高:

simple-combined-metric-goal

  我们可以看到在5月份的31天时间里,有26天的转化率等于或者超过了目标值,从而目标的达成率就是83.87%(26/31),还算是一个不错的成绩。也许你的团队正在抱怨KPI太过苛刻,毕竟数据会受诸多因素的影响,要保证每天10%以上确实有难度,如果真能完全做到,那就是目标的设定过低,目标永远应该临界于可以达成和不能达成之间才是合理的,所以这里使用目标达成率来评估可能会更加合理。

百分比评分度量均值比较

  但是有的时候我们没法为每个指标设定目标,毕竟目标更多的是为了控制网站的整体绩效或者KPI,对于一些基于细分的度量,我们需要使用另外的合并和比较方法,所以就有了基于百分比的评分。

  同样很简单,百分比评分就是将指标的值都转化成百分比的形式,相当于该指标在100分制的条件下的得分有多少。如何将指标转化成为百分比的数值,一个很简单的方法就是所有的指标处于总体的最大值,这个方法对于所有大于0且分布不是特别离散的指标都是有效的。比如我们评价网站商品的质量,权衡商品的浏览量和转化率这2个指标,我们知道转化率本身就是一个百分比,但显然也是需要进行转化的,所以我们将每个商品的浏览量和转化率分别除以总体浏览量最大值和总体转化率最大值得到相应的百分比评分:

  浏览量 转化率 浏览量评分 转化率评分 评分均值
商品A 563 7% 100 78 88.9
商品B 121 9% 21 100 60.7
商品C 87 8% 15 89 52.2
商品D 367 5% 65 56 60.4

  上面的均值基于简单平均的计算,同样我们可以对各指标引入权重进行加权平均,比如我们分别给浏览量评分和转化率评分分别赋予40%和60%的权重:

  浏览量 转化率 浏览量评分 转化率评分 加权评分均值
商品A 563 7% 100 78 86.7
商品B 121 9% 21 100 68.6
商品C 87 8% 15 89 59.5
商品D 367 5% 65 56 59.4

  这样我们就可以根据最终的评分均值寻找那些高质量的商品进行推荐了。

标准化度量组间比较

  又是标准化,是不是有点看腻了,但确实它在指标合并的领域扮演着极其重要的角色,同样推荐阅读——数据的标准化这篇文章。

  方法这里不再详细介绍,还是举个例子,另外值得注意的一点就是对“逆指标”的处理,逆指标指的是那些表现的值刚好与绩效相反的指标,即值越大绩效越差,值越小绩效越好,网站分析中典型的逆指标就是Bounce Rate。因为标准化后的指标符合均值是0标准差是1的正态分布,所以对逆指标的处理只需要对标准化后的数据乘-1就可以了,也非常简单。这里以网站Landing Page优化为例,来看看如何有效地评价3个Landing Page的优化方案哪个才是最优的:

  Bounce Rate 转化率CR BR标准化 CR标准化 标准化均值
方案A 45% 8% -0.651 0.873 0.762
方案B 46% 5% -0.501 -1.091 -0.295
方案C 57% 7% 1.151 0.218 -0.467

  同样使用了求均值的方法,将各指标标准化后取均值进行比较(注意这里取均值时对BR标准化的结果乘了-1),我们就可以轻而易举的看出A方案的效果是最优的,这也是一种“目标决策”的最简单应用。这里需要注意的是指标标准化后的数值的分布是不定的,不像上面的百分比一定是在[0,100]之间,所以标准化后的数值本身不具有实际意义,只有将它放入比较环境中才有分析的价值,所以指标标准化的方法只适用于组间的比较。

与专家绩效的比较

  如果你能够得到一个对该领域的专业知识和技能非常熟悉的专家团队的支持,那么对网站的评价会容易许多,因为专家对网站的使用和评分就可以作为网站的最优标准。

  其实一般情况下我们认为专家的绩效是一个理想化的状态,比如专家能够在最短时间内通过最少的操作完成预期的任务,所以我们可以将专家组的数据作为网站可以达到的优化目标,而目前数据与专家数据的差异就是目前网站存在的优化空间,这样的分析让我们能足够明确自身在哪些模块距离最优的水平最远,同时优化的空间最大,我们完全可以从这些方面入手来实现最快最大的提升。

  除了介绍以上的度量合并比较的方法外,书中还介绍了使用柱状折线组合图和雷达图来展现多指标的比较环境,因为这些在之前的文章中都有提及,这里不再介绍了。

  其实上面介绍的都是最简单实用的指标比较处理的方法,这些方法无论在哪类公司或者哪些指标上都能够进行套用,甚至基于这些最基本的取百分比、取平均、目标比较等方法可以举一反三扩展出更加灵活有效的分析方法。这时候就需要动用你的智慧,为你的数据选择最合适的方法了。

网站分析的基本度量

metrics-of-web-analytics  我们在使用各种网站分析工具的时候,会看到很多不同的度量指标,可能不同的工具会有不同的命名和定义,这里列举一些常见的度量,简单说明一下它们是如何计算得到的。

  下面的度量都是来源于网站点击流数据,但根据点击流数据获取方式的不同(来源于网站原始日志文件或通过beacons和JavaScript的方式获取的网站日志,如同样免费的AWStats和Google Analytics)得到的度量也会有差异,某些度量只有通过特定的方式才能获得。关于网站日志的介绍,请参考这篇文章——WEB日志格式

Hits

  来源于网站原始日志,即用户浏览网站时发起的请求数,包括页面请求,也包括图片、CSS、Flash等,所以一般打开一个页面会发送多个请求,根据网页设计的差异Hits会是PV(Page Views,下面会有介绍)的N倍,比如我的博客的AWStats统计中Hits数一般是PV的3-5倍。

Page Views

  即PV,页面浏览数,页面被打开(请求)的次数,是网站分析中最常见的度量。注意Ajax架构或Flash下同一URL下可以浏览多个页面,进行多个操作,这些都无法在PV中体现。还需要注意Unique Page的定义,当一个页面被刷新多次时,其实用户浏览的始终是同一页面,所以这时的Unique Page Views还是1。

Visits

  访问量,也是常见度量之一,用于衡量用户的一次访问(从打开进入网站到离开网站,其中可能浏览了多个页面(PV))的数量,也就是网站Session的个数(关于Session,可以参考我的这篇文章——Session和Cookie的辨析)。

Unique Visitors

  UV,被用于标识访问网站的唯一用户数,关于如何识别用户,请参考这篇文章——网站用户的识别。注意一个Unique Visitors可能会有多个Visits。

Time on Page

  页面停留时间,即用户从打开页面到离开页面的时间间隔,这个度量一般只有当用户在你的网站中点击了下一个页面时才会有记录,否则是0,所以所有Visits的最后一个页面的Time on Page一般都为0,具体参见WEB日志的作用和缺陷中关于停留时间的说明。所以我们在计算页面平均停留时间(Avg. on Page)的时候一般会过滤Time on Page=0的记录。

Time on site

  即每个Visits的停留时间,一个Session的开始到结束。跟Time on Page同样需要注意其计算中存在的误差,取平均的时候注意过滤长度为1的session。

Bandwidth

  这个度量也一般只能从原始日志中获取,Bandwidth是AWStats中的命名,统计网站的流量,需要将所有请求的传输字节数相加得到结果。一般用于衡量网站的流量情况,服务器IO负荷,及某些限制了月流量最大值的虚拟主机流量使用情况。

Bounce Rate and Conversion Rate

  关于Bounce Rate ,有一句很形象的描述——“I came, I puked, I left.” 即进入你的网站,什么事都没干就直接离开了。关于Bounce Rate的注意点,请参考这篇文章——关于Bounce Rate定义的疑问

  如果一个访问没有Bounce,那么我们就可以跟踪其访问足迹统计Conversion Rate,即从上一步进入的访问率(Current Visits/ Previous Visits)。转化率对于某些网站的关键流程的优化可以起到重要作用,比如电子商务网站的购买流程等。

Entrances and Exit Rate

  Entrances一般用户衡量网站首页或Landing Page的进入情况,指First Page of Visits。Exit Rate可以作为每个页面的基本度量,衡量从该页面离开的比率,即该页面是整个Visits的最后一个页面。

Sources and Search Key Phrase

  来源于referrers的统计,Sources即网站的来源(搜索引擎、广告或其它),用于广告投放效果分析、SEM等。

  Search Key Phrase是基于来源是搜索引擎referrer的解析,统计来源的搜索关键词,Avinash Kaushik建议我们使用Key Phrase而非KeyWords。有助于SEO和发现用户需求。

Engagement

  参与度对于不同网站来说定义不一,可以是电子商务网站的购买、反馈行为,也可以是论坛的发帖、跟帖行为,还有视频网站的观看视频、游戏网站的线上游戏等。每个访问的参与度可以用Engagement Rate = Engagement Index / visits来计算,即参与度 = 参与标识/访问量。

Destinations

  即点击站外链接,一般通过JS代码来监控站外链接的点击,对于一些广告、宣传、推荐等点击情况跟踪比较有用,可以衡量网站对资源推广的能力和价值。

  上面列举的都是网站分析中一些比较基本的指标和度量,我们在网站分析过程中可以基于这些度量通过求和、比例、平均等方式获得更多我们希望得到的数据,进而为我们的分析结果提供更充分的依据。

session和cookie的辨析

  session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述和辨析,希望能与大家共同探讨下。

  session和cookie的最大区别在于session是保存在服务端的内存里面,而cookie保存于浏览器或客户端文件里面;session是基于访问的进程,记录了一个访问的开始到结束,当浏览器或进程关闭之后,session也就“消失”了,而cookie更多地被用于标识用户,它可以是长久的,用于用户跟踪和识别唯一用户(Unique Visitor)。

关于session

  session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。

session

  session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。

  但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现。

  这里有一个很关键性的注意点,即session失效时间的设置,这里要分两方面来看:浏览器端和服务端。对于浏览器端而言,session与访问进程直接相关,当浏览器被关闭时,session也随之消失;而服务器端的session失效时间一般是人为设置的,目的是能定期地释放内存空间,减小服务器压力,一般的设置为当会话处于非活动状态达20或30分钟时清除该session,所以浏览器端和服务端的session并非同时消失的,session的中断也并不一定意味着用户一定离开了该网站。目前Google Analytics和Omniture都定义当间隔30分钟没有动作时,算作一次访问结束,所以上图中session的最后一步不只是离开,也有可能是静止、休眠或者发呆的状态。

  还有一点需要注意,就是现在的浏览器好像趋向于多进程的session共享,即通过多个标签或页面打开多个进程访问同一网站时共享一个session cookie,只有当浏览器被关闭时才会被清除,也就是你有可能在标签中关闭了该网站,但只要浏览器未被关闭并且在服务器端的session未失效前重新开启该网站,那么就还是使用原session进行浏览;而某些浏览器在打开多页面时也可能建立独立的session,IE8、Chrome默认都是共享session的,在IE8中可以通过菜单栏中的文件->新建会话来建立独立session的浏览页面。

关于cookie 

cookie

  cookie 是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。用户每次访问站点时,Web应用程序都可以读取cookie包含的信息。

  session的实现机制里面已经介绍了常见的方法是使用会话cookie(session cookie)的方式,而平常所说的cookie主要指的是另一类cookie——持久cookie(persistent cookies)。持久cookie是指存放于客户端硬盘中的cookie信息(设置了一定的有效期限),当用户访问某网站时,浏览器就会在本地硬盘上查找与该网站相关联的cookie。如果该cookie 存在,浏览器就将它与页面请求一起通过HTTP报头信息发送到您的站点,然后在系统会比对cookie中各属性和值是否与存放在服务器端的信息一致,并根据比对结果确定用户为“初访者”或者“老客户”。

  持久cookie一般会保存用户的用户ID,该信息在用户注册或第一次登录的时候由服务器生成包含域名及相关信息的cookie发送并存放到客户端的硬盘文件上,并设置cookie的过期时间,以便于实现用户的自动登录和网站内容自定义。

  Apache自带的mod_usertrack模块可以在用户首次来到当前网站的时候给用户种下一个唯一的cookie(较长时间过期),这个cookie是用户首次来当前网站的IP地址加上一个随机字符串组成的。同时在自定义WEB日志中在最后增加%{cookie}n字段可以实现cookie在apache日志中的输出,用于数据统计与用户跟踪。

关于网络机器人

google-spider   网络机器人也叫网络蜘蛛(Web Spider),是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络机器人通过网页的链接地址来寻找网页,通常由网站首页开始,根据链接依次抓取网页。

  并非所有的网络机器人都是搜索引擎,同样会有翻译服务、订阅服务、阅读器等,甚至还有许多恶意机器人也会市场来访问你的网站。所以对网站中网络机器人相关的数据统计和分析也是部分必要的。

统计机器人信息的作用

  • 分析页面是否被搜索引擎编入
  • 统计搜索引擎搜索频率
  • 找出哪些页面被搜索引擎忽略了
  • 识别恶意机器人

恶意机器人行为特征

  恶意机器人对网站的负面影响有时是十分显著的,所以我们需要通过数据分析来找出它们,并且屏蔽他们的访问或抓取行为。

  通常恶意机器人通过抓取网站信息来获得用户的隐私信息,或者获取网站中受保护的或私有的信息,通过将出售这些用户信息获利;或者恶意机器人通过不断地爬取给网站造成不必要的负担,降低网站的访问性能,从而影响其他正常用户的访问。恶意机器人的行为特征主要有如下几种:

  1. 忽略robot.txt的说明;
  2. 访问robot.txt中被禁止抓取的页面;
  3. 快速地索引整个网站从而降低真正用户的性能;
  4. 通过动态页面紧跟你不想索引的链接。

识别恶意机器人的方法

  既然恶意机器人的行为对网站有害,那么我们如何有效地去识别哪些是恶意机器人呢?下面有三种常用的方法:

1) 通过Agent字段,建立网络机器人白名单;

  因为一般像google、baidu等搜索引擎的机器人都会在Agent信息中标明自己的身份,我们可以将这些机器人建立白名单,允许其对网站的访问和抓取。

2) 检查发出请求的IP和域名;

  与Agent识别类似,通过IP或者域名进行识别也是比较有效的一个方法,因为一些常见的机器人的IP地址区间及其域名都是相对固定的,网上也有相关的列表提供参考。

3) 统计所有查看过robot.txt的会话及用户。

  一般只有机器人或者某些想窥视信息的人才会访问robots.txt,通过统计网站的robots.txt被那些用户访问了,可以进一步确定是否有恶意机器人的存在。

WEB日志格式

 apache-log  WEB日志是网站分析和网站数据仓库的数据最基础来源,了解其格式和组成将有利于更好地进行数据的收集、处理和分析。

1、日志格式类型

  目前常见的WEB日志格式主要由两类,一类是Apache的NCSA日志格式,另一类是IIS的W3C日志格式。NCSA格式又分为NCSA普通日志格式(CLF)和NCSA扩展日志格式(ECLF)两类,目前最常用的是NCSA扩展日志格式(ECLF)及基于自定义类型的Apache日志格式;而W3C扩展日志格式(ExLF)具备了更为丰富的输出信息,但目前的应用并不广泛,所以这里主要介绍的是NCSA扩展日志格式(ECLF)。

2、常见日志格式的组成

  这是一个最常见的基于NCSA扩展日志格式(ECLF)的Apache日志样例:

58.61.164.141 – - [22/Feb/2010:09:51:46 +0800] “GET /reference-and-source/weblog-format/ HTTP/1.1″ 206 6326 ” http://www.google.cn/search?q=webdataanalysis” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)”

  可以看到这个日志主要由以下几个部分组成:

访问主机(remotehost)

  显示主机的IP地址或者已解析的域名。

标识符(Ident)

  由identd或直接由浏览器返回浏览者的EMAIL或其他唯一标示,因为涉及用户邮箱等隐私信息,目前几乎所有的浏览器就取消了这项功能。

授权用户(authuser)

  用于记录浏览者进行身份验证时提供的名字,如果需要身份验证或者访问密码保护的信息则这项不为空,但目前大多数网站的日志这项也都是为空的。

日期时间(date)

  一般的格式形如[22/Feb/2010:09:51:46 +0800],即[日期/月份/年份:小时:分钟:秒钟 时区],占用的的字符位数也基本固定。

请求(request)

  即在网站上通过何种方式获取了哪些信息,也是日志中较为重要的一项,主要包括以下三个部分:

  请求类型(METHOD)

  常见的请求类型主要包括GET/POST/HEAD这三种;

  请求资源(RESOURCE)

  显示的是相应资源的URL,可以是某个网页的地址,也可以是网页上调用的图片、动画、CSS等资源;

  协议版本号(PROTOCOL)

  显示协议及版本信息,通常是HTTP/1.1或HTTP/1.0。

状态码(status)

  用于表示服务器的响应状态,通常1xx的状态码表示继续消息;2xx表示请求成功;3xx表示请求的重定向;4xx表示客户端错误;5xx表示服务器错误。

传输字节数(bytes)

  即该次请求中一共传输的字节数。

来源页面(referrer)

  用于表示浏览者在访问该页面之前所浏览的页面,只有从上一页面链接过来的请求才会有该项输出,如果是新开的页面则该项为空。上例中来源页面是google,即用户从google搜索的结果中点击进入。

用户代理(agent)

  用于显示用户的详细信息,包括IP、OS、Bowser等。

3、日志格式扩展

  apache日志格式可以自定义来配置其输出格式,常见的基于NCSA扩展日志格式(ECLF)自定义添加的包括域名(domain)cookie。其中域名在一个网站拥有二级域名或者子域名时,可以更好地区分日志;而cookie可以作为用户的身份标识。其他具体的自定义信息详见:Custom Log Formats