학습 개요
- 파이썬은 객체 지향 프로그래밍 언어로 문법이 쉽고, 확장성이 좋아 데이터 과학 분야에서 R과 더불어 널리 이용되고있는 프로그램 언어임
- 파이썬을 이용하여 데이터를 읽고, 처리하는 방법을 알아보고, 기술 통계량을 구하는 법, 히스토그램 등 기본적인 통계 그래프를 그리는 방법을 알아봄
학습 목표
- 파이썬을 이용하여 데이터를 읽을 수 잇음
- 파이썬을 이용하여 기술 통계 량을 구할 수 있음
- 파이썬을 이용하여 통계 그래프를 그릴 수 있음
강의록
자료 읽기
자료 파일 (nex8-1.csv, nex8-1.xlsx)
- 자료 읽기
- 기술 통계량 및 빈도표
- 그래프 그리기
<Py 9-3> 텍스트 자료 읽기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pandas as pd # pandas 라이브러리를 pd라는 이름으로 불러옴
nex8 = pd.read_csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0) # CSV 파일을 읽어 DataFrame으로 저장 (첫 번째 행을 헤더로 사용)
nex8.head() # DataFrame의 첫 5행을 출력
# id sex age edu salary
# 0 1 m 21 high 150
# 1 2 f 22 middle 100
# 2 3 m 33 high 200
# 4 5 m 28 high 170
nex8.head(3) # DataFrame의 첫 3행을 출력
# id sex age edu salary
# 0 1 m 21 high 150
# 1 2 f 22 middle 100
# 2 3 m 33 high 200
nex8.tail(3) # DataFrame의 마지막 3행을 출력
# id sex age edu salary
# 7 8 m 32 univ 220
# 8 9 f 44 middle 370
# 9 10 m 55 univ 410
type(nex8) # nex8 객체의 타입을 확인
# pandas.core.frame.DataFrame
nex8.shape # DataFrame의 행과 열의 개수를 확인 (10행, 5열)
# (10, 5)
<Py 9-4> 엑셀 파일 읽기
1
2
3
4
5
6
7
import pandas as pd # pandas 라이브러리를 pd라는 이름으로 불러옴
nex8_2 = pd.read_excel("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.xlsx", header=0) # 엑셀 파일을 읽어 DataFrame으로 저장 (첫 번째 행을 헤더로 사용)
nex8_2.head(3) # DataFrame의 첫 3행을 출력
# id sex age edu salary
# 0 1 m 21 high 150
# 1 2 f 22 middle 100
# 2 3 m 33 high 200
변수 선택
1 2 3 4 5 6
nex8["age"] # age 열 선택 nex8.age # age 열 선택 cols = ['sex', 'age', 'edu', 'salary'] # 선택할 여러 열의 이름을 리스트로 저장 nex8[cols] # 리스트에 지정 된 여러 열 선택 nex8.iloc[:, 1:] # 모든 행과 두 번째 열부터 끝까지의 모든 열 선택 (첫 번째 열 제외) nex8 = nex8.iloc[:, 1:] # 첫 번째 열을 제외한 결과를 다시 nex8에 저장
기술 통계량 및 빈도 표
<Py 9-5> 기술 통계량 구하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd # pandas 라이브러리를 pd라는 이름으로 불러옴
nex8 = pd.read_csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0) # CSV 파일을 읽어 DataFrame으로 저장 (첫 번째 행을 헤더로 사용)
nex8.head(2) # DataFrame의 첫 2행을 출력
# id sex age edu salary
# 0 1 m 21 high 150
# 1 2 f 22 middle 100
nex8 = nex8.iloc[:,1:] # 첫 번째 id 열을 제외
nex8.head(2) # 변경된 DataFrame의 첫 2행을 출력 (id 열 없음)
# sex age edu salary
# 0 m 21 high 150
# 1 f 22 middle 100
nex8["salary"].mean() # salary 열의 평균 계산
# Out[15]: 243.0
nex8["salary"].std() # salary 열의 표준편차 계산
# Out[16]: 98.21178929006209
nex8.salary.median() # salary 열의 중앙값 계산
# Out[17]: 220.0
nex8.salary.quantile(0.75) # salary 열의 3사분위수 (75%) 계산
# Out[18]: 297.5
nex8.describe() # 숫자형 열들의 기술통계량 요약 (개수, 평균, 표준편차, 최소값, 사분위수, 최대값)
# Out[19]:
# age salary
# count 10.000000 10.000000
# mean 34.800000 243.000000
# std 10.347302 98.211789
# min 21.000000 100.000000
# 25% 29.000000 177.500000
# 50% 33.000000 220.000000
# 75% 40.500000 297.500000
# max 55.000000 410.000000
참고 : <Py 9-5> 기술 통계량 구하기 – 범주형 변수로 바꾸기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ex8 = pd.read_csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0) # ex8-1.csv 파일을 읽어 DataFrame으로 저장 (첫 번째 행을 헤더로 사용)
ex8.head(3) # DataFrame의 첫 3행을 출력
# id sex age edu salary
# 0 1 1 21 2 150
# 1 2 2 22 1 100
# 2 3 1 33 2 200
ex8.describe() # 숫자형 열들의 기술통계량 요약 (범주형 변환 전)
# Out[20]
# sex age edu salary
# count 10.000000 10.000000 10.000000 10.000000
# mean 1.400000 34.800000 2.200000 243.000000
# std 0.516398 10.347302 0.788811 98.211789
# min 1.000000 21.000000 1.000000 100.000000
# 25% 1.000000 29.000000 2.000000 177.500000
# 50% 1.000000 33.000000 2.000000 220.000000
# 75% 2.000000 40.500000 3.000000 297.500000
# max 2.000000 55.000000 3.000000 410.000000
# ? sex, edu : 범주형 변수로 바꾸기
ex8["sex"] = ex8["sex"].astype("category") # sex 열을 범주형(category) 데이터 타입으로 변경
ex8["edu"] = ex8["edu"].astype("category") # edu 열을 범주형(category) 데이터 타입으로 변경
ex8.describe() # 기술통계량 요약 (범주형으로 변환된 sex, edu는 기본적으로 포함 안 됨)
# Out[31]:
# age salary
# count 10.000000 10.000000
# mean 34.800000 243.000000
# std 10.347302 98.211789
# min 21.000000 100.000000
# 25% 29.000000 177.500000
# 50% 33.000000 220.000000
# 75% 40.500000 297.500000
# max 55.000000 410.000000
<Py 9-6> 그룹 별 기술 통계량 구하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd # pandas 라이브러리를 pd라는 이름으로 불러옴
nex8 = pd.read_csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0) # CSV 파일을 읽어 DataFrame으로 저장
nex8 = nex8.iloc[:,1:] # 첫 번째 'id' 열을 제외
group_stat_by_sex = nex8.groupby("sex")["salary"].describe() # 'sex' 열을 기준으로 그룹화한 후, 각 그룹의 'salary'에 대한 기술통계량 계산
group_stat_by_sex # 결과 출력
# Out[62]:
# count mean std min 25% 50% 75% max
# sex
# f 4.0 245.000000 114.455231 100.0 190.00 255.0 310.00 370.0
# m 6.0 241.666667 97.450842 150.0 177.50 210.0 280.00 410.0
group_stat_by_sex["mean"] # 그룹별 기술통계량 중 'mean'(평균) 값만 선택하여 출력
# Out[95]:
# sex
# f 245.000000
# m 241.666667
group_stat_by_sex["std"] # 그룹별 기술통계량 중 'std'(표준편차) 값만 선택하여 출력
# Out[96]:
# sex
# f 114.455231
# m 97.450842
group_stat_by_sex.loc["m"] # 'sex'가 'm'인 그룹의 기술통계량 출력
group_stat_by_sex.loc["f"] # 'sex'가 'f'인 그룹의 기술통계량 출력
# Out[98]
# count 4.000000
# mean 245.000000
# std 114.455231
# min 100.000000
# 25% 190.000000
# 50% 255.000000
# 75% 310.000000
# max 370.000000
# Name: f, dtype: float64
<Py 9-7> 빈도 표 및 분할 표 구하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import pandas as pd # pandas 라이브러리를 pd라는 이름으로 불러옴
nex8 = pd.read_csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0) # CSV 파일을 읽어 DataFrame으로 저장
sex_freq = pd.crosstab(index=nex8["sex"], columns="count") # 'sex' 열의 빈도표 생성
sex_freq # 결과 출력
# Out[100]:
# col_0 count
# sex
# f 4
# m 6
edu_freq = pd.crosstab(index=nex8["edu"], columns="count") # 'edu' 열의 빈도표 생성
edu_freq # 결과 출력
# Out[102]:
# col_0 count
# edu
# high 4
# middle 2
# univ 4
sex_edu_table = pd.crosstab(index=nex8["sex"], columns=nex8["edu"]) # 'sex'와 'edu' 열 간의 분할표(교차표) 생성
sex_edu_table # 결과 출력
# Out[104]:
# edu high middle univ
# sex
# f 1 2 1
# m 3 0 3
from scipy.stats import chi2_contingency # scipy.stats 모듈에서 카이제곱 검정 함수 불러옴
chi2_contingency(sex_edu_table) # 분할표에 대해 카이제곱 독립성 검정 수행 (통계량, p-value, 자유도, 기대빈도 반환)
# Out[106]:
# (3.7499999999999996, # 카이제곱 통계량
# 0.1533549668449285, # p-value
# 2, # 자유도
# array([[1.6, 0.8, 1.6], # 기대빈도
# [2.4, 1.2, 2.4]]))
<Py 9-8> 막대 그림, 원 그림, 겹친 막대 그림
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd # pandas 라이브러리를 pd라는 이름으로 불러옴
nex8 = pd.read_csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0) # CSV 파일을 읽어 DataFrame으로 저장
nex8 = nex8.iloc[:, 1:] # 첫 번째 'id' 컬럼 제외
sex_freq = pd.crosstab(index=nex8["sex"], columns="count") # 'sex' 열의 빈도표 생성
edu_freq = pd.crosstab (index=nex8["edu"], columns="count") # 'edu' 열의 빈도표 생성
import matplotlib.pyplot as plt # matplotlib.pyplot 라이브러리를 plt라는 이름으로 불러옴 (시각화용)
plt.bar(sex_freq.index, sex_freq["count"]) # 'sex' 빈도에 대한 막대그래프 생성
plt.bar(edu_freq.index, edu_freq["count"]) # 'edu' 빈도에 대한 막대그래프 생성
plt.pie(edu_freq["count"], labels=edu_freq.index) # 'edu' 빈도에 대한 원그래프 생성 (각 항목의 레이블 지정)
sex_edu_table = pd.crosstab(index=nex8["sex"], columns=nex8["edu"]) # 'sex'와 'edu'의 분할표 생성
sex_edu_table.plot.bar(stacked=True) # 분할표를 이용해 겹친 막대그래프 생성
<Py 9-9> 히스토그램, 줄기-잎 그림, 상자 그림
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pandas as pd # pandas 라이브러리를 pd라는 이름으로 불러옴
nex8 = pd.read_csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0) # CSV 파일을 읽어 DataFrame으로 저장
nex8 = nex8.iloc[:,1:] # 첫 번째 'id' 컬럼 제외
import matplotlib.pyplot as plt # matplotlib.pyplot 라이브러리를 plt라는 이름으로 불러옴
plt.hist(nex8["salary"], bins=4) # 'salary' 열에 대한 히스토그램 생성 (구간(bin) 개수는 4개)
# Out[113]:
# (array([3., 3., 2., 2.]), # 각 구간의 빈도수
# array([100. , 177.5, 255. , 332.5, 410. ]), # 각 구간의 경계값
# <BarContainer object of 4 artists>)
# pip install stemgraphic (in DOS) # stemgraphic 라이브러리 설치 명령어
import stemgraphic # stemgraphic 라이브러리 불러옴 (줄기-잎 그림용)
stemgraphic.stem_graphic(nex8.salary, scale=100) # 'salary' 열에 대한 줄기-잎 그림 생성 (scale은 줄기의 단위를 조절)
import seaborn as sns # seaborn 라이브러리를 sns라는 이름으로 불러옴 (시각화용)
sns.boxplot(x="sex", y="salary", data=nex8) # 'sex'별 'salary'에 대한 상자 그림 생성
# [그래프 출력됨: 성별에 따른 급여 상자그림]
<Py 9-10> 산점도 그리기
1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd # pandas 라이브러리를 pd라는 이름으로 불러옴
nex8 = pd.read_csv("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0) # CSV 파일을 읽어 DataFrame으로 저장
nex8 = nex8.iloc[:,1:] # 첫 번째 'id' 컬럼 제외
import matplotlib.pyplot as plt # matplotlib.pyplot 라이브러리를 plt라는 이름으로 불러옴
plt.scatter(nex8.age, nex8.salary) # 'age'와 'salary' 간의 산점도 생성
import numpy as np # numpy 라이브러리를 np라는 이름으로 불러옴 (배열/수치 연산용)
colors = np.where(nex8["sex"]=='m','r','b') # 'sex' 열의 값이 'm'이면 'r'(빨강), 아니면 'b'(파랑)으로 색상 지정
colors # 생성된 색상 배열 확인
# Out[122]: array(['r', 'b', 'r', 'b', 'r', 'r', 'b', 'r', 'b', 'r'], dtype='<U1')
plt.scatter(nex8.age, nex8.salary, c=colors) # 'age'와 'salary' 산점도에 성별에 따른 색상 적용
<Py 9-10> 산점도 그리기 – 범례 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import matplotlib.pyplot as plt # matplotlib.pyplot 라이브러리를 plt라는 이름으로 불러옴
import numpy as np # numpy 라이브러리를 np라는 이름으로 불러옴
colors = np.where(nex8["sex"]=='m','r','b') # 'sex' 열의 값이 'm'이면 'r', 아니면 'b'로 색상 지정
colors # 생성된 색상 배열 확인
# Out[122]: array(['r', 'b', 'r', 'b', 'r', 'r', 'b', 'r', 'b', 'r'], dtype='<U1')
plt.scatter(nex8.age, nex8.salary, c=colors) # 이전에 실행한 색상 구분 산점도
mage = nex8.age[nex8.sex == 'm'] # 성별이 'm'인 데이터의 'age' 선택
fage = nex8.age[nex8.sex == 'f'] # 성별이 'f'인 데이터의 'age' 선택
msalary = nex8.salary[nex8.sex == 'm'] # 성별이 'm'인 데이터의 'salary' 선택
fsalary = nex8.salary[nex8.sex == 'f'] # 성별이 'f'인 데이터의 'salary' 선택
plt.figure() # 새로운 그림(figure) 영역 생성 (이전 그래프와 분리)
plt.scatter(mage, msalary, marker = "x", color="r", label='Male') # 남성 데이터 산점도 (마커 'x', 색상 빨강, 레이블 'Male')
plt.scatter(fage, fsalary, marker = "o", color="b", label='Female') # 여성 데이터 산점도 (마커 'o', 색상 파랑, 레이블 'Female')
plt.legend() # 범례 표시
plt.show() # 그래프 출력
연습 문제
파이썬에서 csv 텍스트 파일을 읽기 위한 명령 ( )는 ?
1 2
import pandas as pd nex8 = ( )("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0)
a.
pd.read_csv
다음 출력 결과와 같이 데이터 객체 nex8의 각 변수의 기술 통계량 을 구하고자 한다. ( ) 명령은 ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
nex8.head(3) # Out: # id sex age edu salary # # 0 1 1 21 2 150 # # 1 2 2 22 1 100 # # 2 3 1 33 2 200 # ( ) # Out: # sex age edu salary # count 10.000000 10.000000 10.000000 10.000000 # mean 1.400000 34.800000 2.200000 243.000000 # std 0.516398 10.347302 0.788811 98.211789 # min 1.000000 21.000000 1.000000 100.000000 # 25% 1.000000 29.000000 2.000000 177.500000 # 50% 1.000000 33.000000 2.000000 220.000000 # 75% 2.000000 40.500000 3.000000 297.500000 # max 2.000000 55.000000 3.000000 410.000000
a.
nex8.describe()
파이썬에서 엑셀 파일을 읽기 위한 명령 ( )는 ?
1 2
import pandas as pd nex8 = # ( )("c:/data/dataintro/nex8-1.xlsx, header=0)
a.
pd.read_excel
파이썬에서 nex8.head( ) 의 결과가 다음과 같다. 여기서 변수 id를 제거하고 나머지 변수를 가져오기 위한 명령 ( )은 ?
1 2 3 4 5 6 7 8 9 10 11
nex8.head(2) # Out: # id sex age edu salary # 0 1 1 21 2 150 # 1 2 2 22 1 100 nex8 = ( ) nex8.head(2) # Out: # sex age edu salary # 0 1 21 2 150 # 1 2 22 1 100
a.
nex8.iloc[:, 1:]
변수 edu 의 막대 그림을 그리고자 한다. ( ) 안의 명령은 ?
1 2 3 4 5 6 7 8 9
nex8.head(3) # Out: # id sex age edu salary # 0 1 1 21 2 150 # 1 2 2 22 1 100 # 2 3 1 33 2 200 edu_freq = pd.crosstab(index=nex8["edu"], columns="count") import matplotlib.pyplot as plt # ( )(edu_freq.index, edu_freq["count"] )
a.
plt.bar