2017-11-29 25 views
2

나는 면접관의 스피어 만 상관 계수를 계산 중입니다. Interviewer_1에서 작동합니다 ... Scipy가 interviewer_2와 (와) 상관 관계가없는 것으로 인터럽트하는 방식을 이해하지 못합니다.일부 사례에서 Scipy Spearman 상관 계수가 NaN입니다.

import pandas as pd 
from pandas import DataFrame 
import scipy.stats 


df = pd.DataFrame({'Interviewer': ['Interviewer_1','Interviewer_1','Interviewer_1','Interviewer_1','Interviewer_1','Interviewer_1','Interviewer_1','Interviewer_1','Interviewer_1','Interviewer_1','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2','Interviewer_2'], 
        'Score_1': [-1,-1,-1,1,1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1,-1], 
        'Score_2': [1,-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1] 
        }) 

df 

샘플 데이터 수익률은 :

  Score_1 Score_2 
Interviewer  
Interviewer_1 -2 -4 
Interviewer_2 -16 -20 

Scipy를 사용 : 나는 Excel에서 손으로이 공식을 사용하여 시도

def applyspearman(row): 
    row['Cor'] = scipy.stats.spearmanr(row['Score_1'], row['Score_2'])[0] 
    return row 

df = df.groupby('Interviewer').apply(applyspearman) 

df 
    Interviewer Score_1 Score_2 Cor 
0 Interviewer_1 -1 1 -0.089087081 
1 Interviewer_1 -1 -1 -0.089087081 
2 Interviewer_1 -1 -1 -0.089087081 
3 Interviewer_1 1 -1 -0.089087081 
4 Interviewer_1 1 1 -0.089087081 
5 Interviewer_1 -1 1 -0.089087081 
6 Interviewer_1 -1 -1 -0.089087081 
7 Interviewer_1 -1 -1 -0.089087081 
8 Interviewer_1 1 -1 -0.089087081 
9 Interviewer_1 1 -1 -0.089087081 
10 Interviewer_2 -1 -1 
11 Interviewer_2 -1 -1 
12 Interviewer_2 -1 -1 
13 Interviewer_2 -1 -1 
14 Interviewer_2 -1 -1 
15 Interviewer_2 -1 -1 
16 Interviewer_2 -1 -1 
17 Interviewer_2 -1 -1 
18 Interviewer_2 -1 -1 
19 Interviewer_2 -1 -1 
20 Interviewer_2 -1 -1 
21 Interviewer_2 -1 -1 
22 Interviewer_2 -1 -1 
23 Interviewer_2 1 -1 
24 Interviewer_2 -1 -1 
25 Interviewer_2 -1 -1 
26 Interviewer_2 -1 -1 
27 Interviewer_2 -1 -1 
28 Interviewer_2 1 -1 
29 Interviewer_2 -1 -1 

(순위

Interviewer Score_1 Score_2 
0 Interviewer_1 -1 1 
1 Interviewer_1 -1 -1 
2 Interviewer_1 -1 -1 
3 Interviewer_1 1 -1 
4 Interviewer_1 1 1 
5 Interviewer_1 -1 1 
6 Interviewer_1 -1 -1 
7 Interviewer_1 -1 -1 
8 Interviewer_1 1 -1 
9 Interviewer_1 1 -1 
10 Interviewer_2 -1 -1 
11 Interviewer_2 -1 -1 
12 Interviewer_2 -1 -1 
13 Interviewer_2 -1 -1 
14 Interviewer_2 -1 -1 
15 Interviewer_2 -1 -1 
16 Interviewer_2 -1 -1 
17 Interviewer_2 -1 -1 
18 Interviewer_2 -1 -1 
19 Interviewer_2 -1 -1 
20 Interviewer_2 -1 -1 
21 Interviewer_2 -1 -1 
22 Interviewer_2 -1 -1 
23 Interviewer_2 1 -1 
24 Interviewer_2 -1 -1 
25 Interviewer_2 -1 -1 
26 Interviewer_2 -1 -1 
27 Interviewer_2 -1 -1 
28 Interviewer_2 1 -1 
29 Interviewer_2 -1 -1 

df.groupby('Interviewer').sum() 

는 합계를 산출 함수, abs 차이, d^2 및 d^(6 Σ의 D^2I)/(N (N^2-1))

interviewer_1, p = 0.878788

interviewer_2, p = 0.993985 - p = 1, 두 면접 대한 다른 결과를 얻었다

질문 :

  1. 왜 Interviewer_2 널은? NaN 문제는 순위 동점과 관련이 있습니까?
  2. Scipy의 결과가 내 결과와 다른 이유는 무엇입니까?
+0

확실히 약간 이상한를 scipy 0.8의 변화 "때문이다. 0 : 묶음 처리 및 축을 추가하려면 다시 작성하십시오. " [(source)] (https://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.spearmanr.html) –

+0

사이드 노트 - 나는 당신이 'applyspearman'의'scipy.stats.spearmanr'을 그룹화 된 데이터 프레임의 추가 열로 모든 행에 할당하지 않습니까? 스피어 만 순위는 행 단위가 아닌 요약 통계를 의미합니다. –

+0

면접관이 요약 통계로 사용하고 있습니다. 그것이 내가 groupby를 적용하는 이유입니다. 나중에 필자의 분석에서 필자는 데이터 프레임을 면접관 당 한 줄로 편성하여 스피어맨 점수와의 전체 인터뷰를 계획 할 수있었습니다. – Christopher

답변

1

확실하지 정확히 source에서 일어나고 있지만 Series.rank(method='dense') '팬더와 함께 자신의 함수를 정의 할 수 있으며,이 물건을 취소 보이는 :

def spearmanr(x, y): 
    """ `x`, `y` --> pd.Series""" 
    assert x.shape == y.shape 
    rx = x.rank(method='dense') 
    ry = y.rank(method='dense') 
    d = rx - ry 
    dsq = np.sum(np.square(d)) 
    n = x.shape[0] 
    coef = 1. - (6. * dsq)/(n * (n**2 - 1.)) 
    return coef 

grouped.apply(lambda frame: spearmanr(frame['Score_1'], frame['Score_2'])) 
Interviewer_1 0.970 
Interviewer_2 0.998 
+0

감사합니다 @ 브라드 솔로몬. 모든 것이 공식적인 관점에서 볼 때 주로 좋았습니다 ... 나는 d = ABS (rx-ry) 만 추가합니다. 하지만 나는 스피어맨이 묶인 순위를 잘 처리하고 있다고 생각하지 않습니다. 나는 이것을 전체 데이터 세트에서 시도했는데 음의 값을 얻지 못했습니다 (이것은 -1과 1 사이에서 달라야합니다). 그래서 스피어맨이 내 문제에 대해 좋은 접근 방법이 아닐 수도 있습니다. 저는 현재 스피어맨과 함께 분수 순위를 찾고 켄들 타우를 탐험하고 있습니다. – Christopher

+0

궁금하다면 [here] (https://www.hackerrank.com/challenges/s10-spearman-rank-correlation-coefficient/problem)의 정의를 사용하고있었습니다. (샘플 데이터에서 확인할 수 있습니다.) 약간의 변형으로 정의 된 것을 보았습니다. 입력 및 순위 지정 방법에 확실히 민감합니다. 그러나 이것의 구조가 도움이되기를 바랍니다. –