DataScience

날씨 데이터 분석 GlobalWeatherRepository

Pro.Dev 2023. 9. 4. 10:28
반응형

기본적인 정보를 확인해보겠습니다.

import pandas as pd

data = pd.read_csv('GlobalWeatherRepository.csv')

data.head()
       country     location_name  latitude  longitude        timezone  \
0  Afghanistan             Kabul     34.52      69.18      Asia/Kabul   
1      Albania            Tirana     41.33      19.82   Europe/Tirane   
2      Algeria           Algiers     36.76       3.05  Africa/Algiers   
3      Andorra  Andorra La Vella     42.50       1.52  Europe/Andorra   
4       Angola            Luanda     -8.84      13.23   Africa/Luanda   

   last_updated_epoch      last_updated  temperature_celsius  \
0          1693301400  2023-08-29 14:00                 28.8   
1          1693301400  2023-08-29 11:30                 27.0   
2          1693301400  2023-08-29 10:30                 28.0   
3          1693301400  2023-08-29 11:30                 10.2   
4          1693301400  2023-08-29 10:30                 25.0   

   temperature_fahrenheit condition_text  ...  air_quality_PM2.5  \
0                    83.8          Sunny  ...                7.9   
1                    80.6  Partly cloudy  ...               28.2   
2                    82.4  Partly cloudy  ...                6.4   
3                    50.4          Sunny  ...                0.5   
4                    77.0  Partly cloudy  ...              139.6   

   air_quality_PM10  air_quality_us-epa-index air_quality_gb-defra-index  \
0              11.1                         1                          1   
1              29.6                         2                          3   
2               7.9                         1                          1   
3               0.8                         1                          1   
4             203.3                         4                         10   

    sunrise    sunset  moonrise   moonset      moon_phase  moon_illumination  
0  05:24 AM  06:24 PM  05:39 PM  02:48 AM  Waxing Gibbous                 93  
1  06:04 AM  07:19 PM  06:50 PM  03:25 AM  Waxing Gibbous                 93  
2  06:16 AM  07:21 PM  06:46 PM  03:50 AM  Waxing Gibbous                 93  
3  07:16 AM  08:34 PM  08:08 PM  04:38 AM  Waxing Gibbous                 93  
4  06:11 AM  06:06 PM  04:43 PM  04:41 AM  Waxing Gibbous                 93  

[5 rows x 41 columns]

 

데이터의 기본 구조는 다음과 같습니다

국가, 지역명, 위도, 경도, 시간대 등의 위치 정보
날씨 정보 (온도, 습도, 바람 속도, 기압 등)
대기 질 정보 (미세먼지, 초미세먼지 등)
일출, 일몰, 달 뜨는 시간, 달 지는 시간 등의 천문 관련 정보

 

 

 

데이터의 기본 정보는 다음과 같습니다

 

data_info = data.info()

missing_values = data.isnull().sum()

data_info, missing_values

 

  • 총 780개의 행과 41개의 열로 구성되어 있습니다.
  • 각 열의 데이터 유형은 수치형 (int64, float64) 및 문자열 (object)로 구성되어 있습니다.
  • 결측치는 없습니다. (모든 열에 780개의 데이터가 있음)

 

data.describe()

 

         latitude   longitude  last_updated_epoch  temperature_celsius  \
count  780.000000  780.000000        7.800000e+02           780.000000   
mean    19.297282   21.826103        1.693408e+09            22.671667   
std     24.590227   65.712248        8.369226e+04             6.791413   
min    -41.300000 -175.200000        1.693301e+09             2.900000   
25%      3.750000   -6.840000        1.693348e+09            17.650000   
50%     17.250000   23.240000        1.693402e+09            24.000000   
75%     41.330000   50.580000        1.693460e+09            28.000000   
max     63.830000  179.220000        1.693526e+09            45.000000   

       temperature_fahrenheit    wind_mph    wind_kph  wind_degree  \
count              780.000000  780.000000  780.000000   780.000000   
mean                72.808718    6.888205   11.085513   172.233333   
std                 12.225101    4.540630    7.310074    98.241075   
min                 37.200000    2.200000    3.600000     1.000000   
25%                 63.800000    3.800000    6.100000    90.000000   
50%                 75.200000    5.600000    9.000000   175.500000   
75%                 82.400000    9.400000   15.100000   249.250000   
max                113.000000   30.000000   48.200000   360.000000   

       pressure_mb  pressure_in  ...    gust_kph  air_quality_Carbon_Monoxide  \
count   780.000000   780.000000  ...  780.000000                   780.000000   
mean   1012.288462    29.891718  ...   17.246282                   454.053974   
std       5.892065     0.173377  ...   11.470302                   821.161879   
min     998.000000    29.470000  ...    0.700000                   123.500000   
25%    1008.000000    29.770000  ...    9.000000                   213.600000   
50%    1012.000000    29.880000  ...   14.600000                   263.700000   
75%    1015.000000    29.970000  ...   22.700000                   413.900000   
max    1036.000000    30.590000  ...   79.600000                 14099.100000   

       air_quality_Ozone  air_quality_Nitrogen_dioxide  \
count         780.000000                    780.000000   
mean           42.813205                      9.233974   
std            36.290259                     18.117526   
min             0.000000                      0.000000   
25%            19.850000                      0.900000   
50%            35.400000                      3.400000   
75%            55.800000                      9.475000   
max           320.400000                    241.300000   

       air_quality_Sulphur_dioxide  air_quality_PM2.5  air_quality_PM10  \
count                   780.000000         780.000000        780.000000   
mean                      6.191538          17.241923         27.997564   
std                      14.789406          45.789973         61.580476   
min                       0.000000           0.500000          0.500000   
25%                       0.400000           2.800000          4.800000   
50%                       1.300000           6.250000         10.550000   
75%                       5.300000          15.425000         25.025000   
max                     169.800000         700.800000        869.600000   

       air_quality_us-epa-index  air_quality_gb-defra-index  moon_illumination  
count                780.000000                  780.000000         780.000000  
mean                   1.393590                    1.901282          97.250000  
std                    0.838857                    2.042991           2.587679  
min                    1.000000                    1.000000          93.000000  
25%                    1.000000                    1.000000          96.750000  
50%                    1.000000                    1.000000          98.000000  
75%                    1.250000                    2.000000          98.500000  
max                    6.000000                   10.000000         100.000000  

[8 rows x 30 columns]
  • 온도:
    • 평균 온도는 약 22.67°C로, 최저 온도는 2.9°C, 최고 온도는 45°C입니다.
  • 풍속:
    • 평균 풍속은 약 6.89 mph로, 최저 풍속은 2.2 mph, 최고 풍속은 30 mph입니다.
  • 대기 압력:
    • 평균 대기압은 약 1012.29 mb로, 최저 대기압은 998 mb, 최고 대기압은 1036 mb입니다.
  • 미세먼지 (PM2.5):
    • 평균 농도는 약 17.24 μg/m³로, 최저 농도는 0.5 μg/m³, 최고 농도는 700.8 μg/m³입니다.

 

 

다음으로, 몇몇 주요 변수들의 분포를 시각화하여 살펴보겠습니다.

 

특히, 온도, 풍속, 대기 압력, 및 미세먼지 (PM2.5)의 분포를 확인해보겠습니다.

 

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(2, 2, figsize=(15, 10))

sns.histplot(data['temperature_celsius'], ax=ax[0, 0], bins=30, color='skyblue', kde=True)
ax[0, 0].set_title('Distribution of Temperature (°C)')
ax[0, 0].set_xlabel('Temperature (°C)')

sns.histplot(data['wind_mph'], ax=ax[0, 1], bins=30, color='salmon', kde=True)
ax[0, 1].set_title('Distribution of Wind Speed (mph)')
ax[0, 1].set_xlabel('Wind Speed (mph)')

sns.histplot(data['pressure_mb'], ax=ax[1, 0], bins=30, color='lightgreen', kde=True)
ax[1, 0].set_title('Distribution of Atmospheric Pressure (mb)')
ax[1, 0].set_xlabel('Pressure (mb)')

sns.histplot(data['air_quality_PM2.5'], ax=ax[1, 1], bins=30, color='lightcoral', kde=True)
ax[1, 1].set_title('Distribution of PM2.5 (μg/m³)')
ax[1, 1].set_xlabel('PM2.5 (μg/m³)')

plt.tight_layout()
plt.show()

 

 

 

  1. 온도 분포 (°C)
    • 대부분의 지역의 온도는 20°C ~ 30°C 사이에 분포되어 있으며, 일부 극단적인 낮은/높은 온도의 지역도 있습니다.
  2. 풍속 분포 (mph)
    • 대부분의 지역의 풍속은 10mph 미만으로 분포되어 있습니다.
  3. 대기 압력 분포 (mb)
    • 대기 압력은 대부분 1010mb ~ 1020mb 사이에 집중되어 있습니다.
  4. 미세먼지 (PM2.5) 분포 (μg/m³)
    • 대부분의 지역에서 PM2.5 농도는 낮지만, 일부 지역에서는 매우 높은 농도를 보이고 있습니다.

 

 

 

중국과 대한민국의 미세먼지(PM2.5) 농도를 비교하기 위해, 두 나라의 데이터를 추출하고 시각화해보겠습니다. 먼저 두 나라의 미세먼지 농도 분포를 확인한 후, 평균 미세먼지 농도를 비교해보겠습니다.

 

china_data = data[data['country'] == 'China']
south_korea_data = data[data['country'] == 'South Korea']

plt.figure(figsize=(12, 6))

sns.kdeplot(china_data['air_quality_PM2.5'], label='China', shade=True, color='red')
sns.kdeplot(south_korea_data['air_quality_PM2.5'], label='South Korea', shade=True, color='blue')

plt.title('Distribution of PM2.5 Concentration for China and South Korea')
plt.xlabel('PM2.5 Concentration (μg/m³)')
plt.ylabel('Density')
plt.legend()

plt.show()

 

  • 중국 (빨간색): 대부분의 지역에서 미세먼지 농도가 다양하게 분포되어 있으며, 특히 높은 농도를 나타내는 지역도 있습니다.
  • 대한민국 (파란색): 대부분의 지역에서 미세먼지 농도가 낮은 편이지만, 중간 정도의 농도를 나타내는 지역도 있습니다.

 

다음으로, 두 나라의 평균 미세먼지 농도를 비교해보겠습니다.

 

china_avg_pm25 = china_data['air_quality_PM2.5'].mean()
south_korea_avg_pm25 = south_korea_data['air_quality_PM2.5'].mean()


plt.figure(figsize=(8, 6))
sns.barplot(x=['China', 'South Korea'], y=[china_avg_pm25, south_korea_avg_pm25], palette=['red', 'blue'])

plt.title('Average PM2.5 Concentration for China and South Korea')
plt.ylabel('Average PM2.5 Concentration (μg/m³)')

plt.show()

china_avg_pm25, south_korea_avg_pm25
RESULT
(173.02499999999998, 44.5)

 

 

중국과 대한민국의 평균 미세먼지 (PM2.5) 농도는 다음과 같습니다

  • 중국: 약 173.02 
  • 대한민국: 약 44.5 

 

비교 결과, 중국의 평균 미세먼지 농도가 대한민국보다 훨씬 높다는 것을 알 수 있습니다.

이러한 차이는 다양한 요인에 의해 발생할 수 있습니다. 예를 들면, 산업 활동, 자동차 배출량, 기후 조건, 대기 순환 등의 요인이 미세먼지 농도에 영향을 줄 수 있습니다.

 

 

 

미세먼지(PM2.5)와 관련 있는 변수들을 파악하기 위해, 상관 행렬에서 미세먼지(PM2.5)와의 상관계수를 살펴보겠습니다.


높은 상관계수(양의 상관관계 또는 음의 상관관계)를 갖는 변수들은 미세먼지 농도와 관련이 있을 가능성이 높습니다.

미세먼지(PM2.5)와의 상관계수를 정렬하여 가장 관련 있는 변수들을 확인해보겠습니다.

 

pm25_correlation = correlation_matrix['air_quality_PM2.5'].sort_values(ascending=False)

pm25_correlation = pm25_correlation.drop('air_quality_PM2.5')

pm25_correlation
RESULT
air_quality_PM10                0.944798
air_quality_Carbon_Monoxide     0.839759
air_quality_us-epa-index        0.785320
air_quality_gb-defra-index      0.713071
air_quality_Nitrogen_dioxide    0.494834
air_quality_Sulphur_dioxide     0.345447
uv_index                        0.097893
longitude                       0.073568
wind_degree                     0.028147
pressure_in                     0.017212
last_updated_epoch              0.017019
pressure_mb                     0.016643
moon_illumination               0.015587
temperature_fahrenheit          0.006712
temperature_celsius             0.006686
feels_like_celsius              0.004151
feels_like_fahrenheit           0.003939
air_quality_Ozone              -0.033107
precip_in                      -0.045059
precip_mm                      -0.045463
humidity                       -0.049813
visibility_miles               -0.113546
visibility_km                  -0.115076
wind_mph                       -0.121671
wind_kph                       -0.121857
latitude                       -0.126515
cloud                          -0.139603
gust_mph                       -0.160523
gust_kph                       -0.160650
Name: air_quality_PM2.5, dtype: float64
data = pd.read_csv('/mnt/data/GlobalWeatherRepository.csv')

correlation_matrix = data.corr()

pm25_correlation = correlation_matrix['air_quality_PM2.5'].sort_values(ascending=False).drop('air_quality_PM2.5')


plt.figure(figsize=(12, 10))
pm25_correlation.sort_values().plot(kind='barh', color='skyblue')
plt.title("Correlation with PM2.5")
plt.xlabel("Correlation Coefficient")
plt.ylabel("Variables")
plt.show()

 

양의 상관관계:

  1. air_quality_PM10: 0.945 - 대기 중의 미세먼지 크기 (PM10)와 PM2.5는 매우 높은 양의 상관관계를 보입니다. 이는 두 미세먼지 종류가 동시에 발생하거나, 같은 원인으로 인해 발생하는 경우가 많기 때문입니다.
  2. air_quality_Carbon_Monoxide: 0.840 - 일산화탄소 농도와 PM2.5의 농도는 높은 양의 상관관계를 보입니다. 일산화탄소와 미세먼지는 같은 오염원 (예: 자동차 배출가스)에서 발생할 수 있습니다.
  3. air_quality_us-epa-index: 0.785 - 미국 환경보호청의 대기질 지수와 PM2.5는 높은 양의 상관관계를 보입니다. 이 지수는 여러 대기질 요소를 종합적으로 평가한 것입니다.

음의 상관관계:

  1. gust_kphgust_mph: 약 -0.161 - 돌풍의 속도와 PM2.5는 약한 음의 상관관계를 보입니다. 강한 바람이 불면 미세먼지가 흩어질 수 있기 때문입니다.
  2. cloud: 약 -0.140 - 구름의 양과 PM2.5는 약한 음의 상관관계를 보입니다. 구름이 많은 경우, 대기의 물분이 미세먼지를 흡수하거나 중화시킬 수 있습니다.

이러한 상관관계를 통해 미세먼지 농도와 관련된 여러 요인들을 파악할 수 있습니다. 하지만 상관관계는 인과관계를 나타내지 않으므로, 특정 변수가 미세먼지 농도를 직접적으로 영향 주는지에 대해서는 추가적인 연구가 필요합니다.

 

 

 

이 데이터만으로 지구 온난화를 직접적으로 확인하는 것은 어렵습니다. 그 이유는 다음과 같습니다

 

데이터의 시간 범위를 확인하기 위해 "last_updated" 열의 최소값(시작 시점)과 최대값(종료 시점)을 확인하겠습니다. 

start_date = data['last_updated'].min()
end_date = data['last_updated'].max()

start_date, end_date
RESULT
('2023-08-29 02:45', '2023-09-01 12:45')

 

제공된 데이터는 "2023-08-29 02:45"부터 "2023-09-01 12:45"까지의 정보를 포함하고 있습니다.

즉, 이 데이터는 약 3일 동안의 날씨 및 대기질 정보를 담고 있습니다.

 

  1. 시간 범위: 지구 온난화는 수십 년에서 수백 년에 걸친 긴 시간 동안의 기후 변화를 나타내는 현상입니다. 제공된 데이터는 특정 시점의 데이터이며, 이로 인해 장기간의 기후 변화 추세를 파악하기는 어렵습니다.
  2. 변수 한정: 지구 온난화는 온도, 해수면 상승, 극지방 빙하의 녹아내림 등 여러 요인들로 나타납니다. 현재 데이터에는 온도 정보는 있지만, 이 외의 다른 지구 온난화 지표는 포함되어 있지 않습니다.
  3. 지역 한정: 지구 온난화는 전 세계적인 현상입니다. 제공된 데이터는 전 세계의 몇몇 지역만 포함하고 있을 수 있습니다.

그럼에도 불구하고, 제공된 데이터의 온도 정보를 이용하면 특정 지역의 기후 변화나 온도 추세를 파악하는 데 도움이 될 수 있습니다. 만약 여러 년도에 걸친 데이터가 제공된다면, 그 지역의 온도 추세를 확인하여 지구 온난화와 관련된 정보를 얻을 수 있습니다.

결론적으로, 이 데이터만으로 지구 온난화를 직접적으로 확인하는 것은 어렵지만, 다른 추가적인 데이터나 정보와 결합하면 지구 온난화에 대한 통찰력을 얻을 수 있을 것입니다.

 

 

 

반응형