☑️ 문제3. iris 데이터를 활용한 상관관계 파악
[문제]
- 3-1) species별 sepal length, sepal width, petal length, petal width의 평균과 표준편차를 구하세요.
- 3-2) sepal length, sepal_width, petal_length, petal_width 4가지 변수 중 가장 상관관계가 높은 두 변수를 찾으세요.
- 3-3) 위에서 구한 두 변수를 x,y축으로 두고 species에 따라 분류하는 산점도를 생성하세요.
[문제 풀이]
내 코드
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
iris= sns.load_dataset("iris")
# 1. 평균과 표준편차 집계 : mean, std
agg = iris.groupby('species').agg(['mean','std']) #isris 데이터 프레임에 species 컬럼 제외 전부 수치형 값임
# 2. 상관관계가 가장 높은 두 변수 : (petal_length , petal_width)
corr = iris.corr(method='pearson',numeric_only=True)
# 3. 위에서 구한 두 변수를 x,y축으로 두고 species에 따라 분류하는 산점도를 생성
sns.scatterplot(data=iris,x='petal_length',y='petal_width',hue='species')
plt.title('Scatter plot with strongest corr')
이슈 및 해결 과정
- iris 데이터프레임엔 species 컬럼 제외 전부 수치형 타입 이므로, species 컬럼을 기준으로 그룹바이 & 집계 했을때 오류없이 결과값이 나옴
- 만약, 데이터 프레임에 수치형 값이 아닌 컬럼이 들어있다면, agg 사용시 수치형 컬럼만 필터링하여 코드 작성해서 오류 없음 ex. iris['컬럼','컬럼',...].groupby('컬럼').agg(['mean','sum') 이런식으로
- agg 메소드 사용시, 인자로 받은 집계 메소드의 numeric only= 옵션 사용 불가함
- 상관계수 메소드는 `corr` , 상관관계에 따라 method= 옵션 변경가능, numeric only= 옵션 사용 가능.
- 통계 관련 시각화는 matplotlib 패키지 보다 seaborn 이 더 편리하고 직관적임. seaborn 은 각 그래프 메소드의 파라미터 옵션에서 대부분 해결 가능 & x/y축 범례도 알아서 출력 해줌.
▼MATPLOTLIB VS SEABORN 패키지 간단 비교
더보기
- Seaborn은 파이썬의 고급 데이터 시각화 라이브러리로, Matplotlib의 상위 API로 개발 더 간단하고 직관적인 시각화를 보여줌 .
- ex. 산점도 그래프 그리기 비교
# matplotlib
plt.scatter(x=df['total_bill'], y=df['total_bill'], df=tips) #x,y 값에 df 형태로 입력
# seaborn
sns.scatterplot(x='total_bill', y='tip', df=tips) #df를 먼저 넣고 x/y 축에 컬럼명만 입력
- ex. 요일별 다른 컬러로 시각화 할때 비교
- 맷플러립은 컬럼별 컬러를 개별 지정해주고 for 문으로 매칭 해줘야함. vs 시본은 옵션으로 가능(hue)
- 맷플러립은 x/y/범례 값을 입력해야 출력됨 vs 시본은 컬럼명 기준으로 자동 출력
# matplotlib
days = tips['day'].unique()
colors = ['red', 'blue', 'green', 'orange']
plt.figure(figsize=(7, 5)) # 포문을 돌리면서 day를 뽑아서 컬러를 매칭해줘야함
for i, day in enumerate(days):
subset = tips[tips['day'] == day]
plt.scatter(subset['total_bill'], subset['tip'], color=colors[i], label=day, alpha=0.7)
plt.xlabel('Total Bill')
plt.ylabel('Tip')
plt.title('Scatter Plot by Day (Matplotlib)')
plt.legend(title='Day')
#seaborn
sns.scatterplot(x='total_bill', y='tip', data=tips, hue='day')
plt.title('Scatter Plot by Day (Seaborn)')
한줄 포인트
- df 집계시 수치형 타입이 없는지 확인 필요, 간단한 통계 시각화는 맷플러립 보다 시본 패키지 사용