[KT AIVLE DX 트랙 7기] 단변량 분석과 시각화
KT 에이블스쿨 7기 DX 트랙에 기자단으로 신청하기도 하였고, 복습을 통한 역량을 강화, 습득을 목적으로 작성되었음을 알려드립니다.
그럼, 복습 Let's go
수치 변수 분포 시각화 | 히스토그램(plt.hist()), 밀도함수그래프(kdeplot / sns.kdeplot()), 이상치(boxplot / plt.boxplot()) |
수치 변수 관계 시각화 | 산점도(plt.scatter()), 페어플롯(pairplot / sns.pairplot()), 히트맵(df.corr() -> sns.heatmat()) |
범주형 변수 시각화 | 막대그래프(plt.bar()), 카운트 플롯(sns.countplot()), 파이차트(plt.pie()), (관계) 모자이크 플롯(① import statemodel ② 교차표 : pd.crosstab() ③ mosaic(, stack()) ) |
시계열 | 선그래프 (plt.plot()) |
단변량 분석 1 : 숫자형 변수 분석하기
단변량 분석은 변수 하나만을 대상으로 분포, 중심 경향성, 이상치 등을 분석하는 기초적인 탐색적 데이터 분석 방법입니다.
- 숫자형 변수 : 평균, 중앙값, 분산 등 통계량과 시각화
- 범주형 변수 : 빈도수, 비율 및 막대 그래프 등을 활용할 수 있습니다.
먼저 데이터를 지정해 줍니다.
import pandas as pd
# 예제 데이터 (학생 시험 점수)
data = {
'math_score': [78, 85, 90, 95, 88, 70, 65, 60, 55, 98, 100, 74, 82, 79, 92],
}
df = pd.DataFrame(data)
df.head()
박스플롯(boxplot)
우리는 이제 박스플롯을 활용하면서 중앙값이 어디 있는지, 점수들이 얼마나 퍼져 있는지 (사분위수) 이상치가 어디 있는지를 판단해야 합니다.
import seaborn as sns
import matplotlib.pyplot as plt
sns.boxplot(x = "math_score", data = df)
plt.show()
# seaborn.boxplot(data=None, *, x=None, y=None, hue=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, fill=True, dodge='auto', width=0.8, gap=0, whis=1.5, linecolor='auto', linewidth=None, fliersize=None, hue_norm=None, native_scale=False, log_scale=None, formatter=None, legend='auto', ax=None, **kwargs)
data를 지정해주고, x축은 뭐를 할 것인가를 설정해주면 끝!
즉 저희는 이렇게 해석 할 수 있습니다.
- 중앙값은 약 80점 근처에 위치하고 있구나
- 점수 분포는 상대적으로 좌우 균형 잡힌 편이구나
- 이상치는 100점에 가까운 일부 고득점자로 간주될 수 있습니다. (표시된 점 유무로 확인 가능)
히스토그램 (plt.hist)
data = {
'math_score': [78, 85, 90, 95, 88, 70, 65, 60, 55, 98, 100, 74, 82, 79, 92],
}
df = pd.DataFrame(data)
df.head()
import seaborn as sns
import matplotlib.pyplot as plt
plt.hist(df["math_score"], bins = 6, edgecolor='black', color = "blue")
plt.xlabel('Score')
plt.ylabel('Frequency')
plt.grid(True)
※ matplotlib.pyplot.hist
matplotlib.pyplot.hist(x, bins=None, *, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, data=None, **kwargs)
matplotlib.pyplot.hist — Matplotlib 3.10.1 documentation
※ x 부분에 df["math_score"] 이 아닌 df를 넣어도 작동 된다는 것을 확인할 수 있었습니다.
??? 여기에서 궁금한 점은 df에 여러 칼럼인 sience_score을 만들고 돌리면 어떻게 되는지 해결해 봅시다.
data = {
'math_score': [78, 85, 90, 95, 88, 70, 65, 60, 55, 98, 100, 74, 82, 79, 92],
'sience_score': [78, 85, 90, 95, 88, 70, 65, 60, 55, 98, 100, 74, 82, 79, 92]
}
df = pd.DataFrame(data)
df.head()
import seaborn as sns
import matplotlib.pyplot as plt
plt.hist(df, bins = 6, edgecolor='black')
즉, 2개 컬럼이 들어가게 된다면, color를 2개 지정해 주거나, color 자체를 지정 안 한다면 문제 없이 돌아간다는 것을 확인할 수 있습니다.
밀도함수 그래프 (KDE plot)
수학점수를 커널 밀도함수 (KED)로 시각화 한다면, 히스토그램보다 부드러운 곡선 형태로 데이터 분포를 보여줄 수 있습니다.
import matplotlib.pyplot as plt
import seaborn as sns
sns.kdeplot(df['math_score'], shade=True, color='green')
plt.title('Density Plot of Math Score')
plt.xlabel('Score')
plt.ylabel('Density')
plt.grid(True)
plt.show()
Seaborn.kdeplot()
seaborn.kdeplot(data=None, *, x=None, y=None, hue=None, weights=None, palette=None, hue_order=None, hue_norm=None, color=None, fill=None, multiple='layer', common_norm=True, common_grid=False, cumulative=False, bw_method='scott', bw_adjust=1, warn_singular=True, log_scale=None, levels=10, thresh=0.05, gridsize=200, cut=3, clip=None, legend=True, cbar=False, cbar_ax=None, cbar_kws=None, ax=None, **kwargs)
시사점 : sns.kdeplot 도 df["컬럼"] 이 아닌 df로 할 때 작동은 된다는 것을 확인할 수 있습니다.
단변량 분석 2 : 범주형 변수 분석하기
먼저 데이터를 설정해 줍니다.
import pandas as pd
# 예제 데이터: 고객 성별 및 구매 여부
data = {
'gender': ['Male', 'Female', 'Female', 'Female', 'Male', 'Female', 'Female', 'Male', 'Female', 'Male'],
'purchased': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No']
}
df = pd.DataFrame(data)
df.head()
막대그래프 (Bar chart, countplot)
막대 그래프 (Bar Chart) |
- 범주형 데이터의 비교를 할 때 사용 - 여러 개의 카테고리에 대한 값(수치)를 비교할 때 적합 - 특정 그룹 간 차이를 직관적으로 비교하기에 용이 |
카운트 플롯 (Count plot - Seaborn활용) |
- 데이터에서 각 범주 (카테고리)의 개수를 세어 비교할 때 사용 - 범주형 데이터의 빈도를 분석할 때 적합 - 막대 그래프와 유사하지만, Pandas 또는 Seaborn을 활용하여 자동으로 데이터 빈도를 계산 |
저희는 gender 변수에 'male', 'female'과 같은 값들에서 변수의 각 값이 데이터에서 몇 번 나오는지 막대그래프로 나타내고자 합니다. 시각화를 통해 어떤 성별이 더 많이 등장하는지 쉽게 알 수 있어야 하니깐 count plot이 더 적합해 보이네요.
import seaborn as sns
import matplotlib.pyplot as plt
sns.countplot(x='gender', data=df, palette='pastel')
plt.title('Count of Gender')
plt.xlabel('Gender')
plt.ylabel('Count')
plt.grid(axis='y')
plt.show()
※ boxplot과 countplot의 비교
1. box plot
matplotlib.pyplot.boxplot(x, *, notch=None, sym=None, vert=None, orientation='vertical', whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, tick_labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_ticks=True, autorange=False, zorder=None, capwidths=None, label=None, data=None)[source]
matplotlib.pyplot.boxplot — Matplotlib 3.10.1 documentation
matplotlib.pyplot.boxplot — Matplotlib 3.10.1 documentation
Specifies whether to bootstrap the confidence intervals around the median for notched boxplots. If bootstrap is None, no bootstrapping is performed, and notches are calculated using a Gaussian-based asymptotic approximation (see McGill, R., Tukey, J.W., an
matplotlib.org
2. seaborn.countplot
seaborn.countplot(data=None, *, x=None, y=None, hue=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, fill=True, hue_norm=None, stat='count', width=0.8, dodge='auto', gap=0, log_scale=None, native_scale=False, formatter=None, legend='auto', ax=None, **kwargs)
seaborn.countplot — seaborn 0.13.2 documentation
seaborn.countplot — seaborn 0.13.2 documentation
seaborn.countplot seaborn.countplot(data=None, *, x=None, y=None, hue=None, order=None, hue_order=None, orient=None, color=None, palette=None, saturation=0.75, fill=True, hue_norm=None, stat='count', width=0.8, dodge='auto', gap=0, log_scale=None, native_s
seaborn.pydata.org
모자이크 플롯으로 단변량 분석
gender와 purchased 두 범주형 변수에는 '남성/여성', '구매함/구매 안 함'과 같은 값을 지니고 있네요!
이 두 변수 사이에 어떤 관련성이 있는지 모자이크 플롯을 통해 시각적으로 살펴보세요!! 각 사각형의 크기를 비교하면 어떤 조합이 많이 나타났는지 쉽게 알 수 있을 겁니다 ㅎ.ㅎ
※ 모자이크 플롯 : statsmodels.graphics.mosaicplot import masaic
data = {
'gender': ['Male', 'Female', 'Female', 'Female', 'Male', 'Female', 'Female', 'Male', 'Female', 'Male'],
'purchased': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'No']
}
df = pd.DataFrame(data)
from statsmodels.graphics.mosaicplot import mosaic
import matplotlib.pyplot as plt
cross_tab = pd.crosstab(df["gender"], df["purchased"])
mosaic(cross_tab.stack())
plt.show()
statsmodels 의 라이브러리 안에 statsmodel.graphics.mosaicplot 내에 있는 mosaic 클래스를 사용하는 것이다.
※ mosaic 클래스
statsmodels.graphics.mosaicplot.mosaic(data, index=None, ax=None, horizontal=True, gap=0.005, properties=<function <lambda>>, labelizer=None, title='', statistic=False, axes_label=True, label_rotation=0.0)[source]
※ 기억해야 하는 부분!
① from statsmodels.graphics.mosaicplot import masaic
② pd.crosstab(data)
③ stack() 사용하기
파이차트(pie)
purchased 변수 값은 yes 와 no 두 가지로 나뉘고 있습니다. 각 값이 전체 데이터에서 차지하는 비율을 파이차트로 시각해 볼까요?
# 기존 파이는 다 더하면 100이 되는 구조라, 여기에서는 value_count()[빈 개수 세기] 라고 써서 해야한다.
import matplotlib.pyplot as plt
purchase_counts = df['purchased'].value_counts()
plt.pie(purchase_counts, labels=purchase_counts.index, autopct='%1.1f%%', startangle=90, colors=['lightgreen', 'lightcoral'])
plt.title('Purchase Rate Pie Chart')
plt.axis('equal') # 타원을 원으로 만들어 달라.
plt.show()
matplotlib.pyplot.pie(x, *, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, normalize=True, hatch=None, data=None)