배고픈 개발자 이야기

[2021/07/15] 정형/비정형 데이터 처리 본문

인포섹 아카데미

[2021/07/15] 정형/비정형 데이터 처리

이융희 2021. 7. 15. 10:11
728x90

- 각 시도별 분양 면적별 분양가의 동향을 분석

 

csv 데이터(엑셀)은 load시 cp949인코딩 사용

결측치 처리 및 분석을 위한 명령어 실습

import pandas as pd

# Exel은 cp949
df_last = pd.read_csv("data/주택도시보증공사_전국 평균 분양가격(2019년 12월).csv", encoding="cp949")

df_last.shape

# DataFrame 정보 상세보기
df_last.info()

# null인지 True False로 표기
df_last.isnull()
df_last.isna()

# 각 column의 null 갯수 합
df_last.isnull().sum()

import numpy as np

# 결측치 삽입
df = pd.DataFrame({
    "컬럼1": ["10", "20", "30"],
    "컬럼2": ["10", np.nan, "30"]
})

# dtype : object -> int or float
pd.to_numeric(df["컬럼1"])

# 한글 또는 에러가 있는 경우 결측치 처리 후 실수화
df_last["분양가격"] = pd.to_numeric(df_last["분양가격(㎡)"], errors="coerce")

# new column 생성
df_last["평당분양가격"] = df_last["분양가격"] * 3.3

# 첫 행만 보기
df_last.head(1)

df = pd.DataFrame({
    "컬럼1":["메론", "수박", "메론", "바나나", "메론"]
})

# unique한 원소 수, max 원소 수, dtype 출력
df["컬럼1"].describe()

 

 

결측치 처리 및 분석을 위한 명령어 실습

import random

# 0~100
list_data = list(range(0, 101))

# 랜덤한 순서로 변경
random.shuffle(list_data)

# count 결측치는 제외, std는 표준편차
df_last["분양가격"].describe()

# min()에 해당하는 행만 출력
df_last[df_last["평당분양가격"] == df_last["평당분양가격"].min()]

# max()에 해당하는 행만 출력
df_last[df_last["평당분양가격"] == df_last["평당분양가격"].max()]

# 규모구분 column의 문자열 replace, dtype을 문자열로 변경하여 실행
df_last["전용면적"] = df_last["규모구분"].str.replace("전용면적", "")

# 위와 마찬가지로 "이하" 단어 삭제
df_last["전용면적"] = df_last["전용면적"].str.replace("이하","")

# 위와 마찬가지로 "초과"를 "~"로 대체
df_last["전용면적"] = df_last["전용면적"].str.replace("초과","~")

# 위와 마찬가지로 공백 제거
df_last["전용면적"] = df_last["전용면적"].str.replace(" ","")

# 좌우 공백 제거
df_last["전용면적"] = df_last["전용면적"].str.strip()

# 두 columns 삭제, column은 axis=1, row는 axis=0이 필수 옵션
df_last.drop(["규모구분", "분양가격(㎡)"], axis=1)

 

- DataFrame 그룹별 처리 명령어 실습

# df_last.groupby(["학과"]) :학과 칸에 저장된 값이 같은 줄 끼리 그룹을 만듬
# 집계?
df = pd.DataFrame({
    "학과":["컴공","보안","보안","컴공","컴공"],
    "학년":[1, 2, 1, 2, 1],
    "점수":[90, 100, 80, 90, 70]
})

# 컴공, 보안별 그룹으로 묶여 item으로 출력
for item in df.groupby(["학과"]):
  print("$" * 100)
  print("item")
  print("$" * 100)
  print(item)
  print("=" * 100)

# 학과별 각 column의 평균점수
df.groupby(["학과"]).mean()

# 학과별 groupby 후 점수 column만 평균
df[["학과","점수"]].groupby("학과").mean()

# 학과별 최고점수
df[["학과","점수"]].groupby("학과").max()

# 학과별 최저점수
df[["학과","점수"]].groupby("학과").min()

# groupby()에서 쓸 수 있는 함수 : 
# count(), sum(), mean(), max(), min()
# median():중앙값, std(): 표준편차, quantile : 4분위수 25%, 50% 75%
# first(), last()

# 학과가 기준, 학과 컬럼에 저장된 값이 "컴공"인 줄 리턴
df[["학과","점수"]].groupby("학과").get_group("컴공")

 

- Sample DataSet : seaborn(titanic)을 사용한 데이터 분석

 

class별 사망자 평균, 나이별 class 이용자 수 확인

import seaborn as sns

# titanic dataset load
titanic = sns.load_dataset("titanic")

# 모든 row의 지정한 column으로 DataFrame 생성
df = titanic.loc[ : , ["age", "sex", "class", "fare", "survived"]]

# class별 그룹화, 
for key, people in df.groupby("class"):
  print("*" * 100)
  print("key = ", key)
  print("len(people) = ", len(people))
  print("*" * 100)
  print(people)
  print("=" * 100)
  print("=" * 100)

# 각 class별 평균값
df.groupby("class").mean()

# class가 Third인 그룹
df.groupby("class").get_group("Third")
Comments