rubus0304 님의 블로그

[데이터분석 4주차] Pandas 기본 문법정리 본문

Data Analyst/Weekly

[데이터분석 4주차] Pandas 기본 문법정리

rubus0304 2024. 11. 1. 18:33

 

1. 설치, 불러오고, 저장하기

문법 내용
기본 설치 pip install pandas numpy matplotlib

terminal 로 pandas 불러오기
Shift + Ctrl + ~  동시에 누르고  pip install pandas 설치 / pip install seaborn  동일하게 설치
단축 Ctrl + Enter 실행
A - above (위) 이동
B - below (아래) 이동
Enter - 입력
Esc - 빠져나오기
dd - delete
X - 잘라내기
C - 복사
V - 붙여넣기
Pandas 불러오기  import pandas as pd
import seaborn as sns
데이터 불러오기 data = sns.load_dataset('tips') 
-> sns 에서 'tips'라는 데이터셋 가져왔음 
data 
로 확인!

데이터 저장하기 data.to_csv("tips_data.csv")
"파일명.확장자"
데이터 불러오기 df = pd.read_csv("tips_data.csv")
df
데이터 INDEX Null 값 제거하기 1) 저장할 때 Null 값 제거하는 법
index null 값 제거하기 위해 아래처럼 index = False 추가해서 저장할 수 있음! 
(** read 구문에 넣는 것 아님!  data.to_csv 에서 추가해서 저장)
(** False 꼭 대문자 주의!! 파이썬 라이브러리에선 저장되어있기 때문에 똑같이 써야함 ) 

 
data.to_csv("tips_data.csv") , index=False )     하고 다시 불러오기

2) 불러올 때 Null 값 제거하는 법
df = pd.read_csv("tips_data.csv", index_col=0)
df

파일경로 지정해서 저장하기 df.to_csv("temp/tips_data.csv", index=False)
df =  이 아니고  df. 으로 바로 시작!
엑셀형식으로 저장하기  (확장자 변경) df.to_excel("temp/tips.data.xlsx", index=False)

(에러 참고사항)

** ModuleNotFundError  떴다..! 인터넷 서치를 해보니 비슷한 사례 있었음.. 에러메세지 내 필요모듈 문구대로 터미널에서   openpyxl 설치해봄
오오 혼자서 해결+_+!  엥 근데 열어보니 이상하케 나옴+_+....!!!! 이건 여쭤봐야게따
 
엑셀은 자기들 프로그램 쓰게하려고 다른 프로그램에서 깨져보이게 하는 경우가 종종 있다고함. 

컴퓨터에 저장된 파일로 보면 되고, 혹시 엑셀이 컴터에 안 깔려 있어서 편집이 안 되는 경우, 
파이썬에서  csv 파일에서 편집하고 저장하거나,  전체를 변경해야할 경우,  코드 짜서 다시 csv 파일로 이름 바꿔서 저장하면 됨!!  그냥 csv 파일 이름 그대로 하면 덮어씌워져버림 -ㅁ- ㄷㄷㄷ

 

2. 인덱스 (Index) / 컬럼

문법 내용
인덱스 넣기
df = pd.DataFram({
       'a' : [1,2,3],
       'b' : ['a', 'b', 'c']
}, index = ['idx1', 'idx2', 'idx3'])
df



df.loc [ 'idx2' ]  
- 2번째 행에 대한 정보 가져와라  (근데 열이 행으로 바뀌어서 가져옴)



df.sort _index( ) 







df.set_index ('A')    ->  index 다시 설정  (A라는 컬럼으로 index 쓰겠다)




df.index   ->  index 값 이랑 형식 확인



df.index = [ '1', '2', '3' ]   ->  index 다시 변경하기  ['ㄱ','ㄴ','ㄷ'] 도 가능..!!
df



df.reset_index() -> index를 기존값으로 해주는 것.  0,1,2 기본으로 바뀜
sort( ) 함수로 정렬 시키면 보통 인덱스가 뒤죽박죽 되버리는데, 그 순서로 다시 정렬되어 맨 왼쪽에 index 추가.



추가적으로, 
 .sort_idex 혹은 .sort_value ('컬럼') 쓰면 해당 '컬럼' 이 row index 로 내려가버림..무조건.
이런 경우에도 reset_index( )  하면 다시 다른 컬럼들과 동일하게 올라옴.
 
 
df.reset_index(drop = True)  :  기존에 있던 인덱스 없어짐

컬럼 ** 딕셔너리에서는  = 하면 에러남. 'name' : ['리스트값1',....]  해야함 

data=  {
      'name' : ['Alice', 'Bob', 'Charlie' ],
       'age' : ['25, '30', '35'],
       'gender' : ['female', 'male', 'male']
       }
df = pd.DataFrame(data)
df

컬럼 한 개
df['age']   -> 컬럼 한 개 가져오기


컬럼들 및 type df.columns   -> 컬럼들 및 type 가져오기

컬럼 이름 바꾸기 df.columns = ['이름', '나이', '성별']     -> 컬럼 이름 바꾸기


rename 사용하여 컬럼 이름 바꾸기  (처음엔 df = 로 지정해줘야함) 
df = df.rename(columns={'이름' : 'name'})  
df


여러개 컬럼이름 바꾸기 
df.rename(columns={'나이' : 'age', '성별' : '남/여'} )

컬럼 및 안에 값 추가하기 df [ '스포츠'] = '축구'
df
컬럼 삭제하기 del df [ '스포츠'] 
df

 

3. 데이터 확인

문법 내용
데이터 확인하기 df = pd.read_csv("temp/tips_data.csv")
df
.head() data.head() # head()은 기본 5개 행에 대한 데이터를 보여줌
data.head(3) # ()안에 숫자만큼 데이터를 보여줌

 
df.head ( ) -> 기본적으로 5개 행 가져옴  (요약, 헤드라인 메소드)
df.head(3)   -> 만약에 괄호에 숫자넣으면  그 만큼 출력
.info() data.info() 
# null 값을 확인할때도 활용

 
df.info( ) type, null값 여부 등
.describe() data.describe()
# 숫자값에 대해서만 기초통계량 확인이 가능합니다.

 
df.describe( )  ->  몇 개 있는지 (count), 최대, 최소값 등  ** float int (숫자 타입 컬럼값들만 통계 보여줌)

 

4. 결측치 확인

문법 내용
isnull() # 결측치 확인 : isnull()
df.isnull().sum() # 이렇게하면 결측치가 몇개있는지도 알 수 있어요 !
dropna() # 결측치 제거 : dropna()
df.dropna()
.duplicated # 중복 데이터 확인
df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3'])
.drop_duplicates # 중복 데이터 제거
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3'])

 

5.이상치 확인

문법 내용
  이상치 처리하는 방법# IQR (Interquartile Range) 방법 찾아보기
# 참고 : https://www.scribbr.com/statistics/interquartile-range/
# IQR 계산 # IQR 계산
Q1 = df['컬럼1'].quantile(0.25)
Q3 = df['컬럼1'].quantile(0.75)
IQR = Q3 - Q1
# 이상치 기준 설정 # 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상치 제거 # 이상치 제거
df[(df['컬럼1'] >= lower_bound) & (df['컬럼1'] <= upper_bound)]

  df=pd.DataFrame ({
     'A' : [1,2,3,4],
     'B' : [5,6,7,None]
})
df

df.info()  -> null 값이 아닌 값이 몇 개인지  (B에 null 1개 있으므로, B는 3개 정상)

df.isna ( )   ->  True 면 Null / False 면 정상

df['B'].isna( )  -> B 컬럼만 따로 봤을 떄 

df [ df['B'].isna ( ) ]   ->  Tru/False 값 통해서 일종의 조건식으로 데이터프레임 안에서 불러올 수 있음 /

df [  ]  대괄호 안에 조건을 넣어주면, 조건이 True 인 행 전체를 불러오게됨

 

6. 데이터 타입

 

문법 내용
astype astype를 사용한 데이터 타입 변경




# 데이터 타입 변경을 원한다면 ! 
df['column_name'].astype(int)
df['column_name'].astype(float)
df['column_name'].astype(str)
df['column_name'].astype(bool)
df['column_name'].astype('category')
df['column_name'].astype('datetime64[ns]')
df['column_name'].astype(complex)
df['column_name'].astype(object)

.astype( ) 는 Pandas 데이터프레임의 열의 데이터 타입을 변경하는 데 사용됩니다. 이를 사용하여 열의 데이터 타입을 원하는 형식으로 변환할 수 있습니다.


DataFrame['column_name'] = DataFrame['column_name'].astype(new_dtype)


  • DataFrame['column_name']: 열을 선택하는 방식으로 열의 데이터 타입을 변경하고자 하는 열을 지정합니다.
  • new_dtype: 변경하고자 하는 새로운 데이터 타입을 명시합니다. (예: 'int', 'float', 'str' 등)
예시 1) int → float
import pandas as pd

# 예시 데이터프레임 생성
data = {'integer_column': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 정수형 열을 부동소수점으로 변환
df['integer_column'] = df['integer_column'].astype(float)
print(df.dtypes)  # 데이터프레임의 열 타입 확인



예시 2) int → str
 
import pandas as pd

# 예시 데이터프레임 생성
data = {'numeric_column': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 숫자열을 문자열로 변환
df['numeric_column'] = df['numeric_column'].astype(str)
print(df.dtypes)  # 데이터프레임의 열 타입 확인


  df['tip'].dtype    -> 컬럼 별 데이터 타입

cf. 데이터 타입
 
int : 정수  ( 1 )
float : 실수 ( 1.0 ) (int와 float 혼합하여 계산시, 결과값은 항상 float  단위가 더 크므로)
str :  텍스트 타입  ( '1' )
list  : 리스트 타입 ( [1] ) 

  데이터 타입 바꾸기  df [ '컬럼' ] .astype(변경할 타입)
df [ 'total_bill' ] = df [ 'total_bill'].astype(str)
 
total_bill 데이터 타입 float (실수) -> object (문자)

소숫점 때문에 문자형식에서는 바로 int (정수) 로 못 바꿈   ( str --x --> int  )
float (실수) 형식에선 int 로 변경가능!!
 str  --> float (숫자) -> int

 

7.데이터 선택

문법 내용
lioc **iloc**은 정수 기반의 인덱스를 사용하고, **loc**은 레이블 기반의 인덱스를 사용

.iloc[로우,컬럼] : 인덱스 번호로 선택

data.iloc[0,2]
#행과 열 번호를 통해 특정 데이터를 선택할 수 있음

# iloc을 사용하여 특정 행과 열 선택
selected_data = df.iloc[1:4, 0:2]  # 인덱스 1부터 3까지의 행과 0부터 1까지의 열 선택
print(selected_data)


iloc [시작: 얼마나: 보폭] 
0부터 시작 5개까지, 몇 칸 튈건지

cf. df.iloc[0: :2]  가운데 어디까지 지정 생략하면 처음부터 끝까지
행과 열이 존재하는 경우  컴마로 구분하여 가져옴  df.iloc(행, 열)  몇 행, 몇 열 째 값 가져와

근데 여기서  열 값을 여러개 보고싶다 하면 df.ilo[0, 0:2]  행은 그대로 두고 열 값을 처음부터 2개까지해서 행도 그 열에 맞춘 값 같이 나옴

loc .loc[로우,컬럼] : 이름으로 선택하기

인덱스가 번호가 아니고 특정 문자일 경우
 
data.loc['행이름' , '컬럼명']
df.loc['b':, 'A']

b부터 끝까지 행, A 열


*** df.iloc[1:3, 0 ] 일 때, 파이썬 숫자니까 1부터 3이면  0,1,2 번째까지 출력!
     BUT, loc는 문자니까 정확하게 지정된 그 문자열을 출력!!

# 행이름과 컬럼명을 통해서도 특정 데이터를 선택할 수 있음

# loc을 사용하여 특정 행과 열 선택
selected_data = df.loc['b':'d', 'A':'B']  # 레이블 'b'부터 'd'까지의 행과 'A'부터 'B'까지의 열 선택
print(selected_data)
1개의 컬럼 전체를 선택 data.loc[, '컬럼명']

#또는 데이터프레임['컬럼명'] 으로도 동일한 값을 선택할 수 있습니다.
data['컬럼명']

 
여러개의 컬럼을 선택할 경우에도 리스트를 활용해서 선택할 수 있습니다.
 
data[   ['컬럼명1', '컬럼명2', '컬럼명3' ]  ] 
 
여러개 컬럼을 선택할때, 내가 원하는 순서대로 데이터를 선택할 수 있습니다.
 
data[   ['컬럼명3', '컬럼명1', '컬럼명2' ]  ] 

2개 이상의 셀을 선택 리스트 형태를 활용해서 데이터를 선택해봅시다.
 
# 2개 컬럼명을 선택할 경우
data.loc[  '행이름'  , ['컬럼명1' , '컬럼명2']   ]

# 2개 행이름을 선택할 경우
data.loc[  ['행이름1', '행이름2'] , '컬럼명1'    ]

# 리스트 슬라이싱 : 을 활용해서 특정 범위를 지정하여 선택할 수 있습니다.
data.loc[ '행이름' , '컬럼명1' : ] # '컬럼명1' : ==> 컬럼명1부터 끝까지라는 의미
조건에 따라 데이터를 선택하기
(Boolean Indexing)

조건에 따라 데이터를 선택하기 (Boolean Indexing)





실습  실습해보기 : 특정 조건을 만족하는 데이터를 선택할 경우
 
비교 연산자를 활용해봅시다.
 
# 예를들어, data['컬럼명1']이 숫자(int)값인 경우
data['컬럼명1'] < 80

# 80보다 작으면 True 
# 80보다 크면 False 을 반환합니다.

 
조건을 통해 True/False 로 반환된 값을 활용해서 True에 해당하는 값만 불러올 수 있습니다.
 
condition = data['컬럼명1'] < 80
condition

 
여러개 조건을 활용해서 값을 불러올 수 있습니다.
 
# 조건1 and 조건2 ==>> 조건1,2 둘다 만족해야한다 True
## and 를 &로 대체해서 사용할 수 있음

condition1 = data['컬럼명1'] < 80
condition2 = data['컬럼명2'] >= 50

condition = condition1 & condition2
data[conditon]



# 조건1 or 조건2 ==>> 조건1과 조건2 둘중 하나만 만족하면 True
## or 를 |로 대체해서 사용가능

condition1 = data['컬럼명1'] < 80
condition2 = data['컬럼명2'] >= 50

condition = condition1 | condition2
data[conditon]

 
 
 
# ()로 구분해서 조건을 한번에 입력해도 동일하게 활용할 수 있습니다.
condition = (data['컬럼명1'] < 80) & (data['컬럼명2'] >= 50)
data[conditon]

# 이렇게도 가능합니다.
data[(data['컬럼명1'] < 80) & (data['컬럼명2'] >= 50)]

# 조건이 많아서 행이 길어질 경우, 줄바꿈을 통해 구분해주시면 훨씬 가독성이 올라갑니다.
condition = (data['컬럼명1'] < 80) \
& (data['컬럼명2'] >= 50)\
& (data['컬럼명3'] >= 10)
data[conditon]

 

8. 데이터 추가하기

문법 내용
df['컬럼명'] = data df = pd.DataFrame()
df['컬럼명'] = data

# df라는 데이터프레임에 '컬럼명'이라는 이름의 컬럼이 추가되고,해당 컬럼에 data라는 값이 추가된다.
# 이때, data값이 1개의 단일 값인 경우에는 전체 df라는 데이터프레임 행에 data 값이 전체 적용됨
# 즉, 
# 하나의 값인 경우 => 전체 모두 동일한 값 적용
# (리스트,시리즈)의 형태인 경우 => 각 순서에 맞게 컬럼 값에 적용됨
신규 컬럼 추가하기 df = pd.DataFrame()

# 컬럼 추가하기
df['EPL'] = 100
df['MLS'] = 60
df['NBA'] = 70
df

# 리스트 형태로 컬럼값 추가하기
df['KFC'] = [50, 10, 30]
#Tip. 행 수를 맞춰서 입력해줘야함


# 컬럼을 여러 조건 및 계산식을 통해 산출 값으로도 추가가 가능
df['ABC'] = (df['EPL'] + df['NBA']) * df['MLS'] * 2

 

9. 데이터 병합

문법 내용
concat 데이터를 위아래로 합치기
  • concat()함수는 데이터프레임을 위아래로 혹은 좌우로 연결할 수 있어요 !
    • axis: 연결하고자 하는 축(방향)을 지정합니다. 기본값은 0으로, 위아래로 연결하는 경우에 해당합니다. 1로 설정하면 좌우로 연결합니다.
    • ignore_index: 기본값은 False이며, 연결된 결과 데이터프레임의 인덱스를 유지합니다. True로 설정하면 새로운 인덱스를 생성합니다. (True → 기존 인덱스를 무시하고 새롭게 인덱스를 설정)
# 두 개의 데이터프레임 생성
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2']})
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5']})

# 위아래로 데이터프레임 연결
result_vertical = pd.concat([df1, df2], axis=0)

# 좌우로 데이터프레임 연결
result_horizontal = pd.concat([df1, df2], axis=1)

print("위아래 연결 결과:\n", result_vertical)
print("\n좌우 연결 결과:\n", result_horizontal)

join  
merge 데이터를 좌우로 합치기
  • SQL의 JOIN 연산과 유사한 방식으로 데이터프레임을 합칠 수 있습니다. 주로 두 개 이상의 데이터프레임에서 공통된 열이나 인덱스를 기준으로 데이터를 병합할 때 활용됩니다.
  • merge() 함수의 주요 매개변수는 다음과 같습니다:
    • left와 right: 병합할 데이터프레임 중 병합되는 기준이 되는 왼쪽(left)과 오른쪽(right) 데이터프레임입니다.
    • how: 병합 방법을 나타내는 매개변수로, 'inner', 'outer', 'left', 'right' 등의 옵션이 있습니다.
      • 'inner': 공통된 키(열)를 기준으로 교집합을 만듭니다.
      • 'outer': 공통된 키를 기준으로 합집합을 만듭니다.
      • 'left': 왼쪽 데이터프레임의 모든 행을 포함하고 오른쪽 데이터프레임은 공통된 키에 해당하는 행만 포함합니다.
      • 'right': 오른쪽 데이터프레임의 모든 행을 포함하고 왼쪽 데이터프레임은 공통된 키에 해당하는 행만 포함합니다.
    • on: 병합 기준이 되는 열 이름(혹은 열 이름의 리스트)을 지정합니다.
      • left_on과 right_on: 왼쪽 데이터프레임과 오른쪽 데이터프레임에서 병합할 열 이름이 다른 경우에 사용합니다.

        # 두 개의 데이터프레임 생성
        left_df = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': [1, 2, 3, 4]})
        right_df = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': [5, 6, 7, 8]})

        # 'key' 열을 기준으로 두 데이터프레임 병합
        merged_df = pd.merge(left_df, right_df, on='key', how='inner')

        print(merged_df)

 

10. 데이터 집계

문법 내용
Group by
  • Group by 함수는 데이터프레임을 그룹화하고, 그룹 단위로 데이터를 분할(split), 적용(apply), 결합(combine)하는 기능을 제공합니다
  • 데이터프레임을 특정 기준에 따라 그룹으로 나누어 집계, 변환, 필터링 등을 할 수 있습니다.
    1. 그룹 생성: 기준 열(혹은 열들)을 지정하여 데이터프레임을 그룹으로 나눕니다.
    2. 그룹에 대한 연산 수행: 그룹 단위로 원하는 연산(평균, 합, 개수 등)을 수행합니다.
    3. 결과 결합: 각 그룹의 연산 결과를 하나의 데이터프레임으로 결합하여 새로운 데이터프레임을 생성합니다.

샘플 데이터프레임 생성
data = {
    'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
    'Value': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)

# 'Category' 열을 기준으로 그룹화하여 'Value'의 연산 수행
grouped = df.groupby('Category').mean()

grouped_sum = df.groupby('Category').sum()
grouped_count = df.groupby('Category').count()
grouped_max = df.groupby('Category').max()
grouped_min = df.groupby('Category').min()


수치형 데이터의 경우에 연산이 가능

- 복수의 열을 기준으로 Group by 함수 사용하기
import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
    'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'Value': [1, 2, 3, 4, 5, 6]
}
df = pd.DataFrame(data)

'Category'와 'SubCategory' 열을 기준으로 그룹화하여 'Value'의 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).sum()

print(grouped_multiple)



# 샘플 데이터프레임 생성
data = {
    'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
    'SubCategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'Value1': [1, 2, 3, 4, 5, 6],
    'Value2': [10, 20, 30, 40, 50, 60]
}
df = pd.DataFrame(data)

# 'Category'와 'SubCategory' 열을 기준으로 그룹화하여 각 그룹별 'Value1'과 'Value2'의 평균, 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).agg({'Value1': ['mean', 'sum'], 'Value2': 'sum'})

print(grouped_multiple)



 

11. 피벗테이블

문법 내용
피벗테이블

Pivot Table()

  • pivot_table() 함수는 데이터프레임에서 피벗 테이블을 생성하는 데 사용됩니다.# Pivot Table란? 데이터를 재구성하여 요약, 집계된 정보를 보여주는 테이블 형태
  • 주어진 데이터를 사용자가 원하는 형태로 재배치하여 요약된 정보를 보기 쉽게 제공합니다.
  • 피벗 테이블 생성하기

# 샘플 데이터프레임 생성
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)

# 피벗 테이블 생성: 날짜를 행 인덱스로, 카테고리를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='sum')

print(pivot)



  • 여러 열을 기준으로 피벗 테이블 생성하기
import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'SubCategory': ['X', 'Y', 'X', 'Y', 'X'],
    'Value': [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)

# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'와 'SubCategory'를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns=['Category', 'SubCategory'], values='Value', aggfunc='sum')

print(pivot)


  • 집계 함수를 다르게 적용하여 피벗 테이블 생성하기
import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value1': [10, 20, 30, 40, 50],
    'Value2': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)

# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'를 열 인덱스로, 값은 'Value1'과 'Value2'의 평균과 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc={'Value1': 'mean', 'Value2': 'sum'})

print(pivot)



 

 

12. 시각화 맛보기

문법 내용
시각화
matplotlib
Group by 나 Pivot Table 함수를 통해 원하는 형태로 데이터를 가공하고 시각화 할 수 있습니

import matplotlib.pyplot as plt

import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value1': [10, 20, 30, 40, 50],
    'Value2': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)

# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'를 열 인덱스로, 값은 'Value1'과 'Value2'의 평균으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc='mean')


# 피벗 테이블의 선 그래프 시각화
pivot.plot(kind='line')
plt.xlabel('Date')
plt.ylabel('Values')
plt.title('Pivot Table Visualization')
plt.legend(title='Category')
plt.show()

 

 

13. 데이터 정렬하기

문법 내용
sort_values('Score') 

sort_values('Score',ascending=False)

sort_index() 

sort_index(ascending=False) 
  • sort_values() 함수:
    • 컬럼 기준으로 정렬시켜보자
import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'Age': [25, 22, 30, 18, 27],
    'Score': [85, 90, 75, 80, 95]
}
df = pd.DataFrame(data)

# 정렬
sorted_by_score = df.sort_values('Score') # 'Score' 열을 기준으로 오름차순 정렬
sorted_by_score = df.sort_values('Score',ascending=False) # 'Score' 열을 기준으로 내림차순 정렬

print(sorted_by_score)


  • sort_index() 함수:
    • 인덱스를 기준으로 정렬시켜보자
import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'Age': [25, 22, 30, 18, 27],
    'Score': [85, 90, 75, 80, 95]
}
df = pd.DataFrame(data)

# 정렬
sorted_by_index = df.sort_index() # 인덱스를 기준으로 오름차순 정렬
sorted_by_index = df.sort_index(ascending=False) # 인덱스를 기준으로 내림차순 정렬
print(sorted_by_index)
pickle
  • pickle 활용하기
    • python 의 변수, 함수, 객체를 파일로 저장하고 불러올 수 있는 라이브러리
    • list, dictionary등을 파일 그대로 저장하면 용량이 매우 커지는데 pickle을 사용하면 binary형태로 저장되기 때문에 용량이 매우 작아진다.
    • 추가적으로 gzip을 이용하여 pickle로 저장된 데이터를 압축할 수 있음 → pandas에서는to_pickle()및read_pickle() 메서드를 통해 pickle을 사용할 수 있음
    • 머신러닝 모델 등을 저장하고 불러올때도 활용함
  • pickle 저장하기

    import pandas as pd

    # 샘플 데이터프레임 생성
    data = {
        'Column1': [1, 2, 3, 4, 5],
        'Column2': ['A', 'B', 'C', 'D', 'E']
    }
    df = pd.DataFrame(data)

    # 데이터프레임을 pickle 파일로 저장
    df.to_pickle('dataframe.pkl')  # 데이터프레임을 'dataframe.pkl' 파일로 저장
  • pickle 불러오기

    import pandas as pd


    # pickle 파일에서 데이터프레임 불러오기
    loaded_df = pd.read_pickle('dataframe.pkl')  # 'dataframe.pkl' 파일에서 데이터프레임 불러오기
    print(loaded_df)

 

14. 시각화

문법 내용
Matplotlib  Matplotlib.pyplot 에서 plot() 를 활용하는 법을 알아봅시다.

import pandas as pd
import matplotlib.pyplot as plt

# 샘플 데이터프레임 생성
data = {
    'A': [1, 2, 3, 4, 5],
    'B': [5, 4, 3, 2, 1]
}
df = pd.DataFrame(data)

# 선 그래프 그리기
df.plot(x='A', y='B')
plt.show()

 
아래처럼 data 안 쓰고 바로 해도 되지만, 나중에 활용을 위해 data 라이브러리로 묶는게 좋다.



헐 아니네. 제목이랑 , x,y축 값이 안 나온거네? 뭘 잘못 쓴겨  홀리쉿.... 옆에 나오는 콤보상자에서 선택을 해야함..!! 단순히 글자 똑같이 쓰는게 아님  xlabel, ylabel 도 포함되어있나봄. matplotlib.pyplot 즉 plt 에! 선택되면 노란색글씨로 바뀜! 그럼 잘 된거!
 
import matplotlib.pyplot as plt

# 데이터 생성
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# 선 그래프 그리기
plt.plot(x, y)
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title('Example Plot')
plt.show()






스타일 설정하기 스타일 설정하기

ax = df.plot(x='A', y='B', color='green', linestyle='--', marker='o')
plt.show()

범례 추가하기 범례 추가하기

#1 label
ax = df.plot(x='A', y='B', color='green', linestyle='--', marker='o', label='Data Series')

#2 legend
ax.legend(['Data Series'])


#1번 또는 2번 방법으로 범례를 추가할 수 있습니다.
plt.show()
축 , 제목 입력하기 축 , 제목 입력하기

ax = df.plot(x='A', y='B', color='green', linestyle='--', marker='o', label='Data Series')
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Title of the Plot')
텍스트 추가하기 텍스트 추가하기

ax = df.plot(x='A', y='B', color='green', linestyle='--', marker='o', label='Data Series')
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Title of the Plot')
ax.text(3, 3, 'Some Text', fontsize = 12)

ax.text(4, 2, 'Some Text', fontsize = 10)
plt.show()
한꺼번에 설정하는 방법 ! 한꺼번에 설정하는 방법 !

import matplotlib.pyplot as plt

# 데이터 생성
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# 그래프 그리기
plt.plot(x, y, color='green', linestyle='--', marker='o', label='Data Series')

# 추가 설정
plt.xlabel('X-axis Label')
plt.ylabel('Y-axis Label')
plt.title('Title of the Plot')
plt.legend()
plt.text(3, 8, 'Some Text', fontsize=12)  # 특정 좌표에 텍스트 추가

# 그래프 출력
plt.show()
너무 작다… → 그래프를 크게 만들어보자! 너무 작다… → 그래프를 크게 만들어보자!

import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))  # 가로 8인치, 세로 6인치  // # Figure 객체 생성 및 사이즈 설정



x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)  # 그래프 그리기
plt.show()



원래 그려놓은 그래프 사이즈를 바꾸려면!


fig, ax = plt.subplots (figsize = (18,6))
ax = df.plot ( x='A', y='B', color = 'red', linestyle = '--', marker = 'o', ax=ax, label = 'Data Series)
ax.set_xlabel('X-axis Label')
ax.set_ylabel('Y-axis Label')
ax.set_title('Title of the Plot')
ax.text(3, 3, 'Some Text', fontsize = 12)

ax.text(4, 2, 'Some Text', fontsize = 10)
plt.show()
  그래프 그리기 - 차트


참고) 그래프 자료유형


   Line Plot (선 그래프)


import pandas as pd
import matplotlib.pyplot as plt

# 데이터프레임 생성
data = {'날짜': ['2023-01-01', '2023-01-02', '2023-01-03'],
        '값': [10, 15, 8]}
df = pd.DataFrame(data)

# '날짜'를 날짜 형식으로 변환
df['날짜'] = pd.to_datetime(df['날짜'])

# 선 그래프 작성
plt.plot(df['날짜'], df['값'])
plt.xlabel('날짜')
plt.ylabel('값')
plt.title('선 그래프 예시')
plt.show()



(예시)


1.우선 데이터 불러오기
 
import seaborn as sns

data = sns.load_dataset('flights')
data


2.데이터 그룹만들기
data_grouped = data [['year','passengers']].groupby('year').sum().reset_index()
data_grouped
 


3.데이터그룹을 그래프로 만들어주기
plt.plot(data_grouped['year'], data_grouped['passengers'])
plt.xlabel('year')
plt.ylabel('passengers')
 
plt.show
 

  Bar Plot (막대 그래프)


# 데이터프레임 생성
data = {'도시': ['서울', '부산', '대구', '인천'],
        '인구': [990, 350, 250, 290]}
df = pd.DataFrame(data)

# 막대 그래프 작성
plt.bar(df['도시'], df['인구'])
plt.xlabel('도시')
plt.ylabel('인구')
plt.title('막대 그래프 예시')
plt.show()



matplotlib 에서한글 깨짐 문제 해결하기

  Histogram (히스토그램)
  • 자료 유형: 연속형 데이터의 분포를 보여줄 때 사용됩니다.
  • 활용: 데이터의 빈도나 분포, 패턴을 이해하고자 할 때 유용합니다.


import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성 (랜덤 데이터)
data = np.random.randn(1000)



cf. data.shape 

# 히스토그램 그리기
plt.hist(data, bins=30)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram')
plt.show()





  Pie Chart (원 그래프)
  • 자료 유형: 범주형 데이터의 상대적 비율을 시각화하는 데 사용됩니다.
  • 활용: 전체에 대한 각 범주의 비율을 보여줄 때 유용하며, 주로 비율을 비교하는 데 사용됩니다.
import matplotlib.pyplot as plt

# 데이터 생성
sizes = [30, 20, 25, 15, 10]
labels = ['A', 'B', 'C', 'D', 'E']

# 원 그래프 그리기
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title('Pie Chart')
plt.show()



  Box Plot (박스 플롯)


박스 플롯은 데이터의 분포와 이상치를 시각적으로 보여줍니다.
중앙값, 사분위수, 최솟값, 최댓값 등의 정보를 제공하여 데이터의 통계적 특성을 파악하는 데 사용됩니다.
  • 자료 유형: 연속형 데이터의 분포와 이상치를 시각화하는 데 주로 사용됩니다.
  • 활용: 데이터의 중앙값, 사분위수(25%, 50%, 75% 위치의 값), 최소값, 최대값, 이상치를 한눈에 파악할 수 있습니다.
import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
np.random.seed(10)
data = [np.random.normal(0, std, 100) for std in range(1, 4)]

# 박스 플롯 그리기
plt.boxplot(data)
plt.xlabel('Data')
plt.ylabel('Value')
plt.title('Box Plot')
plt.show()





(예시)
iris = sns.load_dataset("iris")
iris
 


species = iris['species'].unique()
 


sepal_length_list = [iris[iris['species'] == s] ['sepal_length'].tolist() for s in iris['species'].unique()]

sepal_length_list
 


len (list) ->  list 값이 총 몇 가지 로 구성되어있는지   여기선 3가지로 구성되있나봄
len(sepal_length_list)
 


list 옆에 [ ] 로 0,1,2 등 넣어주면 각 list 별로 몇 개씩 들어있는지 알 수 있음   여기선 50개씩 들어있음.
len(sepal_length_list[0])
 




plt.boxplot(sepal_length_list, labels=species)
plt.xlabel('Sepal Length')
plt.ylabel('Species')
plt.title('Box plot')
plt.show()
 




Box plot 상자 (25~75% 구간)
윗 부분 - 75%
노란색 - 중앙 값
아래 부분 - 25%


길게 뻗어 나온 위 - 최대값
길게 뻗어 나온 아래 - 최소값


o   -  아웃라이어 최소 최댓값 벗어나있는 값  이므로 보통은 제거하고 만듦.




강의 예시 중 seaborn  예시 에러남.  sepal_length 없는데.. 
sns.boxplot(x='species', y='sepal_length_list', data=iris)
plt.show()
 




훔 에러 

  Scatter Plot (산점도)
  • 산점도는 두 변수 간의 관계를 점으로 표시하여 보여주는 그래프입니다.
  • 두 변수 간의 상관 관계를 보여주고, 각 점이 데이터 포인트를 나타내며, 그 점들이 어떻게 분포되어 있는지 시각적으로 확인할 수 있습니다.
    • 자료 유형: 두 변수 간의 관계 및 상관관계를 보여줄 때 사용됩니다.
    • 활용: 변수 간의 관계, 군집, 이상치를 확인하고자 할 때 유용합니다.
import matplotlib.pyplot as plt

# 데이터 생성
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

# 산점도 그리기
plt.scatter(x, y)
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title('Scatter Plot')
plt.show()







(예시)
plt.scatter(iris['petal_length'], iris['petal_width'])
plt.xlabel('petal len')
plt.ylabel('petal wid')
plt.show()
 




petal -> sepal 로 값을 변경했을 경우
plt.scatter(iris['sepal_length'], iris['sepal_width'])
plt.xlabel('sepal len')
plt.ylabel('sepal wid')
plt.show()
 


강의에선 에러난다고 했는데.이건 또 왜 나옴  (에러나는 이유는 값 중 string  (문자) 값이 들어있어서 그렇다함)
iris.corr
 


숫자형태의 변수들만 가지고 활용하겠다.
iris.corr(numeric_only=True)
 


sepal length 와 petal length 관계성


plt.scatter(iris['sepal_length'], iris['petal_length'])
plt.xlabel('sepal len')
plt.ylabel('petal len')
plt.show()
 


 

⁉️ 상관관계란?

  • 상관관계 확인하기
    1. 양의 상관관계: 산점도에서 점들이 오른쪽 위 방향으로 일직선으로 분포되어 있을 때를 말합니다. 즉, 하나의 변수가 증가할 때 다른 변수도 증가하는 경향이 있습니다.
    2. 음의 상관관계: 산점도에서 점들이 왼쪽 위 방향으로 일직선으로 분포되어 있을 때를 말합니다. 하나의 변수가 증가할 때 다른 변수는 감소하는 경향이 있습니다.
    3. 무상관 관계: 산점도에서 점들이 어떤 방향으로도 일직선으로 분포하지 않고 무작위로 퍼져 있을 때를 말합니다. 즉, 두 변수 간에는 상관관계가 거의 없는 것으로 보입니다.
  • 상관관계의 강도 확인하기
    1. 점들의 모임: 점들이 더 밀집된 곳은 상관관계가 높다는 것을 나타낼 수 있습니다.
    2. 점들의 방향성: 일직선에 가까운 분포일수록 상관관계가 강할 가능성이 높습니다.
    3. 상관계수 계산: 피어슨 상관계수와 같은 통계적 방법을 사용하여 상관관계의 정도를 수치적으로 계산할 수 있습니다.


⁉️ 피어슨 상관계수란?

  • 피어슨 상관계수(Pearson correlation coefficient)는 두 변수 간의 선형적인 관계를 측정하기 위한 통계적인 방법 중 하나입니다. 주로 연속형 변수들 (숫자값) 간의 상관관계를 평가하는 데 사용됩니다.
  • 피어슨 상관계수의 특징:
    • 범위: -1에서 1 사이의 값을 가집니다.
    • 양의 상관관계: 1에 가까울수록 강한 양의 선형관계를 나타냅니다.
    • 음의 상관관계: -1에 가까울수록 강한 음의 선형관계를 나타냅니다.
    • 무상관 관계: 0에 가까울수록 선형관계가 거의 없거나 약한 관계를 가집니다.
    • ** 다만 양이든 음이든 선형관계는 인과관계와는 별도의 것임. (꼭 x가 증가해서 y가 증가한 것이 인과관계로 볼 수 없음 주의!!!)