GCI 데이터 과학자 교육 강좌 연습 문제 해결 Chapter6

GCI 데이터 과학자 육성 강좌



'GCI 데이터 과학자 육성 강좌'은 도쿄대학(마츠오 연구실)이 개강하고 있는 '실천형 데이터 과학자 육성 강좌 및 Deep Learning 강좌'로, 연습 파트의 콘텐츠가 JupyterNoteBook 형식으로 공개(CC-BY-NC- ND)입니다.
Chapter6는 「Pandas를 이용한 데이터 가공 처리」로, 데이터 해석을 하기 위한 강력하고 고속의 데이터 조작 라이브러리의 사용법을 학습해 갑니다.
일본어로 배울 수 있는 귀중하고 훌륭한 교재를 공개해 주시고 있는 것에의 「좋아!」버튼 대신에, 풀어 본 해답을 실어 봅니다. 틀린 곳이 있으면 지적해 주세요.

Chapter6 Pandas를 이용한 데이터 가공 처리



6.1 Pandas



6.1.1 계층 적 인덱스



<연습 문제 1>
다음 데이터에 대해 Kyoto 열만 추출해 봅시다.
hier_data_frame1 = DataFrame(np.arange(12).reshape((3,4))
                           ,index = [['c','d','d'],[1,2,1]]
                           ,columns = [['Kyoto','Nagoya','Hokkaido','Kyoto']
                                      ,['Yellow','Yellow','Red','Blue']]
                           )

hier_data_frame1.index.names =['key1','key2']
hier_data_frame1.columns.names =['city','color']
hier_data_frame1


hier_data_frame1["Kyoto"]



<연습 문제 2>
연습 문제 1의 데이터에 대해 city를 정리하여 열끼리의 평균값을 내십시오.
hier_data_frame1.mean(level = "city", axis = 1)



<연습 문제 3>
연습 문제 1의 데이터에 대해 key2마다 행의 합계 값을 계산해 봅시다.
hier_data_frame1.sum(level = "key2")



6.1.2 데이터 병합



<연습 문제 1>
아래의 두 개의 데이터 테이블에 대해 내부적으로 결합해 봅시다.
pd.merge(attri_data_frame4, attri_data_frame5, how = "inner")



<연습 문제 2>
attri_data_frame4를 기반으로 attri_data_frame5의 테이블을 외부 조인해 봅시다.
pd.merge(attri_data_frame4, attri_data_frame5, how = "outer")



<연습 문제 3>
attri_data_frame4에 대해 다음 데이터를 세로 결합해 봅시다.
pd.concat([attri_data_frame4, attri_data_frame6])



6.1.3 데이터 조작 및 변환



<연습 문제 1>
이전 장에서 사용한 "student-mat.csv"의 데이터를 사용합니다. age를 2배로 한 컬럼을 추가해 봅시다.
student_data_math["2age"] = 2 * student_data_math["age"]
student_data_math[["age", "2age"]].head()



<연습 문제 2>
위와 같은 데이터로, 「absences」의 컬럼에 대해, 이하의 3개의 빈으로 나누어 각각의 인원수를 세어 봅시다. 덧붙여 cut의 옵션 설정으로, 디폴트는 우측이 폐 구간이 되고 있습니다만, 이번은 0이 들어가기 위한 right=False를 추가해 주세요.
# pd.cut(student_data_math.absences, absences_bins, right=False)
pd.value_counts(pd.cut(student_data_math.absences, absences_bins, right=False))
> [5, 100)    151
> [1, 5)      129
> [0, 1)      115
> Name: absences, dtype: int64

<연습 문제 3>
위와 같은 데이터를 사용하여 "absences"열에 대해 qcut을 사용하여 세 개의 bin으로 나눕니다.
# pd.qcut(student_data_math.absences, 3)
pd.value_counts(pd.qcut(student_data_math.absences, 3))
> (-0.001, 2.0]    183
> (6.0, 75.0]      115
> (2.0, 6.0]        97
> Name: absences, dtype: int64

6.1.4 데이터 집계 및 그룹 연산



<연습 문제 1>
방금 사용한 'student-mat.csv'를 사용하여 'student-mat.csv'를 사용하여 pandas를 집계해 봅시다. 우선, school을 축으로 하여 G1의 평균점을 각각 구해 봅시다.
student_data_math = pd.read_csv("student-mat.csv",sep=";")
student_data_math.groupby("school")["G1"].mean()
> school
> GP    10.939828
> MS    10.673913
> Name: G1, dtype: float64

<연습 문제 2>
다음은 school과 성별을 축으로 하여 G1, G2, G3의 평균점을 각각 구해 봅시다.
student_data_math.groupby(["school", "sex"])[["G1", "G2", "G3"]].mean()



<연습 문제 3>
다음은, school과 성별을 축으로 하여, G1, G2, G3의 최대치, 최소치를 정리해 산출해 봅시다.
student_data_math.groupby(["school", "sex"])[["G1", "G2", "G3"]].agg(["max", "min"])



6.2 결손 데이터와 이상치의 취급의 기초



6.2.1 누락 데이터 처리 방법



<연습 문제 1>
아래의 데이터에 대해 1열에서도 NaN이 있는 경우 삭제하고 그 결과를 표시합니다.
sample_data_frame2.dropna()



<연습 문제 2>
위에서 준비한 데이터에 대해 NaN을 0으로 채웁니다.
sample_data_frame2.fillna(0)



<연습 문제 3>
위에서 준비한 데이터에 대해 NaN을 각 열의 평균값으로 채웁니다.
sample_data_frame2.fillna(sample_data_frame2.mean())



6.2.2 이상 데이터 처리 방법



6.3 종합 문제



6.3.1 종합 문제 1
이전에 사용한 "student-mat.csv"를 사용하여 다음 질문에 답하십시오.

(1) 상기의 데이터에 대해 연령×성별로 G1의 평균점을 산출하고, 세로축이 연령, 가로축이 성별이 되는 표(테이블)를 작성합시다.

(2) (1)에서 표시한 결과 테이블에 대해 NA가 되어 있는 행(레코드)을 모두 삭제한 결과를 표시합시다.
student_data_math = pd.read_csv("student-mat.csv",sep=";")

# (1)
print("(1)")
print(student_data_math.groupby(["age", "sex"])["G1"].mean().unstack())

# (2)
print("\n(2)")
print(student_data_math.groupby(["age", "sex"])["G1"].mean().unstack().dropna())
> (1)
> sex          F          M
> age                      
> 15   10.052632  12.250000
> 16   10.203704  11.740000
> 17   11.103448  10.600000
> 18   10.883721  10.538462
> 19   10.642857   9.700000
> 20   15.000000  13.000000
> 21         NaN  10.000000
> 22         NaN   6.000000
> 
> (2)
> sex          F          M
> age                      
> 15   10.052632  12.250000
> 16   10.203704  11.740000
> 17   11.103448  10.600000
> 18   10.883721  10.538462
> 19   10.642857   9.700000
> 20   15.000000  13.000000

좋은 웹페이지 즐겨찾기