Herkese merhaba uzun bir zamandan sonra ilk yine yazıyorum. XE5 'den Delphi 7 ye geçmiş bunmaktayım. Artık Delphi 7 üzerinden anlatıcağım yaptıklarımı. Bu yazıda istatistiğin kalıplaşmış analistlerinden biri olan regresyonun bir versiyonunu anlatacağım.
Bu yazıda Simple Lineer Regression 'nun nasıl yapılacağından bahsedeceğim. Regresyon mantığı temelde bir bağımlı değişkenin bir bağımsız üzerindeki etkisini ölçmek için kullanılmaktadır. Örneğin gelir ve harcama için bir regresyon doğrusu yapıldığında gelir bağımsız ve harcama bağımlı değişken olursa bir sonraki ay alacağınız maaşa göre ne kadar harcama yapacağınızı tahminleyebilirsiniz.
Bunun için size küçük bir örnek hazırladım. Ama öncelikle basit lineer regresyonun algoritma mantığına bakalım.
|
b1 = Σ [ (xi - x)(yi - y) ] / Σ [ (xi - x)2] b1 = 470/730 = 0.644 | b0 = y - b1 * x b0 = 77 - (0.644)(78) = 26.768 |
Yukarıda bir siteden aldığım lineer regresyon modeli bulunmakta. Lineer Regresyonun fonksiyonunu yazacak olursak
Y = b0 + b1 X şeklindedir. Yani X bagımsız değişkenlerine bağımlı Y ler tahminlenir. Bu fonsiyon bizim regresyon doğrumuzu oluşturmakta. Şimdi verilen formüle göre b0 ve b1 hesaplayalım.
Bunun için görüldüğü gibi bir takım toplama, çıkarma , çarpma ve bölme işlemine ihtiyacımız var. Bu işlemler ile ortalamalar ve fark çarpımlarını hesaplıyacağız.
Toplamlar, ortalama ,farkkareler toplamları için fonksiyonlar yazacağız, böylece işlemleri daha çabuk yapabilir, hemde diğer analizlerde bunları kullanabiliriz.
Fonksiyonları toplu bir şekilde yazacak olursak.
Var
Toplam:Extended;
begin
Toplam := 0;
Result := 0;
ClientDataSet.First;
While Not ClientDataSet.Eof Do
Begin
Toplam := Toplam + ClientDataSet.FieldByName(Kolon).Value;
ClientDataSet.Next;
Result := Result + 1;
End;
Result := Toplam / Result;
end;
function TForm1.Toplam(ClientDataSet:TClientDataSet;Kolon:String):Extended;
begin
Result := 0;
ClientDataSet.First;
While Not ClientDataSet.Eof Do
Begin
Result := Result + ClientDataSet.FieldByName(Kolon).Value;
ClientDataSet.Next;
End;
Result := Result;
end;
function TForm1.KarelerToplami(ClientDataSet:TClientDataSet;Kolon:String):Extended;
begin
Result := 0;
ClientDataSet.First;
While Not ClientDataSet.Eof Do
Begin
Result := Result + Sqr( ClientDataSet.FieldByName(Kolon).Value);
ClientDataSet.Next;
End;
Result := Result;
end;
function TForm1.Varyans(ClientDataSet:TClientDataSet;Kolon:String):Extended;
var
Ortalama : Extended;
begin
Result := 0;
ClientDataSet.First;
While Not ClientDataSet.Eof Do
Begin
Result := Result + ClientDataSet.FieldByName(Kolon).Value;
ClientDataSet.Next;
end;
Ortalama := Result / ClientDataSet.RecordCount ;
Result := 0;
ClientDataSet.First;
While Not ClientDataSet.Eof Do
Begin
Result := Result + sqr(ClientDataSet.FieldByName(Kolon).Value - Ortalama);
ClientDataSet.Next;
End;
Result := Result / (ClientDataSet.RecordCount - 1);
end;
function TForm1.FarkKarelerToplami(ClientDataSet:TClientDataSet;Kolon:String):extended;
var
Ortalama : Extended;
begin
Result := 0;
ClientDataSet.First;
While Not ClientDataSet.Eof Do
Begin
Result := Result + ClientDataSet.FieldByName(Kolon).Value;
ClientDataSet.Next;
end;
Ortalama := Result / ClientDataSet.RecordCount ;
Result := 0;
ClientDataSet.First;
While Not ClientDataSet.Eof Do
Begin
Result := Result + sqr(ClientDataSet.FieldByName(Kolon).Value - Ortalama);
ClientDataSet.Next;
End;
Result := Result;
end;
Şimdide basit doğrusal regresyon fonksiyonumuzu oluşturacak kodlamayı yapalım.
procedure TForm1.Button1Click(Sender: TObject);
var
Index : Integer;
BetaBir,BetaSifir,FarkCarpimXY,A,B : Extended;
begin
A := Ortalama(ClientDataSet1,'X');
B := Ortalama(ClientDataSet1,'Y');
BetaBir := 0;
FarkCarpimXY := 0;
For Index := 1 To ClientDataSet1.RecordCount Do
Begin
ClientDataSet1.RecNo := Index;
BetaBir := BetaBir +
((ClientDataSet1.FieldByName('X').Value - A)*(ClientDataSet1.FieldByName('Y').Value - B));
FarkCarpimXY := FarkCarpimXY +
((ClientDataSet1.FieldByName('X').Value - A)*(ClientDataSet1.FieldByName('Y').Value - B));
End;
BetaBir := BetaBir / FarkKarelerToplami(ClientDataSet1,'X');
BetaSifir := Ortalama(ClientDataSet1,'Y') - (BetaBir * Ortalama(ClientDataSet1,'X'));
Memo1.Clear;
Memo1.Lines.Add('Toplam X ='+ FloatToStr(Toplam(ClientDataSet1,'X')));
Memo1.Lines.Add('Toplam Y ='+ FloatToStr(Toplam(ClientDataSet1,'y')));
Memo1.Lines.Add('Ortalama X = '+ FloatToStr(Ortalama(ClientDataSet1,'X')));
Memo1.Lines.Add('Ortalama Y = '+ FloatToStr(Ortalama(ClientDataSet1,'Y')));
Memo1.Lines.Add('----------------------------------------------------------------');
Memo1.Lines.Add('Kareler Toplamı X ='+ FloatToStr(KarelerToplami(ClientDataSet1,'X')));
Memo1.Lines.Add('Kareler Toplamı Y ='+ FloatToStr(KarelerToplami(ClientDataSet1,'Y')));
Memo1.Lines.Add('----------------------------------------------------------------');
Memo1.Lines.Add('Fark Kareler Toplamı X ='+ FloatToStr(FarkKarelerToplami(ClientDataSet1,'X')));
Memo1.Lines.Add('Fark Kareler Toplamı Y ='+ FloatToStr(FarkKarelerToplami(ClientDataSet1,'Y')));
Memo1.Lines.Add('----------------------------------------------------------------');
Memo1.Lines.Add('X-Ortalama(X) * Y-Ortalama(Y) ='+FloatToStr(FarkCarpimXY));
Memo1.Lines.Add('----------------------------------------------------------------');
Memo1.Lines.Add('Y ='+FloatToStr(BetaSifir)+' + '+FloatToStr(BetaBir)+' X ');
end;
Okuduğunuz İçin Teşekkür Ederim
Hakan UÇAR
İstatistikçi ve Amatör Programcı
İçerikler Tamamen Ücretsiz Olup Özgün Anlatımdır Paylaşırken Kaynak Belirtiniz Lütfen.
Hakan UÇAR
İstatistikçi ve Amatör Programcı
İçerikler Tamamen Ücretsiz Olup Özgün Anlatımdır Paylaşırken Kaynak Belirtiniz Lütfen.
Uygulamayı Yandex Diskimden indirebilirsiniz.
Soru Sormak ve Bilgi Almak İçin Mail Atınız: hakanucaar@yandex.com
0 yorum:
Yorum Gönder