TIL/멋사_AI스쿨_TIL

221011 AI스쿨 TIL Tidy data

둥둥런 2022. 10. 11. 23:00

18일차 멋사 AI스쿨 main lecture by 박조은 강사님

- 서울시 코로나 확진자 데이터 분석 실습 마무리

- 분석하기 좋은 데이터란 (Tidy Data)

- 아파트 분양가 데이터 분석 실습 시작


describe(include = ‘object’)

  • count 결측치를 제거한 빈도수
  • unique 중복값을 제거한 유일값
  • top 최빈값
  • freq 최빈값의 빈도수

replace 메서드

- 데이터 프레임, 시리즈에 모두 사용

- replace는 완전히 일치해야 적용 → regex=True를 통해 일부만 가능하게 바꿀 수 있다.

str.replace

- 시리즈에만 사용가능

- str.replace는 해당 텍스트만 포함되면 바뀌게 된다

- str.contains도 시리즈에만 사용가능 (str이 series accessor이기 때문)

 

정규표현 메타문자

ex) [^0-9]: 숫자를 제외한 문자 

위키피디아 https://ko.wikipedia.org/wiki/정규_표현식

점프투파이썬 https://wikidocs.net/4308

이메일 주소 형식 맞는 지 체크할 때, 파일 확장자 확인할 때 등 주로 사용

 

데이터프레임에서

  • df[”컬럼명”]
  • df.컬럼명

2개의 결과는 같지만, 컬럼명에 공백, 특수문자가 있는 경우엔 아래 방법을 쓰면 오류가 날 수 있어서 위의 방식을 쓰는 것이 좋다

 

시각화할 때 행과 열 바꾸기

  • T -> transpose()

요일을 0~6 숫자에 대입하기

지난 시간 실습 복습

원래 데이터셋에서 요일이 0~6 숫자로 나온다면? 요일리스트를 만들어서 바꿔준다.

리스트 컴프리헨션으로 요일 리스트 만들기

weekday_list = [x for x in "월화수목금토일"]

year_weekday.columns = weekday_list

+) 만약 컬럼명 바꿀때 리스트 개수가 안맞으면 Value Error

pd.crosstab

pivot table이 이미 있음에도, 한 번 더 감싸서 사용하기 쉽게 만들어 놓은 API

두 변수의 빈도 구하기 (group by, pivot_table, crosstab)

# 예시 index=, columns= 은 생략 가능
ym = pd.crosstab(index=df["연도"], columns=df["월"])

background_gradient()

색으로 빈도수 표현하기

사용할 수 있는 색상 옵션 확인하기 print(plt.colormaps())

빈도수를 막대 형태로 나타내기 gu\_ym.T.style.bar()

style 더 읽어보기: https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html

 

boolean indexing

  • 여러 조건 비교하기
#아래 두 줄은 같은 결과
# df[(df["거주구"] == "강남구") & (df["요일"]==6)][["확진일","접촉력"]]
df.loc[(df["거주구"] == "강남구") & (df["요일"]==6),["확진일","접촉력"]]
  • isin으로 여러값 찾기
df.loc[df["거주구"].isin(["강남구","서초구","송파구"]),["접촉력"]]

loc와 ~ 사용해서 True, False에 이름붙이기

# 표시를 더 친절하게
df.loc[df["접촉력"].str.contains("해외유입"),"해외유입"] = "해외"
df.loc[~df["접촉력"].str.contains("해외유입"),"해외유입"] = "국내"
df[["접촉력", "해외유입"]].tail()

 

normalize와 직접 나누는 방법의 차이

정규화는 전체 확진자대비 비율을 구하기 때문에 전체 합이 1이된다.

직접 나눠 계산한 비율은 다 더해도 1이 되지 않는다. 구별 확진자 수가 다르기 때문이다

normalize 식 = 해당 항목의 수 / 전체 빈도수

 

 

타이타닉 데이터분석 과제리뷰

현실에서는 나이의 결측치에 0을 넣는 것은 추천하지 않는다.

결과 값에 왜곡을 가져올 수 있다. (ex. 평균값이 확 낮아진다)

 

 

분석하기 좋은 깔끔한 데이터란? Tidy data

각 변수가 열이고, 각 관측치가 행이되도록 배열된 데이터이다. (by Hadley Wickham)

크로스테이블 형태 데이터는 분석하기 좋은 데이터가 아니다.

Tidy data로 만들기 위해 melt를 사용한다. (열에 있는 데이터를 행으로 녹인다, pivot의 반대라고 생각하기)

 

long-form vs wide-form 데이터 형태에 따라 시각화하는 것이 달라진다. (seaborn)

아파트 분양가 데이터 분석

행과 열의 구성 형태가 다른 데이터를 가공하는 연습

데이터 분석 전 슈도 코드를 작성하여 단계를 나누어보는 연습을 하면 좋다.

 

데이터파일 위치 불러오기

from glob import glob
glob(”파일명.파일확장자”)
sorted(glob(”파일명.파일확장자”)) # 파일 순서 정렬
file_paths = glob(”파일명.파일확장자”) # 변수안에 넣기
file_paths[0] # 여러개 파일 중 인덱싱해서 사용하기
df = pd.read_csv(file_paths[0])

파일이 안열릴땐 encoding 확인하기 (UTF-8 또는 cp949)

 

데이터 타입 변경

pd.to_numeric() : 데이터 타입을 숫자형 으로 변환하기

errors = “coerce”를 쓰는 이유

errors는 에러를 어떻게 처리할지의 옵션(기본값은 raise)

coerce는 에러가 발생한 데이터를 NaN으로 바꿔준다.

 

.str.replace() 활용

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

"전용면적"또는 "제곱미터이하"라는 텍스트를 지우는 방법

regex=True 경고메시지가 출력여부만 달라지고 결과는 같다.

FutureWarning 경고 메시지를 출력하지 않겠다

 

drop으로 안쓰는 열 지우기 ( axis 0:행, 1:열 )

# 2개의 열 한번에 지우기
df_last = df_last.drop(columns=["규모구분","분양가격"], axis=1)

메모리 사용량 줄어들었는지 확인해보기