如何根据平均值、中位数、第 1 和第 9 个十分位数值生成数据集?



我有以下值来描述数据集:

Number of Samples: 5388
Mean: 4173
Median: 4072
1st Decile: 2720
9th Decile: 5676

我需要生成任何符合这些值的数据集。我发现的所有例子都要求你有标准偏差,而我没有。如何做到这一点?谢谢

有趣的问题!根据斯科特的建议,我快速尝试了一下。

输入:

import random
import pandas as pd
import numpy as np
# fixing the random seed
random.seed(a=1, version=2)
# formating floats
pd.options.display.float_format = '{:.1f}'.format
# given inputs
count = 5388
mean = 4173
median = 4072
lower_percentile = 10
lower_percentile_value = 2720
upper_percentile = 90
upper_percentile_value = 5676
max_value = 6325
min_value = 2101

功能:

def generate_dataset(count, mean, median, lower_percentile, upper_percentile,
lower_percentile_value, upper_percentile_value,
min_value, max_value
):

# Calculate the number of values that fall within each percentile
p_1_size = int(float(lower_percentile) * float(count) / 100)
p_4_size = int(count - (float(upper_percentile) * float(count) / 100))
p_2_size = int((count / 2) - p_1_size)
p_3_size = int((count / 2) - p_4_size)

# can be used to adjust the mean
mean_adjuster = 5790
# randomly pick values of right size from a range 
p_1 = random.choices(range(min_value, lower_percentile_value), k=p_1_size)
p_2 = random.choices(range(lower_percentile_value, median), k=p_2_size)
p_3 = random.choices(range(median, mean_adjuster), k=p_3_size)
p_4 = random.choices(range(upper_percentile_value, max_value), k=p_4_size)

return p_1 + p_2 + p_3 + p_4

dataset = generate_dataset(
count, mean, median, lower_percentile, upper_percentile,
lower_percentile_value, upper_percentile_value, min_value, max_value
)

对比:

# converting into DataFrame
df = pd.DataFrame({"x": dataset})
new_count = len(df)
new_mean = np.mean(df.x)
new_median = np.quantile(df.x, 0.5)
new_lower_percentile = np.quantile(df.x, lower_percentile/100)
new_upper_percentile = np.quantile(df.x, upper_percentile/100)
compare = pd.DataFrame(
{
"value": ["count", "mean", "median", "low_p", "high_p"],
"original": [count, mean, median, lower_percentile_value, upper_percentile_value],
"new":[new_count, new_mean, new_median, new_lower_percentile, new_upper_percentile]
}
)
print(compare)

输出:

value  original    new
0   count      5388 5388.0
1    mean      4173 4173.4
2  median      4072 4072.5
3   low_p      2720 2720.4
4  high_p      5676 5743.0

当所有的值都是整数而不是浮点值时,使值完全相等有点棘手。。

您可以添加另一个变量来控制两个数字的平均值,或者更改随机种子,看看是否可以获得更接近的值。或者,您可以编写一个函数来更改种子,直到值相等。(可能需要几分钟或几个世纪:(

干杯!

中值固定5388/2~2694和5388/2+1~2695值(中间值(。所以,让我们把它们都做成4072。第1个和第9个十分位数固定第5388/10~538.8个和第9*5388/10~44849.2个值。十分位数有多种流行公式,但将第538个和第539个值都设置为2720是安全的。通过将4849和4850的值固定为5676,我们可以类似地获得正确的第9个十分位数。平均值提供了少一个自由度,但计算平均值涉及整个数据集的实际值,所以我们将推迟到稍后。首先,我们需要做的是使537个值低于2719。(几乎(怎么做并不重要,但把它们调得很低可能会很好(稍后解释(。然后,我们需要使2693-539(固定的第一个十分位数和固定的中值之间的值的数量(的值在2720(第一个十分位(和4072(中值(之间。然后使4848-2695的值介于4072和5676之间。我们现在需要5388-4880(值的总数减去第9个十分位数和更低的值(大于5676的值,但请记住,我们还需要设置平均值。实际上有无数种方法可以做到这一点,但有一种方法是简单地使第9个十分位数以上的所有值相同。要做到这一点,我们可以计算较低4850个值的平均值(我们已经有了(,并认识到(5388-4850(*X+4850*M=4173,其中M是较低的4850个的平均值。求解X以获得所需的值。由于X必须大于5676,因此如果将第一个十分位数以下的值设置为小值会很有帮助,因为这给了我们一些余地。另一种方法是为这些值中除一个之外的所有值选取高于5676的随机数,然后以固定平均值的方式选取最后一个值(同样,明智的做法是将随机值选取为不远高于5676,因为最后剩余的值可以任意大以将平均值拖动到正确的值(。

无论如何,在numpy中,您只会生成一堆随机数。np.random.randint应该完成任务。

一般评论:

如果指定了分位数函数Q(p(,则根据均匀分布对U进行采样并插入Q(U(可以从所需分布中得出结果。

最新更新