반응형
반응형

ㅇ출저 : 프로그래머스

SELECT

문제풀이

 

A. JOIN 사용

SELECT A.ID, COUNT(B.ID) AS CHILD_COUNT FROM ECOLI_DATA AS A
LEFT JOIN ECOLI_DATA AS B ON A.ID = B.PARENT_ID
GROUP BY A.ID
ORDER BY A.ID

 


     

    N차세대 자식수를 구할 땐 조인을 이용하여 생각해야한다 

    처음에 ID는 자식, PARENT_ID 는 부모를 의미하고있는데 문제에서 자식의 수를 구해야하므로  저 두 행 위치가 서로 바뀌어 정렬되어야한다. 그래서 JOIN을 할때 ON A.ID = B.PARENT_ID  을 하여 비교하면 쉽게 눈에 보인다

     

    좌측은 기본테이블 / 우측에 붙은테이블은 B.ID(자식), B.PARENT_ID(부모)로, 한눈에 파악하기위해 조인함 처

    조인할 당시 ON A.ID = B.PARENT_ID 로 조인을 했기때문에 좌측 A.IDB.PARENT_ID 부모 포지션으로 같아지고  

    B.PARENT_ID의 자식 B.IDA.ID의 자식으로 볼 수 있다

     

    즉  아래와 같은 테이블로 볼 수 있다

     

     

    그래서 GROUP BY 와 COUNT를 이용하여 결과를 출력할 수 있다. 

    (단 COUNT에서 COUNT(B.PARENT_ID) 를 입력해도 결과는 같지만 출력되는 테이블은 다르므로 유의)

     

     

     

     

    아래문제는 비슷한 유형이므로 연계해서 풀어보면 도움이 될 것 같다.

    [프로그래머스/MYSQL] 업그레이드 할 수 없는 아이템 구하기 :: 공기업 전산직을 위한 도서관

    반응형
    반응형

    빅분기 후기

    빅데이터분석기사 후기(필기, 실기 공부방법, 합격률, 공부기간, 난이도체감 등)(1) :: 공기업 전산직을 위한 도서관

    빅분기 실기 1유형 코드정리

    빅데이터분석기사 실기 1유형 코드정리 (2) :: 공기업 전산직을 위한 도서관  

    빅분기 실기 3유형 코드정리

    빅데이터분석기사 실기 3유형 코드정리(4) :: 공기업 전산직을 위한 도서관

     

     

     

    우선 2유형에 들어가기전에 알아두면 좋을 것 

     

    분류 : 종속(목표변수)  남, 여  / 생존, 사망    - accuracy_score, fi1_socre , roc_auc_score  / RandomForestClassifier

    회귀 : 종속(목표변수) : 수치형, 연속형 / 가격, 수치  - RMSE , 결정계수   / RandomForestRegression

     

    분류는  0,1,2 처럼 결과가 딱 나눠떨어지는거

    회귀는 연속형자료

     

    2유형을 공부하면서 유튜브 및 블로그 등을 참고하면서 정리한 코드입니다. 공부하실 때 참고하시고 도움이 되었으면 합니다. 아래 코딩은 실기체험환경 기준으로 작성됐습니다.

     

     

    라벨인코딩 

    1. 데이터 로드 및 확인

    2. 결측값 대체(최빈값), 라벨 인코딩

    3. 데이터 분할

    4. 모델링(분류)

    5. 성능 평가

    6. 테스트 데이터 예측

    7. 결과 데이터 제출 & 확인

     

     

    1. 데이터 로드 및 확인

    import pandas as pd
    train = pd.read_csv("data/customer_train.csv")
    test = pd.read_csv("data/customer_test.csv")

     

    2. 결측값 대체(최빈값), 라벨 인코딩

     1) 결측값 대체
    train.fillna(train['환불금액'].mode()[0],inplace=True)
    test.fillna(test['환불금액'].mode()[0],inplace=True)

    # print(train.info())          ....중간확인
    # print(test.info())           ....중간확인

     

     2) 라벨 인코딩
    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()


    le.fit(total['주구매지점'])

    total['주구매지점'] = le.transform(total['주구매지점'])

    le.fit(total['주구매상품'])

    total['주구매상품'] = le.transform(total['주구매상품'])

     

    3. 데이터 분할

    from sklearn.model_selection import train_test_split
    x=train.drop(columns=['성별','회원ID'])
    y=train['성별']
    x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2,random_state=2024)

     

    4. 모델링(분류)

    from sklearn.ensemble import RandomForestClassifier #분류
    # from sklearn.ensemble import RandomForestRegressor #회귀


    rfc=RandomForestClassifier(n_estimators=150, max_depth=20, random_state=2024)
    rfc.fit(x_train,y_train)
    pred1=rfc.predict(x_test)               #pred 1= train  데이터에 대한 예측 값

     

    5. 성능 평가

    from sklearn.metrics import roc_auc_score, accuracy_score
    roc=roc_auc_score(y_test , pred1)


    #acc=accuracy_score(y_test , pred1)
    # print('roc:',roc) #0.602354            ....중간확인
    # print('acc:',acc) #0.664285            ....중간확인

     

    6.테스트 데이터 예측

    test_x=test.drop(columns=['회원ID'])
    pred2=rfc.predict(test_x)
    # print(pred2)            ....중간확인

     

    7.결과 데이터 제출 & 확인

    pd.DataFrame({'pred':pred2}).to_csv('result.csv',index=False)
    #result=pd.read_csv('result.csv')            ....최종확인
    #print(result)            ....최종확인

     

     

     

     원핫인코딩 

    1. 데이터 로드 및 확인

    2. 원핫인코딩_겟더미

    3. 데이터 분할

    4. 모델링(분류)

    5. 성능 평가

    6. 테스트 데이터 예측

    7. 결과 데이터 제출 & 확인

     

    1. 데이터 로드 및 확인

    import pandas as pd
    train = pd.read_csv
    test = pd.read_csv

     

    2. 원핫인코딩_겟더미

    target = train.pop('성별')
    train = pd.get_dummies(train)
    test = pd.get_dummies(test)

     

    3. 데이터 분할

    from sklearn.model_selection import train_test_split
    x_train, x_test, y_train, y_test = train_test_split (train, target, test_size=0.2, random_state=2024)

     

    4. 모델링(분류)

    from sklearn.ensemble import RandomForestClassifier #분류
    # from sklearn.ensemble import RandomForestRegressor #회귀


    rfc=RandomForestClassifier(n_estimators=150, max_depth=20, random_state=2024)
    rfc.fit(x_train,y_train)
    pred1=rfc.predict(x_test)               #pred 1= train  데이터에 대한 예측 값

     

    5. 성능 평가

    from sklearn.metrics import roc_auc_score, accuracy_score
    roc=roc_auc_score(y_test , pred1)


    #acc=accuracy_score(y_test , pred1)
    # print('roc:',roc) #0.602354            ....중간확인
    # print('acc:',acc) #0.664285            ....중간확인

     

    6.테스트 데이터 예측

    test_x=test.drop(columns=['회원ID'])
    pred2=rfc.predict(test_x)
    # print(pred2)            ....중간확인

     

    7.결과 데이터 제출 & 확인

    pd.DataFrame({'pred':pred2}).to_csv('result.csv',index=False)
    #result=pd.read_csv('result.csv')            ....최종확인
    #print(result)            ....최종확인

     

     

     

     

     

     

    사실상 초반부부만 다르게하고 나머지는 같게해도 무방


    최소 30점이상을 맞기(0점 안맞기 위해)

     

    ☆★ 인코딩->분류->모델링->제출 ☆★ 

     

    일련의 과정을 꼭 파악하고 푸는것이 큰 도움이 됩니다.

    반응형
    반응형

    출저 : 프로그래머스

    JOIN

    문제풀이

     

    A. UNION/ UNION ALL 사용

    SELECT A.FLAVOR FROM
    (SELECT * FROM FIRST_HALF
    UNION 
    SELECT * FROM JULY) AS A
    GROUP BY FLAVOR
    ORDER BY SUM(A.TOTAL_ORDER) DESC LIMIT 3

     

     UNION : 중복제거 + 테이블 세로로 결합(위+ 아래)
     UNION ALL : 중복제거X + 테이블 세로로 결합(위+ 아래)

     

     

     

    UNION(ALL)을 사용하니 문제정답률에 비해 난이도가 쉬웠다고 생각한(?) 문제.

    두 테이블 구성이 같고, 데이터도 상반기/7월로 나눠져있어 합쳐도 무방하다고 생각했음.

    실제로 결합 후 1~7월 합계테이블이 완성되어 조건에 맞는 쿼리 작성 하면 끝

     

    반응형
    반응형

     

    빅데이터분석기사 후기(필기, 실기 공부방법, 합격률, 공부기간, 난이도체감 등)(1) :: 공기업 전산직을 위한 도서관

     

    빅데이터분석기사 후기(필기, 실기 공부방법, 합격률, 공부기간, 난이도체감 등)(1)

    빅분기 실기 9회 합격 :: 공기업 전산직을 위한 도서관 실기 라고하지만 개인적으로는 실기 > 필기였" data-og-host="be-traineeit.tistory.com" data-og-source-url="https://be-traineeit.tistory.com/entry/%EB%B9%85%EB%B6%84%EA%

    be-traineeit.tistory.com

     

    앞서 간략하게 빅분기 후기를 작성했던 링크입니다

     

     

    1유형을 공부하면서 지금까지 정리한 코드입니다. 공부하실 때 참고하시고 도움이 되었으면 합니다.

     

    기본 메소드

    • 메소드 목록 보기: dir(df)
    • 메소드 설명 보기: help(함수명)

    데이터로드 및 저장

    • CSV 파일 읽기 : pd.read_csv('파일명', sep='구분자', encoding='인코딩') # (sep: 구분자, encoding: 'utf-8', 'cp949' 등)
    • 데이터프레임을 CSV로 저장 : pd.to_csv('파일명', index=False)
    • 데이터프레임을 Excel로 저장 : pd.to_excel('파일명', index=False)

    데이터프레임 기본 정보

    • 상위 n개 행 출력: df.head(n)
    • 하위 n개 행 출력: df.tail(n)
    • 전체 컬럼 확인: df.columns
    • 인덱스 확인: df.index
    • 데이터 타입 및 정보 확인: df.info()
    • 특정 컬럼 데이터 타입 확인: df['컬럼명'].dtype
    • 데이터프레임 구조 확인: df.shape
    • 전체 데이터 타입 확인: df.dtypes
    • 전체 데이터 개수 (행 * 열): df.size

    데이터 접근 및 확인

    • 특정 값 접근:
      • 행 번호/열 번호 기준: df.iloc[행번호, 열번호]
      • 행 이름/열 이름 기준: df.loc[행이름, 열이름]
      • 특정 컬럼 데이터 접근: df['컬럼명']
      • 다중 컬럼 데이터 접근: df[['컬럼명1', '컬럼명2']]
    • 특정 열 타입 출력: df.select_dtypes(include='타입') (int, object, float, 등)
    • 결측치 개수 확인: df.isnull().sum()
    • 결측치가 아닌 데이터 개수 확인: df.notnull().sum()
    • 결측치 여부 확인 (isnull과 동일): df.isna()
    • 결측치를 제외한 각 컬럼의 데이터 개수: df.count()
    • 결측치 비율 확인: (df.isnull().sum() / df.shape[0]) * 100
    • 결측치 채우기: df.fillna(값, inplace=True)
    • 수치형 통계 확인: df.describe()
    • 특정 백분위수 값: df['컬럼명'].quantile(퍼센트) (0.5=중앙값)
    • 고유값 및 개수 출력:
      • 고유값: df['컬럼명'].unique()
      • 고유값 개수: df['컬럼명'].nunique()
    • 특정 컬럼의 고유값과 비율 확인: df['컬럼명'].value_counts(normalize=True)
    • 그룹별 조건 출력: df.groupby( '시리즈1')['시리즈2']
    • 다중 조건행 출력: df['컬럼명'].isin([값1, 값2])

    데이터 조작

    • 인덱스 초기화: df.reset_index(drop=True, inplace=True)
    • 데이터 복사: df.copy()
    • 특정 컬럼 삭제: df.drop(columns=['컬럼명1', '컬럼명2'])
    • 결측치가 있는 행 삭제: df.dropna(how='any', subset=['컬럼명']   #(how='all' 사용 시 모든 값이 결측치일 때만 삭제)
    • 결측치 채우기: df.fillna(값, method='ffill')  , df['컬럼명'].fillna(값)
    • 값 교체
      • 전체 값 교체: df.replace('기존값', '새값')
      • 문자열 내 특정 패턴 교체: df['컬럼명'].str.replace('기존문자', '새문자', regex=False)
    • 타입 변환: df['컬럼명'].astype(새타입)
      • 날짜 추출: df['컬럼명'].dt.date
      • 연도/월/일 추출: df['컬럼명'].dt.year, .dt.month, .dt.day
      • 월 이름 추출: df['컬럼명'].dt.month_name()
      • 시/분/초 추출: .dt.hour, .dt.minute, .dt.second
    • 데이터 정렬:
      • 열 기준 정렬: df.sort_values(by='컬럼명', ascending=True)
      • 여러 열 기준 정렬: df.sort_values(by=['열1', '열2'], ascending=[True, False])
    • 중복 제거: df.drop_duplicates(inplace=True)
    • 컬럼명  변경: df.rename(columns={'기존컬럼명': '새컬럼명'})
    • 컬럼명 변경2: df.columns = [ '명칭1', '명칭2' ... ]

    조건 및 변환

    • 조건부 값 변경: df['컬럼명'] = df['컬럼명'].map(lambda x: '참' if 조건 else '거짓')
    • 딕셔너리로 값 변경: df['컬럼명'].map({기존값: 새값})
    • 조건 행 추출: df[df['컬럼명'] > 조건]
    • 부정 조건: ~(조건)

    기초 통계

    • 평균, 중앙값, 최빈값, 분산:
      • 평균: df['컬럼명'].mean()
      • 중앙값: df['컬럼명'].median()
      • 최빈값: df['컬럼명'].mode()
      • 표준편차: df['컬럼명'].std()
      • 합계: df['컬럼명'].sum()
      • 분산: df['컬럼명'].var()
    • 최소값 및 최대값: df['컬럼명'].min() ,  df['컬럼명'].max():
    • 누적합: df['컬럼명'].cumsum()
    • 표준화: StandardScaler().fit_transform(df[['컬럼명']])
    • 정규화: MinMaxScaler().fit_transform(df[['컬럼명']])
    • 순위 계산: df['컬럼명'].rank(method='dense', ascending=False)  #method='dense' 제외 시 중복순위집계x

    문자열 처리

    • 대소문자 변환:
      • 대문자: df['컬럼명'].str.upper()
      • 소문자: df['컬럼명'].str.lower()
    • 공백 제거:
      • 양쪽 공백 제거: df['컬럼명'].str.strip()
      • 왼쪽 공백 제거: df['컬럼명'].str.lstrip()
      • 오른쪽 공백 제거: df['컬럼명'].str.rstrip()
    • 문자열 길이: df['컬럼명'].str.len()
    • 특정 문자열 포함 여부: df['컬럼명'].str.contains('문자열')
    • 문자 위치 찾기: df['컬럼명'].str.find('문자열')
    • 특정 문자열로 시작하는지 확인: df['컬럼명'].str.startswith('문자열')
    • 특정 문자열로 끝나는지 확인: df['컬럼명'].str.endswith('문자열')
    • 문자열 슬라이싱: df['컬럼명'].str.slice(start, stop)
    • 문자열 분리: df['컬럼명'].str.split('구분자')

    날짜데이터 처리

    • 날짜 타입 변환: pd.to_datetime(df['컬럼명'])
    • 날짜 추출: df['컬럼명'].dt.date
    • 연도/월/일 추출: df['컬럼명'].dt.year, .dt.month, .dt.day
    • 요일 추출: df['컬럼명'].dt.dayofweek (0: 월요일 ~ 6: 일요일
    • 이름 추출: df['컬럼명'].dt.month_name()
    • 시/분/초 추출: .dt.hour, .dt.minute, .dt.second

    그룹화 및 병합

    • 그룹화: df.groupby('컬럼명')
    • 데이터 병합: pd.merge(df1, df2, on='기준컬럼', how='inner')
    • 데이터프레임 이어 붙이기: pd.concat([df1, df2], axis=1) #1은 양옆, 0은 위아래로 붙이기
    • 다중그룹화: df.groupby( ['시리즈1', '시리즈2' .... ] )['시리즈n']

    기타

    • 로그 변환 : np.log1p(df['컬럼명'])
    • 왜도 계산 : df['컬럼명'].skew()
    • 첨도 계산 : df['컬럼명'].kurt():
    • 임의의 n개 샘플 추출: df.sample(n)
    • 컬럼 간 상관계수 계산: df.corr()

    >

     

     

    추가 확인

    데이터프레임명[ [ ] ] = dataframe, 2차원이상(테이블)

    데이터프레임명[ ] = series, 배열(컬럼)

     

    df.dt.date # YYYY-MM-DD (문자)

    df.dt.year # 연(4자리숫자)

    df.dt.month # 월(숫자) df.dt.month_name()

     

    #월(문자) df.dt.day #일(숫자)

    df.dt.time #HH:MM:SS(문자)

    df.dt.hour #시 df.dt.minute #분

    df.dt.second #초

     

    df.dt.is_month_start # 월 시작일 여부

    df.dt.is_month_end # 월 마지막일 여부

    df.dt.is_quarter_start # 분기 시작일 여부

    df.dt.is_quarter_end # 분기 마지막일 여부

    df.dt.is_year_start # 연 시작일 여부

    df.dt.is_year_end # 연 마지막일 여부

     

    빅분기 후기

    빅데이터분석기사 후기(필기, 실기 공부방법, 합격률, 공부기간, 난이도체감 등)(1) :: 공기업 전산직을 위한 도서관

    빅분기 실기 2유형 코드정리

    빅데이터분석기사 실기 2유형 코드정리 (3) :: 공기업 전산직을 위한 도서관   

    빅분기 실기 3유형 코드정리

    빅데이터분석기사 실기 3유형 코드정리(4) :: 공기업 전산직을 위한 도서관

     

    코드가 필요하신분은 비밀 댓글 달아주시면 보내드리겠습니다

    반응형
    반응형

    25.01.05 

    SELECT ..24.12.25 (정답률 70%대 까지)   26/33

    SUM.MIX.MIN  .. 24.12.20 (정답률 70%대 까지)    8/10

    GROUP BY  .. 24.12.29 (정답률 70%대 까지)   21/24

    IS NULL  .. 24.12.29 (정답률 70%대 까지)   9/10

    JOIN  .. 25.01.01 (정답률 70%대 까지)   9/12

    STRING,DATE   .. 25.01.05 (정답률 70%대 까지)   17/19  

     

     

    PYTHON.-코딩테스트입문 0 LV 문제풀이시작

    반응형

    '필기ㆍ코테 공부 > 코테' 카테고리의 다른 글

    코딩테스트 일기 SQL ...(7)  (4) 2025.02.03
    코딩테스트 일기 SQL ...(6)  (1) 2025.01.19
    코딩테스트 일기 SQL ...(4)  (0) 2025.01.01
    코딩테스트 일기 SQL ...(3)  (0) 2024.12.29
    코딩테스트 일기 SQL ...(2)  (1) 2024.12.22
    반응형

    출저 : 프로그래머스

     

    String, date

    문제풀이

     

    A. CONCAT, WHERE사용

    SELECT CONCAT('/home/grep/src/',B.BOARD_ID,'/', B.FILE_ID, B.FILE_NAME,B.FILE_EXT) AS FILE_PATH  

    FROM USED_GOODS_FILE AS B 
    LEFT JOIN USED_GOODS_BOARD AS A ON A.BOARD_ID = B.BOARD_ID
    WHERE A.VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)
    ORDER BY B.FILE_ID DESC

     

     → WHERE로 가장큰 조회수 조건 걸었음

     

    ※ CONCAT( a, b, c, .... ) : a, b, c ... 합쳐서 출력
     → 중간에 띄어쓰기나 기호 등은 ' ' 표시를 통해 추가하기

     

     

    반응형

    + Recent posts

    // 기업0 D-Day (표지) // 기업1 D-Day