TIL/멋사_AI스쿨_TIL

220927 AI스쿨 TIL 범주형 데이터 EDA, Seaborn

둥둥런 2022. 9. 28. 23:25

오늘의 회고

사실(Fact) : seaborn 범주형 변수 시각화 실습, FinanceDataReader 실습, 네이버 금융 뉴스 웹크롤링 실습
느낌(Feeling) : Seaborn과 Pandas dataframe에 좀 익숙해진 것 같다. 코드가 이제 낯설게 보이지 않는다. 근데 크롤링을 해보니 또 다시 새로웠다.
교훈(Finding) : seaborn example다른 그래프도 읽어보고 그려봐야겠다. 웹크롤링 부분 다시 자세히 복습해봐야겠다.


범주형 데이터 EDA, Seaborn

# mpg 데이터셋을 불러옵니다.
df = sns.load_dataset("mpg")
df.shape
# shape는 어트리뷰트라서 ()를 안붙여도 된다. 매서드가 아니다

df.head()
df.tail()
df.info()

기술통계 보기

# describe 를 통해 범주형 변수에 대한 기술통계를 보기
df.describe(include="object")

#object대신 np.int64 ... 가능
df.describe(exclude="object")
df.describe(include="all")

범주형 데이터라고 해서 꼭 object 형식으로만 있는 건 아니다.
bool, int, float으로 되어 있을 수도 있다.
⇒ 히스토그램 시각화를 해봤을때 이가 빠져있고 데이터가 떨어져있다

범주형 데이터 유일값, 유일값의 빈도수

df[”cylinders”].unique()

# nunique 값 구하기
df.nunique()

unique()는 series 타입만 가능하고
nunique()는 dataframe 타입만 가능하다 → document참고

빈도수 시각화하기 (countplot)
Seaborn의 특징 통계적인 연산 제공, 빈도수를 나타낸다
sns.countplot(data = df, x = "origin")

1개 변수의 빈도수 구하기(value_counts)
df["origin"].value_counts()

2개 이상의 변수에 대한 빈도수 구하기 - crosstab 활용

# pd.crosstab 으로 시각화한 값 직접 구하기 
pd.crosstab(index=df["origin"], columns = df["cylinders"])

같은 빈도수 countplot 시각화

Group by를 통한 연산

# groupby를 통해 origin 별로 그룹화 하고 mpg 의 평균 구하기
# df.groupby("origin")["mpg"].mean() - 시리즈 자료형
df.groupby("origin")[["mpg"]].mean() # - 데이터 프레임

Pivot table을 통한 연산

# pivot_table 로 같은 값 구하기 , 기본값은 mean
pd.pivot_table(data=df, index="origin", values = "mpg")

# groupby 를 통해 위 시각화에 대한 값을 구하기
df.groupby(by=["origin","cylinders"])[["mpg"]].mean()

pivot 과 pivot table의 차이

  • pivot() 은 형태만 변경하고 연산을 하는 기능이 없다.
  • 연산을 하기 위해서는 pivot_table()을 사용해야 한다.
  • 평균계산: 지정하지 않아도 기본값이 평균, AggFuncType="mean”
# pivot_table 를 통해 위 시각화에 대한 값을 구하기
pd.pivot_table(data=df, index="origin", columns = "cylinders", values = "mpg")

Dataframe의 unstacking


https://pandas.pydata.org/docs/user_guide/reshaping.html

df.groupby(by=["origin","cylinders"])[["mpg"]].mean().unstack()

  • 마지막 인덱스의 값을 컬럼으로 끌어올린다
  • unstack(”인덱스값”)을 쓰면 해당 인덱스값을 컬럼으로 끌어올린다
  • 숫자를 쓰면 0을 쓰면 가장 앞의 인덱스를 컬럼으로 끌어올린다

Boxplot과 사분위수

# boxplot 으로 origin 별 mpg 의 기술통계 값 구하기
sns.boxplot(data=df, x="origin", y= "mpg" )

박스플롯 이해하기

  • 상자수염그림이라고 불림
  • 5가지 요약수치 표현
  • 최솟값, Q1(하위25%), Q3(상위25%), Q2(중앙값), 최댓값
  • 이상값: Q3 보다 1.5 IQR 이상 초과하는 값과 Q1보다 1.5 IQR 이상 미달하는 값은 점이나, 원, 별표 등으로 따로 표시한다.
# IQR, 이상치를 제외한 최댓값, 최솟값 구하기
Q3 = eu["75%"]
Q1 = eu["25%"]
IQR = Q3 - Q1
OUT_MAX = (1.5*IQR) + Q3
OUT_MIN = Q1 - (1.5*IQR)
Q3, Q1, IQR, OUT_MAX, OUT_MIN

Boxenplot
사분위 + 분포

scatterplot

  • 변수 간 상관관계를 파악하기 어렵고, 점이 겹쳐 보여 명확하지 않고 빈도수를 알기 어렵다
  • scatterplot대신 stripplot, swarmplot 사용
  • Catplot의 기본값은 stripplot
  • catplot은 서브플롯을 제공 col, col_wrap으로 쓴 것이 서브 플롯이다.
# catplot
plt.figure(figsize=(12,4))
sns.catplot(data=df, x="origin",y="mpg")
#기본값이 stripplot
# catplot 으로 countplot그리기 
sns.catplot(data=df, x="origin", kind="count", col="cylinders",col_wrap=3)
count는 x,y 중 하나만 써야한다. 나머지는 빈도수를 채워넣기 떄문

웹 데이터 수집

  • 추상화된 도구를 통한 데이터 수집 이해하기
  • 저작권, 크롤링과 스크래핑의 차이 이해
  • FinanceDataReader실습
    KRXStockListing KRX상장 회사 목록 가져오기
    -저작권, 크롤링과 스크래핑의 차이 이해, 크롤링 분쟁사례

자세한 내용은 웹크롤링 게시물에 작성했다.


강의 내용 출처_멋쟁이사자처럼 AI School 오늘코드 박조은 강사