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'] #위에서 시각화한 값 수치로 직접 구하기
- sns.countplot(data=df, x='cylinders', hue='origin')
- 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기 강의자료(박조은 강사님)