威尼斯人线上娱乐

线性关系衡量,躲开平平均数量骗局

6 4月 , 2019  

多年来不清楚写什么了,基本python的各类成效百度时而,都能搜到一大把,近日itchat好像非常火,可是对这些不是很胸口痛,等之后有趣味或然用的上的时候钻探钻探
准备把总括方面包车型地铁事物再看看,就写一些简便的统总结法吧,其实这么些在python里面都有现成的,不过有句名言“不要只会用,还要驾驭原理”(是哪位名家说的?假诺未有,那即使自个儿说的了),所以写那么些供就学之用。那么从头再来,奉公守法,先写那一个,本来想写个对数函数的,结果发现真TM难,假如哪个人能写出来麻烦告知下,笔者也膜拜大神一下
壹、算数平平均数量
二、算数等分回报
3、中位数
4、众数
5、极差
陆、陆分位数
线性关系衡量,躲开平平均数量骗局。⑦、几何平均数
八、几何平均回报

文/明道先生软件 胡晨川 个人公众号“川术”

三番五次统总计法,此次也没怎么尤其的,还没到那么透彻,也是相比较基础的
1、方差-样本
2、协方差(标准差)-样本
叁、变异全面
4、相关系数

如何描述数据是一个很风趣的政工,那里根本记录多少个大约并且常用的定义,用原生的python达成

九、对数(没写出来)
上面上代码,和过去相同,含表明,为了更易于领会,就不直接用函数了,尽量用最原始的语法写

威尼斯人线上娱乐 1

照例是先造个list,此番把这么些效应写个函数,方便现在调用,其它上壹篇写过的函数此次也会继续
def create_rand_list(min_num,max_num,count_list):
  case_list = []
  while len(case_list) < count_list:
    rand_float = random.uniform(min_num,max_num)
    if rand_威尼斯人线上娱乐 ,float in case_list:
      continue
    case_list.append(rand_float)
  case_list = [round(case,2) for case in case_list]
  return case_list

平均数

import random

case_list = [] #准备个容器,放样例
#随机生成10个1到30的小数,不能重复,把10个小数放到容器里
while len(case_list) < 10:
  rand_float = random.uniform(1,30)
  if rand_float in case_list:
    continue
  case_list.append(rand_float)
case_list = [round(case,2) for case in case_list] #格式化一下,不然太长不好看,当然这个因需要而定,我为了显示好看,所以格式化保留两位小数
#我先执行了个结果
print case_list #结果是,[5.77, 27.21, 27.12, 12.65, 23.12, 25.56, 18.6, 23.75, 4.1, 25.13]
case_list[6] = 23.12 #为了后面众数,弄个相同值出来
print str(case_list) #单独打下面了,方便看
'[5.77, 27.21, 27.12, 12.65, 23.12, 25.56, 23.12, 23.75, 4.1, 25.13]'
case_list.sort() #排序,这个算法有很多,单独写,不在这里啰嗦
#先写个累加函数,为了方便,就不try了,默认输入的结果都是对的
def sum_fun(xlist):
  n = 0
  for x in xlist:
    n += x
  return n
#统计数据量函数
def len_fun(xlist):
  n = 0
  for x in xlist:
    n += 1
  return n
#累乘,和累加一样
def multiply_fun(xlist):
  n = 1
  for x in xlist:
    n *= x
  return n

#1、算数平均数:加和/个数
def sum_mean_fun(case_list):
  sum_mean_num = sum_fun(case_list)/len_fun(case_list)
  return sum_mean_num #结果是19.753

#2、算数平均数回报,平均回报率计算,
def sum_mean_rate(case_list):
  '((case_list[1]-case_list[0])/case_list(0)+(case_list[2]-case_list[1])/case_list(1)+...(case_list[n]-case_list[n-1])/case_list(n-1))/len(case_list-1)'
  n = 1
  rate_return = [] #存放回报率
  while n < len_fun(case_list):
    rate = (case_list[n] - case_list[n-1])/case_list[n-1]
    rate_return.append(rate)
    n += 1
  mean_rate_num = sum_fun(rate_return)/len_fun(rate_return)
  return mean_rate_num

#3、中位数,list中间的数,如果count是基数index = len(list)/2,如果是偶数index1 = (len(list)/2 index2 = (len(list)/2)+1)    
def median_fun(case_list):
  if len_fun(case_list)%2 == 1:
    median = case_list[(len_fun(case_list)+1)/2-1]
  else:
    median = (case_list[len_fun(case_list)/2-1] + case_list[len_fun(case_list)/2])/2
  return median

#4、众数,存在最多的数
def modes_fun(case_list):
  case_list_delre = list(set(case_list)) #去重,这个如果自己写的话可以用分治法,有兴趣的话可以自己写个
  count_max = 0
  for case_part in case_list_delre:
    case_count = case_list.count(case_part)
    if case_count > count_max:
      count_max = case_count
      max_return = case_part
  if count_max == 1:
    return None
  mode = max_return
  return mode

#5、极差,最大-最小,因为已经拍好序,所以index min - index max
def ext_minus_fun(case_list):
  ext_minus_num = case_list[len_fun(case_list)-1] - case_list[0]
  return ext_minus_num

#6、四分位数,箱图用的,可以避免极值的影响,分别是index1 = len(list)/4 index2 = 3*len(list)/4
def four_bit_fun(case_list):
  Q1 = case_list[len_fun(case_list)/4]
  Q2 = case_list[3*len_fun(case_list)/4]
  return Q1,Q2

#7、几何平均数,和算数平均数不同,把所有都乘过^(1/len(list))
def geom_mean_fun(case_list):
  geom_mean_num = multiply_fun(case_list) ** (1.0/len_fun(case_list))
  return geom_mean_num

#8、几何平均回报,R = 回报,((1+R1)(1+R2)...(1+Rn))^1/(len(count(R))-1)
def geom_mean_rate(case_list):
  n = 1
  rate_return = [] #存放回报率
  while n < len_fun(case_list):
    rate = (case_list[n] - case_list[n-1])/case_list[n-1]
    rate_return.append(rate)
    n += 1
  rate_return = [1+rate for rate in rate_return]
  geom_mean_rate_num = multiply_fun(rate_return) ** (1.0/len_fun(rate_return)) - 1
  return geom_mean_rate_num

# 验证
if __name__ == '__main__':
  rand_list = create_rand_list(1,30,10)
  rand_list.sort()
  print rand_list
  sum_mean_num = sum_mean_fun(rand_list)
  print sum_mean_num
  mean_rate_num = sum_mean_rate(rand_list)
  print mean_rate_num
  median_num = median_fun(rand_list)
  print median_num
  modes_num = modes_fun(rand_list)
  print modes_num
  ext_minus_num = ext_minus_fun(rand_list)
  print ext_minus_num
  four_bit_q1,four_bit_q2 = four_bit_fun(rand_list)
  print four_bit_q1
  print four_bit_q2
  geom_mean_num = geom_mean_fun(rand_list)
  print geom_mean_num
  geom_mean_rate_num = geom_mean_rate(rand_list)
  print geom_mean_rate_num

平均数总结的目标,是用来判断三个行列的集中方向,进而对数据完全有3个靠边的体味。渴求二个种类的平平均数量,主流算法其实有二种:算术平平均数量,中位数,众数。

上边是历史函数
sum_fun() #累加
len_fun() #总括个数
multiply_fun()
#累乘
sum_mean_fun()
#算数平平均数量
sum_mean_rate()
#算数平平均数量总括回报
median_fun()
#中位数
modes_fun() #众数
ext_minus_fun()
#极差
geom_mean_fun()
#几何平平均数量
geom_mean_rate()
#几何平均回报

算数平平均数量
sum = 0
for x in data: 
  sum += x
avg = sum/len(data)

 

算术平平均数量即我们用得最多的,多少个数加总后除以个数;而中位数是连串中的数进行高低排序后,排行在中等的数(若连串中数值个数是偶数,则取排行在中游的七个数的算数平平均数量);而众数是指种类中冒出频率最高的不胜数。

新函数代码

几何平均数
import math
sum = 1
for x in data:
  sum *= x
avg = math.pow(sum, 1/len(data))

二种算法在excel中对应的函数是average(),median()和mode()

import random

# 先生成一个随机list,已有函数,不赘述
rand_list = [15.79, 6.83, 12.83, 22.32, 17.92, 6.29, 10.19, 10.13, 24.23, 25.56]

# 1、方差-样本S^2,list中的每个元素减整个list的平均数的平方累加,结果比个数-1,方差总量不-1
def var_fun(rand_list):
  mean_num = sum_mean_fun(rand_list) #计算平均数
  len_num = len_fun(rand_list) #计算总量
  var_list = [(x-mean_num)**2 for x in rand_list]
  var_sum = sum_fun(var_list)
  var_num = var_sum/(len_num - 1)
  return var_num

# 2、协方差(标准差)-样本S,这个简单,用方差开平方就可以了
def covar_fun(rand_list):
  var_num = var_fun(rand_list)
  covar_num = var_num ** 0.5
  return covar_num

# 3、变异系数CV,变异程度度量,协方差/算数平均数*100%
# 说明(百度百科):在进行数据统计分析时,如果变异系数大于15%,则要考虑该数据可能不正常,应该剔除
def  trans_coef_fun(rand_list):
  covar_num = covar_fun(rand_list)
  mean_num = sum_mean_fun(rand_list)
  trans_coef_num = covar_num / mean_num
  return trans_coef_num

# 4、相关系数-样本r,表示两个维之间的线性关系,-1 < r < 1,越接近1关系维间的关系越强
#    因为是两个维,因此需要输入两维的list,算法比较麻烦
'''
((x1-mean(x))(y1-mean(y))+(x2-mean(x))(y2-mean(y))+...(xn-mean(x))(yn-mean(y)))
/((x1-mean(x))^2+(x2-mean(x))^2+...(xn-mean(x))^2)^0.5*((y1-mean(y))^2+(y2-mean(y))^2+...(yn-mean(y))^2)^0.5
'''
x_list = rand_list
y_list = [4.39, 13.84, 9.21, 9.91, 15.69, 14.92, 25.77, 23.99, 8.15, 25.07]
def pearson_fun(x_list,y_list):
  x_mean = sum_mean_fun(x_list)
  y_mean = sum_mean_fun(y_list)
  len_num = len_fun(x_list)
  if len_num == len_fun(y_list):
    xy_multiply_list = [(x_list[i]-x_mean)*(y_list[i]-y_mean) for i in range(len_num)]
    xy_multiply_num = sum_fun(xy_multiply_list)
  else:
    print 'input list wrong,another input try'
    return None
  x_covar_son_list = [(x-x_mean)**2 for x in x_list]
  y_covar_son_list = [(y-y_mean)**2 for y in y_list]
  x_covar_son_num = sum_fun(x_covar_son_list)
  y_covar_son_num = sum_fun(y_covar_son_list)
  xy_covar_son_multiply_num = (x_covar_son_num ** 0.5) * (y_covar_son_num ** 0.5)
  pearson_num = xy_multiply_num / xy_covar_son_multiply_num
  return pearson_num

两种算法各有特点,也各有利用规范。算数平平均数量的选拔,有时侯会把您带坑里。小编用近日赶上的二个案例,来说说怎么要选择中位数。

 

用中位数来制止算数平平均数量陷阱

中位数数的盘算办法,小编用上面1段python的代码表示,程序员们也许更加好明白:

def Median(a):

a = sorted(a)

l = len(a)

l2 = l / 2

return a[l2] if l % 2 else (a[l2] + a[l2 – 1]) / 2.0

(小说最后附录中自个儿列出了sql语句计算中位数的不二等秘书籍)

不久前在做明道(英文名:míng dào)crm中的总括模块,总括订单承担周期时,遇到了算数平平均数量陷阱:

譬如说,有个别销售在6月份签了5单,每单的周期是order_period=[15,18,26,30,365]。当中有3个订单是二〇一八年注册的头脑(小可能率事件),由此周期的算数平平均数量90.八。在此之前成单周期水平都在三个月左右的人,在这些月突然成为了八个月,那个数值肯定是有失公正的。那样的巨幅变化,也会给销售决策造成干扰(对数据总体的体会被扭转了)。因为365以此特大值,拉高了总体种类的算数平平均数量,使得数据失真。那就是算数平平均数量的弊端。

取用中位数,便排除了特数值带来的熏陶。纵使有一单是二〇一八年的端倪,那位顾问的成单周期是二陆,依旧是正规水平。

算数平均数与中位数的咬合

而算数平平均数量也有它的优势,它是集中全数数值音信后,计算的集聚方向,只要不出现极度值,它的精确度是超过中位数的。所以,算数平平均数量和中位数怎样构成吗?

crm成单周期的计算,又引发出另贰个标题:从哪个层面来测算中位数?

大家的测算其实有四级:

合营社销售部宏观的成单周期➡️各种城市分行的成单周期➡️种种销售团队的成单周期➡️个人的成单周期。

一经每一流都盘算中位数,显著是超负荷分散的。小编动用的法子是在民用这一级取中位数,之后的享有层级都取算数平平均数量。

但这依旧反常的:

民用成单量相比较少的气象下,总计中位数也会不客观。比如,有些组织多人,各种人周期种类分别是[2,300,200],[一5,3],[5,1四,二陆],中位数分别是200,1四,1四,算共青团和少先队算数平平均数量时,依然未有排除掉极值的震慑。

之所以,最合理的不二等秘书诀也许是:

人均订单数超越5单的团队,总结一流中位数;而人均订单数小于伍的团伙,总括两级中位数。

当然,那里组合的章程就要求读者您依照自个儿工作景况来定了。

众数如今自笔者还未曾用上,它1般会用在离散型种类且数值个数较多的时候。

附录:

sql语句中就像是从未直接计算中位数的措施,小编这边从网上找了一段,个人读后感觉是可靠的,也贴出来,供我们明白。回顾的说,它是应用三个子查询来测算,1个子查询用来排序,1个子查询用于计算总数,然后依据总数的
奇/偶,来支配如何行要求开始展览总结。

SELECT

data_with_rownumber.Name,

AVG(data_with_rownumber.val) AS median

FROM

(

SELECT

ROW_NUMBER() OVER(PARTITION BY Name ORDER BY val) AS seq,

Name,val

FROM

test_median

) data_with_rownumber

JOIN

(

SELECT

Name, COUNT(1) AS NumOfVal

FROM

test_median

GROUP BY

Name

) data_count

ON

(

data_count.Name = data_with_rownumber.Name

AND

(

(data_count.NumOfVal % 2 = 0 AND data_with_rownumber.seq

IN (data_count.NumOfVal / 2, (data_count.NumOfVal / 2) + 1))

OR

(data_count.NumOfVal % 2 = 1

AND

data_with_rownumber.seq = 1 + data_count.NumOfVal / 2)

)

)

GROUP BY

data_with_rownumber.Name


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图