1. hist()
한 개의 Histogram 뿐만 아니라 두 개 이상도 그릴 수 있다.
df[['amount', 'count']].hist(bins=50, figsize=(20,5))
2. sns.displot()
import seaborn as sns
sns.distplot(df_amount, rug=True)
# rug: Whether to draw a rugplot on the support axis
# rugplot : 그래프 상에서 x축 위의 작은 선분으로 실제 데이터의 위치를 나타내준 것
- 2개 이상의 distplot도 그릴 수 있다.
sns.distplot(male, kde=False, fit=stats.norm,
hist_kws={'color': 'r', 'alpha': 0.2}, fit_kws={'color': 'r'})
sns.distplot(female, kde=False, fit=stats.norm,
hist_kws={'color': 'g', 'alpha': 0.2}, fit_kws={'color': 'g'})
# kde=False 로 해주어야 각각의 빈도 수에 따른 밀도 함수 그래프를 가리고 평균만 나타낼 수 있음
# fit에 scipy.stats.norm을 지정하여 분포에 대한 그래프 선을 그려줄 수 있음
# hist_kws & fit_kws 는 히스토그램과 fitting line의 서식을 지정하는 keywords
# histogram keyword arguments
# alpha=투명도
3. sns.scatterplot()
sns.scatterplot(x="amount", y="count", data=df)
4. sns.jointplot()
# 산점도와 히스토그램을 한번에 -> Joint-plot
sns.jointplot(x="amount", y="count", data=df)
- kind="kde" 설정하고 실행하면, 확률밀도함수를 겹쳐 그려준다.
# Kernel-density (커널이라는 함수를 활용해 추정한 확률밀도함수를 겹쳐 그려주는 방법으로
# 히스토그램보다 부드러운 형태의 분포 곡선을 보여줌, 상세 설명 @ https://j.mp/35TVL12)
sns.jointplot(x="amount", y="count", data=df, kind="kde")
# 꼬리가 너무 긴 형태의 분포 -> 이상치가 분포를 제대로 확인하는 것을 방해하고 있을 수 있음
5. boxplot()
- IQR 기준으로 Outlier(이상치) 탐지가 가능하다.
df.boxplot(column='amount')
- 2개 이상의 boxplot도 그릴 수 있다.
plt.figure(figsize=(10,7))
plt.boxplot(X_train)
plt.yscale("symlog")
plt.xlabel("Feature list")
plt.ylabel("Feature size")
plt.show()
- IQR 기준으로 Outlier(이상치) 제거도 가능하다. df['amount']를 보자.
삭제 후에 결과를 다시 비교해본다면, 작은 동그라미로 나왔던 이상치들이 모두 삭제된 것을 확인할 수 있다. 이상치를 삭제하고 난 이후에는 전체적인 plot이 달라질 것이므로, 이상치 삭제 전후 그래프를 비교해보는 것도 좋은 방법이다.
# IQR = Q3-Q1
Q1 = df['amount'].quantile(q = 0.25)
Q3 = df['amount'].quantile(q = 0.75)
IQR = Q3 - Q1
# 상한치 : 바닥부터 75% 지점의 값 + IQR의 1.5배
# 하한치 : 바닥부터 25% 지점의 값 - IQR의 1.5배
df_IQR = df[ (df['amount'] < Q3 + IQR * 1.5) & (df['amount'] > Q1 - IQR * 1.5) ]
# df_IQR.describe()
# 위를 보고 얼마나 많은 이상치가 삭제되었는가 확인 가능
df_IQR.boxplot(column='amount')
- 추가로 두 가지 이상의 데이터를 함께 그리다보면, scale이 달라 당황스러운 경우가 있을 수 있다.
그 때 Min-Max Scaling / Standardization Scaling도 사용할 수 있지만, log scaling을 사용할 수도 있다.
시계열분석 수업을 들었을 때 log 변환을 많이 써주는 것을 보아, 시계열 데이터가 많이 적용하는 것으로 예상된다.
- 이상치를 삭제하고, log변환을 시켰을 때 4) sns.jointplot() 을 다시 써보면, 다음과 같이 더 자세하고, scale이 비슷해진 그래프를 만날 수 있다.
processed_df['logamount'] = np.log(processed_df['amount'])
sns.jointplot(x="logamount", y="count", data=processed_df, kind="kde")
6. pd.crosstab()
: cross-table (교차표)
- 두 개의 열 사이의 출현 빈도 확인 가능
crosstab_ = pd.crosstab(df.propensity, df.skin, margins=True, normalize=True)
# margin : 합계에 해당하는 "All" 추가 여부
# normalize : 전체 합계가 1이 되도록 맞춰주는 것
crosstab_.columns=["건성", "민감성", "중성", "지성", "복합성", "합계"]
crosstab_.index=["비교적 저렴한 제품", "중간정도의 제품", "비교적고가의 제품", "합계"]
crosstab_
df['propensity'] = df['propensity'].replace([1, 2, 3], ['low cost', 'middle cost', 'high cost'])
df['skin'] = df['skin'].replace([1, 2, 3, 4, 5], ['dry skin', 'sensitive skin', 'neutral skin', 'oily skin', 'complex skin'])
ct = pd.crosstab(df.propensity, df.skin, margins=True)
ct.plot(kind='bar', stacked=True)
# ct.plot.bar(stacked=True)
ct.plot(kind='bar', stacked=False, figsize=(15, 10))
# ct.plot.bar(stacked=False, figsize=(15, 10))
7. sns.pairplot()
sns.set(style="ticks", color_codes=True) # set으로 style 바꿀 수 있음
sns.pairplot(iris, kind="reg")
# reg : fit linear regression models to the scatter plots (추세선)
'멋쟁이 사자처럼 AI SCHOOL 5기 > Today I Learned' 카테고리의 다른 글
[3주차 총정리] 통계검정 (p-value, chisquare 검정, 상관관계 분석/ pearsonr, ttest_ind, chi2_contingency 함수) (0) | 2022.03.30 |
---|---|
[3주차 총정리] 통계검정 (T검정, ANOVA) (0) | 2022.03.30 |
[3주차 총정리] pd.Series 특징 총정리 (value_counts, plot, replace, 왜도/첨도) (0) | 2022.03.30 |
[3주차 총정리] np.array 특징 총정리 (list와의 차이점, 기초함수) (0) | 2022.03.30 |
[3주차 총정리] 웹스크래핑, Open API (부동산 매매 신고 자료) (0) | 2022.03.30 |