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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

483閲覧

異なるアイテムがあるリスト間の順位相関係数を算出したい(DataFrame操作)

James1201

総合スコア15

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/05/22 18:30

編集2018/05/22 19:58

文字だとうまく伝わらないと思うので、図で失礼します。
例は8行ですが実際は100行位で行おうと思っています。
違う列との重複を考えたり、それらを抽出して並び替えたりと自分の身の丈にあっていない作業であることは重々承知なのですがどうしてもやり遂げなければならず、せめて③のスコア表示まででも良いのでたどり着きたいと思っております...!
どなたかご教授よろしくお願い致します・・・!

こちらが例のexcelデータになります

イメージ説明
イメージ説明

イメージ説明
すみません、ⅲ)は使わなくても良さそうです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問に挙げている手順をそのまま実装すると良いだけです。

少し補足すると

  1. 共通要素の抽出は numpy.intersect1d() を使うとよい。
  2. 次に df[df.isin(共通要素)] で共通要素以外をNanにする
  3. X,Yの列毎に dropna()した後に順番を振る
  4. 上記のX,Yの順位データを結合
  5. df.corr() にて相関係数を計算

となります。

一応サンプルを書いてみましたので参考にしてください。

X,Y共に重複がない前提です。

Python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame({ 5 'X':['A','1','C','D','2','B','3','4'], 6 'Y':['A','B','5','C','6','7','D','8']}) 7 8# X列とY列の共通要素を抽出 9common_value = np.intersect1d(df.X, df.Y) 10n = common_value.size 11 12# 共通要素以外をNanとする 13df = df[df.isin(common_value)] 14 15# Xの順位データ生成 16x_order = pd.Series(range(1, n+1), index=df.X.dropna(), name='X') 17 18# Yの順位データ生成 19y_order = pd.Series(range(1, n+1), index=df.Y.dropna(), name='Y') 20 21# XとYの順位データを結合 22orders = pd.concat([x_order, y_order], axis=1) 23 24# DataFrame.corr() で算出できる 25print(orders.corr(method='spearman')) 26# X Y 27#X 1.0 0.4 28#Y 0.4 1.0 29 30 31# 一応計算式でも算出してみる 32print(1 - 6 * ((orders.X - orders.Y) ** 2).sum() / ((n**3) - n)) 33# 0.4 34

投稿2018/05/23 02:20

編集2018/05/23 04:16
magichan

総合スコア15898

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

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

James1201

2018/05/23 09:38

有難うございました! 行と列の操作など、とても勉強になりました。 また機会がありましたらよろしくお願い致します。
guest

0

注:直打ちなのでセルフデバッグしてください。

もとのデータフレームをdfとします。

x = set(df["X"].values) y = set(df["Y"].values) u = x & y

これでuの共通要素が取り出されます。

x_ = [v for v in df["X"] if v in u] y_ = [v for v in df["Y"] if v in u]

これが欲しい要素です。

ex_ = {v:i+1 for i,v in enumerate(x_)} ey_ = {v:i+1 for i,v in enumerate(y_)}

番号を対応づけます。

col = sorted(u) ans = pd.DataFrame(columns=col) ox_ = [ex_[k] for k in col] oy_ = [ey_[k] for k in col] ans.iloc[0] = ox_ ans.iloc[1] = oy_ ans = ans.T ans.columns = ['X','Y']

要素を並び替えてDataFrameに入れる。XとYまで。

ans['X-Y'] = ans['X'] - ans['Y'] ans['(X-Y)^2'] = ans['X-Y']* *2 ans = ans.T

スコアまで。

投稿2018/05/22 22:54

mkgrei

総合スコア8560

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

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

James1201

2018/05/23 09:37

迅速に対応していただきありがとうございます。 こちらのスクリプトも解決する上でとても参考になりました! ただ、申し訳ありませんがB.A.は相関までご教授いただいた方にいたします。 また機会がありましたらよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問