

gender, age, age_o, race, race_o : 성별, 나이, 상대방 나이, 종교, 상대방 종교importance_same_race : 같은 인종이어야 하는 것에 대해서 얼마나 중요하게 생각하는지importance_same_religion : 같은 종교여야 하는 것에 대해서 얼마나 중요하게 생각하는지pref_o_... : 상대방 정보, 뒤에 붙는 항목을 얼마나 중요하게 생각하는지를 점수화(모든 점수의 합이 100이 되도록 분배)..._o : 각 항목에 대한 상대방의 평가..._important : 본인이 생각했을 때 각 항목이 얼마나 중요한지_partner : 파트너에 대한 평가interests_correlate : 취향 유사도(상관관계로 표현)expected_happy_with_sd_people : 이벤트에 대한 기대 정도expected_num_interested_in_me : 나에게 관심을 보이는 정도like : 상대방이 얼마나 좋았는지 점수로 표현guess_prob_liked : 상대방이 나에게 몇 점을 주었을지 표현match : 커플 성사 여부match : 예측해야 할 종속 변수
10줄을 보면, gender와 age, race 동일 -> 상대방 정보만 바뀜. -> 동일인인건지 살펴봐야 함.
importance_same_race, importance_same_religion 역시 동일
그 외에도 확률에 대한 분포값들이(데이터들이) 동일함.
20개를 확인해보니 확실히 10개 행 단위로 한 명의 사람임을 알 수 있음.

Missing Value 다수 존재
대부분이 숫자형 데이터 -> object 데이터만 잘 살펴보면 될 듯
데이터 타입에는 문제가 없음을 알 수 있음.

1~10까지의 값에서 이상한 값 발견 -> 정리 필요

'단어'.startswith('알파벳') : 단어가 그 알파벳으로 시작하는지
'단어'.endswith('알파벳') : 단어가 그 알파벳으로 끝나는지

-_o로 끝나는 부분이 변환되어서 의도치 않은 변경이 일어남.




🚨 중요 : 머신러닝 학습 시 종속변수에 결측치가 존재한다면 그 결측치는 무조건 DROP해야 함.
- 최빈값, 평균값 등으로 채울 수 없음.
- 종속 변수는 정답값이기 때문에 노이즈 이상으로 잘못된 데이터가 될 수 있음!!
- 독립 변수는 노이즈를 감수하고 대체 가능

'o_important' or 'i_important'로 시작하는 컬럼명 -> drop_cols 리스트로 저장

저장한 drop_cols를 드랍

결과


이렇게 처리할 수 있는 이유
- object 컬럼(gender, race, race_o)의 결측치가 없음.
- 숫자형 컬럼에만 결측치가 있음.
-99와 같은 수치를 넣고 -> 선형 모델을 쓰면 안됨!
- 선형 모델에서는 그 수치를 굉장히 좋지 않고 낮은 것으로 받아들임.
- 선형 모델은 숫자의 크고 작음에 많이 민감하기 때문.
- 트리 기반 모델은 선형 모델보다 덜 민감.
수치 다시 한번 확인

o_score_attractive

o_score_funny



import 관련 컬럼 6개 합이 100 미만 또는 100 초과하는 케이스도 정리
o_important로 시작하는 컬럼명 모아서 리스트에 저장

100이 아닌 수치 찾기 -> o_imp_sum으로 저장


i_impotant도 동일하게 진행


확인

합이 100이 아닌 경우 찾기


해결 방법 : 강제로 합이 100이 되게끔 가중치를 부여!

95였던 합이 100으로 맞춰짐(i, o 모두 진행)



이제 필요없어진 o_imp_sum, i_imp_sum 다시 드랍

결측치가 있었다는 문제가 있었고 -> -99로 채웠음.
바로 계산 시 음수값들이 나올 것임.
나이 부분에 -99 값이 있을 경우 -> 나이차도 -99로 정리
나이차가 남자가 더 많은지, 여자가 더 많은지에 따라서도 변수가 될 수 있음.

+, -는 어느쪽의 나이가 더 많은지에 대해서 표시한 것 -> 그러나 컴퓨터 입장에서는 -로 갈수록 나이차가 계에속 더더더더 적어진다고만 생가할 것임.
별도 컬럼을 만들어 남녀 구분이 가능하도록 할 것.


절대값 처리(구분한 컬럼을 만들었으니까)

값 확인 : 나이차 적용이 잘 되었는지 확인하기


결측치 처리를 했고, 드랍을 했기 때문에 -99같은 값은 없을 것.

같은 인종인지 여부 -> same_race로 저장

same_race에 importance_same_race를 곱해주면
하지만, 인종이 다른 경우는 무조건 0이 곱해지는 문제 발생
same_race의 0 부분을 -> -1로 변경해서 의도한 값이 나오도록!
- 0 값을 -1로 조정

상대방에게 준 점수를 수치화하는데 더 유의미한 결과가 나올 것.
🚨주의 : score에는 -99로 결측치를 채워준 부분이 있음.
즉, -99가 포함되었을 경우 ➡️ -99로 계산 결과값이 나오도록 조정
리스트 모아주기


참고 : zip 함수 사용법
o_rating, i_rating에 들어갈 컬럼명 지정

o_rating
계산 결과를 -> o_rating, i_rating으로 저장

확인

i_rating

각 rating 평균값 구하기

더 고려할 부분
- rating 점수의 0점
- score가 0점이거나 important 부분이 0인 경우가 있음.
- 중요도가 0이라면 -> 중요하지 않게 생각하니 0으로 들어가는게 맞음.
- 하지만 10점을 줬지만, 중요하지 않아서 0점이 된 경우 -> 계산에서 제외되는 것이 맞음!




바로 평균을 구하는 코드를 전체에 적용하기보단, test를 해보고 이해한다음 코드를 잘 써서 적용해보자.
8377번(-99가 3개 있음)으로 test


dating_df[i_rating].loc[8377][dating_df[i_rating].loc[8377] > 0].mean() 이 개념을 통해 평균 코드 일반화해 작성하기

head(), tail()로 다시 확인

🧐 조합 평균이란?
- 두 값이 비슷할수록 -> 평균값이 높게 측정됨.
- 조합 평균 구하는 방법 :
2 * 데이터1 * 데이터2 / (데이터1 + 데이터2)
dating_df['rating_mean'] = 2 * dating_df['o_rating_total'] * dating_df['i_rating_total'] / (dating_df['o_rating_total'] + dating_df['i_rating_total'])


위의 제외 컬럼 빼고 아래 사진(gender, age...등등 기본은 물론 무조건 유지!)

계산


same_race도 삭제

same_race_point만 잘 남은 것 확인 완료



기본 사용 방법
함수 정의

script로 등록

파일 저장(루드 폴더에 src 폴더 미리 생성)

FileNotFoundError
import os
os.makedirs('./src', exist_ok=True)



스피딩 데이터 파일에 적용
col_rename으로 저장


./aiffel/src에 저장되었는지 확인

test.py


- 컬럼 이름이 잘 반영되지 않았는데? -> 해당 코드가 빠져서 그런 것
- 그런데... 피처 엔지니어링이 끝난 데이터면..이미 위 함수들을 다 거쳐온 데이터 아닌가...? 근데 이게 적용이 되는지 확인할 수 있어..?

아무래도 원본 데이터가 맞는거 같음...!
- 거기에서 match만 드랍해서 new_dating2.csv로 저장해서 쓰자.
- 그리고 모든 새로운 함수 등록 시 -> 커널 재시작 + 셀 모두 재실행해서 적용할 것!




10 초과값 -> 10으로 정리 파트


합 100 만들기 파트















