본문 바로가기
Lecture/파이썬으로 만드는 AI 오델로 게임

4. 파이썬을 이용한 데이터 과학 소개(part 2)

by 작은별하나 2024. 11. 20.
반응형

3. Pandas

 

Pandas는 Python에서 데이터를 분석하고 조작하기 위한 강력한 라이브러리로, 행과 열로 이루어진 구조화된 데이터를 처리하는 데 최적화되어 있습니다. 주요 데이터 구조로는 1차원 데이터를 다루는 Series와 2차원 테이블 형태의 데이터를 다루는 DataFrame이 있습니다. 이 데이터 구조는 데이터베이스의 테이블이나 스프레드시트와 유사해 직관적으로 사용할 수 있습니다.

 

data science


Pandas는 다양한 데이터 포맷을 지원하며, CSV, Excel, SQL, JSON 등 여러 소스의 데이터를 손쉽게 읽고 쓸 수 있습니다. 또한 데이터를 정렬하거나 필터링할 수 있는 인덱스 기능과 그룹화, 피벗 테이블 생성, 데이터 병합과 같은 고급 데이터 조작 기능을 제공합니다. 결측치 처리나 중복 제거 같은 데이터 정제 작업도 간단히 수행할 수 있으며, 시계열 데이터와 같은 특정 유형의 데이터를 다룰 때도 적합한 도구를 제공합니다.

Python의 간결한 문법을 기반으로 하여 사용하기 쉽고, 다른 데이터 분석 및 시각화 도구와의 호환성이 좋아 데이터 탐색이 용이합니다. NumPy를 기반으로 동작하기 때문에 대량 데이터를 안정적으로 처리할 수 있는 성능을 갖추고 있으며, 다양한 분석 라이브러리와 통합해 확장성이 뛰어납니다. 다만, 메모리 사용량이 많아질 수 있고 기본적으로 단일 스레드로 작동하기 때문에 대규모 데이터 처리나 병렬 처리에서는 한계가 있을 수 있습니다.

Pandas는 데이터 분석의 기본부터 고급 작업까지 폭넓게 활용할 수 있는 필수 도구입니다. 사용이 간편하면서도 강력한 기능을 제공해 데이터 과학, 머신 러닝, 통계 분석 등 다양한 분야에서 핵심적인 역할을 합니다.

 

Pandas는 데이터를 다루기 위해 두 가지 주요 컨테이너인 Series와 DataFrame을 제공합니다. Series는 1차원 데이터를 다루는 구조로, 각 데이터 항목에 고유한 인덱스를 부여하여 쉽게 접근할 수 있습니다. 반면, DataFrame은 2차원 구조로 행과 열로 이루어진 테이블 형태를 가지며, 엑셀 시트나 데이터베이스의 테이블처럼 구조화된 데이터를 표현합니다.

이 두 컨테이너의 주요 특징은 단순하거나 계층적인 인덱싱을 지원한다는 점입니다. 단순 인덱싱은 기본적인 행 또는 열 단위의 데이터 접근을 가능하게 하고, 계층적 인덱싱은 다중 레벨의 데이터 구조를 처리할 수 있어 복잡한 데이터를 효율적으로 다룰 수 있습니다. 또한, Pandas는 결측치 처리를 손쉽게 할 수 있는 기능을 제공하여 데이터 분석 과정에서 자주 발생하는 문제를 해결합니다.

Pandas의 또 다른 강점은 데이터 연산과 관련된 기능입니다. 전체 열이나 테이블에 대해 사칙연산과 논리 연산을 수행할 수 있으며, 데이터베이스 스타일의 연산도 지원합니다. 예를 들어, 테이블 병합, 그룹화, 필터링 등 데이터베이스에서 제공하는 작업을 유사한 방식으로 처리할 수 있습니다. 이와 더불어, 단일 열 또는 전체 테이블을 손쉽게 시각화할 수 있는 기능을 제공하여 데이터를 탐색하고 인사이트를 얻는 과정을 더 빠르고 직관적으로 만듭니다.

마지막으로, Pandas는 다양한 파일 형식에서 데이터를 읽고 쓸 수 있는 유연성을 제공합니다. CSV, Excel, JSON, SQL 등 다양한 데이터 소스를 손쉽게 불러오고, 가공한 데이터를 다시 저장할 수 있어 데이터 처리의 시작부터 끝까지 모든 과정을 지원합니다. 이를 통해 Pandas는 데이터 분석과 관리에서 강력한 도구로 자리 잡고 있습니다.

 

Pandas의 Series는 1차원 데이터 벡터를 표현하는 데이터 구조로, 실제로는 NumPy 배열을 내부적으로 사용합니다. Series는 각 요소에 인덱스를 부여하여 데이터를 관리하며, 모든 요소는 동일한 데이터 타입을 가져야 합니다. 리스트, 튜플, 배열, 딕셔너리 등 시퀀스 형태의 데이터를 사용해 간단히 Series를 생성할 수 있습니다.

Series는 데이터를 생성할 때 자동으로 정수형 인덱스를 부여하며, 사용자가 필요에 따라 인덱스를 수정할 수도 있습니다. 예를 들어, pd.Series((2.2, 3.4, 2.8, 1.6, 2.3, 1.5))와 같은 방식으로 간단히 생성이 가능합니다. 이처럼 Series는 NumPy 배열처럼 동작하면서도 인덱스 기반으로 데이터를 조회하거나 조작할 수 있는 추가적인 유연성을 제공합니다.

Series에서 데이터의 갯수는 len() 함수를 통해 확인할 수 있으며, 값은 values 속성을, 인덱스는 index 속성을 통해 접근할 수 있습니다. 예를 들어, inflation.values는 Series의 값들을 반환하며, inflation.index는 Series의 인덱스 정보를 반환합니다. 이러한 기능 덕분에 Series는 데이터 분석 작업에서 간단한 데이터 관리와 처리에 매우 유용하게 사용됩니다.

 

다음은 Pandas의 Series를 활용하는 예제입니다. 이 예제를 통해 Series의 생성, 속성 확인, 기본적인 사용법을 이해할 수 있습니다.

import pandas as pd

# 1차원 데이터로 Series 생성
inflation = pd.Series([2.2, 3.4, 2.8, 1.6, 2.3, 1.5])

# Series 출력
print("Series 출력:")
print(inflation)

# 데이터 갯수 확인
print("\n데이터 갯수 (len):", len(inflation))

# 값과 인덱스 확인
print("\nSeries 값 (values):", inflation.values)
print("Series 인덱스 (index):", inflation.index)

# 특정 값에 접근 (인덱스 사용)
print("\n첫 번째 값:", inflation[0])  # 인덱스를 통해 값 접근
print("세 번째 값:", inflation[2])

# 자동 인덱싱을 사용하지 않고 사용자 정의 인덱스 추가
months = pd.Series(
    [2.2, 3.4, 2.8, 1.6, 2.3, 1.5],
    index=["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
)

print("\n사용자 정의 인덱스가 있는 Series:")
print(months)

# 특정 인덱스를 사용하여 값 접근
print("\n'Feb'에 해당하는 값:", months["Feb"])



실행 결과

Series 출력:
0    2.2
1    3.4
2    2.8
3    1.6
4    2.3
5    1.5
dtype: float64

데이터 갯수 (len): 6

Series 값 (values): [2.2 3.4 2.8 1.6 2.3 1.5]
Series 인덱스 (index): RangeIndex(start=0, stop=6, step=1)

첫 번째 값: 2.2
세 번째 값: 2.8

사용자 정의 인덱스가 있는 Series:
Jan    2.2
Feb    3.4
Mar    2.8
Apr    1.6
May    2.3
Jun    1.5
dtype: float64

'Feb'에 해당하는 값: 3.4


설명

1. 기본적으로 Pandas는 정수형 인덱스를 자동으로 생성합니다.
2. values 속성은 Series의 데이터 값들을 배열 형태로 반환합니다.
3. index 속성은 인덱스 정보를 제공합니다.
4. 기본 정수형 인덱스 외에 사용자 정의 인덱스를 추가해 데이터에 의미를 부여할 수 있습니다.
5. 정의된 인덱스를 사용하면 months["Feb"]와 같이 데이터를 접근할 수 있습니다.

이처럼 Pandas Series는 간단한 데이터 구조로, NumPy 배열처럼 빠르면서도 추가적인 기능을 제공합니다.

 

Pandas Series 인덱스는 기본 정수형 인덱스 외에 사용자가 지정한 맞춤형 인덱스를 지원하며, 딕셔너리 데이터 구조나 별도의 설정을 통해 쉽게 지정할 수 있습니다. 아래는 인덱스를 다루는 방법과 예제입니다.

1. 딕셔너리를 사용한 인덱스 지정

딕셔너리를 활용하면 자동 인덱싱 없이 원하는 키를 인덱스로 지정할 수 있습니다. 딕셔너리의 키는 Series의 인덱스가 되고, 값은 데이터로 설정됩니다.

import pandas as pd

# 딕셔너리로 Series 생성
inflation = pd.Series({1999: 2.2, 2000: 3.4, 2001: 2.8, 2002: 1.6, 2003: 2.3})
print("딕셔너리를 사용한 Series:")
print(inflation)


결과:

1999    2.2
2000    3.4
2001    2.8
2002    1.6
2003    2.3
dtype: float64


2. 기존 데이터에 인덱스 재지정

Series를 생성한 후 index 속성을 사용해 새롭게 인덱스를 재설정할 수 있습니다. 이를 통해 기존 데이터에 새로운 의미를 부여할 수 있습니다.

import numpy as np

# 기본 정수형 인덱스로 Series 생성
inflation = pd.Series([2.2, 3.4, 2.8, 1.6, 2.3])

# 새로운 인덱스 설정
inflation.index = pd.Index(range(1999, 2004))
print("새로운 인덱스 설정 후:")
print(inflation)


결과:

1999    2.2
2000    3.4
2001    2.8
2002    1.6
2003    2.3
dtype: float64


3. 추가 데이터 삽입

새로운 인덱스를 추가할 수도 있습니다. 예를 들어, 위의 데이터에 2020년 데이터를 추가하고 결측값(NaN)으로 처리할 수 있습니다.

# 새로운 데이터 추가
inflation[2020] = np.nan
print("2020년 데이터 추가:")
print(inflation)


결과:

1999    2.2
2000    3.4
2001    2.8
2002    1.6
2003    2.3
2020    NaN
dtype: float64


설명

1. 딕셔너리로 생성 시 키가 인덱스로 자동 설정되므로 명시적인 인덱스 정의가 필요 없습니다.
2. index 속성을 사용하면 기존 Series에 새로운 인덱스를 지정할 수 있습니다.
3. 새로운 인덱스를 추가할 때 Pandas는 기존 데이터와 맞지 않는 경우 결측값(NaN)으로 처리합니다.

이처럼 Pandas의 Series 인덱스는 데이터에 의미를 부여하고, 데이터 접근 및 조작을 쉽게 만들어주는 중요한 도구입니다.

 

Pandas Series는 인덱스와 값에 각각 이름을 설정할 수 있습니다. 이를 통해 데이터에 의미를 부여하고, 데이터 출력 시 더 명확하고 읽기 쉬운 결과를 제공할 수 있습니다.

1. 시리즈 인덱스 이름 설정

Series의 index.name 속성을 사용하여 인덱스에 이름을 지정할 수 있습니다. 이는 데이터 테이블에서 행 레이블에 해당합니다.

import pandas as pd

# Series 생성
inflation = pd.Series([2.2, 3.4, 2.8, 1.6, 2.3], index=[1999, 2000, 2001, 2002, 2003])

# 인덱스 이름 설정
inflation.index.name = "Year"

print("인덱스 이름 설정 후:")
print(inflation)


결과:

Year
1999    2.2
2000    3.4
2001    2.8
2002    1.6
2003    2.3
dtype: float64


2. 시리즈 값 이름 설정

Series의 name 속성을 사용하여 데이터 값 자체에 이름을 부여할 수 있습니다. 이는 데이터 열(column)의 레이블에 해당합니다.

 

# 값 이름 설정
inflation.name = "%"

print("\n값 이름 설정 후:")
print(inflation)


결과:

Year
1999    2.2
2000    3.4
2001    2.8
2002    1.6
2003    2.3
Name: %, dtype: float64


3. 인덱스와 값 이름을 함께 설정

인덱스 이름과 값 이름을 모두 설정하면 Series가 보다 직관적으로 표현됩니다.

# 인덱스와 값 이름 설정
inflation.index.name = "Year"
inflation.name = "%"

print("\n인덱스와 값 이름 설정 후:")
print(inflation)


결과:

Year
1999    2.2
2000    3.4
2001    2.8
2002    1.6
2003    2.3
Name: %, dtype: float64


설명

• index.name은 인덱스(행 레이블)에 이름을 부여합니다. 출력 시 인덱스 상단에 해당 이름이 표시됩니다.
• name은 Series 자체 또는 값의 이름을 나타냅니다. 출력 시 하단에 열 이름처럼 표시됩니다.

이러한 설정은 데이터의 의미를 명확히 하고, 분석 과정에서 데이터를 더 잘 설명할 수 있도록 돕는 역할을 합니다.

 

Pandas에서 제공하는 head()tail() 메서드는 데이터의 일부를 빠르게 확인할 수 있는 유용한 도구입니다. 이 메서드들은 데이터의 크기가 크거나 내용을 간단히 확인하고 싶을 때 유용하게 사용됩니다.

1. head()

• 데이터의 상위 5개 행을 기본으로 반환합니다.
• 데이터가 5개보다 적으면 모든 데이터를 반환합니다.
• head(n) 형식으로 사용하면, 반환할 행의 개수 n을 지정할 수 있습니다.

예제:

import pandas as pd

# Series 생성
data = pd.Series([2.2, 3.4, 2.8, 1.6, 2.3, 1.5, 3.1, 2.9])

# 상위 5개 데이터 출력
print("head() 결과:")
print(data.head())

# 상위 3개 데이터 출력
print("\nhead(3) 결과:")
print(data.head(3))


결과:

head() 결과:
0    2.2
1    3.4
2    2.8
3    1.6
4    2.3
dtype: float64

head(3) 결과:
0    2.2
1    3.4
2    2.8
dtype: float64


2. tail()

• 데이터의 하위 5개 행을 기본으로 반환합니다.
• 데이터가 5개보다 적으면 모든 데이터를 반환합니다.
• tail(n) 형식으로 사용하면, 반환할 행의 개수 n을 지정할 수 있습니다.

예제:

# 하위 5개 데이터 출력
print("\ntail() 결과:")
print(data.tail())

# 하위 3개 데이터 출력
print("\ntail(3) 결과:")
print(data.tail(3))


결과:

tail() 결과:
3    1.6
4    2.3
5    1.5
6    3.1
7    2.9
dtype: float64

tail(3) 결과:
5    1.5
6    3.1
7    2.9
dtype: float64


요약

• head(): 데이터의 상위 n개를 반환하며, 기본값은 5개입니다.
• tail(): 데이터의 하위 n개를 반환하며, 기본값은 5개입니다.
• 큰 데이터를 처리할 때, head()와 tail()을 사용해 데이터를 빠르게 탐색하고 필요한 부분만 확인할 수 있습니다.

 

Pandas의 데이터프레임(DataFrame)은 레이블이 붙은 행(row)과 열(column)로 구성된 2차원 데이터 구조로, 엑셀 시트나 데이터베이스의 테이블과 유사합니다. 데이터프레임은 다양한 데이터 형식으로 생성 가능하며, 데이터 분석과 조작에 적합한 강력한 기능을 제공합니다.

데이터프레임 생성 방법

1. 딕셔너리를 사용한 생성
딕셔너리를 사용하면 키가 열(column)의 이름이 되고, 값이 열에 해당하는 데이터로 사용됩니다. 예를 들어, 연도별 데이터를 데이터프레임으로 생성하려면 아래와 같이 작성할 수 있습니다.

import pandas as pd

# 딕셔너리를 사용한 데이터프레임 생성
data = pd.DataFrame({
    2010: [1.3, 2.4, 3.1],
    2011: [1.4, 2.5, 2.7],
    2019: [1.8, 2.1, 2.1]
})

print("데이터프레임 생성:")
print(data)


결과:

    2010  2011  2019
0   1.3   1.4   1.8
1   2.4   2.5   2.1
2   3.1   2.7   2.1


2. 딕셔너리를 사용해 인덱스 지정
딕셔너리의 키를 인덱스 레이블로, 값을 각 열(column)의 값으로 지정할 수도 있습니다.

data = pd.DataFrame({
    "Year": [2010, 2011, 2019],
    "Value1": [1.3, 1.4, 1.8],
    "Value2": [2.4, 2.5, 2.1]
})
data.set_index("Year", inplace=True)

print("인덱스를 지정한 데이터프레임:")
print(data)


결과:

      Value1  Value2
Year                
2010    1.3    2.4
2011    1.4    2.5
2019    1.8    2.1


3. CSV 파일을 읽어서 데이터프레임 생성
CSV 파일을 읽어와 데이터프레임으로 변환할 수도 있습니다. 이 과정에서 특정 컬럼을 인덱스로 설정하거나, 사용할 컬럼을 선택할 수 있습니다.

# 예제: CSV 파일 읽기
data = pd.read_csv("example.csv", index_col="Year", usecols=["Year", "Value1", "Value2"])

print("CSV 파일로부터 데이터프레임 생성:")
print(data)


매개변수 설명:
• csv file name: CSV 파일 이름
• index_col: 데이터프레임의 인덱스로 사용할 컬럼 이름
• usecols: CSV 파일에서 사용할 열 목록 (리스트 형태)

데이터프레임의 장점

• 구조화된 데이터 처리: 행과 열 단위로 데이터를 조작할 수 있어 직관적입니다.
• 다양한 데이터 소스 지원: CSV, Excel, SQL, JSON 등 다양한 소스에서 데이터를 불러와 분석할 수 있습니다.
• 다양한 생성 방식: NumPy 배열, 리스트, 딕셔너리 등 다양한 형식으로 데이터프레임을 쉽게 생성할 수 있습니다.

데이터프레임은 데이터 분석과 조작을 위한 기본 단위로, Pandas의 가장 강력한 도구 중 하나입니다. 데이터를 시각적이고 논리적으로 구성하며, 데이터를 효율적으로 탐색하고 가공할 수 있습니다.

 

Pandas에서는 데이터를 더 직관적으로 다루기 위해 행과 열에 레이블을 붙이고, 필요에 따라 인덱스나 열 이름을 변경하거나 구조를 조정할 수 있습니다. 이를 통해 데이터 탐색과 조작이 훨씬 쉬워지며, 재인덱싱(reindexing)과 구조 변경을 통해 데이터를 원하는 형태로 가공할 수 있습니다.

1. 데이터 레이블링

• 행과 열에 레이블을 설정
데이터프레임은 행(인덱스)과 열에 레이블을 부여하여 데이터를 의미 있게 표현합니다. 행 인덱스는 숫자, 문자열, 날짜 등으로 설정할 수 있으며, 열 이름도 마찬가지로 원하는 레이블로 설정할 수 있습니다.

예제:

import pandas as pd

# 데이터프레임 생성
data = pd.DataFrame({
    "Temperature": [30, 25, 27],
    "Humidity": [60, 65, 55]
}, index=["Monday", "Tuesday", "Wednesday"])

print("데이터 레이블링 예제:")
print(data)


결과:

            Temperature  Humidity
Monday              30        60
Tuesday             25        65
Wednesday           27        55


여기서 인덱스는 “Monday”, “Tuesday”, “Wednesday”로 레이블링되어 있고, 열 이름은 “Temperature”와 “Humidity”로 설정되어 있습니다.

2. 재인덱싱 (Reindexing)

• 행 인덱스를 변경
새로운 인덱스를 지정하거나 기존 데이터를 다른 방식으로 정렬할 수 있습니다. 재인덱싱 시 기존 데이터와 새 인덱스가 일치하지 않으면 결측값(NaN)으로 채워집니다.

예제:

# 새로운 인덱스로 재인덱싱
new_index = ["Monday", "Tuesday", "Thursday"]
reindexed_data = data.reindex(new_index)

print("\n재인덱싱 후:")
print(reindexed_data)


결과:

          Temperature  Humidity
Monday            30.0      60.0
Tuesday           25.0      65.0
Thursday           NaN       NaN


• 열을 기준으로 재인덱싱
열 이름을 변경하거나 데이터에서 일부 열만 선택할 수도 있습니다.

예제:

reindexed_columns = data.reindex(columns=["Humidity", "Temperature"])
print("\n열 기준 재인덱싱:")
print(reindexed_columns)


결과:

            Humidity  Temperature
Monday            60           30
Tuesday           65           25
Wednesday         55           27


3. 데이터 레이블 구조 변경

• 인덱스와 열의 전환 (Transpose)
데이터프레임의 행과 열을 바꿀 수 있습니다.

예제:

transposed_data = data.T
print("\n데이터 전환 (Transpose):")
print(transposed_data)


결과:

              Monday  Tuesday  Wednesday
Temperature       30       25         27
Humidity          60       65         55


• 다중 레벨 인덱스 설정 (Hierarchical Indexing)
여러 레벨의 인덱스를 설정하여 계층적으로 데이터를 정리할 수 있습니다.

예제:

multi_index_data = data.set_index([data.index, ["Hot", "Warm", "Warm"]])
multi_index_data.index.names = ["Day", "Condition"]

print("\n다중 레벨 인덱스:")
print(multi_index_data)


결과:

                     Temperature  Humidity
Day       Condition                      
Monday    Hot                30        60
Tuesday   Warm               25        65
Wednesday Warm               27        55


요약

• 데이터 레이블링: 행과 열에 의미 있는 이름을 설정하여 데이터를 직관적으로 다룰 수 있습니다.
• 재인덱싱: 기존 데이터를 새로운 인덱스나 열 이름으로 재구성하거나 필터링할 수 있습니다.
• 구조 변경: 데이터를 전환하거나 다중 레벨로 구성하여 복잡한 데이터 구조를 표현할 수 있습니다.

Pandas의 레이블링과 구조 변경 기능은 데이터를 원하는 형태로 가공하여 보다 쉽게 분석하고 조작할 수 있도록 도와줍니다.

 

Pandas를 사용해 데이터를 가져오고, 특정 열과 행을 조작하거나 조건에 따라 데이터를 필터링하는 방법은 매우 직관적이고 강력합니다. 아래는 주어진 내용을 자세히 설명한 내용입니다.

1. 데이터 가져오기

Pandas의 pd.read_csv() 메서드를 사용해 CSV 파일로부터 데이터를 읽어옵니다. 이 과정에서 index_col을 지정하면 특정 열을 데이터프레임의 인덱스로 설정할 수 있습니다.

import pandas as pd

# CSV 파일 읽기 (예제)
cv = pd.read_csv("example.csv", index_col="country")

# 데이터 확인
print(cv.head())


이 코드는 "country" 열을 인덱스로 사용하며, 데이터를 데이터프레임 cv에 저장합니다.

2. 데이터프레임의 컬럼과 인덱스 확인

• cv.columns: 데이터프레임의 모든 컬럼 이름(열 레이블)을 반환합니다.
• cv.index: 데이터프레임의 인덱스(행 레이블) 값을 반환합니다.

# 컬럼과 인덱스 확인
print("컬럼 인덱스:", cv.columns)
print("행 인덱스:", cv.index)


3. 인덱스 재설정

기존 인덱스를 제거하고 새로운 열(예: “year”)을 인덱스로 설정할 수 있습니다. reset_index()는 기존 인덱스를 제거한 데이터프레임을 반환하며, 이후 set_index()를 사용해 새 인덱스를 설정합니다.

# 인덱스 재설정 및 새로운 인덱스 설정
cv_reset = cv.reset_index().set_index("year")

print("\n새로운 인덱스 'year'로 설정한 데이터프레임:")
print(cv_reset.head())


4. 특정 인덱스 값 접근

• cv.loc[]: 특정 인덱스 레이블에 해당하는 데이터를 반환합니다.
• cv.iloc[]: 특정 위치(정수 기반 인덱스)의 데이터를 반환합니다.

# 특정 인덱스 접근
south_korea_data = cv.loc["South_Korea"]
print("\n'South_Korea'에 대한 데이터:")
print(south_korea_data)

# 특정 위치 접근
third_row = cv.iloc[3]
print("\n세 번째 행의 데이터:")
print(third_row)


5. 조건에 따른 필터링

특정 조건에 맞는 데이터를 필터링할 때는 조건식을 사용합니다. 예를 들어, 인구가 1천만 명 이상인 나라를 필터링하려면 다음과 같이 작성합니다.

# 인구가 1천만 명 이상인 나라 확인
large_population = cv["population"] >= 1e7
print("\n인구가 1천만 이상인 나라에 대한 참/거짓 값:")
print(large_population)

# 조건을 만족하는 데이터 추출
filtered_data = cv[large_population]
print("\n인구가 1천만 이상인 나라들:")
print(filtered_data)


6. 특정 인덱스 값 존재 여부 확인

특정 값이 데이터프레임의 인덱스에 존재하는지 확인하려면 in 연산자를 사용합니다.

# 특정 인덱스 값 존재 여부 확인
exists = "South_Korea" in cv.index
print("\n'South_Korea'가 인덱스에 있는가?", exists)


정리

• 데이터 가져오기: pd.read_csv()를 통해 데이터를 읽어오고 index_col로 인덱스를 지정할 수 있습니다.
• 컬럼 및 인덱스 확인: cv.columns와 cv.index로 데이터프레임의 레이블 정보를 확인합니다.
• 인덱스 조작: reset_index()와 set_index()로 인덱스를 변경하거나 초기화합니다.
• 데이터 접근: loc[]와 iloc[]로 레이블이나 위치를 기반으로 데이터에 접근합니다.
• 조건 필터링: 조건식을 사용해 데이터를 필터링하거나 특정 조건을 만족하는 행을 추출할 수 있습니다.
• 존재 여부 확인: in 연산자를 사용해 특정 값이 인덱스에 존재하는지 검사합니다.

이러한 기능은 데이터를 탐색하고 가공하는 데 필수적이며, 다양한 분석 작업에서 유용하게 활용됩니다.

 

데이터 분석 과정에서는 데이터를 단순히 나열하는 것을 넘어, 정렬, 순위 계산, 카운팅, 멤버십 테스트 및 기술 통계와 같은 작업을 통해 데이터를 요약하고 의미 있는 정보를 추출합니다. Pandas는 이를 효율적으로 수행하기 위한 다양한 메서드와 옵션을 제공합니다.

1. 데이터 정렬

인덱스를 기준으로 정렬 (sort_index)

데이터의 인덱스를 기준으로 데이터를 정렬할 수 있습니다. 기본적으로 오름차순(ascending)으로 정렬되며, 옵션을 사용해 내림차순으로도 정렬 가능합니다.

import pandas as pd

# 예제 데이터프레임
data = pd.DataFrame({
    "value": [10, 20, 15, 30],
}, index=["d", "b", "a", "c"])

# 인덱스 기준 정렬 (기본 오름차순)
sorted_data = data.sort_index()
print("인덱스 기준 오름차순 정렬:\n", sorted_data)

# 인덱스 기준 내림차순 정렬
sorted_data_desc = data.sort_index(ascending=False)
print("\n인덱스 기준 내림차순 정렬:\n", sorted_data_desc)


옵션 설명:
• ascending: 정렬 방향 (True: 오름차순, False: 내림차순)
• inplace: True로 설정 시 원본 데이터프레임이 변경됨.

열을 기준으로 정렬 (sort_values)

특정 열의 값을 기준으로 데이터를 정렬합니다.

# 값 기준 정렬
sorted_by_value = data.sort_values("value")
print("\n값 기준 오름차순 정렬:\n", sorted_by_value)


2. 순위 계산

데이터의 순위를 계산하려면 rank() 메서드를 사용합니다. 순위는 기본적으로 오름차순으로 부여되며, 동일한 값을 가진 항목은 평균 순위를 갖습니다.

# 순위 계산
data["rank"] = data["value"].rank()
print("\n값의 순위:\n", data)


3. 카운팅

데이터에서 특정 값의 빈도를 계산하거나 요약하려면 value_counts()를 사용합니다.

# 값의 빈도 계산
counts = data["value"].value_counts()
print("\n값의 빈도:\n", counts)


4. 멤버십 테스트

특정 값이 데이터프레임에 존재하는지 확인하려면 isin()이나 in 연산자를 사용할 수 있습니다.

# 멤버십 테스트
is_member = data.index.isin(["a", "c"])
print("\n특정 인덱스가 데이터에 존재하는지 확인:\n", is_member)


5. 기술 통계 (Descriptive Statistics)

Pandas는 데이터를 요약하고 통계를 계산하기 위한 다양한 함수를 제공합니다.
• sum(): 합계
• mean(): 평균
• median(): 중앙값
• std(): 표준편차
• count(): 데이터 개수
• min(): 최소값
• max(): 최대값

# 기술 통계 계산
print("\n데이터 합계:", data["value"].sum())
print("데이터 평균:", data["value"].mean())
print("데이터 중앙값:", data["value"].median())
print("데이터 표준편차:", data["value"].std())
print("데이터 개수:", data["value"].count())
print("데이터 최소값:", data["value"].min())
print("데이터 최대값:", data["value"].max())


옵션 설명:
• skipna: True일 경우 NaN 값을 무시하고 계산.
• numeric_only: 숫자 데이터만 계산에 포함 (데이터프레임에서 사용 가능).

요약

1. 정렬: sort_index와 sort_values를 사용하여 데이터를 인덱스나 열 값을 기준으로 정렬.
2. 순위 계산: rank()로 데이터를 순위화.
3. 카운팅: value_counts()로 특정 값의 빈도를 계산.
4. 멤버십 테스트: 특정 값이나 인덱스가 데이터에 존재하는지 확인.
5. 기술 통계: sum(), mean(), median() 등으로 데이터를 요약.

이 기능들을 조합하면 데이터를 효율적으로 정리하고 분석할 수 있으며, 데이터의 패턴과 통계적 요약 정보를 쉽게 파악할 수 있습니다.

 

데이터 집계는 데이터를 분리, 적용, 결합하는 3단계 과정으로 이루어집니다. 이를 통해 데이터를 그룹화하고, 각 그룹에 대해 특정 연산을 적용한 후 결과를 다시 결합하여 분석에 유용한 형식으로 변환합니다.

1. 데이터 집계의 세 단계

1. 분리(Split): 데이터를 특정 키(key)를 기준으로 여러 그룹으로 나눕니다.
2. 적용(Apply): 각 그룹에 대해 집계 함수(예: sum(), mean() 등)를 적용합니다.
3. 결합(Combine): 집계 결과를 새로운 시리즈나 데이터프레임으로 결합합니다.

2. 데이터 그룹화 (GroupBy)

Pandas의 groupby() 메서드는 데이터를 특정 카테고리 키를 기준으로 그룹화합니다. 이후, 다양한 집계 함수를 사용하여 그룹별로 데이터를 요약할 수 있습니다.

집계 함수

• count(): 각 그룹의 행 개수를 반환
• sum(): 각 그룹의 수치형 행 합계
• mean(), median(): 평균값과 중위값
• std(), var(): 표준편차와 분산

예제:

import pandas as pd
import numpy as np

# 예제 데이터프레임 생성
data = pd.DataFrame({
    "Category": ["A", "B", "A", "B", "A", "C", "C", "B"],
    "Value": [10, 20, 30, 40, 50, 60, 70, 80]
})

# 카테고리별로 그룹화하고 집계
grouped = data.groupby("Category")

print("그룹별 합계:")
print(grouped["Value"].sum())

print("\n그룹별 평균:")
print(grouped["Value"].mean())


3. 이산화 (Discretization)

연속형 변수를 이산형(카테고리) 변수로 변환하려면 cut() 또는 qcut()을 사용합니다.

cut()

연속형 데이터를 크기가 같은 구간이나 지정된 경계를 기준으로 나눕니다.

# 연속형 데이터를 구간으로 나누기
data = pd.Series([1, 7, 5, 3, 6, 10, 8, 2])
bins = [0, 4, 8, 12]
categories = pd.cut(data, bins, labels=["Low", "Medium", "High"])

print("cut() 결과:")
print(categories)


qcut()

데이터를 분위수(quantile)를 기준으로 나눕니다.

# 연속형 데이터를 분위수로 나누기
categories_q = pd.qcut(data, 3, labels=["Low", "Medium", "High"])

print("\nqcut() 결과:")
print(categories_q)


4. 교차 집계 (Cross Tabulation)

pd.crosstab()은 그룹별로 두 카테고리 변수의 빈도를 계산해 행과 열로 구성된 데이터프레임을 반환합니다.

예제 설명

주어진 예제에서 학생들의 국어, 영어, 수학 점수가 평균 이상인지 여부를 기준으로 교차 집계를 계산합니다.

import pandas as pd
import numpy as np

# 학생 및 과목 데이터 생성
students = ["Cheolsoo", "Minsik", "Jaein", "Yeonghee", "Mansoo", "Mina"]
subjects = ["Korean", "English", "Mathematics"]
nr, nc = len(students), len(subjects)

# 임의 점수 생성
score = pd.DataFrame(np.random.randint(50, 100, nr * nc).reshape(nr, nc),
                     index=students,
                     columns=subjects)

# 평균 이상 여부 계산
kor = score["Korean"] > score["Korean"].mean()
eng = score["English"] > score["English"].mean()
mat = score["Mathematics"] > score["Mathematics"].mean()

# 교차 집계
cross_tab = pd.crosstab(kor, [eng, mat])

print("점수 데이터프레임:")
print(score)

print("\n교차 집계 결과:")
print(cross_tab)


결과 해석

pd.crosstab()은 kor(국어 평균 이상 여부)을 행으로, eng(영어 평균 이상 여부)와 mat(수학 평균 이상 여부)를 열로 사용하여 빈도를 계산합니다. 예를 들어, True, True에 해당하는 값은 국어, 영어, 수학 모두 평균 이상인 학생의 수를 나타냅니다.

결론

• groupby()와 집계 함수는 데이터를 그룹화하고 요약 정보를 계산하는 데 사용됩니다.
• cut()과 qcut()은 연속형 데이터를 이산형 변수로 변환하여 카테고리화할 때 유용합니다.
• pd.crosstab()은 두 변수 간의 관계를 빈도표 형태로 나타내는 데 적합합니다.

 

이러한 기능은 데이터 분석과 머신러닝의 데이터 전처리에서 핵심적으로 사용됩니다.

728x90

댓글