[오늘의 일지]
EDA 프로젝트 - 수집한 자료 전처리 과정
[상세 내용]
EDA 프로젝트
수집한 자료 전처리를 위한 회의
- 어제는 자료 수집을 위해서 각자 파트를 분담해서 크롤링을 한 후에 csv파일의 형태로 업로드를 시켰습니다. 사이트에 나온 자료들은 사이트에서 설정한 그대로의 칼럼이나 값들을 가지고 있었고 각각의 사이트마다 나타내는 값들이 달랐습니다. 예를 들면 선수의 이름이 표기방법이 다른 것들이 많았습니다. 알파벳에서도 유럽의 각 나라마다 쓰는 표기법이 다 달랐던 것입니다. 특히 독일, 덴마크, 스페인어권 나라 출신 사람들은 자국의 알파벳을 유독 사용하는 것 같았습니다. 간단한 예시로는 '마르틴 외데고르'라는 선수와 '다윈 누녜스'라는 선수들이 있습니다. 유니폼이나 공식적으로 사용하는 알파벳의 형태는 'Martin Ødegaard'와 'Darwin Núñez'입니다. 이렇게 표기법이 통일되지 않으면 각각의 자료들을 join 하기에 힘들 것이라고 판단을 내려서 모두 영문 알파벳 표기법으로 변환시키기로 했습니다. 그리고 이 작업을 제가 담당하기로 했습니다. 그렇게 최종적으로 나온 작업이 아래입니다. 제가 하게 된 작업이 첫 번째 파트입니다.
- 알파벳 통합하기, 필요 없는 값(임대가 쓰여있는 선수가 존재했음) 제거하기, 빈칸(특정 자료에는 앞뒤로 빈칸 존재했음) 제거)
- 연봉의 데이터타입이 object였는데 int로 변환하는 과정
- 이적선수 스탯 통합하기 (이적선수의 스탯이 한 시즌에 2개로 나와있어서 게임수를 계산해서 다시 값 만들기)
- 선수 프로필 테이블 만들기 (연도, 선수이름, 팀, 포지션 등으로 나누고 인덱스 값 추가해서 나중에 EDA과정을 할 때 자료 보기 좋게 만들기)
알파벳 통합하는 과정 실패
- 처음에 제가 자신 있게 이 작업을 하려고 한 이유는 googletrans라는 오픈 API 때문이었습니다. 제가 처음에 번역으로 돌렸을 때는 어느 스페인 선수였는데 변환이 잘 되는 것이었습니다. 그렇게 임시로 하나의 데이터를 돌려봤을 때는 이미 후회해도 늦은 시간이었습니다. 무조건 변환이 되는 것이 아니었고 특히 독일어나 덴마크어는 전혀 변화도 되지 않았습니다. 혹시나 하는 마음에 한국어로 돌려도 봤지만 뜻이 있는 단어도 아닐뿐더러 가끔 뜻이 있는 이름을 가진 사람의 이름은 뜻으로 나오기도 했습니다. 그렇게 다시 생각하게 되었습니다. 또 이 라이브러리가 오픈 API로 특정 서버에 의해서 운영이 되어서 그런지 딜레이도 심하고 많은 양을 요구하는 과정에서는 거부당한 적도 있었기 때문에 많은 양의 데이터 전처리를 생각한다면 추천하지 않는 방법입니다.
from googletrans import Translator
def trans_yo_en(x):
translator = Translator()
return translator.translate(x, dest='en').text
def trans_to_ko(x):
translator = Translator()
return translator.translate(x, dest='ko').text
알파벳 통합하는 과정 성공
- 그렇게 googletrans는 포기하고 다시 생각하던 중에 리그가 영국이기도 하고 축구를 잘하는 선수들이 많이 포함되어 있는 나라들이 그렇게 많이 존재하지 않을 거라는 궁금증이 생겼습니다. 찾아보니 알파벳이 다른 나라가 약 10개 미만일 거라는 예상을 하며 알파벳을 직접 바꿔줄 수 있는 딕셔너리를 하드코딩으로 만들어서 함수로 변환을 시켜주자는 결론을 지었습니다. 그렇게 총 선택한 언어는 프랑스어, 이탈리아어, 스페인어, 슬라브어, 독일어, 터키어, 덴마크어, 노르웨이어, 포르투갈어 정도였던 거 같습니다. 또 영어랑 공통으로 쓰는 알파벳도 있고 모든 알파벳을 나열하고 나서 중복을 제거해 주는 프로그램을 돌려보니 각각의 나라끼리도 겹치는 부분이 있었던 거 같습니다. 그렇게 변환시킬 수 있는 함수를 만들어서 보이는 알파벳은 대부분 변환시켰습니다.
special_characters = {
'À': 'A', 'Á': 'A','Â': 'A','Ã': 'A','Ä': 'A','Ä': 'A','Å': 'A','Å': 'A','Æ': 'Ae',
'Ç': 'C','È': 'E','É': 'E','Ê': 'E','Ë': 'E','Ì': 'I','Í': 'I','Î': 'I','Ï': 'I',
'Ñ': 'N','Ò': 'O','Ó': 'O','Ô': 'O','Õ': 'O','Ö': 'O','Ö': 'O','Ø': 'O','Ù': 'U',
'Ù': 'U','Ú': 'U','Û': 'U','Ü': 'U','Ü': 'U','ß': 'ss','à': 'a','á': 'a','â': 'a',
'ã': 'a','ä': 'a','ä': 'a','å': 'a','å': 'a','æ': 'ae','ç': 'c','è': 'e','é': 'e',
'ê': 'e','ë': 'e','ì': 'i','í': 'i','î': 'i','ï': 'i','ñ': 'n','ò': 'o','ó': 'o',
'ô': 'o','õ': 'o','ö': 'o','ö': 'o','ø': 'o','ù': 'u','ú': 'u','û': 'u','ü': 'u',
'ü': 'u','ÿ': 'y','Ć': 'C','ć': 'c','Č': 'C','č': 'c','Đ': 'Dj','đ': 'dj','Ğ': 'G',
'ğ': 'g','İ': 'I','ı': 'i','Ş': 'S','ş': 's','Š': 'S','š': 's','Ÿ': 'Y','Ž': 'Z',
'ž': 'z'}
def trans_and_convert(name):
english_alphabet_name = ''.join([special_characters[char] if char in special_characters else char for char in name])
return english_alphabet_name
필요 없는 값 제거
- 필요 없는 값이 어떤 단어인지 찾아보았는데 다행하게도 임대를 온 선수들 한테만 붙어 있고 모두 같은 단어로 되어있었습니다. 단어의 제거는 수업시간에 배운 replace이용해서 ''를 사용해서 비교적 간단하게 제거시켜 줬습니다.
for index, row in defensive.iterrows():
name_strip = row["Name"].replace('(on loan from )','')
defensive.at[index, "Name"] = name_strip
빈칸 제거 하기
- 이 부분도 앞뒤에 빈칸만 생각하면 strip 함수를 사용하여 쉽게 제가 할 수 있는 과정입니다.
for index, row in defensive.iterrows():
name_strip = row["Name"].strip()
defensive.at[index, "Name"] = name_strip
중간에 낭비한 시간
- 사실 중간에 필요 없는 값을 제거하는 과정에서 엑셀을 이용해서 자료를 들여다보니 값들이 많지 않아 보여서 직접 제거를 하고 저장을 했습니다. 이 과정에서 encoding 값이 달라져서 다시 인코딩을 돌려보면서 영어를 제외한 다른 나라 알파벳 값들이 '?'로 변했습니다. 결국 과정을 다시 되돌아가면서 엑셀에서 수정하는 과정에서 뭔가 잘 못된 것을 파악하게 된 것입니다. 그래도 이 과정에서 인코딩에 대한 에로코드나 인코딩을 확인하는 방법 다시 파일을 읽어서 새로운 인코딩 값으로 변환하는 방법까지 여러 면에서 공부는 되었다고 긍정적으로 생각하겠습니다.
[마무리]
오늘은 전처리 과정의 시작이라고 볼 수 있는 각각의 값들을 통합시기기 위한 과정을 진행했습니다. 역시나 자료를 수집하는 과정보다 훨씬 더 까다로운 과정들이 많았습니다. 여러 가지 시행착오를 겪다 보니 하루가 금방 지나간 것처럼 느껴졌습니다. 새롭게 이름들을 시험 삼아 join을 해봤는데 여전히 합쳐지지 않는 값들이 많은 것으로 보였습니다. 내일은 아마도 세부적인 수정을 통해서 최대한 값들을 통합시키기 위해 노력해야 할 것입니다.
'AI > AI 부트캠프' 카테고리의 다른 글
[AI 부트캠프] DAY 33 - EDA 프로젝트 4 (0) | 2023.09.01 |
---|---|
[AI 부트캠프] DAY 32 - EDA 프로젝트 3 (0) | 2023.08.31 |
[AI 부트캠프] DAY 30 - EDA 프로젝트 1 (0) | 2023.08.29 |
[AI 부트캠프] DAY 20 - 파이썬 프로젝트 5 (0) | 2023.08.12 |
[AI 부트캠프] DAY 19 - 파이썬 프로젝트 4 (0) | 2023.08.11 |
댓글