質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

データ生成したあと互いのデータを関連付ける為に相関係数を使用したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 177

disuke

score 15

データ生成したあと互いのデータを関連付ける為に相関係数を使用したい
下記 分布より samplesとsamples2には相関係数0.5の関係があります。それぞれのデータを相関係数より関連付けるにはどうすれば宜しいでしょうか?
一つは各種ソートかけるほうほうがあると思います。 さらに本問題はsamples3....samples12まであり各種 0.3 0.5-0.2等 バラバラです。 各種,mean とsdはわかっています。

import scipy.stats
lower = 0
upper = 39
mu = 8.563
sigma = 6
N = 200

samples = scipy.stats.truncnorm.rvs(
(lower-mu)/sigma,(upper-mu)/sigma,loc=mu,scale=sigma,size=N)

lower2 = 0
upper2 = 12
mu2 = 3
sigma2 = 9
N = 200

samples2 = scipy.stats.truncnorm.rvs(
(lower-mu)/sigma,(upper-mu)/sigma,loc=mu,scale=sigma,size=N)

print(samples)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • disuke

    2020/07/08 11:47

    ありがとうございます。
    仰る通りです。
    厳密には13変数まで拡充させていくつもりです。

    キャンセル

  • Penpen7

    2020/07/08 20:12

    素直に実装するならば、順列全探索で0.5に最も近いペアを作れると思いますが、計算量が爆発的に増えるため、11個程度で数秒計算がかかってしまいます。もっと高速に計算したいなら、別のアルゴリズムを使うことになると思いますが、私には分からないです。

    キャンセル

  • can110

    2020/07/10 07:14 編集

    これまでのやりとりを踏まえて質問本文を修正すると回答得られやすいかと思います。
    また、生成したデータ数、例でいうと人の数はどれほどでしょうか?

    キャンセル

回答 2

checkベストアンサー

0

とりあえず素直に組んでみました。
それらしい結果は得られそうですが、3変数、サンプル数8(人)でも計算爆発してしまいます。

import numpy as np
import itertools

np.random.seed(seed=110) # 再現できるように

# 指定した平均、標準偏差をとるサンプルを返す
#
# Generate sample data with an exact Mean and Standard Deviation
# https://stackoverflow.com/questions/51515423/generate-sample-data-with-an-exact-mean-and-standard-deviation
def get_samples( num_samples, desired_mean, desired_std_dev):

    samples = np.random.normal(loc=0.0, scale=desired_std_dev, size=num_samples)

    actual_mean = np.mean(samples)
    actual_std = np.std(samples)

    zero_mean_samples = samples - (actual_mean)

    zero_mean_mean = np.mean(zero_mean_samples)
    zero_mean_std = np.std(zero_mean_samples)

    scaled_samples = zero_mean_samples * (desired_std_dev/zero_mean_std)
    scaled_mean = np.mean(scaled_samples)
    scaled_std = np.std(scaled_samples)

    final_samples = scaled_samples + desired_mean
    #print( np.mean(final_samples), np.std(final_samples))

    return final_samples

n_samples = 8

# 3組のサンプルで試す
samples = []
samples.append( get_samples(n_samples, 170.0, 20.0)) # 身長
samples.append( get_samples(n_samples,  60.0, 20.0)) # 体重
samples.append( get_samples(n_samples,  50.0, 10.0)) # とりあえず
samples = np.array(samples)

# 欲しい相関行列
desired_cc = np.array([
    [ 1.0, 0.5,-0.5],
    [ 0.5, 1.0, 0.0],
    [-0.5, 0.0, 1.0]])
desired_cc = np.triu(desired_cc, k=1)

# サンプルのすべての関連付けの組み合わせ
# たぶん重複(ムダ)あるような気がする
perms = [[samples[0]]] # 少なくとも1つは固定でよいはず
for i in range(1,samples.shape[0]):
    perms.append( itertools.permutations(samples[i]))
products = itertools.product(*perms)

min_diff = samples.shape[0] ** 2 # これを超えることはない
min_e = None
for e in products:
    current_cc = np.triu(np.corrcoef(e), k=1)

    # 相関係数の「誤差」
    diff_cc = np.sqrt(np.sum((current_cc - desired_cc)**2))

    if diff_cc < min_diff:
        print(current_cc)
        min_diff = diff_cc
        min_e = e

print('-----')
print(min_e)
print(np.triu(np.corrcoef(min_e), k=1))

実行結果

[[ 0.         -0.43142021  0.44972326]
 [ 0.          0.         -0.91284213]
 [ 0.          0.          0.        ]]
:
[[ 0.          0.45448142 -0.5021382 ]
 [ 0.          0.          0.00369999]
 [ 0.          0.          0.        ]]
:

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/10 08:12

    ありがとうございます。
    2000人を想定しています。

    キャンセル

0

追記Q&Aを拝見しても何をなさりたいのかが分からないのですが

13変数がある
互いの相関係数が0.5(あるいはそれに近いもの)となるものを抽出する

ならば相関行列を作成(データ量に寄りますが13変数ならば特に問題ないかと)
c.f.
python/相関行列(correlation_matrix)

0.5に近いものを選べばよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/10 04:33 編集

    回答して頂きありがとうございます。


    ならば相関行列を作成>>相関行列は作成しております

    0.5に近いものを選べばよいと思います。>>どのようにすれば宜しいでしょうか?
    例えば 相関係数0.5 身長mean170 sd20   体重mean60 sd20 この情報だけ与えられたとします。 randn functionより mean sdより下記データ作成  どのように紐付けしますか? 直感的に 190と90を紐付ければいいのですが
    何かオススメのやり方があれば 
    例えば 体重=0.5*身長   で近似値リンクとかですか?このやり方はあまりスマートじゃないと思うので何か他のやり方があれば教えて頂きたいのですが

    身長190 175 150 体重60 40 90

    キャンセル

  • 2020/07/10 09:04

    相関係数0.5に近いものを選びたいとのご要望でしたので相関行列を作成し0.5に近いものを選ぶしかないと回答致しました。
    相関係数で選びたいという要望に相関係数を算出なさっているのに平均や標準偏差を考慮する必要はないと思います。なぜ 体重=0.5*身長 などが出てくるのか分かりません

    相関行列の各セルの値と0.5の差の絶対値を出し、その最小値のペアで問題は解決致します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る