반전공자

[PySpark] 모델링 준비하기 - 기술통계, 상관계수 본문

데이터분석/PySpark

[PySpark] 모델링 준비하기 - 기술통계, 상관계수

하연01 2023. 3. 14. 17:23

토마스 드라마브, 데니 리의 "PySpark 배우기"를 보고 배워나가는 과정을 기록한 글입니다 ♪


데이터에 친숙해지기

모델링 이전에 데이터에 대해 숙지하고 있어야 한다. 

숙지하는 과정으로 기술 통계부터 살펴보자. 

 

신용카드 사기 데이터셋

 

기술통계 

- 데이터셋에서의 관찰 값 개수, 각 컬럼의 평균과 표준편차 또는 최댓값/최솟값 등의 기본적인 정보 제공

 

# 데이터 타입 로드
import pyspark.sql.types as typ

fraud = sc.textFile('/Users/hayeon/Downloads/ccFraud.csv')
header = fraud.first()
fraud = fraud.filter(lambda row : row != header) \
     .map(lambda row: [int(elem) for elem in row.split(',')])

1. types 모듈에서는 IntegerType(), FloatType() 같은 모든 데이터 타입을 로드한다. 

2. 데이터 불러온 후 헤더 라인을 first() 함수로 제거한다. 

3. 불러온 파일이 csv 이므로 콤마로 행을 분리하고 각 엘리먼트를 정수형으로 변환한다. 

 

 

 

1. 데이터프레임 스키마 생성

field = [
    *[typ.StructField(h[1:-1], typ.IntegerType(), True) for h in header.split(',')]]
schema = typ.StructType(field)

 

 

2. 데이터프레임 생성

schema = typ.StructType(field)
fraud_df = spark.createDataFrame(fraud, schema)
fraud_df.show()

 

 

→ 데이터프레임 생성으로 데이터셋에 대해 기본적인 기술 통계 계산이 가능해짐

※ 모든 feature가 숫자로 나오더라도 gender 같은 값은 카테고리 값임을 주의하자. 

 

 

3. 데이터프레임 스키마 확인

fraud_df.printSchema()

- custID에 대해 평균, 표준편차를 구하는건 의미가 없다. 

- 카테고리 컬럼에 대해 더 이해하기 위해 groupby() 함수를 이용해 값의 빈도를 셀 수 있다. 

 

 

 

groupby() 

- 값의 빈도 세기

- gender 컬럼의 빈도 세기

 

fraud_df.groupby('gender').count().show()

→ 불균형한 데이터셋임을 확인 (gender 분포의 불균형)

 

 

 

describe() 

- 실제 숫자 feature에 대해 사용

numerical = ['balance', 'numTrans', 'numIntlTrans']
desc = fraud_df.describe(numerical)

→ 데이터셋에서 balance numTrans, numIntTrans 컬럼에 대해서만 describe 함수를 적용한다. 

 

desc.show()

→ 세 컬럼에 대한 describe 결과 테이블을 확인한다. 

 

결과 해석

- 모든 feature는 양의 방향으로 왜곡 (최댓값이 평균값보다 몇 배 더 크다) 

- 변동계수(평균과 표준 편차의 비율)가 매우 크다 (값이 1과 가깝거나 크다 = 넓게 퍼진 데이터)

 

 

4. 비대칭도 확인 

- balance 컬럼에 대해서만 실행

fraud_df.agg({'balance': 'skewness'}).show()

 

 

참고: 합계 함수

- avg()

- count()

- countDistinct()

- first()

- kurtosis()

- max()

- mean()

- min()

- skewness()

- stddev()

- stddev_pop()

- stddev_samp()

- sum()

- sumDistinct()

- var_pop()

- var_samp()

- variance()

 

 

 

상관계수 

- 서로 다른 feature 간의 상호관계를 나타내는 측정 값 

- 모델은 일반적으로 타겟 데이터에 상당히 연관되어 있는 Feature만을 포함함. 

   그래도 상관계수 확인은 상당히 중요하다

- 서로 상관계수가 높은 feature를 포함하는 모델은 예상치 못한 결과를 초래하거나 불필요하기 때문

 

* PySpark에서 상관계수 계산은 데이터프레임 형태일 때 매우 쉽다

 

corr() 함수는 오직 두 쌍의 상관계수만 계산할 수 있는 피어슨 상관계수만 지원한다. 

→ 각 피쳐에 대해 corr() 함수를 실행해야 한다는 번거로움

 

 

fraud_df.corr('balance', 'numTrans')
0.0004452314017265386

 

 

5. 상관계수 행렬 구하기

n_numerical = len(numerical)
corr = []
for i in range(0, n_numerical):
    temp = [None] * i
    for j in range(i, n_numerical):
            temp.append(fraud_df.corr(numerical[i], numerical[j]))
    corr.append(temp)

→ 참고로 numerical = ['balance', 'numTrans', 'numIntlTrans']

- 이 세 변수 간 상관계수 행렬을 구한다. 

 

 

corr
[[1.0, 0.0004452314017265385, 0.0002713991339817875], 
[None, 1.0, -0.00028057128198165544], 
[None, None, 1.0]]

- 신용카드 사기 데이터셋에서 숫자 feature 간 상관관계는 거의 없다. 

- 모든 Feature들이 타겟을 설명하는 데 통계적으로 타당하다고 보여지므로 모든 feature를 모델을 만드는 데 사용 가능하다. 

  (타겟과의 상관관계가 높을 수록 유의미하며, 타겟 상관관계가 높다면 문제가 있다고 판단한다)