본문 바로가기
데이터 분석 및 시각화

[데이터분석] ML_linearregression(선형회귀)

by 바다의 공간 2024. 8. 23.

회귀분석을 배우면 가장 먼저 배우는 선형회귀 입니다.

가장 쉽기도 하고 다음으로 배우는것들도 선형회귀가 연관이 되어있기때문이죠.

 

이번 시간에는 linear 리니어함수에 대해서 배워봤습니다.

선형회귀는 분리를 해주는 지도학습 알고리즘 입니다 (빅분기 필기)

 

#linearregression.py
def p(str):
    print(str, '\n')

## 선형회귀

# 라이브러리 로딩
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#한글(폰트)  설정
plt.rc('font', family='Malgun Gothic')

# melon.csv 파일을 활용해서 분류하기

#1) DF 생성
df =pd.read_csv('../assets/melon.csv')
p(df.info())
p(df.head())
p(df.describe())
p(df)

# 2) 가수별 빈도 계산(가수별로 곡이 몇개나 있는지)
singer_counts = df['가수명'].value_counts()
# print(singer_counts, type(singer_counts))
print(singer_counts)

# 3) 가수별 빈도 시각화(막대그래프)
plt.figure(figsize=(8,3))
plt.bar(singer_counts.index, singer_counts.values)
plt.xlabel('가수명')
plt.ylabel('노래개수')
plt.title('가수별 노래개수 분포')
plt.xticks(rotation=45, ha='right')#기울기, 정렬
# plt.show()

 


이번에는 다른 데이터 (channer.csv)를 가지고 확인해보려고 합니다.

#linearregression.py
def p(str):
    print(str, '\n')

## 선형회귀

# 라이브러리 로딩
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#한글(폰트)  설정
plt.rc('font', family='Malgun Gothic')

# melon.csv 파일을 활용해서 분류하기

#1) DF 생성
df =pd.read_csv('../assets/melon.csv')
p(df.info())
p(df.head())
p(df.describe())
p(df)

# 2) 가수별 빈도 계산(가수별로 곡이 몇개나 있는지)
singer_counts = df['가수명'].value_counts()
# print(singer_counts, type(singer_counts))
print(singer_counts)

# 3) 가수별 빈도 시각화(막대그래프)
plt.figure(figsize=(8,3))
plt.bar(singer_counts.index, singer_counts.values)
plt.xlabel('가수명')
plt.ylabel('노래개수')
plt.title('가수별 노래개수 분포')
plt.xticks(rotation=45, ha='right')#기울기, 정렬
# plt.show()

## channer.csv

# 1) 데이터프레임 생성
df1 = pd.read_csv('../assets/channel.csv')
df1.info()
# p(df1)

# 첫번째 컬럼명 '연도'로 변경
df1 = df1.rename(columns={'Unnamed: 0' : '연도'})
# p(df1)

# 2) 연도별 각 채널의 시청률 변화 시각화(선그래프)
# plt.figure(figsize = (12, 6))
# for channel in df1.columns[1:]:
#     plt.plot(df1["연도"], df1[channel], label = channel)
# plt.xlabel("연도")
# plt.ylabel("시청률")
# plt.title("연도별 각 채널의 시청률 변화")
# plt.legend(loc = "upper right")
# plt.grid(True)
# plt.show()

# # 3) 연도별 각 채널의 시청률 평균을 계산하고 막대그래프로 시각화
# avg = df1.groupby("연도").mean()
# avg.plot(kind = "bar", figsize = (12, 6))
# plt.xlabel("연도")
# plt.ylabel("평균 시청률")
# plt.title("연도별 각 채널의 시청률 평균")
# plt.legend(title = '채널')
# plt.xticks(rotation = 0)
# plt.grid(axis = "y")
# plt.show()

# 4) 연도별 각 채널의 시청률 변화를 확인하고 가장 큰 변화를 보인 채널 출력하기
#행마다의 변화량

df1['변화량'] = df1[df1.columns[1:]].diff().abs().sum(axis = 1)
p(df1[df1['변화량'] == df1['변화량'].max()])

#가장 큰 시청률 변화를 보인 채널(각 연도마다로 확인 출력)
# df1.set_index('연도').diff(axis=0).abs().idxmax(axis=1)
# #.set_index('연도') : 연도 열을 인덱스로 지정
# #.diff(axis = 0 ) : 각 행에서 이전 행과의 차이
# #.abs() : 절대값으로 반환
# #.idxmax(axis = 1) : 각 행에서 최대값의 인덱스를 찾음
# p(df1)

2) 그래프

3) 그래프

4) 가장 큰 시청률 변화를 보인 채널(각 연도마다로 확인 출력)


선형회귀 (Linear Regression) / 지도학습

#linearregression.py

def p(str):
    print(str, '\n')

## 선형회귀

# 라이브러리 로딩
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#한글(폰트)  설정
plt.rc('font', family='Malgun Gothic')

# melon.csv 파일을 활용해서 분류하기

#1) DF 생성
df =pd.read_csv('../assets/melon.csv')
# p(df.info())
# p(df.head())
# p(df.describe())
# p(df)

# 2) 가수별 빈도 계산(가수별로 곡이 몇개나 있는지)
singer_counts = df['가수명'].value_counts()
# print(singer_counts, type(singer_counts))
# print(singer_counts)

# 3) 가수별 빈도 시각화(막대그래프)
# plt.figure(figsize=(8,3))
# plt.bar(singer_counts.index, singer_counts.values)
# plt.xlabel('가수명')
# plt.ylabel('노래개수')
# plt.title('가수별 노래개수 분포')
# plt.xticks(rotation=45, ha='right')#기울기, 정렬
# # plt.show()

## channer.csv

# 1) 데이터프레임 생성
df1 = pd.read_csv('../assets/channel.csv')
df1.info()
# p(df1)

# 첫번째 컬럼명 '연도'로 변경
df1 = df1.rename(columns={'Unnamed: 0' : '연도'})
# p(df1)

# 2) 연도별 각 채널의 시청률 변화 시각화(선그래프)
# plt.figure(figsize = (12, 6))
# for channel in df1.columns[1:]:
#     plt.plot(df1["연도"], df1[channel], label = channel)
# plt.xlabel("연도")
# plt.ylabel("시청률")
# plt.title("연도별 각 채널의 시청률 변화")
# plt.legend(loc = "upper right")
# plt.grid(True)
# plt.show()

# # 3) 연도별 각 채널의 시청률 평균을 계산하고 막대그래프로 시각화
# avg = df1.groupby("연도").mean()
# avg.plot(kind = "bar", figsize = (12, 6))
# plt.xlabel("연도")
# plt.ylabel("평균 시청률")
# plt.title("연도별 각 채널의 시청률 평균")
# plt.legend(title = '채널')
# plt.xticks(rotation = 0)
# plt.grid(axis = "y")
# plt.show()

# 4) 연도별 각 채널의 시청률 변화를 확인하고 가장 큰 변화를 보인 채널 출력하기
#행마다의 변화량

df1['변화량'] = df1[df1.columns[1:]].diff().abs().sum(axis = 1)
p(df1[df1['변화량'] == df1['변화량'].max()])

#가장 큰 시청률 변화를 보인 채널(각 연도마다로 확인 출력)
# df1.set_index('연도').diff(axis=0).abs().idxmax(axis=1)
# set_index('연도') : 연도 열을 인덱스로 지정
# diff(axis = 0 ) : 각 행에서 이전 행과의 차이
# abs() : 절대값으로 반환
# idxmax(axis = 1) : 각 행에서 최대값의 인덱스를 찾음
df1.set_index('연도').diff(axis=0).abs().idxmax(axis=1)
p(df1)


#선형회귀(Linear Regression)
# 종속변수 y와 한 개 이상의 독립변수 x와의 선형 관계를
# 모델링하는 회귀분석 기법

#라이브러리 임포트
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

#랜덤데이터 생성
#랜덤 시드값 정하기
np.random.seed(0)
#독립변순
#0 ~ 1 까지 랜덤한 값을 생성해서 X 생성
X = np.random.rand(100, 1)
#종속변수 f(y)=x+1+잡음(노이즈)
y = X + 1 + 0.1*np.random.randn(100, 1)

#선형 회귀모델 생성
model = LinearRegression()

# 모델 학습
model.fit(X, y)

#학습된 모델을 사용하여 예측
#새로운 예측값 생성
X_test = np.array([[5.0]])
p(X_test) #[[5.]]
# 예측값 생성
y_pred = model.predict(X_test)
p(y_pred) #[[3.00960211]]

# 여기까지는 x가 5.0이면 y값은 어느정도겠지? 하고 예측해본것

#학습데이터와 예측결과를 시각화
#legend 범례
plt.scatter(X, y, label = 'Training Data')
plt.plot(X_test, y_pred, color='red',label='predicted')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()

 

 

 

 

 

 

 

 

 

 

코드작성시 당연한 말 이지만..

띄어쓰기, 엔터 콜론 등 절대적으로 잘 용도에 맞추어서 사용해야합니다.

이번에는 줄바꿀때 띄어쓰기가 안맞아서 계속 에러가 났습니다.

앞으로 한 줄 넘어갈때 좀 더 유심하게 확인해야겠다고 생각했습니다.