> fivenum(1:7587)
[1] 1.0 1897.5 3794.0 5690.5 7587.0
である(わざと変な個数の数列にしておく)
Python では,scipy.stats.scoreatpercentile() とか,numpy.percentile() がある。
>>> import numpy as np
>>> from scipy.stats import scoreatpercentile
>>> x = np.arange(7587)+1
>>> scoreatpercentile(x, [25, 75], interpolation_method='fraction')
array([1897.5, 5690.5])
>>> scoreatpercentile(x, [25, 75], interpolation_method='lower')
array([1897., 5690.])
>>> scoreatpercentile(x, [25, 75], interpolation_method='higher')
array([1898., 5691.])
>>> np.percentile(x, [25, 75], interpolation = 'linear')
array([1897.5, 5690.5])
>>> np.percentile(x, [25, 75], interpolation = 'lower')
array([1897, 5690])
>>> np.percentile(x, [25, 75], interpolation = 'higher')
array([1898, 5691])
>>> np.percentile(x, [25, 75], interpolation = 'midpoint')
array([1897.5, 5690.5])
>>> np.percentile(x, [25, 75], interpolation = 'nearest')
array([1897, 5691])
ということで,np.percentile() の interpolation = ' midpoint' のようだ
と,書いたけどちょっと違うみたいなので,R の fivenum() を Python に移植した
import math
def fivenum(x):
n = len(x)
x = sorted(x)
n4 = ((n + 3)//2)/2
return 0.5 * (x[math.floor(n4 - 1)] + x[math.ceil(n4 - 1)]), 0.5 * (x[math.floor(n - n4)] + x[math.ceil(n - n4)])