6/18 Today I Learned -1

boks·2024년 6월 18일
post-thumbnail

📖 학습한 내용

  • 행정구역별 인구수 예측모델 생성 - 데이터 전처리

📖 핵심내용

📌 행정구역별 인구수 예측모델 생성

데이터 추가

주택 건설 통계 - 합계 검사 실적 피처 추가
범죄 기록 - 강력범죄 피처 추가

데이터 전처리

  1. 시점 95~0 으로변경
  2. 원핫 인코딩
df_final_onehoted = pd.get_dummies(df_final, columns=['지역별'], drop_first=True)

-> drop_first=True 로 피처 줄여서, 차원의 저주 최대한 피하기

  1. 피처이름 변경
df_final_onehoted.columns = df_final_onehoted.columns.str.replace('지역별_', '')

-> 중간에 str 이들어가는 이유는 판다스 인덱스 객체이기 때문이다. 판다스 인덱스 객체는 문자열 메서드를 직접 사용할 수 없다. .str 접근자는 시리즈나 인덱스 객체에 문자열 메서드를 벡터화하여 적용할 수 있도록 한다.

  1. 피처 드랍
    회의에서 결정한 피처를 드랍

  2. 자료형 변경 object -> float

  • 전처리 도중 이상치 발견
    info 로 보거나 대략 훑어 봤을때 아무 문제 없었지만, 데이터프레임.astype(float) 에서 '-'를 바꿀 수 없다는 에러메세지를 확인하였다. 그래서 찾아보니 결측치를 '-'로 넣은 데이터들이 많았다.
    그래서 '-' 가 들어간 데이터를 분류하려는데, 이번에는 '-25' 와 같은 문자형 수치 데이터(음수)가 문제였다. 그래서 일단 '-'가 들어가지 않은 데이터를 처리한 뒤, '-'만 있는 데이터를 처리하고, 나머지데이터도 처리 완료하였다.

    '-' 가진 컬럼 모두 추출 코드

    minus_col = []
    for col in object_col:
        if df_final_onehoted[col].str.contains('-').any():
            minus_col.append(col)
    len(minus_col), minus_col

    -> str.contains() 는 판다스 시리즈의 문자열에 특정 패턴이 포함되어 있는지 여부를 확인한다. 결과는 불리언 값을 반환한다. 반환 된 불리언 값을 any() 가 받는다. any() 는 불리언 시리즈에서 하나라도 참(True)인 값이 있는지를 확인하고, 하나라도 참인 값이 있으면 True를 반환하고, 그렇지 않으면 False를 반환한다.

결측치를 '-'로 표기한 값 NaN으로 변경 코드

for col in nan_col:
    df_final_onehoted[col] = df_final_onehoted[col].str.replace(',','').replace('-', np.nan).astype(float)

-> 3자리수, 음수와 '-' 결측치가 섞여있기 때문에 먼저 콤마를 떼어주는 작업을 한 뒤에 실수형으로 변경

  1. 최종 확인
    최종 결측치 확인

자료형 확인

📖 흥미로운 점 / 새로 알게된 점

  • isin([])
    isnull() 은 매우 잘 활용하고 있었는데, 유용한 매서드를 알았다. [] 안에 값이 있는지 없는지 불리언 값으로 반환한다.
  • .astype()
    .astype() 는 원본데이터에 적용해주는 기능이 없다. 따라서 원본데이터에 할당해야한다.
  • 마스킹으로 결측치 확인
    df_final.isnull().sum()[df_final.isnull().sum().values != 0]
  • 업무 분담 프로세스
    전처리 작업을하면 나머지 인원은 데이터를 변경하지 못하므로 역할이 없어진다. 이때 나머지 인원은 그 전처리를 완료했다고 가정하고, 코드를 짜거나, 자료조사를 하게된다.

📖 어려운 부분

  • 시계열 모델이 아닌 모델로, 미래 데이터에 추측 가능성에 대한 고민
    주제 선정 이후, 자료조사를 모두 마친 상태에서 다음달 예측을 할 수 있는지 가능성에 대한 이야기가 나왔다. 이 전까지는 시계열 모델에 대한 이해가 전혀 없어서, 정형데이터 모델링으로는 시간 변화에 따른 미래데이터 추측이 어렵다는 사실을 몰랐기 때문이다.
    임영재 멘토와 이야기를 해본 결과, 시간적인 요소는 업애야한다는 것을 알았다. 따라서 날짜 데이터를 모두 단순 오름 차순 숫자로 하여 인덱스화 시키고, 다음달의 인구수 데이터를 입력하기로 결정했다.

  • 전처리 과정의 어려움
    서로가 가져온 피처를 병합하던 도중, 날짜 데이터를 바꾸니 중간 중간 이상하게 정렬이 되었다. 이 사실을 모른채 데이터 전처리를 진행하였다. 후에 깨달았을 때는 이미 여러사람 손을 거쳐서 어디서 잘못되었는지 찾기 어려웠다. 하지만, 버전관리를 잘해놔서 어디서 잘못되었는지를 결국 찾았고, 그지점부터 다시 시작했다.
    이때 다른사람들 시간이 어중띄게 되었을때, 추가자료 조사와 미리 코드를 짜도록 하였다.

📖 이후 학습 계획

  • 데이터 값이 0인 것들 확인
check_list = []
for idx, val in enumerate((df_final_onehoted==0).sum().values):
    if val != 0:        
        check_list.append(f'{(df_final_onehoted==0).sum().index[idx]} : {val}')
check_list = check_list[1:14]
print(check_list)


-> 데이터 표를 보고 직접 확인해보자

  • EDA를 통한 결측치를 채울 방안 탐색
  • EDA를 통한 인사이트 발견
  • EDA를 통한 추가 이상치/결측치 발견

📖 기타

확실히 데이터를 많이 들여다 보는게 중요한 것 같다. 이 데이터가 지금 쓰이는 것이 맞는지, 다른 파생변수를 볼 수 없는지, 너무 모델에 큰영향을 줄지 다중으로 체크를 해야한다는 생각이든다.
또한 데이터 전처리 중에 이상치와 결측치들을 새롭게 발견할 수 있었다. 다른 사람이 정리한 표를 내가 가져오기에 디테일하거나 예상치 못한 부분이 있다. 이런 부분을 데이터를 꼼꼼히 들여보고 조작해가며 알아내야한다.

profile
설계엔지니어의 변신

0개의 댓글