Ex01_ 육군데이터
학습목표 : 육군신체정보 데이터를 활용해서 Series 연산, 데이터 색인 등의 기초적인 데이터 활용법을 익혀보자!
Ctrl + Shift + - : 셀 나누기
Shift + m : 셀 병합
import numpy as np # 수치계산 특화
import pandas as pd # 데이터 정제, 조작
import matplotlib.pyplot as plt # 차트
data = pd.read_csv("./data/육군신체측정정보.csv", low_memory = False)
data.info()
data.head(10) # 상위 10ea 확인
| 함수 | 사용법 | 설명 | 반환값 |
|---|---|---|---|
| replace | str.replace(old, new[, count]) | 문자열에서 old를 new로 대체 | 새 문자열 |
| upper | str.upper() | 문자열의 모든 문자를 대문자로 변환 | 새 문자열 |
| lower | str.lower() | 문자열의 모든 문자를 소문자로 변환 | 새 문자열 |
| strip | str.strip([chars]) | 문자열 양쪽 끝의 공백이나 chars에 지정된 문자 제거 | 새 문자열 |
| lstrip | str.lstrip([chars]) | 문자열 왼쪽 끝의 공백이나 chars에 지정된 문자 제거 | 새 문자열 |
| rstrip | str.rstrip([chars]) | 문자열 오른쪽 끝의 공백이나 chars에 지정된 문자 제거 | 새 문자열 |
| find | str.find(sub[, start[, end]]) | 부분 문자열 sub이 처음 나타나는 위치 탐색 | 위치 인덱스 또는 -1 |
| rfind | str.rfind(sub[, start[, end]]) | 부분 문자열 sub이 마지막으로 나타나는 위치 탐색 | 위치 인덱스 또는 -1 |
| split | str.split([sep[, maxsplit]]) | sep을 기준으로 문자열을 나눔 | 문자열 리스트 |
| rsplit | str.rsplit([sep[, maxsplit]]) | sep을 기준으로 문자열을 오른쪽에서부터 나눔 | 문자열 리스트 |
| join | str.join(iterable) | iterable의 각 요소를 문자열로 연결 | 새 문자열 |
| count | str.count(sub[, start[, end]]) | 문자열에서 부분 문자열 sub의 출현 횟수 계산 | 정수 |
| index | str.index(sub[, start[, end]]) | 부분 문자열 sub이 처음 나타나는 위치 탐색(찾지 못하면 예외 발생) | 위치 인덱스 |
| rindex | str.rindex(sub[, start[, end]]) | 부분 문자열 sub이 마지막으로 나타나는 위치 탐색(찾지 못하면 예외 발생) | 위치 인덱스 |
| startswith | str.startswith(prefix[, start[, end]]) | 문자열이 지정된 접두어로 시작하는지 여부 | 불리언 |
| endswith | str.endswith(suffix[, start[, end]]) | 문자열이 지정된 접미어로 끝나는지 여부 | 불리언 |
| isdigit | str.isdigit() | 문자열이 숫자로만 구성되어 있는지 여부 | 불리언 |
| isalpha | str.isalpha() | 문자열이 알파벳 문자로만 구성되어 있는지 여부 | 불리언 |
| isalnum | str.isalnum() | 문자열이 알파벳 문자와 숫자로만 구성되어 있는지 여부 | 불리언 |
| isspace | str.isspace() | 문자열이 공백 문자로만 구성되어 있는지 여부 | 불리언 |
| istitle | str.istitle() | 문자열이 타이틀 케이스(각 단어의 첫 글자가 대문자)인지 여부 | 불리언 |
| capitalize | str.capitalize() | 문자열의 첫 글자를 대문자로, 나머지는 소문자로 변환 | 새 문자열 |
| title | str.title() | 각 단어의 첫 글자를 대문자로, 나머지는 소문자로 변환 | 새 문자열 |
| zfill | str.zfill(width) | 문자열의 왼쪽을 '0'으로 채워 지정된 너비에 맞춤 | 새 문자열 |
| ljust | str.ljust(width[, fillchar]) | 문자열을 지정된 너비로 왼쪽 정렬 | 새 문자열 |
| rjust | str.rjust(width[, fillchar]) | 문자열을 지정된 너비로 오른쪽 정렬 | 새 문자열 |
| center | str.center(width[, fillchar]) | 문자열을 지정된 너비로 중앙 정렬 | 새 문자열 |
| encode | str.encode(encoding='utf-8', errors='strict') | 문자열을 지정된 인코딩으로 인코딩 | 바이트 객체 |
| format | str.format(*args, **kwargs) | 문자열의 형식을 지정된 값으로 채움 | 새 문자열 |
python for value in data.loc[:, "신장 센티미터"] : print(value.replace(" cm", ""))
height = data.loc[ : ,"신장 센티미터"].str.replace(" cm", "")
weight = data.loc[ : ,"몸무게 킬로그램"].str.replace(" kg", "")
height, weight
print(height.dtype) # object 형!
height = height.astype("float64")
weight = weight.astype("float64")
height, weight
meter_height = height * 0.01
bmi = weight / meter_height ** 2
bmi = bmi.round(2)
bmi
data.loc[:,'bmi'] = bmi
data
data["bmi"] >= 30 # → 불리안 마스크(인덱싱 재료)
data[ data["bmi"] >= 30 ]
data[ (data["bmi"] >= 18.5) & (data["bmi"] <= 22.9) ]
데이터 분석 프로세스
1. 문제정의 + 데이터 확보 방안
2. 수집
3. 전처리
- 결측치 제거 or 대체
- 이상치 제거 or 대체
- 변수 처리(컬럼 추가, 선택, 삭제, 변환 등)
4. EDA(탐색적 데이터 분석)
data.isnull().sum()
data[ data["가슴 둘레 센티미터"].isnull() ]
data["가슴 둘레 센티미터"]
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
def extract_domain(email) :
return email.split("@")[1]
df["Email"].apply(extract_domain)
def extract_domain(row) :
return row["Email"].split("@")[1]
df.iloc[2]["Email"].split("@")[1]
df.apply(extract_domain, axis = 1)
def cm_replace(row) :
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 : 각각의 행을 매개변수 전달!
data["가슴 둘레 센티미터"].mean()
data.loc[ data["가슴 둘레 센티미터"].isnull() , "가슴 둘레 센티미터" ] = data["가슴 둘레 센티미터"].mean()
data.isnull().sum()
data.dropna(inplace = True)
data.shape