[스파르타코딩클럽]데이터분석 과정/TIL,WIL

시각화 / 코드카타 / 파이썬 / 판다스 / 과제

설득이 2024. 1. 25. 20:11

시각화

.pyplot : 2차원 데이터 시각화

-color, linestyle, marker 설정 가능

-범례 : legend()

-축 이름 설정 : set_xlabel, set_ylabel

-제목 설정 : set_title

-텍스트(위치, 위치, 텍스트, fontsize)

  • line plot : 연속형, 변화와 추이를 나타낼 때 사용 (plt.plot)
  • bar plot : 범주형 데이터에 사용하며 카테고리별로 분석할 때 사용 (plt.bar)
  • histogram :연속형 데이터에 사용하여 분포, 빈도, 패턴을 분석할 때 사용 (plt.hist)
  • pie chart : 범주형 데이터에 사용하며 상대적 비율을 표현할 때 사용 (plt.pie)
  • box plot : 연속형, 중앙값, 사분위수, 최솟값, 최대값 이상치를 나타낼 때 사용 (plt.boxplot)
  • scatter plot : 두 변수 간 관계, 군집, 이상치를 나타낼 때 사용 (plt.scatter)

 


SQL 코드카타

이름이 없는 동물의 아이디
동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL문 작성
ID는 오름차순 정렬

 

  • 이름이 없다 -> is null
  • 정렬 : order by
SELECT animal_id
from animal_ins
where name is null
order by animal_id asc;

 

Immediate Food Delivery 2
즉시/전체 비율을 구하고 2번째 자리에서 반올림할 것
첫 주몬인 고객이 가장 빠르게 받을 때

 

  • 반올림 -> round
  • 즉시 -> sum()
  • case when 사용
  • 전체 -> count()
  • 첫 주문인 고객 -> where 서브쿼리
#반올림
#즉시/전체 비율
select round(sum(case when order_date = customer_pref_delivery_date then 1 else 0 end) * 100 /count(distinct customer_id),2) as immediate_percentage
from delivery
#첫주문 조건
where (customer_id, order_date) in (
    select customer_id, min(order_date)
    from delivery
    group by 1
);

 

Employee Salaries
봉급이 2000달러보다 크고 10개월 이하로 일한 직원

 

  • ~보다 크다 -> >=
  • 그리고 -> and
  • 적게 일한 -> <
select name
from employee
where salary >= 2000 and months < 10

 

 


파이썬 코드카타

시저암호
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식
"AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"
공백은 아무리 밀어도 공백
소문자, 대문자, 공백으로만 이루어짐

 

  • for문 사용
  • 대문자일 경우/소문자일 경우 -> isupper/islower
  • N만큼 밀어내기 () %26
def solution(s, n):
    s = list(s)
    #s에서 문자 꺼내기
    for i in range(len(s)):
        #대문자일 경우
        if s[i].isupper():
            #n만큼 밀어내기 -> 26으로 나누면 알 수 있음
            s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
        #소문자일 경우
        elif s[i].islower():
            #n만큼 밀어내기 -> 26으로 나누면 알 수 있음
            s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))

 

숫자 문자열과 영단
숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s
s가 의미하는 원래 숫자를 return 하도록 solution 함수
  • 대응하는 영단어 -> dic
  • for문 -> dic에서 문자 꺼내기
  • 영단어의 idx는 정수 표현
  • 해당 영단어의 idx를 replace -> 문자열 정
def solution(s):
    #영단어 dic
    dic = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
    #dic에서 문자 꺼내기
    for i in dic:
        #영단어의 idx는 정수 표현 
        #해당 영단어의 idx를 replace -> 문자열을 정수
        if i in s:
            idx = str(dic.index(i))
            s = s.replace(i,idx)
    answer = int(s)
    return answer

 


파이썬

  • 예외

try: 실행 코드
except: 예외가 발생했을 때 수행할 코드
else: 예외가 발생하지 않았을 때 수행할 코드
finally: 예외 발생 여부와 상관없이 항상 수행할 코드

  • enumerate()

인덱스와 원소로 이루어진 튜플을 만들어줌

  • 슬라이싱 [] : [시작값:마지막값:간격]

음수를 입력하면 역순으로 접근

 


판다스

  • Series 

1차원 배열, 인덱스 사용 가능, 데이터 타입을 가진다.

dtype()으로 데이터 타입을 바꿀 수 있음

index는 0부터 순차적으로 부여

index 지정 가능 

s = pd.Series(['마케팅','경영','개발','기획','인사'],index=['a','b','c','d','e'])
s
s= pd.Series(['마케팅','경영','인사','개발','기획'])
s.index = list('abcde')
s

 

shape 데이터 갯수 확인

NaN 비어있는 결측치 데이터

s = pd.Series(['선화', '강호', np.nan, '소정', '우영'])
s
s.isnull() #NaN값을 찾는 함수
s.isna()
s[s.isnull()] #위치 알려줌
s[s.isna()]
s.notnull() #NaN값이 아닌 값 찾기
s.notna()
s[s.notnull()]

 

추출 값 범위 정하기

np.random.seed(20)
sample2 = pd.Series(np.random.randint(100, 200, size=(15,)))
sample2[(sample2 >= 130) & (sample2 <= 170)]

 

  • DataFrame

2차원 데이터 구조, 행과 열로 구성 

열 이름 지정 가능

pd.DataFrame([[1, 2, 3], 
              [4, 5, 6], 
              [7, 8, 9]], columns=['가', '나', '다'])

 

T는 행과 열을 바꿈

data = {
    'name': ['Kim', 'Lee', 'Park'], 
    'age': [24, 27, 34], 
    'children': [2, 1, 3]
}

df = pd.DataFrame(data)
df
df.index
df.columns
df.values
df.dtypes
df.T #행,열 바꿈

 

inplace : rename, drop 등의 메서드를 사용할 때 변경 값을 저장할 때 사용

inplace = False : 저장안함

inplace = True : 저장함

df.index = list('abc')
df
df['name']
type(df['name'])
df[['name', 'children']]
df.rename(columns={'name': '이름'})
df.rename(columns={'name': '이름'}, inplace=True) 
df

과제

Q1. 날짜 전처리

  • to_datetime
  • format 사용 19-02-01 => %y-%m-%d

 

Q2. groupby로 통계량 집계 : 요일별 푸시 회수의 평균과 중간값

  • 평균 mean
  • 중간값 median
  • df 지정

Q3. Bar chart 시각화 : 요일별 평균 시각화

  • 위에 데이터 사용
  • bar chart -> plt.bar
  • x축 이름 -> plt.xlabel
  • df랑 push_count_by_dow의 길이가 다르기 때문에 둘 중 하나만 써야함 -> push_count_by_dow
  • reset_index 사용 : 설정 인덱스를 제거

Q4. 아웃라이어 제거

  • Z 스코어? 평균에서 벗어난 표준편차의 수
  • 평균 : mean()
  • 표준편차 : std()
  • 이상치 확인 (df-mean) > threshold
  • mean하고 std의 이상치 집계 : sum().sum()
  • 제거 : drop()

 


주제 생각해보기

  • 금융 시장의 동향 및 트렌드 분석 -> 전망 예측
  • 금융 서비스 접근이 어려운 지역 또는 계층 -> 개선 -> 금융 확장? 포함?
  • 예산 우선순위 정하기? 이런것도 되려나

 


감기걸려서 그런지 뭔가 집중이 잘됐다.(?) 오늘 집 근처에 ADsP 시험장 자리 나서 신청했다. 

사실 시험 보는게 맞는지 모르겠지만! 주말에 강의가 주어진다고 하니까 주말을 이용해서 공부해봐야지!