1.  한국 복지패널 데이터 분석

 

🐬  분석은 2단계로 진행

< 1단계 : 변수 검토 및 전처리 >

   -  분석에 활용할 변수를 전처리
   -  변수의 특징을 파악하고 이상치와 결측치를 정제한 다음, 변수의 값을 다루기 편하게 바꿈
   -  전처리는 분석에 활용할 변수 각각 진행.

< 2단계 : 변수 간 관계 분석 >
   -  전처리를 완료하면 본격적으로 변수 간 관계를 파악하는 분석을 함
   -  데이터를 요약한 표와 데이터의 특징을 쉽게 이해할 수 있는 그래프를 만든 다음 분석 결과를 해석

 

1) 데이터 준비하기

 

📌  Koweps_hpwc14_2019_beta2.sav : 2020년에 발간된 복지패널 데이터로 6,331가구, 14,418명의 정보를 담고 있음


2) 패키지 설치 및 로드하기


📌  데이터 파일은 통계 분석 소프트웨어인 SPSS 전용파일
📌  pyreadstat 패키지를 설치하면 pandas 패키지의 함수를 이용해 SPSS, SAS, STATA 등 다양한 통계 분석 소프트웨어의 데이터 파일을 불러올 수 있다.

pip install pyreadstat

 

3) 데이터 불러오기

 

👾  데이터 원본은 복구할 상황을 대비해 그대로 두고 복사본을 만들어 분석에 활용

import pandas as pd
import numpy as np
import seaborn as sns
import pyreadstat

raw_welfare = pd.read_spss('../input/Koweps_hpwc14_2019_beta2.sav')

# 복사본 만들기
welfare = raw_welfare.copy()

 

4) 데이터 검토


👾  데이터의 구조와 특징을 파악

# 앞부분, 뒷부분 출력
welfare.head()  

# 행, 열 개수 출력
welfare.shape  # (14418, 830)

# 변수 속성 출력
welfare.info()  
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 14418 entries, 0 to 14417
Columns: 830 entries, h14_id to h14_pers_income5
dtypes: float64(826), object(4)
memory usage: 91.3+ MB
'''

# 요약 통계량
welfare.describe()



5) 변수명 바꾸기

 

👾  복지패널 데이터와 같은 대규모 데이터는 변수의 수가 많고 변수명이 코드로 되어 있어 전체 구조를 한 눈에 파악하기 어려움
👾  규모가 큰 데이터는 데이터 전체를 한 번에 파악하기보다 변수명을 쉬운 단어로 바꾼 다음 분석에 사용할 변수를 살펴봐야 함

   ⚡️  규모가 큰 조사 자료는 데이터의 특징을 설명해 놓은 코드북 codebook을 함께 제공
   ⚡️  코드북에는 코드로 된 변수명과 값의 의미가 설명되어 있음
   ⚡️  코드북을 보면 데이터의 특징이 어떠한지 감을 잡을 수 있고, 분석에 어떤 변수를 활용할지, 분석 방향의 아이디어를 얻을 수 있음
   ⚡️  코드북의 파일명은 Koweps_Codebook_2019.xlsx

 

# 코드북을 참고해 분석에 사용할 변수 7개의 이름을 알기 쉬운 단어로 바꿈.
welfare = welfare.rename(columns={'h14_g3': 'sex',  # 성별
                                  'h14_g4': 'birth',  # 태어난 연도
                                  'h14_g10': 'marriage_type',  # 혼인 상태
                                  'h14_g11': 'religion',  # 종교
                                  'p1402_8aq1': 'income',  # 월급
                                  'h14_eco9': 'code_job',  # 직업 코드
                                  'h14_reg7': 'code_region'})  # 지역 코드
welfare.columns
'''
Index(['h14_id', 'h14_ind', 'h14_sn', 'h14_merkey', 'h_new', 'h14_cobf',
       'p14_wsc', 'p14_wsl', 'p14_wgc', 'p14_wgl',
       ...
       'wc14_64', 'wc14_65', 'wc14_5aq4', 'wc14_5aq5', 'wc14_5aq6',
       'h14_pers_income1', 'h14_pers_income2', 'h14_pers_income3',
       'h14_pers_income4', 'h14_pers_income5'],
      dtype='object', length=830)
'''

 

6) 복사본 저장

welfare.to_csv('../output/Koweps_hpwc14_2019_beta2_step_01.csv', mode='w', index=False)

 

2.   성별에 따른 월급 차이  - 성별에 따라 월급이 다를까?

< 분석 절차 >

    ·  1단계 : 변수 검토 및 전처리
                    성별 / 월급
    ·  2단계 : 변수 간 관계 분석
                     성별 월급 평균표 만들기 / 그래프 만들기

 

1) 성별 변수 검토 및 전처리하기

a. 변수 검토하기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

welfare = pd.read_csv ('../output/Koweps_hpwc14_2019_beta2_step_01.csv')
welfare.head()

# sex 성별 변수의 타입을 파악
welfare['sex'].dtypes # dtype('float64')

# value_counts()를 이용해 각 범주마다 몇 명이 있는지 알아봄
welfare['sex'].value_counts() 
'''
sex
2.0    7913
1.0    6505
Name: count, dtype: int64
'''

 


 

b.  전처리하기


   ·  코드북을 보면 성별 변수의 값이 1이면 남자, 2면 여자를 의미.  모른다고 답하거나 응답하지 않으면 9로 입력
   ·  이 정보를 바탕으로 데이터에 이상치가 있는지 검토하고, 분석할 때 제거하기 편하도록 NaN을 부여해 결측치 처리
        ➡️  즉 값이 9인 경우 성별을 알 수 없어 분석에서 제외해야 하므로 결측 처리

 

# 이상치 확인
welfare['sex'].value_counts()
# 1, 2만 있고 9나 다른 값이 없으니 이상치를 결측 처리하는 절차를 건너뛰어도 됨
# 만일 이상치가 있으면 이상치를 결측 처리한 후에 다음 결측치 확인

 

# 이상치 결측 처리
# sex 열에서 9인 값을 NaN으로 변경
welfare['sex'] = np.where(welfare['sex'] == 9, np.nan, welfare['sex'])
-> '9'인 값이 존재하면 np.nan 값이 들어가게 되고, 아니면 원래 값이 들어가게 됨

# 결측치 확인
welfare['sex'].isna().sum() # 0

 

  💡  np.where(condition, T, F) : 조건에 해당하는 값이면 'T', 해당하지 않는 값이면 'F' 가 기입되게 된다.

 

# 성별이 1, 2로 되어 있어, 값의 의미를 이해하기 쉽도록 문자 male과 female로 변경
# 변경 후 잘 반영이 되었는지 value_counts()와 countplot()을 이용해 
# 바꾼 값이 잘 반영이 됐는지 출력 결과를 확인

# 성별 항목 이름 부여
welfare['sex'] = np.where(welfare['sex'] == 1, 'male', 'female')
#-> 1이면 male, 아니면 female 기입되게 된다.

welfare['sex'].value_counts()
'''
sex
female    7913
male      6505
Name: count, dtype: int64
'''

 

# 빈도 막대 그래프 만들기
sns.countplot(data=welfare, x='sex')
plt.show()

출력 결과

 


 

3. 월급 변수 검토 및 전처리하기

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

welfare = pd.read_csv('../output/Koweps_hpwc14_2019_beta2_step_02.csv')
welfare['sex'].head()
'''
0    female
1      male
2      male
3      male
4    female
Name: sex, dtype: object
'''

 


 

1) 변수 검토하기 

 

📍  코드북을 보면 월급은 '일한 달의 평균 임금'을 의미하며 1만원 단위로 기록
         ▶️  변수 이름은 income
📍  성별은 범주 변수이므로 df.value_counts()를 이용해 범주별 빈도를 확인하면 특징을 파악할 수 있음
📍  월급은 연속 변수이므로 df.value_acount()을 이용하면 너무 많은 항목이 출력되어 알아보기 어려움

welfare['income'].dtypes  # dtype('float64')
# 요약 통계량 구하기
welfare['income'].describe()  

'''
count    4534.000000
mean      268.455007
std       198.021206
min         0.000000
25%       150.000000
50%       220.000000
75%       345.750000
max      1892.000000
Name: income, dtype: float64
'''

 

  ✏️  출력 결과를 보면 float64 타입이고, 0~1892만원의 값을 지님
  ✏️  150~345 만원에 가장 많이 분포하고 평균은 268만원, 중앙값은 평균보다 작은 220만원으로 전반적으로 낮은 쪽에 치우침  

          ➡️  월급이 평균값보다 낮은 사람이 50% 이상

 

# 히스토그램을 만들어 분포를 확인
sns.histplot(data=welfare, x='income')  # 히스토그램 만들기
plt.show()

 


 

2)  전처리 하기

 

📍  코드북을 보면 월급은 만원 단위로 되어 있고, '모름/무응답'은 9999

welfare['income'].describe()  # 이상치 확인
welfare['income'].isna().sum()  # # 결측치 확인 14418 - 4534 = 9884
# 9884

 

  ✏️   출력 결과를 보면 최소값은 0 ~ 1,892이고 결측치 9,884개가 있음
           ▶️ 즉 9999가 입력된 데이터는 없음

# 이상치 결측 처리
welfare['income'] = np.where(welfare['income'] == 9999, np.nan, welfare['income'])

# 결측치 확인
print(welfare['income'].isna().sum())
# 9884

 


 

4. 성별에 따른 월급 차이 분석

 

1) 성별 월급 평균표 만들기

📍 income 결측치 제거 : dropna(subset=['income'])
📍 sex별 분리 : groupby('sex', as_index=False)
📍 income 평균 구하기 : agg(mean_income=('income', 'mean')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

welfare = pd.read_csv('../output/Koweps_hpwc14_2019_beta2_step_02.csv')

sex_income = welfare.dropna(subset=['income'])
sex_income = sex_income.groupby('sex', as_index=False)
sex_income = sex_income.agg(mean_income=('income', 'mean'))

sex_income

'''
      sex  mean_income
0  female   186.293096
1    male   349.037571
'''

 

  ✏️  평균 남자 월급은 349만원, 여자 월급은 186만원으로, 남성이 여성보다 약 163만원이 많음


 

2) 그래프 만들기


📍  분석 결과를 쉽게 이해할 수 있도록 성별 월급 평균표를 이용해 막대 그래프로 만듦

# 막대 그래프 만들기
sns.barplot(data=sex_income, x='sex', y='mean_income')
plt.show()

 


 

5.  나이와 월급의 관계 - 몇 살 때 월급을 가장 많이 받을까?

< 분석 절차 >
  ·  1단계 :  변수 검토 및 전처리
                      나이 / 월급
   ·  2단계 :  변수 간 관계 분석
                        나이에 따른 월급 평균표 만들기 / 그래프 만들기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

welfare = pd.read_csv('../output/Koweps_hpwc14_2019_beta2_step_02.csv')
welfare['birth'].head()
'''
0    1945.0
1    1948.0
2    1942.0
3    1962.0
4    1963.0
Name: birth, dtype: float64
'''

 

1)  나이 변수 검토 및 전처리하기

 

a. 변수 검토하기

 

  📍  나이 변수는 없고 태어난 연도 변수만 있음. 따라서 태어난 연도 변수를 기반으로 나이 변수를 만들어야 함

welfare['birth'].dtypes
# dtype('float64')

welfare['birth'].describe()  # 요약 통계량 구하기
'''
count    14418.000000
mean      1969.280205
std         24.402250
min       1907.000000
25%       1948.000000
50%       1968.000000
75%       1990.000000
max       2018.000000
Name: birth, dtype: float64
'''
sns.histplot(data = welfare, x = 'birth')  # 히스토그램 만들기
plt.show()


 

b.  전처리

 

📍 코드북을 보면 태어난 연도는 '모름/무응답'일 경우 9999로 코딩, 이 정보를 바탕으로 전처리

welfare['birth'].describe()  # 이상치 확인
welfare['birth'].isna().sum()  # 결측치 확인
# 0

# 이상치와 결측치가 없으므로 파생변수를 만드는 단계로 넘어감
# 만일 이상치가 발견되면 아래와 같이 전처리한 다음 분석을 진행

# 이상치 결측 처리
welfare['birth'] = np.where(welfare['birth'] == 9999, np.nan, welfare['birth'])

# 결측치 확인
welfare['birth'].isna().sum()  # 0

 

c.  파생변수 만들기 - 나이

 

📍  2019년에 조사가 진행됐으니 2019에서 태어난 연도를 뺀 다음 1을 더해 나이를 구함

📍  df.assign(kwargs) : DataFrame에 새 열을 할당하는 메서드. 

                                               kwargs : 새열이름 = 내용 형식으로 입력되는 키워드. 콤마(,)를 통해 여러개를 입력.

# 나이 변수 만들기
welfare = welfare.assign(age=2019 - welfare['birth'] + 1)

welfare['age'].describe()  # 요약 통계량 구하기
'''
count    14418.000000
mean        50.719795
std         24.402250
min          2.000000
25%         30.000000
50%         52.000000
75%         72.000000
max        113.000000
Name: age, dtype: float64
'''

 

# 히스토그램 만들기
sns.histplot(data=welfare, x='age')

 

# 변경된 자료 저장
welfare.to_csv('../output/Koweps_hpwc14_2019_beta2_step_03.csv', mode='w', index=False)

 


 

6. 나이와 월급의 관계 분석

 

1) 나이에 따른 월급_평균표 만들기


📍  income 결측치 제거 : dropna(subset=['income'])
📍  age별 분리 : groupby('age')
📍  income 평균 구하기 : agg(mean_income=('income', 'mean'))

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

welfare = pd.read_csv('../output/Koweps_hpwc14_2019_beta2_step_03.csv')

age_income = welfare.dropna(subset=['income']).groupby('age').agg(mean_income=('income', 'mean'))
age_income.head()

'''
      mean_income
age              
19.0   162.000000
20.0   121.333333
21.0   136.400000
22.0   123.666667
23.0   179.676471
'''

 


 

2)  그래프 만들기

 

📍  평균표를 이용해 그래프 작성, x축을 나이, y축을 월급으로 지정해 나이에 따른 월급의 변화를 나타낸 선 그래프 만듦

# 선 그래프 만들기
sns.lineplot(data=age_income, x='age', y='mean_income')
plt.show()

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1. 한글 폰트

🍓  그래프에서 한글을 표시하고 싶으면 matplotlib에서 사용하는 폰트를 한글 폰트로 지정해야 함

# 기본 폰트는 아래 방법을 사용해서 알 수 있다
import matplotlib
print(matplotlib.rcParams['font.family'])
# ['sans-serif']
# 폰트를 변경하려면 다음과 같이 수행.
matplotlib.rcParams['font.family'] = '폰트 이름'
matplotlib.rcParams['axes.unicode_minus'] = False


    📍 폰트를 변경하지 않으면 기본 폰트는 'sans-serif'

    📍 matplotlib.rcParams['axes.unicode_minus'] = False  

          ▶️ 한글 폰트를 지정한 후에 그래프에서 마이너스(-) 폰트가 깨지는 문제를 해결해 줌

 

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

# 폰트 변경
matplotlib.rcParams['font.family'] = 'AppleGothic'
matplotlib.rcParams['axes.unicode_minus'] = False

x = np.arange(0, 5, 1)
y1 = x
y2 = x + 1
y3 = x + 2
y4 = x + 3

plt.plot(x, y1, '>-r', x, y2, 's-g', x, y3, 'd:b', x, y4, '-.Xc')
plt.legend(['데이터1', '데이터2', '데이터3', '데이터4'], loc='best')
plt.xlabel('X 축')
plt.ylabel('Y 축')
plt.title('그래프 제목')
plt.grid(True)
plt.show()

출력 결과

 


 

2. 파이 그래프  Pie chart

 

🍓  파이 그래프는 범주별 구성 비율을 원형으로 표현한 그래프
🍓  파이 그래프에서 부채꼴 부분의 크기는 각 항목의 크기에 비례
🍓  전체 데이터에서 각 항목이 차지한 비율을 비교할 때 많이 사용

plt.pie(x [, labels=label_seq, autopct='비율 표시 형식(ex: %0.1f)', 
             shadow=False(기본) 혹은 True, explode=explode_seq, 
             counterClock=True(기본) 혹은 False, startangle=각도 (기본은 0)])

 

    📍 'x' : 배열 확인 시퀀스 형태의 데이터
           ➡️ pie()는 x의 각 요소가 전체에서 차지하는 비율을 계산하고 그 비율에 맞게 부채꼴 크기를 결정해서 파이 그래프를 생성
    📍 'labels' : x 데이터 항목의 수와 같은 문자열 시퀀스(리스트, 튜플)을 지정해 각 부채꼴 이름 지정
    📍 'autopct' : 각 부채꼴 부분의 항목의 비율이 표시되는 숫자의 형식을 지정
           ➡️ 예를 들어 '%0.1f' - 소수점 첫째 자리까지 표시, '%0.0f' - 정수만 표시
           ➡️ '%0.1f%%'  - %를 추가 
    📍 'shadow' : 그림자 효과를 지정. 기본 값은 False
    📍 'explode' : 부채꼴 부분이 원에서 돌출되는 효과. 기본 값은 강조 효과가 없음
    📍 'counterClock' : x 데이터에서 부채꼴 부분이 그려지는 순서가 반시계방향(True)인지 시계방향(False)인지를 지정. 기본값은 True로 반시계 방향
    📍 'startangle' : 제일 처음 부채꼴 부분이 그려지는 각도로 x축을 중심으로 반시계 방향으로 증가. 기본값은 0

 

plt.figure(figsize = (w, h))

 

 

    📍 w와 h는 그래프의 너비 width와 높이 height 를 의미. 단위는 인치 inch.
    📍 값을 지정하지 않으면 (w, h)의 기본값은 (6, 4)
    📍 w와 h를 같은 값으로 지정하면 생성되는 그래프는 가로와 세로의 비율은 1 대 1이 됨

 


import matplotlib
import matplotlib.pyplot as plt

# 한글 폰트 사용
matplotlib.rcParams['font.family'] = 'AppleGothic'
matplotlib.rcParams['axes.unicode_minus'] = False

fruit = ['사과', '바나나', '딸기', '오렌지', '포도']
result = [7, 6, 3, 2, 2]

plt.pie(result)
plt.show()

출력 결과


# 크기를 변경해서 출력
plt.figure(figsize=(7, 7))
plt.pie(result)
plt.show()

출력 결과


# 각 부채꼴 부분에 속하는 데이터의 라벨과 비율을 추가
plt.figure(figsize=(7, 7))
plt.pie(result, labels=fruit, autopct='%.1f%%')
plt.show()

출력 결과


# 각 부채꼴 부분은 x축 기준 각도 0도를 시작으로 반시계 방향으로 그려짐
# x축 기준 각도 90도에서 시작해서 시계방향으로 그리는 예

plt.figure(figsize=(7, 7))
plt.pie(result, labels=fruit, autopct='%.1f%%', startangle=90, counterclock=False)
plt.show()

출력 결과


# 그림자를 추가하고 특정 요소(사과)를 표시한 부채꼴 부분만 강조한 예.
explode_value = (0.1, 0, 0, 0, 0)
# 0.1 : 반지름의 10% 만큼 벗어나도록 설정.

plt.figure(figsize=(7, 7))
plt.pie(result, labels=fruit, autopct='%.1f%%', startangle=90, 
        counterclock=False, explode=explode_value, shadow=True)
plt.show()

출력 결과

 

 

 

[ 내용 참고 : IT학원 강의 및 위키독스 ]


 

1. 히스토그램  Histogram

✏️  히스토그램 histogram은 데이터를 정해진 간격으로 나눈 후 그 간격 안에 들어간 데이터 갯수를 막대로 표시한 그래프

✏️  변수가 하나인 데이터의 빈도수를 막대 모양으로 나타낼 때 사용
✏️  통계분석에서 도수분포표와 히스토그램은 가장 많이 사용되는 도구이고, 데이터의 분석 및 분포를 파악하는 역할

💡 도수 분포표 이해를 위한 용어 
  · 변량 variate : 자료를 측정해 숫자로 표시한 것 (예: 점수, 키, 몸무게, 판매량, 시간 등)

  · 계급 class : 변량을 정해진 간격으로 나눈 구간 (예: 시험 점수를 60 ~ 70, 70 ~ 80, 80 ~ 90, 90 ~ 100 점 구간으로 나눔)
  · 계급의 간격 class width : 계급을 나눈 크기 (예: 위의 시험 점수를 나눈 간격은 10)
  · 도수 frequency : 나눠진 계급에 속하는 변량의 수 (예: 각 계급에서 발생한 수로 3, 5, 7, 4)
  · 도수 분포표 frequency distribution table : 계급에 도수를 표시한 표


📍  어떤 학급에서 수학 시험 결과를 이용해 도수 분포표 만드는 과정


      1. 변량 생성 : 학생 25명의 수학 시험 결과는 다음과 같음.
           ex.  76, 82, 84, 83, 90, 86, 85, 92, 72, 71, 100, 87, 81, 76, 94, 78, 81, 60, 79, 69, 74, 87, 82, 68, 79

      2. 계급 간격 설정 및 계급 생성 : 변량 중 가장 작은 숫자가 60이고 가장 큰 숫자가 100이므로 60에서 일정한 간격

                                                            (여기서는 5로 설정)으로 나누어서 다음과 같은 8개의 계급을 설정
           ex. 60 ~ 65, 65 ~ 70, 70 ~ 75, 75 ~ 80, 80 ~ 85, 85 ~ 90, 90 ~ 95, 95 ~ 100

      3. 계급별 도수 확인 및 분포표 만들기
           각 계급에 몇 개의 변량이 들어있는지 확인해 계급별로 도수를 구함. 이를 이용해 계급별로 도수를 표시한 도구 분포표 생성

           

           계급 (수학점수)                 도수        마크로 도수 표시
           60(이상) ~ 65(미만)        1                      *
           65 ~ 70                              2                     **
           70 ~ 75                              3                     ***
           75 ~ 80                              5                     *****
           80 ~ 85                              6                    ******
           85 ~ 90                              4                    ****
           90 ~ 95                              3                    ***
           95 ~ 100                            1                     *



plt.hist(x, [, bins=bins_s 혹은 'auto'])

 

   📌  x는 변량 데이터
   📌  옵션 bins는 계급의 갯수로 이 개수 만큼 자동으로 계급이 생성
         입력하지 않으면 'auto'가 되고 기본적으로 bins=10 이 됨

 

math = [76, 82, 84, 83, 90, 86, 85, 92, 72, 71, 100, 
        87, 81, 76, 94, 78, 81, 60, 79, 69, 74, 87, 82, 68, 79]
plt.hist(math)
plt.show()


# bins 를 8로 설정
plt.hist(math, bins=8)
plt.show()


 

2. 히스토그램 생성 

# 1) 데이터 읽기
import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('../input/health_screenings_2020.xlsx')
data.head()

 

1)  히스토그램 그리기

# data에서 남성(data.gender==1.0)의 성별, 키 데이터만 가져옴.
man_data = data.loc[data.gender == 1.0, ['gender', 'height']]
man_data.head()

출력 결과

plt.figure(figsize=(10, 6))
# hist() 메서드로 man_data 데이터의 키를 지정하고 계급 개수 20개 등의 속성을 지정.
plt.hist(man_data['height'], bins=20, label='Man')
plt.title('2020 Health Screenings Man Height Histogram')
plt.xlabel('height')
plt.ylabel('frequency')
plt.legend()
plt.grid()
plt.show()

출력 결과

 

📌  hist() 함수의 bins 파라미터는 히스토그램의 가로축 구간의 개수를 지정

 


 

2) 그룹 히스토그램 그리기

 

✏️   그룹 히스토그램을 그리는 것은 기존 히스토그램 위에 히스토그램을 하나 더 그리는 형식

# 남성 및 여성 키 그룹 히스토그램

# data에서 남성(data.gender==1.0)의 성별, 키 데이터만 가져옴.
man_data = data.loc[data.gender == 1.0, ['gender', 'height']]
# data에서 여성(data.gender==2.0)의 성별, 키 데이터만 가져옴
woman_data = data.loc[data.gender == 2.0, ['gender', 'height']]
#%%
plt.figure(figsize=(10, 6))  # 그래프 크기 지정
# hist() 메서드로 데이터의 키를 지정하고 계급 개수 20개 등의 속성을 지정.
plt.hist(man_data['height'], bins=20, alpha=0.5, label='Man')
plt.hist(woman_data['height'], bins=20, alpha=0.5, label='Woman')

plt.title('2020 Health Screenings Man & Woman Height Group Histogram')
plt.xlabel('height')
plt.ylabel('frequency')
plt.xlim(120, 200)
plt.legend()
plt.grid()
plt.show()

출력 결과

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  산점도 그래프

plt.scatter(x,y)

 

👩🏻‍💻  산점도 (Scatter plot)는 두 변수의 상관 관계를 직교 좌표계의 평면에 점으로 표현하는 그래프

👩🏻‍💻  서로 다른 두 연속성 변수 사이의 관계를 나타내며 연속성 변수의 상관성을 확인할 때 산점도 그래프를 사용
👩🏻‍💻  예를 들어 나이와 소득에 대한 상호 관련성 파악 등에 유용하게 사용되는데, 두 변수 간의 상관관계를 개략적으로 파악할 수 있기 때문

👩🏻‍💻  산점도에 표시되는 각 점들은 자료의 관측값을 의미하고, 각 점의 위치는 관측값이 가지는 x축, y축 변수의 값으로 결정

 

    📌  공공데이터포털에서 다운로드한 2020년 건강검진 일부 데이터 health_screenings_2020.xlsx를 이용하여 산점도 그래프를 표현

import pandas as pd
import matplotlib.pyplot as plt

# 1) 데이터 읽기
data = pd.read_excel('../input/health_screenings_2020.xlsx')
data.head()

출력 결과

height_data = df1['height']  # 키 데이터만 가져와 height_data에 저장
weight_data = df1['weight']  # 몸무게 데이터만 가져와 weight_data에 저장
height_data.head()
'''
0    175
1    150
2    155
3    165
4    160
Name: height, dtype: int64
'''
plt.figure(figsize=(10, 4))  # 그래프 크기를 지정
plt.scatter(height_data, weight_data)  # x축 데이터에 height_data, y축 데이터에 weight_data 지정
plt.title('2020 Health Screenings Scatter Graph')
plt.xlabel('height')
plt.ylabel('weight')
plt.show()

출력 결과

 


 

2) 그룹 산점도 그래프

 

✏️  누적 산점도 그래프를 그리는 것은 기존 산점도 그래프 위에 산점도 그래프를 하나 더 그리는 방식

# HDL, LDL, cholesterol 데이터를 가져와 각각의 변수에 저장.
HDL_data = df1['HDL']
LDL_data = df1['LDL']
cholesterol_data = df1['cholesterol']

plt.figure(figsize=(10, 6))  # 그래프 크기 지정

# scatter()에 x축 데이터와 y축 데이터를 지정하고 점 색상과 점 테두리 색상을 지정.
plt.scatter(cholesterol_data, LDL_data, color='r', edgecolor='w', label='Cholesterol*LDL')
plt.scatter(HDL_data, cholesterol_data, color='g', edgecolor='w', label='HDL*Cholesterol')
plt.scatter(HDL_data, LDL_data, color='b', edgecolor='w', label='HDL*LDL')

plt.title('2020 Health Screenings Group Scatter Graph')
# xlim(), ylim()으로 x축 및 y축의 최솟값과 최댓값을 지정
plt.xlim(-50, 500)
plt.ylim(-50, 500)
plt.legend()
plt.show()

출력 결과

 

 

 

 

[ 내용 참고 : IT 학원 강의 및 위키독스 ]


 

1. 막대 그래프

🚀  집단별 차이를 표현할 때 막대 그래프를 주로 사용 
       ⚡️  수량의 많고 적음 비교, 변화된 양에 대한 일별, 월별, 연별 통계 등의 비교
🚀  가독성 면에서 항목의 개수가 적으면 가로 막대가 좋고 항목이 많으면 세로 막대가 보기 편함

 

    📌  막대 그래프는 bar() 함수에 x축, y축 데이터를 지정하여 그림

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('../input/fine_dust.xlsx', index_col='area')
data2016 = data[2016]
data2016.head()
'''
area
Seoul       48.0
Gyeonggi    53.0
Incheon     49.0
Busan       44.0
Daegu       43.0
Name: 2016, dtype: float64
'''

1) 세로 막대

# 2016년 지역별 미세먼지 세로 막대 그래프
plt.figure(figsize=(15, 4))
plt.bar(data2016.index, data2016, color='g')  
# x축에 data2016의 인덱스를, y축 데이터에 data2016 값을 지정
plt.title('2016 Fine Dust Bar Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.ylim(35, 55)  # y축 범위를 35-55 정함
plt.grid()
plt.show()

출력 결과

 


 

2) 그룹 세로 막대 그래프

import numpy as np
index = np.arange(4)
# NumPy의 np.arange() 함수는 주어진 범위와 간격에 따라 균일한 값을 갖는 어레이를 반환

plt.figure(figsize=(15, 4))
df1 = data.loc['Seoul':'Busan', 2016:2019]  
# (행) 서울, 경기, 인천, 부산 지역의 (열) 2016~2019년 데이터만 추출.

for year in range(2016, 2020):
    chart_data = df1[year]  # 연도별로 데이터 가지고 옴.
    plt.bar(index, chart_data, width=0.2, label=str(year))  # 두께 0.2의 막대 그래프를 지정.
    index = index + 0.2   # 출력되는 위치를 0.2씩 이동
    
plt.title('2016 ~ 2019 Fine Dust Group Bar Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.ylim(35, 55)
# x축 눈금을 가운데로 지정하기 위해 막대그래프를 마지막 위치에서 0.5 빼주고, x축 눈금 이름을 지정.
plt.xticks(index - 0.5, ['Seoul', 'Gyeonggi', 'Incheon', 'Busan'])
plt.legend()
plt.show()

 

💡  xticks(), yticks() 함수에 파이썬 리스트 또는 NumPy 어레이를 입력하면 눈금과 숫자 레이블이 표시

 

출력 결과

 


 

3) 그룹 누적 가로 막대 그래프

 

🚀  2016 ~ 2019 지역별 미세먼지 그룹 막대 그래프를 누적하여 가로 방향으로 변경하여 표현
🚀  누적 막대 그래프를 그리는 것은 기존 막대 그래프 위에 막대 그래프를 하나 더 그리는 형식
        ▶️ 이를 위해서는 index의 위치를 변경해야 함
        ▶️ 가로 방향으로 바꾸는 것은 bar() 대신 barh()를 사용하면 됨
        ▶️ 막대 그래프를 가로 방향으로 변경했으므로 x축 및 y축 이름, x축 및 y축 눈금도 가로 방향에 맞게 변경

# 2016 ~ 2019 지역별 미세먼지 그룹 누적 가로 막대 그래프
ndex = np.arange(4)

plt.figure(figsize=(15, 4))
df1 = data.loc['Seoul':'Busan', 2016:2019]  # 서울, 경기, 인천, 부산 지역의 2016~2019년 데이터만 추출.
for year in range(2016, 2020):
    chart_data = df1[year]  # 연도별로 데이터 가지고 옴.
    plt.barh(index, chart_data, label=str(year))  # barh() 사용
    
plt.title('2016~2019 Fine Dust Group Bar Graph')
plt.ylabel('area')
plt.xlabel('micrometer')
plt.xlim(30, 55)
plt.yticks(index, ['Seoul', 'Gyeonggi', 'Incheon', 'Busan'])
plt.legend()
plt.show()

 

출력 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]


 

1.  맷플룻립 Matplotlib 라이브러리

🥑  맷플룻립 라이브러리는 그래프를 그릴 때 가장 많이 사용하는 파이썬 라이브러리 중 하나
🥑  맷플룻립을 활용하면 다양한 유형의 그래프를 간편하게 그릴 수 있음
🥑  시각화할 때 데이터로 리스트나 딕셔너리 자료형도 가능하지만 데이터프레임을 이용하면 새로운 그래프에 적용하는 것이 더 쉽기 때문에 대부분 데이터프레임 자료형을 이용

  ⚡️ matplotlib은 MATLAB(과학 및 공학 연산을 위한 소프트웨어)의 시각화 기능을 모델링해서 만들어짐
  ⚡️ 공식 홈페이지 : https://matplotlib.org/

 

Matplotlib — Visualization with Python

seaborn seaborn is a high level interface for drawing statistical graphics with Matplotlib. It aims to make visualization a central part of exploring and understanding complex datasets. statistical data visualization Cartopy Cartopy is a Python package des

matplotlib.org


 

2. 시각화 옵션

 

1) 제목 지정  title()


🥑  그래프 제목은 title() 메서드를 사용하여 표현
🥑  제목은 기본적으로 영어를 사용하는데, 한글을 사용하려면 별도의 설정을 해야 함

# 제목 지정
import matplotlib.pyplot as plt  # 모듈 import

plt.title('Line Graph')  # 제목 지정
xdata = [2, 4, 6, 8]  # x 축 값 지정
ydata = [1, 3, 5, 7]  # y 축 값 지정
plt.plot(xdata, ydata)
plt.show()

출력 결과

 

 

📍 pyplot.plot() 함수에 리스트(= x축과 y축에 들어갈 값 )를 입력함 

📍 show() 함수는 그래프를 화면에 나타나도록 함

 

 

 

 

 

 

 

 


 

2) 범례

 

🥑  범례란 사용자가 내용을 인지하기 쉽도록 본보기로 표시하는 데 사용

🥑  그래프 범례는 두 개 이상의 데이터를 표현할 때 사용
🥑  범례 추가는 plot()을 활용하여 표현하는 데, plot()의 label 속성값에 원하는 문자열을 작성하고

      그래프를 그리기 전에 legend() 메서드를 실행

# 범례 지정
plt.title('Legend')
data1 = [2, 4, 6, 8]
data2 = [8, 6, 4, 2]
plt.plot(data1, label='asc')
plt.plot(data2, label='desc')
plt.legend()
plt.show()

출력 결과


 

3) 색상 지정

 

🥑  그래프 색상은 plot() 메서드에 color 속성을 추가하여 표현

# 색상 지정
xdata = [2, 4, 6, 8]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata, color='red')
plt.show()

출력 결과

 


 

4) x축 및 y축 이름 지정  

 

🥑  x축 이름은 xlabel()를 사용하고, y축 이름은 ylabel()을 사용하여 표현

# x축 및 y축 이름 지정
xdata = [2, 4, 6, 8]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata)
plt.xlabel('X value')
plt.ylabel('Y value')
plt.show()

출력 결과

 


5) 그래프 선 모양 지정

 

🥑  그래프 선 모양은 plot()의 linestyle 속성을 이용하여 표현
🥑  linestyle 속성으로 실선은 '-', 파선은 '--', 점쇄선 '-.', 점선은 ':' 기호로 지정

# 그래프 선 모양 지정
xdata = [2, 4, 6, 8]
ydata = [8, 6, 4, 2]
plt.plot(data1, color='r', label='dashed', linestyle='--')
plt.plot(data2, color='g', label='dotted', linestyle=':')
plt.legend()
plt.show()

 

출력 결과

 


 

6) 그림 범위 지정  xlim(), ylim()

 

🥑  plot()을 사용하여 그래프를 표현하다 보면 몇몇 점들은 그림의 범위 경계선에 있어서 잘 보이지 않을 때가 있다
🥑  이 때, xlim() 메서드와 ylim() 메서드를 사용하면 그림의 범위를 수동으로 지정할 수 있다.
        ▶️  xlim(x축 최솟값, x축 최댓값), ylim(y축 최솟값, y축 최댓값)
🥑  plot()의 marker 속성을 지정하면 선에 점 모양을 다양하게 변경할 수 있음

# 그림 범위 지정
plt.title('X, Y range')
xdata = [10, 20, 30, 40]
ydata = [1, 3, 5, 7]
plt.plot(xdata, ydata, color='b', linestyle='--', marker='o', markersize='10')
plt.xlim(0, 50)
plt.ylim(-5, 15)
plt.show()

출력 결과

 


 

3. 내장 시각화 옵션

 

👩🏻‍🚀  판다스를 이용하면 시각화 라이브러리를 임포트 하지 않아도 내장 그래프 도구를 이용하여 기본적인 시각화를 할 수 있음
👩🏻‍🚀  plot()의 kind 속성을 지정하면 다양한 종류의 그래프를 표현할 수 있다.

옵션 종류
line 선 그래프
bar 막대 그래프 - 수직
barh 막대 그래프 - 수평
his 히스토그램 그래프
box 박스 그래프
kde 커널 밀도 그래프
area 면적 그래프
pie 원형 그래프
scatter 산점도 그래프
hexbin 고밀도 산점도 그래프
import pandas as pd

my_score = [[60, 90, 95], [80, 75, 100], [65, 85, 90], 
            [85, 70, 90], [95, 90, 85], [75, 85, 90], [85, 80, 75]]
subject = ['kor', 'math', 'eng']
df = pd.DataFrame(my_score, columns=subject)
df

출력 결과

 

from matplotlib import pyplot as plt

df.plot(kind='line')
plt.show()

출력 결과

 

 

 

 

 

 

[ 내용 참고: IT 학원 강의 및 위키독스 ]

+ Recent posts