Ex01_육군데이터

박산해·2025년 3월 28일

Ex01_ 육군데이터

학습목표 : 육군신체정보 데이터를 활용해서 Series 연산, 데이터 색인 등의 기초적인 데이터 활용법을 익혀보자!

  • 육군 신체 정보(키, 몸무게)를 활용해서 BMI라는 새로운 정보를 만들어내자! (컬럼추가, 특성확장 등)

Ctrl + Shift + - : 셀 나누기

Shift + m : 셀 병합

  1. 필요한 라이브러리불러오기

import numpy as np # 수치계산 특화
import pandas as pd # 데이터 정제, 조작
import matplotlib.pyplot as plt # 차트

from matplotlib import pyplot as plt

  1. 데이터 불러오기
  • 절대경로 : "/" /Users/smhrd/4. 데이터 분석 기초/data/육군신체측정정보.csv
  • 상대경로
  • "./" : ./data/육군신체측정정보.csv
  • "../" : 상위 디렉토리 지정

data = pd.read_csv("./data/육군신체측정정보.csv", low_memory = False)

Dtype 경고메세지 : column 데이터 타입 문제가 있어서 뜨는 경고

  1. 데이터 확인
  • 결측치 여부, 각 컬럼마다 Dtype은 어떻게 구성되어있는지 파악

data.info()

데이터를 로드하는 경우, 꼭 info()를 사용하길 권장!

1. 결측치 확인 → 결측치가 존재하는 경우, 데이터를 다루는게 불편해짐!

2. Dtype 확인 → BMI 구하기 위해서는 숫자 형태의 데이터가 필요함! Object(문자형)으로 이루어져서 연산이 불가함!

data.head(10) # 상위 10ea 확인

신장, 몸무게 컬럼은 cm, kg과 같은 문자가 있어서 object형으로 load 된 것을 확인!

단위 문자들을 제거, 형변환

  1. 문자 데이터 전처리

문자열 함수

함수사용법설명반환값
replacestr.replace(old, new[, count])문자열에서 old를 new로 대체새 문자열
upperstr.upper()문자열의 모든 문자를 대문자로 변환새 문자열
lowerstr.lower()문자열의 모든 문자를 소문자로 변환새 문자열
stripstr.strip([chars])문자열 양쪽 끝의 공백이나 chars에 지정된 문자 제거새 문자열
lstripstr.lstrip([chars])문자열 왼쪽 끝의 공백이나 chars에 지정된 문자 제거새 문자열
rstripstr.rstrip([chars])문자열 오른쪽 끝의 공백이나 chars에 지정된 문자 제거새 문자열
findstr.find(sub[, start[, end]])부분 문자열 sub이 처음 나타나는 위치 탐색위치 인덱스 또는 -1
rfindstr.rfind(sub[, start[, end]])부분 문자열 sub이 마지막으로 나타나는 위치 탐색위치 인덱스 또는 -1
splitstr.split([sep[, maxsplit]])sep을 기준으로 문자열을 나눔문자열 리스트
rsplitstr.rsplit([sep[, maxsplit]])sep을 기준으로 문자열을 오른쪽에서부터 나눔문자열 리스트
joinstr.join(iterable)iterable의 각 요소를 문자열로 연결새 문자열
countstr.count(sub[, start[, end]])문자열에서 부분 문자열 sub의 출현 횟수 계산정수
indexstr.index(sub[, start[, end]])부분 문자열 sub이 처음 나타나는 위치 탐색(찾지 못하면 예외 발생)위치 인덱스
rindexstr.rindex(sub[, start[, end]])부분 문자열 sub이 마지막으로 나타나는 위치 탐색(찾지 못하면 예외 발생)위치 인덱스
startswithstr.startswith(prefix[, start[, end]])문자열이 지정된 접두어로 시작하는지 여부불리언
endswithstr.endswith(suffix[, start[, end]])문자열이 지정된 접미어로 끝나는지 여부불리언
isdigitstr.isdigit()문자열이 숫자로만 구성되어 있는지 여부불리언
isalphastr.isalpha()문자열이 알파벳 문자로만 구성되어 있는지 여부불리언
isalnumstr.isalnum()문자열이 알파벳 문자와 숫자로만 구성되어 있는지 여부불리언
isspacestr.isspace()문자열이 공백 문자로만 구성되어 있는지 여부불리언
istitlestr.istitle()문자열이 타이틀 케이스(각 단어의 첫 글자가 대문자)인지 여부불리언
capitalizestr.capitalize()문자열의 첫 글자를 대문자로, 나머지는 소문자로 변환새 문자열
titlestr.title()각 단어의 첫 글자를 대문자로, 나머지는 소문자로 변환새 문자열
zfillstr.zfill(width)문자열의 왼쪽을 '0'으로 채워 지정된 너비에 맞춤새 문자열
ljuststr.ljust(width[, fillchar])문자열을 지정된 너비로 왼쪽 정렬새 문자열
rjuststr.rjust(width[, fillchar])문자열을 지정된 너비로 오른쪽 정렬새 문자열
centerstr.center(width[, fillchar])문자열을 지정된 너비로 중앙 정렬새 문자열
encodestr.encode(encoding='utf-8', errors='strict')문자열을 지정된 인코딩으로 인코딩바이트 객체
formatstr.format(*args, **kwargs)문자열의 형식을 지정된 값으로 채움새 문자열

python for value in data.loc[:, "신장 센티미터"] : print(value.replace(" cm", ""))

data["신장 센티미터"] # 기본적으로 열접근을 지원! (Series들의 모임이기 때문!)

str 속성 : pandas 객체(Series, DataFrame)에서 문자열 함수를 적용하고자 하거나, 다루고자 할 때 사용하는 속성

height = data.loc[ : ,"신장 센티미터"].str.replace(" cm", "")

weight = data.loc[ : ,"몸무게 킬로그램"].str.replace(" kg", "")

height, weight

단위제거 이후 형변환(casting)

print(height.dtype) # object 형!

height = height.astype("float64")
weight = weight.astype("float64")

height, weight

  1. Series 연산

단위 변환 (cm 에서 m로)

meter_height = height * 0.01
bmi = weight / meter_height ** 2
bmi = bmi.round(2)

bmi

  1. 데이터 추가
  • 추가 & 수정(업데이트) → 지정하고 대입하면 끝!
  • 지정 했을 때 key값이 없는 경우! → 추가
  • 지정 했을 때 key값이 있는 경우! → 수정(업데이트)

data['bmi'] = bmi

data.loc[:,'bmi'] = bmi

data

실습! BMI 기준으로 고도비만(30이상)인 사람을 조회해보기!

data["bmi"] >= 30 # → 불리안 마스크(인덱싱 재료)

data[ data["bmi"] >= 30 ]

실습! BMI 기준으로 정상체중(18.5 ~ 22.9)인 사람을 조회해보기!

and, or : 논리연산자, 단일 값일 때 사용

True and False

&, | : 비트연산자, 다중 값일 때 사용

() : 비트연산자가 비교연산자보다 우선순위가 높기 때문에 소괄호 지정!

data[ (data["bmi"] >= 18.5) & (data["bmi"] <= 22.9) ]

  1. 결측치 전처리

데이터 분석 프로세스
1. 문제정의 + 데이터 확보 방안
2. 수집
3. 전처리
- 결측치 제거 or 대체
- 이상치 제거 or 대체
- 변수 처리(컬럼 추가, 선택, 삭제, 변환 등)
4. EDA(탐색적 데이터 분석)

data.isnull().sum()

결측치 확인 : 가슴 둘레 센티미터, 머리 둘레 센티미터

data[ data["가슴 둘레 센티미터"].isnull() ]

data["가슴 둘레 센티미터"]

형변환, 평균값으로 결측치 대체

apply() : 사용자 정의 함수를 Pandas 객체에 적용하기 위한 함수

apply 예시

ex_data = {
'Name': ['John', 'Anna', 'Peter', 'Linda'],
'Email': ['john@gmail.com', 'anna@yahoo.com', 'peter@gmail.com', 'linda@outlook.com']
}

df = pd.DataFrame(ex_data)
df

  • 1차원 Series apply() 적용!

함수 정의

def extract_domain(email) :
return email.split("@")[1]

1차원 Series에 apply() 활용하여, 도메인 추출

df["Email"].apply(extract_domain)

def extract_domain(row) :
return row["Email"].split("@")[1]

df.iloc[2]["Email"].split("@")[1]

2차원 DataFrame에 apply() 활용하여, 도메인 추출

df.apply(extract_domain, axis = 1)

def cm_replace(row) :

단위 문자 제거!

row["가슴 둘레 센티미터"] = row["가슴 둘레 센티미터"].replace(" cm", "")

return row["가슴 둘레 센티미터"]

→ error 발생! 내부에서 실수형으로 판단하는 듯 함...

if isinstance(row["가슴 둘레 센티미터"], float) : # 자료형이 float인가?
return float(row["가슴 둘레 센티미터"]) # 확실히 실수형으로 변환한다음 반환
else : # 아닌 경우(문자형인 경우)
return float(row["가슴 둘레 센티미터"].replace(" cm", ""))

data.iloc[0]

본 데이터 적용!

data["가슴 둘레 센티미터"] = data.apply(cm_replace, axis = 1) # axis = 1 : 각각의 행을 매개변수 전달!

apply() 활용해서 float 형으로 형변환이 되었기 때문에, 평균값 구할 수 있음!!

data["가슴 둘레 센티미터"].mean()

평균값으로 결측치를 대체해보자!

가슴 둘레 결측치를 평균치로 수정(업데이트)!

data.loc[ data["가슴 둘레 센티미터"].isnull() , "가슴 둘레 센티미터" ] = data["가슴 둘레 센티미터"].mean()

data.isnull().sum()

머리 둘레 센티미터는 결측치 데이터 삭제!

data = data.dropna()

data.dropna(inplace = True)

data.shape

0개의 댓글