SQL, Python은 모두 데이터에 접근하기 위한 QUERY
장/단점
구분 | 🔴 SQL | 🔵 Python |
---|---|---|
언어 | 절차지향 언어→통으로! | 객체지향 언어→한줄한줄! |
역사 | 개발: 1970 년 | 개발: 1989 년 |
표준화: 1986 년 | 표준화: 1991 년 | |
장점 | select, from 등의 구문 등 하나의 구문으로 처리되므로, 실제 컴퓨터가 질의를 어떻게 처리하는 지 이해할 필요가 없다는 점에서 이해가 쉬움 | 한 줄(셀) 단위로 실행되어, 트러블 슈팅이 용이(틀린 셀만 다시 작업) |
다양한 Library 가 지원되어, 데이터 시각화 , 통계적 의미, 모델링, 자동화 등 데이터 핸들링을 자유롭게 할 수 있음 | ||
단점 | 테이블 생성, 삭제, 복제, 치환 은 가능하지만, 시각화 등 Library 지원이 되지 않아 데이터 핸들링시 한계점 존재 | 같은 QUERY 구문을 수행한다고 했을 때, SQL 보다 느리게 출력될 수 있음 |
실제 쿼리 컴파일(검사)시 트러블슈팅이 오래 걸릴 수 있음 |
객체지향 프로그래밍
- 모든 데이터를 하나의 객체로 취급해서 프로그래밍하는 방법
- 각 객체들끼리 스스로 상호작용하여 프로그래밍 진행
import pandas as pd
from 으로 시작하는 구문
from matplotlib.pyplot as plt
import pandas as pd # pandas 는 6글자라서 pd 로 줄여 명령
import numpy as np
import time
from matplotlib.pyplot as plt
# Python은 SQL과 달리 맨 첫 줄부터
# 하나하나씩 실행됨!
# 한 줄이라도 틀리면 다음 줄 실행 안 되니 주의
역사
목적
Pandas Series
- 테이블의 열과 같으며, 모든 유형의 데이터를 보유하는 1차원 배열
- Series의 개념 놓치면 안 됨!
Library 이름 | 핵심 요약 |
---|---|
Pandas | ☑️ Pandas는 R의 dataframe 데이터 타입을 참고하여 만든 것으로 pandas dataframe 이라고 부름 |
☑️Pandas의 dataframe: 테이블 형식의 데이터로 열(column), 행(row), 인덱스(index) 로 구성 | |
☑️ 리스트, 튜플, 사전 타입의 형태로 데이터를 보관 | |
▶️ import pandas as pd | |
Numpy | ☑️ 파이썬의 리스트를 확장한 다차원 배열 제공 |
☑️ 난수생성, 푸리에변환, 행렬연산, 통계분석을 지원 | |
☑️ 일반적으로 Scipy, Pandas, matplotlib 등 다른 패키지와 함께 쓰임 | |
▶️ import numpy as np | |
matplotlib | ☑️ Data Visualization 분야에서의 대표적인 파이썬 라이브러리 |
▶️ import matplotlib.pyplot as plt | |
Seaborn | ☑️ matplotlib 을 기반으로 그래픽과 기능을 추가한 라이브러리 |
▶️ import seaborn as sns | |
Scikit-Learn | ☑️ 머신러닝을 시작할 때 제일 먼저 알아야 하는 파이썬 라이브러리 |
☑️ 지도 학습, 비지도 학습, 모델 선택 및 평가, 등 라이브러리 6개로 구성 | |
Data Pre-Processing, Dimensions Reduction, Regression, Classification, Clustering, Model Selection | |
📌지도 학습 : X 변수가 주어 졌을 때 , Y 변수를 추정해내는 방법 (새로운 데이터가 나왔을때 진화가 어려움) | |
📌비지도 학습 : Y 가 없는 경우, 군집화, 이상치 검출 | |
📌모델 선택 및 평가: 모델 과 Data를 fit에 넣어서 예측 모형을 만드는 과정예측모형을 predict에 넣어서 예측 | |
▶️ import sklearn | |
PyGWalker | ☑️ Kanaries에서 배포한 태블로 스타일의 파이썬 패키지 |
☑️ 정제된 데이터를 기반으로 데이터 EDA 를 손쉽게 경험할 수 있음 | |
▶️ import pygwalker as pyg | |
Selenium | ☑️ 웹 브라우저(크롬, 파이어 폭스, IE, 사파리 등등)를 콘트롤하는 Framework |
☑️ Webdriver라는 API를 통해 웹 브라우저를 제어 | |
SciPy | ☑️ 과학, 수학, 엔지니어링 등에 사용되는 고급 계산 기능을 제공하는 Python 라이브러리 |
☑️선형 대수, 통계, 신호 처리, 최적화 등 다양한 분야의 기능 제공 | |
▶️ import scipy | |
TensorFlow | ☑️ 구글 브레인팀이 연구와 제품개발을 목적으로 만든 머신러닝 라이브러리 |
☑️ 수치계산 및 대규모 머신러닝(이미지 인식, 자연어 처리 등) 위한 오픈소스 라이브러리 | |
▶️ 설치 방법 | |
※ TensorFlow는 중요하니까 따로 또 이야기하기로 해요 |
%%time
sum=0
for x in range(10000000) :
sum=sum+x
print("1부터 1000만까지 합 :",sum)
# pandas 라이브러리를 활용한 csv 파일 읽기
df = pd.read_csv("xxxx.csv")
# 테이블 확인하기
display(df, df2, df3)
# 처음 5줄만 출력하기
#df2.head()
# 마지막 5줄만 출력하기
#df2.tail()
# 각 테이블의 행(가로) 길이 파악하기
len(df)
# shape: 테이블의 행과 열의 개수를 반환
df.shape
# dtypes: 테이블 내 컬럼타입(문자형, 숫자형, 배열 등) 확인
df.dtypes
# columns: 테이블 내 컬럼 확인
df.columns
# values: 테이블 내 각 행들을 배열 형태로 확인
df.values
# 테이블 기본 구조 한눈에 확인하기
df.info()
# 전체 행 개수, 평균, 표준편차, 최솟값, 사분위수, 최댓값 확인
df2.describe()
#컬럼별로 결측치(데이터가 없는) 확인하기
df.isnull().sum()
# 특정 컬럼 1개 가져오기
#방법1: 속성. 사용
df.Category
#방법2: [] 연산자 사용 → 가장 많이 사용됨
df['Category']
#방법3: iloc 사용
# : 은 모든 행을 가져오겠다는 의미이며 dataframe 의 인덱스 번호 4번(카테고리)컬럼을 가져오겠다는 의미
df.iloc[:,4]
# 특정 컬럼 여러개 가져오기
#방법1: [[]] 연산자 사용
# []를 하나 사용하면 결과값이 series 형태로 반환되어 key error 가 발생되며, [[]] 는 dataframe 으로 반환되어 에러가 나지 않습니다.
df[['Category','Selling Price']]
#방법2: iloc 사용
# : 은 모든 행을 가져오겠다는 의미이며 dataframe 의 인덱스 번호 4번,7번 컬럼을 가져오겠다는 의미
df.iloc[:,[4,7]]
# 특정 컬럼 버리기
# axis=0 은 인덱스 기준, 1은 컬럼 기준 삭제를 의미
# inplace=True 는 원본을 변경하겠다는 의미, False 의 경우 원본테이블은 변경되지 않음
df3.drop('Interaction type', axis=1, inplace=True)
# 조건에 부합하는 데이터 가져오기1
# 조건에 만족하는 행은 정상출력 ,아닌 행은 NaN 으로 반환
df2.where(df2['Age']>50)
# 조건에 부합하는 데이터 가져오기2
# true, false의 개념이 아닌 조건에 부합하는 데이터만 슬라이싱하여 가져오고 싶을 때
# mask 메서드로 불립니다. 이름은 반드시 mask 일 필요가 없습니다.
mask = ((df2['Age']>50) & (df2['Gender']=='Male'))
df2[mask]
# 데이터 그루핑- 기준 1개
df2.groupby('Gender')['Customer ID'].count()
# 데이터 그루핑- 기준 여러개
df2.groupby(['Gender','Location'])['Customer ID'].count()
# 데이터 count 와 nunique(distinct, 중복제거) 차이
df2.groupby('Location')['Age'].count()
df2.groupby('Location')['Age'].nunique()
import pandas as pd
import numpy as np
import time
# from PIL import Image
# 튜터님이 이미지 넣으려고 추가로 import한 부분이라
# 실습할 내용과는 관계 없음
%%time
sum = 0
for x in range(10000000):
sum += x
print(f"1부터 1000만까지 합: {sum}")
# 실행 결과:
# 1부터 1000만까지 합: 49999995000000
# CPU times: total: 984 ms
# Wall time: 1.1 s
data1 = [['Choi', 22], ['Kim', 48], ['Joo', 32]]
df4 = pd.DataFrame(data1, columns=['Name', 'Age'])
data2 = {'Name': ['Choi', 'Kim', 'Joo'], 'Age': [22, 48, 32]}
df5 = pd.DataFrame(data2)
df = pd.read_csv("product_details.csv")
df2 = pd.read_csv("customer_details.csv")
df3 = pd.read_csv("E-commerece sales data 2024.csv")
display(df, df2, df3)
df2.head()
df2.tail()
POINT
- 데이터를 로드해올 때 서두르지 말 것
- 데이터가 어떻게 생겼는지 먼저 알고 들어갈 것
- 데이터를 모르면 데이터 분석이 안 됨
- 모델을 구축하는 것도 좋지만 '어떤 데이터를 input으로 받아들이는지' 알고 들어가야 함
- 내가 분석하고자 하는/학습하고자 하는/끌어오고자 하는 데이터가 어떤 모양인지 반드시 먼저 확인하고 코드 작성하기
- 데이터가 어떤 성격인지 알려면 데이터의 feature(특징 = 컬럼)이 무엇으로 이루어져 있는지 알아야 함
- 기술이 고도화되면서 인간적인 능력이 더 중요해졌음 → 아이디어 싸움!
- 분석 진입 전 전략이 중요
len(df), len(df2), len(df3)
"테이블 열과 행 개수", df.shape, "테이블 컬럼 타입", df.dtypes, "테이블 컬럼 확인", df.columns, "테이블 행 상세확인", df.values
df.columns.to_list()
df.info()
df.T
df2.describe()
df.isna().sum()
df.isnull().sum() # 동일한 기능
# 속성. 사용
df.Category
# [] 연산자 사용
df['Category']
.loc
: label이나 조건 표현으로 선택df.iloc[:,4]
# :은 모든 행을 가져오겠다는 의미
# 4는 DataFrame의 인덱스 번호 4번
# == 카테고리 컬럼을 가져오겠다는 의미
[[]]
연산자 사용df[['Category', 'Selling Price']]
# []를 하나 사용하면 결과값이 Series 형태로 반환되어
# key error가 발생
# [[]]는 DataFrame으로 반환되어 에러가 나지 않음
df.iloc[:, [4,7]]
# :은 모든 행을 가져오겠다는 의미
# [4,7]은 DataFrame의 인덱스 번호
# 4번, 7번 컬럼을 가져오겠다는 의미
.drop()
df3.drop('Interaction type', axis=1, inplace=False)
# axis=0 은 인덱스 기준, 1은 컬럼 기준 삭제를 의미
# inplace=True 는 원본을 변경하겠다는 의미,
# inplace=False 의 경우 원본테이블은 변경되지 않음
.where()
# 조건에 만족하는 행은 정상 출력, 아닌 행은 NaN으로 반환
df2.where(df2['Age']>50)
# 조건에 부합하는 데이터만 가져오고 싶을 때
mask = ((df2['Age']>50) & (df2['Gender']=='Male'))
df[mask]
SELECT
Gender
, COUNT("Customer ID")
FROM
df2
GROUP BY
Gender
;
df2.groupby('Gender')['Customer ID'].count()
SELECT
Gender
, Location
, COUNT("Customer ID")
FROM
df2
GROUP BY
Gender
, Location
;
df2.groupby(['Gender', 'Location'])['Customer ID'].count()
SELECT
Location
, COUNT(DISTINCT Age)
FROM
df2
GROUP BY
Location
;
df2.groupby('Location')['Age'].nunique()
# count는 중복 제거를 하지 않음
# nunique는 중복을 제거
df2.groupby('Location')['Age'].count()
df2.groupby('Location')['Age'].nunique()
SELECT
Location
, COUNT(DISTINCT Age) AS cnt
FROM
df2
GROUP BY
Location
ORDER BY
cnt DESC
;
#sort_values 사용 시, ascending=True 는 오름차순, False 는 내림차순
df2.groupby('Location')['Age'].count().sort_values(ascending=False)
QnA
- 전체 100개 행 결과를 모두 보려면?
pd.set_option('display.max_rows', None)
- 옵션에서 변경