2024. 12. 17. 11:36ㆍLLM(Large Language Model)의 기초/데이터 분석
1. 판다스(Pandas)
* 판다스(Pandas)는 데이터 분석을 위한 파이썬 라이브러리 중 하나로, 표 형태의 데이터나 다양한 형태의 데이터를 쉽게 처리하고 분석할 수 있도록 도와주는 도구입니다.
* 주로 데이터프레임(DataFrame)이라는 자료구조를 제공하며, 이를 통해 테이블 형태의 데이터를 다루기 용이합니다.
pandas 설치
!pip install pandas
import pandas as pd
2. Series와 DataFrame
2-1. Series
* Series는 1차원 배열과 같은 자료구조로 하나의 열을 나타냅니다.
* 또한 각 요소는 인덱스(index)와 값(value)으로 구성되어 있습니다.
* 값은 넘파이의 ndarray 기반으로 저장됩니다.
* Series는 다양한 데이터 타입을 가질 수 있으며 정수, 실수, 문자열 등 다양한 형태의 데이터를 담을 수 있습니다.
예시 1)
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 90, 62, 98]
#pd.Series(데이터, 인덱스, ...)
pd.Series(data)
-->
예시 2)
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 90, 62, 98]
#pd.Series(데이터, 인덱스, ...)
pd.Series(data, idx)
-->
예시 3)
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 90, 62, 98]
se1 = pd.Series(data, idx)
print(se1)
-->
예시 4)
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 90, 62, 98]
print(se1.index)
print(se1.values)
print(type(se1.values))
-->
Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='object')
[67 75 90 62 98]
<class 'numpy.ndarray'>
2-2. DataFrame
* 데이터프레임(DataFrame)은 판다스(Pandas) 라이브러리에서 제공하는 중요하고 강력한 데이터 구조로, 2차원의 테이블 형태 데이터를 다루는 데 사용됩니다.
* 또한 각 요소는 인덱스(index), 열(column), 값(value)으로 구성되어 있습니다.
* 데이터프레임은 행과 열로 이루어져 있으며, 각 열은 다양한 데이터 타입을 가질 수 있습니다.
* 값은 넘파이의 ndarray 기반으로 저장됩니다.
예시 1)
data = [[67, 93, 91],
[75, 68, 96],
[87, 81, 82],
[62, 70, 75],
[98, 56, 87]]
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
#pd.DataFrame(데이터, 인덱스, 컬럼, ...)
pd.DataFrame(data)
-->
예시 2)
data = [[67, 93, 91],
[75, 68, 96],
[87, 81, 82],
[62, 70, 75],
[98, 56, 87]]
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
pd.DataFrame(data, idx)
-->
예시 3)
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 90, 62, 98]
se1 = pd.Series(data, idx)
print(se1)
-->
예시 4)
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 90, 62, 98]
print(se1.index)
print(se1.values)
print(type(se1.values))
-->
Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='object')
[67 75 90 62 98]
<class 'numpy.ndarray'>
2-2. DataFrame
* 데이터프레임(DataFrame)은 판다스(Pandas) 라이브러리에서 제공하는 중요하고 강력한 데이터 구조로, 2차원의 테이블 형태 데이터를 다루는 데 사용됩니다.
* 또한 각 요소는 인덱스(index), 열(column), 값(value)으로 구성되어 있습니다. * 데이터프레임은 행과 열로 이루어져 있으며, 각 열은 다양한 데이터 타입을 가질 수 있습니다.
* 값은 넘파이의 ndarray 기반으로 저장됩니다.
예시 1)
data = [[67, 93, 91],
[75, 68, 96],
[87, 81, 82],
[62, 70, 75],
[98, 56, 87]]
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
#pd.DataFrame(데이터, 인덱스, 컬럼, ...)
pd.DataFrame(data)
-->
예시 2)
data = [[67, 93, 91],
[75, 68, 96],
[87, 81, 82],
[62, 70, 75],
[98, 56, 87]]
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
pd.DataFrame(data, idx, col)
-->
예시 3)
data = [[67, 93, 91],
[75, 68, 96],
[87, 81, 82],
[62, 70, 75],
[98, 56, 87]]
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
pd.DataFrame(index=idx, columns=col, data=data)
-->
예시 4)
data = [[67, 93, 91],
[75, 68, 96],
[87, 81, 82],
[62, 70, 75],
[98, 56, 87]]
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
df = pd.DataFrame(index=idx, columns=col, data=data)
df
-->
예시 5)
data = [[67, 93, 91],
[75, 68, 96],
[87, 81, 82],
[62, 70, 75],
[98, 56, 87]]
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
print(df.index)
print(df.columns)
print(df.values)
-->
예시 6)
#딕셔너리 사용하여 데이터 프레암 생성하기
dic = {
'국어':[67, 75, 76, 62, 98],
'영어':[93, 68, 81, 70, 56],
'수학':[91, 96, 82, 75, 87]
}
df = pd.DataFrame(data=dic, index=idx)
df
-->
3. CSV 파일 읽어오기
* CSV 파일은 Comma-Separated Values(쉼표로 구분된 값) 파일의 약자로, 데이터를 단순한 텍스트 형식으로 저장하는 데 사용되는 파일 형식입니다.
구글 드라이브에 붙혀서 경로를 붙히면 된다
#idol.csv 파일 일단 붙혔습니다.
이름,그룹,소속사,성별,생년월일,키,혈액형,브랜드평판지수
지민,방탄소년단,빅히트,남자,1995-10-13,174,A,6267302
정국,방탄소년단,빅히트,남자,1997-09-01,179,A,5805844
민지,뉴진스,어도어,여자,2004-05-07,169,A,4437081
하니,뉴진스,어도어,여자,2004-10-06,161.7,O,4161153
뷔,방탄소년단,빅히트,남자,1995-12-30,179,AB,3470048
다니엘,뉴진스,어도어,여자,2005-04-11,165,,2341271
혜인,뉴진스,어도어,여자,2008-04-21,170,O,2301785
지수,블랙핑크,와이지,여자,1995-01-03,162,A,2227460
해린,뉴진스,어도어,여자,2006-05-15,164.5,B,2173376
태연,소녀시대,에스엠,여자,1989-03-09,,A,2079866
RM,방탄소년단,빅히트,남자,1994-09-12,181,A,2069499
제니,블랙핑크,와이지,여자,1996-01-16,163,B,2069250
옹성우,워너원,판타지오,남자,1995-08-25,179,A,1954327
리사,블랙핑크,와이지,여자,1997-03-27,167,A,1912800
로제,블랙핑크,와이지,여자,1997-02-11,168,B,1888132
윤아,소녀시대,에스엠,여자,1990-05-30,168,B,1885297
조이,레드벨벳,빅히트,여자,1996-09-03,168,A,1830514
슬기,레드벨벳,빅히트,여자,1994-02-10,161,A,1741767
강다니엘,워너원,,남자,1996-12-10,182,A,1706444
진,방탄소년단,빅히트,남자,1992-12-04,179,O,1680587
from google.colab import drive
# drive.mount('/content/drive')
df = pd.read_csv('/content/drive/MyDrive/KDT 시즌 4/10. 데이터분석/Data/idol.csv')
df
4. 데이터프레임 기본 정보 알아보기
예시 1)
df.info()
-->
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 이름 20 non-null object
1 그룹 20 non-null object
2 소속사 19 non-null object
3 성별 20 non-null object
4 생년월일 20 non-null object
5 키 19 non-null float64
6 혈액형 19 non-null object
7 브랜드평판지수 20 non-null int64
dtypes: float64(1), int64(1), object(6)
memory usage: 1.4+ KB
예시 2)
df.columns
-->
Index(['이름', '그룹', '소속사', '성별', '생년월일', '키', '혈액형', '브랜드평판지수'], dtype='object')
예시 3)
new_columns = ['name', 'group', 'company', 'gender', 'birthday', 'height', 'blood', 'brand']
df.columns = new_columns
df
-->
예시 4)
# describe() : 통계 정보를 반환
df.describe()
-->
예시 5)
new_columns = ['name', 'group', 'company', 'gender', 'birthday', 'height', 'blood', 'brand']
df.columns = new_columns
df.describe(include=object) # top: 최빈값, freq: 최빈값의 빈도
-->
예시 6)
#원하는 개수의 데이터 보기
# df.head(head)
df.head()
-->
예시 7)
df.head(3)
-->
예시 8)
df.sort_index() # index로 오름차순 정렬, 기본값
-->
예시 9)
df.sort_index(ascending=False) # index로 내림차순 정렬
-->
예시 10)
df.sort_values(by='height') # 키로 오름차순 정렬
-->
예시 11)
df.sort_values(by='height', ascending=False) # 키로 내림차순 정렬
-->
예시 12)
df.sort_values(by='height', ascending=False, na_position='first') #키로 내림차순 정렬 NaN을 위로 올린다
-->
예시 13)
# 1차 정렬: 키(내림차순), 2차 정렬 : 브랜드(내림차순)
df.sort_values(by=['height','brand'], ascending=[False, False], na_position='first')
-->
5. 데이터 다루기
예시 1)
df.head()
-->
예시 2)
df['blood'] # 혈액형과 뽑아보기
-->
예시 3)
type(df['blood']) # 타입은 시리즈
-->
pandas.core.series.Series
def __init__(data=None, index=None, dtype: Dtype | None=None, name=None, copy: bool | None=None, fastpath: bool | lib.NoDefault=lib.no_default) -> None
예시 4)
df.blood
-->
예시 5)
df.head(3)
-->
예시 6)
df[:3]
-->
예시 7)
# loc 인덱싱
df.loc[:,'name'] # df['name'] # name에대한 column모두 가져옴
-->
예시 8)
df.loc[2:5, 'name'] # 5번 포함
-->
예시 9)
df.loc[2:5, ['name', 'gender', 'height']]
-->
예시 10)
df.loc[[2,5], ['name', 'gender', 'height']] #2,5 가져옴
-->
예시 11)
df.loc[[2,5], 'name':'gender'] #name에서 gender까지 가져옴
-->
예시 12)
# i loc 인덱싱
df.iloc[:,0] #0번의 name만 가져옴
-->
예시 13)
df.iloc[:,0:3] #3을 포함하지 않음
-->
예시 14)
df.iloc[:, [0, 3]]
-->
예시 15)
df.iloc[1:5, 0:2]
-->
예시 16)
df['height'] >= 180
-->
예시 17)
df[df['height'] >= 180]
-->
예시 18)
df[df['height'] >= 180]['name']
-->
예시 19)
df[df['height'] >= 180][['name','gender', 'height']]
-->
예시 20)
df.loc[df['height'] >= 180, ['name','gender', 'height']]
-->
예시 21)
company = ['빅히트', '어도어']
df['company'].isin(company)
-->
예시 22)
df[df['company'].isin(company)] #df.loc[df ['company'].isin(company).:]
-->
6.결측값
* 결측값은 값이 누락된 데이터를 의미하며, 판다스에서는 일반적으로 NaN(Not a Number) 또는 None으로 표시됩니다.
1. NaN
* 수치 데이터에서 나타나는 결측값으로, 판다스의 float 타입에서 주로 사용됩니다.
2. None
* 비수치 데이터에서 나타나는 결측값으로, object 데이터 타입에서 사용됩니다.
예시 1)
df.info()
-->
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 20 non-null object
1 group 20 non-null object
2 company 19 non-null object
3 gender 20 non-null object
4 birthday 20 non-null object
5 height 19 non-null float64
6 blood 19 non-null object
7 brand 20 non-null int64
dtypes: float64(1), int64(1), object(6)
memory usage: 1.4+ KB
예시 2)
df
-->
예시 3)
df.isna()
-->
예시 4)
df.isnull() # True, False 반환
-->
예시 5)
df.notnull()
-->
예시 6)
df['height'].isna()
-->
예시 7)
df[df['height'].isna()]
-->
예시 8)
df[df['height'].isna()]['name']
-->
예시 9)
df[df['height'].notnull()] # notnull 아닌 사람
-->
예시 10)
df[~df['height'].isnull()] # null이 아닌사람
-->
예시 11)
df.loc[df['company'].notnull(), ['name', 'company', 'group', 'gender']]
-->
예시 12)
# fillna() : 결측값을 채워주는 함수
df['height'].fillna(0) #df['height'].fillna(0, inplace=True) 적용
-->
예시 13)
df['height']
-->
예시 14)
df_copy = df.copy()
df_copy
-->
예시 15)
height = df_copy['height'].mean()
height
-->
170.53684210526316
예시 16)
df_copy['height'] = df_copy['height'].fillna(height)
df_copy['height']
-->
예시 17)
df_copy = df.copy()
df_copy['height']
-->
예시 18)
height = df_copy['height'].median()
height
-->
168.0
ㅇ예시 19)
df_copy['height'].fillna(height, inplace=True)
df_copy['height']
-->
예시 20)
df_copy = df.copy()
df_copy
-->
예시 21)
#dropna(): 결측값이 있는 행 또는 열을 제거, 결측값이 한개라도 있는경우 삭제
# axios = 0 (행 삭제)
df_copy.dropna()
-->
예시 22)
df_copy.dropna(axis=1) # 결측값이 있는 열을 제거
-->
※ axis
1. NumPy는 수학적 배열 연산에서 출발했기 때문에, 축(axis) 개념이 배열의 모양과 연산 방향에 초점을 맞춥니다.
* axis=0: 배열의 세로 방향(열), axis=1: 배열의 가로 방향(행)
2. Pandas는 데이터 분석에 특화된 라이브러리로, 행(row)과 열(column)을 명시적으로 구분하여 작업을 수행합니다.
* axis=0: 행(row)을 대상으로 작업(열 간 연산). axis=1: 열(column)을 대상으로 작업(행 간 연산)
7. 행, 열 추가 및 삭제하기
df_copy = df.copy()
df_copy
-->
예시 1)
dic = {
'name': '김사과',
'group': '과수원',
'company': '애플',
'gender': '여자',
'birthday': '2000-01-01',
'height': 160.0,
'blood': 'A',
'brand': 1234567
}
예시 2)
# concat() : 데이터를 합침, axis=0 (기본값)
# df_copy = pd.concat([첫번째 데이터프레임, 두번째 데이터프레임])
df_copy = pd.concat([df_copy, pd.DataFrame(dic, index=[0])], ignore_index=True)
df_copy
-->
예시 3)
df_copy['nation'] = '대한민국'
df_copy.head()
-->
예시 4)
df_copy.tail()
-->
예시 5)
df_copy.loc[df_copy['name'] == '김사과', 'nation'] = '미국'
df_copy.tail()
-->
예시 6)
# 행 제거하기
df_copy.drop(19, axis=0) # 0: 행 1: 열
-->
예시 7)
df_copy.tail()
-->
예시 8)
df_copy.drop([1,3,5,7,19])
-->
예시 9)
#열 삭제하기
df_copy.drop('nation', axis=1)
-->
예시 10)
df_copy.drop(['nation', 'group'], axis=1)
-->
8. 통계 함수
예시 1)
df_copy.describe()
-->
예시 2)
df_copy['height'].sum() #합계
-->
3240.2
예시 3)
df_copy['height'].count() #개수, NaN은 포함하지 않음
-->
19
예시 4)
df_copy['height'].mean() # 평균
-->
170.53684210526316
예시 5)
df_copy['height'].median() # 중앙값
-->
168.0
※ 평균과 중앙값
* 평균은 모든 데이터를 더한 후, 데이터 개수로 나눈 값입니다.
* 데이터를 고르게 분배했을 때, 한 데이터가 가질 수 있는 이론적인 중심값을 의미합니다.
* 중앙값은 데이터를 크기 순서대로 정렬했을 때, 가운데 위치하는 값입니다. 데이터의 순서에만 영향을 받고, 값의 크기에는 영향을 받지 않습니다.
* 데이터가 고르게 분포된 경우 평균과 중앙값이 비슷하거나 같습니다. 하지만 데이터에 극단값(Outlier)이 있는 경우 평균은 극단값의 영향을 받아 왜곡될 수 있지만,
* 중앙값은 비교적 안정적입니다.
'LLM(Large Language Model)의 기초 > 데이터 분석' 카테고리의 다른 글
5. 상권_데이터셋 (6) | 2024.12.19 |
---|---|
3. Matplotlib (4) | 2024.12.19 |
4. Online Retail 데이터셋 (1) | 2024.12.18 |
2-2) 판다스(Pandas) (4) | 2024.12.18 |
1. 넘파이(Numpy) (0) | 2024.12.16 |