no image
[파이썬] 이상값 처리
데이터 분석하거나 시각화 하다보면 이상적인 범위를 벗어나 데이터 분포에 영향을 미치는 데이터들이 존재하는데 이를 이상값이라고 한다. 국민 소득을 예로 들어 설명을 하면, A그룹의 연간 소득 분포가 [5천만, 6천만, 4,800만, 6,200만, 7천만, 15억8천만, 39만]이 있다고 하면 이 그룹의 연간 평균소득은 2억6,719만원이다. 이런 수치는 이 그룹의 연간소득을 적절히 설명하지못한다. 이 때 일반적인 분포에서 벗어난 데이터인 15억8천만, 39만원이 이상값이라고 할 수 있다. # 이상값 유형 이상값은 앞에 설명한 것 처럼 수치가 너무 크거나 작아 분포에 영향을 끼치는 것 외에도 다른 유형들이 있다. 구분 설명 점 이상값 일반적인 데이터들과 값의 차이가 큰 데이터 상황적 이상값 상황에 따라서 정..
2022.07.06
no image
[파이썬] 범주형 데이터의 실수화 (labeling, one-hot encoding)
데이터의 시각화 관점에서 보았을 때, 데이터는 크게 수치형 데이터와 범주형 데이터로 구분할 수 있다. 범주형 변수란? 어떤 범주에 속하는 순위가 없는 데이터들을 의미한다. '성별'의 경우 '남', '여'로 구분된 범주형 변수이고, '직업'의 경우 '회사원', '자영업자', '프리랜서', '학생' 등으로 구분되는 범주형 변수이다. 인간이 이해하기에 보다 직관적이고 인간을 대상으로 한 자료 수집의 큰 부분을 담당하고 있다. 하지만 컴퓨터가 이해하기에는 어려우며, 연속형 변수와 함께 사용하거나 실수화 하지않으면 시각화 하기 어렵다는 단점이 존재한다. 범주형 데이터의 실수화 위와 같은 이유로 범주형 데이터를 실수화하는 경우가 종종 있다. 이번 실습에서는 Labeling과 One-Hot Encoding, 이 두 ..
2022.07.06
no image
[파이썬] 워드 클라우드
사람들이 시각적 자극에 민감한 만큼 시각화는 중요한 작업 중 하나이다. 이번에는 시각화 방법 중 하나인 워드 클라우드 (Word Cloud)에 대해서 공부해보고자 한다. 워드 클라우드란? 워드 클라우드는 문자로 이루어진 데이터 속에서 형태소 분석을 통해 구분된 단어들의 출현 빈도에 따라서 크기가 다르게 나타나는 시각화 도구 중 하나이다. 예를 들어 뉴스 기사 제목만 모아둔 파일이 있다고 했을 때, 가장 많이 나타나는 단어들을 표현하는 방법을 두 가지로 비교해보자. 1. 빈도수 나타내기 수치를 나타내기 때문에 가장 직관적인 방법이기도 하고, 많이 사용되는 방법이기도 하다. 예를 들어서 '국가'라는 단어가 870번 등장하고, '정책'이 863번, '토지'가 770번 등장한다고 하면 국가 870 정책 863 ..
2022.06.29
파이썬 클래스
파이썬에도 여타 언어들 처럼 class를 만들어 객체를 생성하는 기능을 포함하고 있다. 현실세계에서 어떠한 객체는 하나의 정보로만 구성되는 경우는 매우 드물다. 예를 들어 자동차라는 하나의 객체 안에는 자동차의 모델명, 제작사, 타입 등의 여러가지 정보로 구성되기 때문에, primitive 타입의 자료형으로는 표현하는데 한계가 존재한다. 따라서 class의 기능을 이용해 자동차 같은 객체를 설명하고, 그런 변수를 생성하고 처리할 수 있도록 한다. 특히 파이썬과 JAVA는 같은 OOPL(Object-Oriented-Programming Language)로 객체를 우선시 하는 이러한 언어들에서 Class의 개념은 몹시 중요하다. 예시로 2개의 operator에 대해 사칙연산만 수행하는 계산기를 class형식..
2021.11.14
no image
데이터 시각화 그래프
데이터를 분석하는데 사용되는 기법은 목적에 따라 다양하게 분류된다. 그 중 현재 내가 사용하고 있는 EDA(Exploratory Data Analysis) : 탐색적 데이터 분석 기법에서는 시각화를 매우 중요한 부분으로 여기고 있다. 데이터를 시각화 할 때 seaborn, matplot과 같은 라이브러리의 도움을 받으면 훨씬 간단하게 표현할 수 있다. 우선은 간단한 몇가지 그래프만 살펴보고자 한다. 선 그래프 파이그래프 막대그래프 히스토그램 박스플롯 위 순서대로 살펴볼 것이다. 1. 선 그래프 선 그래프는 우리가 가장 흔하게 알고있는 꺾은 선 그래프를 말하는 것이 맞다. 선 그래프의 장점은 시간에 따른 변화나, 지속적인 변화가 있을 때 그것을 나타내기 용이하다. 예를 들면 각 지자체별 매해 예산의 변화를..
2021.06.29
no image
numpy 라이브러리
원래 파이썬은 데이터 분석에 유용한 언어가 아니었다. 과거에는 통계를 위한 언어인 R언어가 파이썬보다 기반이 더 좋았고, 현재도 통계적 분야에는 R언어가 조금 더 유용하다고 한다. 파이썬이 데이터분석 툴로 활약하게 된건 앞서 설명한 pandas와 지금부터 알아볼 numpy(numerical python) 라이브러리가 나오고 나서 부터라고 해도 과언이 아니다. 파이썬은 해당 라이브러리들로 인해 통계적 분석 뿐 아니라 범용적으로 사용이 가능해지면서 더욱 인기가 높아졌다. numpy는 무엇일까? 기존 파이썬 언어로 계산하기 복잡한 수치들을 계산하기 쉽도록 도와주는 라이브러리이다. 뿐만 아니라 list와 유사한 기능을 하는 numpy array를 사용하여 table을 다루는 것을 더 용이하게 해준다. numpy..
2021.03.23
no image
pandas 데이터 정제 (2)
pandas 두번 째 정리 진행하기 전에 공부했던 내용들을 잠시 복습하는 타임을 갖도록 하자. DataFrame은 열과 행을 갖춘 데이터타입이다. pd.DataFrame() 매서드를 사용해서 생성할 수 있으며 편집과 접근이 쉽고 표현방식도 좋기 때문에 애용한다. loc과 iloc은 각각 인덱스와 행 번호를 기준으로 데이터에 접근하는 매서드였다. 물론 다른 방법으로도 행과 열에 접근할 수 있지만 이 두가지 방법이 가장 보편적으로 잘 쓰이고 있다. DataFrame 다루기 심화 우린 DataFrame을 csv형태 파일로 받아서 사용을 할 수도 있고 우리가 직접 만들어서 사용할 수 있다. 이렇게 작성한 데이터의 양은 적을수도 있지만, 방대한 양일 수도 있다. 저번 시간에는 간단하게 이런게 있고 조작할 수 있다..
2020.06.27
no image
판다스를 이용한 데이터 정제
오늘은 판다스(pandas) 라이브러리를 이용한 데이터 정제를 반드시 정리할 것이다. 우선 판다스란?: 파이썬에서 사용하는 데이터 분석 라이브러리로 행과 열로 이루어진 데이터 객체를 만들어서 다룰 수 있으며 안정적으로 큰 용량의 데이터를 처리하는데 유용하게 쓰인다. 판다스는 처리 속도가 빠른 편은 아니지만 많은 사람들이 이용하고 있는 라이브러리이다. 속도가 느림에도 애용하는 이유는 다음과 같다. 1. 러닝커브가 낮다. 2. python universe에 속한다. 3. 디버깅하기 편하다. 4. 빠른 시각화가 가능하다. 판다스의 기본 개념으로는 Series와 DataFrame이 있는데 이는 위에서 말한 행과 열로 이루어진 데이터 객체들의 명칭이다. 판다스를 다루기 위해서는 이에 대한 이해가 불가결 하므로 설..
2020.06.17

데이터 분석하거나 시각화 하다보면 이상적인 범위를 벗어나 데이터 분포에 영향을 미치는 데이터들이 존재하는데 이를 이상값이라고 한다.

 

국민 소득을 예로 들어 설명을 하면,

 A그룹의 연간 소득 분포가 [5천만, 6천만, 4,800만, 6,200만, 7천만, 15억8천만, 39만]이 있다고 하면 이 그룹의 연간 평균소득은 2억6,719만원이다. 이런 수치는 이 그룹의 연간소득을 적절히 설명하지못한다.

이 때 일반적인 분포에서 벗어난 데이터인 15억8천만, 39만원이 이상값이라고 할 수 있다.

 

 

# 이상값 유형

이상값은 앞에 설명한 것 처럼 수치가 너무 크거나 작아 분포에 영향을 끼치는 것 외에도 다른 유형들이 있다.

구분 설명
점 이상값 일반적인 데이터들과 값의 차이가 큰 데이터
상황적 이상값 상황에 따라서 정상일수도, 비정상일수도 있는 데이터
집단적 이상값 개별 데이터일 때는 이상이 없지만, 이러한 데이터들의 집단에서는 비정상적인 패턴을이 보이는 데이터들의 집합

이러한 이상값들은 단위의 정규화가 되지 않았거나, 고의적으로 이상값을 삽입한 경우, 측정/실험 오류, 자연 변형 등에 의해 발생한다.

 

 

# 이상 데이터 탐색

직관적으로 보이는 값들은 이상값으로 처리할 수 있지만, 데이터 수가 많거나 일반적인 그래프로 발견할 수 없는 데이터들은 통계적인 기법을 이용해서 이상값을 탐색해낸다.

 

  • Z-검정 : 정규분포의 Z-score를 이용해서 표준정규분포를 벗어나는 유의수준의 값들을 이상값으로 검출하는 방법
  • 카이스퀘어 검정 : 자유도가 1인 카이스퀘어 분포를 따르는 통계량의 임계치보다 큰 경우 하나 이상의 이상값이 존재한다고 판단한다. 데이터가 정규분포를 만족시하거나, 데이터의 수가 적을 때 이용한다
  • 사분위수 범위 : 전체 데이터 분포를 25%, 50%, 75%, 100%로 구분한 사분위 범위에서 제3분위수(75%)에서 제1분위수(25%)의 값을 뺀 IQR의 MAX와 MIN 값의 밖에 있는 값들을 이상값으로 판단
  • 회귀 진단 : 해당 데이터 집단에 회귀 모델을 적용했을 때 예상 값의 범위 밖에 있는 데이터들을 이상값으로 판단
  • 거리 탐색 기법: 관측치 사이의 거리를 이용해서 평균적인 데이터 간의 거리보다 벗어난 데이터를 이상값으로 판단, 대표적으로 k-NN 알고리즘을 들 수 있다
  • 밀도 기반 탐색 기법: 상대적인 밀도를 고려하여 이상값을 탐지, LOF, DBSCAN, k-Means 알고리즘등이 있다

 

#데이터 이상값 처리

이상값은 분석의 대상이 되지 않는 경우가 많아 삭제하는 방법을 자주 사용한다.

삭제 이외에는 극단치의 기준을 적용하여 조정하거나 삭제하는 방법 또는 다른 값으로 대치하는 방법을 사용하기도 한다.

(극단치 기준 : 평균&표준편차, 사분위수 극단값 등)

 

 

#실습

 

  • Z-검정을 이용한 이상값 탐색 및 처리
import random
data = list(np.random.randint(1, 100, size=3000))

[1~100]의 범위를 값으로 가지는 3000개 데이터를 생성하고, 이를 정규화해서 살펴보고 다시 이상값을 추가한 후 확인해볼 것이다.

생성한 실제 데이터의 분포 히스토그램

구분 raw 데이터 값의 분포 이상값 추가 데이터 분포
정규분포
scipy를 이용해 정규분포 확인
표준정규분포
    <이상값 추가 코드>
ol_data = data.copy()
ol_no = 10

for i in range(ol_no):
  rand_no = random.randint(0, len(data))
  ol_data.insert(rand_no, ol_data[rand_no]*2)

<정규분포 출력 코드>

# raw 데이터 정규분포
pdf = stats.norm.pdf(np.sort(data), data_mean, data_std)
plt.figure()
plt.plot(np.sort(data), pdf)

# 이상값 추가 데이터는 데이터 추가 이후 같은 방법으로 시행

<표준정규분포 출력 코드>

# 데이터 별로 z-score을 환산한 후 적용
std_list = []

for i in data:
  z = (i - data_mean) / data_std
  std_list.append(z)

ol_data_mean = np.mean(std_list)
ol_data_std = np.std(std_list)

ol_pdf = stats.norm.pdf(np.sort(std_list), ol_data_mean, ol_data_std)

plt.figure()
plt.plot(np.sort(std_list), ol_pdf)

# 이상값 추가 이후 동일

<이상값 제거>

# |z-score|이 2가 넘는 것들을 삭제, z-score > 2의 유의수준 : 98%
for i in ol_std_list:
  if i > 2:
    ol_std_list.remove(i)
  if i < -2:
    ol_std_list.remove(i)

이상값 처리 결과

 

  • 사분위값 검정(Box plot)
data2 = pd.DataFrame(np.random.randn(100, 3), columns=['A', 'B', 'C'])
data2.head()

±3 이내의 값을 100개씩 가지는 3개의 column을 가진 dataframe을 가지고 boxplot을 그려 이상값의 존재를 파악하려한다.

 

<사분위>

 

<Box plot>

sns.boxplot(data2)

boxplot을 확인해보니 B에서 IQR의 MIN 보다 작은 이상값들이 존재함을 확인할 수 있다.

 

 

<이상값 탐색>

def get_ol(df, col, weight=1.5):
  Q_25 = np.percentile(df[col].values, 25)
  Q_75 = np.percentile(df[col].values, 75)

  IQR = Q_75 - Q_25
  IQR_weight  = IQR*weight

  low = Q_25 - IQR_weight
  high = Q_75 + IQR_weight

  ol_idx = df[col][(df[col] < low) | (df[col] > high)].index
  return ol_idx

이상값들이 어떤게 있는지 위 함수를 사용해 도출한 결과,

[19, 91, 99]번째 index의 값이 이상값임을 알 수 있음.

(random을 통해서 산출한 데이터이므로 시행마다 결과가 다를 수 있음)

 

<이상값 drop>

data2.drop(ol_idx, axis=0, inplace=True)

sns.boxplot(data=data2)

 

이상값이 사라진 boxplot

 

이렇게 이상값을 제거할 수 있다.

 

 

 

 

 

 

※위 과정은 행정안전부, 한국지능정보사회진흥원, CSLEE 컨소시엄, KPC에서 진행하는 데이터 분석 청년인재 양성 전문과정에서 제공하는 교재의 일부분을 활용해 작성했음을 밝힙니다.

데이터의 시각화 관점에서 보았을 때, 데이터는 크게 수치형 데이터와 범주형 데이터로 구분할 수 있다. 

 

범주형 변수란?

어떤 범주에 속하는 순위가 없는 데이터들을 의미한다. '성별'의 경우 '남', '여'로 구분된 범주형 변수이고, '직업'의 경우 '회사원', '자영업자', '프리랜서', '학생' 등으로 구분되는 범주형 변수이다. 

인간이 이해하기에 보다 직관적이고 인간을 대상으로 한 자료 수집의 큰 부분을 담당하고 있다.

 

하지만 컴퓨터가 이해하기에는 어려우며, 연속형 변수와 함께 사용하거나 실수화 하지않으면 시각화 하기 어렵다는 단점이 존재한다.

 

범주형 데이터의 실수화

위와 같은 이유로 범주형 데이터를 실수화하는 경우가 종종 있다.

이번 실습에서는 Labeling과 One-Hot Encoding, 이 두 가지 방법으로 진행해볼 것이다.

 

#Labeling

라벨링은 리커트(Likert)척도처럼 항목별로 정수를 부여하는 것이다.

['거주지'] 항목이 있을 때 value로 ['서울', '부산', '대구', '대전', '울산']이 있다면 이것을 [0, 1, 2, 3, 4]로 바꿔 label을 부여해주는 것을 Labeling이라고 한다.

 

아주 감사하게도 싸이킷런에서는 labeling 모듈을 제공해준다. 이를 이용해서 타이타닉 데이터의 범주형 데이터를 변환해보는 실습을 진행해볼 것이다.

 

우선 데이터를 불러와서 확인해보면..

class, deck 등이 category변수이고 sex, embarked, who, embark_town, alive 등이 object변수로 범주형 변수의 후보가 된다.

그중에 embark_town 컬럼을 가지고 Labeling을 진행해볼 것이다.

 

from sklearn.preprocessing import LabelEncoder
  • 우선 Labeling에 필요한 모듈을 import해주고, embark_town이 어떻게 생겼는지 확인해보면

값으로 [Southampton, Cherbourg, Queenstown]을 가지고 있다는 것을 알 수 있다.

encoding = LabelEncoder()
encoding.fit(df['embark_town'])
  • 그 다음 LabelEncoder 객체를 생성해주고, embark_town을 fit하게되면, 값에 따라 label이 부여된다.

확인해보니 {'Southampton' : 2, 'Cherbourg' : 0, 'Queenstown' : 1}로 labeling이 진행된 것을 확인할 수 있다.

 

 

 

#One-Hot Encoding

One-Hot Encoding(원핫 인코딩)은 범주형 데이터에 대해 이진분류하는 방법이다. 해당 값에 해당하는지에 대한 정보를 0, 1로 나타낸다.

이번에는 타이타닉 데이터의 class 컬럼을 가지고 실습을 진행해볼 것이다.

one_encoding = OneHotEncoder(sparse=False)
one_encoding.fit(df[['class']])

위와 마찬가지로 OneHotEncoder 객체를 생성해준 후 class 컬럼을 fit시킨다. 

sparse 옵션은 True(default)로 할 경우 결과를 2차원 좌표값으로 반환해주고, False로 하게되면 2차원 numpy array로 반환한다. 우리는 DataFrame으로 처리할 것이기 때문에 numpy array형식으로 반환해주기로 했다.

 

결과를 확인해보면..

array 형식으로 잘 반환된 것을 볼 수 있다.

 

One-Hot encoding의 결과값은 2차원 형식이므로 labeling과 달리 array를 dataframe으로 변환해준 다음 concat하는 과정을 거쳐 원본데이터와 결합시킬 수 있다.

df_class = pd.DataFrame(one_encoding.transform(df[['class']]), columns = one_encoding.get_feature_names())
df_class.head()

 

위와 같이 dataframe을 생성한 후 원본 데이터와 concat메소드를 이용해 합병해주면 분석에 이용할 수 있는 결과 데이터가 나오게 된다.

df_con = pd.concat([df,df_class], axis=1)
df_con

 

 

해당 코드의 일부는 행정안전부, NIA, CSLEE, kpc에서 주관하는 공공 데이터 분석 청년 인재 양성 사업의 교재를 참고하였음을 밝힙니다.

'데이터 분석 > 파이썬' 카테고리의 다른 글

[파이썬] 이상값 처리  (0) 2022.07.06
[파이썬] 워드 클라우드  (0) 2022.06.29
파이썬 클래스  (0) 2021.11.14
데이터 시각화 그래프  (0) 2021.06.29
numpy 라이브러리  (0) 2021.03.23

사람들이 시각적 자극에 민감한 만큼 시각화는 중요한 작업 중 하나이다.

 

이번에는 시각화 방법 중 하나인 워드 클라우드 (Word Cloud)에 대해서 공부해보고자 한다.

 

워드 클라우드란?

워드 클라우드는 문자로 이루어진 데이터 속에서 형태소 분석을 통해 구분된 단어들의 출현 빈도에 따라서 크기가 다르게 나타나는 시각화 도구 중 하나이다.

 

예를 들어 뉴스 기사 제목만 모아둔 파일이 있다고 했을 때, 가장 많이 나타나는 단어들을 표현하는 방법을 두 가지로 비교해보자.

 

1. 빈도수 나타내기

수치를 나타내기 때문에 가장 직관적인 방법이기도 하고, 많이 사용되는 방법이기도 하다.

예를 들어서 '국가'라는 단어가 870번 등장하고, '정책'이 863번, '토지'가 770번 등장한다고 하면

국가 870
정책 863
토지 770

이렇게 나타낼 수 있다. 

 

이런 방법은 순서대로 정렬이 되어있으면 순서대로 읽으면 순위를 알 수 있지만, 한 눈에 확 들어오지는 않는다.

 

2. 워드클라우드

워드클라우드는 데이터 전처리 과정에서 빈도수를 분석하여 시각적인 자극을 강화한 방법으로 다음과 같이 나타난다.

'포함이' 라는 단어보다 '겨우'나 '새로운'이 더 눈에 잘 들어오고, '녀석이나겠다면'이라는 문장(?)보다는 '것이다'가 더 잘 보인다. 빈도수에 기반해서 크기가 자동적으로 조정되어 나타난 것이다. 

 

빈도수에 대한 정확한 수치가 필요하진 않을 때, 조금 더 시각적인 자극이 필요할 때 이런 방법을 자주 사용하고, 데이터에 대한 정확한 통찰보다 개략적인 정보만 필요할 때 자주 사용한다. 

 

특히 웹에서 시각적 효과가 중요해진 요즘엔 웹에 등장시켜 시선을 끌기도 한다.

 

 

워드클라우드 만들기

1. 준비물

 워드클라우드를 만들기 위해서는 다음과 같은 준비물이 필요하다.

  • wordcloud 패키지: 말 그대로 wordcloud 제작을 지원하는 다양한 모듈이 담겨있는 패키지
  • KoNLpy 패키지 : 영어로만 워드클라우드를 만들 때는 꼭 필요하진 않지만, 한국어 처리를 위해서는 필요한 패키지이다. 주요 기능은 형태소 분석으로 [명사, 동사, 형용사] 등을 구분해주는 패키지이다.

 

2. 코딩

 

#필요 패키지
from wordcloud import WordCloud
from collections import Counter
from konlpy.tag import Okt

필요한 패키지들은 위와 같다. 

워드클라우드 객체 생성을 위한 wordcloud 패키지와, 단어수를 count해주는 collections 모듈의 Counter 클래스, 형태소 분석을 담당하는 KoNLpy를 import해준다.

 

with open('./output_3.csv', 'r', encoding='UTF-8') as f:
    text = f.read()

그 다음은 워드클라우드화할 문장들이 포함되어 있는 파일을 읽어온다.

나는 과거에 대학교 커뮤니티의 게시글 제목들을 크롤링한 데이터를 사용하기로 했다.

 

 

okt = Okt()
nouns = okt.nouns(text)
data = [i for i in nouns if len(i) > 1]
c = Counter(data)

이후 형태소 분석 객체를 생성하고 (Okt, Open Korean Text : 트위터에서 개발한 오픈소스 한글 처리기) 형태소 중에서 명사만 꺼낸다.

 

명사를 꺼낼 때 '야'와 같은 한글자 명사는 제외하고 하기로 하고, 빈도수를 count해준다.

 

import matplotlib.font_manager as fm

sys_font=fm.findSystemFonts()
print(f"sys_font number: {len(sys_font)}")
print(sys_font)

 

그 다음 중요한 작업 중 하나가, 한글로 작성된 텍스트를 워드클라우드 시킬 때는 폰트를 따로 적용시켜주어야 하는데 작업중인 파일과 폰트의 위치를 일치시키거나 정확한 폰트 파일의 위치를 적용시켜줘야하므로 위 과정을 통해 한글을 지원하는 폰트가 있는지 파악해야한다.

 

wc = WordCloud(font_path = 'Fonts\\NanumBarunGothicLight.ttf', 
               background_color = 'white',
               prefer_horizontal = 1,
               width = 1000, 
               height= 600, 
               max_words=100)
gen = wc.generate_from_frequencies(c)
wc.to_image()

마지막으로 워드클라우드 객체를 생성하고 옵션을 지정해준 다음에, 빈도수를 기반으로 generate해준 후, to_image()해주면..

 

 

이렇게 워드 클라우드가 나타난다. 

역시 대학교 커뮤니티답게 '교수', '시험'이 보이기도 하고 의외로 '생각'이나 '정도' 같은 단어들도 많이 보이는 것 같다.

 

워드클라우드 mask 씌우기

패키지에 의해 생성되는 기본 모양은 위와 같이 사각형의 틀 속에 글자가 배치되는 것이다.

option의 파라미터 값을 조정하면 글자의 배치나 배경 색상, 최대 폰트 크기, 최대 단어 수 등을 조정할 수 있고 frame의 모양도 설정할 수 있다.

 

네모 반듯한 것도 이쁘지만 워드클라우드를 게시하는 페이지의 특성에 따라서 다른 모양을 취해주는 것이 시각적인 효과를 더 이끌어 낼 수 있다.

 

from PIL import Image
import numpy as np

이미지를 masking 하려면 이미지 데이터를 array로 변환시키는 작업이 필요한데, 이 작업을 해주는 두 라이브러리를 호출한다.

 

이번 실습에서는 강아지 이모티콘 사진을 마스킹해서 모양을 취해보도록 하였다.

 

background = Image.open('그림1.jpg')
back_array = np.array(background)

pillow를 통해서 이미지를 픽셀화한 후, numpy를 가지고 array화 하였다.

위 과정을 거치면, 강아지 모양 사진이 RGB 색상표를 기준으로 0~255사이 범위를 가진 float타입 숫자의 array로 바뀐다.

 

wc = WordCloud(font_path = 'Fonts\\NanumBarunGothicLight.ttf', 
               background_color = 'white',
               prefer_horizontal = 1,
               width = 1000, 
               height= 600, 
               mask = back_array)

gen = wc.generate_from_frequencies(c)

wc.to_image()

처리된 이미지 파일을 워드클라우드 option의 파라미터로 주면..

 

이렇게 귀여운 강아지 모양의 워드클라우드를 볼 수 있다.

 

파이썬에도 여타 언어들 처럼 class를 만들어 객체를 생성하는 기능을 포함하고 있다.

 

현실세계에서 어떠한 객체는 하나의 정보로만 구성되는 경우는 매우 드물다. 예를 들어 자동차라는 하나의 객체 안에는 자동차의 모델명, 제작사, 타입 등의 여러가지 정보로 구성되기 때문에, primitive 타입의 자료형으로는 표현하는데 한계가 존재한다.

 

따라서 class의 기능을 이용해 자동차 같은 객체를 설명하고, 그런 변수를 생성하고 처리할 수 있도록 한다.

 

특히 파이썬과 JAVA는 같은 OOPL(Object-Oriented-Programming Language)로 객체를 우선시 하는 이러한 언어들에서 Class의 개념은 몹시 중요하다.

 

예시로 2개의 operator에 대해 사칙연산만 수행하는 계산기를 class형식으로 만들어 보았다.

class Calculator:
#constructor
    def __init__(self,operator1, operator2):
        self.operator1 = operator1
        self.operator2 = operator2
#method
    def add(self):
        return self.operator1+self.operator2
    def multiple(self):
        return self.operator1*self.operator2
    def subtraction(self):
        return self.operator1-self.operator2
    def division(self):
        return self.operator1/self.operator2

class 안에서 함수와 같은 기능을 수행하는 것들을 method라고 부른다. 

 

Calculator class안에는 사칙연산을 계산하는 4개의 method가 존재한다.

 

method는 다음과 같이 작동한다

c1 = Calculator(4,2)
print(c1.add())
print(c1.multiple())
print(c1.subtraction())
print(c1.division())
6
8
2
2.0

여기서 다른 언어들과 차이를 보이는게 몇가지 있는데, 첫번째로 constructor이다.

 

다른 언어에서 constructor는 보통 class 명으로 선언되는데 파이썬에서는 __init__이라는 이름을 사용해서 선언된다. 

파이썬에서는 언더스코어(__)이 포함된 method는 파이썬 내부에 저장된 특별한 함수나 변수명을 나타내거나, 예약어로 지정돼 함수명으로 사용할 수 없을 때 사용한다.

(대표적으로 __init__, __add__, __sub__, __str__ 등이 있다)

 

또 다른 것으로는 파이썬은 인터프리터형 언어로, 자료형이 동적으로 할당된다는 것이다. 

 

위의 각 method 실행 결과 중, division만 소숫점형태로 나타난 것을 확인할 수 있는데, C나 JAVA와 같은 언어에서 이와 같이 출력하기 위해서는 return 타입을 미리 지정해줘야하고 method 인자 또한 타입을 지정해줘야 가능하다.

 

또, 다른 언어에서는 class가 가지는 특징을 변수로 나타내는데 (C : 멤버변수, JAVA: 필드), 파이썬에서는 그런 것을 선언해주지 않아도 method 내부에서

self.변수명 = initiating

와 같이 초기화 할 수 있다.

이는 constructor가 아닌 다른 method 내부에서도 초기화가 가능하다.

 

self는 다른 언어의 this와 유사한 기능을 수행한다. 객체 스스로를 호출하는 기능을 수행하는데 객체에 대한 연산을 수행할 때는 인자로 self를 거의 항상 가진다.

(객체의 속성을 연산하는 것이 아닌 아예 다른 수행을 하는 경우 self를 사용하지 않는 경우도 있다.)

 

상속

상속은 똑같다.

오버라이딩하거나 상속받은 함수를 그대로 사용할 수 있다.

class ExtandCalcualtor(Calculator):
    def __init__(self,operator1,operator2):
        Calculator.__init__(self,operator1,operator2)
    def power(self):
        result = 1
        for i in range(self.operator2):
            result *= self.operator1
        return result
    def division(self):
        result = [0, 0]
        result[0] = int(self.operator1/self.operator2)
        result[1] = int(self.operator1%self.operator2)
        return result

이는 확장된 계산기 class로 n제곱승과 나눗셈의 몫과 나머지를 출력하도록 method를 정의해줬다.

c2 = ExtandCalcualtor(4,2)
print(c2.power())
print(c2.division())
print(c2.add())
16
[2, 0]
6

조금 다른 기능으로는 파이썬은 다중 상속을 지원하고(JAVA는 미지원), mro라는 method를 지원하는데, 이는 해당 class가 어떤 상속관계에 놓여져있는지 나타낸다.

ExtandCalcualtor.mro()

#결과
[<class '__main__.ExtandCalcualtor'>, <class '__main__.Calculator'>, <class 'object'>]

 

데이터를 분석하는데 사용되는 기법은 목적에 따라 다양하게 분류된다.

 

그 중 현재 내가 사용하고 있는 EDA(Exploratory Data Analysis) : 탐색적 데이터 분석 기법에서는 시각화를 매우 중요한 부분으로 여기고 있다.

 

데이터를 시각화 할 때 seaborn, matplot과 같은 라이브러리의 도움을 받으면 훨씬 간단하게 표현할 수 있다.

 

우선은 간단한 몇가지 그래프만 살펴보고자 한다.

 

  1. 선 그래프
  2. 파이그래프
  3. 막대그래프
  4. 히스토그램
  5. 박스플롯

위 순서대로 살펴볼 것이다.

 

1. 선 그래프

선 그래프는 우리가 가장 흔하게 알고있는 꺾은 선 그래프를 말하는 것이 맞다. 

선 그래프의 장점은 시간에 따른 변화나, 지속적인 변화가 있을 때 그것을 나타내기 용이하다.

예를 들면 각 지자체별 매해 예산의 변화를 나타낼 때 선 그래프를 통해 나타내면 지자체 별 변화를 파악하기에도 용이하고 선들의 비교를 통해서 지자체간의 차이도 파악할 수 있다.

 

df = df.read_csv('broadcast.csv', index_col=0)
df.plot(kind='line')

plot이라는 매서드를 통해서 그래프를 그렸다. plot 매서드의 파라미터로는 다양한 값이 들어갈 수 있는데, 그 값들은 kind의 영향을 받는다.

 

우선 선 그래프의 경우 plot kind의 default 값이므로, kind='line' 구문을 지우고 실행하여도 위와 같은 결과를 얻을 수 있다.

 

좀 더 구체적인 인사이트를 얻기 위해서 슬라이싱을 활용하여 데이터를 나타낼 수도 있다.

df[['KBS', 'JTBC']].plot()

이와 같이 슬라이싱을 활용하여 그래프를 나타내면, 

위와 같은 모양의 그래프를 얻을 수 있다. 

물론 이전의 그래프 또한 자료가 얼마 없었기 때문에 큰 차이가 없어보이지만, 가령 방송국이 1000개가 있었다라고 가정한다면 필요없는 자료들을 제외하고 위와 같이 나타내면 훨씬 더 직관적인 시각을 가져다준다.

 

이런 식으로 데이터 분석할 때 사용했던 여러 기법들을 통해서도 시각화에 도움을 줄 수 있다.

 

2. 파이 그래프

파이 그래프는 말 그대로 파이처럼 생긴 그래프이다. 파이 그래프는 단독 데이터의 비율을 나타낼 때 강점을 보인다.

예를 들어 A회사의 직원의 구성을 알고싶다 할 때 파이그래프를 통해서 표현하면 인사이트를 높게 가져다준다.

df.loc[2016].plot(kind='pie')

파이 그래프의 경우 단일 대상에 대해서만 데이터를 표현할 수 있기 때문에, 미리 슬라이싱을 하여 데이터를 출력하였다.

2016년에 각 방송사의 시청비율을 나타내고 있는데 이는 각 구성별 차이를 파악하는데 선 그래프 보다 더 좋은 인사이트를 제공하고 있다.

 

3. 막대 그래프

막대 그래프는 선 그래프와 마찬가지로 일상에서도 많이 사용되는 그래프이다.

막대 그래프는 한 대상 내의 여러 분류 끼리의 비교가 필요할 때 주로 사용되는데, 분류 수가 적을 때 더 좋은 인사이트를 줄 수 있다. 단순 수량을 비교할 때 장점을 가진다고 할 수 있다.

 

df.plot(kind='bar')
df.plot(kind='barh')

막대 그래프는 위와 같이 세로, 가로 그래프를 제공할 수 있다.

 

그래프를 살펴보았을 때 연도별로 다양한 방송사가 있는데, 가장 큰 값과 가장 작은 값이 한 눈에 들어오고 있으나, 어떤 그래프가 무엇을 나타내고 있는지 바로바로 비교하기가 힘들다.

 

새로운 데이터를 불러와서 다시 한 번 살펴보면,

새로 제시된 그래프가 이전 그래프 보다 무엇을 비교하고자 하는지, 차이가 얼마정도 나는지 직관적으로 파악할 수 있다.

 

4. 히스토그램

히스토그램은 도수 분포표를 그래프로 나타낸 것인데, 데이터의 분포에 따라 때때로 정규분포의 그래프와 유사한 형태로 나타난다.

 

df.plot(kind='hist', y='Height', bins=15)

위 그래프는 남자 청소년들의 키 분포를 히스토그램으로 나타낸 것이다. 

원래 데이터프레임 속에는 weight, height 등의 다양한 변수가 존재하지만, 히스토그램으로 나타내기 위해서는 y축이 무엇을 의미하는지 지정해줘야한다.

또, bins는 구간을 나눈 횟수로 적절히 조절해야 좋은 인사이트를 가져다 준다.

위 사진은 bins를 각각 100 과 10 (bins의 default는 10이다)으로 해서 나타낸 것인데, 10보다는 15로 한것이 조금 더 명확해 보이고, 100으로 한 것은 조금 더 상세하게 알아볼 수 있게 해준다.

 

5. 박스플롯

박스플롯은 보통 통계나 수학에서 사용하는 그래프와는 조금 다른 형태를 가진다.

통계정보를 시각적으로 나타내는 박스플롯은 백분율을 사용해서 분포를 나타내는데, 이를 해석하기 위해서는 사분위수의 개념이 필요하다.

 

필요한 데이터를 불러와서 describe매서드를 사용하면, 위와 같은 통계 요약을 얻을 수 있는데 index에서 25% 50% 75% 를 볼 수 있다.

이는 각각 하위 25%, 50%, 75%를 나타내는 것인데 이렇게 사분할 한 것이 사분위수라고 하며,  25%이하를 Q1(제1사분위수), 25~50%를 중앙값(제2사분위수; Q2), 50~75%를 Q3(제3사분위수), 그 이상을 Q4(제4사분위수)라고 한다.

 

해당 자료를 박스플롯으로 나타내면,

df.plot(kind='box', y='math score')

이와 같이 출력된다. 히스토그램과 마찬가지로 y축을 지정해주어야한다.

 

박스(네모)로 구분된 부분은 25% < x < 75% 사이의 값의 분포를 나타내는 부분이며 여기에 많은 양의 데이터가 분포하고 있다.

 

위 아래로 이어진 선 끝에 가로 선으로 표시된 부분은 maximum과 minimum으로 whisker라고 불리기도 한다. 데이터 별로 위 아래로 이은 선의 길이가 다를 수 있는데, 이는 값으 분포 차이 때문에 발생하는 것이다.

 

데이터는 불확실성을 가지기 때문에 범주에 속하는 maximum과 minimum보다 크거나 작은 값도 데이터 상에 존재할 가능성이 있다. 그러한 점들을 outliers라고 부르며, 특잇값 또는 극단값 이라고도 한다.

 


데이터셋 출처 : 코드잇(codeit) https://www.codeit.kr/

'데이터 분석 > 파이썬' 카테고리의 다른 글

[파이썬] 워드 클라우드  (0) 2022.06.29
파이썬 클래스  (0) 2021.11.14
numpy 라이브러리  (0) 2021.03.23
pandas 데이터 정제 (2)  (0) 2020.06.27
판다스를 이용한 데이터 정제  (0) 2020.06.17

원래 파이썬은 데이터 분석에 유용한 언어가 아니었다. 과거에는 통계를 위한 언어인 R언어가 파이썬보다 기반이 더 좋았고, 현재도 통계적 분야에는 R언어가 조금 더 유용하다고 한다.

 

파이썬이 데이터분석 툴로 활약하게 된건 앞서 설명한 pandas와 지금부터 알아볼 numpy(numerical python) 라이브러리가 나오고 나서 부터라고 해도 과언이 아니다. 파이썬은 해당 라이브러리들로 인해 통계적 분석 뿐 아니라 범용적으로 사용이 가능해지면서 더욱 인기가 높아졌다.

 

numpy는 무엇일까?

 

기존 파이썬 언어로 계산하기 복잡한 수치들을 계산하기 쉽도록 도와주는 라이브러리이다. 

뿐만 아니라 list와 유사한 기능을 하는 numpy array를 사용하여 table을 다루는 것을 더 용이하게 해준다.

 

numpy array

 

파이썬의 기본 자료형인 list와 다르게 numpy array는 사칙연산을 할 수 있도록 구성되었다.

또한 indexing과 slicing을 사용할 수 있어 데이터를 다루는데 매우 적합하다.

 

기본적인 형태는 list와 유사한 형태로 작성할 수 있다.

numpy array

 

또 full, arange, random 등의 메서드를 활용해서 좀 더 쉽게 array를 구성할 수 있다.

array 구성의 다양한 메서드

 

계속해서 언급했던 사칙연산은 어떻게 적용되고 있는지 한번 알아보도록 하자.

 

우선 list에 곱연산을 적용해서 list 원소 값이 변화하는지 살펴보면,

list 연산

우리가 기대했던 것과는 다르게 출력이 된다. 그럼 numpy array에는 어떻게 출력이 될까?

 

array 연산
array끼리 연산 또한 가능하다

우리가 기대했던 원소 값의 변화가 발생하였다. 

 

이러한 것들은 단순히 편하다는 것을 넘어서서 코드를 완성한 후 직관성을 올려주고 코딩을 잘 하지못하는 사람들에게도 이해하기 쉽도록 도와주는 역할을 한다.

 

또 편리한 기능으로 indexing과 slicing을 넘어 filtering도 가능하게 해주는데, 이는 where함수를 사용해서 구현할 수 있다.

array filtering

where함수 안에 조건문을 넣어 boolean값을 받은 후 indexing을 통해 filtering을 한 것으로 filtering 된 값을 출력하는 것 이외에도 원하는 값만 변경해주는 필터링하는 등 다양하게 활용할 수 있다.

 

 

numpy는 list에 비해 연산속도가 빠르고, 같은 자료형만 한 배열 안에 담아 side-effect를 방지할 수 있으며, 문법적으로도 직관성이 뛰어나 사랑받고 있다.

pandas 역시 numpy를 바탕으로 해서 만들어져, numpy가 중요한 내용을 담고 있음을 알 수 있다.

'데이터 분석 > 파이썬' 카테고리의 다른 글

파이썬 클래스  (0) 2021.11.14
데이터 시각화 그래프  (0) 2021.06.29
pandas 데이터 정제 (2)  (0) 2020.06.27
판다스를 이용한 데이터 정제  (0) 2020.06.17
셀레니움을 이용한 웹크롤링(Web crawling)  (0) 2020.06.03

pandas 두번 째 정리

 

진행하기 전에 공부했던 내용들을 잠시 복습하는 타임을 갖도록 하자.

 

DataFrame은 열과 행을 갖춘 데이터타입이다. pd.DataFrame() 매서드를 사용해서 생성할 수 있으며 편집과 접근이 쉽고 표현방식도 좋기 때문에 애용한다.

 

loc과 iloc은 각각 인덱스와 행 번호를 기준으로 데이터에 접근하는 매서드였다. 물론 다른 방법으로도 행과 열에 접근할 수 있지만 이 두가지 방법이 가장 보편적으로 잘 쓰이고 있다.

 

 


DataFrame 다루기 심화

 

우린 DataFrame을 csv형태 파일로 받아서 사용을 할 수도 있고 우리가 직접 만들어서 사용할 수 있다. 

 

이렇게 작성한 데이터의 양은 적을수도 있지만, 방대한 양일 수도 있다. 

 

저번 시간에는 간단하게 이런게 있고 조작할 수 있다~ 라고만 얘기 했으나, 그렇게 넘어가기에는 꽤나 중요한 내용이기 때문에 어떻게 다루는 지에 대해서 지금부터 공부를 해보자.

 

 

뭔가 좀 많아 보이기는 하지만, 사실 파이썬 기초에 올렸던 내용들을 응용한 내용들이기도 하다.

 

먼저 처음 나온

 

print(ages[ages > ages.mean()])
print(ages > ages.mean())

이 두 문장은 겉으로 보기에는 굉장히 닮아있으나 매우 다른 출력값을 내보내므로 구분하는게 좋을 것 같아서 넣어봤다.

 

기본적으로 부등식을 프로그래밍 상에서 사용하게 되면, bool값으로 출력하게 된다. (True or False)

 

따라서  1문장은 사실상 print(ages[True])인 age값을 DataFrame에서 추출해 출력하게 되는 것이고, 2문장은 모든 age에 대한 bool값을 출력하게 되는 것이다.

 

manual_bool_values는 위에서 말한 1문장을 내가 지정한 형태로 원하는 사람의 age값을 뽑아내기 위해 지정해준 것이다.

 

print(ages + ages)
print(ages * ages)
print(ages + pd.Series([1, 100]))

 

이 문장은 DataFrame 값에 사칙연산이 적용된다는 것을 보여주기 위해 작성을 했는데, 3번 문장은 조금 특이한 결과값을 낸다.

 

 

 

NaN이란 누락값을 의미한다. null, Not-a-Number의 약자이다.

 

이런 일이 왜 발생하는지 한번 뜯어보자면, 

 

내가 만들어 준 Series는 [1, 100] 두 칸 짜리 데이터이다.

 

이는 둘의 합산을 outer join 방식으로 하여, 두 데이터 모두 실존해야 값을 출력하기 때문에 NaN이 출력이 되었다.

 

 

그리고 마지막 두줄

 

print(scientists[scientists['Age'] > scientists['Age'].mean()])
scientists_dropped = scientists.drop(['Age'], axis=1)

 

사실 1번 문장은 위에서 설명한 것과 이미 같은 내용이다. scientist의 모든 데이터 값을 출력하되, Age의 값이 mean보다 높은 값의 데이터만 출력하겠다라는 의미이다.

 

drop은 내가 원하는 행열을 삭제시킬 수 있다. axis는 축의 방향으로 index와 column의 방향을 정해 지울 수 있다.

 

 

 


 해당 코드는 작성한 DataFrame이나 수정한 csv파일을 저장하는 코드이다.

 

윗 줄과 밑 줄의 차이점은, 밑에 줄은 index를 지정해주지 않았다. 나머지는 같다.

 

 

 

데이터 병합 (Concatenate, Merge)

 

데이터들을 합치는 방법에는 여러가지가 있는데, 그 중 merge와 concat의 방식을 한번 배워보도록 할 것이다.

 

 

 

1. Concat

 

먼저 concat은 가장 단순하게 데이터를 병합하는 방법으로, concat함수를 선언해주면 된다.

 

연결해주고 싶은 방향에 따라 axis를 설정해주면 된다.

 

하지만 이렇게 단순하게 연결을 하게 되면 하나의 문제점이 생기는데, 

 

 

 

어떤 문제점인지 알겠는가?

 

바로 index와 index번호가 수정되지 않고 그대로 연결하게 된다는 것이다.

 

이렇게 되면 iloc은 문제없이 작동될 수 있지만, loc의 경우에 문제가 생기는 것이다. 인덱스의 네이밍이 같기 때문에 작동은 될 지 언정, 내가 원하는 데이터 값을 뽑아내기는 힘들 수 있다.

 

따라서 우리는 다음 방법을 통해서 데이터 병합을 할 때 혼동을 줄이자.

 

 

 

이렇게 인덱스명을 수정해주면, 

 

 

loc을 사용할 수 있는 형태로 출력이 가능하다.

 

만약 내가 병합을 하는데 각각 column의 name이 다 다르면 어떻게 병합이 될까? 

 

각 위치에 데이터가 존재하면 데이터 값을 합쳐 병합을 했고, 그렇지 않은 부분은 NaN값으로 대체되어 출력이 되었다.

 

이걸로 concat 역시 outer join 방식임을 알 수 있다.

 

 

 

2. Merge

 

merge의 특징은 공통적인 데이터를 기준으로 합병이 진행된다는 것이다.

 

 

 

가령 이러한 데이터가 있다고 치자. 

 

이 데이터를 병합을 하게되면 어떤 결과가 추출이 될까?

 

결과는

 

 

 

이렇게 나온다.

 

우리가 지정해준 df1과 df2의 데이터에서 'name' column의 내용은 서로 다른데 어떻게 NaN의 값이 없이 데이터가 출력될 수 있었을까?

 

또, df1과 df2의 raws는 5줄인데 data_merged의 raws는 7줄이 모두 값이 존재하게 출력 된걸까?

 

이건 inner join 방식의 결과이기 때문이다.

 

outer join의 결과는 모든 출력값을 데이터의 존재 유무와는 상관없이 출력하게 되지만, inner join은 같은 name끼리의 값을 합쳐서 출력을 하게 된다.

 

 

 

쉽게 풀어서 설명하자면 이런 그림으로 설명이 가능하다.

 

하나의 input 값에 각각 대응하는 ways의 수만큼 출력이 되는 것이다.

 

merge는 기본적으로 이러한 방법을 채택하고 있지만, 우리가 지정을 해줌으로써 다른 방법으로도 병합이 가능하다.

 

방법은 outer, left, right 방식이 있다.

 

outer은 우리가 알고 있는 그 방법이 맞고, left는 병합할 때 기준으로 왼쪽에 있는 데이터를 모두 출력해주고, right는 오른쪽에 있는 데이터를 모두 나타내준다.

 

 

<left, right의 예시>

 

 

또 left, right는 내가 출력하고 싶은 column을 따로 설정해줄 수 있는데 이건 예제를 통해서 알아보도록 하자.

 

 

 

예제에서 실행한 것은 site 와 visited의 merge이다.

 

내가 알고싶은 것은 site에 방문한 visited의 날짜라고 했을 때, 방문한 장소의 name을 기준으로 병합을 진행하기 위해서 left와 right의 기준을 name과 site로 정했다. visited의 site는 site의 name에 해당하는 값이므로 병합을 진행해보면,

 

 

 

다음과 같은 결과가 나오게된다.


 

2. 누락값(NaN, nan) 처리

 

우리는 위의 예제들을 통해서 누락값을 발생을 경험해 보았고 이러한 데이터가 어떻게 발생하는지 알게되었다.

 

지금부터는 이 누락값들을 채우고 처리하는 방법을 알아보도록 하자.

 

 

결측값 분석하기

 

isnull 메서드를 사용하면, 데이터에 존재하는 누락값의 수를 알아낼 수 있다.

해당 데이터는 

 

사진에서 보이듯이 그냥 보기에도 데이터가 듬성듬성한게 nan 값이 참 많게 생겼다.

 

지금부터 nan 값을 세아려 볼 것이다.

 

 

오래간만에 보는 귀여운 값들이 톡 튀어나왔다.

 

결측값은 총 1214개이고, guinea column의 결측값은 29개이다.

 

 

 

Dropna method

 

isnull 이외에 dropna를 이용해서 결측값을 세아리는 방법도 있다.

 

value_count로 고유값의 개수를 세아려주고, dropna를 통해서 결측값의 개수도 세아려 준다.

원래 dropna의 본래 사용법은 결측값을 제거하는데 사용하는 것이다.

dropna매서드에 axis 값을 정해주면 원하는 방향으로 누락값 제거가 가능하다.

 

 

 

결측값 채우기

 

누락값 채우기를 할 때 사용하는 매서드는 fillna이다.

 

fillna를 사용해서 누락값을 채울 시에는 모든 값이 파라미터 값으로 바뀐다.

 

ex) df.fillna('A')이면 nan 값이 모두 A로 대체되게 된다.

 

혹은 ffill, bfill이라는 값을 사용해주게 되면, 각각 위의 값 복사, 아래의 값 복사를 해서 데이터를 채워넣는다.

2번째 출력값에서는 상위의 값이 존재하지 않기 때문에 NaN으로 출력이 된 것이다.

그리고 interpolate는 위아래의 평균값을 누락값에 채워넣어준다. 같은 이유로 NaN값이 출력된 것이다.


이상으로 pandas에 대한 정리를 마친다 ㅠㅠ

 

정말 배울 것이 많고 힘들지만 필수적이라는게 공부를 할 수록 느껴지는 것 같다......

 

20-6-27

'데이터 분석 > 파이썬' 카테고리의 다른 글

데이터 시각화 그래프  (0) 2021.06.29
numpy 라이브러리  (0) 2021.03.23
판다스를 이용한 데이터 정제  (0) 2020.06.17
셀레니움을 이용한 웹크롤링(Web crawling)  (0) 2020.06.03
엑셀 심화  (0) 2020.06.02

오늘은 판다스(pandas) 라이브러리를 이용한 데이터 정제를 반드시 정리할 것이다.

 

우선

 

판다스란?:

파이썬에서 사용하는 데이터 분석 라이브러리로 행과 열로 이루어진 데이터 객체를 만들어서 다룰 수 있으며 안정적으로 큰 용량의 데이터를 처리하는데 유용하게 쓰인다.

 

판다스는 처리 속도가 빠른 편은 아니지만 많은 사람들이 이용하고 있는 라이브러리이다. 속도가 느림에도 애용하는 이유는 다음과 같다.

 

1. 러닝커브가 낮다.

2. python universe에 속한다.

3. 디버깅하기 편하다.

4. 빠른 시각화가 가능하다.

 

판다스의 기본 개념으로는 Series와 DataFrame이 있는데 이는 위에서 말한 행과 열로 이루어진 데이터 객체들의 명칭이다. 판다스를 다루기 위해서는 이에 대한 이해가 불가결 하므로 설명을 하고 넘어가도록 하겠다.

 

-Series:

딕셔너리 같은 형태로 1:1 대응을 이루며 index와 values를 가진다.

 

 

출력시에 위와 같은 형태로 출력되고 지정해준 숫자가 아닌 앞에 나와있는 0-3의 숫자는 index에 해당된다.

index 값 역시 다음과 같이 선언해줌으로써 변경할 수 있다.

 

 

 

딕셔너리 처럼 1:1 대응을 이룰 수 있음을 알 수 있다. 단지 모양만 닮아있는 것이 아니라, 딕셔너리로 선언해 줄수도 있다.

 

ex) data = { 'A' : 4, 'B' : 5, 'C' : 6, 'D': 7}

     ser = pd.Series(data)

 

또 series에는 name과 index name을 붙여줄 수 있는데, 방법은 아주 간단하므로 적어놓고 넘어가겠다.

 

ex) ser.name = 'PhyJun'

     ser.index.name = 'Grade'

 

위를 출력하면 dtype에 series의 name이 출력되고 index 위에 Grade가 표시된다.

 

 

 

 

-DataFrame:

DataFrame은 Series보다 한 단계 높은 개념으로 이해하면 쉽다. 실제로 DataFrame의 사용빈도가 Series보다 높고 활용도도 높다.

 

Series와 마찬가지로 행과 열의 구조를 가지지만, 선언에서부터 Series보다 알아보기 쉬운 형태이다.

 

 

 

 

 

 

기본 데이터를 딕셔너리형으로 작성해준 후에 출력은 행렬으로 만들어준다.

 

Series와 마찬가지로 index와 name을 선언해줄 수 있으며, DataFrame 안에 존재하지 않는 값에 대해서는 누락값(NaN)으로 표시된다.

 

DataFrame에서는 각 열을 선택해서 조작할 수 있으며, 추가적으로 Series를 넣어줄 수 있다.

 

 

 

여기서 내가 해주고 싶은 말은, 위의 방법으로 indexing을 해주는 것은 pandas 내에 존재하는 수많은 방법중 하나이다. 

 

물론 위의 방법으로도 원하는 결과를 불러올 수 있지만, 내가 추천하는 방법은 아래의 방법이다.

 

.loc함수 / .iloc함수

 

기본적으로 같은 함수열에 속하지만, loc은  단위 번호를 기준으로, iloc은 index 단위 번호를 기준으로 추출할 때 사용된다.

 

 

 

 

(일일이 출력하고 찍기 귀찮아서 주피터 노트북을 썼다..)

 

loc을 사용해서 단일 열을 출력할 시에는 Series형태로 출력이 된다. 

 

iloc의 경우는 index번호를 사용해주면 된다.

 

ex) df.iloc[3:5, 0:2]

 

loc과 iloc은 기준이 되는 것이 뚜렷하고 출력을 할 때에 가독성이 좋기 때문에 애용하는 편이다.

 

loc과 iloc을 구분하기 쉽게 말하자면, loc은 이름을 기준으로 선택을 하고, iloc은 위치를 기준으로 선택을 한다고 생각하면 편하다.

 

 


자.. 기나긴 서론을 지나서 본론으로 들어가보자.

 

우리가 판다스를 하는 이유는 데이터를 정제하기 위해서다.

 

데이터정제란 또 무엇인가?

 

데이터를 다루다보면 의미없는 값이나 null(빈값)이 나오기도 한다. 데이터 정제는 이런 값들을 걸러내거나 의미있는 값으로 변환하기 위한 과정이다.

 


 

데이터를 확인하기 위한 매서드는 다음과 같다.

변수 = pd.read_csv('파일 위치')  
.head()   # 맨 앞의 자료 가져오기(기본적으로 상위 5개의 목록을 가져오지만 괄호 안의 숫자에 따라 정해진다.)
.tail() 
.sort_index() # 행과 열 이름을 정렬해서 나타낸다.
정렬은 axis를 이용한다. 
axis = 0 은 index 기준 ( = axis)
axis = 1 은 column 기준
.describe()  # 간단한 통계를 보여준다. 컬럼별로 count, mean, std, min, 25%, 50%, 75%, max들의 정보를 알 수 있다.

 

이외에도 .values .columns .index .dtype과 같은 속성들도 많다.

 


 

이제부터 데이터를 다루는 과정을 배우게 될 것이다.

 

이 과정을 하기 위해서는 준비된 파일이 tsv파일이 필요한데 이는 내가 공부할 때 파일을 제공받은 것을 기준으로 진행될 것이고 첨부도 해 놓겠다.

 

data.zip
0.10MB

 

우선 데이터를 추출하는 과정을 예시로 한번 보자.

 

 

gapminder라는 파일을 불러와서 country라는 이름을 가진 index를 country_df에 저장하고, head함수를 통해서 상위 country의 상위 5개 항목을 추출해 낼 것이다.

 

subset 변수에는 3개의 index를 가져와서 head를 적용해보겠다.

 

 

 

 

원하는 것 처럼 출력이 잘 된것을 볼 수 있다.

 

배운 것을 조금 써서 예시로 들면,

 

 

 

range가 헷갈릴 수 있으므로 살짝 설명을 하면, range(a, b, c) => a부터 c 숫자만큼의 간격으로 b-1까지의 정수를 반환한다.

따라서 range(0, 6, 2)는 2만큼의 간격을 두고 5까지 정수를 반환하니, 0, 2, 4를 반환한다.

 

=> iloc(mydf.iloc[10:20, [0, 2, 4]]) 와 같다고 볼 수 있는것이다.

 

출력결과는 사진에 담기 좀 많아서 직접해보는 것을 추천하고 넘어간다!

 


데이터를 분류하다보면, 비슷하지만 따로 구분되어 있는 데이터들이 있는데 이건 groupby 매서드를 통해서 묶어줄 수 있다.

 

 

 

groupby를 사용해서 year과 continent를 기준으로 데이터를 묶었다. 

 

출력을 원하는 값은 lifeExp와 gdpPercap 각각의 평균이다.

 

출력을 하게 된다면 아마 각 나라별 연도마다의 lE와 gPc을 구해줄 것이다.

 

 

 

데이터량이 많아서 짜르긴 했지만 위에서 언급한대로 잘 출력되었다. 

 

평균 이외의 것들도 구할 수 있는데 그건 아래의 표를 참고해서 작성해보도록 하자.

함수

설명

Sum()

합계

Count()

개수

Median()

중간값

Quantile([0.1, 0.9])

분위값

Min()

최소값

Max()

최대값

Mean()

평균

Var()

각 객체의 분산 값

Std()

각 객체의 표준편차

Nunique()

유니크의 개수


데이터 정제에 관한 내용은 상당히 많고 어렵기 때문에 한번에 정리하고자 했던건 내 욕심이라는 것을 깨달았다..

 

아직 정리해야할 내용이 많지만 한번에 너무 많이 정리하면 사실 정리의 의미를 잃으므로 이까지 정리하고 다음에 또 정리해서 올리도록 하겠다.

'데이터 분석 > 파이썬' 카테고리의 다른 글

numpy 라이브러리  (0) 2021.03.23
pandas 데이터 정제 (2)  (0) 2020.06.27
셀레니움을 이용한 웹크롤링(Web crawling)  (0) 2020.06.03
엑셀 심화  (0) 2020.06.02
파이썬 csv 사용하여 엑셀파일 다루기  (0) 2020.05.30