본문 바로가기
Python/멋사_AIS7

Day 10

by Hi_heidi 2022. 9. 27.

Day 10

 

범주형 변수

 

  • 범주형 데이터 유일값의 빈도수
    • df.hist(bin=50)
    • plt.show()
    • ≫ 히스토그램으로 시각화해서 확인했을 때 막대 그래프 사이사이 이가 빠져있는지(일정하게 간격이 넓은지) 확인해보면 범주형/수치형 구분할 수 있다.
    • df.nunique()   #변수별 유일값의 빈도 수 출력 #시리즈와 데이터 프레임 모두 사용 가능하다.
      • df['mpg'].unique()   #시리즈에서만 사용 가능
    • sns.countplot(data=df, x='origin')   
      • countplot은 x, y축 중 하나만 지정하면 나머지 축에 빈도수를 알아서 생성한다.
      • x축을 지정하면 vertical, y축을 지정하면 horizontal 형태이다.
      • 단점: 대표값만 표시해 데이터의 분포를 볼 수 없다.
  • 1개 변수의 빈도수
    • df['origin'].value_counts() 
  • 2개 이상의 변수에 대한 빈도수
    • sns.countplot(data=df, x='cylinders', hue='origin')
      • 3개 이상의 색상을 지정하지 말라. 색깔이 많아지면 구분하기 어렵다.
      • pd.crosstab(index=df['origin'], columns=df['cylinders']   #위에서 시각화한 값 수치로 직접 구하기
  • groupby 연산
    • df.groupby('origin')['mpg'].mean()   #groupby로 origin별 그룹화 > mpg의 평균 구하기 #시리즈 형태
    • df.groupby('origin')[['mpg']].mean()   #데이터프레임 형태
  • pivot table 연산
    • 피벗테이블은 그룹바이와 기능이 거의 흡사하다. 그러나 피벗테이블이 훨씬 직관적이다. 
    • pd.pivot_table(data=df, index='origin', values='mpg')   #평균값 계산이 기본
    • sns.barplot(data=df, x='origin', y='mpg', estimator=sum, ci=None)   #estimator=sum 평균값 말고 다른 값 구하고 싶을 때 지정
    • sns.barplot(data=df, x='origin', y='mpg', hue='cylinders', ci=None)   #hue='cylinders' 실린더 범주별로 색깔 달리 지정
      • df.groupby(['origin','cylinders'])['mpg'].mean()   #그룹바이로 위 시각화한 값 수치로 직접 구하기 #변수 2개의 수치를 구할 때는 대괄호[ ] 로 감싸야 한다.
      • 막대 그래프의 단점: 대표값만 표시하기 때문에 데이터의 분포를 볼 수 없다.
    • df.groupby(by=['cylinders', 'origin'])['mpg'].mean().unstack()   
      • by 뒤에 오는 변수 순서대로 행 → 열이 됨
      • 언스택 기능이 낯설고 어려워 직관적으로 사용하기 위해 pivot_table이 만들어졌다. 즉 둘이 기능이 같다.
      • pd.pivot_table(data=df, index='origin', columns='cylinders', values='mpg')   #위 시각화에 대한 값 수치표로 직접 구하기 #기본 연산은 평균
    • pivot과 pivot_table의 차이
pivot pivot_table
통계 연산X 피벗 형태로만 변환 통계 연산O 피벗 형태 변환O
x aggfunc = 'mean'
  • boxplot과 사분위수
    • desc = df.groupby(['origin'])['mpg'].describe()   #그룹바이로 오리진 값에 따른 mpg 기술통계 구하기   #결과를 변수에 할당하여 재사용
    • eu=desc.loc['europe']   #유럽 카테고리의 기술통계 결과를 보겠다
  • boxplot 이해하기
    • Q3 = eu["75%"] #중앙값 기준으로 상위 50% 중의 중앙값, 전체 데이터 중 상위 25%에 해당하는 값
    • Q1 = eu['25%'] #중앙값 기준으로 하위 50% 중의 중앙값, 전체 데이터 중 하위 25%에 해당하는 값
    • IQR = Q3 - Q1 #데이터의 중간 50% (Q3 - Q1)
    • OUT_MAX = (1.5 * IQR) * Q3
    • OUT_MIN = Q1 - (1.5 * IQR)
    • sns.boxplot(data=df[df['origin'] == 'europe'], x='mpg')   #유럽에 해당되는 값 박스 플롯 그리기
    • sns.boxenplot(data=df[df['origin'] == 'europe'], x='mpg')   #boxenplot 박스플롯 보완
    • sns.violinplot(data=df[df['origin'] == 'europe'], x='mpg')   #violinplot 박슨플롯 보완, kdeplot을 데칼코마니한 플롯
  • 산점도를 통한 범주형 데이터 표현
    • Q. 범주형 데이터를 scatterplot으로 그렸을 때의 단점?
    • →점이 겹칠 수 있어 빈도수를 파악하기 어렵고 값을 제대로 표현하기 어렵다.
    • sns.scatterplot(data=df, x='origin', y='mpg')
    • sns.stripplot(data=df, x='origin', y='mpg')   #stripplot 스캐터플롯 보완
    • sns.swarmplot(data=df, x='origin', y='mpg')   #swarmplot 스트립플롯 보완, 옆으로 퍼지게 그려 점을 겹치지 않게 한다
    • sns.catplot(data=df, x='origin', y='mpg')   #기본값이 stripplot이기 때문에 스트립플롯과 시각화 결과가 같다
  • catplot을 통한 범주형 데이터의 서브플롯 시각화
    • Q. box, violin, swarm플롯을 catplot을 사용해서 그리는 이유?
    • →subplot을 그릴 수 있기 때문. 위의 코드처럼 그냥 그리면 서브플롯을 그릴 수 없다.
    • sns.catplot(data=df, x='origin', y='mpg', kind='box', col='cylinders', col_wrap=3)   #캣플롯으로 박스플롯 그리기
    • sns.catplot(data=df, x='origin', y='mpg', kind='violin', col='cylinders', col_wrap=3) 
    • sns.catplot(data=df, x='origin', kind='count', col='cylinders', col_wrap=3)   #countplot 그릴 때는 x, y축 둘 중 1개만 지정하는 것 주의!
 

 


출처 | 멋쟁이 사자처럼 AI School 7기 강의자료(박조은 강사님)

'Python > 멋사_AIS7' 카테고리의 다른 글

Day 14  (0) 2022.10.04
Day 12~13  (0) 2022.10.04
Day 09  (0) 2022.09.27
Day 06  (1) 2022.09.22
Day 05  (1) 2022.09.21