프로젝트/[DA] 데이터 분석 : 배구

데이터 전처리 - 결측값 처리

sollllllll 2022. 3. 13. 21:06

지난 포스트에서는 크롤링으로 수집한 데이터를 통해 선수의 공격과 수비 지표로 쓸 수 있는

공격 성공률, 리시브 효율, 세트당 서브/세트/블로킹/디그 수 등을 구했다.

 

하지만 공격 지표 중에는 공격 성공률 뿐 아니라 공격이 얼만큼의 효과를 냈는지 보는 '공격 효율' 또한 중요하다.

공격 효율은 (공격 성공-공격 범실)/공격 시도 로 구한다.

그러나 크롤링 당시 전체 범실 개수만 저장하고 공격에서의 범실은 저장하지 않아서 추가로 공격 범실 데이터가 필요했다.

 

 

 

( 데이터 새로 얻는 과정은 생략 )

 

 

 

새롭게 얻은 데이터이다.

 

 

이제 기존에 작성했던 코드 중 공격 효율(at_rate)을 계산하는 부분을 추가한다.

공격 성공률, 공격 효율, 리시브 효율은 모두 백분율이므로 이전에 전처리 할 때 놓쳤던 백분율 변환 부분도 추가했다.

# 경기 지표 계산한 테이블 만들기

player_rate = spark.sql("""
          select name,team,pos,score,error,setcount,
              round(at_succ/at_try*100,2) as at_srate,round((at_succ-at_err)/at_try*100,2) as at_rate,
              ...
              round((rs_corr-rs_fail)/rs_try*100,2) as rs_rate,...
          from player
          """)

player_rate.show()

 

 

하지만 아래 데이터를 보면 중간중간 결측값들이 있는 것을 볼 수 있다. 이유는 선수들의 포지션 특성 때문이다.

데이터에서 보이는 리베로 포지션은 수비 전문 포지션으로,

공격에는 참여하지 않으며 공격으로 판단되는 행위를 하면 이는 범실로 처리된다.

 

따라서 공격 성공률, 공격 효율이 null 인 경우는 공격 시도가 0이기 때문이고

공격 성공률이 0, 공격 효율이 -100 인 경우는 공격을 시도했다고 판단됐으나 범실로 기록되었기 때문이다.

마찬가지로 리시브 효율이 null 인 경우 또한 리시브 시도가 없기 때문이다.

# 참고
공격 성공률(%) : 성공/시도
공격 효율(%) : (성공-범실)/시도
리시브 효율(%) : (정확-실패)/시도
세트당 ~ (개) : 성공/참여한 세트수

 

 

이 결측값들을 처리하기 위해 아래와 같은 내용을 추가했다.

SQL 의 CASE 문 중 'CASE WHEN ~ THEN ~ ELSE ~ END AS 컬럼명' 표현을 사용해서

공격 성공률과 공격 효율, 리시브 효율에서 null 이거나 -100 인 값들을 0으로 변경했다.

# null 값, 의미없는 값 0으로 변경

player_rate2 = spark.sql("""
          select ...,
          case when at_srate is null then 0.0 else at_srate end as at_srate,
          case when at_rate is null or at_rate = -100.0 then 0.0 else at_rate end as at_rate,
          ...,
          case when rs_rate is null then 0.0 else rs_rate end as rs_rate,...
          from player_rate
          """)

player_rate2.show()

데이터들이 잘 변경된 것을 볼 수 있다.

 

 

 

이렇게 해서 누락됐던 공격 효율과 결측값 처리를 모두 마쳤다!

 

 

 

 

(참고) 하둡에서 파일, 디렉토리 삭제하는 방법

더보기

추가적으로 이전에 잘못 만든 데이터들을 하둡에서 삭제하는 방법도 정리해두려고 한다.

 

먼저 > hadoop fs -rm /data/[파일명] 명령어로 어떤 데이터들이 있는지 확인했다.

하지만 디렉토리라며 삭제가 되지 않고 > hadoop fs -ls /data 명령어로 확인해봤을 때 파일들이 그대로인 것을 볼 수 있다.

정확한 이유는 모르겠지만 스파크를 통해 저장한 데이터는 디렉토리처럼 인식되는 것 같다.

(그래서인지 크기도 0이라고 나옴)

 

그래서 디렉토리를 삭제하는 명령어로 삭제해주었다.

> hadoop fs -rm -r /data/[파일명] 명령어를 사용했는데, 리눅스와 마찬가지로 * 기호는 모든 문자를 의미하므로

만약 > hadoop fs -rm -r /data/dogong*.csv 라는 명령어를 입력하면

dogong.csv, dogong-2.csv, dogong_r.csv 들이 모두 삭제된다.

이 때 '.csv' 부분은 확장자명이라서 그런지 모르겠지만 * 뒤에 생략하면 안 된다.

 

삭제할 데이터들을 모두 삭제하고 확인해 본 모습이다.

데이터 삭제
삭제되었는지 확인