Bootcamp/KT aivle school

04.01 kt 에이블스쿨 5일차 pandas, seaborn 응용 | Java 코딩테스트 입문

Nyamggoon 2025. 4. 1. 21:16

데이터 시각화 그래프 많은 종류들을 응용하고 실습하는 날

1. 단변량분석 - 수치형

df['column'] 으로 조회를 하게 되면, 결과값이 Series로 나오게 된다. 여기다가 [] 를 붙여서 리스트로 만들어주게 되면, df[['column']] 으로 되면서 결과값이 Dataframe으로 변환이 된다!

df[['column']].describe().T 를 하면 기술통계량을 아주 편하게 살펴볼 수 있다는 꿀팁~

시각화

-Histogram

plt.hist(x='column', data=dataframe, edgecolor='color', alpha=number)
sns.histplot(x='column', data=dataframe, bins=number)
plt.show()

-Density Plot : Histogram과 다른점! 'bins' 즉, 구간 개수를 따로 지정해주지 않기 때문에 사람마다 시각화한 결과가 다를 걱정이 없음

그래프가 부드럽기 때문에, 구간을 나눴을 때 모양이 갑자기 바뀌는 histogram보다 안정적인 것 같다. (이건 내 생각)

dataframe['column'].plot(kind='kde')
sns.kdeplot(x='column', data=dataframe, fill=True)
plt.show()

-Box Plot : pyplot은 결측치가 있으면 작동 x, seaborn은 결측치 있어도 잘 그려짐

박스플롯이 어렵지만은.. IQR = Q3 - Q1(데이터의 50%가 모여있는 구간) 이걸 이용해서

Q3 + IQR*1.5 upper bound / Q1 - IQR*1.5 lower bound 이렇게 이상치를 확인할 수 있는 경계를 알 수 있게 해줌!

Q. upper bound가 실제로 boxplot에 나타나는 이상치 제외 최댓값 선이랑 엄청 가까이 붙어있을 수도 있나요? (이상치가, 이상치 제외 최댓값 선이랑 되게 가까이 붙어서 표시되서 궁금했습니다)

요거!

답변은 충분히 그렇게 나타날 수도 있다고. 특히 데이터가 엄청 많으면 그렇게 될 수 있다! => 해결 

plt.boxplot(x='column', data=dataframe, vert=False)
sns.boxplot(x='column', data=dataframe, width=number, color='color', medianprops={'color':'색깔명'})

#axvline 으로 mean 값 등 다른 통계치들을 표시해주면 눈에 잘 들어온다!
plt.axvline(df['column'].mean(), linestyle='', linewidth='', color='', ymin='', ymax='' ...)

plt.show()

시계열 데이터 시각화

pd.to_datetime() 을 이용해서 x축을 시간 데이터로 변환해준다

plt.plot('시간column', 'y column', data=dataframe, label='')
sns.lineplot(x='column',y='column', data=dataframe, label='')
plt.show()

2. 단변량 분석 - 범주형

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings

# 버전에 따른 warning 을 무시해준대요 짱짱 편함
warnings.filterwarnings(action='ignore')
%config InlineBackend.figure_format='retina'

수치화

df['column'].value_counts() # 단순한 count
df['column'].value_counts(normalize=True) # 비율로 정규화
df['column'].unique() # 범주 class 확인 + sorted() 사용하면 정렬 가능

시각화

Bar Plot

var = df['column'].value_counts()
plt.bar(x= , height= )
sns.countplot(x='', data=dataframe)

위에서 .value_counts() 를 이용해서, series 형태로 범주(index)와 범주의 개수(value)를 변수로 저장해줌.

x에는 .index 로 astype() 를 이용해 () 안에 str을 넣어 문자열로 변환! 하면 우리가 보고자 한 범주만 x축 라벨에 나옴.

height에는 .values 를 넣어주면 된다

Pie Chart : 이건 자주 안쓸 것 같다..

plt.pie(x=~~.values, labels=~~.index, autopct='표시형식 지정') # %는 백분율로 표시, .nf 는 소수점자리, %% 는 % 기호 넣음
plt.show()

startangle, counterclock, explode, shadow 등 다양한 설정이 있는데 이는 굳이 안쓸 거 같다.

 

3. 이변량 분석 수치형 -> 수치형

시각화 

산점도 plt.scatter(x='', y='', data='', s='', c='') # s 사이즈, c 컬러

sns.scatterplot(x='', y='', data='', c='', edgecolor=T/F)

Pair Plot sns.pairplot()

Joint Plot 산점도랑 히스토그램 거기다 kde 그래프도 넣을 수 있는 만능! sns.jointplot(x='', y='', data='')

 kind 매개변수가 있는데 => reg 회귀, hex 벌집모양(?), kde 확률밀도함수 를 그릴 수 있음

수치화

spicy.stats 라이브러리의 함수 pearsonr() 를 이용! spst.pearsonr(df['col1'], df['col2'])

df.corr() 도 가능 (Pandas 의 corr() 메소드임) numeric_only=True를 해야 숫자형만 가져온대요!~

.style.background_gradient(cmap='', vmin=-1, vmax=1) 이거 붙이면 heatmap 비슷하게 볼 수 있음

sns.heatmap( df.corr(numeric_only=True), ... ) -> 상관계수 시각화

annot(수치 보여줄거니?), fmt(수치 표시 형식은?), cmap(색깔은?), vmin(변수 최소값?), vmax(변수 최대값?), square, cbar 등등 다양한 매개변수가 있다

상관계수가 꼭 만능은 아닌데! 이거는 시각화를 해야지만이 알 수 있는 정보들도 있어서 그렇다

 

정리 끝!

주말에는 진짜 한 데이터 잡고 실습 해본다 반드시

 


 

코딩마스터스 라는 제도를 운영중인데, 4월 한달간 코딩문제 100문제 가량을 풀고 스스로 학습한 뒤, 5월 2회에 걸쳐서 자체 코딩 테스트를 볼 수 있다. 근데 나는 아직 한 번도 코테를 준비해 본 적이 없어서.. 조금 쫄린다. 이거 300점 만점에 200점 넘기면 10만원 용돈도 받는데.. 진짜 받고싶다.

<나의 계획>

매일 9시 20분 체크인 전에 코테 문제 2개 풀이

프로그래머스 코딩 테스트 문제 풀이 전략 : 자바편 이 책을 한 달 동안 볼 수 있는 만큼 최대한 본다!

4.3 ~ 4.30 해당 기간동안 100문제를 최대한 풀어본다. 적어도 중급까지 해서 60문제까지는 풀도록!

오늘은 프로그래머스 기본 연습 10문제를 풀었다.

 

1. 머쓱이는 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 2022년 기준 선생님의 나이 age가 주어질 때, 선생님의 출생 연도를 return 하는 solution 함수를 완성해주세요

import java.time.LocalDate;

class Solution {
    public int solution(int age) {
        if (age > 0 && age <= 120) {
        int year = LocalDate.now().getYear();
        int answer = year - (age+2);
        return answer;
        } else {
            System.out.println("오류: 나이는 0 초과, 120 이하 이어야합니다.");
            return -1;
        } 
    }  
}

LocalDate 라이브러리랑 now() 메소드를 잊어버렸습니다. GPT한테 물어봐서 알아냈구요.

if 문과 else 문 각각에 return 을 붙여줘야 함수 결과값이 반환된다는 것을 다시금 깨달았습니다.

 

2. 정수 num1과 num2가 매개변수로 주어집니다. 두 수가 같으면 1 다르면 -1을 retrun하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int num1, int num2) {
        if (num1 == num2) {
            int answer = 1;
            return answer;
        } else {
            int answer = -1;
            return answer;
        }
    }
}

여기서 다른 사람들 풀이를 보는데, "삼항 연산자" 를 활용하면 더 간단하게 할 수 있다는 것입니다다. 아래처럼

class Solution {
    public int solution(int num1, int num2) {
        int answer = num1 == num2 ? 1 : -1;
        return answer;
    }
}

if else 써가면서 복잡하게 써야했던 코드가 단 두 줄 만에 정리가 되었습니다 대박..

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

 

Equality, Relational, and Conditional Operators (The Java™ Tutorials > Learning the Java Language > Langu

The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag

docs.oracle.com

해당 oracle docs에도 소개가 되어 있습니다.

result = someCondition ? value1 : value2;

? 앞 구문이 참이면 result=value1, 거짓이면  result=value2 라는 의미! 삼항 연산자 자주 쓰도록 하겠습니다.

 

3. 정수 num1, num2가 매개변수로 주어질 때, num1을 num2로 나눈 몫을 return 하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int num1, int num2) {
        int answer = (num1 / num2);
        return answer;
    }
}

java 언어 사칙연산자 다 까먹었습니다.

+(더하기), *(곱하기), /(나누기), -(빼기) // 단, int에 저장하면 소수점이 다 짤리기에 / 만 해도 몫이 나옴.

float에 저장하면 나누기 + % 로 나머지를 구해줄 수 있음.

 

4. 정수 num1과 num2가 주어질 때, num1에서 num2를 뺀 값을 return하도록 soltuion 함수를 완성해주세요.

class Solution {
    public int solution(int num1, int num2) {
        int answer = num1 - num2 ;
        return answer;
    }
}

5. 정수 num1, num2가 매개변수 주어집니다. num1과 num2를 곱한 값을 return 하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int num1, int num2) {
        int answer = num1 * num2;
        return answer;
    }
}

6. 정수 num1, num2가 매개변수로 주어질 때, num1를 num2로 나눈 나머지를 return 하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int num1, int num2) {
        int answer = num1 % num2;
        return answer;
    }
}

7. 정수 num1과 num2가 주어질 때, num1과 num2의 합을 return하도록 soltuion 함수를 완성해주세요.

class Solution {
    public int solution(int num1, int num2) {
        int answer = num1 + num2;
        return answer;
    }
}

 

8. 정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(double num1, double num2) {
        int answer = (int) ((num1 / num2) * 1000.0);
        return answer;
    }
}
       return  (int) (((double) num1/num2) * 1000); # 형변환
              return num1 * 1000 / num2; # 정수의 연산 특성을 이용

아래는 다른사람들 풀이 인데, 정수의 연산 특성을 이용해서 그냥 형변환 없이 처리하는 방법도 있구나! 하는 게 신기했습니다. 오..

() 를 이용해서 명시적인 형 변환을 해주면 오류가 안난다는 것도 알았구요.

Data type 이 동일해야 연산 가능하다는 걸 까먹고 있었습니다. 이것도 다시 공부해야겠네요.

9. 머쓱이네 피자가게는 피자를 일곱 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 주어질 때, 모든 사람이 피자를 한 조각 이상 먹기 위해 필요한 피자의 수를 return 하는 solution 함수를 완성해보세요.

class Solution {
    public int solution(int n) {
        int answer = n % 7 != 0 ? n/7 + 1 : n/7;
        return answer;
    }
}

삼항 연산자 쓰고 뿌듯해하고 있었는데..

        return (n + 6) / 7;

다들 어떻게 저렇게 생각하는 걸까요? 수학공부 다시 하러 갑니다..

 

10. 머쓱이네 피자가게는 피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int slice, int n) {
        int answer =  (n + (slice-1)) / slice ;
        return answer;
    }
}

이전에 다른사람이 풀이했던 거 그대로 응용해서 풀어봤습니다!

int answer = n % 7 != 0 ? n/7 + 1 : n/7;

요 포맷을 10번 문제 풀이로 하신 분들도 있더라구요? 신기했습니다.

Java 기본 문법부터 다시 공부해야겠네요..

Java 코딩테스트 / 수업 복습 / 정보처리기사 / AICE Associate 까지 할게 부쩍 많아지는 요즘 입니다ㅜ