오늘 다룰 파이썬 문법은 Pandas와 Matplotlib 패키지를 이용하여 다음을 연습하고자 한다.
1) 엑셀 파일 불러오기
2) 데이터 개요 보기
3) 정렬하기
4) 필터링하기
5) 집계하기 (합, 평균, 최소값, 최대값)
6) 히스토그램 그리기
7) 산점도 그리기
■ 사용할 패키지 – PANDAS & MATPLOTLIB
Pandas는 데이터셋을 불러와 여러 조작할 수 있는 패키지고, Matplotlib은 데이터를 그릴 때 사용한다.
# pandas를 불러온다. import pandas as pd # matplotlib을 불러온다. import matplotlib.pyplot as plt
■ 데이터 불러오기
확장자에 따라 불러오는 함수가 다르다. csv 확장자라면 pd.read_csv 함수를, xls와 같은 엑셀 확장자라면 pd.read_excel 함수로 불러오면 된다. 그 외에 다른 확장자를 쓴다면 다음 공식 문서에서 확인하여 사용하도록 하자.
# csv 파일 불러와 csv_data 변수에 저장하기 csv_data = pd.read_csv('https://raw.githubusercontent.com/pandas-dev/pandas/master/doc/data/tips.csv') # 엑셀 파일 불러와 xls_data 변수에 저장하기 xls_data = pd.read_excel('ex1.xls')
파일이 웹상에 올려져 있다면 링크 주소를 사용하면 되고, 아니면 파일을 주피터 노트북 상의 경로로 올려서 불러와도 된다. 현재 파이썬 코드를 입력하고 있는 곳의 위치와 동일한 위치에 엑셀 파일을 업로드하면 그대로 파일명을 입력함으로써 엑셀 파일을 불러올 수 있다.
■ 데이터 개요
전체 데이터 셋을 다 살펴보기엔 양이 많을 수 있으니 몇 줄만 보고 데이터를 파악할 필요가 있다.
# 앞 몇 줄만 보기 csv_data.head() # 뒷 몇 줄만 보기 csv_data.tail() # 몇 줄을 볼지 지정하여 보기 csv_data.head(3)
그러면 아래와 같은 결과가 출력된다. 맨 앞에 원데이터에 없는 숫자를 ‘인덱스(index)’라고 한다.
# 인덱스 확인하기 csv_data.index()
이 데이터의 경우 0부터 시작하여 244행까지 있으며 0-1-2-3과 같이 1씩 늘어남을 알 수 있다.
숫자 데이터의 요약을 보고 싶다면 describe() 함수를 사용한다.
# 숫자 데이터 요약하기 csv_data.describe() # 숫자가 아닌 데이터도 같이 보기 csv_data.describe(include='all')
숫자 데이터의 요약을 보고 싶다면 describe() 함수를 사용한다.
■ 정렬하기
정렬은 sort_values(by’column’ 함수를 사용한다.
# 'total_bill' 열을 기준 잡아 정렬하기 sorted = csv_data.sort_values(by ='total_bill') sorted.head(10)
특정 열만을 출력하고 싶다면 []를 사용한다.
# 'day' 열만 출력하기 sorted['day'].head() # 여러 열 출력하기 sorted['day' , 'total_bill'].head()
■ 필터링 하기
특정 조건을 만족시키도록 필터링을 하고 싶다면 앞서 말한 []를 이용하면 쉽다.
# 'total_bill' 이 5.0보다 큰 값만 출력하기 (sorted['total_bill'] > 5.0).head() # 위의 식이 어떤 값을 갖는지 display display((sorted['total_bill'] > 5.0).head())
그러나 그냥 필터를 걸면 boolean 값으로 나온다. 우리가 보기 편한 방식으로 바꾸려면 아래와 같이 취하면 된다.
# sorted 데이터에서 total_bill이 5.0보다 큰 값의 헤드 값을 보여준다. display(sorted[(sorted['total_bill'] > 5.0)].head()) # 만약 5.0 보다 작은 값을 보고 싶다면 부호를 < 로 바꾸는 법도 있고, ~을 이용하는 법도 있다. display(sorted[(sorted['total_bill'] < 5.0)].head()) display(sorted[~(sorted['total_bill'] > 5.0)].head())
■ 집계하기
합계, 평균 등 집계 함수는 groupby 함수를 사용하여 간단히 구할 수 있다. 함수의 종류는 다음의 공식 문서에서 더 확인 가능하다.
# 합계 sorted.groupby('day').sum() # 평균 sorted.groupby('day').mean() # 표준편차 sorted.groupby('day').std() # 최소값 sorted.groupby('day').min() # 최대값 sorted.groupby('day').max()
groupby에 사용한 열로 인덱스가 바뀌었음도 확인하고 가자.
특정 레코드에 개별적으로 접근하고 싶을 때는 intertuples() 함수를 사용한다. intertuples() 함수는 모든 레코드를 tuple로 반환한다. 즉, for 문을 이용하여 각 값을 별도의 변수에 할당할 수 있다.
# tip이 5보다 큰 값 저장하기 big_tips = csv_data[csv_dat['tip'] > 5] # 값 확인하기 display(big_tips.columns)
# intertuples() 함수를 사용하여 모든 레코드를 튜플로 반환 (튜플의 첫 번째 값은 인덱스 값임을 유의)0 for index, total_bill, tip, sex, smoker, day, time, size in big_tips.intertuples(): print("Record " + str(index) + "has total tip " + str('total_bill'))
비슷하게 iterrows() 함수를 사용할 수도 있다.
for index, row in big_tips.iterrows(): print("Record " + str(index) + has total tip " + str(row['total_bill']))
■ 히스토그램 그리기
위에서 불러온 matplotlib 패키지를 활용한다. 실제 그래프가 그려지는 것은 show() 함수를 호출할 경우에만 이루어 진다. line(), hist(), bar(), pie(), scatter() 등 이름만으로도 쉽게 유추가 가능하다.
# 히스토그램 그리기 plt.hist(csv_data['total_bill'] plt.show()
여러 그래프를 그리고 싶다면 subplots()를 이용한다.
# 행의 개수, 열의 개수, y축을 공유할 것인지 여부, 전체 사이즈를 각각 지정해준다. fig, axs = plt.subplots(1, 2, sharey=False, figsize=(10,5)) # 첫번째 히스토그램 그리기 axs[0].hist(csv_data['total_bill], bins =5) # 두번째 히스토그램 그리기 axs[1].hist(csv_data['total_bill'], bin = 50) # 그래프의 겹치는 현상 방지하기 plt.tight_layout() plt.show()
만약 여러 그래프를 하나로 겹쳐 그리고 싶다면 다음과 같이 수행하면 된다.
# 첫번째 히스토그램 그리기 hist(csv_data['total_bill], bins =5) # 두번째 히스토그램 그리기 hist(csv_data['total_bill'], bin = 50) plt.show()
■ 산점도 그리기
산점도 역시 간단한데 x, y 축만 지정해주면 된다.
plt.scatter(csv_data['total_bill'], csv_data['tip'] plt.show()
각 점에 대한 범례 표시를 원한다면 annotate()를 사용한다.
# 그래프 사이즈 지정하기 plt.figure(figsize = (10, 8)) # day로 그룹화하여 모든 그룹에 반복하기 for name, group in csv_data.groupby('day'): # 각 그룹에 맞게 점 그리기 plt.scatter(group['total_bill'], group['tip'], label = name) # 축 이름 지정하기 plt.xlabel('total_bill') plt.ylabel('tip') # 범례 추가 plt.legend() plt.show()