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)
메모리 사용량 줄어들었는지 확인해보기