-
CH 01. 데이터 탐색적 분석_시각화데이터 분석/통계 2024. 6. 9. 14:57
데이터 분포 탐색
백분위수와 상자그림(box plot)
- 백분위수는 데이터의 흩어진 정도를 측정하고, 전체 분포를 알아보는 데에도 유용하다.
- pandas의 quantile을 이용해 구할 수 있다.
- 상자그림은 백분위수를 이용해 데이터의 분산을 손쉽게 시각화하는 방법이다.
ax = (state['Population']/1_000_000).plot.box(figsize=(3, 4)) ax.set_ylabel('Population (millions)') plt.tight_layout() plt.show()
- 인구의 중간값이 약 500만이고, 절반이 약 200만에서 약 700만 사이이며, 인구수가 높은 이상치가 있음을 알 수 있다.
- 상자 부분의 위쪽과 아래쪽은 각각 75%와 , 25% 백분위수를 나타낸다.
- 중간값은 상자 안 수평선으로 표시한다.
- 상자 밖으로 위아래 나 있는 실선이 바로 수염으로 데이터 전체의 범위를 나타내주는 위아래 선들과 연결되어 있다.
도수분포표와 히스토그램
도수분포표
: 변수의 범위를 동일한 크기의 구간으로 나눈 다음, 각 구간마다 몇 개의 변숫값이 존재하는지를 보여주기 위해 사용
- pandas.cut 함수는 각 구간에 매핑하는 시리즈를 만든다.
- value_counts 메서드를 사용해 빈도 테이블을 구할 수도 있다.
- 히스토그램은 도수분포표를 시각화하는 방법이며, pandas에서는 DataFrame.plot.hist 메서드를 사용해 데이터 프레임에 대한 히스토그램을 지원한다. 구간의 개수를 정의하려면 키워드 인수 bins를 사용한다.
밀도 그림과 추정
- 밀도 그림은 데이터의 분포를 연속된 선으로 보여준다. 다시 말해서 좀 더 부드러운 히스토그램이라고 생각할 수 있다.
- pandas는 밀도 그림을 생성하기 위해 density 메서드를 제공한다.
- 밀도 곡선의 부드러움을 제어하기 위해서는 bw_method 인수를 사용한다.
이진 데이터와 범주 데이터 탐색하기
ax = dfw.transpose().plot.bar(figsize=(4, 4), legend=False) ax.set_xlabel('Cause of delay') ax.set_ylabel('Count') plt.tight_layout() plt.show()
- 막대도표는 어떤 범주형 자료를 보여줄 때 주로 사용되며, 대중매체 어느 곳에서든 쉽게 발견할 수 있는 가장 흔한 시각화 방법이다.
- x축 위에 각 범주들을 놓고, y축은 각 범주에 해당하는 횟수나 비율을 표시한다.
- 통계학자나 데이터 시각화 전문가들은 파이그림보다 막대도표를 사용한다(시각적으로 효과적이지 않다는 이유로).
최빈값
: 데이터에서 가장 자주 등장하는 값 혹은 값들을 의미
기댓값
: 어떤 값과 그 값이 일어날 확률을 서로 곱해 더한 값을 의미한다. 주로 요인변수의 수준을 요약하는 데 사용한다.
- 기댓값은 실제 사업 평가나 자본 예산에 가장 근본적인 토대가 된다.
확률
: 상황이 수없이 반복될 경우 사건이 발생할 비율
상관관계
상관계수
: 수치적 변수들 간에 어떤 관계가 있는지를 나타내기 위해 사용되는 측정량(-1 ~ +1까지의 범위)
상관행렬
: 행과 열이 변수들을 의미하는 표를 말하며, 각 셀은 그 행과 열에 해당하는 변수들 간의 상관관계를 의미한다.
산점도
: x축과 y축이 서로 다른 두 개의 변수를 나타내는 도표
- pandas의 scatter 메서드를 사용한다.
두 개 이상의 변수 탐색하기
- 평균과 분산은 한 번에 하나의 변수를 다룬다(일변량분석).
- 상관분석은 두 변수(이변량분석)를 비교할 때 중요한 방법이다.
육각형 구간과 등고선(수치형 변수 대 수치형 변수를 시각화)
산점도는 데이터의 개수가 상대적으로 적을 때는 괜찮다. 하지만 수십, 수백만의 레코드를 나타내기에는 산점도의 점들이 너무 밀집되어 알아보기 어렵다. 이때 데이터의 주요 부분에 집중하기 위해, 필터링해 보고 싶은 데이터를 시각화할 수 있다.
kc_tax = pd.read_csv(KC_TAX_CSV) kc_tax0 = kc_tax.loc[(kc_tax.TaxAssessedValue < 750000) & (kc_tax.SqFtTotLiving > 100) & (kc_tax.SqFtTotLiving < 3500), :] print(kc_tax0.shape)
육각형 구간
: 두 변수를 육각형 모양의 구간으로 나눈 그림
- pandas의 hexbin을 사용해 육각형 구간 도표를 쉽게 사용할 수 있다.
ax = kc_tax0.plot.hexbin(x='SqFtTotLiving', y='TaxAssessedValue', gridsize=30, sharex=False, figsize=(5, 4)) ax.set_xlabel('Finished Square Feet') ax.set_ylabel('Tax Assessed Value') plt.tight_layout() plt.show()
등고 도표
: 지도상에 같은 높이의 지점을 등고선으로 나타내는 것처럼, 두 변수의 밀도를 등고선으로 표시한 도표
fig, ax = plt.subplots(figsize=(4, 4)) sns.kdeplot(data=kc_tax0.sample(10000), x='SqFtTotLiving', y='TaxAssessedValue', ax=ax) ax.set_xlabel('Finished Square Feet') ax.set_ylabel('Tax Assessed Value') plt.tight_layout() plt.show()
- 히트맵, 육각 구간, 등고도표 모두 이차원상의 밀도를 시각화하는 데 사용된다.
범주형 변수 대 범주형 변수
분할표
: 두 범주형 변수를 요약하는 데 효과적인 방법으로, 범주별 빈도수를 기록한 표
- pviot_table 메서드를 이용해 피벗 테이블을 만들 수 있다.
crosstab = lc_loans.pivot_table(index='grade', columns='status', aggfunc=lambda x: len(x), margins=True) print(crosstab)
범주형 변수 대 수치형 변수
- 범주형 변수에 따라 분류된 수치형 변수의 분포를 시각화하여 비교하는 간단한 방법이다.
- 예를 들어 항공사별 비행 지연 정도를 비교하는 데 사용할 수 있다.
airline_stats = pd.read_csv(AIRLINE_STATS_CSV) airline_stats.head() ax = airline_stats.boxplot(by='airline', column='pct_carrier_delay', figsize=(5, 5)) ax.set_xlabel('') ax.set_ylabel('Daily % of Delayed Flights') plt.suptitle('') plt.tight_layout() plt.show()
바이올린 도표
: 상자그림을 보완한 형태로, y축을 따라 밀도추정 결과를 동시에 시각화한다.
- 밀도 분포 모양을 좌우대칭으로 서로 겹쳐지도록 해놓고 보면 바이올린을 닮은 모양이 된다.
- 바이올린 도표의 장점은 바로 상자그림에서는 보이지 않는 데이터의 분포를 볼 수 있다는 점이다.
fig, ax = plt.subplots(figsize=(5, 5)) sns.violinplot(data=airline_stats, x='airline', y='pct_carrier_delay', ax=ax, inner='quartile', color='white') ax.set_xlabel('') ax.set_ylabel('Daily % of Delayed Flights') plt.tight_layout() plt.show()
다변수 시각화하기
zip_codes = [98188, 98105, 98108, 98126] kc_tax_zip = kc_tax0.loc[kc_tax0.ZipCode.isin(zip_codes),:] kc_tax_zip def hexbin(x, y, color, **kwargs): cmap = sns.light_palette(color, as_cmap=True) plt.hexbin(x, y, gridsize=25, cmap=cmap, **kwargs) g = sns.FacetGrid(kc_tax_zip, col='ZipCode', col_wrap=2) g.map(hexbin, 'SqFtTotLiving', 'TaxAssessedValue', extent=[0, 3500, 0, 700000]) g.set_axis_labels('Finished Square Feet', 'Tax Assessed Value') g.set_titles('Zip code {col_name:.0f}') plt.tight_layout() plt.show()
'데이터 분석 > 통계' 카테고리의 다른 글
CH 04. 회귀와 예측 (1) 2024.06.20 CH 03. 통계적 실험과 유의성검정_2 (0) 2024.06.11 CH 03. 통계적 실험과 유의성검정_1 (0) 2024.06.10 CH 02. 데이터와 표본분포 (1) 2024.06.09 CH 01. 탐색적 데이터 분석_추정 (0) 2024.06.08