19일차 멋사 AI스쿨 main lecture by 박조은 강사님
EDA 실습
- 전국 신규 민간 아파트 분양가 데이터 분석 (전혀 다른 형태의 데이터 합치기)
- 통계청 KOSIS 데이터 분석 (깔끔한 데이터의 이해와 국가통계포털 이용법)
전국 신규 민간 아파트 분양가 데이터 분석
melt
(열에 있는 데이터를 행으로 녹이기)
id_vars = 에 지정하는 값은 녹이지 않고 남길 컬럼 지정
https://pandas.pydata.org/docs/user_guide/reshaping.html#reshaping-by-melt
# 아래 두 개는 같은 결과
# df.melt(id_vars="지역")
df_melt = pd.melt(df, id_vars="지역")
데이터를 녹인 다음엔 variable, value 컬럼명 바꿔주기 df_melt.columns = ["바꿀컬럼명", ...]
날짜 정보를 년도와 월 컬럼으로 분리하기
(ex. "2013년 07월" 형태)
1. str.split() 사용하기
split과 apply 활용하는 방법
# parse_year라는 함수를 만듭니다.
# 연도만 반환하도록 하며, 반환하는 데이터는 int 타입이 되도록 합니다.
def Parse_year(date):
return int(date.split("년")[0])
# parse_month 라는 함수를 만듭니다.
# 월만 반환하도록 하며, 반환하는 데이터는 int 타입이 되도록 합니다.
def Parse_month(date):
return int(date.split("년")[1][:-1])
apply 메서드 사용법 df\["적용할 컬럼"\].apply(함수명)
2. str접근자 (expand=True), 데이터 변환 astype사용하기
# expand=True를 사용하면 바로 데이터프레임의 컬럼으로 가져온다
# astype(int)를 통해 데이터 타입을 숫자로 변환해준다
df_first_melt["기간"].str.split("년", expand=True)[0].astype(int)
df_first_melt["기간"].str.split("년", expand=True)[1].str[:-1].astype(int)
3. lambda 익명함수 사용하기
# 익명함수 lamda 사용하기, 데이터 변환 방식 2가지 사용
df_first_melt["연도"] = df_first_melt["기간"].map(lambda x: int(x.split("년")[0]))
df_first_melt["월"] = df_first_melt["기간"].map(lambda x: x.split("년")[1][:-1]).astype(int)
행과 열 형태가 다른 두개의 데이터셋 합치는 절차
- 기준 데이터셋에 맞추어 다른 데이터셋의 데이터 형태 가공하기
- 최종 데이터셋에 사용할 컬럼명을 리스트에 담아 변수로 활용
- 두 데이터셋의 컬럼명을 변수랑 똑같이 바꿔주기
- pd.concat()으로 두 데이터셋을 합쳐주기
#컬럼명 맞춰준 두 데이터를 합쳐주기, axis=0은 생략 가능
pd.concat([df_first_prepare, df_last_prepare], axis=0)
완성된 df를 바탕으로 group by, crosstab, pivot_table 연습 (-> 나중에 공부방에 정리하기)
seaborn 시각화 실습
(heatmap, barplot, pointplot, boxplot, violin plot, scatterplot, stripplot, swarmplot, catplot 등)
plt.figure(figsize=(12,4))
sns.barplot(data=df, x='지역명', y='평당분양가격')
# 연도별 평당분양가격 swarmplot 그리기 size는 점 크기
plt.figure(figsize=(15,5))
sns.swarmplot(data=df, x='연도', y='평당분양가격', size = 2)
히트맵(heatmap)
fmt는 문자열을 지정해주는 파라미터입니다.
fmt=".0f"은 소수점(.) 0번째 자리까지만 출력하여 정수로 표시합니다.
catplot
# 최신버전 ci => errorbar = None
sns.catplot(data=df, x='연도', y='평당분양가격', col="지역명", col_wrap=5, kind="point", hue="지역명", ci=None)
pandas로 데이터를 한 번 정리한 후에 시각화하면 더 빠르고, 예쁘게 시각화 할 수 있다.
# seaborn palette 색상 옵션 변경 '_r' 색상 반전
sns.barplot(data=local_table, x=local_table.index, y="평당분양가격", palette="Greens_r")
통계청 KOSIS 데이터 분석
melt하면서 컬럼명 같이 바꾸기
# melt 로 깔끔한 데이터(tidy data)만들기
df = pd.melt(raw, id_vars=["국가및권역별","전산업·소재부품장비산업별","항목","단위"], var_name="연월", value_name="달러")
# raw.melt(id_vars=raw.columns[:4]) 같은 뜻, 앞에서 4번쨰 컬럼까지 사용하겠다.
데이터 전처리
결측치 하나라도 있으면 제거
df = df.dropna()
유니크 값의 개수 세기
df.nunique()
사용하지 않는 칼럼 제거하기
df = df.drop(columns="단위")
데이터 내의 필요없는 문자열 지우기 (정규표현식)
df\["항목"\] = df\["항목"\].str.replace("액\\\[\\$\\\]","", regex=True)
정규표현식 ```
- [0-9] : 0~9까지의 숫자 중 하나를 포함하고 있는지
- [^0-9] : 숫자를 포함하고 있지 않음
- [^가-힣] : 한글이 포함되어 있지 않음
- [가-힣+] : 한글이 하나 이상 포함되는지
[^blah]: 부정의 의미
‘^blah’: blah라는 단어로 시작하는 것 가져옴
```
정규표현식 더 알아보기:
https://docs.python.org/ko/3.10/library/re.html#re.sub
https://docs.python.org/ko/3.10/howto/regex.html#matching-characters
연월 파생변수 만들기 [2012.03월] -> [2012], [3]
# "월" 글자 제거
df["연월"] = df["연월"].str.replace("월","").str.strip()
# 파생변수 만들기
df["연"] = df["연월"].str.split("\.", expand=True)[0].astype(int)
df["월"] = df["연월"].str.split("\.", expand=True)[1].astype(int)
컬럼 중 일부 컬럼명만 수정하기 df.rename
df = df.rename(columns={"국가및권역별": "국가권역", "전산업·소재부품장비산업별":"산업"})
데이터 프레임 분리하기
- 데이터에 중복되는 의미가 함께 포함된 경우(ex. 데이터 행에 아시아, 일본, 대만, 유럽, 프랑스, 이탈리아 ... 등 포함관계가 있을 때)
# df["국가권역"].unique()값 중 사용하려고 하는 데이터만 리스트에 담아 world라는 변수에 할당하기
world = ['아시아', '중동', '유럽', '북미','중남미', '아프리카', '오세아니아','기타지역', 'EU(27)', 'OECD', 'ASEAN', 'LAIA', '선진국', 'OPEC', '개발도상국']
# world에 있는 경우와 없는 경우로 데이터프레임 나눠주기
df_world = df[df["국가권역"].isin(world)]
df_country = df[~df["국가권역"].isin(world)]
.nlargest(N)
값이 높은 N번째 까지 출력
top10 = df.groupby(\["국가권역"\])\["달러"\].sum().nlargest(20)
Plotly시각화
기본형 (막대그래프)
px.histogram(df_country, x="달러", y="국가권역")
옵션
histfunc="sum" (seaborn estimate 기능과 유사)
color="항목"
barmode="group"
facet_col='항목'
facet_row='산업'
marginal="violin"
facet_col_wrap = 4
height=500
더 많은 옵션에 대해서는 shift + tab + tab으로 확인하기
사실(Fact) : 아파트 분양가 실습(seaborn 시각화), 통계청 데이터셋 (데이터 전처리, plotly 시각화)
느낌(Feeling) : 시각화 방법끼리 머릿속에서 섞이기 시작했다 (seaborn, plotly, matplotlib)
교훈(Finding) : 언제 어떤 시각화 방법이 효율적일지, 문법이 어떻게 다른지 한 번 총정리하면 좋을 것 같다.