데이터분석 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() 이렇게 하면 여러 함수 적용 가능함.