주피터 노트북에서 시각화를 할 때는 항상 아래 명령을 입력해서 그래프가 노트북 안에 포함되도록 한다.
%matplotlib inline
seaborn 은 Python 시각화에 가장 많이 사용되는 라이브러리 중에 하나이다. seaborn 은 matplotlib 를 기반으로 한다.
import seaborn as 눈
from matplotlib import pyplot as plt
9.1. 데이터 불러오기
실습에 사용할 데이터는 iris 데이터이다. iris 데이터는 seaborn 에 내장되어 있어 아래 명령으로 불러올 수 있다.
df = sns.load_dataset('iris')
위의 명령이 안될 경우 https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv 에
서 다운 받은 다음 pandas 로 직접 읽어들인다.
import pandas
df = pandas.read_csv('iris.csv')
어떤 방법으로든 데이터를 불러왔으면 데이터의 내용을 확인해보자
9.2. 산점도
먼저 꽃잎의 길이와 꽃받침의 길이를 산점도로 나타내보자.
sns.regplot(x=df["sepal_length"], y=df["petal_length"]
9.3. 색상
색상을 빨간색으로 바꿔보자.
sns.regplot(x=df["sepal_length"], y=df["petal_length"], color='red')
선의 속성만 바꾸려면 line_kws에 설정값을 사전 형태로 넘겨준다.
sns.regplot(x=df["sepal_length"], y=df["petal_length"], line_kws={'color': 'red'}
점의 속성만 바꾸려면 scatter_kws에 설정값을 사전 형태로 넘겨준다.
sns.regplot(x=df["sepal_length"], y=df["petal_length"], scatter_kws={'color': 'red'}
색상에는 색상 코드를 사용할 수 있다. 색상 코드는 구글에서 "color picker"를 검색하자.
sns.regplot(x=df["sepal_length"], y=df["petal_length"], color='#f49842'
9.4. 선 없애기
fit_reg 옵션으로 회귀선을 제거할 수 있다
sns.regplot(x=df["sepal_length"], y=df["petal_length"], fit_reg=False)
9.5. 옵션
자세한 내용은 공식 문서를 참고하자. https://seaborn.pydata.org/generated/seaborn.regplot.html
line_kws 와 scatter_kws 에 넘길 수 있는 옵션은 다음 링크를 참고하자.
• https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html
• https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html
9.6. 그래프의 속성 바꾸기
matplotlib 에는 피겨(figure)와 액시즈(axes)라는 개념이 있다.
피겨는 그림을 가리키고, 액시즈는 그림에 포함된 하나 의 그래프를 가리킨다.
seaborn 의 그래프 함수들은 해당 그래프의 액시즈를 반환한다. 만약 그래프의 속성을 바꾸고 싶으면 해당 액시즈를 이용한다.
자세한 내용은 matplotlib 의 https://matplotlib.org/api/axes_api.html 를 참고한다_api.html 를 참고한다
9.6.1. 축 이름 붙이기
축 이름은 set_xlabel 과 set_ylabel 로 붙인다.
ax.set_xlabel('Sepal Length’)
ax.figure # 그림을 현재 셀에서 다시 보여준다
한글을 사용하면 글자가 깨진다.
ax.set_xlabel('꽃잎 길이’)
ax.figure
9.7. 글꼴 설정
다음과 같이 글꼴을 한글 글꼴로 바꿔준다.
plt.rc('font', family='Malgun Gothic')
다시 그래프를 그리면 한글이 잘 표시된다.
ax = sns.regplot(x=df["sepal_length"],
y=df["petal_length"]) ax.set_xlabel('꽃잎 길이’)
ax.set_ylabel('꽃받침 길이')
위의 그래프를 자세히보면 왼쪽 아래 마이너스 표시가 깨지는 것을 볼 수 있다.
이것은 한글 폰트에 마이너스가 없기 때문에 생기는 현상이다.
다음과 같이 해주면 된다.
plt.rc('font', family='Malgun Gothic’)
plt.rc('axes', unicode_minus=False)
ax = sns.regplot(x=df["sepal_length"],y=df["petal_length"])
ax.set_xlabel('꽃잎 길이’)
ax.set_ylabel('꽃받침 길이')
9.8. 글꼴 이름 찾기
from matplotlib.font_manager import fontManager
forfontinfontManager.ttflist:
if'Nanum'infont.name:
print(font.name)
아래와 같이 글꼴 이름에 Nanum이 들어가는 경우를 찾는다.
ax.figure 를 통해 그림 속성을 바꿀 수도 있다.
matplotlib 의 Figure 문서 참고
ax = sns.regplot(x=df["sepal_length"],y=df["petal_length"])
ax.figure.set_size_inches(12, 10)
9.9. 그림 속성 바꾸기
9.10. 저장
그림을 저장하는 것도 피겨의 기능이다.
ax = sns.regplot(x=df["sepal_length"], y=df["petal_length"]
9.11. 그래프의 스타일 조정
색상 등 그래프의 스타일을 조정할 경우 시본의 스타일 설정 기능을 사용한다. 자세한 내용은
https://seaborn.pydata.org/tutorial/aesthetics.html
문서를 참고한다.
sns.set_style('darkgrid’)
sns.regplot(x=df["sepal_length"], y=df["petal_length"])
다음 명령으로 기본 스타일로 돌아올 수 있다
9.12. 히스토그램과 밀도 그래프
산점도 두 변수의 관계를 보여준다면 히스토그램과 밀도 그래프는 한 변수의 분포를 보여준다.
sns.distplot(df["sepal_width"])
bins 옵션으로 막대의 갯수를 조절할 수 있다.
sns.distplot(df["sepal_width"], bins=4)
또는 구간을 명시할 수도 있다.
sns.distplot(df[ "sepal_width“ ], bins = [2 , 2.5, 3, 3.5, 4, 4.5, 5])
kde=False 을 넘겨주면 밀도 그래프를 그리지 않는다.
sns.distplot(df["sepal_width"], kde=False)
hist=False 을 넘겨주면 히스토그램을 그리지 않는다.
sns.distplot(df["sepal_width"], hist=False)
자세한 내용은 https://seaborn.pydata.org/generated/seaborn.distplot.html
를 참고하자
10.1. 열끼리 계산import pandas as pd
df = pd.read_csv('adult.csv', header=None)
titles = {0: '나이', 1: '고용형태', 2: '가중치',
3: '최종학위', 4:'교육햇수', 5: '결혼유무',
6: '직업명', 7:'가족내역할', 8:'인종',
9: '성별', 10: '자본이득', 11: '자본손실',
12: '노동시간', 13:'고향', 14:'수입'
}
df.rename(columns=titles, inplace=True)
df.head()
파이썬 연산 기호로 열끼리 간단한 계산을 할 수 있다.
예제로 성인 인적사항 자료를 사용하자
10.1.1. 곱셈
열에 상수를 연산할 수 있다. 판다스는 각 행에 해당 연산을 적용시켜 돌려준다.
한 달 동안 근무 시간을 보기 위해 주당 근무 시간에 4 를 곱해보자.
결과를 확인해보니, 월별 근무시간이 계산되었다.
hours_per_month.head()
0
1
2
3
4
160
52
160
160
160
Name:노동시간,dtype:int64
10.1.2. 나눗셈
반대로, 일당 근무 시간을 알아보기 위해 노동시간을 5 로 나누자.
hours_per_day =df['노동시간'] / 5
확인결과 일당 노동시간이 구해졌다.
hours_per_day.head()
0
1
2
3
4
8.0
2.6
8.0
8.0
8.0
Name:노동시간,dtype:float64
두번째 사람을 제외하고 첫 다섯 사람은 하루 8시간 근무한다.
10.1.3. 빼기
true gain
서로 다른 열을 사용해 계산할 수 있다.-로 자본이익에서 자본손실을 빼 true_gain에 저장하자.
확인해보니 차액이 구해졌다.
근무 햇수
열과 열을 계산하며 상수를 포함해서 연산을 할 수 있다.
나이에서 교육받은 햇수와 유아기 8년을 빼, 근무 햇수를 구해보자
true_gain.head()
0 2174
1
2
3
4
0
0
0
0
dtype:int64
not_educated =df['나이'] - df['교육햇수'] - 8 0
1
2
3
4
18
29
21
38
7
dtype:int64
확인해보니, 모든 열에서 상수가 뺄셈되었다.
not_educated.head()
10. Pandas II
10.2. grouping
10.2.1 groupby
이번 강의에서는 .groupby를 이용해 각 열의 값을 기준으로 데이터를 보는 방법을 살펴보자.
importpandasaspd
df=pd.read_csv('adult.csv',skipinitialspace=True,header=None)
#값 앞에 공백이 포함되어 있기 때문에 제거해야 함
titles = {0: '나이', 1: '고용형태', 2: '가중치',
3: '최종학위', 4:'교육년수', 5: '결혼유무',
6: '직업명', 7:'가족내역할', 8:'인종',
9: '성별', 10: '자본이득', 11: '자본손실',
12: '근무시간', 13:'고향', 14:'수입'
}
df.rename(columns=titles, inplace=True)
df.head()
나
이
고용형
태
가중치최종학위
교
육
년
수
결혼유무직업명가족내역
할
인종성별
자본
이득
자
본
손
실
근
무
시
간
0 39
State
gov 77516 Bachelors 13
Never
married
Adm
clerical
Not-in
family White Male 2174 0 40
1 50
Self
emp
not
inc
83311 Bachelors 13
Married
civ-spo
use
Exec-man
agerial Husband White Male 0 0 13
2 38 Private 215646 HS-grad 9 Divorced
Handlers
cleaners
Not-in
family White Male 0 0 40
3 53 Private 234721 11th 7
Married
civ-spo
use
Handlers
cleaners Husband Black Male 0 0 40
4 28 Private 338409 Bachelors 13
Married
civ-spo
use
Prof-sp
ecialty Wife Black Female 0 0 40
10. Pandas II
가족내 역할이 '남편' 인 자료 색인
groupby 는 선택한 열의 그룹별로 자료를 분류한다. 예를 들어보기 위해 '가족내역할' 열의 값들을 살펴보자.
df['가족내역할'].unique()
array(['Not-in-family', 'Husband', 'Wife', 'Own-child', 'Unmarried', 'Other-relative'], dtype=object)
가족이 없는 사람, 남편, 부인, 자식, 미혼 등등의 값을 갖는다.
groupby
groupby 를 적용시켜보자.
df.groupby('가족내역할')
아직까지는 자료를 볼 수 없다 이를 grouped 에 저장하자.
grouped = df.groupby('가족내역할')
10. Pandas II
.groups 로 전체 그룹과 데이터 프레임에서 위치를 살펴 볼 수 있다. 결과물은 사전과 같은 형태로 나온다.
grouped.groups
{'Husband': Int64Index([
20,
...
1, 3, 7, 9, 10, 11, 14, 15, 18,
32532,32533,32539,32542,32547,32550,32551,32552,32554,
32557],
dtype='int64', length=13193),
'Not-in-family': Int64Index([
53,
...
0, 2, 6, 8, 13, 28, 30, 44, 49,
32523,32531,32536,32537, 32541,32544,32546,32548,32553,
32555],
dtype='int64', length=8305),
74, 110, 144, 152, 159, 195, 198, 233, 317, 'Other-relative': Int64Index([
335,
...
32306,32322,32359,32387,
댓글 없음:
댓글 쓰기