본문 바로가기

배우기/복습노트[Python과 분석]

[복습] python 업무 능력 향상에 좋은 연습문제(라벨인코딩에 대하여)

728x90
반응형

center_grade.csv 파일을 읽고

 

 

1) . 을 NA 처리하여라

 

sol 1) 파일을 불러올 때 .을 NA 처리

pd.read_csv 파일을 읽어올 때 na_values 옵션을 사용하면 바로 NA로 처리가 가능하다.

그냥 . 말고도 list형태로 여러가지를 넣을 수 있다. 그러나 어떤 데이터가 NA로 바뀌어야 하는지 알고 있는 경우에만 사용할 수 있다.

 

 

sol 2) 

 

 

 

 

2) 모든 컬럼의 값을 같은 기준으로 라벨인코딩 한 후 결과를 df2 에 저장하여라

우선 파이썬의 라벨인코딩 방식이다.

m_enc.fit 할 때 mapping rule이 생성된다. 즉 unique value를 체크하여 각 value마다 숫자를 부여하는 것이다.

m_enc.transform 에서 변환을 한다. mapping rule에 의한 변환이다.

 

 

** 라벨인코딩은 2차원 전달이 불가하다. → 1차원 변경 필요

** 라벨인코딩은 NA도 치환한다. → 다시 NA로 돌릴 필요가 있다.

 

sol 1) 라벨인코딩 함수 사용

우선 라벨인코딩은 2차원 전달이 불가하므로 1차원 데이터로 변경하여야 한다(평탄화).

values로 index를 제외한 값들만 추출한 후 평탄화(flatten)를 하면 위와 같이 1차원 array로 추출된다.

 

그 다음 라벨인코딩을 진행한다.

 

그 다음 원래대로 2차원 데이터프레임 형식으로 변환하면 되겠다.

2차원 데이터프레임 형식으로 변환할 때 아래처럼 수행해도 된다.

 

 

 

df1의 index와 columns의 정보도 df2로 넘겨준다.

 

그리고  본래의 NA를 다시 NA로 변경하자(현재 NA는 10으로 변환이 되어있는 것으로 보인다).

 

 

 

sol 2) mapping rule을 직접 만들어서 치환 ★ ★ ★ ★ ★ ★

이게 왜 중요하냐면, 무조건 라벨인코딩 함수를 써서 라벨인코딩을 하는 것이 데이터에 따라 좋은 방법이 아닐 수도 있기 때문이다. 현업에서 많이 쓰는 방법 중 하나는 빈도수를 반영하여 라벨인코딩을 하는 것이다. 예를 들어 a는 엄청 많이 등장하고 b는 덜 등장하며 d는 거의 등장하지 않는다면, a의 중요도를 높게 표현하기 위해서 ordered factor 처럼 처리하여야 한다. 빈도 가중치를 부여하는 것처럼 라벨인코딩을 해야 한다는 것이다. 그래서 직접 라벨인코딩을 유도할 줄 알아야 한다. 문자들의 라벨인코딩을 할 때 단순히 0, 1, 2로 변환하지 않는다. 어떻게든 의미를 부여하여 빈도수 기반으로 라벨인코딩을 진행하거나 사용자가 직접 가중치를 조절하는 방식으로 하거나, ordered factor면 order에 맞게끔 변환을 해야한다. 

 

우선 sol 1과 마찬가지로 데이터 평탄화를 먼저 진행한다.

 

 

 

그리고 unique 값을 확인한다.

 

 

다음에는 mapping rule 을 만들어야 한다.

  (1) series mapping rule: old_value는 index에, new_value는 value에 전달

series는 index와 value를 불러오기 쉬우니까 딕셔너리 대신에 series를 사용하겠다.

series도 key-value 구조이며, series에서 key는 index이다.

 

  (2) dictionary mapping rule: series를 사용하여 dictionary 생성이 가능하다.

딕셔너리 형태로 쓰고 싶다면,

to_dict 메서드는 잘 기억해두자.

series를 알고 있으면 dictionary 탄생이 쉽다. 

 

 

마지막으로 mapping rule에 의한 치환을 하면 되겠다.

 

map 메서드는 series 전용이기 때문에, 데이터프레임에는 접근할 수 없으므로 replace를 이용하여 mapping rule 변환을 하여야 한다. 만일 df1이 series면 map 적용이 가능하다.

치환이 완료되었다. map1이 아니라 map2도 가능하다.

 

 

 

 

 

3) 모든 컬럼의 값을 각 컬럼 기준으로 라벨인코딩 후 결과를 df3에 저장하여라

각 컬럼별로 라벨인코딩을 수행하여보자(라벨인코딩 함수를 사용할 것이며 NA도 라벨인코딩에 의하여 변환됨에 주의하여야 한다).

 

먼저 열별로 라벨인코딩을하기 위해서는 라벨인코딩 함수를 만들어야 한다.

 

데이터프레임이 리턴되면서 기존 키 값이 유지된다.

 

이제 NA 였던 자리를 찾아서 NA로 치환하여보자.

 

기존에 있었던 NA 자리를 찾아서 변환된 자리로 전달하는 방법을 쓸 것이다.

컬럼별로 라벨인코딩을 하다보니 2) 번 문제처럼 라벨인코딩 결과 값이 10 이렇게 통일되지 않기 때문에 숫자 하나를 찾아 대치할 수 없어서 이 방법을 사용한 것이다.

다른 값이 NaN으로 출력된 이유는, 데이터프레임 규격을 맞춰야 하다보니 NA였던 자리가 아닌 곳은 NaN으로 채운 것이다.

따라서, 

 

조건을 던져서 덮어쓰면 된다. 검색 조건은 원본에, 원본에서 파생된 값은 내가 찾으려고 하는 실제 검색을 하는 대상에 있다. 즉, 찾을 대상은 df1, 추출대상은 df3 이라는 의미이다. 이 방법은 중요하므로 기억해두자. ★

 

 

 

4) df3에서 전체 기준 최빈값으로 NA를 대치하여라

데이터프레임에서 값만 추출하여(values), 평탄화(flatten)을 하여 최빈값(mode)를 구해서 NA값에 대치(fillna)하였다.

 

 

 

5) df2에서 각 컬럼 기준 중앙값으로 NA를 대치하여라

728x90
반응형