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 학원 강의 ]


출처 : 위키독스 (https://wikidocs.net/92083)

 

1.  선 그래프

 

🚀  연속적으로 변하는 데이터를 시각화할 때 사용
🚀  일반적으로 선 그래프는 시간에 따라 데이터의 연속적인 변화량을 관찰할 때 자주 사용
       ⚡️  예를 들어 시간에 따른 온도 변화량, 수출액 변화량, 교통 사고량 등을 시각화 할 때 유용하게 사용
🚀  선 그래프는 수량을 점으로 표시하면서 선으로 이어 그리기 때문에 증가와 감소 상태를 쉽게 확인할 수 있음

    📌  선 그래프는 plot()에 x축, y축 데이터를 선택하여 출력
    📌  x축에 시간 변수를 지정하여 시간 변화량을 나타내는 시계열 데이터를 표현하는 그래프에도 많이 사용

# 2001년 ~ 2019년까지의 미세먼지 데이터 'fine_dust.xlsx'를 이용하여 선 그래프로 표현.

import pandas as pd
import matplotlib.pyplot as plt

# 1) 2019년 데이터 읽기
data = pd.read_excel('../input/fine_dust.xlsx', index_col='area')
data

출력 결과

# 2019 데이터 가져오기
data2019 = data[2019]
data2019.head()

'''
area
Seoul       42.0
Gyeonggi    46.0
Incheon     43.0
Busan       36.0
Daegu       39.0
Name: 2019, dtype: float64
'''
# 2) 2019년 지역별 미세먼지 선 그래프
plt.figure(figsize=(15, 4))
plt.plot(data2019, color='b', marker='o')  # 파란색 선과 원형 마커 지정
plt.title('2019 Fine Dust Line Graph')  # 제목 설정
plt.xlabel('area')  # x축 명칭
plt.ylabel('micrometer')  # y축 명칭
plt.grid()  # 격자 표시
plt.show()

출력 결과

 

# 3) 2016 ~ 2019년 미세먼지 선 그래프
# 2016년 데이터를 가져와 chartdata에 저장하고 마커 및 이름을 지정하는 과정을 2019년까지 반복.
plt.figure(figsize=(15, 4))
for year in range(2016, 2020):
    plt.plot(data[year], marker='o', label=year)
plt.title('2016~2019 Fine Dust Line Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.legend()
plt.grid()
plt.show()

출력 결과

 

 

 

 

 

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


 

1.  컬럼(변수) 삭제 및 생성

# 엑셀 파일 dust1.xlxs 파일을 불러와서 데이터프레임을 생성
import pandas as pd

dust = pd.read_excel('../input/dust1.xlsx')
dust.head()

출력 결과


👩🏻‍🚀  삭제 : drop() 

# 데이터 분석에 필요없는 '지역', '망', '측정소 코드' 컬럼을 삭제하고 특정 값으로 새로운 컬럼을 생성.

dust = dust.drop(['지역', '망', '측정소코드'], axis=1)
# axis의 기본값이 axis=0 으로 행 삭제가 됨. 컬럼을 삭제하기 위해서는 axis=1을 반드시 사용.
dust.head()

출력 결과


 

👩🏻‍🚀  생성  : df['새로운 컬럼명'] = '값'

# 새로운 컬럼 생성
dust['city'] = '서울'
dust.head()

출력 결과

 


 

2. 컬럼 이름 변경

# 전체 변수 이름을 재설정
DataFrame.columns=['새이름1', '새이름2',...]

# 원하는 변수이름만 수정
DataFrame.rename(columns={'기존이름':'새이름'}, inplace=True)

 

dust.rename(columns={'측정소명': 'name', '측정일시': 'date', '주소': 'addr'}, inplace=True)
dust.columns

'''
Index(['name', 'date', 'SO2', 'CO', 'O3', 'NO2', 'PM10', 'PM25', 'addr',
       'city'],
      dtype='object')
'''

 


 

3. 데이터 형변환

dust.dtypes

'''
name     object
date      int64
SO2     float64
CO      float64
O3      float64
NO2     float64
PM10      int64
PM25      int64
addr     object
city     object
dtype: object
'''

 

  📍 date 컬럼이 숫자형(int)로 저장되어 있음
         ▶️ 숫자 형식은 문자 형식으로 변환
  📍 astype(str) : 숫자 ➡️ 문자열 형식으로 변환
  📍 astype(int) : 문자열 ➡️ 숫자 형식으로 변환

 

# 숫자 int 형을 문자열로 변환
dust['date'] = dust['date'].astype(str)
dust['date'] = dust['date'].str.slice(0, 8)
dust.head()

출력 결과


  📍  pd.to_datetime()

# 문자 형식을 날짜형으로 변환
dust['date'] = pd.to_datetime(dust['date'])
dust.dtypes
'''
name            object
date    datetime64[ns]
...
'''

 


  📍 Series.dt.형식

# 날짜 형식 활용 : Series.dt.형식
dust['year'] = dust['date'].dt.year
dust['month'] = dust['date'].dt.month
dust['day'] = dust['date'].dt.day
dust.head()

출력 결과

 


 

4. 데이터 병합

👩🏻‍🚀   merge() 함수는 두 데이터프레임을 각 데이터에 존재하는 고유값(key)을 기준으로 병합할 때 사용

 pd.merge(df_left, df_right, how='inner', on=None)


  📍  기본 값은 on=None이므로 두 데이터의 공동 열이름(id)를 기준으로 inner(교집합) 조인을 하게 됨
  📍  outer 옵션을 줘서 id를 기준으로 합치되, 어느 한 쪽이라도 데이터가 없는 경우 Nan 값이 지정 됨

# 병합할 원본 데이터 확인
s1 = pd.read_excel('../input/nation.xlsx')
s1.head()

출력 결과

s2 = pd.read_excel('../input/code.xlsx')
s2.head()

출력 결과

 

# 데이터 병합 : 공통 컬럼을 기준
pd.merge(s1, s2, on='국적코드')

병합 결과

 


5. 데이터 그룹핑

👩🏻‍🚀  데이터 그룹핑은 데이터를 특정한 값에 기반해 묶는 기능으로 groupby()를 사용하여 통계량을 요약할 수 있음
👩🏻‍🚀  통계량에 관계된 메서드에는 mean(평균), std(표준편차), var(분산), max(최대값), min(최소값) 등이 있음

 

1)  한 열을 기준으로 그룹화 하기

import pandas as pd

s1 = pd.read_excel('../input/nation.xlsx')
s1

출력 결과

s1.groupby('국적코드').sum()
# 국적코드를 그룹별로 합친다. (숫자 뿐만 아니라 문자열도 합침)

출력 결과

 

s1.groupby('성별').sum()
# 성별로 나누어 다른 항목을 합친다.

출력 결과


 

2)  여러 열을 기준으로 그룹화하기

s1.groupby(['국적코드', '성별']).sum()

 

출력 결과

 

 

 

 

 

 

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


 

1. 결측 데이터 처리

👩🏻‍🚀  판다스는 누락된 데이터를 표시할 때 NaN (Not a Number)로 표기하며, 연산에는 표함되지 않음

 

 

1) 결측 데이터 확인

 

✏️  isna() 메서드는 값이 NaN일 때 True, 아닌 경우엔 False 반환

✏️  isnull() 메서드는 결측 데이터이면 True 반환, 유효한 데이터가 존재하면 False를 반환
      ⚡️  isna(), isnull()은 기능적으로 동일

import pandas as pd

df = pd.read_csv('../input/weather.csv', index_col='date')
# 두 개다 결과가 같다.
df['max_wind'].isna()
df['max_wind'].isnull()

'''
출력 결과)
2010-08-01,False
2010-08-02,False
2010-08-03,False
2010-08-04,False
2010-08-05,False
2010-08-06,False
2010-08-07,False
2010-08-08,False
2010-08-09,False
2010-08-10,False
'''

 


 

①  결측 데이터 개수 확인

df.isnull().sum()

'''
temp         0
max_wind     4
mean_wind    6
dtype: int64
'''
df.isnull().value_counts()

'''
temp   max_wind  mean_wind
False  False     False        3646
                 True            3
       True      True            3
                 False           1
Name: count, dtype: int64
'''

 

✏️  notnull()은 유효한 데이터가 존재하면 True를 반환, 결측 데이터면 False를 반환

df.notnull().sum()

'''
temp         3653
max_wind     3649
mean_wind    3647
dtype: int64
'''

 


 

2) 결측 데이터 삭제

 

✏️  결측 데이터를 다루는 가장 간단한 방법은 결측 데이터를 가진 행이나 열을 삭제
✏️  판다스에서 dropna()를 이용하여 삭제 할 수 있다.

✏️  행 데이터 중 어느 한 변수에도 결측치가 있는 경우 삭제되므로 향후 제거한 데이터프레임을 사용하려면 다른 이름으로 저장해야 함

 DataFrame.dropna(axis, how, thresh, subset, inplace)

 

 

  📍 axis : 축을 행 또는 열로 결정
         ➡️  0 또는 'index'이면 누락된 값이 포함된 행을 삭제
         ➡️  1 또는 'columns'이면 누락된 값이 포함된 열을 삭제
         ➡️  기본값은 0
  📍 how any는 null 값이 있는 경우 행 또는 열을 삭제
                    all은 모든 값이 누락된 경우 행 또는 열을 삭제
                    기본값은 any
  📍 inplace : 데이터프레임에 나온 값을 저장할 것인지를 설정하는 변수로 기본적으로 값은 False

 

# 결측 데이터가 있는 행 삭제 후 확인
df2 = df.dropna()  # 옵션을 지정하지 않아서 행기준, NaN가 하나라도 있는 경우에 삭제.
df2.isnull().sum()

'''
temp         0
max_wind     0
mean_wind    0
dtype: int64
'''

 

# 원본 데이터는 변경 x
df.isnull().sum()
'''
temp         0
max_wind     4
mean_wind    6
dtype: int64
'''

 


 

3)  결측 데이터 대체

 

✏️  fillna() : 결측 데이터를 특정 값으로 채움. inplace를 True로 설정해 원본 데이터를 수정

# 결측 데이터 대체하기 : 평균값으로 대체
df['max_wind'].fillna(df['max_wind'].mean(), inplace=True)
df['mean_wind'].fillna(df['mean_wind'].mean(), inplace=True)

# 결측 데이터 대체 후 확인
df.isna().sum()
'''
temp         0
max_wind     0
mean_wind    0
dtype: int64
'''

 

 

 

 

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


 

1.  데이터 선택

1) 열 선택하기

 

👩🏻‍🚀  df['컬럼명'] = df.컬럼명

       ⚡️ 단, 이 방법을 사용하려면 열 이름이 숫자로 시작하지 않고 공백이나 특수 문자 등을 포함하지 않는 등의 조건을 만족해야 함
👩🏻‍🚀  iloc() 및 loc() 메서드를 사용하여 여러 열을 선택할 수도 있음

👩🏻‍🚀  DataFrame의 하나의 열을 선택하면 하나의 Series로 결과 추출

 

a. 단일 컬럼 선택

# 단일 컬럼 선택하기
df = pd.read_csv('../input/weather.csv')
df['temp'] 
# df.temp와 같다

'''
출력 결과)
0       28.7
1       25.2
2       22.1
3       25.3
4       27.2
        ... 
3648    22.1
3649    21.9
3650    21.6
3651    22.9
3652    25.7
Name: temp, Length: 3653, dtype: float64
'''

 

b. 여러 컬럼 선택

# 추출할 열 이름을 리스트에 저장한 다음 []에 전달하면 여러 열을 선택할 수 있음.
df[['date', 'temp']]
# 열 이름을 사용하여 열을 선택하려는 경우 loc를 사용
# df.loc[행 인덱싱 값, 열 인덱싱 값]
df.loc[:, ['date', 'temp']]
# 열 인덱스를 사용하여 추출
# df.iloc[행 인덱스, 열 인덱스]
df.iloc[:, [0,1]]

 

  📌  세 방법 모두 같은 결과 추출

 


 

2) 행 선택하기 

👩🏻‍🚀  인덱스 숫자를 사용하면 행을 슬라이싱할 수 있음

df[0:3]

출력 결과

 


 

3)  레이블로 선택하기  df.loc

 

# 특정 날짜에 해당하는 열을 인덱스 열로 지정
df.index = df['date']
df

출력 결과

 

df.loc['2010-08-01', ['temp', 'mean_wind']]

'''
출력결과)
temp         28.7
mean_wind     3.4
Name: 2010-08-01, dtype: object
'''

 

4)  위치로 선택하기  df.iloc

 

👩🏻‍🚀  iloc[n]과 같이 정수를 입력하면 해당 행을 선택

# 숫자 3은 (위에서 0부터 시작) 4번째 행이라는 뜻.
df.iloc[3]

'''
처리 결과)
date         2010-08-04
temp               25.3
max_wind            6.6
mean_wind           4.2
Name: 2010-08-04, dtype: object
'''
# 특정 행과 열 선택 : 슬라이싱
df.iloc[1:3, 0:2]
# 1~2 행과 0~1열

 

📌  맨 앞의 열은 인덱싱 열이라 해당 x

 

 

 

 


 

5)  불 인덱싱

 

👩🏻‍🚀  하나의 열의 값을 기준으로 데이터를 선택할 수 있음
👩🏻‍🚀  df[df.A > 0]은 df로 부터 A열이 0보다 큰 데이터를 보여줌

 

# 조건에 맞는 데이터를 추출
w = df['temp'] > 30
w

'''
출력 결과)
date
2010-08-01    False
2010-08-02    False
2010-08-03    False
2010-08-04    False
2010-08-05    False
              ...  
2020-07-27    False
2020-07-28    False
2020-07-29    False
2020-07-30    False
2020-07-31    False
Name: temp, Length: 3653, dtype: bool
'''

 

df[w]

출력 결과

 

 

📌  기온이 30도 이상인 데이터만 추출

 

 

 

 


# 최고로 더웠던 날의 모든 정보를 추출
w = df['temp'] == df['temp'].max()
df[w]
# df[df['temp'] == df['temp'].max()]로 써도 된다.


# 조건이 2개 이상인 경우
# 기온이 30도 이상이고, 최대 풍속이 9이상인 데이터
w = (df['temp'] >= 30) & (df['max_wind'] >= 9)
df[w]


 

1.  데이터 파일 저장

DataFrame_data.to_csv(file_name [, options])

 

🚀  to_csv()을 이용하면 DataFrame 형식의 데이터를 텍스트 파일로 저장

🚀  file_name은 텍스트 파일 이름으로 경로를 포함할 수 있음
🚀  선택사항인 options에는 구분자와 문자의 인코딩 방식 등을 지정

       ⚡️ 지정하지 않으면 구분자는 콤마가 되고, 문자의 인코딩 방식은 'utf-8'이 됨

 

# 네 명의 몸무게 Weight와 키 Height 데이터를 DataFrame 형식으로 생성.
df_WH = pd.DataFrame({'Weight': [62, 67, 55, 74],
                      'Height': [165, 177, 160, 180]},
                      index=['ID_1', 'ID_2', 'ID_3', 'ID_4'])
df_WH

df_WH 출력 결과

# index명 지정하는 경우
df_WH.index.name = 'User'
df_WH

df_WH 출력 결과

 


 📌  텍스트 파일 사용 예시

file_name = '../output/save_DataFrame_cp949.txt'
df_pr.to_csv(file_name, sep=' ', encoding='cp949')

 

2. 데이터 확인

1) DataFrame 만들기

import pandas as pd

# csv 파일 불러오기

df = pd.read_csv('../input/weather.csv')
print(df)

출력 결과


 

2) df.shape

 

👾  shape 속성을 이용하면 데이터의 (행, 열) 크기를 확인할 수 있음

df.shape
# 출력 결과 : (3653, 4)

df.shape[0]
# 출력 결과 : 3653

 


 

3) df.info()

 

👾  info()메서드는 데이터에 대한 전반적인 정보를 나타냄
👾  df를 구성하는 행과 열의 크기, 컬럼명, 컬럼을 구성하는 값의 자료형을 출력해 줌

df.info()

'''
출력 결과)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3653 entries, 0 to 3652
Data columns (total 4 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   date       3653 non-null   object 
 1   temp       3653 non-null   float64
 2   max_wind   3649 non-null   float64
 3   mean_wind  3647 non-null   float64
dtypes: float64(3), object(1)
memory usage: 114.3+ KB
'''

 

  📌  데이터 개수 n=3653 entry, 행 인덱스 번호 0 to 3652
  📌  열 변수 출력 형식 : 실수 float, 문자열 object
  📌  결측치 개수가 나타남 : max_wind, mean_wind 변수에 결측치가 있음 (= 값이 없는 칸이 존재 )

 


 

4) df.head() / df.tail()

 

👾  데이터를 잘 불러 왔는지 확인하기 위해 앞 부분(head)과 마지막 부분(tail)을 확인
👾  head()는 상위 5개 행을 출력하고, tail()은 하위 5개 행을 출력
👾 괄호() 안에 원하는 숫자를 넣으면 그 숫자만큼 행을 출력

# 상위 5행
df.head(5)

출력 결과

# 하위 n행 살펴보기
df.tail()

출력 결과

 


 

5) df.index, df.columns

 

👾  인덱스(행 이름)과 열의 레이블(칼럼 이름)을 출력할 때 사용

# 인덱스 출력
df.index
# 데이터프레임의 인덱스(행 이름)을 반환. 인덱스를 따로 지정하지 않았기 때문에 0부터 시작하는 인덱스가 부여.
# 출력 결과 : RangeIndex(start=0, stop=3653, step=1)
# 컬럼 출력
df.columns
# 출력 결과: Index(['date', 'temp', 'max_wind', 'mean_wind'], dtype='object')

  

 📌  해당 데이터프레임을 구성하는 컬럼명을 확인할 수 있음
 📌  컬럼명을 변경할 때도 유용하게 사용

 


 

6) df.describe()

 

👾  데이터의 컬럼별 요약 통계량을 나타냄
👾  mean(), max() 등 개별 함수를 사용하여 통계량을 계산 할 수 있음

# 요약 통계량 확인하기.
df.describe()

출력 결과


 

7) df.sort_values()

 

👾  데이터를 크기 순으로 정렬

# 형식
DataFrame.sort_values(by=['정렬변수1', '정렬변수2'...], ascending=True, inplace=False


  📌  by=[] : by=을 사용하지 않아도 됨
  📌  ascending=True : True가 기본 값이고 오름차순 정렬. 내림차순 정렬일 경우에는 False 사용.
  📌  inplace=False : True 이면 정렬 결과가 동일 데이터프레임 이름으로 저장. 기본 값은 False.

 

# 최대 풍속 max_wind 컬럼의 값의 크기에 따라 오름차순 정렬
df.sort_values(['max_wind'])

출력 결과

# 최대 풍속 max_wind 컬럼의 값의 크기에 따라 내림차순 정렬
df.sort_values(by=['max_wind'], ascending=False)

출력 결과

 


 

8) df.value_counts()

 

👾  범주형 변수의 빈도분석 결과를 출력, 즉 어떤 컬럼의 unique value(고유값)들의 개수를 구함

bank = pd.read_csv('../input/bank.csv')

# 빈도 분석 출력하기
bank['job'].value_counts()

'''
출력 결과)
job
management       1560
blue-collar      1499
technician       1206
admin.            834
services          661
retired           351
self-employed     256
entrepreneur      239
unemployed        223
housemaid         208
student           153
Name: count, dtype: int64
'''
bank['job'].value_counts(ascending=True)
# -> 위의 결과를 오름차순으로 정렬

 


 

9) df.unique()

 

👾  데이터가 무엇으로 구성되어 있는지 보고 싶을 때 사용. 열의 고유값을 볼 수 있음

# column의 고유값 출력하기
bank['job'].unique()

'''
출력 결과)
array(['management', 'technician', 'blue-collar', 'retired', 'services',
       'admin.', 'entrepreneur', 'self-employed', 'unemployed', 'student',
       nan, 'housemaid'], dtype=object)
'''

 

 

 

 

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

+ Recent posts