데이터분석 6기/본캠프

2025-04-04 파이썬 윈도우 함수 & 상관계수

seyeon1130 2025. 4. 4. 16:29

수준별 학습반 - 파이썬 윈도우 함수

파이썬 윈도우 함수

Shift, Rolling, Expanding

시계열 데이터와 잘쓰임

 

Shift


  • df.shift(1).head() #전에 날짜 땡겨옴, -1이면 뒤에 날자 땡겨옴
  • df.shift(periods=3,freq='D') # 3일 이동
  • df.shift(periods=3,freq='infer') # df의 날짜간격을 분석해서 적당한 주기를 이동
  • 문법
    • DataFrame.shift(periods=기간, freq=None, axis=0, fill_value='비었음')
  • 주요 파라미터
    • periods: 이동할 기간. 음수 또는 양수로 입력.
    • freq: 선택 매개변수. Y, M, D, H, T, S, Timestamp, 'Infer' 등이 위치
    • fill_value: shift로 인해 생긴 결측치를 대체할 값 지정
    • axis: 연산할 축방향 설정. 0(행) / 1(열)
Rolling

 

누적합, 평균 구할 때 유용한 메소드

 

문법 :

  • DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None, method='single')
  • 주요 파라미터
    • window: 몇 개 할지
    • min_periods: 계산할 최소 크기(기간) . 기본적으로 window 크기와 동일.
    • center: 계산을 중간 행에서 할 지 결정하는 파라미터. 기본값은 False, True 로 할 경우 내가 중간 행을 기준으로 계산(예를들어 3이면 앞에 하나, 나, 뒤에 하나 이렇게 세 개)
    • win_type: triang / gaussian 등 가중치를 넣어 계산할 경우 계산 방식.
    • on: 시계열 인덱스나, 시계열과 유사한 열이 있을 경우 이 열을 기준으로 rolling을 수행할 수 있습니다.
    • axis : 연산할 축방향 설정. 0(행) / 1(열)
    • closed: 연산이 닫히는 방향을 설정. left / right / both / neither 이 존재합니다.
      • right: 내 값을 포함하여 계산/안쓰면 right임
      • left: 나를 포함하지 않은 앞에 값을 포함하여 계산
      • both: 양쪽을 포함하여 계산 (right랑 같음)
      • neither: 양쪽을 포함하지 않고 계산
    • method:{'single' / 'table'} numba를 이용하여 테이블 계산을 진행하여 속도를 높힐지 여부. 현재 'single'만 사용가능.

실제로 쓰는건 df.rolling(window=3).mean() 이정도 ->나를 포함한 3개

Expending

df.expanding(min_periods=1, axis=0, method='single').추가메서드()

누적 계산 할 수 있는데 범위는 지정 못하고 앞에부터 지금까지의 누적

axis : 연산할 축방향 설정. 0(행) / 1(열)

df.expending()mean() 이렇게 사용

 

데이터 타입별 상관관계

 

상관계수 해석 방법

 

 

연속형 - 범주형(이분형)

 

이분형을 0과 1로 바꾸고 그 다음 피어슨 상관계수로 보면 된다.

Point-Biserial Correlation/ 범주형이 설명변수이든, 결과변수이든 사용 가능함

# 연속형 변수와 이분형 범주형 변수에 대한 상관관계 구하기 
r, p_value = stats.pointbiserialr(mdf['sales_channel_id'], mdf['price'])
r, p_value

 

여기서 p-value는 내가 이 결과를 믿어도 되는지. p-value가 0.05 이하이면 귀무가설 기각이므로 믿을수 있다!

 

연속형 - 범주형(값이 3개 이상)
  • 연속형 변수와 3개 이상의 범주를 가지는 범주형 변수 간 상관관계는 Polyserial 상관분석 또는 ANOVA검정을 통해 나타낼 수 있습니다.
  • 범주형 변수가 순서형(1학년, 2학년, 3학년) 일 때에는 Polyserial 상관분석이 적합합니다.
  • 범주형 변수가 명목형(데이터분석가, 화가, 의사, 교사)일 때에는 ANOVA(범주형 변수에 따라 연속형 변수의 평균에 차이가 있는지 검정 / 보다 많이 사용)가 적합합니다. 
  •  Polyserial 상관분석은 파이썬에서 지원 안함

anova

원인변수에 따른 결과 변수의 평균의 변화가 크면 F값이 커짐 ->범주형 변수에 따른 연속현 변수 평균의 차이

anova_result = stats.f_oneway(*groups)
print(f"ANOVA 검정 결과: F={anova_result.statistic:.4f}, p-value={anova_result.pvalue:.4f}")
범주형 - 범주형

 

둘다 이분형이면서 순서가 없을 때 -파이 상관계수

 

둘 중 하나가 3개 이상 값을 가지는 범주형일 때/둘 다 그래도 ㄱㅊ - Cramer's v

  • step1. 범주형 변수의 값들을 LabelEncoding(범주형을 숫자로 인코딩)
  • step2. define a function
  • step3. 혼동행렬 생성
label = preprocessing.LabelEncoder() #labelencoder는 클래스임. label은 객체
data_encoded = pd.DataFrame() 

for i in base_df.columns :
      data_encoded[i]=label.fit_transform(base_df[i])
data_encoded.head()

data_encoded.groupby(['club_member_status']).count()

# step 02-03.함수 정의 및 혼동행렬 생성(define a function and make a confusion matrix)

def cramers_V(var1,var2) :
    crosstab =np.array(pd.crosstab(var1,var2, rownames=None, colnames=None)) # Cross table building
    stat = chi2_contingency(crosstab)[0] # Keeping of the test statistic of the Chi2 test
    obs = np.sum(crosstab) # Number of observations
    phi2 = stat / obs
    r, k = crosstab.shape
    phi2corr = max(0, phi2 - (((k-1)*(r-1))/(obs - 1)))
    rcorr = r - ((r-1)**2)/(obs-1)
    kcorr = k - ((k-1)**2)/(obs-1)
    return np.sqrt(phi2corr / min((kcorr-1), (rcorr-1)))#0~1값 반환

rows= []

for var1 in data_encoded:
    col = []
    for var2 in data_encoded :
        cramers =cramers_V(data_encoded[var1], data_encoded[var2]) # Cramer's V test
        col.append(round(cramers,2)) # Keeping of the rounded value of the Cramer's V  
    rows.append(col)
cramers_results = np.array(rows)
data_encoded_df = pd.DataFrame(cramers_results, columns = data_encoded.columns, index =data_encoded.columns)

data_encoded_df

 

결과는 이런식으로 나옴

 

                 A     B     C
        A   1.00  0.35  0.10
        B   0.35  1.00  0.22
        C   0.10  0.22  1.00

 

 

 

 

+

merged_df = merged_df.groupby(['Time stamp']).agg({"Customer ID":"count","Purchase Amount (USD)":"sum"}).reset_index() 이렇게 하면 여러 함수 적용 가능함.