Home [데이터 정보 처리 입문] 15강 - 파이썬을 활용한 자료 분석 2
Post
Cancel

[데이터 정보 처리 입문] 15강 - 파이썬을 활용한 자료 분석 2

💡해당 게시글은 방송통신대학교 김성수, 이기재 교수님의 '데이터 정보 처리 입문' 강의를 개인 공부 목적으로 메모하였습니다.



학습 개요


  • 파이썬은 객체 지향 프로그래밍 언어로 문법이 쉽고, 확장성이 좋아 데이터 과학 분야에서 R과 더불어 널리 이용되고있는 프로그램 언어임
  • 파이썬을 이용하여 데이터를 읽고, 처리하는 방법을 알아보고, 기술 통계량을 구하는 법, 히스토그램 등 기본적인 통계 그래프를 그리는 방법을 알아봄



학습 목표


  • 파이썬을 이용하여 데이터를 읽을 수 잇음
  • 파이썬을 이용하여 기술 통계 량을 구할 수 있음
  • 파이썬을 이용하여 통계 그래프를 그릴 수 있음



강의록


자료 읽기

자료 파일 (nex8-1.csv, nex8-1.xlsx)

image.png

  • 자료 읽기
  • 기술 통계량 및 빈도표
  • 그래프 그리기

<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) # 분할표를 이용해 겹친 막대그래프 생성

image.png

image.png

image.png

image.png

<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'에 대한 상자 그림 생성
# [그래프 출력됨: 성별에 따른 급여 상자그림]

image.png

image.png

image.png

<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' 산점도에 성별에 따른 색상 적용

image.png

image.png

<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() # 그래프 출력

image.png

image.png



연습 문제


  1. 파이썬에서 csv 텍스트 파일을 읽기 위한 명령 ( )는 ? 

    1
    2
    
     import pandas as pd
     nex8 = (      )("D:/01_KNOU/2025년도 1학기/데이터 정보 처리 입문/dataintro/nex8-1.csv", header=0)
    

    a. pd.read_csv

  2. 다음 출력 결과와 같이 데이터 객체 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()

  3. 파이썬에서 엑셀 파일을 읽기 위한 명령 ( )는 ? 

    1
    2
    
     import pandas as pd
     nex8 = # ( )("c:/data/dataintro/nex8-1.xlsx, header=0)
    

    a. pd.read_excel

  4. 파이썬에서 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:]

  5. 변수 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"] )
    

    image.png

    a. plt.bar

[유비쿼터스 컴퓨팅 개론] 15강 - 인공 지능

[C++ 프로그래밍] 1강 - C++ 언어의 소개