import pandas as pd
파이썬: 필수 문법 및 함수 요약
데이터 분석과 프로그래밍에서 자주 사용되는 Python과 NumPy의 주요 기능들을 정리합니다. 이 글에서는 Python의 기본 자료구조와 NumPy 라이브러리의 유용한 함수들을 소개합니다.
Python 기본 자료구조 활용
Dictionary (딕셔너리)
Python의 딕셔너리는 키(key)와 값(value) 쌍으로 데이터를 저장하는 자료구조입니다.
Dictionary = {'-': 'ee'}
# 특정 키-값 삭제
del Dictionary['-']
List (리스트)
리스트는 Python에서 가장 유용하게 쓰이는 순차 자료구조입니다. 아래는 리스트 관련 주요 함수들입니다.
-
pop()
특정 인덱스의 값을 반환하고 삭제합니다.List = ['apple', 'banana', 'cherry'] List.pop(1) # 'banana'를 반환하고 리스트에서 삭제 List.pop() # 마지막 요소 반환 후 삭제
-
count()
리스트에서 특정 값의 개수를 반환합니다.List.count('apple') # 'apple'의 개수를 반환
-
split()
문자열을 특정 구분자로 나눠 리스트로 반환합니다.text = "apple,banana,cherry" text.split(',') # ['apple', 'banana', 'cherry']
-
join()
리스트의 문자열 요소를 하나의 문자열로 병합합니다.words = ['pat', 'cat'] print("".join(words)) # 'patcat' print("&".join(words)) # 'pat&cat'
예제: join()을 이용해서 문자열을 매핑하고 결과를 반환하는 예제
다음은 dictionary를 이용해서 입력 문자열의 문자를 매핑하고, 그 결과를 반환하는 함수에 관한 예제 입니다. input_str의 각 문자를 순회하며 signal doctionary에 매핑된 값이 있으면 대체합니다. 만일 doctionary에 매핑된 값이 없으면 그대로 둡니다.
import numpy as np
import pandas as pd
# Dictionarysignal = {'a':'n', 'b':'d', 'c':'a', 'd':'b', 'e':'v', 'f':'z', 'g':'k'}def code(input_str): var1 = "".join(signal[char] if char in signal else char for char in input_str) return var1print(code('w fhle khj'))
Tuple (튜플)
튜플은 리스트와 유사하지만, 불변(immutable) 특성을 갖는 자료구조입니다.
Tupple = ('-', 'ee')
NumPy 활용
기초 배열 생성
-
0과 1로 채워진 배열
np.zeros(10, dtype=int) # 0으로 채워진 정수형 배열 np.ones((3, 5), dtype=float) # 1로 채워진 3x5 배열
-
숫자 시퀀스 생성
np.arange(0, 20, 2) # 0부터 20까지 2 간격의 숫자 배열 np.linspace(0, 1, 5) # 0부터 1까지 균등 간격으로 5개의 숫자
난수 배열 생성
-
임의의 값으로 배열 생성
np.random.random((2, 2)) # 2x2 크기의 임의의 실수 배열
-
정규분포 난수 생성
np.random.normal(0, 1, (2, 2)) # 평균 0, 표준편차 1의 정규분포
-
정수 난수 생성
np.random.randint(0, 10, (2, 2)) # 0~9 사이의 정수 배열
배열 조작
-
배열 형태 변환
x = np.arange(8).reshape(2, 4) # 1차원 배열을 2x4 배열로 변환
-
배열 결합
np.concatenate([x, x], axis=0) # 행 방향 결합 np.concatenate([x, x], axis=1) # 열 방향 결합
-
배열 분할
upper, lower = np.split(x, [1], axis=0) # 행 방향으로 분할
예제: NumPy와 Python의 조합
다음은 Python과 NumPy를 조합하여 간단한 데이터 처리 작업을 수행하는 예제입니다.
import numpy as np
import pandas as pd
# 데이터 생성
data = np.random.randint(0, 100, (5, 5))
df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D', 'E'])
# 특정 열의 합계 계산
column_sum = df['A'].sum()
print(f"A 열의 합계: {column_sum}")
# 배열 결합
combined = np.concatenate([data, data], axis=0)
print(combined)
Pandas 활용
Pandas는 데이터 처리와 분석에 강력한 기능을 제공하는 Python 라이브러리입니다. 이번 포스팅에서는 Pandas의 주요 기능과 함께 DataFrame 생성, 데이터 전처리, 그룹화 및 정렬 등의 유용한 메서드들을 정리했습니다.
1. DataFrame 생성
Pandas의 핵심 데이터 구조는 DataFrame입니다.
DataFrame은 행(row)과 열(column)로 구성된 테이블 형태의 데이터를 다룹니다.
직접 생성
import pandas as pd
score = pd.DataFrame({
'이름': ['민수', '도윤', '하나', '지민'],
'국어': [95, 98, 89, 100],
})
print(score)
CSV 또는 Excel 파일 불러오기
# CSV 파일 읽기
df = pd.read_csv('data.csv')
# Excel 파일 읽기
df = pd.read_excel('data.xlsx')
2. 데이터 변환 및 결합
데이터 형 변환
# 문자열 -> 숫자 변환
df["어른"] = pd.to_numeric(df["어른"])
# 문자열 -> 날짜 변환
df["날짜"] = pd.to_datetime(df["날짜"])
DataFrame 결합
-
행(row) 추가
df = pd.concat([df1, df2], axis=0, join='outer', ignore_index=True) df = df1.append(df2)
-
열(column) 추가
df = pd.merge(df1, df2, on='월', how='inner')
3. 데이터 조회 및 요약
기본 조회
df.head() # 상위 5개 데이터
df.tail() # 하위 5개 데이터
특정 열/행 조회
df[["공휴일", "어른"]] # 특정 열 선택
df.loc[0] # 첫 번째 행의 모든 열df.loc[23, "합계"] # 특정 행의 값 선택
df.loc[(df["어른"] > 10) & (df["아이"] < 10), ["날짜", "합계"]]
요약 정보 및 통계
df.info() # 데이터 정보
df.describe() # 통계 요약
df["공휴일"].value_counts() # "공휴일" 열에 있는 각 공휴일의 개수를 출력
df["어른"].mean() # 특정 열의 평균
4. 데이터 변형 및 전처리
데이터 수정
# 데이터 형 변환
df["어른"] = df["어른"].astype(int)
# 문자열 대체
df["합계"] = df["합계"].str.replace('-', '0')
새로운 열 추가
# 날짜에서 연도 추출
df["년"] = df["날짜"].dt.year
# 조건에 따른 값 변환
df["날씨"] = df["날씨"].apply(lambda e: '눈/비' if e == '눈' else e)
df["고령여부"] = df["노인인구비율"].apply(lambda e: "X" if e >= 0.14 else "O")
# 딕셔너리 매핑
week = {'월': 'Mon', '화': 'Tue', '수': 'Wed'}
df["요일"] = df["요일"].map(week)
5. 데이터 분석
그룹화와 집계
# 특정 열 기준 평균 계산
df.groupby("날씨")["총계"].mean()
# 여러 열 합계 계산 후 초기화
df2 = df.groupby("지역구분")[["10대 미만", "10대"]].sum().reset_index()
조건부 필터링
df[(df["어른"] > 10) & (df["아이"] < 10)]
6. 데이터 정렬
df.sort_values("총계", ascending=True) # 값 기준 오름차순 정렬
df.sort_values(["A", "B"], ascending=[True, False], inplace=True) # "A" 열 오름차순, "B" 열 내림차순, inplace=True 변경된 결과를 직접 저장
예제: 실습 코드
# CSV 파일 불러오기
df = pd.read_csv('data.csv')
# 어른 열을 숫자로 변환
df["어른"] = pd.to_numeric(df["어른"])
# 날짜 변환 및 연도 추출
df["날짜"] = pd.to_datetime(df["날짜"])
df["년"] = df["날짜"].dt.year
# 지역별 데이터 요약
region_summary = df.groupby("지역구분")[["10대 미만", "10대"]].sum().reset_index()
# 특정 조건 데이터 조회
filtered_data = df[(df["어른"] > 10) & (df["아이"] < 10)]
print(filtered_data)
7. 데이터 정렬 및 선택
데이터 정렬
특정 열 기준으로 데이터를 정렬하고, 특정 값을 추출할 수 있습니다.
# '초미세먼지' 기준 내림차순 정렬 후 세 번째 행의 날짜 값 추출
pollution1 = mm.sort_values("초미세먼지", ascending=False).iloc[2]["날짜"]
# 추출된 날짜 값을 가공
pollution2 = pollution1.split('-') # '-' 기준으로 문자열 분리
pollution = "".join(pollution2) # 분리된 문자열을 다시 합침
8. 데이터프레임 변환
인덱스 초기화
df = df.reset_index(drop=True) # 기존 인덱스를 제거하고 새로운 인덱스 설정
열 삭제
df = df.drop(["유료", "무료"], axis=1) # '유료'와 '무료' 열 삭제
열 이름 변경
df = df.rename(columns={"총계": "개수"}) # '총계' 열 이름을 '개수'로 변경
9. 결측치 처리
결측치 확인
df.isnull().sum() # 각 열의 결측치 개수 확인
결측치 채우기
# '어른' 열의 평균값으로 결측치를 채움
df["어른"] = df["어른"].fillna(int(df["어른"].mean()))
결측치 삭제
# '어른' 열에서 결측치가 포함된 행 삭제
df = df.dropna(subset=["어른"], ignore_index=True)
10. 데이터 가공 및 추가
열 추가: 문자열 분리와 가공
# '시군구'에서 두 번째 단어만 추출하여 '구' 열 생성
df["구"] = df["시군구"].apply(lambda e: e.split()[1])
날짜 데이터 생성
# 연, 월, 일을 결합하여 '날짜' 열 생성
df["날짜"] = df["년"].astype('str') + df["월"].astype('str') + df["일"].astype('str')
# '날짜' 열을 datetime 형식으로 변환
df["날짜"] = pd.to_datetime(df["날짜"], format='%y%m%d')
요일 정보 추가
# '날짜' 열에서 요일 추출 (0: 월요일, 1: 화요일, ...)
df["요일"] = df["날짜"].dt.dayofweek
# 요일 숫자를 한글 요일로 매핑
df["요일"] = df["요일"].map({0: '월', 1: '화', 2: '수', 3: '목', 4: '금', 5: '토', 6: '일'})
11. 데이터 확인 및 활용
데이터 확인
df.iloc[0] # 첫 번째 행 조회 (Index Location)
데이터 정렬 후 값 추출
# '먼지' 열 기준 내림차순 정렬 후 세 번째 날짜 값 추출
pollution = df.sort_values("먼지", ascending=False).iloc[2]["날짜"]
# 날짜 값 가공
list_pollution = pollution.split('-')
pollution = "".join(list_pollution)
예제 코드: 데이터 전처리 흐름
아래는 위에서 다룬 주요 기능들을 조합한 데이터 전처리 예제입니다.
import pandas as pd
# 데이터프레임 생성
df = pd.DataFrame({
"시군구": ["서울 강남구", "서울 송파구", "서울 마포구"],
"년": [2024, 2024, 2024],
"월": [11, 11, 11],
"일": [25, 26, 27],
"초미세먼지": [35, 40, 45],
"유료": [10, 15, 20],
"무료": [5, 10, 15],
"어른": [None, 20, 25]
})
# 전처리 작업
df = df.drop(["유료", "무료"], axis=1)
df["어른"] = df["어른"].fillna(int(df["어른"].mean()))
df["구"] = df["시군구"].apply(lambda e: e.split()[1])
df["날짜"] = df["년"].astype('str') + df["월"].astype('str') + df["일"].astype('str')
df["날짜"] = pd.to_datetime(df["날짜"], format='%Y%m%d')
df["요일"] = df["날짜"].dt.dayofweek.map({0: '월', 1: '화', 2: '수', 3: '목', 4: '금', 5: '토', 6: '일'})
# 정렬 후 특정 값 추출
pollution = df.sort_values("초미세먼지", ascending=False).iloc[2]["날짜"]
list_pollution = pollution.split('-')
pollution = "".join(list_pollution)
print(df)
print(f"세 번째 높은 초미세먼지 날짜: {pollution}")
예제 코드: 아파트 실거래 분석
Matplotlib 활용: 기본부터 Subplot까지
figure
와 subplot
을 활용한 고급 그래프 작성법까지 단계별로 설명하겠습니다.1. 기본 그래프 그리기
라인 플롯(Line Plot)
Matplotlib에서 가장 기본적인 플롯은 라인 플롯입니다. 아래는 라인 플롯의 기본 구성입니다.
import matplotlib.pyplot as plt
# 데이터
xdata = [2018, 2019, 2020, 2021]
ydata = [20, 21, 22, 23]
# 그래프 생성
plt.title("파이썬의 언어 점유율", fontsize=20) # 제목 설정
plt.plot(xdata, ydata, label="파이썬", marker=".", linestyle="--", color="r") # 첫 번째 라인
plt.plot(xdata, ydata, label="bbb") # 두 번째 라인
plt.xticks([2018, 2019, 2020, 2021]) # X축 눈금 설정
plt.yticks([20, 21, 22, 23]) # Y축 눈금 설정
plt.grid(True, axis="both") # 그리드 활성화 (X, Y축 모두)
plt.xlabel("년도") # X축 라벨
plt.ylabel("점유율 (%)") # Y축 라벨
plt.legend() # 범례 표시
plt.show() # 그래프 출력
결과
위 코드는 파이썬과 다른 데이터 세트에 대한 라인 플롯을 생성하며, X축과 Y축 눈금, 범례, 제목 등을 설정합니다.
2. 여러 그래프 관리: Figure와 Subplot
Figure 객체 생성
Matplotlib에서는 하나의 창을 figure
라고 하며, 각 figure에 개별 그래프를 그릴 수 있습니다.
# Figure 1
fig1 = plt.figure(1, figsize=(4, 3)) # ID가 1인 새로운 figure 생성
plt.plot(xdata, ydata, label="Python") # 그래프 추가
plt.title("fig1: Python 점유율") # 제목 설정
# Figure 2
fig2 = plt.figure(2, figsize=(4, 3)) # ID가 2인 새로운 figure 생성
plt.plot(xdata, [15, 16, 18, 20], label="Java", color="g") # 그래프 추가
plt.title("fig2: Java 점유율") # 제목 설정
plt.show() # 모든 figure를 출력
결과
각 figure는 독립적인 그래프를 담고 있어 데이터를 비교하거나 개별적으로 분석할 때 유용합니다.
3. Subplots: 한 Figure에 여러 그래프 배치
하나의 figure 안에 여러 그래프를 배치하려면 **subplot
**이나 **subplots
**를 사용할 수 있습니다.
기본 Subplot
fig, (ax1, ax2) = plt.subplots(2, 1, constrained_layout=True) # 2행 1열 레이아웃 생성
# 첫 번째 축(ax1)에 그래프 추가
ax1.plot(xdata, ydata, color="b")
ax1.set_title("Python 점유율") # 제목
ax1.set_xlabel("년도") # X축 라벨
ax1.set_ylabel("점유율 (%)") # Y축 라벨
# 두 번째 축(ax2)에 그래프 추가
ax2.plot(xdata, [15, 16, 18, 20], color="g")
ax2.set_title("Java 점유율") # 제목
ax2.set_xlabel("년도") # X축 라벨
ax2.set_ylabel("점유율 (%)") # Y축 라벨
plt.show() # 그래프 출력
결과
- 하나의 창에 두 개의 그래프가 위아래로 배치됩니다.
- 각 그래프는 독립적으로 설정 가능하며,
constrained_layout=True
옵션을 통해 자동 정렬됩니다.
4. 응용: 다양한 그래프 스타일
범례(Legend) 설정
범례를 명시적으로 설정하여 각 라인의 의미를 나타낼 수 있습니다.
plt.legend(['Python', 'Java', 'C']) # 그래프에 포함된 데이터 레이블 명시
Grid 설정
plt.grid(True, axis="x") # X축에만 그리드 표시
plt.grid(True, axis="y") # Y축에만 그리드 표시
커스텀 스타일
plt.plot(xdata, ydata, marker="o", linestyle="-.", color="purple", label="Custom Style")
5. 실전 예제: 다중 그래프와 레이아웃
# 데이터 준비
year = [2018, 2019, 2020, 2021]
python = [20, 21, 22, 23]
java = [15, 16, 18, 20]
# Subplots 생성
fig, axs = plt.subplots(1, 2, figsize=(10, 4), constrained_layout=True) # 1행 2열 레이아웃
# 첫 번째 그래프
axs[0].plot(year, python, label="Python", color="r", marker="o")
axs[0].set_title("Python 점유율")
axs[0].set_xlabel("년도")
axs[0].set_ylabel("점유율 (%)")
# 두 번째 그래프
axs[1].plot(year, java, label="Java", color="g", linestyle="--")
axs[1].set_title("Java 점유율")
axs[1].set_xlabel("년도")
axs[1].set_ylabel("점유율 (%)")
# 범례 표시
for ax in axs:
ax.legend()
plt.show()
데이터 시각화 : Seaborn과 Matplotlib 활용
데이터 분석의 핵심은 데이터를 효과적으로 시각화하여 인사이트를 도출하는 데 있습니다. Python의 대표적인 시각화 라이브러리 Seaborn과 Matplotlib를 활용해 다양한 유형의 그래프를 생성하는 방법은 아래와 같습니다.
1. 선 그래프 (Line Plot)
선 그래프는 시간에 따른 데이터 변화를 시각화하는 데 유용합니다.
기본 선 그래프
Seaborn의 lineplot
과 Matplotlib의 plot
을 사용해 그래프를 쉽게 그릴 수 있습니다.
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터
year = [2018, 2019, 2020, 2021]
python = [20, 22, 24, 27]
java = [15, 17, 19, 21]
# Seaborn 선 그래프
sns.set_style("darkgrid")
sns.lineplot(x=year, y=python, label="Python", color="blue")
plt.plot(year, python, linestyle="--", color="r", label="Python (Matplotlib)")
plt.grid(True, axis="both")
plt.title("연도별 프로그래밍 언어 점유율")
plt.legend()
plt.show()
Subplots로 여러 그래프 그리기
한 화면에 여러 그래프를 나란히 배치하려면 plt.subplots()
를 활용합니다.
fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True)
sns.lineplot(x=year, y=python, ax=ax1, label="Python")
ax1.set_title("Python 점유율")
sns.lineplot(x=year, y=java, ax=ax2, label="Java")
ax2.set_title("Java 점유율")
plt.show()
2. 막대 그래프 (Bar Plot)
기본 막대 그래프
Matplotlib과 Seaborn을 사용해 월별 데이터를 시각화할 수 있습니다.
# 데이터 준비
df_mon = df.groupby("월").mean(numeric_only=True)
# Matplotlib 막대 그래프
plt.bar(df_mon.index, df_mon["어른"], label="어른", color="skyblue")
plt.title("월별 어른 입장객 수")
plt.xlabel("월")
plt.ylabel("평균 입장객")
plt.legend()
plt.show()
Seaborn 막대 그래프
Seaborn의 barplot
을 사용하면 범주형 데이터와 연속형 데이터를 쉽게 표현할 수 있습니다.
sns.barplot(data=df, x="월", y="어른", hue="공휴일", errorbar=None)
plt.title("공휴일별 어른 입장객")
plt.show()
3. 파이 차트
비율 분석
Matplotlib의 pie
를 사용해 데이터를 시각적으로 비교할 수 있습니다.
# 데이터 준비
data_2019 = df[df["연"] == 2019][["어른", "청소년", "어린이"]].sum()
labels = data_2019.index.tolist()
data = data_2019.tolist()
plt.pie(data, labels=labels, autopct="%1.1f%%", startangle=90)
plt.title("2019년 연령별 입장객 비율")
plt.legend(loc="lower left")
plt.show()
4. 히스토그램 (Histogram)
기본 히스토그램
히스토그램은 연속형 데이터의 분포를 확인하는 데 유용합니다.
# Matplotlib 히스토그램
df_sat = df[df["요일"] == "토"]
plt.hist(df_sat["어린이"], bins=10, color="purple", alpha=0.7)
plt.title("토요일 어린이 입장객 분포")
plt.xlabel("어린이 입장객 수")
plt.ylabel("빈도")
plt.show()
Seaborn 히스토그램
Seaborn의 histplot
을 사용하면 추가적인 스타일링이 가능합니다.
sns.histplot(
data=df,
x="어린이",
hue="연",
binrange=(0, 800),
bins=10,
multiple="dodge",
shrink=0.8,
)
plt.title("연도별 어린이 입장객 분포")
plt.show()
5. 박스 그래프 (Box Plot)
박스 그래프는 데이터의 분포와 이상치를 한눈에 파악할 수 있습니다.
# Matplotlib 박스 그래프
df_apr = df[(df["연"] == 2018) & (df["월"] == 4)]
plt.boxplot([df_apr["어린이"], df_apr["어른"], df_apr["청소년"]])
plt.xticks([1, 2, 3], labels=["어린이", "어른", "청소년"])
plt.title("2018년 4월 입장객 분포")
plt.show()
Seaborn 박스 그래프
Seaborn의 boxplot
으로 더 세련된 그래프를 그릴 수 있습니다.
sns.boxplot(data=df_apr, y="어린이")
plt.title("2018년 4월 어린이 입장객 분포")
plt.show()
6. 산점도 (Scatter Plot)
산점도는 두 변수 간의 관계를 시각화하는 데 사용됩니다.
# Matplotlib 산점도
plt.scatter(df["어른"], df["청소년"], alpha=0.7)
plt.xlabel("어른 입장객 수")
plt.ylabel("청소년 입장객 수")
plt.title("어른과 청소년 입장객 상관관계")
plt.show()
# Seaborn 산점도
sns.scatterplot(data=df, x="어른", y="어린이", hue="공휴일")
plt.title("어른과 어린이 입장객 상관관계")
plt.show()
7. 히트맵 (Heatmap)
히트맵은 변수 간 상관관계를 한눈에 파악할 수 있는 도구입니다.
df_corr = df.corr(numeric_only=True) # 상관계수 계산
sns.heatmap(df_corr, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("상관관계 히트맵")
plt.show()
예제: 실습 코드
import pandas as pd
import matplotlib.pyplot as pd
import seaborn as sns
DATA_PATH ="data/sdf.csv"
def load_csv(path) -> pd.DataFrame:
# pandas로 데이터를 DataFrame 형태로 로딩
df = pd.read_csv(path)
return df
def make_heatmap(df: pd.DataFrame):
# seaborn으로 모든 열의 상관 관계를 heatmap으로 표시
df_corr=df.corr()
sns.heatmap(df_corr)
show_plot("heatmap")
def get_corr
(df: pd.DataFrame) -> float:
# platelets와 serium_sodium의 상관계수를 구하여 float형으로 반환
df_corr = df.corr()
return(df_corr["platelets"]["serium_sodium"])
def main():
df = load_csv(DATA_PATH)
make_heatmap(df)
corr = get_corr(df)
print("상관계수:", corr)
if __name__ == "__main__":
main()
8. 주요 시각화 정리
그래프 유형 라이브러리 함수 사용 목적 선 그래프 Seaborn lineplot
시간에 따른 변화 시각화
sns.lineplot(data = data, x = 'body_mass_g', y = 'flipper_length_mm', ci = None) 막대 그래프 Seaborn barplot
범주형 데이터 비교
sns.barplot(data = data, x = 'body_mass_g', y = 'species', hue = 'sex') 파이 차트 Matplotlib plt.pie
데이터 비율 표현 히스토그램 Seaborn histplot
연속형 데이터의 분포 분석
sns.histplot(data = data, x = 'body_mass_g', bins = 15, hue = 'species', multiple='stack') 박스 그래프 Seaborn boxplot
데이터 분포 및 이상치 시각화
sns.boxplot(data = data, x = 'species', y = 'bill_depth_mm', hue= 'sex') 산점도 Seaborn scatterplot
변수 간 상관관계 시각화
sns.scatterplot(data = data, x ='flipper_length_mm', y = 'body_mass_g', hue = 'sex') 히트맵 Seaborn heatmap
변수 간 상관관계 또는 데이터 밀도 분석
corr = data.corr()
sns.heatmap(data = corr, square= True, cmap = 'Blues', annot=True)
맺음말
Seaborn과 Matplotlib를 활용해 다양한 시각화 방법을 소개했습니다. 데이터 분석의 마지막 단계인 시각화를 통해 보다 깊은 통찰을 얻으시길 바랍니다.
0 댓글