2017-07-07 5 views
3

ランダムにサンプルを採取しようとしている12個のユニークなグループがあり、それぞれ異なる数の観測値があります。私は、集団全体(データフレーム)から無作為にサンプルを採り、各グループは同じ確率で選択されたいと思っています。これの最も簡単な例は、2つのグループを持つデータフレームです。ランダムに選択する確率が等しい - 予期しない動作

(1./num_groups)/size_of_groups 
np.random.choice(df['groups'], p=df['probability'], size=100)を使用して

groups probability 
0  a  0.25 
1  a  0.25 
2  b  0.5 

は、各反復は、今、私が式を使用確率を思い付くgroup aを選択する確率が50%とgroup b

を選択する50%のチャンスがあります

またはPythonで:

num_groups = len(df['groups'].unique()) # 2 
size_of_groups = df.groupby('label').size() # {a: 2, b: 1} 
(1./num_groups)/size_of_groups 

返す

groups 
a 0.25 
b 0.50 

これは私が奇妙なディストリビューションを取得する前に10のユニークなグループを取得するまで素晴らしいです。ここで小さな例です:

np.random.seed(1234) 

group_size = 12 
groups = np.arange(group_size) 

probs = np.random.uniform(size=group_size) 
probs = probs/probs.sum() 

g = np.random.choice(groups, size=10000, p=probs) 
df = pd.DataFrame({'groups': g}) 

prob_map = ((1./len(df['groups'].unique()))/df.groupby('groups').size()).to_dict() 

df['probability'] = df['groups'].map(prob_map) 

plt.hist(np.random.choice(df['groups'], p=df['probability'], size=10000, replace=True)) 
plt.xticks(np.arange(group_size)) 
plt.show() 

Histogram

私は十分に大きなサンプルサイズでかなり均一な分布を期待するだろうが、グループの数は11+であるとき、私はこれらの翼を取得しています。 group_size変数を10以下に変更すると、希望の一様分布が得られます。

問題の計算式が浮動小数点精度問題かどうかはわかりませんが、誰でも、これを達成するためのよりよい方法、またはこの例の修正を知っていますか?

ありがとうございます!

答えて

2

あなたがhist使用している10ビンデフォルト...

enter image description here

plt.rcParams['hist.bins'] 

10 

binsパラメータとして渡すgroup_size

plt.hist(
    np.random.choice(df['groups'], p=df['probability'], size=10000, replace=True), 
    bins=group_size) 

enter image description here

+0

理にかなってああ、:代わりに、これを試してみてください!早速のお返事ありがとうございます! – pyrate

2

あなたの計算に関する問題はありません。あなたの結果の配列は次のとおりです。

arr = np.random.choice(df['groups'], p=df['probability'], size=10000, replace=True) 

あなたが値カウントを確認した場合:

pd.Series(arr).value_counts().sort_index() 
Out: 
0  855 
1  800 
2  856 
3  825 
4  847 
5  835 
6  790 
7  847 
8  834 
9  850 
10 806 
11 855 
dtype: int64 

それは一様分布にかなり近いです。問題は、ヒストグラムのビンのデフォルト数(10)です。

bins = np.linspace(-0.5, 10.5, num=12) 
pd.Series(arr).plot.hist(bins=bins) 

enter image description here

+0

クイック返信ありがとう!私は価値観をチェックするべきだったはずです! – pyrate

+0

@pyrateよろしくお願いします。一般に、ヒストグラムは離散値セットでは誤解を招く可能性があるので、yes、value_counts +、および棒グラフはディスカバリフェーズでより役立ちます。 – ayhan

関連する問題