본문 바로가기
IT,SW,Data,Cloud,코딩

파이썬 공부 1

by 착실하게 2022. 8. 22.
반응형

data.isnull()
true/false로 표현됨

data.isnull().sum()
컬럼별 빈칸의 개수 알려줌
true = 1 , false = 0 으로 되기 때문.

판다스 csv 읽기
pandas.read_csv('path', sep = '\t') 탭으로 분리된 데이터 읽기
이렇게 읽어오면 데이터프레임 타입이 된다.

파이썬 디폴트 인코딩은 UTF-8

판다스 사용
data.describe()
ㅡ> count, mean, std, min, 25%, 50%, 75%, max 값이 컬럼 별로 나온다.

데이터프레임 함수

data.head()
첫 다섯줄 보여줌.
head 함수에 인덱스 지정 가능함.
data.head(10)

data.shape()
데이터 모양 보여줌.
결과: (행,열)

data.info()
컬럼이름과 데이터 개수, 데이터 타입 보여줌
(어느 컬럼에 null 데이터가 얼마나 있는지 확인도 가능함. 다른 컬럼 데이터 건수 대비 적은 건수)

그 외 주요 메소드
std 표준편차, skew 왜도(치우침 정도), kurt 첨도(뾰족함 정도), cumsum 누적 합

data.sum()
수치형 데이터가 아닌 모든 컬럼만 합해줌. 스트링도 합쳐버린다.

데이터 프레임 특정 컬럼만 사용하는 방법
data.column_name
해당 컬럼을 맨앞 & 맨 뒤 다섯줄 총 10줄 보여줌

data.column.sum()
특정 컬럼의 합계만

data['column']
대괄호 써서 사용할땐 따옴표 필수

data['column'].sum()
결과가 data.column.sum() 랑 동일함

수치형 데이터 아닌 컬럼에 무슨 값 있는지 확인
data['column'].unique()

해당 필드 데이터 값 별 데이터 몇 건이나 되는지 요약해서 알 수 있음
data['column'].value_counts()

비율도 알 수 있음
data['column'].value_counts(normalize = True)
각 값별 몇 퍼센트인지 나온다.



만약
어떤 데이터가 수치형인데 수치형으로 인식되지 않았다면?
1) null 값 들어있는지 확인
.isnull().sum()
2) 컬럼의 최소/최대값 확인
data.column.min()
data.column.max()
만약 리턴값이 ₩₩N 이라면?
ANSI 타입으로 읽어들이면서 빈칸이 문자로 들어옴. 그래서 전체 컬럼이 문자로 인식됨.

특정 컬럼의 값을 조건으로 추출하기
data[data.column == '₩₩N']


======<<<결측값, 이상값 처리>>>======

파이썬에서 NaN 은 정해지지 않은 값이다.
Null 과 동일한 표현이다.

data[data.column.isnull()]
컬럼의 값이 null 인 경우만 결과로 반환된다.

loc인덱서 사용하여 특정 조건 만족하는 데이터를 변환하기
data.loc[data.column.isnull(), 'column' ] = 'U'



이상한 값은 모두 NaN으로 대체한 후
NaN을 삭제하는 코드

import numpy as np

data.loc[data.column == '₩₩N', 'column'] = np.nan

nan 으로 대체되었다

data.dropna()
nan 값을 가진 행 제외하고 조회.
실제 데이터를 삭제해버리는게 아니라 nan값을 가진 행을 제외하고 반환하는 함수.

실제 데이터에서 삭제하려면 ?
data.dropna( inplace = True )
결과를 반환 하는 대신, 해당 데이터를 삭제 한다.
데이터 행수가 변경이 된다.

data[['column1','column2']].dtypes
컬럼2개의 데이터 타입 속성값 조회

data[['column1','column2']] = data[['column1','column2']].astype(float)
실수 타입으로 변경

astypes() 메소드는 데이터 타입 변경해준다.
괄호 안에 원하는 타입을 집어넣으면 된다.

===== 이상값 처리 =======

Tukey 방법
1사분위수 아래로 IQR의 1.5배에 해당하는 값보다 작거나,
3사분위수로 IQR의 1.5배에 해당하는 값보다 크면 이상치로 규정하는 방법.

* IQR : InterQuartile Range 사분범위
중간에 50%의 데이터들이 흩어진 정도를 의미한다.
Q3 -Q1 으로 IQR 은 구해질 수 있다.
Q1 은 데이터의 중앙값 아래에서의 중앙값
Q3 은 데이터의 중앙값 위에서의 중앙값




Tukey 방식으로
아웃라이어 구하는 함수
import numpy as np
def outliers_iqr(data):
q1, q3 = np.percentile( data, [25,75] )
iqr = q3 - q1
lower_bound = q1 - (iqr * 1.5 )
upper_bound = q3 + (iqr * 1.5 )
return np.where((data > upper_bound) | (data < lower_bound))


outliers = outliers_iqr(data.column)

np.size( outliers )
하면 이상치 데이터 갯수 확인 가능

data.iloc[outliers]
이상값에 해당하는 행 확인 가능
iloc은 행의 위치를 숫자로 표시해서
데이터 일부를 추출하는 인덱서인데
outliers가 정수를 담은 array이기 때문에
iloc 인덱서 사용하는 것이 적당함.

==========================================================
데이터 통합
==========================================================

판다스 Merge 함수

data3 = pd.merge(data1, data2, left_on='column1', right_on = 'column2')

merge함수의 인자
왼쪽테이블, 오른쪽테이블, left_on =
왼쪽테이블에서 key값으로 사용될 컬럼, right_on = 오른쪽테이블에서 key값으로 사용될 컬럼

join type - how인자
디폴트 값은 inner

how인자의 종류4가지
inner 교집합
left 왼쪽테이블 기준으로 오른쪽 데이터 가져오기
right 오른쪽테이블기준으로 왼쪽데이터 가져오기
outer 합집합


pd.merge(df1, df2, how = 'inner', on = 'a')
같은 컬럼 있으면 on 사용 가능

pd.merge(df1, df2, how = 'left', on = 'a')
등으로 사용하면 된다.

============================================
탐색적 데이터 분석: 시각화
============================================

시각화 패키지: matplotlib, seaborn

matplotlib > pyplot
파이 차트:
범주형 변수 하나를 가지고 그릴 수 있는 차트.

from matplotlib import pyplot as plt
import numpy as np

labels = data.column.unique()
sizes = data. column.value_counts()
colors = ['yellow', 'green', 'red']
plt.pie(sizes, labels=labels, colors=colors, autopct = '%1.1f%%', startangle=90)
plt.show()

colors는 지정하지 않으면 디폴트 사용함

autopct 자동으로 비율을 계산하여 소수점 한 자리까지 표시하고 %를 붙임

startangle 첫번째 파이 조각의 시작 각도 지정

히스토그램
- 하나의 변수
- 수치형 분포

plt.hist(data.column, color = 'blue')
plt.show()

히스토그램의 구간의 크기 변경
plt.hist(data.column, color = 'blue', bins = 1000)

box plot
plt.boxplot(data.column)
상자수염그림

데이터의 일부만으로 그려보기
data_condition = data[data.column < 5000]
plt.boxplot(data_condition.column)
plt.show()

최소값,1사분위수,중앙값,3사분위수,최대값

data_some = data[data.column < 5000]
plt.boxplot([data_some.column[data_some.column2 == 'F'] , data_some.column[data_some.column2 == 'M']])
plt.xticks([1,2],['Female','Male'])
plt.show()

선 그래프
plt.plot( data['column'].groupby( data['column2']).sum() )
plt.show()

막대그래프1
plt.bar(labels, height = sizes, color = 'blue' )
plt.show()

막대그래프2
data2['column'].value_counts().plot( kind = 'bar' )
plt.show()

===============================================
데이터 전처리
===============================================

특정 셀 찾은 후 값 변경 하기
data[data.column == 'f'] = 'F'
data.loc[data.column == 'f', 'column']
= 'F'

인덱서(loc)
- 형식: [행 인덱싱값, 열 인덱싱값]
- 특정 위치의 값을 찾아 변경하고 싶을 때, 인덱서로 찾아서 작업 가능
- 조건, 이름을 넣어 특정 행 찾기


피봇 방식으로 데이터 요약하기
pd.pivot_table( data, index = 'group1', columns = 'type1', values = 'value1', aggfunc = np.sum )

pivot 과 unpivot =>
pivot_table 함수, melt 함수.

원래 인덱스는 0부터 숫자인데.
index = 지정해줘서 이 데이터로 인덱스 사용함.

인덱스 변경
df1 = df1.reset_index()

언피봇함수 (=melt함수)
pd.melt( df1, id_vars = 'group1' , value_vars = ['종류1','종류2','종류3'], var_name = 'type1', value_name = 'value1')




반응형

댓글