본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 15. · 130 Views
판다스 DataFrame 시작하기 완벽 가이드
데이터 분석의 첫걸음, pandas DataFrame을 처음 시작하는 분들을 위한 가이드입니다. CSV 파일 읽기부터 데이터 미리보기, 기본 정보 확인까지 실무에서 가장 많이 사용하는 기능들을 이북처럼 술술 읽히는 스타일로 알려드립니다.
목차
- pandas_라이브러리란
- DataFrame과_Series_개념
- CSV_파일_읽기
- head와_tail로_데이터_미리보기
- info로_데이터_타입_확인
- shape로_데이터_크기_파악
- describe로_기본_통계_확인
1. pandas 라이브러리란
어느 날 데이터 분석팀에 배치된 신입 개발자 김데이터 씨는 엑셀 파일 100개를 손으로 정리하고 있었습니다. 선배 박분석 씨가 다가와 물었습니다.
"그거 pandas 쓰면 10분이면 끝나는데요?"
pandas는 파이썬에서 데이터를 다루는 가장 강력한 라이브러리입니다. 마치 엑셀의 슈퍼 파워 버전처럼, 수천만 개의 데이터를 빠르게 처리하고 분석할 수 있습니다.
데이터 과학자와 개발자들이 가장 먼저 배우는 필수 도구입니다.
다음 코드를 살펴봅시다.
# pandas 라이브러리 불러오기
import pandas as pd
# pandas 버전 확인하기
print(f"pandas 버전: {pd.__version__}")
# 간단한 데이터프레임 만들어보기
data = {
'이름': ['김철수', '이영희', '박민수'],
'나이': [25, 30, 28],
'직업': ['개발자', '디자이너', '기획자']
}
df = pd.DataFrame(data)
print(df)
김데이터 씨는 입사 1주일 차 신입 개발자입니다. 오늘도 열심히 엑셀 파일을 열어 데이터를 복사하고 붙여넣고 있었습니다.
그런데 파일이 100개나 되니 손이 아프기 시작합니다. 선배 개발자 박분석 씨가 커피를 들고 다가와 모니터를 슬쩍 봅니다.
"아직도 엑셀로 수작업하고 계셨어요? pandas 쓰면 금방인데." 그렇다면 pandas란 정확히 무엇일까요?
쉽게 비유하자면, pandas는 마치 슈퍼 파워를 가진 엑셀과 같습니다. 엑셀은 클릭으로 데이터를 다루지만, pandas는 코드로 데이터를 다룹니다.
더 빠르고, 더 정확하며, 수백만 개의 데이터도 거뜬히 처리할 수 있습니다. pandas가 없던 시절에는 어땠을까요?
파이썬 개발자들은 데이터를 다루기 위해 직접 복잡한 코드를 작성해야 했습니다. 리스트와 딕셔너리를 조합하고, 반복문을 돌리고, 하나하나 계산해야 했습니다.
실수하기도 쉬웠고, 코드도 길어졌습니다. 더 큰 문제는 성능이었습니다.
큰 데이터를 다루려면 시간이 너무 오래 걸렸습니다. 바로 이런 문제를 해결하기 위해 pandas가 등장했습니다.
pandas를 사용하면 데이터를 표 형태로 쉽게 관리할 수 있습니다. 또한 복잡한 계산을 한 줄로 처리할 수 있습니다.
무엇보다 대용량 데이터도 빠르게 처리할 수 있다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 첫 번째 줄을 보면 import pandas as pd라고 작성되어 있습니다. 이것은 pandas 라이브러리를 불러오는 코드입니다.
as pd는 pandas를 줄여서 pd라고 부르겠다는 뜻입니다. 전 세계 개발자들이 이렇게 사용하는 관례입니다.
다음으로 딕셔너리 형태로 데이터를 만들었습니다. 이름, 나이, 직업이라는 키에 각각 리스트 값을 넣었습니다.
그리고 pd.DataFrame()으로 감싸면 표 형태의 데이터프레임이 만들어집니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 쇼핑몰 서비스를 운영한다고 가정해봅시다. 매일 발생하는 주문 데이터를 엑셀로 관리하기는 너무 어렵습니다.
하지만 pandas를 사용하면 하루에 수만 건의 주문을 자동으로 분석하고, 매출 통계를 만들고, 고객 패턴을 찾아낼 수 있습니다. 네이버, 카카오 같은 대기업에서도 pandas를 적극 활용하고 있습니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 pandas를 설치하지 않고 바로 import하려는 것입니다.
pandas는 기본 라이브러리가 아니므로 먼저 pip install pandas로 설치해야 합니다. 설치하지 않으면 ImportError가 발생합니다.
다시 김데이터 씨의 이야기로 돌아가 봅시다. 박분석 씨의 설명을 들은 김데이터 씨는 눈이 반짝였습니다.
"와, 이렇게 쉬운 방법이 있었네요!" pandas를 제대로 이해하면 데이터 분석의 세계가 열립니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - pandas 설치는 pip install pandas 명령어로 합니다
import pandas as pd는 전 세계 개발자들이 사용하는 표준 관례입니다- 엑셀 파일도 pandas로 읽을 수 있습니다 (
pd.read_excel())
2. DataFrame과 Series 개념
박분석 씨가 김데이터 씨에게 물었습니다. "DataFrame이랑 Series의 차이를 아세요?" 김데이터 씨는 고개를 갸우뚱했습니다.
둘 다 데이터를 담는 건데 뭐가 다를까요?
DataFrame은 행과 열로 이루어진 2차원 표 형태의 데이터 구조입니다. Series는 하나의 열만 가진 1차원 데이터 구조입니다.
마치 DataFrame은 여러 과목 성적표, Series는 한 과목 성적표와 같습니다.
다음 코드를 살펴봅시다.
import pandas as pd
# Series 만들기 (1차원 - 한 개의 열)
ages = pd.Series([25, 30, 28], name='나이')
print("Series:")
print(ages)
print(f"\nSeries의 타입: {type(ages)}")
# DataFrame 만들기 (2차원 - 여러 개의 열)
df = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수'],
'나이': [25, 30, 28],
'직업': ['개발자', '디자이너', '기획자']
})
print("\nDataFrame:")
print(df)
print(f"\nDataFrame의 타입: {type(df)}")
김데이터 씨는 pandas를 처음 배우면서 궁금한 점이 생겼습니다. 문서를 읽다 보니 DataFrame도 나오고 Series도 나오는데, 대체 무슨 차이일까요?
박분석 씨가 화이트보드에 그림을 그리며 설명하기 시작합니다. "자, 여기 학생들의 성적표가 있다고 생각해 봅시다." 그렇다면 DataFrame과 Series는 정확히 무엇일까요?
쉽게 비유하자면, DataFrame은 엑셀의 전체 시트와 같습니다. 여러 개의 열이 있고, 각 열마다 이름이 있고, 행도 여러 개 있습니다.
반면 Series는 엑셀에서 한 개의 열만 선택한 것과 같습니다. 이름 열만 따로 보거나, 나이 열만 따로 볼 때 Series가 됩니다.
왜 이렇게 두 가지로 나뉘어 있을까요? 실무에서 데이터를 다루다 보면 전체 표가 필요할 때도 있지만, 특정 열 하나만 필요할 때도 많습니다.
예를 들어 고객의 나이만 따로 분석하거나, 매출 금액만 계산할 때는 Series가 더 편리합니다. DataFrame에서 한 개의 열을 꺼내면 자동으로 Series가 됩니다.
DataFrame과 Series의 관계는 어떻게 될까요? DataFrame은 여러 개의 Series를 모아놓은 것입니다.
각 열이 하나의 Series이고, 이것들을 옆으로 쭉 붙여놓으면 DataFrame이 됩니다. 마치 여러 개의 막대를 나란히 세워놓은 것처럼 말입니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 Series를 만들 때는 pd.Series()를 사용합니다.
리스트를 넣고, name 매개변수로 이름을 지정할 수 있습니다. Series를 출력하면 왼쪽에 인덱스(0, 1, 2)가 표시되고, 오른쪽에 값이 나옵니다.
DataFrame을 만들 때는 pd.DataFrame()에 딕셔너리를 넣습니다. 딕셔너리의 각 키가 열 이름이 되고, 값이 그 열의 데이터가 됩니다.
출력하면 표 형태로 깔끔하게 보입니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 전자상거래 회사에서 고객 데이터를 분석한다고 가정해봅시다. 전체 고객 정보는 DataFrame으로 관리하지만, 특정 분석을 할 때는 Series를 사용합니다.
고객의 평균 나이를 계산할 때는 나이 Series만 꺼내서 .mean()을 호출하면 됩니다. 구매 금액의 합계를 구할 때도 금액 Series만 사용합니다.
DataFrame에서 Series를 꺼내는 방법도 알아야 합니다. df['이름']처럼 대괄호에 열 이름을 넣으면 그 열이 Series로 반환됩니다.
또는 df.이름처럼 점 표기법을 사용할 수도 있습니다. 두 방법 모두 같은 결과를 돌려주지만, 열 이름에 공백이 있거나 특수문자가 있으면 대괄호 방식을 사용해야 합니다.
주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수는 Series와 DataFrame을 헷갈리는 것입니다.
어떤 함수는 DataFrame에만 작동하고, 어떤 함수는 Series에만 작동합니다. 타입을 확인하고 싶다면 type() 함수를 사용하세요.
type(df)는 DataFrame을, type(df['이름'])은 Series를 반환합니다. 다시 김데이터 씨의 이야기로 돌아가 봅시다.
박분석 씨의 설명을 들은 김데이터 씨는 고개를 끄덕였습니다. "아, 그러니까 DataFrame은 표 전체고, Series는 한 개 열이군요!" DataFrame과 Series의 차이를 이해하면 pandas를 훨씬 자유자재로 다룰 수 있습니다.
여러분도 직접 만들어보면서 차이를 체감해 보세요.
실전 팁
💡 - DataFrame에서 한 개 열을 꺼내면 자동으로 Series가 됩니다
df['열이름']또는df.열이름으로 Series를 꺼낼 수 있습니다- Series도 인덱스를 가지고 있어서 특정 위치의 값을 쉽게 찾을 수 있습니다
3. CSV 파일 읽기
김데이터 씨가 첫 번째 업무를 받았습니다. "이 CSV 파일 좀 분석해 주세요." 그런데 파일을 어떻게 파이썬으로 불러올까요?
엑셀처럼 더블클릭하면 될까요?
CSV 파일은 쉼표로 구분된 데이터 파일입니다. pandas의 read_csv() 함수를 사용하면 CSV 파일을 DataFrame으로 간단히 읽어올 수 있습니다.
실무에서 가장 많이 사용하는 데이터 불러오기 방법입니다.
다음 코드를 살펴봅시다.
import pandas as pd
# CSV 파일 읽기 (파일 경로 지정)
df = pd.read_csv('customers.csv')
# 인코딩 지정해서 읽기 (한글 깨짐 방지)
df = pd.read_csv('customers.csv', encoding='utf-8')
# 특정 열을 인덱스로 지정하며 읽기
df = pd.read_csv('customers.csv', index_col='고객번호')
# 일부 열만 선택해서 읽기
df = pd.read_csv('customers.csv', usecols=['이름', '나이', '지역'])
# 처음 5개 행만 읽기 (큰 파일 테스트할 때 유용)
df = pd.read_csv('customers.csv', nrows=5)
print(df)
김데이터 씨의 메일함에 첫 번째 업무 메일이 도착했습니다. "첨부된 고객 데이터 CSV 파일을 분석해서 보고서 작성 부탁드립니다." 파일을 다운로드하니 customers.csv라는 파일이 보입니다.
엑셀로 열어볼까 고민하던 김데이터 씨에게 박분석 씨가 말했습니다. "pandas로 바로 읽으면 되는데요?" 그렇다면 CSV 파일이란 정확히 무엇일까요?
쉽게 비유하자면, CSV는 가장 단순한 형태의 엑셀과 같습니다. 엑셀처럼 행과 열이 있지만, 화려한 색상이나 수식은 없습니다.
순수하게 데이터만 담겨 있습니다. 파일을 텍스트 에디터로 열어보면 쉼표(Comma)로 값들이 구분되어 있어서 CSV(Comma-Separated Values)라고 부릅니다.
왜 CSV 파일을 많이 사용할까요? 실무에서 데이터를 주고받을 때 가장 많이 쓰는 형식이 CSV입니다.
용량이 작고, 어떤 프로그램에서든 읽을 수 있으며, 다루기도 쉽습니다. 데이터베이스에서 데이터를 추출할 때도 CSV로 내보내는 경우가 많습니다.
구글 애널리틱스, 페이스북 광고 데이터 등도 모두 CSV로 다운로드할 수 있습니다. 바로 이런 CSV 파일을 읽기 위해 pandas는 read_csv() 함수를 제공합니다.
read_csv()를 사용하면 파일을 한 줄로 불러올 수 있습니다. 파일 경로만 지정하면 자동으로 DataFrame으로 변환됩니다.
또한 다양한 옵션을 지정할 수 있어서 어떤 형태의 CSV도 읽을 수 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
가장 기본적인 사용법은 pd.read_csv('파일경로')입니다. 파일 경로를 문자열로 넣으면 됩니다.
같은 폴더에 있으면 파일 이름만, 다른 폴더에 있으면 전체 경로를 입력합니다. 한글이 깨지는 문제가 생긴다면 encoding 매개변수를 지정합니다.
한글 파일은 보통 encoding='utf-8' 또는 encoding='cp949'를 사용합니다. 어느 것을 써야 할지 모르겠다면 둘 다 시도해 보면 됩니다.
특정 열을 인덱스로 사용하고 싶다면 index_col 매개변수를 씁니다. 예를 들어 고객번호 열을 인덱스로 만들면 나중에 고객번호로 데이터를 쉽게 찾을 수 있습니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 마케팅팀에서 광고 성과 데이터를 CSV로 받았다고 가정해봅시다.
매일 수천 개의 광고 데이터가 쌓이는데, 이것을 엑셀로 열면 느리고 불편합니다. 하지만 pandas로 읽으면 몇 초 만에 불러오고, 바로 분석을 시작할 수 있습니다.
클릭률 계산, 지역별 분석, 시간대별 트렌드 등을 코드 몇 줄로 처리할 수 있습니다. 큰 파일을 다룰 때 유용한 팁도 있습니다.
usecols 매개변수로 필요한 열만 선택해서 읽으면 메모리를 절약할 수 있습니다. 전체 파일이 100개 열인데 5개만 필요하다면, 5개만 읽는 것이 훨씬 효율적입니다.
또한 nrows 매개변수로 일부 행만 읽어서 먼저 테스트해볼 수도 있습니다. 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수는 파일 경로를 잘못 입력하는 것입니다. 윈도우에서는 역슬래시(\)를 사용하는데, 파이썬에서는 슬래시(/)를 쓰거나 역슬래시를 두 번(\\) 써야 합니다.
또는 경로 앞에 r을 붙여서 r'C:\data\file.csv'처럼 작성할 수도 있습니다. 다시 김데이터 씨의 이야기로 돌아가 봅시다.
박분석 씨의 안내대로 코드를 작성한 김데이터 씨는 감탄했습니다. "와, 1초 만에 10만 개 데이터가 로딩되네요!" CSV 파일 읽기는 데이터 분석의 시작점입니다.
여러분도 실제 CSV 파일을 다운로드해서 읽어보세요.
실전 팁
💡 - 한글 깨짐 현상이 생기면 encoding='utf-8' 또는 encoding='cp949'를 시도해 보세요
- 파일이 너무 크면
nrows매개변수로 일부만 읽어서 테스트하세요 - 인터넷 URL의 CSV도 바로 읽을 수 있습니다 (
pd.read_csv('https://...'))
4. head와 tail로 데이터 미리보기
CSV 파일을 읽었습니다. 그런데 데이터가 10만 개나 됩니다.
전부 출력하면 화면이 터질 것 같은데, 어떻게 살짝만 미리 볼 수 있을까요?
head() 함수는 데이터의 처음 몇 개 행을 보여줍니다. tail() 함수는 마지막 몇 개 행을 보여줍니다.
큰 데이터를 빠르게 훑어볼 때 가장 먼저 사용하는 필수 함수입니다.
다음 코드를 살펴봅시다.
import pandas as pd
# 샘플 데이터프레임 생성
df = pd.DataFrame({
'날짜': pd.date_range('2024-01-01', periods=100),
'매출': range(1000, 1100),
'방문자': range(500, 600)
})
# 처음 5개 행 보기 (기본값)
print("처음 5개 행:")
print(df.head())
# 처음 10개 행 보기
print("\n처음 10개 행:")
print(df.head(10))
# 마지막 5개 행 보기
print("\n마지막 5개 행:")
print(df.tail())
# 마지막 3개 행 보기
print("\n마지막 3개 행:")
print(df.tail(3))
김데이터 씨가 CSV 파일을 성공적으로 읽어왔습니다. 그런데 print(df)를 실행하자마자 화면이 엄청난 숫자들로 가득 찼습니다.
스크롤을 한참 올려도 끝이 보이지 않습니다. 박분석 씨가 웃으며 말했습니다.
"데이터를 전부 출력하면 안 되죠. head()를 써보세요." 그렇다면 head()와 tail()은 정확히 무엇일까요?
쉽게 비유하자면, head()는 책의 첫 페이지를 펼쳐보는 것과 같습니다. 책 전체를 다 읽지 않아도 어떤 내용인지 대충 파악할 수 있습니다.
tail()은 책의 마지막 페이지를 보는 것입니다. 데이터가 제대로 끝까지 들어갔는지 확인할 때 유용합니다.
왜 이런 함수가 필요할까요? 실무에서 다루는 데이터는 보통 수천 개에서 수백만 개의 행을 가지고 있습니다.
이것을 전부 출력하면 컴퓨터가 느려지고, 화면도 알아볼 수 없게 됩니다. 하지만 데이터가 제대로 읽혔는지, 어떤 열들이 있는지, 값들이 어떻게 생겼는지는 확인해야 합니다.
바로 이럴 때 head()와 tail()을 사용합니다. head()와 tail()의 기본 동작을 알아봅시다.
head()는 기본적으로 처음 5개 행을 보여줍니다. 괄호 안에 숫자를 넣으면 그 개수만큼 보여줍니다.
df.head(10)이라고 하면 처음 10개를, df.head(3)이라고 하면 처음 3개를 보여줍니다. 간단하지만 정말 자주 쓰는 함수입니다.
tail()도 똑같이 작동합니다. tail()은 기본적으로 마지막 5개 행을 보여줍니다.
df.tail(10)은 마지막 10개를, df.tail(3)은 마지막 3개를 보여줍니다. 데이터를 정렬한 후에 가장 큰 값 몇 개를 빠르게 확인할 때도 tail()을 많이 씁니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 100개 행을 가진 샘플 데이터프레임을 만들었습니다.
pd.date_range()로 날짜 데이터를 생성하고, range()로 숫자 데이터를 만들었습니다. 실제 매출 데이터와 비슷한 형태입니다.
df.head()를 호출하면 처음 5개 행이 깔끔한 표 형태로 출력됩니다. 열 이름도 보이고, 인덱스 번호도 보이고, 각 셀의 값도 정렬되어 보입니다.
한눈에 데이터 구조를 파악할 수 있습니다. df.tail()을 호출하면 마지막 5개 행이 나옵니다.
인덱스 번호가 95, 96, 97, 98, 99로 표시되므로 전체 데이터가 100개라는 것도 알 수 있습니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 전자상거래 회사에서 주문 데이터를 분석한다고 가정해봅시다. 매일 아침 어제의 주문 데이터를 받아서 처리합니다.
가장 먼저 하는 일은 df.head()로 데이터가 제대로 들어왔는지 확인하는 것입니다. 열 이름이 맞는지, 값들이 정상인지 빠르게 체크합니다.
그리고 df.tail()로 마지막 주문까지 잘 들어왔는지 확인합니다. 데이터 처리 중간중간에도 자주 사용합니다.
데이터를 정제하거나 변환한 후에는 항상 결과를 확인해야 합니다. 전체를 출력할 필요는 없고, head()로 몇 개만 확인하면 됩니다.
"내가 원하는 대로 잘 바뀌었나?" 하는 검증 과정에서 head()는 필수입니다. 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수는 head()를 쓰지 않고 df만 출력하는 것입니다. Jupyter Notebook에서는 자동으로 일부만 보여주지만, 일반 파이썬 스크립트에서는 전체가 출력되어 화면이 가득 찹니다.
항상 head()나 tail()을 습관화하세요. 다시 김데이터 씨의 이야기로 돌아가 봅시다.
head()를 사용한 김데이터 씨는 만족스러운 표정을 지었습니다. "아, 이제 데이터가 어떻게 생겼는지 한눈에 보이네요!" head()와 tail()은 작지만 강력한 함수입니다.
여러분도 데이터를 불러올 때마다 습관적으로 사용해 보세요.
실전 팁
💡 - 데이터를 처음 불러오면 무조건 head()로 확인하는 습관을 들이세요
- tail()로 데이터가 끝까지 제대로 들어왔는지 확인하세요
- Jupyter Notebook에서는 df만 쓰면 자동으로 예쁘게 표시되지만, 스크립트에서는 head()를 써야 합니다
5. info로 데이터 타입 확인
김데이터 씨가 데이터를 분석하려고 하는데 에러가 발생했습니다. "평균을 구할 수 없습니다"라는 메시지가 뜹니다.
숫자 데이터인데 왜 그럴까요?
info() 함수는 DataFrame의 전반적인 정보를 한눈에 보여줍니다. 각 열의 데이터 타입, null 값 개수, 메모리 사용량 등을 확인할 수 있습니다.
데이터 분석 전 필수 체크 함수입니다.
다음 코드를 살펴봅시다.
import pandas as pd
import numpy as np
# 샘플 데이터프레임 생성
df = pd.DataFrame({
'이름': ['김철수', '이영희', '박민수', None, '최지우'],
'나이': [25, 30, 28, 32, 27],
'급여': ['3000', '3500', '4000', '4500', '3800'], # 숫자처럼 보이지만 문자열
'입사일': pd.to_datetime(['2020-01-15', '2019-03-20', '2021-06-01', '2018-11-10', '2022-02-28']),
'재직중': [True, True, False, True, True]
})
# 데이터 정보 확인하기
print("데이터프레임 정보:")
print(df.info())
# 간단한 통계 정보도 함께 보기
print("\n처음 3개 행:")
print(df.head(3))
김데이터 씨가 급여 데이터의 평균을 구하려고 df['급여'].mean()을 실행했습니다. 그런데 이상한 에러가 발생했습니다.
분명 숫자인 것 같은데 계산이 안 됩니다. 박분석 씨가 다가와 모니터를 보더니 바로 알아챘습니다.
"info()로 데이터 타입을 먼저 확인해 봤어야죠." 그렇다면 info()는 정확히 무엇일까요? 쉽게 비유하자면, info()는 건강검진 결과지와 같습니다.
사람의 키, 몸무게, 혈압, 혈당 수치 등을 한 장에 정리해서 보여주듯이, info()는 데이터의 전반적인 상태를 한눈에 보여줍니다. 어디가 문제인지, 어디를 고쳐야 하는지 빠르게 파악할 수 있습니다.
왜 데이터 타입을 확인해야 할까요? pandas는 각 열마다 데이터 타입을 가지고 있습니다.
정수(int), 실수(float), 문자열(object), 날짜(datetime), 불린(bool) 등 다양합니다. 문제는 겉으로 보기에는 숫자 같아도 실제로는 문자열로 저장된 경우가 많다는 것입니다.
CSV 파일에서 읽어올 때 특히 그렇습니다. 문자열로 저장된 숫자는 계산이 안 됩니다.
반드시 타입을 확인하고 변환해야 합니다. info()가 보여주는 정보들을 하나씩 알아봅시다.
첫 번째로 전체 행의 개수가 표시됩니다. "5 entries"라고 나오면 데이터가 5개라는 뜻입니다.
두 번째로 각 열의 이름과 Non-Null 개수가 나옵니다. "5 non-null"이면 5개 모두 값이 있다는 뜻이고, "4 non-null"이면 1개가 비어있다는 뜻입니다.
세 번째로 데이터 타입이 표시됩니다. int64, float64, object, datetime64, bool 등으로 나옵니다.
위의 코드를 한 줄씩 살펴보겠습니다. 샘플 데이터를 만들 때 의도적으로 다양한 타입을 넣었습니다.
이름은 문자열(object), 나이는 정수(int64), 급여는 문자열로 된 숫자(object), 입사일은 날짜(datetime64), 재직중은 불린(bool)입니다. 이름 열에는 None을 하나 넣어서 null 값도 만들었습니다.
df.info()를 실행하면 깔끔한 표 형태로 정보가 출력됩니다. 각 열마다 몇 개의 null이 아닌 값이 있는지, 데이터 타입이 무엇인지 한눈에 보입니다.
맨 아래에는 전체 메모리 사용량도 나옵니다. 급여 열을 보면 dtype이 object로 나옵니다.
숫자처럼 보이지만 실제로는 문자열입니다. 이것을 숫자로 바꾸려면 df['급여'] = df['급여'].astype(int) 또는 pd.to_numeric(df['급여'])를 사용해야 합니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 고객 데이터베이스를 분석한다고 가정해봅시다.
데이터를 받아서 가장 먼저 하는 일이 info()를 실행하는 것입니다. 전화번호가 숫자로 저장되었는지 문자열로 저장되었는지 확인합니다.
가입일이 날짜 타입인지 확인합니다. null 값이 몇 개나 있는지 파악합니다.
이런 정보를 바탕으로 데이터 정제 계획을 세웁니다. null 값 확인도 중요합니다.
info()에서 "4 non-null"이라고 나오면 1개의 null이 있다는 뜻입니다. null 값이 있으면 계산할 때 문제가 생길 수 있으므로, 미리 처리해야 합니다.
null을 0으로 채울지, 평균값으로 채울지, 아예 그 행을 삭제할지 결정해야 합니다. 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수는 데이터 타입을 확인하지 않고 바로 계산하는 것입니다. 겉으로는 숫자인데 문자열로 저장되어 있으면 에러가 발생합니다.
또는 날짜처럼 보이는데 문자열이면 날짜 계산이 안 됩니다. 반드시 info()로 확인하는 습관을 들이세요.
다시 김데이터 씨의 이야기로 돌아가 봅시다. info()를 실행한 김데이터 씨는 문제를 발견했습니다.
"아, 급여가 object 타입이었네요! 문자열이었구나!" info()는 데이터 분석의 첫 번째 관문입니다.
여러분도 데이터를 불러오면 head() 다음으로 info()를 실행해 보세요.
실전 팁
💡 - CSV에서 읽어온 숫자는 문자열일 가능성이 높으니 항상 확인하세요
- null 값 개수를 확인해서 데이터 정제 계획을 세우세요
- 메모리 사용량이 너무 크면 데이터 타입을 최적화할 수 있습니다 (int64 → int32 등)
6. shape로 데이터 크기 파악
박분석 씨가 김데이터 씨에게 물었습니다. "이 데이터 몇 개에요?" 김데이터 씨는 스크롤을 내리며 세기 시작했습니다.
박분석 씨가 웃으며 말했습니다. "shape 써보세요."
shape는 DataFrame의 크기를 (행 개수, 열 개수) 튜플로 반환합니다. 함수가 아니라 속성이므로 괄호 없이 사용합니다.
데이터의 규모를 파악할 때 가장 먼저 확인하는 정보입니다.
다음 코드를 살펴봅시다.
import pandas as pd
# 샘플 데이터프레임 생성
df = pd.DataFrame({
'제품명': ['노트북', '마우스', '키보드', '모니터', '헤드셋'],
'가격': [1200000, 30000, 80000, 350000, 120000],
'재고': [15, 50, 30, 20, 25],
'카테고리': ['컴퓨터', '주변기기', '주변기기', '컴퓨터', '주변기기']
})
# 데이터프레임의 크기 확인
print(f"데이터 크기: {df.shape}")
# 행 개수만 가져오기
rows = df.shape[0]
print(f"행 개수: {rows}")
# 열 개수만 가져오기
cols = df.shape[1]
print(f"열 개수: {cols}")
# 전체 셀 개수 계산
total_cells = rows * cols
print(f"전체 셀 개수: {total_cells}")
김데이터 씨가 새로운 데이터 파일을 받았습니다. 보고서에 "데이터 개수: ?"라고 적어야 하는데, 어떻게 세어야 할까요?
엑셀처럼 스크롤을 끝까지 내려서 행 번호를 봐야 할까요? 박분석 씨가 간단한 방법을 알려줬습니다.
"shape만 확인하면 1초 만에 알 수 있어요." 그렇다면 shape는 정확히 무엇일까요? 쉽게 비유하자면, shape는 건물의 평수와 같습니다.
5층 건물에 각 층마다 10개의 방이 있다면 "5×10"이라고 표현합니다. DataFrame도 마찬가지입니다.
5개의 행과 10개의 열이 있다면 shape는 (5, 10)이 됩니다. 첫 번째 숫자가 행, 두 번째 숫자가 열입니다.
왜 데이터 크기를 알아야 할까요? 실무에서는 데이터 규모에 따라 처리 방법이 달라집니다.
100개짜리 작은 데이터는 한 번에 처리해도 되지만, 100만 개짜리 큰 데이터는 나눠서 처리해야 합니다. 또한 보고서에 "총 몇 건의 데이터를 분석했습니다"라고 써야 할 때도 shape를 사용합니다.
데이터 정제 전후의 크기를 비교할 때도 유용합니다. shape의 사용법을 자세히 알아봅시다.
shape는 함수가 아니라 속성입니다. 따라서 괄호를 붙이지 않습니다.
df.shape()가 아니라 df.shape라고 씁니다. 결과는 튜플 형태로 나옵니다.
예를 들어 (100, 5)라고 나오면 100개의 행과 5개의 열이 있다는 뜻입니다. 행 개수만 필요하면 어떻게 할까요?
shape[0]으로 행 개수를 가져올 수 있습니다. 튜플의 첫 번째 요소이기 때문입니다.
shape[1]로 열 개수를 가져올 수 있습니다. 이렇게 하면 필요한 정보만 딱 뽑아낼 수 있습니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 5개 제품 데이터를 가진 DataFrame을 만들었습니다.
제품명, 가격, 재고, 카테고리 총 4개의 열이 있습니다. df.shape를 출력하면 (5, 4)가 나옵니다.
5개 행, 4개 열이라는 뜻입니다. df.shape[0]은 5를 반환합니다.
행 개수입니다. df.shape[1]은 4를 반환합니다.
열 개수입니다. 이 두 개를 곱하면 전체 셀 개수인 20이 나옵니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 고객 이탈 분석을 한다고 가정해봅시다.
전체 고객 데이터를 불러온 후 df.shape를 확인합니다. (100000, 15)라고 나오면 10만 명의 고객과 15개의 정보가 있다는 뜻입니다.
그다음 이탈한 고객만 필터링한 후 다시 shape를 확인합니다. (5000, 15)라고 나오면 5%의 이탈률이라는 것을 알 수 있습니다.
데이터 정제 과정에서도 자주 사용합니다. 중복 데이터를 제거하기 전에 shape를 확인하고, 제거한 후에 다시 shape를 확인합니다.
행 개수가 얼마나 줄었는지 비교할 수 있습니다. null 값이 있는 행을 삭제할 때도 마찬가지입니다.
변화를 수치로 확인하는 것이 중요합니다. 다른 방법도 있습니다.
행 개수를 알고 싶다면 len(df)를 사용할 수도 있습니다. DataFrame의 길이를 반환하는데, 이것은 행 개수와 같습니다.
하지만 shape[0]이 더 명확하고, 열 개수도 함께 알 수 있어서 shape를 더 많이 씁니다. 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수는 shape에 괄호를 붙이는 것입니다. df.shape()라고 쓰면 에러가 발생합니다.
shape는 메서드가 아니라 속성이기 때문입니다. head()나 info()와 달리 괄호가 필요 없다는 것을 기억하세요.
다시 김데이터 씨의 이야기로 돌아가 봅시다. shape를 사용한 김데이터 씨는 감탄했습니다.
"와, 1초 만에 10만 개 데이터라는 걸 알았네요!" shape는 간단하지만 정말 자주 쓰는 속성입니다. 여러분도 데이터를 불러올 때마다 확인해 보세요.
실전 팁
💡 - shape는 함수가 아니라 속성이므로 괄호를 붙이지 마세요
- 행 개수는 shape[0], 열 개수는 shape[1]로 가져올 수 있습니다
- 데이터 정제 전후의 shape를 비교하면 얼마나 데이터가 변했는지 알 수 있습니다
7. describe로 기본 통계 확인
김데이터 씨가 데이터 분석 보고서를 작성해야 합니다. 평균, 최댓값, 최솟값, 표준편차를 모두 계산해야 하는데, 하나하나 계산하려니 시간이 너무 오래 걸립니다.
더 빠른 방법은 없을까요?
describe() 함수는 숫자 열의 기본 통계를 자동으로 계산해서 보여줍니다. 개수, 평균, 표준편차, 최솟값, 4분위수, 최댓값을 한 번에 확인할 수 있습니다.
데이터 전체를 빠르게 이해하는 필수 함수입니다.
다음 코드를 살펴봅시다.
import pandas as pd
# 샘플 데이터프레임 생성 (온라인 쇼핑몰 매출 데이터)
df = pd.DataFrame({
'날짜': pd.date_range('2024-01-01', periods=10),
'매출': [1200000, 1350000, 980000, 1500000, 1100000,
1800000, 1650000, 1400000, 1250000, 1550000],
'방문자': [520, 580, 450, 620, 490,
720, 680, 600, 550, 640],
'전환율': [2.3, 2.5, 2.1, 2.6, 2.2,
2.8, 2.7, 2.4, 2.3, 2.6]
})
# 기본 통계 정보 확인
print("기본 통계 정보:")
print(df.describe())
# 특정 열만 통계 확인
print("\n매출 통계만 확인:")
print(df['매출'].describe())
# 백분위수 추가로 확인
print("\n더 자세한 백분위수:")
print(df.describe(percentiles=[.1, .25, .5, .75, .9]))
김데이터 씨가 드디어 첫 번째 분석 보고서를 작성하게 되었습니다. 상사가 요구한 내용은 "매출 평균, 최댓값, 최솟값, 표준편차를 계산해서 보고하세요"였습니다.
하나씩 계산하려니 코드가 길어집니다. 박분석 씨가 지나가다가 조언했습니다.
"describe() 하나면 다 나와요." 그렇다면 describe()는 정확히 무엇일까요? 쉽게 비유하자면, describe()는 건강검진 종합 결과와 같습니다.
키, 몸무게, 혈압, 콜레스테롤, 혈당 등을 한 장의 표로 정리해서 보여줍니다. 데이터도 마찬가지입니다.
평균, 표준편차, 최솟값, 4분위수, 최댓값을 한눈에 보여줍니다. 왜 기본 통계가 중요할까요?
데이터 분석의 첫걸음은 데이터를 이해하는 것입니다. 숫자가 어느 범위에 분포하는지, 평균이 얼마인지, 이상치가 있는지 등을 파악해야 합니다.
describe()를 실행하면 이런 정보를 5초 만에 얻을 수 있습니다. 복잡한 계산 없이 데이터의 전체적인 그림을 그릴 수 있습니다.
describe()가 보여주는 정보들을 하나씩 알아봅시다. count는 null이 아닌 값의 개수입니다.
mean은 평균값입니다. std는 표준편차로, 데이터가 평균에서 얼마나 흩어져 있는지 보여줍니다.
min은 최솟값, max는 최댓값입니다. **25%, 50%, 75%**는 4분위수입니다.
50%는 중앙값이라고도 부르며, 데이터를 크기 순으로 정렬했을 때 정확히 중간에 있는 값입니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 온라인 쇼핑몰의 10일치 매출 데이터를 만들었습니다. 매출, 방문자, 전환율 3개의 숫자 열이 있습니다.
df.describe()를 실행하면 이 3개 열에 대한 통계가 표 형태로 출력됩니다. 매출 열을 보면 평균이 1378000원 정도, 최솟값이 980000원, 최댓값이 1800000원이라는 것을 알 수 있습니다.
표준편차를 보면 데이터가 평균에서 얼마나 퍼져있는지 알 수 있습니다. 특정 열만 확인하고 싶다면 df['매출'].describe()처럼 사용합니다.
그 열에 대한 통계만 나옵니다. Series에 대한 describe()는 세로로 깔끔하게 출력됩니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 게임 회사에서 유저 데이터를 분석한다고 가정해봅시다.
하루 평균 플레이 시간, 레벨, 아이템 구매 금액 등의 데이터가 있습니다. describe()를 실행하면 "평균 플레이 시간은 2.5시간, 최대 10시간"처럼 즉시 파악할 수 있습니다.
또한 이상치도 발견할 수 있습니다. 최댓값이 비정상적으로 크다면 데이터 오류일 가능성이 있습니다.
4분위수를 이해하는 것도 중요합니다. 25% 지점은 전체 데이터 중 하위 25%를 의미합니다.
50% 지점은 정확히 중간입니다. 75% 지점은 하위 75%를 의미합니다.
이것을 통해 데이터의 분포를 파악할 수 있습니다. 예를 들어 매출의 50%가 130만 원인데 평균이 137만 원이라면, 큰 값 몇 개가 평균을 끌어올렸다는 것을 알 수 있습니다.
백분위수를 추가로 확인할 수도 있습니다. percentiles 매개변수에 리스트를 넣으면 원하는 백분위수를 볼 수 있습니다.
describe(percentiles=[.1, .9])라고 하면 10% 지점과 90% 지점도 보여줍니다. 이상치를 찾거나 데이터의 꼬리 부분을 분석할 때 유용합니다.
문자열 열도 describe()를 쓸 수 있습니다. df.describe(include='object')라고 하면 문자열 열에 대한 통계가 나옵니다.
count, unique(고유값 개수), top(가장 많이 나온 값), freq(top의 빈도) 등이 표시됩니다. 숫자 통계와는 다르지만 나름 유용한 정보입니다.
주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수는 평균만 보고 판단하는 것입니다.
평균은 이상치에 영향을 많이 받습니다. 반드시 중앙값(50%)과 함께 봐야 합니다.
또한 표준편차가 크면 데이터가 많이 흩어져 있다는 뜻이므로, 평균만으로 대표하기 어렵습니다. 다시 김데이터 씨의 이야기로 돌아가 봅시다.
describe()를 사용한 김데이터 씨는 놀랐습니다. "와, 한 줄로 모든 통계가 다 나오네요!" describe()는 데이터를 빠르게 파악하는 최고의 도구입니다.
여러분도 데이터 분석을 시작할 때 꼭 사용해 보세요.
실전 팁
💡 - 평균(mean)과 중앙값(50%)을 함께 비교하면 이상치 존재 여부를 알 수 있습니다
- 표준편차(std)가 크면 데이터가 평균에서 많이 흩어져 있다는 뜻입니다
describe(include='all')을 사용하면 숫자와 문자열 열을 모두 확인할 수 있습니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.