728x90
반응형

데이터프레임 시각화 정리

1. 데이터프레임 정리

🍒행단위 합치기

  • 임시 데이터 생성
# 임시 데이터 1
data = [["Dog", 3], ["Cat", 5], ["Tiger", 2]]
index = [0, 1, 2]
columns = ["동물", "나이"]

df_temp1 = pd.DataFrame(data,
                       index=index,
                       columns=columns)
# 임시 데이터 2
data = [["집", 0], ["초원", 0], ["초원", 1]]
index = [0, 1, 2]
columns = ["사는 곳", "뿔의 갯수"]

df_temp2 = pd.DataFrame(data,
                       index=index,
                       columns=columns)

 

  • df_temp1과 df_temp2를 행단위로 합치기(행으로 추가)
result_df = pd.concat([df_temp1, df_temp2], axis=0, ignore_index=True)
result_df

 

🍒 열단위 합치기

  • 열단위로 합칠 때는 행의 갯수가 동일해야 함
pd.concat([df_temp1, df_temp2], axis=1)

 

🍒 열단위 합치기 : 키값을 이용해서 합치는 방식

  • 임시 데이터 생성
# 임시데이터
# 딕셔너리형태로 생성 
# key = columns
data1 = {"국적코드" : [1001, 1002, 1003],
       "국가" : ["한국", "미국", "인도"]}
df_info1 = pd.DataFrame(data1)

data2 = {"국적코드" : [1001, 1002, 1005],
       "인구" : [100, 200, 300]}
df_info2 = pd.DataFrame(data2)
df_info1, df_info2

  • 국적코드 같은 값들에 대해서 합치기
    - merge() : 같은 컬럼끼리 합치기
    - 기준은 df_info1
pd.merge(left=df_info1,
        right=df_info2,
        how="inner",
        left_on="국적코드",
        right_on="국적코드")

 

  • 국적코드가 같은 값은 같은데로, 같지 않으면 NaN으로 합치기
    - 기준 =  df_info1
pd.merge(left=df_info1,
        right=df_info2,
        how="left",
        left_on="국적코드",
        right_on="국적코드")

  • 국적코드가 같은 값은 같은데로, 같지 않으면 NaN으로 합치기
    - 기준 =  df_info2
pd.merge(left=df_info1,
        right=df_info2,
        how="right",
        left_on="국적코드",
        right_on="국적코드")

 

2. 전처리

🍒 bicycle.csv 파일 읽어들이기

df = pd.read_csv("./data/bicycle.csv",
                encoding="euc_kr")

 

🍒 결측치 확인

df.info()

 

  • 결측치 데이터 확인하기
    - 결측 데이터 값 True, 정상 데이터는 False
df.isnull()

❗결측치 처리 방법
1. 결측치가 있는 부분의 데이터를 사용할지 / 말지 결정
2. 사용 안한다면 컬럼과 행 주엥 어느 부분을 제거할지 결정
3. 사용한다면 어떻게 대체할지 결정

 대체 방법
3.1. 결측치가 있는 해당 컬럼의 평균으로 모두 대체
3.2. 범주형 데이터인 경우에는 범주의 비율대비로 대체
3.3. 숫자값인 경우 모두 0으로 대체
3.4. 결측데이터가 속한 주변 컬럼들의 데이터 유형과 유사한 데이터들의 평균으로 대체
3.5. 결측치가 있는 컬럼의 직전/직후 데이터의 평균으로 대체

 

  • 결측 데이터 현황 확인
    - 컬럼별 결측 현황
    - sum(0) : 0의 의미는 각 열의 행단위를 의미
    df.isnull().sum(0)​



    - 행별 결측 현황
    - sum(1) : 1의 의미는 각 행의 컬럼 단위를 의미
    df.isnull().sum(1)​

🍒 결측치 처리

  • 결측치가 있는 모든 행들 삭제하기
df_drop = df.dropna(axis=0)
df_drop.info()

 

  •  결측치가 있는 모든 컬럼 삭제하기
df_drop_col = df.dropna(axis=1)
df_drop_col.info()

 

  • 결측치 대체하기
# null값 0으로 대체
df["이용거리"].fillna(0)

# null값 문자로 대체
df["이용거리"].fillna("missing")

# null값 평균으로 대체
df["이용거리"].fillna(df["이용거리"].mean())

 

🍒 중복데이터 처리

  • 중복데이터가 있는 행의 위치 확인하기
    - True - 중복
df.duplicated(["이용거리"])​

 

  • 중복데이터 데이터프레임 형식으로 확인하기
    - 162개
df[df.duplicated(["이용거리"])]​

 

  • keep : 중복 중에 몇 번째 중복을 False(남겨 둘 것인지)로 할 것인지 설정
  • keep : first, last, False
    - first : 첫번째만 False (뒤쪽 중복 데이터는 모두 True), default, 생략가능
    - last : 마지막만 False (앞쪽 중복 데이터는 모두 True)
    - False : 중복데이터 전체 True 
df.duplicated(["이용거리"], keep="first")
df.duplicated(["이용거리"], keep="last")
df.duplicated(["이용거리"], keep="False")

 

  • 중복데이터 삭제
    - 중복 데이터는 사용할지 말지만 결정하면 된다.
    - 전체 행 420개에서 중복 행162개 삭제 > 258 행 남음
df.drop_duplicates(["이용거리"])

 

🍒 이상데이터 처리

  • 이상 데이터 처리 순서
    1. 결측치 처리가 선행되어야 한다.
     - 결측치도 데이터로 인식되기 때문이다.
    2. 이상데이터에는 범주형, 숫자형 데이터 처리 방식이 다르다.
     - 일반적으로 이상데이터는 숫자형 데이터 처리를 주로 한다.
    3. 이상 데이터 확인은 시각화(boxplot)를 통해서 확인한다.
    4. 실제 처리는 계산에 의해 처리된다.
  • 데이터 불러와서 전처리
### 시각화 라이브러리 :
import matplotlib.pyplot as plt

### 사용할 데이터 읽어 들이기
df = pd.read_csv("./data/bicycle_out.csv",
                encoding="euc_kr")
                
### 결측치 처리하기
df["대여거치대"] = df["대여거치대"].fillna(int(df["대여거치대"].mean()))
df["반납거치대"] = df["반납거치대"].fillna(int(df["반납거치대"].mean()))
df["이용시간"] = df["이용시간"].fillna(int(df["이용시간"].mean()))
df["이용거리"] = df["이용거리"].fillna(int(df["이용거리"].mean()))
df.info()

### 행단위 중복체크
# - 중복 없음
df.duplicated().value_counts()

 

  • 이상치 확인
    - 나이 max 값
df.describe()

 

  • 나이 데이터를 기준으로 이상데이터 시각적으로 확인하기
    - 박스플롯(boxplot)을 용해서 시각화
    - 주황색 선 : 중앙값
plt.boxplot(df["나이"])
plt.show()

 

 

 - 박스 상 선 : Max Outliers
 - 박스 하단 선 : Min Outliers
 - 이상치로 의심되는 데이터 : Max 및 Min Outlier를 벗어난 데이터들 
 - 주황색 선 : 중앙값

 

 

 

 

 

 

 

 

❗이상치 계산을 위한 그림 설명

 

 

<이상치 계산 공식>

IQR = Q3 - Q1

최대 = Q3 + (1.5 * IQR)
최소 = Q1 - (1.5 * IQR)

 

 

 

 

 

 

 

  • 이상치 계산 하기
import numpy as np

### 25% 및 75% 시점의 값 추출하기
q1, q3 = np.percentile(df["나이"], [25, 75])

### IQR 계산
iqr = q3 - q1

### max outliers 계산
upper_bound = q3 + (1.5 * iqr)

### min outliers
lower_bound = q1 - (1.5 * iqr)

upper_bound, lower_bound

 

  • 이상치로 의심되는 max 또는 min을 벗어나는 데이터 추출하기
    - max값을 벗어난다고 해도 무조건 이상치로 처리 하지 않는다. 나이를 보면 60대일 경우는 이상치로 보긴 어렵다.
    - 이상치 처리는 필터링으로 하면 된다.
df[((df["나이"] > upper_bound) | (df["나이"] < lower_bound))]

728x90
반응형

+ Recent posts