2025년 9월 3일 수요일

9.03 시각화 기초/. pandas

 주피터 노트북에서 시각화를 할 때는 항상 아래 명령을 입력해서 그래프가 노트북 안에 포함되도록 한다. %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,



댓글 없음:

2.06 -