본문 바로가기
멋쟁이사자처럼 AI School 8기(fin)/WIL(Week I Learn

[멋쟁이사자처럼 AI스쿨] Week8 - WIL

by #FF0000 2023. 2. 9.

 

 

23.02.06 - 23.02.08, AIS8 8주차 WIL

 

mini project2를 끝낸 시점인 2월 9일 오늘. 

대망의 mid project 조 구성이 발표 되었다.

EDA 수업이 끝난 이번주.

WIL 시작.

 

이번주의 학습 테마를 6가지로 정리하면

  • 공공데이터를 활용해 전혀 다른 두 개의 데이터를 가져와서 전처리 하고 병합하기
  • 수치형 데이터와 범주형 데이터를 바라보는 시각을 기르기
  • 데이터의 형식에 따른 다양한 시각화 방법 이해하기
  • glob 를 사용해서 여러 파일을 로드해서 하나로 합치는 방법(약 700mb)
  • 상관 계수의 종류, 시각화 하는 방법, 삼각행렬을 만들어서 마스크 처리 방법, 컬러 선택 방법
  • 지도 시각화 방법

 

 

 

EDA  처리 과정 요약.

▶ 서로 다른 형태(row, columns)를 갖는 데이터의 전처리 및 병합.

 

 

제목에 한글이 있는경우 문제 발생 가능하여 glob로 로드를 시작

from glob import glob
file_names = glob("data/apt*.csv*")   
file_names = sorted(file_names)
file_names

 

 

인코딩을 추가하여 판다스로 파일을 불러오면 전처리 준비 끝.

df = pd.read_csv(file_names[1], encoding="cp949")

 

 

EDA를 위해 먼저

df.info()로 데이터를 요약하여 구성을 파악하고,

 

 

결측치 확인

df.isnull().sum()

 

 

데이터 타입 변경(데이터가 'object'(문자) 타입 -> 문자열 타입을 계산할 수 없기 때문에 수치 데이터로 변경)

df["분양가격"] = pd.to_numeric(df_last["분양가격"], errors='coerce')

# errors='coerce' 는 오류 발생시에도 강제 변경

 

 

파생변수 생성

df_last["전용면적"] = df_last["규모구분"].str.replace("전용면적|제곱미터| |이하", "", regex=True)
df_last["전용면적"] = df_last["전용면적"].str.replace("초과", "~")

# replace => 데이터프레임에만 사용가능(regex=True 를 지정하지 않으면 완전히 일치하는 데이터에 대해서 변경)
# str.replace => 시리즈에만 사용가능, 일부만 일치해도 변경.

# regex(regular expression 정규표현식)

 

 

미사용 데이터 드랍

df_last = df_last.drop(columns=["규모구분", "분양가격"])

↔ df_last = df_last.drop(["규모구분", "분양가격"], axis=1)

# drop 사용시 axis에 유의. axis 0:행, 1:열

 

 

melt로 Tidy data 만들기

pandas의 melt를 사용 -> 데이터의 형태 변경.

                                        데이터 병합을 위한 melt 사용 열 →  행으로 녹이기.

df_first_melt = pd.melt(df_first, id_vars="지역")

 

 

컬럼명 변경

df_first_melt.columns = ["지역명", "기간", "평당분양가격"]

 

 

데이터 분리(연도-열)

1) 데이터 분리 함수 생성

def parse_month(date):
    month = int(date.split("년")[1].replace("월", ""))
    return int(month)

2) apply를 통한 변수 입력

df_first_melt["연도"] = df_first_melt["기간"].apply(parse_year)

 

 

데이터 병합을 위한 정리

df_last_prepare = df_last.loc[df_last["전용면적"] == "모든면적", cols].copy()

# 조건 필터로 필요 데이터만 변수에 할당

 

 

인덱스 초기화 및 데이터 병합

df_first_prepare =  df_first_prepare.reset_index(drop=True)
df_last_prepare = df_last_prepare.reset_index(drop=True)
df_data = pd.concat([df_first_prepare, df_last_prepare], axis=0)

 

 

데이터 집계 방법 3가지

crosstab, pivot_table, groupby

 

df_c = pd.crosstab(index=df_b["시도명"], columns=df_b["브랜드"])

df_p = df_b.pivot_table(index="시도명", columns="브랜드",
                      values="상호명", aggfunc="count", fill_value=0)

df_g = df_b.groupby(["시도명", "브랜드"])["브랜드"].count().unstack().fillna(0).astype(int)

 

 

시각화를 위한 항목 분류

df_world = df[df["국가권역"].isin(world)].copy()
df_country = df[~df["국가권역"].isin(world)].copy()

# isin을 사용

 

 

 

시각화

pandas

matplotlib

plotly

 

 

 heatmap() & style.background_gradient()

- 전달하고자하는 메세지가 무엇인가?

 heatmap() - 전체 스케일 비교에 적절 

 style.background_gradient() - 각 변수별 비교에 적절

 

 

 

상관분석(Correlation analysis) & 상관계수(Correlation coefficient)

(확률론과 통계학) 두 변수간에 어떤 선형적 또는 비선형적 관계를 갖고 있는지를 분석하는 방법.

 두 변수는 서로 독립적인 관계이거나 상관된 관계일 수 있으며, 이때 두 변수간의 관계의 강도를 상관관계(Correlation, Correlation coefficient)라 한다. 

 상관관계의 정도를 파악하는 상관 계수는 두 변수간의 연관된 정도를 나타낼 뿐 인과관계를 설명하는 것은 아니다.

cf) 두 변수간에 원인과 결과의 인과관계가 있는지에 대한 것은 회귀분석을 사용

 

* 피어슨 상관계수

  • r 값은 X 와 Y 가 완전히 동일하면 +1, 전혀 다르면 0, 반대방향으로 완전히 동일 하면 –1 을 가진다.
  • 결정계수(coefficient of determination)는 r^2 로 계산하며 이것은 X 로부터 Y 를 예측할 수 있는 정도를 의미한다.

 

 

np.tril & np.triu