使用 Python 中的正态分布计算权重

Calculate weight using normal distribution in Python

我必须在泰坦尼克号数据集中添加一个重量列,以使用 std = 20 和 mean = 70 kg 的正态分布来计算成年乘客的体重。我试过这段代码:

df['Weight'] = np.random.normal(20, 70, size=891)
df['Weight'].fillna(df['Weight'].iloc[0], inplace=True)

但我担心两件事:

  1. 它产生负值,而不仅仅是正值;这怎么能被认为是正常的重量值,我可以在代码中更改什么以生成正值。
  2. 既然我针对的是成人年龄段,那么儿童呢。有的体重值也异常,如成人7公斤,儿童30公斤;这怎么能解决。 感谢您提供的任何帮助。

编辑:

这段代码对我有用

Weight = np.random.normal(80, 20, 718)
adults['Weight'] = Weight

现在我必须计算体重小于 70 的人的概率 谁在 70 到 100 之间。

我尝试了以下代码,但它引发了一个错误:TypeError: unsupported operand type(s) for -: 'str' and 'int'.

import pandas as pd
import numpy as np
import scipy.stats

adults = df[(df['Age'] >= 20) & (df['Age'] <= 70)]

Weight = np.random.normal(80, 20, 718)
adults['Weight'] = Weight

p1 = adults['Weight'] < 70
p2 = adults[(adults['Weight'] > 70) & (adults['Weight'] < 100)]

scipy.stats.norm.pdf(p1)
scipy.stats.norm.pdf(p2)
  1. 正态分布的范围不受限制。它跨越所有实数。如果你想限制它,你应该手动或使用其他发行版。

    df['Weight'] = np.random.normal(20, 70, size=891)
    df.loc[df['Weight'] < min_value, 'Weight'] = min_value
    df.loc[df['Weight'] > max_value, 'Weight'] = max_value
    
  2. 因为儿童和成人的体重不是独立同分布的,你应该从不同的分布中抽样

    # use different distributions
    df.loc[df['person_type'] == 'child', 'Weight'] = np.random.normal(x1, y1, size=children_size)
    df.loc[df['person_type'] == 'adult', 'Weight'] = np.random.normal(x2, y2, size=adult_size)
    

你可以使用一个truncated normal distribution,如果你想避免负值,例如,要得到一个平均值为70和标准差为20的向量,你可以这样做:

myclip_a = 0
myclip_b = +np.Inf
my_mean = 70
my_std = 20

a, b = (myclip_a - my_mean) / my_std, (myclip_b - my_mean) / my_std

我们设置了种子,您可以看到截断法线的所有值都大于零,但不是您使用的法线:

np.random.seed(100)

x1 = truncnorm.rvs(a= a,b=b,size=50000,loc=70,scale=20)

np.sum(x1<0)
0

x2 = norm.rvs(loc=70,scale=20,size=50000)

np.sum(x2<0)
10

不太确定你是如何填写 nas.. 需要数据框来解决这个问题,但我怀疑它完全是另一个问题。