KT AIVLE SCHOOL 복습

KT AIVLE DX #3 - 데이터 분석(2) 단변량 분석

전쏘스 2023. 3. 16. 11:09

 

  • 단변량 분석 요약


1. 숫자형 변수

1) 수치화

a. 대푯값 나타내기

  • 평균 df.mean() → 평균을 대푯값으로 사용할 때에는 평균의 함정을 조심해야 한다.
  • 중위수(중앙값) df.median()
  • 최빈값 df.mode()
  • 4분위수 → 1사분위수 df['column'].describe()['25%'] → 2사분위수 df['column'].describe()['50%'] → 3사분위수 df['column'].describe()['75%']

b. 기초통계량 계산하기

  • df[’column’].describe() → 시리즈로 기초통계량 제공
  • df[[’column’]].describe() → 리스트 형태로 불러오게 되면 데이터 프레임으로 기초통계량 제공
  • .T 를 사용하게 되면 전치된 결과가 불러져온다
  • df.describe() → 데이터프레임에 포함된 숫자타입 변수들 기초통계량 조회
  • df.describe(include=’all’) → 데이터프레임 전체 변수들의 기초통계량 조회

2) 시각화

a. 히스토그램

  • 히스토그램 기본(plt 함수)
plt.figure(figsize=(5,3))
plt.hist(titanic.Fare, bins = 5, edgecolor = 'gray')
plt.xlabel('Fare')
plt.ylabel('Frequency')
plt.show()
  • 구간 갯수 조정은 bins의 숫자를 조정하면 된다.
  • 구간의 갯수를 조정하면서 큰 흐름도 보고, 세세한 데이터의 흐름도 봐야한다.
  • seaborn 함수 사용
plt.figure(figsize=(5,3))
sns.histplot(x= 'Fare', data = titanic, bins = 20)
plt.show()
  • 만약 hist1 = plt.hist(titanic.Fare, bins = 5, edgecolor = 'gray') 이렇게 저장하게 된다면 hist1[0]에는 빈도수 값이, hist1[1]에는 구간 값이 저장되게 된다!

b. 밀도함수 그래프 (kde plot)

  • 히스토그램의 단점 → 구간의 너비를 어떻게 잡는지에 따라 전혀 다른 모양이 될 수가 있다.
  • 밀도함수 그래프 → 막대의 너비를 가정하지 않고, 모든 점에서 데이터의 밀도를 추정하는 커널 밀도 추정 방식을 사용하여 히스토그램의 단점을 해결. → 밀도함수 그래프 아래의 면적은 1
  • 밀도 추정 : 측정된 데이터로부터 전체 데이터 분포의 특성을 추정
# sns.kdeplot(x='Fare', data = titanic)
sns.kdeplot(titanic['Fare'])
plt.show()
sns.histplot(x='Age', data=titanic, kde=True)
plt.show()

c. boxplot

  • boxplot의 주의 사항!! : 값에 NaN이 있으면 그래프가 그려지지 않습니다 → 즉, 그래프를 그리기 전에 결측치를 처리해줘야함 → 하지만, seaborn 패키지 함수들은 NaN을 알아서 빼준다.
  • IQR = Q3 - Q1
  • Lower fence = [min] vs [Q1 - 1.5 * IQR] 중 작은 값 Upper fence = [max] vs [Q3 + 1.5 * IQR] 중 큰 값 → Q. 왜 1.5 * IQR로 비교해서 펜스를 추정하는가? → A. 정규분포에서 [3 * 표준편차]에서 벗어난 값은 이상치로 추정하는데, [1.5 * IQR]의 값이 그 값과 비슷하기 때문이다.
  • fence 바깥의 값들을 이상치로 추정
# titanic['Age']에는 NaN이 있습니다. 이를 제외한 데이터
temp = titanic.loc[titanic['Age'].notnull()]

plt.boxplot(temp['Age']) -> 세로로 길게 그려짐
plt.grid()
plt.show()
# seaborn 패키지 함수들은 NaN을 알아서 빼줘서 전처리가 필요없다!
sns.boxplot(x = titanic['Age'])
plt.grid()
plt.show()

d. 시계열 데이터 시각화

  • 시계열 데이터는 보통 시간(x)축에 맞게 값들을 라인차트로 표현한다.
air['Date'] = pd.to_datetime(air['Date']) # 날짜 형식으로 변환

plt.plot('Date', 'Ozone', 'g-', data = air, label = 'Ozone')
plt.plot('Date', 'Temp', 'r-', data = air, label = 'Temp')

plt.xlabel('Date')
plt.legend()


2. 범주형 변수

1) 수치화

a. 범주별 빈도수

  • 리스트.count(’값’) : 해당 값이 몇 개 있는지 count
  • df.value_counts() : 범주의 개수와 상관없이 범주 별 개수를 count
  • df['column'].value_counts() : 원하는 열의 범주 별 개수를 count

b. 범주별 비율

  • df.value_counts() / df.shape[0]

2) 시각화

a. bar chart

  • seaborn의 countplot을 이용해서 그리면 간단하다! → plt.bar()는 집계한 결과를 가지고 그래프를 그려야 하기 때문에 seaborn 이용이 시간적 측면에서 유리.
sns.countplot(x='Pclass', data=titanic)
plt.grid()
plt.show()

b. pie chart

  • 범주별 비율 비교를 할 때, 파이차트를 사용한다. → 단, 먼저 집계가 필요하다.
  • plt.pie(값, labels=범주이름, autopct=형식) autopct = ‘%.2f%’ : 그래프에 표시할 값 비율 값에 대한 설정 → 소수점 두자리 퍼센트로 표기한다는 의미.
  • 각도와 방향, 간격 조정, 그림자 넣기 → startangle = 90 : 90도부터 시작 → counterclock = False : 시계 방향으로 → explode = [0.05, 0.05, 0.05] : 중심으로부터 얼만큼 띄울지 → shadow = True : 그림자 추가
# 차트를 그리기 위한 집계
temp = titanic['Pclass'].value_counts()

# 차트 그리기
plt.pie(temp.values, labels = temp.index, autopct = '%.2f%%', 
        startangle=90, counterclock=False, 
        explode = [0.05, 0.05, 0.05], shadow=True)
plt.show()