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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

503閲覧

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

disuke

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/07/07 21:07

データ生成したあと互いのデータを関連付ける為に相関係数を使用したい
下記 分布より 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)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penpen7

2020/07/08 00:05

学校の課題ですか?
disuke

2020/07/08 00:08

違います。 個人でデータ解析をしており 擬似データ作成を考えております。
Penpen7

2020/07/08 00:35 編集

相関係数より関連付けるという意味を詳しく知りたいのですが、 1. 相関係数が0.5となるようなデータを作りたい 2. データから相関係数を計算した結果0.5となるはずだ 上の二つのうちご質問はどちらに当てはまりますでしょうか? もしくは、もっと違うことを意図していますか?
disuke

2020/07/08 01:57 編集

回答して頂きありがとうございます。 2ですね。 そして各平均と偏差はわかっておりその分布から、擬似データは作成されます。 それぞれのデータを関連付けたいです。 例えば身長190の人が体重30キロなんていうのはありない90ぐらいのデータとひもづけるのが妥当  ただ、ここでは生年月日なども紐付けます。  つまり身長190 175 150 体重90 60 40というデータが個々にあったら相関係数より、紐付けは大体できるはず
Penpen7

2020/07/08 02:36 編集

つまり、samplesとsamples2の2つの1変数データ1つ1つに対し、適切にペアを構成することによって、相関係数が0.5(に出来るだけ近い)2変数データを作りたいという意味ですかね?
disuke

2020/07/08 02:47

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

2020/07/08 11:12

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

2020/07/09 22:15 編集

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

回答2

0

ベストアンサー

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

Python

1import numpy as np 2import itertools 3 4np.random.seed(seed=110) # 再現できるように 5 6# 指定した平均、標準偏差をとるサンプルを返す 7# 8# Generate sample data with an exact Mean and Standard Deviation 9# https://stackoverflow.com/questions/51515423/generate-sample-data-with-an-exact-mean-and-standard-deviation 10def get_samples( num_samples, desired_mean, desired_std_dev): 11 12 samples = np.random.normal(loc=0.0, scale=desired_std_dev, size=num_samples) 13 14 actual_mean = np.mean(samples) 15 actual_std = np.std(samples) 16 17 zero_mean_samples = samples - (actual_mean) 18 19 zero_mean_mean = np.mean(zero_mean_samples) 20 zero_mean_std = np.std(zero_mean_samples) 21 22 scaled_samples = zero_mean_samples * (desired_std_dev/zero_mean_std) 23 scaled_mean = np.mean(scaled_samples) 24 scaled_std = np.std(scaled_samples) 25 26 final_samples = scaled_samples + desired_mean 27 #print( np.mean(final_samples), np.std(final_samples)) 28 29 return final_samples 30 31n_samples = 8 32 33# 3組のサンプルで試す 34samples = [] 35samples.append( get_samples(n_samples, 170.0, 20.0)) # 身長 36samples.append( get_samples(n_samples, 60.0, 20.0)) # 体重 37samples.append( get_samples(n_samples, 50.0, 10.0)) # とりあえず 38samples = np.array(samples) 39 40# 欲しい相関行列 41desired_cc = np.array([ 42 [ 1.0, 0.5,-0.5], 43 [ 0.5, 1.0, 0.0], 44 [-0.5, 0.0, 1.0]]) 45desired_cc = np.triu(desired_cc, k=1) 46 47# サンプルのすべての関連付けの組み合わせ 48# たぶん重複(ムダ)あるような気がする 49perms = [[samples[0]]] # 少なくとも1つは固定でよいはず 50for i in range(1,samples.shape[0]): 51 perms.append( itertools.permutations(samples[i])) 52products = itertools.product(*perms) 53 54min_diff = samples.shape[0] ** 2 # これを超えることはない 55min_e = None 56for e in products: 57 current_cc = np.triu(np.corrcoef(e), k=1) 58 59 # 相関係数の「誤差」 60 diff_cc = np.sqrt(np.sum((current_cc - desired_cc)**2)) 61 62 if diff_cc < min_diff: 63 print(current_cc) 64 min_diff = diff_cc 65 min_e = e 66 67print('-----') 68print(min_e) 69print(np.triu(np.corrcoef(min_e), k=1))

実行結果

PlainText

1[[ 0. -0.43142021 0.44972326] 2 [ 0. 0. -0.91284213] 3 [ 0. 0. 0. ]] 45[[ 0. 0.45448142 -0.5021382 ] 6 [ 0. 0. 0.00369999] 7 [ 0. 0. 0. ]] 8

投稿2020/07/09 22:22

編集2020/07/09 23:20
can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

disuke

2020/07/09 23:12

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

0

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

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

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

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

投稿2020/07/09 09:31

aokikenichi

総合スコア2240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

disuke

2020/07/09 19:35 編集

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

2020/07/10 00:04

相関係数0.5に近いものを選びたいとのご要望でしたので相関行列を作成し0.5に近いものを選ぶしかないと回答致しました。 相関係数で選びたいという要望に相関係数を算出なさっているのに平均や標準偏差を考慮する必要はないと思います。なぜ 体重=0.5*身長 などが出てくるのか分かりません 相関行列の各セルの値と0.5の差の絶対値を出し、その最小値のペアで問題は解決致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問