일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ionehotencoding
- 데이터
- 인공지능
- Okt
- Udemy
- pandas
- 데이터분석
- 머신러닝
- iNT
- Tableau
- 데이터 분석
- SQL
- 형태소분석기
- 파이썬
- scikit-learn
- Python
- selenium
- 태블로
- 크롤링
- 시각화
- numpy
- pyspark
- konlpy
- input
- Word Cloud
- Today
- Total
반전공자
[PySpark] 모델링 준비하기 - 기술통계, 상관계수 본문
토마스 드라마브, 데니 리의 "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를 모델을 만드는 데 사용 가능하다.
(타겟과의 상관관계가 높을 수록 유의미하며, 타겟 간 상관관계가 높다면 문제가 있다고 판단한다)
'데이터분석 > PySpark' 카테고리의 다른 글
[PySpark] MLlib 소개하기 - 데이터셋 로드(NCHS) (0) | 2023.03.15 |
---|---|
[PySpark] 모델링 준비하기 - 아웃라이어 (0) | 2023.03.14 |
[PySpark] 데이터프레임 시나리오 : 비행 기록 성능 (0) | 2023.03.11 |
[PySpark] 데이터프레임 - API, SQL (0) | 2023.03.10 |
[PySpark] 액션 - count(), saveAsTextFile(), foreach() (0) | 2023.03.10 |