ABC부트캠프 데이터 탐험가 과정

[8일차] ABC 부트캠프 Pandas를 이용한 데이터 분석 1

hwibeenjeong 2024. 7. 15. 23:25

점심먹고 친구랑 찍은 사진

실제로 파이썬 수업을 나간지 2주차가 되었다. 파이썬 기초와 pandas 기초를 배울 땐 들어본 내용이기에 이해와 응용이 쉬웠지만 이제부터는 달라지는 것 같다. 슬슬 전공 단어들도 들어보게 되고, 앞으로 얼마나 더 어려워질 지 기대된다.

 

1. Pandas 데이터 프레임의 변수 선택

저번 시간에 loc(), iloc() 메서드를 이용해 위치 값 혹은 인덱스 값으로 데이터를 특정지었다. 하지만 데이터분석을 하다보면 데이터의 위치를 모르거나, 조건을 이용하여 값을 찾는 경우가 있을 것이다. 그럴 때 우린 함수를 사용해서 값들을 추출해야한다. 먼저 함수를 이용하여 변수를 선택하는 방법에 대해 알아보자.

1-1. 함수를 이용한 변수 선택

우리는 filter메서드를 통해 원하는 columns를 추출할 수 있다. 

데이터프레임명.filter(매개변수)

메서드 명이 필터인 만큼 매개변수로 어떤 값을 넘겨주냐에 따라 그에 맞는 column들을 추출해올 수 있다. column에 이름들을 알고 싶을 때 regex 매개변수를 사용하면 된다. regex 매개변수는 정규표현식(regular expression)을 입력하게 되고, 쉽게 말해 문자열을 입력하면 해당 문자열이 포함되어 있는 column들을 가져올 수 있게 된다. 정규 표현식은 문자열에서 특정 패턴을 찾고, 추출하고, 대체하는 데 사용하는 도구라고 생각하면 된다. 문자열들을 잘라서 어떤 기능들을 하는지, 어떤 내용을 찾아야하는 지 알 수 있다. 예제를 함께 보자

import pandas as pd

df_test = pd.read_csv('./data.csv', encoding = 'CP949')
df_test.filter(regex = 'ex')

regex 매개변수에 'ex'라는 문자열을 대입했다. 그렇다는 것은 문자열 'ex'가 포함된 문자열의 column들을 모두 가져와 데이터프레임 형식으로 출력된다. 만약 시작단어와 끝단어를 기준으로 찾고 싶다면 아래와 같이 작성하면 된다.

  • regex = '^str' :문자열 str로 시작하는 column 찾기
  • regex = 'str$': 문자열 str로 끝나는 column 찾기

'^', '$' 기호를 통해 옵션을 추가할 수 있다.

 

다음은 데이터 타입으로 변수를 선택하는 방법이 있다.

데이터프레임명.select_dtypes(매개변수)

select_dtypes는 데이터의 자료형을 기준으로 변수를 선택할 수 있게 해준다. 매개변수는 두 가지를 선택할 수 있다. 

df_test.select_dtypes(include = 'number')
# 데이터의 자료형이 number인 열들을 반환

df_test.select_dtypes(exclude = 'object')
# 데이터의 자료형이 object인 열을 제외한 열들을 반환

이처럼 데이터의 자료형에 따라 변수를 선택하는 방법도 있으니 상황에 맞게 적절히 사용하면 좋을 것 같다.

 

1-2. 조건을 활용한 관측치 선택

df_test['A'] < 50

위의 코드를 해석하자면, A열에서 50미만인 값들을 true, 50이상인 값들은 false가 채워진 시리즈를 반환하게 된다. 해당 시리즈를 loc메서드에 대입하거나, 대괄호를 이용해 인덱싱을 한다면 true인 값들만 남기고 나머지 값들을 제외하게 된다.

이 사진처럼 인덱스는 1336까지 있지만 실제 데이터프레임의 사이즈는 417행으로 이루어져 있다. 이 말의 의미는 1337개의 행 중에서 417개의 행만을 추출했다는 것이다. 

 

조건을 하나만 적용할 수 있는 것은 아니다. 부울 대수와 부울 대수의 연산자인 논리연산자를 이용한다면 2개 이상의 조건으로 데이터프레임의 값들을 추출해올 수 있다. 하지만 여기서 알아야 하는 주의사항이 있다. 보통 파이썬에서는 비교연산자와 논리연산자 중 비교 연산자를 먼저 계산한 다음 논리 연산자를 계산하지만, pandas에서는 우선순위가 없기 때문에 우선적으로 연산을 진행해야되는 표현식이 있다면 소괄호를 이용해 우선순의를 지정해주어야 한다. 

비교 연산자를 먼저 수행하기 위해 소괄호로 묶은 것을 볼 수 있다.

 

다음은 isin메서드이다. isin메서드는 이름 그대로 주어진 문자열이 데이터에 포함되어 있는지 포함되어 있지 않은지 확인하고, 포함되어 있으면 True, 포함되어 있지 않다면 False를 반환한다.

데이터프레임의 특정 열.isin('데이터')

데이터프레임의 특정 열을 가져와서 해당 열에 데이터가 포함되어 있으면 True, 포함되지 않았다면 False를 반환한다. 해당 기능은 비교연산자와, 논리연산자를 조합해 구현할 수 있지만, 조건식을 사용하지 않고, 간단하게 확인할 수 있는 수단이다.

 

1-3. 그 외의 기능들

그 외에 우리가 알아두면 좋은 기능들이 있다. random 메서드는 난수를 생성하는 메서드라는 것을 알 수 있다. 그와 유사하게 정해진 기준으로 값을 추출하는 것이 아닌 무작위 값들을 추출해오는 메서드도 지원한다.

데이터프레임명.sample(n = k)

특정 데이터프레임에서 k개의 값을 무작위로 추출해오는 함수이다.

 

데이터프레임명.nlargest(n, '레이블 명')

데이터프레임명.nsmallest(n, '레이블 명')

nlargest와 nsmallest는 기능이 유사하다. 특정 레이블에서 가장 큰 n개의 값을 추출, 특정 레이블에서 가장 작은 n개의 값을 추출해주는 메서드이다.

 

데이터프레임명.drop_duplicates(subset='레이블 명')

drop_duplicates메서드를 통해 중복되는 값이 있다면 1개만 남겨두고, 나머지 값들을 제외시킨다.

 

데이터프레임명.sort_values('레이블 명', 매개변수)

특정 레이블의 값들을 정렬하는데, 기본 값은 오름차순 정렬이다, 하지만 매개변수로 옵션을 줄 수 있다. 'ascending=False'를 매개변수로 추가하게 되면 내림차순으로 정렬할 수도 있다.

 

2. 데이터의 집계

데이터프레임명.describe(include = '데이터 타입')

describe 메서드는 데이터프레임의 데이터 개수, 값의 다양성, 빈도가 높은 값, 빈도 높은 값의 빈도수를 반환하게 된다,

count가 데이터 개수, unique는 값의 다양성, top은 가장 많은 비중을 차지하는 값, freq는 많은 비중을 차지하는 값의 개수를 나타낸다. 이처럼 함수를 pandas에서 지원하는 함수를 통해 요약 정보를 알아볼 수 있지만, 이러한 정보들 외에 평균 값이나, 분산, 표준편차 등을 알아볼 수 있는 메서드들도 존재한다.

데이터프레임명['레이블'].mean()    # 평균값 출력
데이터프레임명['레이블'].sum()     # 레이블에 속한 데이터의 합계 출력
데이터프레임명['레이블'].var()     # 분산값 출력
데이터프레임명['레이블'].std()     # 표준편차 출력
데이터프레임명['레이블'].median()  # 중앙값 출력
데이터프레임명['레이블'].count()   # 해당 레이블에 포함된 값의 개수 출력

이렇게 다양한 메서드를 통해 데이터들의 특성들을 알아낼 수 있다.

3. 데이터의 시각화

파이썬에서 지원하는 데이터 시각화 모듈은 다양하게 있지만 오늘 배운 내용에서는 matplotlib와 seaborn라이브러리이다. 두 라이브러리는 널리 사용되며, 데이터 시각화를 보기 좋게 잘 표시한다.

 

대표적으로 사용하는 히스토그램을 보자. 히스토그램과 막대그래프는 수치형 데이터를 표현하는 데 사용되는 그래프 유형이지만, 확연한 차이가 몇 가지 있다. 먼저 히스토그램은 '연속형' 데이터의 분포를 나타내는 데 사용된다. 데이터를 빈도, 밀도를 구간으로 나누어 표시한다. 각 구간의 데이터의 범위를 나타내며, 막대의 높이는 데이터의 개수를 나타낸다. 연속형 데이터의 분포를 나타내다 보니 막대끼리 서로 붙어있다.

 

반대로 막대 그래프는 범주형 데이터를 비교하는 데 사용된다. 막대 그래프 또한 각 범주별로 빈도나 값을 나타낸다. 하지만 여기서 가장 큰 차이점이 있다. 히스토그램의 경우 막대가 서로 붙어있지만 막대 그래프는 막대끼리 서로 떨어져있다. 이 뜻은 각 범주가 독립적이라는 것을 알 수 있다.

pandas 라이브러리의 plot 메서드를 이용하여 히스토그램을 그린 것이다. 히스토그램이니 막대끼리 붙어있는 것을 확인할 수 있다.

seaborn라이브러리를 통해 동일한 값을 히스토그램으로 표시한 결과값이다. matplotlib라이브러리를 이용한 결과와 seaborn 라이브러리를 이용한 결과가 다소 다르게 출력된 것을 알 수 있다. 이는 x축에 위치한 범위가 seaborn 라이브러리에서 더 촘촘하게 나뉜 것을 확인할 수 있다. 

 

다음은 박스그래프이다. 막대그래프와는 달리, 소수의 값을 제외하고 주된 데이터들의 영역을 알아볼 수 있다. 

대문자 'I'와 유사한 모양을 하고 있는 박스 그래프는 제1사분위수, 제 3사분위수와 중앙 값을 나타낸다. 박스를 기준으로 가장 윗면은 제 3사분위수, 가장 밑면은 제1사분위수를 나타내고 박스 안의 선이 중앙 값을 의미한다. 대문자 'I"윗쪽으로 여러개의 점은 이상값으로 간주되어 분석에 큰 영향을 미치지 않는다.

 

박스 그래프는 데이터의 분포를 확인하기 쉬우며, 그룹간의 비교나 이상값 탐지에 유용하다

 

다음은 seaborn 라이브러리에서 지원하는 count그래프이다. 

count그래프는 그래프의 이름과 유사하게 값의 개수를 통해 그래프를 그려나가며, 연속적인 값이 아닌 독립적인 값이므로 막대그래프로 나타낸다.

 

다음은 산점도이다. 산점도는 x값과 y값에 근거하여 그래프에 점을 찍는 방식이다. 산점도는 데이터의 분포와 더불어 데이터의 추세를 알 수 있다는 장점이 있다.

위의 그래프는 아버지의 키와 아들의 키에 대한 산점도인데, 아버지의 키는 아들의 키에 영향을 미친다는 것을 알 수 있다.

 

두 변수 간에 서로 영향을 미치는 정도, 상관 관계를 알 수 있는 메서드가 존재한다. 

데이터프레임명[['레이블1', '레이블2']].corr()

레이블1과 레이블2에 포함된 값들의 상관계수를 구할 수 있으며, 0부터 1까지의 값으로 표현된다. 1에 가까울 수록  상관 관계가 높다고 할 수 있다.

 

그렇다면 그래프를 그릴 땐 한번에 한 개의 데이터만 그릴 수 있냐? 그것은 아니다. 데이터들을 그룹화하여 값들을 정리할 수 있고, 그룹화된 레이블들을 이용하여 그래프를 그릴 수 있다. 먼저 그룹화하는 방법에 대해 알아보자.

데이터프레임.groupby('레이블1')['레이블2']

레이블 1을 기준으로 레이블 2 값들을 나누는 방법이다. 하지만 여기서 레이블1 다음에 매개변수로 as_index = False 옵션을 설정하면 레이블 1을 인덱스로 하는 것이 아닌 위치 값으로 인덱스를 정하게 되고, 레이블 1은 column으로 바뀌게 된다. 물론 레이블1에 리스트가 들어가게 되면 리스트 요소의 unique 값끼리 곱해서 출력되는 값을 조정한다. 말로 표현하기 어려우니 그림으로 보자.

첫 번째 셀은 성별을 인덱스 삼아 요금의 평균을 취한 출력을 나타내지만, 두 번째 셀의 인덱스는 위치값으로 하고, 성별을 기준으로 요금을 나누어 평균을 계산한다. as_index의 차이는 소괄호 안의 레이블을 인덱스로 설정할 것인지, 인덱스로 설정하지 않을 것인지 결정하게 된다.

그림과 같이 기준이 되는 레이블을 2개 이상으로 설정이 가능하다.

그림과 같이 박스 그래프의 x, y 값을 정해주고, 그래프의 색상을 이용하여 조건을 추가할 수 있다. 

 

마지막으로 그룹화된 데이터들의 집계를 지원하는 메서드도 있다. pandas의 agg메서드인데, 대표적으로 최솟값(min), 최댓값(max), 평균값(mean)이 있다. 

agg메서드를 이용하게 되면, 여러 집계 함수(min, max, mean)들을 동시에 적용할 수 있고, 각각의 열에 대해 다른 집계 함수를 지정할 수 있게 된다.

df_agg = df_ins.groupby('sex', as_index=False).agg({'age':'mean', 'charges':['min', 'max']})

이처럼 agg메서드에 딕셔너리 값을 넘겨주게 되면 열마다 다른 집계 함수를 사용할 수 있게 된다.

 

오늘은 데이터의 집계와 시각화에 대해 알아보았다. 데이터의 집계도 자주 사용되지만 오늘 수업에서 가장 의미있었던 내용은 아무래도 시각화인 것 같다. 그래프를 통해서 한 눈에 알아볼 수 있다는 것은 분석과정에서 패턴을 찾기 편하고, 데이터에 대한 이해도가 높아지기 때문이다.

 

새로운 조원들과 다양한 지식들을 함께 얻어가고 싶다.