前天参加面试的时候被问了一个题:选择什么样的指标来代表总体情况?我回答的不是很好,具体怎么回答的记不太清了,感觉回答的不是很好。回来后吸取教训,查了查资料简单总结:

如果是类别变量,可以用众数来代表总体。

如果是连续变量,可以用平均数或中位数来代表总体。如果数据的异常值、极端异常值比较多,那么尽可能使用中位数;如果没有太明显的异常值,平均数更具有代表性。

那这里就引申出一个问题,异常值的识别。异常值(outlier)是数据清洗的重要环节,异常值可能直接会导致后面的数据分析、建模工作出现偏差,因为像AdaBoost、GBDT等都对异常值很敏感。

异常值甄别

1、3σ准则

如果样本是正态分布或近似正态分布,可以考虑使用3σ方法,认为99%以上的数据集中在均值上下3个标准差的范围内。具体来说,数值分布在(μ-3σ,μ+3σ)中的概率为99.73%,超过这个范围的极大或极小值,那就是异常值了。

实例

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

# 导入试验数据

df = pd.read_csv(r'F:\数据分析项目\游戏数据分析\野蛮时代数据分析\tap_fun_train.csv')

# 从中取出100个数,先做一个直方图看看分布状态

df = df[df['wood_add_value']>0].head(100)

sns.distplot(df['wood_add_value'])

从图上看出来,其实不算是很标准的正态分布,但就凑合用吧,能说明排查方法和过程就好。

计算均值。a = df['wood_add_value'].mean(),均值为781190.89。

然后计算标准差。b = df['wood_add_value'].std(),标准差为2196896.04。

计算排查范围:(a-3*b, a+3*b)得到结果:(-5809497.23,7371879.01)。

使用上述区间作为条件进行筛选就可以,df[(df['wood_add_value']>7371879)|(df['wood_add_value'],得出异常值为:15968730、9669530、8668980。

2、使用箱型图

箱形图(Box-plot)又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。(百度百科)

还是以wood_add_value为例,因为由于这个数值受要塞等级bd_stronghold_level的影响非常大,所以做了不同要塞等级的箱型图分布。

使用seaborn绘图

df2 = df[df['wood_add_value']>0] # 没有任何数值记录说明没玩游戏,所以没有分析的意义

plt.figure(figsize = (18,8))

sns.boxplot(x = df2['bd_stronghold_level'],y = df2['wood_add_value'])

随便选其中的一个等级,比如就15级吧,说明箱型图的意义。

df3 = df2[df2['bd_stronghold_level']==15]

plt.figure(figsize = (8,6))

sns.boxplot(x = df3['bd_stronghold_level'],y = df3['wood_add_value'],width = 0.2)

非异常值的范围都在上限和下限之间,超出上限和下限的就定位为异常值。中位数在“箱子”的下部,说明总体数据偏大;如果中位数在箱子的上部,说明总体数据偏小。

使用DataFrame自带的绘图工具

这种方法不仅可以绘图,还可以方便的输出具体的异常值是哪些。

由于只有DataFrame格式可以使用,所以数据不能是Series格式

df4 = df3[['bd_stronghold_level','wood_add_value']]

plt.figure(figsize = (8,6))

outlier = df4.boxplot(return_type = 'dict')

x = outlier['fliers'][1].get_xdata() # 这个get_xdata我不太清楚啥意思,可能是表示哪一个column的异常值。

y = outlier['fliers'][1].get_ydata() # 具体的异常值是什么

y1 = list(y)

print(y1)

Out[92]: [327291568.0, 539691776.0, 765436570.0, 498063299.0]

最后得出15级要塞的wood_add_value的异常值是这些:[327291568.0, 539691776.0, 765436570.0, 498063299.0]。实际处理中,除了箱型图进行客观的排查,还可以加入主观判断,对于超出范围的值,如果超出范围不是非常大,可以看做正常值。

异常值处理

异常值已经被找出来了,那么怎么处理呢?实际处理中没有固定的方法,要根据分析的目的来确定。

删除。如果想找出一般的规律,而且异常值也不太多,可以考虑删除。因为异常值可能会影响结论。很多节目中计算选手最后得分往往去掉一个最高分,去掉一个最低分,可能就是这个道理。比如我们现在研究就是要塞等级bd_stronghold_level为15级的玩家的道具消耗特征,这时候异常值显然会拉高整体的水平,影响判断,所以可以考虑删除,我们要了解大多数玩家。

放任不管。因为异常值代表的也是真实发生的事件,背后是具体的行为。有些值即使异常,也不会影响模型。比如我们研究wood_add_value和pay_price的关系,想做回归分析,也就是看道具消耗和充值金额的因果关系。我们能够很清楚的看到刚才找到的wood_add_value的4个异常值,虽然他们游离于群体之外,但是在对pay_price进行拟合的时候并没有使模型造成太大偏差。所以这种异常值对我们的模型来说很合理。

plt.figure(figsize = (12,6))

plt.subplot(1,2,1)

sns.scatterplot(x='wood_add_value', y='pay_price',data = df3)

plt.subplot(1,2,2)

sns.regplot(x='wood_add_value', y='pay_price',data = df3)

视为缺失值进行填充。因为贸然删除数据可能会损失信息,而如果放任不管可能又影响我们的模型,所以可以考虑用均值、临近值进行填充。如下面这个例子,依旧是用wood_add_value对pay_price进行回归预测(样本不一样了)。从图上看绿圈和红圈那两个点,有可能会影响回归线的方向(蓝色线是python拟合的,绿线和红线是我自己画的)。所以这种异常值还是处理掉比较好。

sns.scatterplot(x='wood_add_value', y='pay_price',data = df2)

异常值到底该怎么处理,我也在学习。在用户分层的时候,发现异常值代表了一些极端的高价值用户,ARPU可能是平均水平的几千倍,可能也是需要把极端值单独提取出来,对用户进行实时的“监控”,这类用户流失造成的损失实在太大了。还有就是异常值的甄别和处理可能还有很多其他方法,目前我也还没学,暂且如此吧,且用且学且记。

matlab 离群值去除方法,数据清洗中异常值(离群值)的判别和处理方法相关推荐

  1. html整体页面缩放的方法,html5中让页面缩放的4种方法

    1.viewport 这种方法,不是所有的浏览器都兼容 2.百分比 这种方法,可以兼容大部分浏览器,但是修改幅度比较大 .main .login .txt1{margin-top:8.59375%; ...

  2. js 改变change方法_Linux 中改变主机名的 4 种方法 | Linux 中国

    今天,我们将向你展示使用不同的方法来修改主机名.你可以从中选取最适合你的方法.-- Magesh Maruthamuthu 昨天我们已经在我们的网站中写过如何在 Linux 中修改主机名的文章[1]. ...

  3. Linux中增加软路由的两种方法,Linux中增加软路由的三种方法

    # route add –net IP netmask MASK eth0 # route add –net IP netmask MASK gw IP # route add –net IP/24 ...

  4. android集合方法,android中intent传递list或者对象的方法

    本文实例讲述了android中intent传递list或者对象的方法.分享给大家供大家参考.具体实现方法如下: 方法一: 如果单纯的传递List 或者List的话 就可以直接使用 代码如下: inte ...

  5. java里break的使用方法_java中break,continue,return使用方法

    break , continue 和 return 的使用方法: 1.break 的作用 a. 跳出当前循环: b. 但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环 ...

  6. 数据清洗中异常值(离群值)的判别和处理方法

    前天参加面试的时候被问了一个题:选择什么样的指标来代表总体情况?我回答的不是很好,具体怎么回答的记不太清了,感觉回答的不是很好.回来后吸取教训,查了查资料简单总结: 如果是类别变量,可以用众数来代表总 ...

  7. list contains方法_Java中给List去重的5种方法,谁的效率更高?

    刚开始学习list的时候就学习了在list集合中如何去除重复数据,当时第一想到的就是通过循环判断来去除重复数据,后来慢慢接触的东西多了,就开始注重一个效率,当数据量巨大的时候,怎么样才能查的更快,怎样 ...

  8. python数据预处理的方法_python中常用的九种数据预处理方法

    python中常用的九种预处理方法分享 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(Standardizat ...

  9. easyui 调用dialog中的方法_SolidWorks中标准件库的创建及调用方法

    在使用SolidWorks进行产品设计时,常用的标准件(如螺栓.螺母.垫圈等)通常可以在安装了SolidWorksToolbox插件后调出使用,而许多标准件在Toolbox并不存在,不能从插件中直接调 ...

最新文章

  1. 我在CSDN的第一个1024
  2. k近邻法matlab_机器学习系列(一)K近邻算法(KNN,KNearestNeigh
  3. The operation couldn’t be completed. (LaunchServicesError error 0.)
  4. iOS开发学习之MapKit - 获得在MapView(地图)中显示多个标记的区域(MKCoordinateRegion)...
  5. 关于Ajax和@RequestBody配合使用的问题
  6. it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式
  7. AAAI'22 Oral | 复旦x字节等提出:基于无监督编辑的反事实故事改写
  8. Amoeba Architecture
  9. 18.UNIX 环境高级编程--终端IO
  10. linux下Vim的使用
  11. 大白话聊聊Java并发面试问题之谈谈你对AQS的理解?
  12. 自定义TextView显示指定行数
  13. 黑客社会工程学攻击特别危险,你知道多少?
  14. python解析本地HTML文件
  15. iTest使用说明_V4.5.1
  16. MATLAB 调用cplex解二次规划,【Cplex for MATLAB】安装问题以及二次规划的源码解释问题...
  17. Java之旅-Day3
  18. 【MySQL--03】表的操作
  19. Hive left semi join ,select 和 where中不能出现右表字段/不会生成笛卡尔积
  20. 计算机选择题7,计算机选择题7.doc

热门文章

  1. 从李子柒到张同学,田园乡村成创业热土?
  2. anyRTC2020年 年终总结
  3. 图论(十三)——平面图和对偶图
  4. tableau过期解决办法
  5. 用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)
  6. 怎样让计算机背景图片变大,电脑上如何使照片调成1寸??excel调整背景图片大小...
  7. stable diffusion文字转图片(教程)
  8. cocos2d-x 使用 CCScale9Sprite 实现微信对话框
  9. 元柚话TK:海外抖音TikTok+独立站如何搭建?
  10. xp开机加载个人设置很慢的解决方法