728x90
반응형
1. matplotlib
1.1) 히스토그램
- 빈도 분석을 위해서 그리는 차트
- 변수가 하나인 단변수 데이터의 빈도 수를 표현
- Series가 value_counts() 라는 메서드를 호출하면 빈도 수를 리턴
- hist()를 호출해서 히스토그램을 그릴 수 있는데 bins 옵션이 있어서 구간의 개수를 설정하는 것이 가능
1.2) scatter(산포도, 산점도)
- 자료의 분포를 표시할 때 이용하는 그래프는 서로 다른 두 변수 사이의 관계를 표현
- 각 변수는 연속적인 값이어야 함.
- scatter()를 이용해서 출력
1.3) Pie 차트
- 전체에 대한 기여도 확인 가능
- pie 함수를 이용해서 출력을 하는데 explode 옵션을 이용해서 중앙에서 떨어지는 비율을 설정할 수 있고 autopct를 이용해서 값의 비율을 출력할 수 있습니다.
1.4) BoxPlot
- 상자 와 수염으로 출력하는 그래프
Median(중간값) : 50% 가 되는 지점의 값으로 상자의 중앙선
Q1 : 하위 25%에 위차하는 값으로 상자의 경계선
Q3 : 상위 25%에 위치하는 값으로 상자의 경계선
IQR : Q3 - Q1
수염의 양끝 : Q1 - 1.5 * IQR, Q3 + 1.5 * IQR
표준 정규 분포에서는 Median 이 Q1 과 Q2 의 중앙에 위치하고 수염의 양끝 안에 99.3% 정도의 데이터가 위치하게 됩니다.
Q1 - 1.5 * IQR, Q3 + 1.5 * IQR 의 값 과 Q1 과 Q3 사이에 24.65% 정도가 위치하게 됩니다.
상자와 수염 밖의 데이터를 일반적으로 이상치로 간주합니다.
값의 분포가 넓지 않으면 이상치가 아닐 수 있는 데이터가 이상치가 될 수 도 있습니다.
1.5) 면적 그래프
- 선 그래프와 유사한데 영역이 색상으로 채워진 그래프
- 목적은 선 그래프와 동일
- fill_between 함수로 생성
SMALL
2. seaborn
- matplotlib 을 기반으로 다양한 색상 테마와 통계용 차트 등의 기능을 추가한 시각화 패키지로 numpy 와 pandas의 자료구조를 지원
- 샘플 데이터를 제공
- 통계 기능은 scipy 나 statsmodels 패키지에 의존
2.1) 산포도
fig = plt.figure(figsize=(8,6))
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
sns.set_style("darkgrid")
sns.regplot(x="total_bill", y="tip", data=tips, fit_reg=False, ax=ax1)
sns.regplot(x="total_bill", y="tip", data=tips, fit_reg=True, ax=ax2)
plt.show()
3. folium
- 지도를 출력할 때 사용하는 패키지로 html 출력을 만들 수 있음
- 자바스크립트 기반으로 interactive 하게 출력이 가능
- Chrome 브라우저에서는 바로 출력이 가능하고 다른 곳에서는 맵을 저장한 후 출력
- 도큐먼트 : http://python-visualization.github.io/folium
- 단계 구분도를 만들 수 있는데 이 때는 지역 경계에 대한 좌표를 json으로 전달해야 함
우리나라 :https://github.com/southkorea/southkorea-maps
3.3) 단계 구분도
- 지도에 색상을 이용해서 값의 크기를 표현하는 방법
- 행정 구역에 대한 경계선 좌표가 필요
이 좌표는 특별한 경우가 아니면 json 형태로 만들어져야 합니다.
4. pandas 에서도 시각화 지원
- 데이터를 가지고 plot() 을 호출해서 출력
- 축 제목 등을 설정하지 않아도 자동으로 설정
- DataFrame을 이용해서 plot을 호출하면 index가 x 축이 되고 숫자 데이터들이 y 축이 됨.
4.1) 선그래프
df = pd.read_csv('./data/seoul.csv', encoding="ms949")
#print(df.info())
df.plot()
4.2) 막대 그래프
plot(kind='bar)
4.3) 산점도 그래프 :
plot(kind='scatter')
4.4) 히스토그램
plot(kind='hist')
4.5) 커널 밀도
plot(kind='kde')
4.6) BoxPlot
plot(kind='box')
4.7) 파이
plot(kind='pie')
**pandas
1. 중복 데이터 처리
- 동일한 데이터가 여러 개 존재하면 분석 결과를 왜곡하는 경우가 발생할 수 있음.
1.1) duplicated()
- 데이터의 중복 여부를 bool의 Series로 리턴
df = pd.DataFrame([['안녕하세요', '니하오', '헬로우', '키아 오라', '안녕하세요'],
['한국', '중국', '미국', '뉴질랜드', '한국']])
df = df.T #열과 행 전치
df
print(df.duplicated())
## 결과
0 False
1 False
2 False
3 False
4 True
dtype: bool
1.2) drop_duplicates()
- 중복 데이터를 제거해주는 함수
- 아무런 옵션이 없다면 모든 컬럼의 값이 같은 경우를 제거
- subset 옵션에 컬럼 이름 이나 컬럼 이름의 list 를 대입하면 대입된 컬럼의 값이 같은 경우 중복 데이터로 간주하고 제거
- keep 옵션에 남길 데이터를 설정할 수 있음
- inplace 옵션이 존재 (default = False)
df.drop_duplicates(inplace=True)
print(df.duplicated())
## 결과
0 False
1 False
2 False
3 False
dtype: bool
2. 함수 적용
2.1) apply
- Series(DataFrame의 하나의 열)에서 호출하면 모든 요소에 함수를 적용
- DataFrame에서 호출하면 axis=0 을 추가하면 열 단위로 함수를 적용하고 axis=1을 설정하면 행 단위로 함수를 적용
- DataFrame에서 셀 단위로 적용하고자 하는 경우에는 applymap 함수를 호출
def f(data) :
return data + '...'
#Series 에 함수 적용
print(df[0].apply(lambda data : data + "...")) #Series는 셀 단위 적용
print(df.apply(f)) #DataFrmae은 행이나 열 단위 적용인데 기본은 열 단위 적용
print(df.applymap(f)) # 셀 단위 적용
## 출력 결과
0 안녕하세요...
1 니하오...
2 헬로우...
3 키아 오라...
Name: 0, dtype: object
0 1
0 안녕하세요... 한국...
1 니하오... 중국...
2 헬로우... 미국...
3 키아 오라... 뉴질랜드...
0 1
0 안녕하세요... 한국...
1 니하오... 중국...
2 헬로우... 미국...
3 키아 오라... 뉴질랜드...
result = df.apply(min_max, axis = 0) #셀단위 적용이나, 결과는 각 한가지씩만 출력함
print(result)
2.2) pipe
- DataFrame 에 사용하는 함수
- 대입되는 함수에 따라서 결과가 달라집니다.
Scala Data를 가지고 작업하는 함수를 대입하면 DataFrame을 리턴 - 셀 단위로 적용
집계를 하는 함수를 대입하면 Series를 리턴
Series를 리턴하는 함수를 대입하면 하나의 값을 리턴
# print(titanic.head())
df = titanic[['age', 'fare']]
# print(type(df))
def missing_value(x) :
return x.isnull()
#셀 단위로 적용해서 DataFrame을 리턴해준다.
print(df.pipe(lambda x : missing_value(x).sum()))
print()
def missing_count(x) :
return missing_value(x).sum()
#Series를 리턴하는 함수를 대입하면 하나의 값을 리턴
print(df.pipe(lambda x : missing_count(x).sum()))
## 결과
age 177
fare 0
dtype: int64
177
3. 열 편집
3.1) 열의 순서 변경
- 열의 순서 변경은 큰 의미가 없는 경우가 많습니다.
- 관계형 데이터베이스(테이블)의 특징 중 하나가 열의 순서는 없다 입니다.
- 열의 순서를 변경하고자 하는 경우에는 DataFrame 객체[[컬럼 이름 나열]]
3.2) 열 분리
- 날짜 형태로 되어 있는 컬럼의 경우 년 월 일로 분리하는 경우가 있습니다.
- 문자열의 경우는 split 함수를 이용하면 분리가 가능
4. 데이터 결합
4.1) concat
- Series 나 DataFrame을 열 방향이나 행 방향으로 이어 붙이는 함수
- Series 객체는 값과 인덱스를 연결
Series 객체끼리 concat를 할 때 axis=1 을 설정하면 컬럼 방향으로 붙여서 DataFrame을 생성해서 리턴
기본적으로 인덱스가 같은 것 끼리 결합을 하게 되는데 Outer Join의 방식으로 결
Join 옵션에 inner를 설정하면 Inner Join 방식으로 결합
- DataFrame 끼리는 동일한 컬럼을 기준으로 행 단위로 결합
존재하지 않는 컬럼의 값은 None
열 방향으로 합치고자 하면 axis=1 을 추가
4.2) append
- 인덱스가 의미없는 숫자인 경우 무조건 행 방향으로 결합하는 함수
print(df1.append(df2))
4.3) combine_first
- 첫번째 데이터가 None(NaN, numpy.nan, NULL, NIL) 인 경우 두번째 데이터를 가져오는 것
- numpy의 where 함수를 이용해서 구현이 가능하고 pandas 의 combile_first를 이용해서 구현 가
4.4) merge
- 관계형 데이터베이스의 JOIN 과 유사한 동작을 수행해주는 함수
- 2개의 Series나 DataFrame을 합치는 함수
- key를 가지고 결합
- 옵션없이 호출하면 동일한 컬럼 이름을 찾아서 그 컬럼의 값이 같은 경우에만 결합을 수행
- on 옵션에 명시적으로 컬럼이름을 설정할 수 있음.
동일한 컬럼 이름이 2개 이상 존재하는 경우에 명시
- 양쪽에 컬럼 이름이 다를 때는 left_on 과 right_on 이라는 속성에 양쪽의 컬럼 이름을 설정
price = pd.read_excel('./data/stock price.xlsx')
value = pd.read_excel('./data/stock valuation.xlsx')
inner_join = pd.merge(price, value)
print(inner_join)
- how 옵션에 inner 나 left, right, outer 를 사용할 수 있다.
- index 가지고 JOIN을 하고자 할 때는 left_index=True, right_index=True를 지정
- sort 옵션의 기본값은 True 인데 key로 정렬할 지 여부를 설정하는 옵션입니다.
4.5) Join
- 행 인덱스를 기준으로 결합
- DataFrame 을 만들 때 되도록이면 Primary Key 역할을 할 수 있는 컬럼을 index로 지정하는 것이 사용하는데 편리하기 때문에 Join을 이용해서 합치는 경우가 종종 있습니다.
price = pd.read_excel('./data/stock price.xlsx' , index_col = "id")
value = pd.read_excel('./data/stock valuation.xlsx', index_col = "id")
# inner_join = pd.merge(price, value)
# print(inner_join)
print(price.join(value)) #인스턴스로 메서드 호출 : bound 호출
print(pd.DataFrame.join(price, value)) #클래스로 인스턴스 메서드 호출 : unbound 호출
반응형
LIST
'LG 헬로비전 DX DATA SCHOOL > Python' 카테고리의 다른 글
회귀분석 (0) | 2023.08.30 |
---|---|
Pandas 의 연산 (0) | 2023.08.16 |
Python 데이터 분석 Pandas 2 (0) | 2023.08.09 |
데이터 분석 Python (with numpy & pandas) (0) | 2023.08.07 |
Django REST API (0) | 2023.07.27 |