221012 / 0304번 실습파일 : 결측치, melt, 연도월분리, 그룹바이, 피봇테이블, 히트맵, seaborn/ 0305번 실습파일 : 결측치, melt, 전처리, 정규표현식, rename, nlargest, plotly
멋쟁이 사자처럼 AI스쿨 7기, 박조은 강사님 강의
221012
1. 0304 실습파일 전국 민간 아파트 분양가격 동향
1.1 glob
내부에서 정규 표현식 사용 가능, 경로 찾을 때 사용
sorted(glob("data/파일명*.csv")해서 순서를 맞춰서 부를 수도 있다.
- 분양 가격의 결측치는 왜 많을까? 신규 분양이 아예 없었다.
- 미분양과 다름 : 미분양은 분양했는데 청약이 미달
1.2 결측치
isnull().sum() / isna().sum()
히트맵으로 결측치를 시각화하여 확인해본다. "분양가격" 컬럼에 결측치가 많다.
1.3 pd.options.display.max_columns
pd.options.display.max_columns = None
모든 컬럼이 출력되게 설정. 전체를 보고 싶을 때는 None
보고 싶은 만큼 숫자 지정도 가능
1.4 melt로 tidy data
지역만 남기고 다 지울 것 : id_vars = "지역"
컬럼 이름 변경 : rename 가능 / var_name으로 melt에서 바로 지정 가능/ 여러 컬럼 한꺼번에 바꿀 것이기 때문에 리스트 형태로 함께 바꿈.
shift+tab해서 궁금한 것 있으면 예제로 실습해보기 ex) A를 남기고 B를 녹이면 C는 없어지는가?
1.5 연도, 월 분리(split, 함수, 람다)
df_first에 담긴 지난 데이터는 2013년12월의 형식으로 되어 있고, 최신 데이터인 df_last는 연도 컬럼과 월 컬럼이 나뉘어 있다.
- split : df_first_melt["기간"].str.split("년")
-> 출력 결과 [2013, 12월]
-> .str.split("년", expand=True)[0].astype(int)
split을 하면 리스트가 값으로 들어간다. expand를 사용하면 리스트를 풀고 각각에 대해 값으로 사용할 수 있게 해준다. - 슬라이싱 : df_first_melt["기간"].str.split("년", expand=True)[1].str[:-1].astype(int)
- 익명함수
df_first_melt["기간"].map(lambda x : int(x.split("년")[0]))
df_first_melt["기간"].map(lambda x : int(x.split("년")[1][:-1])) - 함수 : parse_year과 parse_month라는 함수를 적용
df_first_melt["연도"] = df_first_melt["기간"].apply(parse_year) - int("2013") == 2013 은 True / "2013" == 2013 은 False / 그래서 int로 변경해주어야 수치 형태로 취급 된다.
1.6 그룹바이
그룹바이로 시각화 했을 때 색인?이 그래프에 겹쳐져서 따로 빼고 싶다면, plt.legend(bbox_to_anchor=(1,1))
1.7 피봇테이블, 히트맵
pd.pivot_table(data=df,~)
df.pivot_table하면 데이터를 지정해주지 않아도 된다는 장점이 있다. 평균은 따로 지정하지 않아도 기본적으로 그려준다.
- 히트맵에서 annot=True는 그래프 상에 수치를 표시해준다. annotate
- fmt=".0f" 소수점을 표시 안한다는 뜻.
fmt="g"는?
1.8 시각화(seaborn으로 bar, violin, swarm)
- barplot
- 검은 막대: error bar. 신뢰구간.
- 없애고 싶다면 ci=None, 최신버전은 errorbar=None
- 검은 막대를 없애면 속도가 빨라진다.
- 이상치 : 서울 가격
- violin plot
- kde 마주보고(kde는 히스토그램을 부드러운 곡선으로 추정해서 그린 것)
- hist-> kde(density) 밀도 -> violin
- 흰 점은 중앙값
- swarm
- scatter 단점 보완 -> strip 뭉쳐있는 단점 보완 -> swarm
- 점 사이즈는 size = 으로 조절 가능
- pallete = "색상_r" 색반전
- 서브플롯 FacetGrid
2. 0305 실습파일 : 국가 및 권역별 수출 수입
통계설명 자료 : https://www.narastat.kr/metasvc/index.do?orgId=115&confmNo=115012&kosisYn=Y
2.1 결측치
결측치 시각화(히트맵)해서 보면 항목이 많아서 잘 안보인다.
raw.isnull().sum()을 null_sum이라는 변수에 담아주고,
null_sum[null_sum>0]해주면 Unnamed: 라는 컬럼에 131개의 결측치가 있다.
2.2 melt
df = raw.melt(id_vars=['국가및권역별', '전산업·소재부품장비산업별', '항목', '단위']) 해서 raw.columns 했을 때 나온 컬럼들을 복사해와도 되고,
df = raw.melt(id_vars=raw.columns[:4], var_name="연월", value_name="달러")
처럼 슬라이싱해서 가져와도 된다.
2.3 결측치 제거
- dropna() - 헷갈렸던 것. drop_duplicates() 는 중복값 제거
- 잘 제거 되었는지 nunique()로 확인
- drop(columns="단위") : 필요 없는 컬럼 삭제. 변수에 할당해주지 않으면 적용이 안된다.
2.4 전처리(정규표현식) - 액[$] 제거, 연월
- 오류가 난다면 깊은 복사 : df=df.copy() : subset을 만들어서 subset을 다시 가공할 때 깊은 복사를 해주게 된다.
- 항목에서 액$제거
- df["항목"].str[:2]
- 액\[[$]]
- [^수입출]
- 액\[\$\]
- df["항목"] = df["항목"].str.replace("액[$]", "", regex=True)
- df["연월"] = df["연월"].str.replace("월", "").str.strip() : 할 때 replace("월", " ")로 빈 공백을 줬었는데, 그렇게 되면 빈 공간이 그대로 들어가기 때문에 나중에 오류가 날 수 있다. 전처리를 실수 없이 하자!
- 연월 파생변수
df["연"]=df["연월"].map(lambda x : int(x.split(".")[0]))
df["월"]=df["연월"].map(lambda x : int(x.split(".")[1]))
2.5 rename
df.columns로 컬럼명들을 확인하고, 컬럼명 변경하기
df = df.rename(columns={"국가및권역별": "국가권역", "전산업·소재부품장비산업별":"산업"}) : 국가및권역별을 국가권역으로 변경, 전산업-소재부품장비산업별을 산업으로 변경
2.6 nlargest
국가권역 달러 합계 금액 상위 20개
top20 = df_country.groupby(["국가권역"])["달러"].sum().nlargest(20)
2.7 plotly로 시각화
- px.histogram == seaborn의 barplot 과 유사한 기능.
- seaborn은 estimator 기능을 갖고 있는데 px.histogram은 histfunc을 갖고 있다.
- histfunc의 기본값은 count. count, sum, avg, min, max를 쓸 수 있다.
- px.histogram(df_country, x="달러", y="국가권역", histfunc="sum")
- seaborn에서의 hue == px 에서 color
- px.histogram(df_country, x="달러", y="국가권역", histfunc="sum", color="항목")
- barmode="group" : 판다스나 seaborn에서처럼 옆으로 항목을 보고 싶다면 barmode
3. 퀴즈
10/10문제
3.1 맞았지만 애매한 것
- 3번 문제 : 결과가 False인 것
- 2023 == int("2023")
- 2023 == "2023"
- str(2023) == "2023"
- 4번 문제 : Series의 데이터 타입이 object 인 것
- pd.Series([1,3,5])
- pd.Series([1,3,"5"])
- pd.Series([1,3,0.5])
- pd.Series([1,3,np.nan,5])
- 5번 문제 : 해당하는 컬럼만 인덱싱 하려고 할 때, df.loc / iloc아님
해결과제
깊은 복사와 얕은 복사? 어디서 한 번 했었더라?
fmt="g"? / fmt=".0f" 는 소수점(.) 0번째 자리까지만 출력하여 정수로 표시
댓글