澳门至尊网站-首页

您的位置:澳门至尊网站 > 免费资源 > 统总计法_查究性计算,数据产品开辟前的必修课

统总计法_查究性计算,数据产品开辟前的必修课

2019-10-21 07:01

近几来不知晓写什么了,基本python的种种成效百度时而,都能搜到一大把,目前itchat好像非常火,可是对那个不是非常高烧,等之后有意思味或许用的上的时候研究商讨
希图把计算方面包车型大巴东西再看看,就写一些简便的统总结法吧,其实那几个在python里面皆有现存的,不过有句名言“不要只会用,还要驾驭原理”(是哪位有名的人说的?若无,那固然本人说的了),所以写这几个供就学之用。那么重头开始,按部就班,先写这几个,本来想写个对数函数的,结果开采真TM难,如果什么人能写出来麻烦告知下,作者也敬拜大神一下
1、算数平平均数量
2、算数平分回报
3、中位数
4、众数
5、极差
6、陆分位数
7、几何平平均数量
8、几何平均回报

文/明道(Mingdao)软件 胡晨川 个人民众号“川术”

9、对数(没写出来)
下边上代码,和现在生龙活虎律,含表明,为了更易于领会,就不直接用函数了,尽量用最原始的语法写

图片 1

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

平平均数量总结的目标,是用来判定贰个队列的汇总方向,进而对数据总体有一个客观的回味。要求贰个行列的平平均数量,主流算法其实有三种:算术平平均数量,中位数,众数。

 

算术平平均数量即我们用得最多的,多少个数加中国人民解放军总后勤部除以个数;而中位数是序列中的数举办高低排序后,排行在中游的数(若类别中数值个数是偶数,则取排行在个中的四个数的算数平平均数量);而众数是指种类中冒出频率最高的不胜数。

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

三种算法各有特点,也各有利用标准。算数平平均数量的选拔,一时侯会把您带坑里。笔者用近来境遇的三个案例,来讲说怎么要选取中位数。

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

中位数数的计算方法,作者用下面生意盎然段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语句总计中位数的主意)

如今在做明道crm中的计算模块,总结订单承担周期时,蒙受了算数平平均数量陷阱:

举例,有些发售在10月份签了5单,每单的周期是order_period=[15,18,26,30,365]。在那之中有贰个订单是2018年登记的线索(小概率事件),因而周期的算数平平均数量90.8。以前成单周期水平都在一个月左右的人,在这里个月顿然形成了三个月,那几个数值鲜明是有失公正的。那样的巨幅变化,也会给出售决策形成压抑(对数码全部的体会被扭曲了)。因为365以此宏大值,拉高了整整种类的算数平平均数量,使得数据失真。那正是算数平平均数量的缺欠。

取用中位数,便排除了特数值带来的震慑。纵使有风度翩翩单是去年的头脑,这位顾问的成单周期是26,仍然是常规水平。

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

而算数平平均数量也可能有它的优势,它是汇聚全体数值消息后,总括的汇总趋势,只要不出现特别规值,它的正确度是当先中位数的。所以,算数平均数和中位数怎么着构成吗?

crm成单周期的总结,又引发出另一个难点:从哪些层面来总括中位数?

我们的精兵简政其实有四级:

商店出卖部宏观的成单周期➡️各个城市分行的成单周期➡️各类发售团队的成单周期➡️个人的成单周期。

假设每一级都划算中位数,鲜明是超负荷分散的。作者利用的办法是在民用那一级取中位数,之后的具有层级都取算数平平均数量。

但那依然临时的:

个体成单量少之又少的事态下,总括中位数也会不客观。举个例子,有些组织四人,各种人周期体系分别是[2,300,200],[15,3],[5,14,26],中位数分别是200,14,14,算团队算数平平均数量时,依旧没有撤消掉极值的熏陶。

就此,最说的有道理的情势也许是:

人均订单数超越5单的团队,总结超级中位数;而每人平均订单数小于5的团伙,总计两级中位数。

自然,这里组合的艺术就须要读者您依照自身工作意况来定了。

众数近年来本身还尚无用上,它日常会用在离散型体系且数值个数很多的时候。

附录:

sql语句中就如未有平素总计中位数的方法,小编那边从互连网找了朝气蓬勃段,个人读后感到是可相信的,也贴出来,供大家了然。总结的说,它是运用2个子查询来测算,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

本文由澳门至尊网站发布于免费资源,转载请注明出处:统总计法_查究性计算,数据产品开辟前的必修课

关键词: